Update a product variant
Update a product variant's details.
Update a product variant's details.
To update inventory directly, you may pass stock at the top level. It is treated as an alias for deliverable.data.stock when the nested value is not present.
Updates require the API key's listing ability or OAuth products:write, with matching store permissions. Send the last updated_at you read as expected_updated_at to avoid overwriting someone else's edit. If the variant has changed since then, the API returns 422 and leaves it unchanged. The compatibility PUT method accepts the same partial request as PATCH.
Provide your SellApp API key as a bearer token.
In: header
Path Parameters
The product path parameter.
The variant path parameter.
Header Parameters
Store slug. Required for OAuth access tokens. API keys may omit it to use their current store, or the first accessible store when no current store is selected.
TypeScript Definitions
Use the request body type in TypeScript.
Response Body
application/json
application/json
application/json
application/json
application/json
application/json
application/json
application/json
curl -X PATCH "https://sell.app/api/v2/products/120/variants/4321" \ -H "X-STORE: launch-lab" \ -H "Content-Type: application/json" \ -d '{ "title": "Monthly membership plus", "description": "One annotated operating memo and a monthly founder discussion." }'{
"data": {
"id": 4321,
"product_id": 120,
"title": "Monthly membership plus",
"description": "One annotated operating memo and a monthly founder discussion.",
"deliverable": {
"types": [
"MANUAL"
],
"data": {
"stock": null,
"comment": "We will send your reading-room invitation.",
"removeDuplicate": false,
"parsingMode": "COMMA"
}
},
"pricing": {
"humble": false,
"frequency": {
"value": 1,
"interval": "MONTH"
},
"type": "SINGLE_PAYMENT",
"price": {
"price": "1999",
"currency": "USD"
}
},
"minimum_purchase_quantity": 1,
"maximum_purchase_quantity": null,
"bulk_discount": [],
"payment_methods": [
"STRIPE"
],
"other_settings": {
"quantity_increments": 0,
"discord_data_required": false,
"discord_kick_on_expire": true,
"community_servers": []
},
"order": 1,
"created_at": "2026-08-30T12:00:01.000000Z",
"updated_at": "2026-08-30T12:00:01.000000Z",
"deleted_at": null,
"product": {
"additional_information": []
}
}
}{
"type": "invalid_request_error",
"code": "bad_request",
"message": "The request could not be understood.",
"status": 400,
"param": null,
"request_id": "01992a65-e064-71ba-b38f-902b7966a6be",
"docs_url": "https://sell.app/docs/api/errors#bad-request"
}{
"type": "authentication_error",
"code": "unauthenticated",
"message": "Unauthenticated.",
"status": 401,
"param": null,
"request_id": "01992a65-e064-71ba-b38f-902b7966a6be",
"docs_url": "https://sell.app/docs/api/errors#unauthenticated"
}{
"type": "authorization_error",
"code": "forbidden",
"message": "This action is unauthorized.",
"status": 403,
"param": null,
"request_id": "01992a65-e064-71ba-b38f-902b7966a6be",
"docs_url": "https://sell.app/docs/api/errors#forbidden"
}{
"type": "not_found_error",
"code": "resource_not_found",
"message": "Not Found.",
"status": 404,
"param": null,
"request_id": "01992a65-e064-71ba-b38f-902b7966a6be",
"docs_url": "https://sell.app/docs/api/errors#resource-not-found"
}{
"type": "validation_error",
"code": "validation_failed",
"message": "The selected product variant id is invalid.",
"status": 422,
"param": "product_variant_id",
"request_id": "01992a65-e064-71ba-b38f-902b7966a6be",
"docs_url": "https://sell.app/docs/api/errors#validation-failed",
"errors": {
"product_variant_id": [
"The selected product variant id is invalid."
]
}
}{
"type": "rate_limit_error",
"code": "rate_limit_exceeded",
"message": "Too Many Attempts.",
"status": 429,
"param": null,
"request_id": "01992a65-e064-71ba-b38f-902b7966a6be",
"docs_url": "https://sell.app/docs/api/errors#rate-limit-exceeded"
}{
"type": "api_error",
"code": "api_error",
"message": "Server Error",
"status": 500,
"param": null,
"request_id": "01992a65-e064-71ba-b38f-902b7966a6be",
"docs_url": "https://sell.app/docs/api/errors#api-error"
}