---
title: "Create a Product from an HSX program"
method: POST
path: "/v1/products"
tags: ["Start", "Founder login"]
---

# Create a Product from an HSX program

`POST /v1/products`

## Request

- Base URL: `https://hyperscale0.ai`
- URL: `https://hyperscale0.ai/v1/products`
- Auth: HTTP bearer

Check the HSX program, save it as the first Build with its price fixed, and set up the Product. A browser session also gets a start key, shown once. Any other caller makes keys with the CLI: hyperscale key create --product <productId>.

## Headers

- `X-Hyperscale-Environment` 'sandbox' | 'live'
- `Idempotency-Key` string, required

## Request body

- object
  - `tenantId` string, required: Organization tenant ID
  - `name` string, required
  - `program` object, required
    - `source` string, required
  - `partyBindings` object, required
  - `expectedPlanDigest` string: planDigest from the reviewed composer.plan. The transaction recomputes the plan and refuses with plan_stale, returning the new plan, when it differs.
  - `catalogRevisionId` string: Immutable tenant catalog revision pinned into a Product build
  - `extensionIds` string[]: Catalog extensions the program resolves from. Provenance only, recorded on the Build.
  - `metadata` Metadata (unresolved $ref)
  - `icon` ProductIcon (unresolved $ref)

## Response `201`

Success

- ProductCreateOutput
  - `tenantId` string, required: Organization tenant ID
  - `productId` string, required: Hyperscale product ID
  - `productBuildId` string, required: Hyperscale product build ID
  - `buildDigest` string, required: SHA-256 digest of the resolved product build closure
  - `instrumentIds` string[], required
  - `capabilityIds` string[], required
  - `excludedCapabilityIds` string[], required
  - `kind` 'app' | 'offering' | 'listing' | 'booking' | 'pool', required
  - `status` 'pending' | 'active' | 'disabled' | 'closed', required
  - `key_delivery` 'minted' | 'unavailable', required
  - `startKeyId` string: Hyperscale API key ID
  - `shown_once` string: Hyperscale API key secret
  - `shown_once_unavailable_reason` 'start_key_browser_only': Only a browser session gets the sandbox start key. Make a key with api_key.sandbox.create (hyperscale key create).

## Other responses

- `default`: ErrorResponse. See x-error-codes and x-errors for codes, HTTP statuses and retry guidance.

---

[API](https://skmtc.dev/hyperscale0/apis/hyperscale-product-api.md) · [All operations](https://skmtc.dev/hyperscale0/apis/hyperscale-product-api/llms.txt) · [OpenAPI document](https://skmtc.dev/hyperscale0/apis/hyperscale-product-api/revisions/e9e8faa044d5?raw)
