Skip to content

Create a price

The prices.create operation: POST /api/v1/prices in the REST API and the prices_create tool in the MCP server.

POST/api/v1/prices

Creates a price for one of the brand's products. Types:

  • one_time: a fixed amount, or a customAmount range the buyer chooses from;
  • credit_pack: like one-time, plus creditPack (bonusCredits granted as promo credits, expiresAfterDays). A fixed pack's credits equal its amount; what the wallet receives follows the brand's credit basis (net by default);
  • recurring: per_unit (unitAmount × quantity) or tiered (graduated or volume tiers, each with an optional flatAmount), with optional trialDays and includedCredits. Recurring prices are sold with subscriptions.

A recurring price with usageType: metered takes its quantity from usage events (usage_events.create), billed in arrears. recurring.metered names the meter (e.g. api.calls), its aggregation per period (sum, max or last) and its pricing: per_unit uses the price's unitAmount or tiers per unit of usage; percent_of_amount reads the quantity as an amount in micros of the price's currency and charges ratePpm (0.4% = "4000"), with no unit amount or tiers. Optional: includedQuantity (free per period), minimumCharge and maximumCharge (per period). Every metered price of a meter uses the same aggregation and pricing (and, for percent of amount, the same currency).

Money is { amount: "<integer micros>", currency } (12.50 EUR = "12500000"). Charged amounts use whole minor units of the currency; unit prices may be finer (unitAmountMicros "2500" = 0.0025). taxBehavior says whether the amounts include tax (inclusive, required for consumer prices in the EU and UK) or not (exclusive).

Once a checkout session or payment uses the price, what it charges can't change: create a new price and move the lookup key to it (prices.move_lookup_key).

At a glance

  • REST: POST /api/v1/prices
  • MCP tool: prices_create
  • Operation ID: prices.create
  • Scope: Brand
  • Permission: catalog:write
  • Risk tier: write
  • Dry run: Supported (send Ownrecord-Dry-Run: true)
  • Idempotency: Idempotency-Key required
  • Modes: Test and live
  • Authentication: API key with the catalog:write scope
  • Since: M4

Request

Body

A JSON object (Content-Type: application/json):

FieldTypeRequiredDescription
productIdprod_… IDYesThe product the price belongs to.
typeone of one_time, recurring, credit_packYesone_time, credit_pack or recurring (licensed or metered: per unit or tiered).
currencystringYesISO 4217 currency code; every amount of the price uses it.
taxBehaviorone of inclusive, exclusiveYesinclusive: the amount includes tax (consumer prices in the EU and UK); exclusive: tax is added.
nicknamestringNoAn internal label, never shown to customers.
lookupKeystringNoA stable name for the price, unique in the brand and mode, e.g. pro_monthly.
amountobjectNoOne-time and credit-pack prices: the fixed amount (whole minor units).
amount.amountstringYesInteger micros as a string (12500000 = 12.50).
amount.currencystringYesISO 4217 currency code: the price's currency.
customAmountobjectNoOne-time and credit-pack prices: let the buyer choose an amount in this range instead.
customAmount.minobjectYesThe smallest amount the buyer may choose.
customAmount.min.amountstringYesInteger micros as a string (12500000 = 12.50).
customAmount.min.currencystringYesISO 4217 currency code: the price's currency.
customAmount.maxobjectYesThe largest amount the buyer may choose.
customAmount.max.amountstringYesInteger micros as a string (12500000 = 12.50).
customAmount.max.currencystringYesISO 4217 currency code: the price's currency.
customAmount.presetobjectNoThe amount suggested to the buyer.
customAmount.preset.amountstringYesInteger micros as a string (12500000 = 12.50).
customAmount.preset.currencystringYesISO 4217 currency code: the price's currency.
creditPackobjectNoCredit packs: the credit terms.
creditPack.creditsobjectNoThe pack's nominal credits; equals the amount (the default). Custom-amount packs have none. What the wallet receives follows the brand's credit basis (net by default).
creditPack.credits.amountstringYesInteger micros as a string (12500000 = 12.50).
creditPack.credits.currencystringYesISO 4217 currency code: the price's currency.
creditPack.bonusCreditsobjectNoPromo credits granted on top of the purchase.
creditPack.bonusCredits.amountstringYesInteger micros as a string (12500000 = 12.50).
creditPack.bonusCredits.currencystringYesISO 4217 currency code: the price's currency.
creditPack.expiresAfterDaysintegerNoDays until the credits expire (1–3650).
recurringobjectNoRecurring prices: the billing period and scheme.
recurring.intervalone of day, week, month, yearYesThe billing period's unit.
recurring.intervalCountintegerNoPeriods per billing cycle (default 1).
recurring.usageTypeone of licensed, meteredNolicensed: the quantity is seats or units; metered: the quantity comes from usage events of metered.meter, billed in arrears.
recurring.billingSchemeone of per_unit, tieredNoper_unit: unitAmount × quantity; tiered: priced by tiers.
recurring.unitAmountobjectNoPer-unit prices: the price of one unit per period.
recurring.unitAmount.amountstringYesInteger micros as a string (12500000 = 12.50).
recurring.unitAmount.currencystringYesISO 4217 currency code: the price's currency.
recurring.tiersModeone of graduated, volumeNoTiered prices: graduated (each tier priced separately) or volume (all units at the reached tier).
recurring.tiersarray of objectNoTiered prices: the tiers, lowest first.
recurring.tiers[].upTointeger or "inf"YesThe last unit of the tier (inclusive); "inf" for the last tier.
recurring.tiers[].unitAmountMicrosstringYesPrice per unit in micros, as a string; sub-minor precision allowed (2500 = 0.0025).
recurring.tiers[].flatAmountobjectNoA fixed amount added once when the tier is reached.
recurring.tiers[].flatAmount.amountstringYesInteger micros as a string (12500000 = 12.50).
recurring.tiers[].flatAmount.currencystringYesISO 4217 currency code: the price's currency.
recurring.trialDaysintegerNoFree trial days for new subscriptions (1–730).
recurring.includedCreditsobjectNoCredits included every period (spec §17).
recurring.includedCredits.amountobjectYesCredits granted into the wallet each period.
recurring.includedCredits.amount.amountstringYesInteger micros as a string (12500000 = 12.50).
recurring.includedCredits.amount.currencystringYesISO 4217 currency code: the price's currency.
recurring.includedCredits.expiresAfterDaysintegerNo
recurring.meteredobjectNoMetered prices (usageType: metered): the meter and how its usage is aggregated and priced.
recurring.metered.meterstringYesThe meter usage events name, e.g. api.calls or payments.volume.
recurring.metered.aggregationone of sum, max, lastNoHow a period's usage is aggregated: sum of quantities, max (the largest), or last (the latest event's).
recurring.metered.pricingone of per_unit, percent_of_amountNoper_unit: the price's unitAmount or tiers per unit of usage; percent_of_amount: the quantity is an amount in micros of the price's currency, charged at ratePpm.
recurring.metered.ratePpmstringNopercent_of_amount only: the rate in parts per million (0.4% = "4000").
recurring.metered.includedQuantitystringNoFree usage per period, subtracted first (micros of the currency for percent_of_amount).
recurring.metered.minimumChargeobjectNoThe least the price charges per period, usage or not.
recurring.metered.minimumCharge.amountstringYesInteger micros as a string (12500000 = 12.50).
recurring.metered.minimumCharge.currencystringYesISO 4217 currency code: the price's currency.
recurring.metered.maximumChargeobjectNoThe most the price charges per period.
recurring.metered.maximumCharge.amountstringYesInteger micros as a string (12500000 = 12.50).
recurring.metered.maximumCharge.currencystringYesISO 4217 currency code: the price's currency.
metadataobjectNoYour own key-value pairs (at most 50 keys). On updates the whole set is replaced.

Response

201 Created with a JSON object:

FieldTypeDescription
idprice_… ID
object"price"
brandIdbrd_… ID
livemodeboolean
productIdprod_… ID
nicknamestring or null
lookupKeystring or null
typeone of one_time, recurring, credit_pack
currencystring
taxBehaviorone of inclusive, exclusive
amountmoney or nullFixed one-time or credit-pack amount.
customAmountobject or nullThe range a buyer may choose from (custom-amount prices).
creditPackobject or null
recurringobject or null
activeboolean
usedbooleanA checkout session or payment referenced the price: what it charges can no longer change.
usedAtdate-time or null
metadataobject
createdAtdate-time
updatedAtdate-time

Examples

Monthly per-seat price, graduated tiers, 14-day trial

HTTP
POST /api/v1/prices
Authorization: Bearer or_test_…
Idempotency-Key: 3f1c9a52-7d0e-4b8f-9a61-0c2d5e8b7f14
Content-Type: application/json

{
  "productId": "prod_01m4tx5nj8emwbyf7y9vcf47y0",
  "type": "recurring",
  "currency": "EUR",
  "taxBehavior": "inclusive",
  "nickname": "Pro monthly, per seat",
  "lookupKey": "pro_monthly",
  "recurring": {
    "interval": "month",
    "billingScheme": "tiered",
    "tiersMode": "graduated",
    "tiers": [
      {
        "upTo": 10,
        "unitAmountMicros": "12000000"
      },
      {
        "upTo": "inf",
        "unitAmountMicros": "9000000"
      }
    ],
    "trialDays": 14
  }
}

Response (201):

JSON
{
  "id": "price_01m4tx5nj8emwbyf7y9vcf47y2",
  "object": "price",
  "brandId": "brd_01m4tx5nj8emwbyf7y9vcf47x4",
  "livemode": false,
  "productId": "prod_01m4tx5nj8emwbyf7y9vcf47y0",
  "nickname": "Pro monthly, per seat",
  "lookupKey": "pro_monthly",
  "type": "recurring",
  "currency": "EUR",
  "taxBehavior": "inclusive",
  "amount": null,
  "customAmount": null,
  "creditPack": null,
  "recurring": {
    "interval": "month",
    "intervalCount": 1,
    "usageType": "licensed",
    "billingScheme": "tiered",
    "unitAmount": null,
    "tiersMode": "graduated",
    "tiers": [
      {
        "upTo": 10,
        "unitAmountMicros": "12000000",
        "flatAmount": null
      },
      {
        "upTo": "inf",
        "unitAmountMicros": "9000000",
        "flatAmount": null
      }
    ],
    "trialDays": 14,
    "includedCredits": null,
    "metered": null
  },
  "active": true,
  "used": false,
  "usedAt": null,
  "metadata": {},
  "createdAt": "2026-10-13T12:00:00.000Z",
  "updatedAt": "2026-10-13T12:00:00.000Z"
}

Metered: 0.4% of the processed volume, at least €5 a month

HTTP
POST /api/v1/prices
Authorization: Bearer or_test_…
Idempotency-Key: 3f1c9a52-7d0e-4b8f-9a61-0c2d5e8b7f14
Content-Type: application/json

{
  "productId": "prod_01m4tx5nj8emwbyf7y9vcf47y0",
  "type": "recurring",
  "currency": "EUR",
  "taxBehavior": "exclusive",
  "nickname": "Volume fee",
  "lookupKey": "volume_monthly",
  "recurring": {
    "interval": "month",
    "usageType": "metered",
    "metered": {
      "meter": "payments.volume",
      "pricing": "percent_of_amount",
      "ratePpm": "4000",
      "minimumCharge": {
        "amount": "5000000",
        "currency": "EUR"
      }
    }
  }
}

Response (201):

JSON
{
  "id": "price_01m4tx5nj8emwbyf7y9vcf47y8",
  "object": "price",
  "brandId": "brd_01m4tx5nj8emwbyf7y9vcf47x4",
  "livemode": false,
  "productId": "prod_01m4tx5nj8emwbyf7y9vcf47y0",
  "nickname": "Volume fee",
  "lookupKey": "volume_monthly",
  "type": "recurring",
  "currency": "EUR",
  "taxBehavior": "exclusive",
  "amount": null,
  "customAmount": null,
  "creditPack": null,
  "recurring": {
    "interval": "month",
    "intervalCount": 1,
    "usageType": "metered",
    "billingScheme": "per_unit",
    "unitAmount": null,
    "tiersMode": null,
    "tiers": null,
    "trialDays": null,
    "includedCredits": null,
    "metered": {
      "meter": "payments.volume",
      "aggregation": "sum",
      "pricing": "percent_of_amount",
      "ratePpm": "4000",
      "includedQuantity": null,
      "minimumCharge": {
        "amount": "5000000",
        "currency": "EUR"
      },
      "maximumCharge": null
    }
  },
  "active": true,
  "used": false,
  "usedAt": null,
  "metadata": {},
  "createdAt": "2026-10-13T12:00:00.000Z",
  "updatedAt": "2026-10-13T12:00:00.000Z"
}

Metered: €0.002 per API call after 10,000 free calls a month

HTTP
POST /api/v1/prices
Authorization: Bearer or_test_…
Idempotency-Key: 3f1c9a52-7d0e-4b8f-9a61-0c2d5e8b7f14
Content-Type: application/json

{
  "productId": "prod_01m4tx5nj8emwbyf7y9vcf47y0",
  "type": "recurring",
  "currency": "EUR",
  "taxBehavior": "exclusive",
  "nickname": "API calls",
  "lookupKey": "api_calls_monthly",
  "recurring": {
    "interval": "month",
    "usageType": "metered",
    "unitAmount": {
      "amount": "2000",
      "currency": "EUR"
    },
    "metered": {
      "meter": "api.calls",
      "aggregation": "sum",
      "includedQuantity": "10000"
    }
  }
}

Response (201):

JSON
{
  "id": "price_01m4tx5nj8emwbyf7y9vcf47y9",
  "object": "price",
  "brandId": "brd_01m4tx5nj8emwbyf7y9vcf47x4",
  "livemode": false,
  "productId": "prod_01m4tx5nj8emwbyf7y9vcf47y0",
  "nickname": "API calls",
  "lookupKey": "api_calls_monthly",
  "type": "recurring",
  "currency": "EUR",
  "taxBehavior": "exclusive",
  "amount": null,
  "customAmount": null,
  "creditPack": null,
  "recurring": {
    "interval": "month",
    "intervalCount": 1,
    "usageType": "metered",
    "billingScheme": "per_unit",
    "unitAmount": {
      "amount": "2000",
      "currency": "EUR"
    },
    "tiersMode": null,
    "tiers": null,
    "trialDays": null,
    "includedCredits": null,
    "metered": {
      "meter": "api.calls",
      "aggregation": "sum",
      "pricing": "per_unit",
      "ratePpm": null,
      "includedQuantity": "10000",
      "minimumCharge": null,
      "maximumCharge": null
    }
  },
  "active": true,
  "used": false,
  "usedAt": null,
  "metadata": {},
  "createdAt": "2026-10-13T12:00:00.000Z",
  "updatedAt": "2026-10-13T12:00:00.000Z"
}

A €10 credit pack with €2 bonus credits

HTTP
POST /api/v1/prices
Authorization: Bearer or_test_…
Idempotency-Key: 3f1c9a52-7d0e-4b8f-9a61-0c2d5e8b7f14
Content-Type: application/json

{
  "productId": "prod_01m4tx5nj8emwbyf7y9vcf47y1",
  "type": "credit_pack",
  "currency": "EUR",
  "taxBehavior": "inclusive",
  "lookupKey": "credits_10",
  "amount": {
    "amount": "10000000",
    "currency": "EUR"
  },
  "creditPack": {
    "bonusCredits": {
      "amount": "2000000",
      "currency": "EUR"
    },
    "expiresAfterDays": 365
  }
}

Response (201):

JSON
{
  "id": "price_01m4tx5nj8emwbyf7y9vcf47y4",
  "object": "price",
  "brandId": "brd_01m4tx5nj8emwbyf7y9vcf47x4",
  "livemode": false,
  "productId": "prod_01m4tx5nj8emwbyf7y9vcf47y1",
  "nickname": null,
  "lookupKey": "credits_10",
  "type": "credit_pack",
  "currency": "EUR",
  "taxBehavior": "inclusive",
  "amount": {
    "amount": "10000000",
    "currency": "EUR"
  },
  "customAmount": null,
  "creditPack": {
    "credits": {
      "amount": "10000000",
      "currency": "EUR"
    },
    "bonusCredits": {
      "amount": "2000000",
      "currency": "EUR"
    },
    "expiresAfterDays": 365
  },
  "recurring": null,
  "active": true,
  "used": false,
  "usedAt": null,
  "metadata": {},
  "createdAt": "2026-10-13T12:00:00.000Z",
  "updatedAt": "2026-10-13T12:00:00.000Z"
}

A one-time price

HTTP
POST /api/v1/prices
Authorization: Bearer or_test_…
Idempotency-Key: 3f1c9a52-7d0e-4b8f-9a61-0c2d5e8b7f14
Content-Type: application/json

{
  "productId": "prod_01m4tx5nj8emwbyf7y9vcf47y1",
  "type": "one_time",
  "currency": "EUR",
  "taxBehavior": "inclusive",
  "amount": {
    "amount": "49000000",
    "currency": "EUR"
  }
}

Response (201):

JSON
{
  "id": "price_01m4tx5nj8emwbyf7y9vcf47y5",
  "object": "price",
  "brandId": "brd_01m4tx5nj8emwbyf7y9vcf47x4",
  "livemode": false,
  "productId": "prod_01m4tx5nj8emwbyf7y9vcf47y1",
  "nickname": null,
  "lookupKey": null,
  "type": "one_time",
  "currency": "EUR",
  "taxBehavior": "inclusive",
  "amount": {
    "amount": "49000000",
    "currency": "EUR"
  },
  "customAmount": null,
  "creditPack": null,
  "recurring": null,
  "active": true,
  "used": false,
  "usedAt": null,
  "metadata": {},
  "createdAt": "2026-10-13T12:00:00.000Z",
  "updatedAt": "2026-10-13T12:00:00.000Z"
}

Errors

CodeHTTP statusWhenWhat to do
org_restricted403Live mode, while the organization's Ownrecord subscription is unpaid (§37.5).Pay the open Ownrecord invoice in Organization → Billing; the restriction lifts as soon as it is paid. Test mode keeps working.
entitlement_required403A recurring price without the plan's subscriptions, or a metered one without its usage billing.Upgrade the organization's plan, or remove something to get back under the limit.
validation_failed400A field is missing or malformed, or the price's terms break a rule (details.issues names each field).Fix the fields listed in details.issues and send the request again.
meter_definition_conflict409Another metered price of the meter uses another aggregation, pricing or (percent of amount) currency.Use the meter's existing aggregation and pricing (and, for percent of amount, its currency), or choose another meter key.
resource_not_found404No product with this ID is visible to the request.Check the ID and that your credentials are scoped to the right organization, entity, brand and mode.
product_archived409The product is archived.Reactivate the product first (active: true), or use an active product.
lookup_key_taken409Another price of the brand already has the lookup key.Move the key explicitly with prices.move_lookup_key (POST /prices/{id}/move_lookup_key), or choose another key.
permission_denied403You can't change this brand's catalog.Ask an organization owner or admin for a role or scope that allows this action.

It can also return these common errors: api_version_unsupported, invalid_json, unsupported_media_type, authentication_required, api_key_invalid, scope_required, idempotency_key_required, idempotency_key_reused, idempotency_in_progress, approval_required, approval_rejected, approval_expired, stale_approval, approval_policy_denied, rate_limited, internal_error.