SendPromptly API Overview

Integrate SendPromptly from your backend to detect and repair paid-but-not-applied failures across Stripe and Shopify.

SendPromptly instruments the gap between payment delivery and app-side fulfillment. Your application signals when it accepted a payment-backed business event, then signals whether the business effect succeeded or failed. SendPromptly opens an incident when the outcome is missing or failed.

Base URL

1
https://api.sendpromptly.app/api

Core endpoints

1
2
POST /api/v1/receipt
POST /api/v1/result

Required headers

  • Authorization: Bearer sk_{project_key}
  • Idempotency-Key: <unique-key>
  • Content-Type: application/json
  • Accept: application/json

Use a project API key created in the dashboard. Keep separate keys for separate deployments or operating modes.

Receipt contract

FieldTypeRequiredNotes
providerstringYesstripe or shopify.
stripe_event_idstringStripe onlyThe Stripe event identifier, e.g. evt_....
provider_event_idstringShopify / preferredCanonical event ID. Preferred for all new integrations.
event_typestringYese.g. checkout.session.completed, invoice.paid, orders/paid.
effect_typestringYese.g. access_unlock, credit_grant.
internal_referencestringYesYour user, account, workspace, or order reference.
occurred_atdatetimeYesISO 8601 timestamp for the source event.
shopify_shop_domainstringShopify onlye.g. mystore.myshopify.com.
timeout_minutesintegerNoOverride the default missing-result timeout for this event.

Result contract

FieldTypeRequiredNotes
stripe_event_idstringOne identifier requiredMatch the original receipt event.
provider_event_idstringOne identifier requiredPreferred canonical identifier.
event_idstringOne identifier requiredInternal event ID returned by SendPromptly.
statusstringYessuccess or failed.
error_codestringNoShort machine-readable failure label.
error_messagestringNoHuman-readable failure detail.
replay_idstringNoInclude when reporting a reprocess attempt.

Idempotency and retries

SendPromptly requires an Idempotency-Key on both endpoints. Use a deterministic key for each business action so network retries remain safe and do not create duplicate incidents or result attempts.

SendPromptly deduplicates on (project_id, provider, provider_event_id) — duplicate payment webhooks never create duplicate incidents.

Monitoring lifecycle

  1. Your webhook handler verifies the incoming signature.
  2. Your app durably accepts the work and calls POST /api/v1/receipt.
  3. Your app applies the business effect and then calls POST /api/v1/result.
  4. If result fails or never arrives before the timeout, SendPromptly opens an incident.
  5. An operator can trigger Reprocess, which sends a signed callback to your repair endpoint.

Quick request examples

Stripe:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
curl -X POST https://api.sendpromptly.app/api/v1/receipt \
  -H "Authorization: Bearer sk_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
  -H "Idempotency-Key: stripe-evt-123-receipt" \
  -H "Content-Type: application/json" \
  -H "Accept: application/json" \
  -d '{
    "provider": "stripe",
    "stripe_event_id": "evt_123",
    "event_type": "checkout.session.completed",
    "effect_type": "access_unlock",
    "internal_reference": "user_456",
    "occurred_at": "2026-05-16T15:04:05Z"
  }'

Shopify:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
curl -X POST https://api.sendpromptly.app/api/v1/receipt \
  -H "Authorization: Bearer sk_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
  -H "Idempotency-Key: shopify-wh-abc123-receipt" \
  -H "Content-Type: application/json" \
  -H "Accept: application/json" \
  -d '{
    "provider": "shopify",
    "provider_event_id": "wh_orders_paid_abc123",
    "event_type": "orders/paid",
    "effect_type": "access_unlock",
    "internal_reference": "order_98765",
    "shopify_shop_domain": "mystore.myshopify.com",
    "occurred_at": "2026-05-16T10:00:00Z"
  }'

Next steps