html.surf
Sign in
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": "epic-drums-v1",
      "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": "epic-drums-v1",
      "version": "1.0.0",
      "status": "ready"
    }
  }
]

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

Response

{
  "id": "epic-drums-v2",
  "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).

Generate Download URL

Mints a fresh, time-limited download token for an existing product version. This is the endpoint your storefront, webhook handler, or fulfillment workflow should call after a payment is confirmed.

POST /api/generate-download-url

Request Body

{
  "productId": "epic-drums-v1",
  "version": "1.0.0"
}

Response

{
  "success": true,
  "productId": "epic-drums-v1",
  "version": "1.0.0",
  "downloadToken": "8b5d…",
  "downloadUrl": "https://continuata.io/download?token=8b5d…",
  "expiresAt": "2026-04-02T00:00:00.000Z"
}

Tokens expire after 24 hours: Tokens minted by this endpoint are valid for 24 hours. For purchases that should remain downloadable indefinitely, point customers at continuata.io/my instead — the portal generates a fresh link on demand from any verified email.

Example: Node.js

const res = await fetch('https://continuata.io/api/generate-download-url', {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${process.env.CONTINUATA_API_KEY}`,
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({
    productId: 'epic-drums-v1',
    version: '1.0.0'
  })
});

const { downloadUrl, expiresAt } = await res.json();
console.log('Send to customer:', downloadUrl, 'valid until', expiresAt);

Continue Reading: See Downloads & Reports for download analytics, or Webhooks for the inbound integration endpoints.