@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.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:
- Split the header on
,intok=vpairs; readtand one or morev1values (multiplev1values support key rotation). - Compute
HMAC_SHA256(secret, "<t>.<raw-request-body>")as a lowercase hex digest — sign the raw bytes, not a re-serialized JSON object. - Constant-time compare your digest against each
v1; accept if any matches. - Reject if
tis outside a 300-second tolerance (replay protection). - De-duplicate on the event
id— delivery is at-least-once.
@pulsebyshiga/node does all of this for you in webhooks.verifyOnce(rawBody, header).