Skip to main content
POST
Create a product

Authorizations

X-Suby-Api-Key
string
header
required

Secret API key. sk_live_… (production) or sk_sandbox_… (sandbox).

Headers

Idempotency-Key
string

Optional key (≤255 chars, e.g. a UUID v4) making this POST safe to retry · the response is cached 24h and a retry with the SAME key replays it instead of re-executing. The same key with a different body → 422 IDEMPOTENCY_KEY_CONFLICT; a retry while the first is in flight → 409.

Maximum string length: 255
Example:

"5f3b9c2e-1a4d-4f2b-9c31-7e2a1b6d8c04"

Body

application/json
name
string
required

Shown at checkout, snapshotted onto every Payment.

Maximum string length: 200
description
string | null
Maximum string length: 2000
imageUrl
string<uri> | null

Public https URL.

status
enum<string>
default:ACTIVE

ACTIVE sellable · DRAFT hidden from checkout · ARCHIVED retired.

Available options:
DRAFT,
ACTIVE,
ARCHIVED
billingMode
enum<string>
default:onetime

onetime and subscription carry the price on the product · pay_as_you_go carries none (each charge names its own priceCents), only a currency. subscription requires recurringInterval, the others refuse it.

Available options:
onetime,
subscription,
pay_as_you_go
priceCents
string | null

Minor units as a string of digits · "1999" = 19.99, at least "100" (1.00). Required with currency on an ACTIVE onetime / subscription; refused on pay_as_you_go.

Pattern: ^\d+$
currency
enum<string> | null

Required with priceCents, and alone on pay_as_you_go · a product bills in exactly one currency.

Available options:
EUR,
USD
recurringInterval
enum<string> | null

Cadence · required when billingMode: subscription, refused otherwise.

Available options:
DAY,
WEEK,
MONTH,
YEAR
recurringIntervalCount
integer | null

Multiplies the interval (MONTH ×3 = quarterly).

Required range: x >= 1
recurringCycleCount
integer | null

Auto-expire after N cycles. Null = renews indefinitely.

Required range: x >= 1
quantity
integer | null

Stock cap; null = unlimited.

Required range: x >= 0
taxBehavior
enum<string>
default:exclusive

MoR VAT · exclusive prices HT and adds VAT on top, inclusive prices TTC. The default for every charge on this product; a charge may override it. Inert when no VAT applies.

Available options:
inclusive,
exclusive
customFields
object[]

Extra fields collected on the hosted checkout page (max 10).

Maximum array length: 10
paymentMethods
enum<string>[] | null

Per-product payment-method whitelist. null / [] / omitted = the product accepts every method enabled on the account. A non-empty list restricts checkout to these categories (always intersected with the account's enabled methods, so listing a disabled method is a harmless no-op).

Available options:
CARD,
APPLE_PAY,
GOOGLE_PAY,
KLARNA,
IDEAL,
BANCONTACT,
TWINT,
BLIK,
AFFIRM,
ALMA,
BILLIE,
SCALAPAY,
MULTIBANCO,
PAYPAL,
SEPA_DIRECT_DEBIT,
ACH_DIRECT_DEBIT,
STABLECOIN,
VOLATILE_CRYPTO
successUrl
string<uri> | null

Redirect after payment. Null → Suby's confirmation page.

cancelUrl
string<uri> | null

Back-button target on the hosted checkout.

Response

Product created

success
boolean
required
Example:

true

data
object
required

Endpoint-specific payload.

message
string