create-subscription endpoint (POST /subscriptions) accepts three orthogonal inputs for the initial version’s items. Pick the pattern that matches how pricing is owned.
| Pattern | plan_id | items | Who owns the price definitions |
|---|---|---|---|
| 1. Raw pricing | - | Full set of standalone and bundle items with inline prices | Your request body |
| 2. From a plan | pln_... | - | The plan |
| 3. From a plan with overrides | pln_... | Overrides and additions | The plan, then your body (merged) |
| 4. With bundles | either | Bundle items with nested children | Depends on 1/2/3 above |
Prerequisites
Every request requires:- A customer ID (plain 8-char identifier, for example
wcqYrqfE). Seecreate-customer. - At least one product reference (
prod_...) on each item, or a bundle reference (bnd_...) when using bundle items. Seecreate-product. - Optionally a plan (
pln_...) when using patterns 2 or 3. - Optionally a metric (
mtr_...) when pricing metered items.
Subscriptions are created in
draft status. Call activate-subscription when you are ready for the subscription to go live, or pass auto_activate: true in the create request to skip the explicit activation step.Pattern 1: Raw pricing (no plan)
Use this when the request body fully defines the priced item set. Theitems array is the complete set of items for the subscription’s first version.
1a. Single standalone item with unit pricing
1b. Mixed fixed and metered items
A platform fee plus graduated API usage, with explicit billing configuration.type values and their required fields.
Pattern 2: From a plan (no overrides)
The simplest form. Pass aplan_id and the subscription is materialized from the plan’s item set. You do not send items at all. currency defaults to the customer’s configured currency when omitted.
If you omit
contract.start_date, the subscription remains unanchored while it is still draft and the contract start date is set when the subscription is activated. Pass contract explicitly when you want to override the plan’s contract shape or lock in a future start date.Pattern 3: From a plan with per-customer overrides
Sendplan_id and items together. Each body item either:
- Overrides a matching plan item (same
product_idorbundle_id). The body’s price definition fully replaces the plan item’s price. - Appends a new item when nothing on the plan matches.
3a. Override a single product’s price
The plan hasprod_032wMej82trlC5RulBsDJY at $500/mo. This customer negotiated $400/mo.
3b. Append a custom add-on
The plan has its standard item set. This customer also gets a dedicated support line item that is not on the plan.prod_07fx2Nej82trlC5RulBsDJY is not on the plan, it is appended to the materialized item set. Nothing else is touched.
Pattern 4: With bundles
Bundles group priced items that are billed as a unit. Reference a bundle withbundle_id inside items, and supply nested items for the children you want priced.
4a. Raw bundle (no plan)
items[].items[] is a fully priced item. The API does not look up bundle defaults when children are provided inline, so supply the complete price definition for each child you want in the subscription.
4b. Override a bundle inside a plan
The plan includesbnd_032wMej82trlC5RulBsDJY. For this customer, override the seats child to $15 per seat.
Response
All patterns return the sameSubscriptionResponse shape. Key fields on the initial response:
id: the subscription identifier (plain 8-char string, for exampleCQCncgVu).status:drafton create, unless you passedauto_activate: true.current_version_id: populated once the subscription is activated.pending_changes: empty on create.created_atandupdated_at: RFC3339 timestamps (for example2026-07-01T00:00:00Z).
get-current-subscription-version (GET /subscriptions/{id}/versions/current).
For mutations after creation, see Updating a Subscription.