Add a variant to an existing product
DF-MKT-NO-MULTI-VARIANT-WRITE-PATH. Adds ONE variant to a product that already exists — the write that lets a product have a second size or colour, and so gives the storefront option picker something to pick.
OPTION VALUES DO NOT GENERATE VARIANTS. A variant is a sellable row with
its own SKU, price and stock; the seller defines the product's axes
(PUT /v1/marketplace/products/{id}/options) and then creates each
variant here at a coordinate. option_values must name every axis of
the product exactly once, with a value that exists on that axis
(matched case-insensitively; the stored spelling is returned). A
product with no axes takes option_values: [].
ONE ACTIVE VARIANT PER COORDINATE: another active variant of the
product wearing the same values is 409 duplicate_option_combination.
An archived (inactive) variant does not hold its coordinate.
The new variant INHERITS its siblings' active sales-channel listings
(same channel and store, no price override), so it appears on every
storefront the product is already sold on. Stock is not set here: it
is per store and ledgered — use POST /api/pos/v1/stock-counts.
Money is WHOLE RUPIAH (ADR-2026-09-22) despite the _cents suffix.
Gated by pos.catalog.write at pos:catalog:variants; tenant-level, so
a store-pinned caller is refused (403) like every catalog write.
Authorization
bearerAuth In: header
Path Parameters
The product id.
uuidRequest Body
application/json
TypeScript Definitions
Use the request body type in TypeScript.
Response Body
application/json
application/json
curl -X POST "https://sandbox.505pay.link/api/pos/v1/catalog/products/497f6eca-6276-4993-bfeb-53cbbbba6f08/variants" \ -H "Content-Type: application/json" \ -d '{ "sku": "KAOS-M", "name": "M", "price_cents": 170000, "option_values": [ { "option_name": "Ukuran", "value": "M" } ] }'{
"variant": {
"id": "018f4d9f-7b8a-7c2d-9a2d-1f8b92f6d302",
"product_id": "018f4d9f-7b8a-7c2d-9a2d-1f8b92f6d300",
"product_name": "Kaos Polos",
"sku": "KAOS-M",
"name": "M",
"price_cents": 170000,
"currency": "IDR",
"status": "active",
"stock_on_hand": 0,
"compare_at_price_cents": null,
"option_values": [
{
"option_name": "Ukuran",
"value": "M"
}
],
"inherited_listings": 2
}
}{
"error": "rate_limit_exceeded",
"message": "Too many requests to /v1/check",
"request_id": "018f4d9f-7b8a-7c2d-9a2d-1f8b92f6ffff"
}Was this page helpful?