Skip to content

Move a lookup key to a price

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

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

Moves a lookup key to this price, taking it from the price that has it (if any) in the same step. Use it when a new price replaces an old one: integrators that look prices up by key (prices.list?lookupKey=…, checkout sessions) get the new price at once, and nothing references a price ID that changed.

The price must be active and have no other lookup key (remove that first). Moving a key to the price that already has it changes nothing. Both prices get a price.updated event.

At a glance

  • REST: POST /api/v1/prices/{id}/move_lookup_key
  • MCP tool: prices_move_lookup_key
  • Operation ID: prices.move_lookup_key
  • 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_… IDThe price that gets the key.

Body

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

FieldTypeRequiredDescription
lookupKeystringYesA stable name for the price, unique in the brand and mode, e.g. pro_monthly.

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

Point pro_monthly at the new price

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

{
  "lookupKey": "pro_monthly"
}

Response (200):

JSON
{
  "id": "price_01m4tx5nj8emwbyf7y9vcf47y3",
  "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-14T09:30:00.000Z"
}

Errors

CodeHTTP statusWhenWhat to do
validation_failed400The lookup key is malformed.Fix the fields listed in details.issues and send the request again.
price_archived409The price is archived.Reactivate the price first (active: true), or use an active price.
price_lookup_key_conflict409The price already has another lookup key.Remove the price's current lookup key first (lookupKey: null), or move the key to a price without one.
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_conflict409One of the prices 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: 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.