Skip to content
StraventaDocs
Now in Sandbox.

Add a variant to an existing product

POST
/api/pos/v1/catalog/products/{id}/variants

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
AuthorizationBearer <token>

In: header

Path Parameters

id*string

The product id.

Formatuuid

Request 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
  }
}
Empty
Empty
Empty
Empty
Empty
{
  "error": "rate_limit_exceeded",
  "message": "Too many requests to /v1/check",
  "request_id": "018f4d9f-7b8a-7c2d-9a2d-1f8b92f6ffff"
}

Was this page helpful?