Workspace API

Offers & order bumps

Offers & order bumps endpoints of the Zanfia Workspace API, with schemas and code samples.

10 min readLast updated Sep 30, 2026

An offer is a checkout of a product; one product can have several. Order bumps are add-on offers shown at checkout. Amounts are minor units (1999 = 19.99). All routes require a Authorization: Bearer header — see Authentication.

List offers

GET/checkouts

Authorization

bearerAuth
AuthorizationBearer <token>

API key from Dashboard → Integrations → API, MCP and CLI.

In: header

Query Parameters

productId?string

Response Body

application/json

application/json

curl -X GET "https://example.com/checkouts"
{  "count": 0,  "checkouts": [    {      "id": "string",      "productId": "string",      "name": "string",      "slug": "string",      "title": "string",      "active": true,      "archived": true,      "isFree": true,      "priceCount": 0,      "createdAt": "string"    }  ]}
{  "error": "string",  "message": "string"}

Create an offer

POST/checkouts

Authorization

bearerAuth
AuthorizationBearer <token>

API key from Dashboard → Integrations → API, MCP and CLI.

In: header

Request Body

application/json

TypeScript Definitions

Use the request body type in TypeScript.

Response Body

application/json

application/json

curl -X POST "https://example.com/checkouts" \  -H "Content-Type: application/json" \  -d '{    "productId": "string"  }'
{  "id": "string",  "productId": "string",  "name": "string",  "slug": "string",  "title": "string",  "active": true,  "archived": true,  "isFree": true,  "priceCount": 0,  "createdAt": "string"}
{  "error": "string",  "message": "string"}

Offer detail

GET/checkouts/{checkoutId}

Authorization

bearerAuth
AuthorizationBearer <token>

API key from Dashboard → Integrations → API, MCP and CLI.

In: header

Path Parameters

checkoutId*string

Offer (checkout) id

Query Parameters

include?"full"

full adds the whole editable settings surface to the response.

Value in

  • "full"

Response Body

application/json

application/json

curl -X GET "https://example.com/checkouts/string"
{  "checkoutImages": {},  "checkoutImagesMedia": {},  "checkoutMedia": {},  "checkoutMediaWidth": 0,  "showTestimonials": true,  "showPlanIncludes": true,  "planIncludesLayout": {},  "afterPurchase": {    "thankYou": {      "type": "defaultPage",      "redirectUrl": "string",      "custom": {        "eyebrow": "string",        "headline": "string",        "messageHtml": "string",        "messageMarkdown": "string",        "ctaLabel": "string",        "ctaUrl": "string",        "showOrderSummary": true,        "nextOffer": {          "kind": "checkout",          "checkoutId": "string",          "productId": "string",          "headline": "string",          "description": "string",          "ctaLabel": "string"        }      }    },    "emails": {      "sendPurchaseConfirmationToBuyer": true,      "sendPurchaseNotificationToOwner": true,      "sendFailedPaymentEmailToBuyer": true,      "sendFailedPaymentEmailToOwner": true    },    "emailOverrides": {      "property1": {        "enabled": true,        "subject": {          "en": "string",          "pl": "string"        },        "headline": {          "en": "string",          "pl": "string"        },        "layout": [          {            "id": "string",            "type": "text",            "text": {              "en": "string",              "pl": "string"            }          }        ],        "body": {          "en": "string",          "pl": "string"        },        "variants": {          "property1": {},          "property2": {}        },        "attachments": [          {            "kind": "media",            "mediaId": "string",            "name": "string",            "mimeType": "string",            "size": 0,            "storagePath": "string",            "url": "string"          }        ]      },      "property2": {        "enabled": true,        "subject": {          "en": "string",          "pl": "string"        },        "headline": {          "en": "string",          "pl": "string"        },        "layout": [          {            "id": "string",            "type": "text",            "text": {              "en": "string",              "pl": "string"            }          }        ],        "body": {          "en": "string",          "pl": "string"        },        "variants": {          "property1": {},          "property2": {}        },        "attachments": [          {            "kind": "media",            "mediaId": "string",            "name": "string",            "mimeType": "string",            "size": 0,            "storagePath": "string",            "url": "string"          }        ]      }    }  },  "deadline": {    "type": "fixed_date",    "endsAt": 0,    "deadlineKey": "string",    "expiryAction": "waitlist",    "redirectUrl": "string",    "fallbackCheckoutId": "string",    "showCountdown": true,    "bannerBgColor": "string",    "bannerTextColor": "string",    "bannerText": "string",    "bannerStyle": "solid",    "bannerHideText": true,    "bannerSize": "small"  },  "theme": {    "sourcePresetId": "string",    "overrides": {      "selectedTheme": "auto",      "themeColor": "tomato",      "customColors": {        "light": {          "accent": "string",          "gray": "string",          "background": "string"        },        "dark": {          "accent": "string",          "gray": "string",          "background": "string"        }      },      "customCheckoutColors": {        "light": {          "checkoutLeftBackground": "string",          "checkoutRightBackground": "string",          "checkoutLeftTextColor": "string",          "checkoutLeftPriceColor": "string",          "accent": "string"        },        "dark": {          "checkoutLeftBackground": "string",          "checkoutRightBackground": "string",          "checkoutLeftTextColor": "string",          "checkoutLeftPriceColor": "string",          "accent": "string"        }      },      "radius": "none",      "styleVariant": "solid"    }  },  "invoiceAsOption": true,  "hideCountryField": true,  "fixedCountry": "string",  "showFixedCountry": true,  "showPhoneField": {},  "showAdditionalInfo": {},  "collectFirstName": true,  "collectLastName": true,  "freeAccessPeriod": {    "interval": "day",    "interval_count": 0  },  "signupTagIds": {},  "allowPromotionCode": {},  "forceB2B": true,  "promoteNetPrices": true,  "promoteNetPriceRate": 0,  "priceVariantsPlacement": {},  "stripeTaxBehavior": {},  "paymentMethodsDisplay": {},  "paymentsMethods": {    "blik": false,    "p24": false,    "przelewy24": false,    "applePay": false,    "googlePay": false,    "klarna": false,    "card": false  },  "showExpressCheckout": true,  "allowUpgradeSubscriptionPlan": true,  "allowDowngradeSubscriptionPlan": true,  "enableClientToBuyMultipleTimes": true,  "clientMultiplePurchaseLimit": 0,  "multiplePurchaseType": {    "type": "fixed",    "value": 0  },  "termsUrl": "string",  "privacyPolicyUrl": "string",  "termsContent": "string",  "privacyPolicyContent": "string",  "claim": "string",  "customInvoicesClient": {    "accountUrl": "string",    "accountName": "string",    "client": "fakturownia",    "id": "string"  },  "disableInvoiceIssuing": true,  "issueReceiptWhenInvoiceIsOptIn": true,  "dontSendInvoiceToClient": true,  "customInvoiceEmailSubject": "string",  "customInvoiceEmailMessage": "string",  "disableEmailNotificationAboutPurchase": true,  "disableEmailNotificationAboutPurchaseToOwner": true,  "disableEmailsAboutFailedPayment": true,  "disableEmailNotificationAboutFailedPaymentClient": true,  "disableEmailsAboutCancelSubscription": true,  "disableEmailsAboutEndSubscription": true,  "disableEmailNotificationsRemindersAboutEndingAccessToClient": true,  "ownerEmailNotifications": {    "property1": true,    "property2": true  },  "offerStack": {    "items": [      {        "id": "string",        "title": "string",        "description": "string",        "value": 0      }    ],    "showValues": true,    "showTotal": true  },  "oto": {    "enabled": true,    "steps": [      {        "otoOfferId": "string",        "onAcceptStepIndex": 0,        "onDeclineStepIndex": 0      }    ]  },  "facebookPixelId": "string",  "googleAnalyticsId": "string",  "googleAnalyticsGtmId": "string",  "metaConversionIntegrationId": "string",  "conversionTrackingIntegrationIds": {},  "conversionTrackingInheritDefaults": true,  "id": "string",  "productId": "string",  "name": "string",  "slug": "string",  "title": "string",  "active": true,  "archived": true,  "isFree": true,  "priceCount": 0,  "createdAt": "string",  "description": "string",  "language": "string",  "successUrl": "string",  "prices": [    {      "id": "string",      "productId": "string",      "amountCents": 0,      "currency": "string",      "type": "one_time",      "active": true,      "status": "available",      "gateways": [        "string"      ],      "label": "string",      "hidden": true,      "interval": "string",      "intervalCount": 0,      "trialPeriodDays": 0,      "accessInterval": "string",      "accessIntervalCount": 0,      "accessUntil": "string",      "installments": {        "numberOfCycles": 0,        "allowCancellation": true      },      "saleStartsAt": "string",      "saleStartDisplay": "hidden",      "saleEndsAt": "string",      "quantityLimit": 0,      "compareAtAmountCents": 0,      "customInvoiceName": "string",      "planId": "string"    }  ],  "orderBumps": [    {      "orderBumpId": "string",      "visibleForPriceIds": [        "string"      ]    }  ]}
{  "error": "string",  "message": "string"}

Update offer settings

PATCH/checkouts/{checkoutId}

Authorization

bearerAuth
AuthorizationBearer <token>

API key from Dashboard → Integrations → API, MCP and CLI.

In: header

Path Parameters

checkoutId*string

Offer (checkout) id

Request Body

application/json

TypeScript Definitions

Use the request body type in TypeScript.

Partial update of an offer — the full checkout-builder settings surface. Omitted fields are unchanged.

Derived from the internal editor DTO with the composition/lifecycle fields removed: active/archived (publish + delete routes), orderBumps (attach/detach routes), and the republishHiddenProducts activation control flag. oto (the checkout's one-time-offer chain attachment) IS included — offer ids for its steps[].otoOfferId come from the /oto-offers routes; the shared Joi validator enforces the chain shape.

description is a public alias for checkoutDescription (kept from the original 5-field surface); when both are present checkoutDescription wins.

Response Body

application/json

application/json

curl -X PATCH "https://example.com/checkouts/string" \  -H "Content-Type: application/json" \  -d '{}'
{  "checkoutId": "string"}
{  "error": "string",  "message": "string"}

Delete an offer

DELETE/checkouts/{checkoutId}

Authorization

bearerAuth
AuthorizationBearer <token>

API key from Dashboard → Integrations → API, MCP and CLI.

In: header

Path Parameters

checkoutId*string

Offer (checkout) id

Response Body

application/json

application/json

curl -X DELETE "https://example.com/checkouts/string"
{  "checkoutId": "string",  "deleted": true}
{  "error": "string",  "message": "string"}

Activate or pause an offer

POST/checkouts/{checkoutId}/publish

Authorization

bearerAuth
AuthorizationBearer <token>

API key from Dashboard → Integrations → API, MCP and CLI.

In: header

Path Parameters

checkoutId*string

Offer (checkout) id

Request Body

application/json

TypeScript Definitions

Use the request body type in TypeScript.

Response Body

application/json

application/json

curl -X POST "https://example.com/checkouts/string/publish" \  -H "Content-Type: application/json" \  -d '{    "active": true  }'
{  "checkoutId": "string",  "active": true}
{  "error": "string",  "message": "string"}

Duplicate an offer

POST/checkouts/{checkoutId}/duplicate

Authorization

bearerAuth
AuthorizationBearer <token>

API key from Dashboard → Integrations → API, MCP and CLI.

In: header

Path Parameters

checkoutId*string

Offer (checkout) id

Request Body

application/json

TypeScript Definitions

Use the request body type in TypeScript.

Response Body

application/json

application/json

curl -X POST "https://example.com/checkouts/string/duplicate" \  -H "Content-Type: application/json" \  -d '{}'
{  "id": "string",  "productId": "string",  "name": "string",  "slug": "string",  "title": "string",  "active": true,  "archived": true,  "isFree": true,  "priceCount": 0,  "createdAt": "string"}
{  "error": "string",  "message": "string"}

Make this the product's default checkout

POST/checkouts/{checkoutId}/set-default

Authorization

bearerAuth
AuthorizationBearer <token>

API key from Dashboard → Integrations → API, MCP and CLI.

In: header

Path Parameters

checkoutId*string

Offer (checkout) id

Response Body

application/json

application/json

curl -X POST "https://example.com/checkouts/string/set-default"
{  "checkoutId": "string",  "productId": "string"}
{  "error": "string",  "message": "string"}

Add a price variant

POST/checkouts/{checkoutId}/prices

Authorization

bearerAuth
AuthorizationBearer <token>

API key from Dashboard → Integrations → API, MCP and CLI.

In: header

Path Parameters

checkoutId*string

Offer (checkout) id

Request Body

application/json

TypeScript Definitions

Use the request body type in TypeScript.

Response Body

application/json

application/json

curl -X POST "https://example.com/checkouts/string/prices" \  -H "Content-Type: application/json" \  -d '{    "type": "one_time",    "amountCents": 0,    "currency": "string"  }'
{  "id": "string",  "productId": "string",  "amountCents": 0,  "currency": "string",  "type": "one_time",  "active": true,  "status": "available",  "gateways": [    "string"  ],  "label": "string",  "hidden": true,  "interval": "string",  "intervalCount": 0,  "trialPeriodDays": 0,  "accessInterval": "string",  "accessIntervalCount": 0,  "accessUntil": "string",  "installments": {    "numberOfCycles": 0,    "allowCancellation": true  },  "saleStartsAt": "string",  "saleStartDisplay": "hidden",  "saleEndsAt": "string",  "quantityLimit": 0,  "compareAtAmountCents": 0,  "customInvoiceName": "string",  "planId": "string"}
{  "error": "string",  "message": "string"}

Reorder prices

PUT/checkouts/{checkoutId}/prices/order

Authorization

bearerAuth
AuthorizationBearer <token>

API key from Dashboard → Integrations → API, MCP and CLI.

In: header

Path Parameters

checkoutId*string

Offer (checkout) id

Request Body

application/json

TypeScript Definitions

Use the request body type in TypeScript.

Response Body

application/json

application/json

curl -X PUT "https://example.com/checkouts/string/prices/order" \  -H "Content-Type: application/json" \  -d '{    "priceIds": [      "string"    ]  }'
{  "checkoutId": "string"}
{  "error": "string",  "message": "string"}

Mutate a price

PATCH/checkouts/{checkoutId}/prices/{priceId}

Authorization

bearerAuth
AuthorizationBearer <token>

API key from Dashboard → Integrations → API, MCP and CLI.

In: header

Path Parameters

checkoutId*string

Offer (checkout) id

priceId*string

Price id

Request Body

application/json

TypeScript Definitions

Use the request body type in TypeScript.

Point mutation of an existing price. change-amount re-prices in place (fresh gateway price under the same id) keeping label/limits/promo/plan. edit-details changes label/description only; set-plan re-links the price to a product plan; edit applies the partial overrides in edit over the stored price (limits/promo/access/gateways/trial).

Response Body

application/json

application/json

curl -X PATCH "https://example.com/checkouts/string/prices/string" \  -H "Content-Type: application/json" \  -d '{    "operation": "activate"  }'
{  "checkoutId": "string",  "priceId": "string"}
{  "error": "string",  "message": "string"}

Archive or remove a price

DELETE/checkouts/{checkoutId}/prices/{priceId}

Authorization

bearerAuth
AuthorizationBearer <token>

API key from Dashboard → Integrations → API, MCP and CLI.

In: header

Path Parameters

checkoutId*string

Offer (checkout) id

priceId*string

Price id

Query Parameters

mode?string
Default"archive"

Value in

  • "archive"
  • "remove"

Response Body

application/json

application/json

curl -X DELETE "https://example.com/checkouts/string/prices/string"
{  "checkoutId": "string",  "priceId": "string",  "mode": "archive"}
{  "error": "string",  "message": "string"}

Preview a cart-recovery email

POST/checkouts/{checkoutId}/sessions/{sessionId}/recovery-email/preview

Authorization

bearerAuth
AuthorizationBearer <token>

API key from Dashboard → Integrations → API, MCP and CLI.

In: header

Path Parameters

checkoutId*string

Offer (checkout) id

sessionId*string

Checkout session id

Response Body

application/json

application/json

curl -X POST "https://example.com/checkouts/string/sessions/string/recovery-email/preview"
{  "status": "ok",  "recipientEmail": "string",  "customerName": "string",  "productName": "string",  "checkoutUrl": "string",  "language": "pl"}
{  "error": "string",  "message": "string"}

Send a cart-recovery email

POST/checkouts/{checkoutId}/sessions/{sessionId}/recovery-email

Authorization

bearerAuth
AuthorizationBearer <token>

API key from Dashboard → Integrations → API, MCP and CLI.

In: header

Path Parameters

checkoutId*string

Offer (checkout) id

sessionId*string

Checkout session id

Response Body

application/json

application/json

curl -X POST "https://example.com/checkouts/string/sessions/string/recovery-email"
{  "status": "ok",  "sentAtMs": 0,  "sentCount": 0}
{  "error": "string",  "message": "string"}

Attach a bump to an offer

POST/checkouts/{checkoutId}/order-bumps

Authorization

bearerAuth
AuthorizationBearer <token>

API key from Dashboard → Integrations → API, MCP and CLI.

In: header

Path Parameters

checkoutId*string

Offer (checkout) id

Request Body

application/json

TypeScript Definitions

Use the request body type in TypeScript.

Response Body

application/json

application/json

curl -X POST "https://example.com/checkouts/string/order-bumps" \  -H "Content-Type: application/json" \  -d '{    "orderBumpId": "string"  }'
{  "checkoutId": "string",  "orderBumpId": "string",  "alreadyAttached": true}
{  "error": "string",  "message": "string"}

Detach a bump from an offer

DELETE/checkouts/{checkoutId}/order-bumps/{orderBumpId}

Authorization

bearerAuth
AuthorizationBearer <token>

API key from Dashboard → Integrations → API, MCP and CLI.

In: header

Path Parameters

checkoutId*string

Offer (checkout) id

orderBumpId*string

Order bump id

Response Body

application/json

application/json

curl -X DELETE "https://example.com/checkouts/string/order-bumps/string"
{  "checkoutId": "string",  "orderBumpId": "string"}
{  "error": "string",  "message": "string"}

List order bumps

GET/order-bumps

Authorization

bearerAuth
AuthorizationBearer <token>

API key from Dashboard → Integrations → API, MCP and CLI.

In: header

Response Body

application/json

application/json

curl -X GET "https://example.com/order-bumps"
{  "count": 0,  "orderBumps": [    {      "id": "string",      "name": "string",      "description": "string",      "ctaText": "string",      "productId": "string",      "productName": "string",      "priceId": "string",      "price": {        "amountCents": 0,        "currency": "string",        "type": "one_time"      },      "createdAt": "string"    }  ]}
{  "error": "string",  "message": "string"}

Create an order bump

POST/order-bumps

Authorization

bearerAuth
AuthorizationBearer <token>

API key from Dashboard → Integrations → API, MCP and CLI.

In: header

Request Body

application/json

TypeScript Definitions

Use the request body type in TypeScript.

Response Body

application/json

application/json

curl -X POST "https://example.com/order-bumps" \  -H "Content-Type: application/json" \  -d '{    "productId": "string",    "priceId": "string",    "name": "string"  }'
{  "orderBumpId": "string"}
{  "error": "string",  "message": "string"}

Update an order bump

PATCH/order-bumps/{orderBumpId}

Authorization

bearerAuth
AuthorizationBearer <token>

API key from Dashboard → Integrations → API, MCP and CLI.

In: header

Path Parameters

orderBumpId*string

Order bump id

Request Body

application/json

TypeScript Definitions

Use the request body type in TypeScript.

Response Body

application/json

application/json

curl -X PATCH "https://example.com/order-bumps/string" \  -H "Content-Type: application/json" \  -d '{}'
{  "orderBumpId": "string"}
{  "error": "string",  "message": "string"}

Delete an order bump

DELETE/order-bumps/{orderBumpId}

Authorization

bearerAuth
AuthorizationBearer <token>

API key from Dashboard → Integrations → API, MCP and CLI.

In: header

Path Parameters

orderBumpId*string

Order bump id

Response Body

application/json

application/json

curl -X DELETE "https://example.com/order-bumps/string"
{  "orderBumpId": "string"}
{  "error": "string",  "message": "string"}

Was this article helpful?

Related articles

Spotted something off? Tell us at support@zanfia.com.