API ReferenceProduct Variants

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 a token with the listing ability. 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.

PATCH
/v2/products/{product}/variants/{variant}

Authorization

bearerAuth storeAuth
AuthorizationBearer <token>

Provide your SellApp API key as a bearer token.

In: header

X-STORE<token>

Select the SellApp store for this API request.

In: header

Path Parameters

product*integer

The product path parameter.

variant*integer

The variant path parameter.

Request Body

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

curl -X PATCH "https://sell.app/api/v2/products/120/variants/4321" \  -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": "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"
}