Deliveries

A delivery is the durable record of "we gave the buyer what they paid for". One delivery row exists per fulfilled order line: a download URL for digital products, a licence key for licence products, a courier waybill for physical products. Delivery storage is canonical in Fulkruma; these endpoints proxy through so you have one auth surface.

Deliveries are created server-side at the moment a checkout completes — there is no POST /v1/storefront/deliveries. To trigger one in tests, complete a checkout. The endpoints below are read-only.

All endpoints require an sk_* key.

Endpoints

Method Path Purpose
GET /v1/storefront/deliveries List deliveries
GET /v1/storefront/deliveries/:id Retrieve one delivery

List deliveries

GET /v1/storefront/deliveries

Returns every delivery ever issued for this workspace, newest first. No pagination cursor at the moment — the full set comes back in one response.

Response200 OK

{
  "data": [
    {
      "id": "del_01HXAB7K3M9N2P5QRS8TVWXY3Z",
      "productId": "prod_01HXxxxxxxxxxxxxxxxxxxxxxx",
      "customerId": "cus_01HXxxxxxxxxxxxxxxxxxxxxxx",
      "checkoutSessionId": "cs_01HXxxxxxxxxxxxxxxxxxxxxxx",
      "kind": "download",
      "downloadUrl": "https://cdn.fulkruma.com/signed/abc?expires=...",
      "downloadExpiresAt": "2026-05-20T10:42:00Z",
      "downloadCount": 0,
      "downloadLimit": 5,
      "licenseKey": null,
      "shipmentId": null,
      "deliveredAt": "2026-05-13T10:42:00Z",
      "metadata": { "orderId": "ord_42" }
    }
  ],
  "error": null,
  "meta": { "requestId": "req_01HX...", "timestamp": "2026-05-13T10:42:00Z" }
}

Retrieve a delivery

GET /v1/storefront/deliveries/:id

Path parameters

Param Type Description
id string (del_…) The delivery ID.

Response200 OK. The same shape as one element in the list response.

Errors

Status error.code When
404 RESOURCE_NOT_FOUND Delivery doesn't exist or is in another workspace.
curl https://storlaunch.forjio.com/api/v1/storefront/deliveries/del_01HX... \
  -H "Authorization: Bearer sk_live_xxx"

The delivery object

Field Type Nullable Description
id string no del_ + 26-char ULID.
productId string no The product that was delivered.
customerId string yes The buyer (may be null for guest checkouts that never linked).
checkoutSessionId string yes The cs_… session that paid for this delivery.
kind enum no download | license | shipment | manual. Drives which other fields are populated.
downloadUrl string yes Signed CDN URL. Set when kind = download. Time-limited; resign by retrieving the delivery again.
downloadExpiresAt string (ISO 8601 UTC) yes When the signed URL stops working.
downloadCount integer yes Times the buyer has hit the URL.
downloadLimit integer yes Cap on downloads. null means unlimited.
licenseKey string yes The issued licence key. Set when kind = license.
shipmentId string yes The shp_… shipment row. Set when kind = shipment.
deliveredAt string (ISO 8601 UTC) no When this delivery was created.
metadata object no Forwarded from the checkout session's metadata.

Lifecycle

The flow that produces a delivery:

  1. Buyer completes a checkout session for a product.
  2. Storlaunch's fulfilment service fires.
  3. For a digital product: a fresh signed URL is generated, a row is written, and the buyer is emailed the link. URL is valid for 7 days; opening the delivery again resigns it for another 7.
  4. For a licence product: a key is issued via Fulkruma; the row is written with licenseKey set; the buyer is emailed the key.
  5. For a physical product: a shipment is created in Fulkruma; the row is written with shipmentId; tracking emails flow via Fulkruma's webhooks.
  6. The product.purchased event fires.

If the same checkout session covers multiple products (cart checkout), one delivery row is created per product. They all reference the same checkoutSessionId.

Events

Deliveries don't have their own event channel. Subscribe to:

Fulkruma emits richer shipment-lifecycle events directly (created, picked-up, in-transit, delivered) — subscribe on the Fulkruma side if you want those.

Re-sending a delivery email

There's no first-class API for this; use the dashboard's Orders → Resend email action, which generates a fresh signed URL (effectively re-issuing the delivery's downloadUrl).

Next

  • Products — the parent resource. type decides what kind of delivery gets created.
  • Licences — the licence key inside a kind: license delivery.
  • Checkout sessions — the upstream event that triggers fulfilment.
  • product.purchased — the webhook that fires per delivery.