API ReferenceProducts

Create a product

Create a product, then add a variant before offering it at checkout.

Create a product in the selected store. Your key needs the listing ability. The same product rules apply as in the dashboard. Success returns 201 Created.

Note

Uploading an image? Use multipart/form-data. If you are creating the product without an image, JSON works too.

Create at least one variant before making the product available for checkout. See Create a product variant.

POST
/v2/products

Authorization

bearerAuth storeAuth
AuthorizationBearer <token>

Provide your SellApp API key as a bearer token.

In: header

X-STORE<token>

Select the SellApp store for this API request.

In: header

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

curl -X POST "https://sell.app/api/v2/products" \  -H "Content-Type: application/json" \  -d '{    "title": "Founder memo circle",    "description": "A monthly collection of annotated operating memos.",    "visibility": "HIDDEN"  }'
{
  "data": {
    "id": 120,
    "title": "Founder memo circle",
    "slug": "founder-memo-circle",
    "description": "A monthly collection of annotated operating memos.",
    "images": [],
    "order": 1,
    "visibility": "HIDDEN",
    "delivery_text": "",
    "additional_information": [],
    "other_settings": {
      "faq": [],
      "video_url": "",
      "redirect_url": "",
      "product_title": "",
      "product_description": ""
    },
    "deleted_at": null,
    "created_at": "2026-08-30T12:00:01.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": [],
    "url": "https://launch-lab.sell.app/product/founder-memo-circle"
  }
}
{
  "type": "authentication_error",
  "code": "unauthenticated",
  "message": "Unauthenticated.",
  "status": 401,
  "param": null,
  "request_id": "01992a65-e064-71ba-b38f-902b7966a6be",
  "docs_url": "https://sell.app/docs/api/errors#unauthenticated"
}
{
  "type": "authorization_error",
  "code": "forbidden",
  "message": "This action is unauthorized.",
  "status": 403,
  "param": null,
  "request_id": "01992a65-e064-71ba-b38f-902b7966a6be",
  "docs_url": "https://sell.app/docs/api/errors#forbidden"
}
{
  "type": "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"
}