Skip to content

Archive a product

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

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

Archives a product: it leaves the pricing table, can't be sold and can't get new prices. Existing subscriptions, invoices and the product's prices stay as they are. Archiving an archived product changes nothing. Reactivate it with products.update and active: true.

reason is recorded in the audit log.

At a glance

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

Body

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

FieldTypeRequiredDescription
reasonstringNo

Response

200 OK with a JSON object:

FieldTypeDescription
idprod_… ID
object"product"
brandIdbrd_… ID
livemodeboolean
namestring
descriptionstring or null
taxCategoryIdone of 9 values, e.g. electronically_supplied_service, saas, ebook (all in the OpenAPI document)
kindone of standard, plan
entitlementsarray of object
entitlements[].featureKeystring
entitlements[].valueboolean or number or string
lifetimeEntitlementsbooleanA one-time purchase of the product grants its entitlements for good (spec §36.1).
displayOrderinteger or null
highlightedboolean
activeboolean
imagesarray of string
metadataobject
createdAtdate-time
updatedAtdate-time

Examples

Retire a plan

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

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

Response (200):

JSON
{
  "id": "prod_01m4tx5nj8emwbyf7y9vcf47y0",
  "object": "product",
  "brandId": "brd_01m4tx5nj8emwbyf7y9vcf47x4",
  "livemode": false,
  "name": "Pro",
  "description": "For growing teams.",
  "taxCategoryId": "saas",
  "kind": "plan",
  "entitlements": [
    {
      "featureKey": "seats.max",
      "value": 10
    },
    {
      "featureKey": "feature.export",
      "value": true
    }
  ],
  "lifetimeEntitlements": false,
  "displayOrder": 2,
  "highlighted": true,
  "active": false,
  "images": [],
  "metadata": {},
  "createdAt": "2026-10-13T12:00:00.000Z",
  "updatedAt": "2026-10-14T09:30:00.000Z"
}

Errors

CodeHTTP statusWhenWhat to do
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.
version_conflict409The product 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.