Skip to main content
POST
Create an offer

Authorizations

Authorization
string
header
required

An app access token from POST /apps/oauth/token, valid 1 hour. An offline token acts as the app; an online token acts as the app on behalf of one dashboard user (the intersection of both permission sets).

Headers

Idempotency-Key
string

Makes a write safe to retry: the same key with the same method, path, query and body within 24 hours answers the stored result (Idempotent-Replayed: true) without running the write again. Only a successful answer is stored, so a retry after a failure runs. A key reused for a different request is 422 IDEMPOTENCY_KEY_REUSED; one whose first request still runs is 409 IDEMPOTENCY_KEY_IN_USE.

Required string length: 1 - 255
Pattern: ^[\x21-\x7E]+$

Query Parameters

fields
string

Return only these top-level fields, separated by commas; the id is always kept. The response schema describes the whole resource. An unknown name is 400 INVALID_FIELDS. Fields: id, storeId, kind, method, title, label, status, currency, quantity, freeDelivery, productDiscount, orderDiscount, bxgy, addon, appRule, combinesWith, eligibility, targets, codeCount, totalUsageLimit, perBuyerLimit, startsAt, endsAt, publishedAt, pausedAt, archivedAt, appOwned, createdAt, updatedAt.

Maximum string length: 1000

Body

application/json
storeId
string
required

An id (a string of digits).

Pattern: ^\d{1,24}$
kind
enum<string>
required
Available options:
quantity,
free_delivery,
product_discount,
order_discount,
bxgy,
addon,
app
method
enum<string>
required
Available options:
automatic,
code
title
string
required
Required string length: 1 - 200
codes
object[] | null
Maximum array length: 250
label
object | null

Label is the offer's stored settings for its kind, exactly as the Offers page keeps them.

config
object | null

Config is the offer's stored settings for its kind, exactly as the Offers page keeps them.

combinesWith
object | null

CombinesWith is the offer's stored settings for its kind, exactly as the Offers page keeps them.

eligibility
object | null

Eligibility is the offer's stored settings for its kind, exactly as the Offers page keeps them.

totalUsageLimit
integer | null
Required range: x >= 1
perBuyerLimit
integer | null
Required range: x >= 1
startsAt
string | null
Maximum string length: 40
endsAt
string | null
Maximum string length: 40
targets
object[] | null
Maximum array length: 101

Response

The new draft offer.

data
object
required

An offer (API 2026-10).