Update a product
Update a product's details.
Update a product's details. The token must have the listing ability, and the product must belong to the authenticated store.
To prevent overwriting a newer dashboard or API change, send expected_updated_at with the exact updated_at value from the product you last retrieved. A stale snapshot is rejected with a validation error.
Authorization
bearerAuth storeAuth Provide your SellApp API key as a bearer token.
In: header
Select the SellApp store for this API request.
In: header
Path Parameters
The product path parameter.
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" \ -H "Content-Type: application/json" \ -d '{ "title": "Founder memo circle", "description": "A monthly collection of annotated operating memos.", "visibility": "HIDDEN", "expected_updated_at": "2026-08-30T12:00:00.000000Z" }'{
"data": {
"id": 120,
"title": "Founder memo circle",
"slug": "founder-memo-circle",
"description": "A monthly collection of annotated operating memos.",
"images": [
{
"path": "store/1/listings/NM6TBKIMzpFJq1MKTV24oMJ1W4UrKCo7NS98nt4K.png",
"metadata": {
"size": 39289,
"filename": "NM6TBKIMzpFJq1MKTV24oMJ1W4UrKCo7NS98nt4K",
"extension": "png",
"mime_type": "image/png"
}
},
{
"path": "store/1/listings/ov6XMb68tRr80zl7sqfN1or7xfqqH5WbZygDEQ8X.png",
"metadata": {
"size": 422373,
"filename": "ov6XMb68tRr80zl7sqfN1or7xfqqH5WbZygDEQ8X",
"extension": "png",
"mime_type": "image/png"
}
}
],
"order": 1,
"visibility": "HIDDEN",
"delivery_text": "Thanks again bud!",
"additional_information": [
{
"required": true,
"key": "3aecffd000e00e2211e94558007ffc37",
"type": "checkbox",
"label": "Did you test this in production?"
}
],
"other_settings": {
"faq": [
{
"answer": "Yes, trust me!",
"question": "Will I really live forever?"
}
],
"video_url": "https://www.youtube.com/watch?v=dQw4w9WgXcQ",
"redirect_url": "https://example.com/post-launch?customer_email=[customer_email]&order_id=[order_id]",
"product_title": "The real elixir of immortality",
"product_description": "Live forever, online."
},
"deleted_at": null,
"created_at": "2024-01-09T22:56:49.000000Z",
"updated_at": "2026-08-30T12:00:01.000000Z",
"store_id": 1,
"category_id": null,
"section_id": null,
"section_order": null,
"is_discoverable": true,
"variants": [
{
"id": 4321,
"title": "Monthly membership"
}
],
"url": "https://launch-lab.sell.app/product/founder-memo-circle"
}
}{
"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"
}