Skip to content

List coupons

The coupons.list operation: GET /api/v1/coupons in the REST API and the coupons_list tool in the MCP server.

GET/api/v1/coupons

Lists the brand's coupons in the request's mode, newest first, with their name, discount and duration: look one up by its name here. Filter with active=true (or false for archived ones).

Paginate with limit (1–100, default 10) and starting_after (the next_cursor of the previous page).

At a glance

  • REST: GET /api/v1/coupons
  • MCP tool: coupons_list
  • Operation ID: coupons.list
  • Scope: Brand
  • Permission: catalog:read
  • Risk tier: read
  • Dry run: Not supported
  • Idempotency: Not needed (read only)
  • Modes: Test and live
  • Pagination: limit (at most 100) and starting_after
  • Authentication: API key with the catalog:read scope
  • Since: M5

Request

Query parameters

FieldTypeRequiredDescription
activestringNoOnly active (true) or archived (false) coupons.
limitinteger (1 to 100)No
starting_aftercpn_… IDNo

Response

200 OK with a JSON object, a page of the list (newest first):

FieldTypeDescription
object"list"
dataarray of object
data[].idcpn_… ID
data[].object"coupon"
data[].brandIdbrd_… ID
data[].livemodeboolean
data[].namestring
data[].percentOffPpmstring or nullPercent off in parts per million (500000 = 50%), or null for an amount-off coupon.
data[].amountOffmoney or nullAmount off per invoice, or null for a percent-off coupon.
data[].durationone of once, repeating, forever
data[].durationInPeriodsinteger or null
data[].appliesToobject or nullThe products and prices the coupon is limited to, or null for every line.
data[].maxRedemptionsinteger or null
data[].redeemBydate-time or null
data[].timesRedeemedinteger
data[].validbooleanWhether it can be redeemed now: active, before redeemBy, below its limit.
data[].usedbooleanA discount references it or a redemption was counted: only name, status and metadata can change.
data[].activeboolean
data[].metadataobject
data[].createdAtdate-time
data[].updatedAtdate-time
has_moreboolean
next_cursorcpn_… ID or null

Examples

Active coupons

HTTP
GET /api/v1/coupons?active=true
Authorization: Bearer or_test_…

Response (200):

JSON
{
  "object": "list",
  "data": [
    {
      "id": "cpn_01m4tx5nj8emwbyf7y9vcf47z0",
      "object": "coupon",
      "brandId": "brd_01m4tx5nj8emwbyf7y9vcf47x4",
      "livemode": false,
      "name": "Launch offer",
      "percentOffPpm": "500000",
      "amountOff": null,
      "duration": "repeating",
      "durationInPeriods": 3,
      "appliesTo": {
        "productIds": [],
        "priceIds": ["price_01m4tx5nj8emwbyf7y9vcf47y2"]
      },
      "maxRedemptions": 500,
      "redeemBy": "2027-01-01T00:00:00.000Z",
      "timesRedeemed": 0,
      "valid": true,
      "used": false,
      "active": true,
      "metadata": {},
      "createdAt": "2026-10-13T12:00:00.000Z",
      "updatedAt": "2026-10-13T12:00:00.000Z"
    }
  ],
  "has_more": false,
  "next_cursor": null
}

Errors

CodeHTTP statusWhenWhat to do
validation_failed400A filter or pagination value is malformed.Fix the fields listed in details.issues and send the request again.
permission_denied403You can't see 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, authentication_required, api_key_invalid, scope_required, resource_not_found, dry_run_not_supported, rate_limited, internal_error.