Products API
List and create products, and mint download URLs for your customers.
List Products
Returns every product in your organisation, with the active version joined.
GET /api/products
Response
A JSON array. Each row is the product joined to its currently active version (or null if no version is active).
[
{
"product": {
"id": "3f6c9a1e-8d2b-4c7a-9e1f-2a5b8c3d7e90",
"name": "Epic Drum Kit Vol. 1",
"slug": "epic-drums-v1",
"status": "published",
"orgId": "audio-company",
"activeVersionId": "version_abc123",
"createdAt": "2026-04-01T00:00:00.000Z",
"updatedAt": "2026-04-15T00:00:00.000Z"
},
"activeVersion": {
"id": "version_abc123",
"productId": "3f6c9a1e-8d2b-4c7a-9e1f-2a5b8c3d7e90",
"version": "1.0.0",
"status": "ready"
}
}
]
id is a server-generated UUID and is distinct from slug — pass the UUID wherever an endpoint takes productId.
Create Product
Creates a new product in draft status.
POST /api/products
Request Body
{
"name": "Epic Drum Kit Vol. 2",
"slug": "epic-drums-v2",
"description": "High-energy drum samples for electronic music"
}
Field Notes
name— required, display nameslug— required, lowercase letters/numbers/hyphens only. Server normalises but it's safest to send a clean valuedescription— optional- Returns
400ifname/slugis missing,409if the slug is already used in your organisation. The response is the full product row.
Response
{
"id": "7a1d4b2c-5e8f-4a3b-8c6d-9e0f1a2b3c4d",
"orgId": "audio-company",
"name": "Epic Drum Kit Vol. 2",
"slug": "epic-drums-v2",
"description": "High-energy drum samples for electronic music",
"status": "draft",
"createdAt": "2026-04-01T00:00:00.000Z"
}
Update Product
Update any subset of a product's fields.
PUT /api/products/{productId}
Body is merged into the existing product row. Common fields: name, description, status (draft | published | archived).
Fulfilling Purchases Programmatically
To deliver a product after a payment on your own platform, use one of these supported paths — each creates the customer, the purchase, and a download link, then emails it:
- Platform webhooks — Stripe, Shopify, WooCommerce, FastSpring, VibraCart Pro — zero code, recommended.
- Create a purchase via the API —
POST /api/purchaseswith form fields (customerId=new,newCustomer.name,newCustomer.email,productId,amount,currency,paymentMethod,sendEmail=true). See the worked example on the Gumroad page. This endpoint expects form data (not JSON) and responds with HTML. - Manual — Dashboard → Purchases → Create Manual Purchase.
Note: a standalone token-minting endpoint (POST /api/generate-download-url) previously documented here does not work with the current storage pipeline — do not use it. Purchase links stay valid for 48 hours, refresh automatically when opened, and customers can always re-request one at continuata.io/my.
Continue Reading: See Downloads & Reports for download analytics, or Webhooks for the inbound integration endpoints.