Backend

Overview

PULSE from a server, in any language that can send JSON over HTTPS.

There is no PULSE library for your backend language, and you do not need one. Every endpoint is POST, every body is JSON, and authentication is one header.

POST https://api.thepulseapi.com/api/v1/<endpoint>
Content-Type: application/json
x-api-key: pk_live_...

That is the whole integration surface. The guides in this section are the same three calls written idiomatically per language, so you can copy one and delete the rest.

Which calls belong on a server

Most of PULSE is designed for the browser, where the SDK already handles sessions, batching and exposure buffering. Reach for the HTTP API directly when the work is genuinely server-side:

Server-rendered pages

Ranking a grid during SSR, where there is no browser yet to hold a session.

Catalogue audits

A scheduled job grading an export. Nothing about it belongs in a page.

Backfills and pipelines

Replaying events you already collected, or recording outcomes your payment webhook knows about and the browser does not.

One thing to get right first

sessionId and organizationId are required on nearly every call, and both come from the body rather than from the API key. A request without them returns 400 with the field named. See Send signals.

A session is yours to name. It is a string you generate, up to 128 characters, and the only rule is that the same shopper keeps the same one. If the browser is already running the SDK, read it with pulse.getSessionId() and pass it to your server rather than inventing a second session for the same person.

There is one kind of key

Keys are pk_live_, publishable, and the same key works from a browser and from a server. There is no separate secret key today, which means a key leaked from your server is no worse and no better than one read out of your page source. Scope and rotate accordingly.

The languages

On this page