Docs /Products API Dashboard →

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 name
  • slug — required, lowercase letters/numbers/hyphens only. Server normalises but it's safest to send a clean value
  • description — optional
  • Returns 400 if name/slug is missing, 409 if 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 webhooksStripe, Shopify, WooCommerce, FastSpring, VibraCart Pro — zero code, recommended.
  • Create a purchase via the APIPOST /api/purchases with 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.