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.
Response — 200 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. |
Response — 200 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:
- Buyer completes a checkout session for a product.
- Storlaunch's fulfilment service fires.
- 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.
- For a licence product: a key is issued via Fulkruma; the row is written with
licenseKeyset; the buyer is emailed the key. - For a physical product: a shipment is created in Fulkruma; the row is written with
shipmentId; tracking emails flow via Fulkruma's webhooks. - The
product.purchasedevent 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:
product.purchased— fires once per delivery the moment it's created.
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.
typedecides what kind of delivery gets created. - Licences — the licence key inside a
kind: licensedelivery. - Checkout sessions — the upstream event that triggers fulfilment.
product.purchased— the webhook that fires per delivery.