Skip to content

Archive a price

The prices.archive operation: POST /api/v1/prices/{id}/archive in the REST API and the prices_archive tool in the MCP server.

POST/api/v1/prices/{id}/archive

Archives a price: it can't be sold any more and leaves the pricing table. Subscriptions and invoices that use it are unaffected. Its lookup key stays until you move it to the new price (prices.move_lookup_key). Archiving an archived price changes nothing; reactivate it with prices.update and active: true.

reason is recorded in the audit log.

At a glance

  • REST: POST /api/v1/prices/{id}/archive
  • MCP tool: prices_archive
  • Operation ID: prices.archive
  • 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

Path parameters

FieldTypeDescription
idprice_… ID

Body

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

FieldTypeRequiredDescription
reasonstringNo

Response

200 OK 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

Retire last year's price

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

{
  "reason": "Replaced by the 2027 price"
}

Response (200):

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": false,
  "used": false,
  "usedAt": null,
  "metadata": {},
  "createdAt": "2026-10-13T12:00:00.000Z",
  "updatedAt": "2026-10-14T09:30:00.000Z"
}

Errors

CodeHTTP statusWhenWhat to do
resource_not_found404No price 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.
version_conflict409The price changed at the same time; retry.Fetch the object again and retry the change.
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: validation_failed, 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.