API ReferenceProducts

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

For a complete workflow, see Sell a product.

Additional endpoint reference

Update a product

PUT
/v2/products/{product}

Authorization

AuthorizationBearer <token>

Provide your SellApp API key as a bearer token.

In: header

Path Parameters

product*integer

The product path parameter.

Header Parameters

X-STORE?string

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

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

GET
/v2/bundles/{bundle}/items/{item}

Authorization

AuthorizationBearer <token>

Provide your SellApp API key as a bearer token.

In: header

Path Parameters

bundle*integer

The bundle path parameter.

item*integer

The item path parameter.

Header Parameters

X-STORE?string

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

GET
/v2/bundles/{bundle}/items

Authorization

AuthorizationBearer <token>

Provide your SellApp API key as a bearer token.

In: header

Path Parameters

bundle*integer

The bundle path parameter.

Query Parameters

limit?integer

Number of items to return per page.

Default15
Range1 <= value <= 100
page?integer

Page number to return.

Default1
Range1 <= value

Header Parameters

X-STORE?string

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": "&laquo; Previous",
        "active": false
      },
      {
        "url": "https://sell.app/api/v2/bundles/1/items?page=1",
        "label": "1",
        "active": true
      },
      {
        "url": null,
        "label": "Next &raquo;",
        "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

POST
/v2/bundles/{bundle}/items/attach

Authorization

AuthorizationBearer <token>

Provide your SellApp API key as a bearer token.

In: header

Path Parameters

bundle*integer

The bundle path parameter.

Header Parameters

X-STORE?string

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

DELETE
/v2/bundles/{bundle}/items/detach

Authorization

AuthorizationBearer <token>

Provide your SellApp API key as a bearer token.

In: header

Path Parameters

bundle*integer

The bundle path parameter.

Header Parameters

X-STORE?string

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.

resources*array<integer>

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

GET
/v2/upsell-offers

Authorization

AuthorizationBearer <token>

Provide your SellApp API key as a bearer token.

In: header

Query Parameters

limit?integer

Number of items to return per page.

Default15
Range1 <= value <= 100
page?integer

Page number to return.

Default1
Range1 <= value
pagination?boolean

Set to false to return at most 100 matching items in one data array without pagination links or metadata.

Defaulttrue

Header Parameters

X-STORE?string

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": "&laquo; Previous",
        "active": false
      },
      {
        "url": "https://sell.app/api/v2/upsell-offers?page=1",
        "label": "1",
        "active": true
      },
      {
        "url": null,
        "label": "Next &raquo;",
        "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

POST
/v2/upsell-offers

Authorization

AuthorizationBearer <token>

Provide your SellApp API key as a bearer token.

In: header

Header Parameters

X-STORE?string

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

POST
/v2/upsell-offers/search

Authorization

AuthorizationBearer <token>

Provide your SellApp API key as a bearer token.

In: header

Query Parameters

limit?integer

Number of items to return per page.

Default15
Range1 <= value <= 100
page?integer

Page number to return.

Default1
Range1 <= value
pagination?boolean

Set to false to return at most 100 matching items in one data array without pagination links or metadata.

Defaulttrue

Header Parameters

X-STORE?string

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": "&laquo; Previous",
        "active": false
      },
      {
        "url": "https://sell.app/api/v2/upsell-offers/search?page=1",
        "label": "1",
        "active": true
      },
      {
        "url": null,
        "label": "Next &raquo;",
        "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

GET
/v2/upsell-offers/{upsellOffer}

Authorization

AuthorizationBearer <token>

Provide your SellApp API key as a bearer token.

In: header

Path Parameters

upsellOffer*integer

The upsellOffer path parameter.

Header Parameters

X-STORE?string

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

PATCH
/v2/upsell-offers/{upsellOffer}

Authorization

AuthorizationBearer <token>

Provide your SellApp API key as a bearer token.

In: header

Path Parameters

upsellOffer*integer

The upsellOffer path parameter.

Header Parameters

X-STORE?string

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

DELETE
/v2/upsell-offers/{upsellOffer}

Authorization

AuthorizationBearer <token>

Provide your SellApp API key as a bearer token.

In: header

Path Parameters

upsellOffer*integer

The upsellOffer path parameter.

Header Parameters

X-STORE?string

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

PUT
/v2/upsell-offers/{upsellOffer}

Authorization

AuthorizationBearer <token>

Provide your SellApp API key as a bearer token.

In: header

Path Parameters

upsellOffer*integer

The upsellOffer path parameter.

Header Parameters

X-STORE?string

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"
}

On this page