Overview
Organize storefront products, configure purchasable variants, and manage visibility safely.
A product is the page your customer browses: its title, description, images, visibility, and checkout questions. Its variants are the options they can buy, each with its own price and delivery setup.
Create the product first, then create at least one variant before publishing it.
API product writes use the same domain rules as the dashboard and require the
listing ability. A product ID from another X-STORE scope returns 404.
To avoid overwriting someone else's edit, send the last updated_at you read as
expected_updated_at when updating or deleting. Product deletion is soft deletion
(the record is kept rather than permanently erased) and is
rejected while active or past-due subscriptions depend on the product.
Open an endpoint below for its exact fields, types, and examples. Your code should ignore response fields it does not recognize so new fields do not break it.
Endpoints
- List all products
- Search products
- Create a product
- Batch create products
- Retrieve a product
- Update a product
- Batch update products
- Batch delete products
- Delete a product
For a complete workflow, see Sell a product.
Additional endpoint reference
Update a product
Provide your SellApp API key as a bearer token.
In: header
Path Parameters
The product 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 PUT "https://sell.app/api/v2/products/120" \ -H "X-STORE: launch-lab" \ -H "Content-Type: application/json" \ -d '{ "title": "Design kit", "description": "Templates for your next project.", "visibility": "HIDDEN", "expected_updated_at": "2026-08-30T12:00:00.000000Z" }'{
"data": {
"id": 120,
"title": "Design kit",
"slug": "founder-memo-circle",
"description": "Templates for your next project.",
"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 for your purchase. Your download is ready.",
"additional_information": [
{
"required": true,
"key": "3aecffd000e00e2211e94558007ffc37",
"type": "checkbox",
"label": "Do you agree to the purchase terms?"
}
],
"other_settings": {
"faq": [
{
"answer": "Yes. Adapt the included templates to your project.",
"question": "Can I use these templates for my own project?"
}
],
"video_url": "https://example.com/launch-lab/product-tour",
"redirect_url": "https://example.com/post-launch?customer_email=[customer_email]&order_id=[order_id]",
"product_title": "Project Launch Kit",
"product_description": "Plan, test, and launch your next project."
},
"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": "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"
}Retrieve a bundle item
Provide your SellApp API key as a bearer token.
In: header
Path Parameters
The bundle path parameter.
The item 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.
Response Body
application/json
application/json
application/json
application/json
application/json
application/json
application/json
application/json
curl -X GET "https://sell.app/api/v2/bundles/0/items/2" \ -H "X-STORE: launch-lab"{
"data": {
"id": 2,
"product_id": 1,
"title": "Professional Edition",
"description": "Includes templates, examples and email support.",
"deliverable": {
"data": {
"removeDuplicate": false,
"parsingMode": "COMMA",
"stock": 3,
"comment": "Thanks for the purchase! I'll send you a contract by email. Make sure to sign it with your blood.",
"serials": [
"1",
"2",
"3"
]
},
"types": [
"TEXT",
"MANUAL"
]
},
"pricing": {
"humble": true,
"frequency": {
"value": 1,
"interval": "MONTH"
},
"type": "SINGLE_PAYMENT",
"price": {
"price": "1999",
"currency": "USD"
}
},
"minimum_purchase_quantity": 1,
"maximum_purchase_quantity": 3,
"bulk_discount": [
{
"discount_percentage": 10,
"minimum_purchase_amount": 10
}
],
"payment_methods": [
"BTC",
"STRIPE"
],
"other_settings": {
"quantity_increments": 2,
"discord_data_required": false
},
"order": 1,
"created_at": "2024-01-10T18:47:22.000000Z",
"updated_at": "2024-01-10T18:47:22.000000Z",
"deleted_at": null,
"product": {
"additional_information": [
{
"required": true,
"key": "5ebae238c0afae7f4a4b96b30ff6f34c",
"type": "CHECKBOX",
"label": "I agree to the purchase terms"
}
]
}
}
}{
"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"
}List bundle items
Provide your SellApp API key as a bearer token.
In: header
Path Parameters
The bundle path parameter.
Query Parameters
Number of items to return per page.
151 <= value <= 100Page number to return.
11 <= valueHeader 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.
Response Body
application/json
application/json
application/json
application/json
application/json
application/json
application/json
application/json
curl -X GET "https://sell.app/api/v2/bundles/0/items" \ -H "X-STORE: launch-lab"{
"data": [
{
"id": 2,
"product_id": 1,
"title": "Professional Edition",
"description": "Includes templates, examples and email support.",
"deliverable": {
"data": {
"removeDuplicate": false,
"parsingMode": "COMMA",
"stock": 3,
"comment": "Thanks for the purchase! I'll send you a contract by email. Make sure to sign it with your blood.",
"serials": [
"1",
"2",
"3"
]
},
"types": [
"TEXT",
"MANUAL"
]
},
"pricing": {
"humble": true,
"frequency": {
"value": 1,
"interval": "MONTH"
},
"type": "SINGLE_PAYMENT",
"price": {
"price": "1999",
"currency": "USD"
}
},
"minimum_purchase_quantity": 1,
"maximum_purchase_quantity": 3,
"bulk_discount": [
{
"discount_percentage": 10,
"minimum_purchase_amount": 10
}
],
"payment_methods": [
"BTC",
"STRIPE"
],
"other_settings": {
"quantity_increments": 2,
"discord_data_required": false
},
"order": 1,
"created_at": "2024-01-10T18:47:22.000000Z",
"updated_at": "2024-01-10T18:47:22.000000Z",
"deleted_at": null,
"product": {
"additional_information": [
{
"required": true,
"key": "5ebae238c0afae7f4a4b96b30ff6f34c",
"type": "CHECKBOX",
"label": "I agree to the purchase terms"
}
]
}
}
],
"links": {
"first": "https://sell.app/api/v2/bundles/1/items?page=1",
"last": "https://sell.app/api/v2/bundles/1/items?page=1",
"prev": null,
"next": null
},
"meta": {
"current_page": 1,
"from": 1,
"last_page": 1,
"path": "https://sell.app/api/v2/bundles/1/items",
"per_page": 15,
"to": 1,
"total": 1,
"links": [
{
"url": null,
"label": "« Previous",
"active": false
},
{
"url": "https://sell.app/api/v2/bundles/1/items?page=1",
"label": "1",
"active": true
},
{
"url": null,
"label": "Next »",
"active": false
}
]
}
}{
"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"
}Attach bundle items
Provide your SellApp API key as a bearer token.
In: header
Path Parameters
The bundle 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.
Request Body
application/json
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 POST "https://sell.app/api/v2/bundles/0/items/attach" \ -H "X-STORE: launch-lab" \ -H "Content-Type: application/json" \ -d '{ "resources": { "1": { "quantity": 1 } } }'{
"attached": [
1
]
}{
"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"
}Detach bundle items
Provide your SellApp API key as a bearer token.
In: header
Path Parameters
The bundle 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.
Request Body
application/json
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 DELETE "https://sell.app/api/v2/bundles/0/items/detach" \ -H "X-STORE: launch-lab" \ -H "Content-Type: application/json" \ -d '{ "resources": [ 1 ] }'{
"detached": [
1
]
}{
"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"
}List upsell offers
Provide your SellApp API key as a bearer token.
In: header
Query Parameters
Number of items to return per page.
151 <= value <= 100Page number to return.
11 <= valueSet to false to return at most 100 matching items in one data array without pagination links or metadata.
trueHeader 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.
Response Body
application/json
application/json
application/json
application/json
application/json
application/json
application/json
curl -X GET "https://sell.app/api/v2/upsell-offers" \ -H "X-STORE: launch-lab"{
"data": [
{
"id": 71,
"name": "One More Feature",
"description": "Offer the advanced package with additional resources.",
"is_active": true,
"source_listing_id": 120,
"source_variant_id": 880,
"minimum_order_total_usd_cents": 1000,
"maximum_order_total_usd_cents": 25000,
"starts_at": null,
"ends_at": null,
"available_for_days": 14,
"max_accepts_per_customer": 1,
"sort_order": 0,
"version": 1,
"source_product": {
"id": 120,
"title": "Zero to One More Meeting"
},
"source_variant": {
"id": 880,
"title": "Standard"
},
"items": [
{
"id": 91,
"target_listing_id": 121,
"target_variant_id": 881,
"headline": "Upgrade today",
"description": "Unlock dark mode, webhooks, and the premium launch checklist.",
"discount_type": "percentage",
"discount_value": "15.00",
"maximum_discount_amount": "25.00",
"sort_order": 0,
"target_product": {
"id": 121,
"title": "Advanced course"
},
"target_variant": {
"id": 881,
"title": "Lifetime"
},
"created_at": "2026-07-12T18:00:00.000Z",
"updated_at": "2026-07-12T18:00:00.000Z"
}
],
"created_at": "2026-07-12T18:00:00.000Z",
"updated_at": "2026-07-12T18:00:00.000Z",
"deleted_at": null
}
],
"links": {
"first": "https://sell.app/api/v2/upsell-offers?page=1",
"last": "https://sell.app/api/v2/upsell-offers?page=1",
"prev": null,
"next": null
},
"meta": {
"current_page": 1,
"from": 1,
"last_page": 1,
"path": "https://sell.app/api/v2/upsell-offers",
"per_page": 15,
"to": 1,
"total": 1,
"links": [
{
"url": null,
"label": "« Previous",
"active": false
},
{
"url": "https://sell.app/api/v2/upsell-offers?page=1",
"label": "1",
"active": true
},
{
"url": null,
"label": "Next »",
"active": false
}
]
}
}{
"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": "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"
}Create an upsell offer
Provide your SellApp API key as a bearer token.
In: header
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.
Request Body
application/json
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 POST "https://sell.app/api/v2/upsell-offers" \ -H "X-STORE: launch-lab" \ -H "Content-Type: application/json" \ -d '{ "name": "One More Feature", "description": "Offer the advanced package with additional resources.", "is_active": true, "source_listing_id": 120, "source_variant_id": 880, "minimum_order_total_usd_cents": 1000, "maximum_order_total_usd_cents": 25000, "available_for_days": 14, "max_accepts_per_customer": 1, "items": [ { "target_listing_id": 121, "target_variant_id": 881, "headline": "Upgrade today", "description": "Unlock dark mode, webhooks, and the premium launch checklist.", "discount_type": "percentage", "discount_value": "15.00", "maximum_discount_amount": "25.00" } ] }'{
"data": {
"id": 71,
"name": "One More Feature",
"description": "Offer the advanced package with additional resources.",
"is_active": true,
"source_listing_id": 120,
"source_variant_id": 880,
"minimum_order_total_usd_cents": 1000,
"maximum_order_total_usd_cents": 25000,
"starts_at": null,
"ends_at": null,
"available_for_days": 14,
"max_accepts_per_customer": 1,
"sort_order": 0,
"version": 1,
"source_product": {
"id": 120,
"title": "Zero to One More Meeting"
},
"source_variant": {
"id": 880,
"title": "Standard"
},
"items": [
{
"id": 91,
"target_listing_id": 121,
"target_variant_id": 881,
"headline": "Upgrade today",
"description": "Unlock dark mode, webhooks, and the premium launch checklist.",
"discount_type": "percentage",
"discount_value": "15.00",
"maximum_discount_amount": "25.00",
"sort_order": 0,
"target_product": {
"id": 121,
"title": "Advanced course"
},
"target_variant": {
"id": 881,
"title": "Lifetime"
},
"created_at": "2026-07-12T18:00:00.000Z",
"updated_at": "2026-07-12T18:00:00.000Z"
}
],
"created_at": "2026-07-12T18:00:00.000Z",
"updated_at": "2026-07-12T18:00:00.000Z",
"deleted_at": null
}
}{
"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": "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"
}Search upsell offers
Provide your SellApp API key as a bearer token.
In: header
Query Parameters
Number of items to return per page.
151 <= value <= 100Page number to return.
11 <= valueSet to false to return at most 100 matching items in one data array without pagination links or metadata.
trueHeader 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.
Request Body
application/json
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 POST "https://sell.app/api/v2/upsell-offers/search" \ -H "X-STORE: launch-lab" \ -H "Content-Type: application/json" \ -d '{ "filters": [ { "field": "id", "operator": "=", "value": 71 } ], "sort": [ { "field": "created_at", "direction": "desc" } ] }'{
"data": [
{
"id": 71,
"name": "One More Feature",
"description": "Offer the advanced package with additional resources.",
"is_active": true,
"source_listing_id": 120,
"source_variant_id": 880,
"minimum_order_total_usd_cents": 1000,
"maximum_order_total_usd_cents": 25000,
"starts_at": null,
"ends_at": null,
"available_for_days": 14,
"max_accepts_per_customer": 1,
"sort_order": 0,
"version": 1,
"source_product": {
"id": 120,
"title": "Zero to One More Meeting"
},
"source_variant": {
"id": 880,
"title": "Standard"
},
"items": [
{
"id": 91,
"target_listing_id": 121,
"target_variant_id": 881,
"headline": "Upgrade today",
"description": "Unlock dark mode, webhooks, and the premium launch checklist.",
"discount_type": "percentage",
"discount_value": "15.00",
"maximum_discount_amount": "25.00",
"sort_order": 0,
"target_product": {
"id": 121,
"title": "Advanced course"
},
"target_variant": {
"id": 881,
"title": "Lifetime"
},
"created_at": "2026-07-12T18:00:00.000Z",
"updated_at": "2026-07-12T18:00:00.000Z"
}
],
"created_at": "2026-07-12T18:00:00.000Z",
"updated_at": "2026-07-12T18:00:00.000Z",
"deleted_at": null
}
],
"links": {
"first": "https://sell.app/api/v2/upsell-offers/search?page=1",
"last": "https://sell.app/api/v2/upsell-offers/search?page=1",
"prev": null,
"next": null
},
"meta": {
"current_page": 1,
"from": 1,
"last_page": 1,
"path": "https://sell.app/api/v2/upsell-offers/search",
"per_page": 15,
"to": 1,
"total": 1,
"links": [
{
"url": null,
"label": "« Previous",
"active": false
},
{
"url": "https://sell.app/api/v2/upsell-offers/search?page=1",
"label": "1",
"active": true
},
{
"url": null,
"label": "Next »",
"active": false
}
]
}
}{
"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": "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"
}Retrieve an upsell offer
Provide your SellApp API key as a bearer token.
In: header
Path Parameters
The upsellOffer 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.
Response Body
application/json
application/json
application/json
application/json
application/json
application/json
application/json
application/json
curl -X GET "https://sell.app/api/v2/upsell-offers/71" \ -H "X-STORE: launch-lab"{
"data": {
"id": 71,
"name": "One More Feature",
"description": "Offer the advanced package with additional resources.",
"is_active": true,
"source_listing_id": 120,
"source_variant_id": 880,
"minimum_order_total_usd_cents": 1000,
"maximum_order_total_usd_cents": 25000,
"starts_at": null,
"ends_at": null,
"available_for_days": 14,
"max_accepts_per_customer": 1,
"sort_order": 0,
"version": 1,
"source_product": {
"id": 120,
"title": "Zero to One More Meeting"
},
"source_variant": {
"id": 880,
"title": "Standard"
},
"items": [
{
"id": 91,
"target_listing_id": 121,
"target_variant_id": 881,
"headline": "Upgrade today",
"description": "Unlock dark mode, webhooks, and the premium launch checklist.",
"discount_type": "percentage",
"discount_value": "15.00",
"maximum_discount_amount": "25.00",
"sort_order": 0,
"target_product": {
"id": 121,
"title": "Advanced course"
},
"target_variant": {
"id": 881,
"title": "Lifetime"
},
"created_at": "2026-07-12T18:00:00.000Z",
"updated_at": "2026-07-12T18:00:00.000Z"
}
],
"created_at": "2026-07-12T18:00:00.000Z",
"updated_at": "2026-07-12T18:00:00.000Z",
"deleted_at": null
}
}{
"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"
}Update an upsell offer
Provide your SellApp API key as a bearer token.
In: header
Path Parameters
The upsellOffer 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.
Request Body
application/json
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/upsell-offers/71" \ -H "X-STORE: launch-lab" \ -H "Content-Type: application/json" \ -d '{ "name": "One More Feature 2.0", "is_active": false, "expected_version": 1 }'{
"data": {
"id": 71,
"name": "One More Feature 2.0",
"description": "Offer the advanced package with additional resources.",
"is_active": false,
"source_listing_id": 120,
"source_variant_id": 880,
"minimum_order_total_usd_cents": 1000,
"maximum_order_total_usd_cents": 25000,
"starts_at": null,
"ends_at": null,
"available_for_days": 14,
"max_accepts_per_customer": 1,
"sort_order": 0,
"version": 2,
"source_product": {
"id": 120,
"title": "Zero to One More Meeting"
},
"source_variant": {
"id": 880,
"title": "Standard"
},
"items": [
{
"id": 91,
"target_listing_id": 121,
"target_variant_id": 881,
"headline": "Upgrade today",
"description": "Unlock dark mode, webhooks, and the premium launch checklist.",
"discount_type": "percentage",
"discount_value": "15.00",
"maximum_discount_amount": "25.00",
"sort_order": 0,
"target_product": {
"id": 121,
"title": "Advanced course"
},
"target_variant": {
"id": 881,
"title": "Lifetime"
},
"created_at": "2026-07-12T18:00:00.000Z",
"updated_at": "2026-07-12T18:00:00.000Z"
}
],
"created_at": "2026-07-12T18:00:00.000Z",
"updated_at": "2026-08-30T12:00:01.000000Z",
"deleted_at": null
}
}{
"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"
}Delete an upsell offer
Provide your SellApp API key as a bearer token.
In: header
Path Parameters
The upsellOffer 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.
Response Body
application/json
application/json
application/json
application/json
application/json
application/json
application/json
application/json
curl -X DELETE "https://sell.app/api/v2/upsell-offers/71" \ -H "X-STORE: launch-lab"{
"data": {
"id": 71,
"name": "One More Feature",
"description": "Offer the advanced package with additional resources.",
"is_active": true,
"source_listing_id": 120,
"source_variant_id": 880,
"minimum_order_total_usd_cents": 1000,
"maximum_order_total_usd_cents": 25000,
"starts_at": null,
"ends_at": null,
"available_for_days": 14,
"max_accepts_per_customer": 1,
"sort_order": 0,
"version": 1,
"created_at": "2026-07-12T18:00:00.000Z",
"updated_at": "2026-08-30T12:00:01.000000Z",
"deleted_at": "2026-08-30T12:00:01.000000Z"
}
}{
"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"
}Update an upsell offer
Provide your SellApp API key as a bearer token.
In: header
Path Parameters
The upsellOffer 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.
Request Body
application/json
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 PUT "https://sell.app/api/v2/upsell-offers/71" \ -H "X-STORE: launch-lab" \ -H "Content-Type: application/json" \ -d '{ "name": "One More Feature 2.0", "is_active": false, "expected_version": 1 }'{
"data": {
"id": 71,
"name": "One More Feature 2.0",
"description": "Offer the advanced package with additional resources.",
"is_active": false,
"source_listing_id": 120,
"source_variant_id": 880,
"minimum_order_total_usd_cents": 1000,
"maximum_order_total_usd_cents": 25000,
"starts_at": null,
"ends_at": null,
"available_for_days": 14,
"max_accepts_per_customer": 1,
"sort_order": 0,
"version": 2,
"source_product": {
"id": 120,
"title": "Zero to One More Meeting"
},
"source_variant": {
"id": 880,
"title": "Standard"
},
"items": [
{
"id": 91,
"target_listing_id": 121,
"target_variant_id": 881,
"headline": "Upgrade today",
"description": "Unlock dark mode, webhooks, and the premium launch checklist.",
"discount_type": "percentage",
"discount_value": "15.00",
"maximum_discount_amount": "25.00",
"sort_order": 0,
"target_product": {
"id": 121,
"title": "Advanced course"
},
"target_variant": {
"id": 881,
"title": "Lifetime"
},
"created_at": "2026-07-12T18:00:00.000Z",
"updated_at": "2026-07-12T18:00:00.000Z"
}
],
"created_at": "2026-07-12T18:00:00.000Z",
"updated_at": "2026-08-30T12:00:01.000000Z",
"deleted_at": null
}
}{
"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"
}