Skip to main content
For backends not using @pulsebyshiga/node (PHP, Python, Java, Go, …), call the engine directly over HTTPS. This is a stopgap until the OpenAPI spec is published.
This surface reflects the @pulsebyshiga/node types — the working view of the API until the canonical Pulse OpenAPI contract is published. Wire shapes (snake_case JSON, decimal-string amounts) are stable; a few fields are still being reconciled and are flagged where they appear.
Base URL: https://engine-api.shiga.io (override via the SDK baseUrl when a sandbox host is issued).

Authentication

All requests also send Accept: application/json. Every POST includes an Idempotency-Key: <uuid> and Content-Type: application/json. Responses carry a request-id header — include it when contacting support.

Endpoints — live (engine)

Endpoints — preview (collection product)

These are part of the preview surface — see Contract status. The client-session routes the embed uses (GET /v1/client/session, POST /v1/client/session/refresh_quote, POST /v1/client/session/select, POST /v1/client/telemetry) belong to the same preview surface.

Webhook signatures (Pulse-Signature)

Each delivery carries a Pulse-Signature header:
Verify it before trusting the payload:
  1. Split the header on , into k=v pairs; read t and one or more v1 values (multiple v1 values support key rotation).
  2. Compute HMAC_SHA256(secret, "<t>.<raw-request-body>") as a lowercase hex digest — sign the raw bytes, not a re-serialized JSON object.
  3. Constant-time compare your digest against each v1; accept if any matches.
  4. Reject if t is outside a 300-second tolerance (replay protection).
  5. De-duplicate on the event id — delivery is at-least-once.
@pulsebyshiga/node does all of this for you in webhooks.verifyOnce(rawBody, header).