Products

Products are objects containing variants. When a customer purchases a product, they are sent the respetive deliverable(s) that product's variant contains.

One product can have many variants, each of which have their own price, product deliverable, and pricing.

On this page, we'll dive into the different product endpoints you can use to manage products - and product variants - programmatically. We'll look at how to create, update, and delete products.

The product model

The product model contains all the information about the products stores have, including the price, media, and customization options.

Properties

  • Name
    id
    Type
    integer
    Description

    The unique product identifier

  • Name
    title
    Type
    string
    Description

    The product title.

  • Name
    slug
    Type
    string
    Description

    The unique product slug.

  • Name
    description
    Type
    string
    Description

    The product description.

  • Name
    images
    Type
    object
    Description

    The array of product images, displays the following information:

    • path image path
    • metadata array of image metadata
      • size size in bytes
      • filename file name
      • extension file extension
      • mime_type file mime type
  • Name
    order
    Type
    integer
    Description

    The order of the product relative to all other products in your storefront.

  • Name
    visibility
    Type
    string
    Description

    The product visibility. One of four values:

    • PUBLIC Product can be visited and purchased.
    • ON_HOLD Product can be visited but not be purchased.
    • HIDDEN Product can be only visited via direct link and purchased.
    • PRIVATE Product cannot be visited nor purchased.
  • Name
    delivery_text
    Type
    string
    Description

    The product delivery text, shown to customers in addition to the variant deliverables. Useful as a thank you note or offering a discount.

  • Name
    additional_information
    Type
    array
    Description

    The additional information input(s) of the product. The field supports 16 field types organized into the following categories:

    Text Input Fields:

    • text - Single-line text input
    • number - Numeric input with validation
    • email - Email address with RFC 5321 validation
    • phone - Phone number with country selector and E.164 formatting
    • currency - Currency amount with currency selector
    • link - Website URL with validation
    • textarea - Multi-line text input

    Selection Fields:

    • select - Dropdown selection (single or multiple)
    • radio - Radio button group with visual variants
    • checkbox-group - Multiple checkbox selection with visual variants
    • pillbox - Tag-style multi-select with removable pills

    Boolean Fields:

    • checkbox - Single yes/no checkbox
    • switch - Toggle switch (on/off)

    Date Fields:

    • date - Single date picker with constraints
    • date-range - Date range selector with validation

    Special:

    • hidden - Hidden field not visible to customer

    Each additional_information field supports the following properties:

    Required Properties (all field types):

    • type (string) - Field type from the list above
    • label (string) - Display label (2-100 characters, must be unique)
    • required (boolean) - Whether the field is mandatory for checkout

    Optional Properties:

    • key (string) - Custom identifier for invoice data (2-100 chars, letters/underscores only). Auto-generated from label if omitted
    • placeholder (string) - Placeholder text for applicable field types (2-255 characters)
    • description (string) - Help text displayed below the field (2-255 characters)
    • options (array) - Available options for selection fields (required for select, radio, checkbox-group, pillbox)
    • variant (string) - Visual style variant for selection fields and switch
    • date_options (object) - Date-specific configuration for date and date-range fields
  • Name
    other_settings
    Type
    array
    Description

    Customization settings of the product, with the following options:

    • faq Object containing an array of frequently asked questions to be displayed on the product page. Consists of:
      • question FAQ question.
      • answer FAQ answer.
    • video_url URL of a product video, will be displayed on the product page. Supported services: YouTube, Vimeo, Dailymotion, Slideshare, Miro
    • redirect_url URL you want to redirect your customers to after a successful purchase. The redirect URL can utilize the following dynamic values:
      • [order_id] ID of the order
      • [customer_email] email of the customer who placed the order
    • product_title Meta title tag of the product, will appear in search engines and social media.
    • product_description Meta description tag of the product, will appear in search engines and social media.
  • Name
    deleted_at
    Type
    timestamp
    Description

    The time at which this product was deleted.

  • Name
    created_at
    Type
    timestamp
    Description

    The time at which this product was first created.

  • Name
    updated_at
    Type
    timestamp
    Description

    The time at which this product was last updated.

  • Name
    store_id
    Type
    integer
    Description

    The ID of the store this product belongs to.

  • Name
    category_id
    Type
    integer
    Description

    The ID of the category this product belongs to.

  • Name
    section_id
    Type
    integer
    Description

    The ID of the section this product belongs to.

  • Name
    section_order
    Type
    integer
    Description

    The order of the product within the section.

  • Name
    is_discoverable
    Type
    integer
    Description

    Whether the product can be discovered. One of two values:

    • 1 It can be discovered.
    • 0 It cannot be discovered.
  • Name
    variants
    Type
    object
    Description

    Variants object containing a number of variant arrays. Variant arrays consist of:

    • id Variant ID
    • title Variant title
  • Name
    url
    Type
    string
    Description

    Displays the full product URL, including storefront domain.

Field Type Details

Text Input Fields

text

Single-line text input with optional placeholder.

Supported properties: placeholder, description Max length: 255 characters

Example:

{
  "type": "text",
  "label": "In-Game Username",
  "required": true,
  "placeholder": "Enter your username",
  "description": "Must match your game account"
}

number

Numeric input with range validation.

Supported properties: placeholder, description Range: -9,007,199,254,740,991 to 9,007,199,254,740,991

Example:

{
  "type": "number",
  "label": "Quantity",
  "required": true,
  "placeholder": "0"
}

email

Email input.

Supported properties: placeholder, description Max length: 255 characters

Example:

{
  "type": "email",
  "label": "Recovery Email",
  "required": false,
  "placeholder": "user@example.com",
  "description": "For account recovery"
}

phone

Phone number input with country selector.

Supported properties: description Max length: 25 characters Format: Automatically normalized to E.164 (+1234567890)

Example:

{
  "type": "phone",
  "label": "Mobile Number",
  "required": true,
  "description": "For SMS delivery notifications"
}

currency

Currency amount with currency selector.

Supported properties: description Format: Stores amount in minor units (cents) with currency code

Example:

{
  "type": "currency",
  "label": "Budget",
  "required": true,
  "description": "Your maximum budget"
}

link

URL input with validation. Automatically prepends https:// if missing.

Supported properties: placeholder, description Max length: 2048 characters

Example:

{
  "type": "link",
  "label": "Portfolio Website",
  "required": false,
  "placeholder": "https://example.com"
}

textarea

Multi-line text input.

Supported properties: placeholder, description Max length: 2048 characters

Example:

{
  "type": "textarea",
  "label": "Special Instructions",
  "required": false,
  "placeholder": "Enter any special requirements...",
  "description": "Tell us about customization needs"
}

Selection Fields

Selection fields require an options array and support two formats:

Simple format (string array):

"options": ["Option A", "Option B", "Option C"]

Enhanced format (objects with metadata): Only supported for radio, checkbox-group, and switch (fieldset variant).

"options": [
{
"label": "Basic Plan",
"value": "basic",
"description": "Perfect for individuals"
},
{
"label": "Pro Plan",
"value": "pro",
"description": "Designed for teams"
}
]

Enhanced option properties:

  • label (required) - Display text (1-100 characters)
  • value (optional) - Stored value (defaults to label if omitted)
  • description (optional) - Helper text (max 255 characters, only displays in compatible variants)

select

Dropdown selection field.

Supported properties: placeholder, description, variant, options (required) Options format: String array only

Variants:

  • single (default) - Single selection
  • multiple - Multiple selection

Example:

{
  "type": "select",
  "label": "Preferred Region",
  "required": true,
  "variant": "single",
  "options": [
    "North America",
    "Europe",
    "Asia"
  ],
  "placeholder": "Select your region..."
}

radio

Radio button group for single selection.

Supported properties: description, variant (required), options (required) Options format: String array or enhanced objects (for default and cards variants)

Variants:

  • default - Standard radio buttons (supports descriptions)
  • cards - Card-style options (supports descriptions)
  • row - Inline horizontal layout
  • pills - Pill-shaped options
  • buttons - Button-style options
  • segmented - Segmented control

Example with enhanced options:

{
  "type": "radio",
  "label": "Subscription Plan",
  "required": true,
  "variant": "cards",
  "options": [
    {
      "label": "Starter",
      "value": "starter",
      "description": "$9/month - For individuals"
    },
    {
      "label": "Pro",
      "value": "pro",
      "description": "$29/month - For teams"
    }
  ]
}

checkbox-group

Checkbox group for multiple selections.

Supported properties: description, variant (required), options (required) Options format: String array or enhanced objects (for default and cards variants)

Variants:

  • default - Standard checkboxes (supports descriptions)
  • cards - Card-style checkboxes (supports descriptions)
  • fieldset - Horizontal inline group
  • pills - Pill-shaped checkboxes
  • buttons - Button-style checkboxes

Example:

{
  "type": "checkbox-group",
  "label": "Add-on Services",
  "required": false,
  "variant": "default",
  "options": [
    "Gift Wrapping",
    "Express Shipping",
    "Insurance"
  ]
}

pillbox

Multi-select with removable pill-shaped tags.

Supported properties: placeholder, description, options (required) Options format: String array only

Example:

{
  "type": "pillbox",
  "label": "Programming Languages",
  "required": true,
  "options": [
    "JavaScript",
    "Python",
    "Java",
    "Go"
  ],
  "placeholder": "Choose languages..."
}

Boolean Fields

checkbox

Single yes/no checkbox.

Supported properties: description

Example:

{
  "type": "checkbox",
  "label": "I agree to the Terms of Service",
  "required": true,
  "description": "You must accept to proceed"
}

switch

Toggle switch (on/off).

Supported properties: description, variant (required) Options: Only required for fieldset variant (supports enhanced format)

Variants:

  • single - Single on/off toggle
  • fieldset - Multiple switches in a group (requires options)

Important: Switch fields are typically not required because they represent on/off states where "off" (false) is a valid value. While you can technically set required: true, it rarely makes semantic sense for a toggle.

Example - Single:

{
  "type": "switch",
  "label": "Enable Notifications",
  "required": false,
  "variant": "single"
}

Example - Fieldset:

{
  "type": "switch",
  "label": "Privacy Settings",
  "required": false,
  "variant": "fieldset",
  "options": [
    {
      "label": "Profile Visibility",
      "value": "profile_public",
      "description": "Make profile public"
    },
    {
      "label": "Activity Feed",
      "value": "show_activity",
      "description": "Display recent activity"
    }
  ]
}

Date Fields

Date fields support advanced configuration via the date_options object:

Common date_options properties:

  • min_date (string) - Minimum date: "today" or "YYYY-MM-DD"
  • max_date (string) - Maximum date: "today" or "YYYY-MM-DD"
  • start_day (integer) - First day of week (0=Sunday, 1=Monday, ..., 6=Saturday, default: 1)
  • clearable (boolean) - Show clear button (default: false)
  • week_numbers (boolean) - Display week numbers (default: false)
  • selectable_header (boolean) - Clickable month/year header (default: false)

Additional properties for date-range:

  • min_range (integer) - Minimum range in days (≥1)
  • max_range (integer) - Maximum range in days (≥1)
  • with_presets (boolean) - Show preset buttons (default: false)
  • with_inputs (boolean) - Show date inputs (default: false)
  • presets (string) - Space-separated preset list

Available presets: today, yesterday, thisWeek, lastWeek, last7Days, last14Days, last30Days, thisMonth, lastMonth, last3Months, last6Months, thisQuarter, lastQuarter, thisYear, lastYear, yearToDate


date

Single date picker.

Supported properties: placeholder, description, date_options

Example:

{
  "type": "date",
  "label": "Delivery Date",
  "required": true,
  "placeholder": "Select a date...",
  "date_options": {
    "min_date": "today",
    "max_date": "2025-12-31",
    "start_day": 1,
    "clearable": true
  }
}

date-range

Date range picker.

Supported properties: placeholder, description, date_options

Example:

{
  "type": "date-range",
  "label": "Rental Period",
  "required": true,
  "placeholder": "Select rental period...",
  "description": "Minimum 3 days, maximum 30 days",
  "date_options": {
    "min_date": "today",
    "max_date": "2026-06-30",
    "min_range": 3,
    "max_range": 30,
    "start_day": 1,
    "clearable": true,
    "with_presets": true,
    "presets": "last7Days last14Days last30Days thisMonth"
  }
}

Special Fields

hidden

Hidden field not visible to customers.

Supported properties: None Note: Still requires a label for internal identification.

Example:

{
  "type": "hidden",
  "label": "Campaign Source",
  "required": false,
  "key": "utm_source"
}

Validation Rules

Field-Level Validation

  • type - Must be a valid field type from the supported list
  • label - Required, 2-100 characters, must be unique, cannot use reserved names
  • required - Required, must be boolean
  • key - Optional, 2-100 characters, letters and underscores only, must be unique
  • placeholder - Optional, 2-255 characters (only for supported field types)
  • description - Optional, 2-255 characters (only for supported field types)
  • options - Required for select, radio, checkbox-group, pillbox. Required for switch with fieldset variant
  • variant - Required for select, radio, checkbox-group, switch. Must be valid variant for the field type

Reserved Field Labels

These labels are reserved and cannot be used:

  • purchase_quantity
  • customer_email
  • payment_method
  • extra

Options Validation

String options:

  • Each option: 1-100 characters

Enhanced options (objects):

  • label - Required, 1-100 characters
  • value - Optional, 1-100 characters (defaults to label)
  • description - Optional, max 255 characters

Date Options Validation

  • min_date / max_date - Must be "today" or valid YYYY-MM-DD format
  • min_date must be ≤ max_date when both are specific dates
  • start_day - Integer 0-6
  • min_range / max_range - Positive integers ≥1
  • min_range must be ≤ max_range
  • Boolean options must be true or false
  • presets - Space-separated string of valid preset values

GET/v2/products

List all products

This endpoint allows you to retrieve a paginated list of all your products. By default, a maximum of fifteen products are shown per page.

Optional attributes

  • Name
    limit
    Type
    integer
    Description

    Limit the number of products returned

  • Name
    page
    Type
    integer
    Description

    The page number you are attempting to access.

  • Name
    with_trashed
    Type
    boolean
    Description

    Include deleted products in the results

  • Name
    only_trashed
    Type
    boolean
    Description

    Limit the results to only deleted products

Request

GET
/v2/products
$client = new http\Client;
$request = new http\Client\Request;

$request->setRequestUrl('https://sell.app/api/v2/products');
$request->setRequestMethod('GET');
$request->setHeaders([
  'accept' => 'application/json',
  'Authorization' => 'Bearer {ApiKeyHere}'
]);

$client->enqueue($request)->send();
$response = $client->getResponse();

echo $response->getBody();

Response

{
  "data": [
    {
      "id": 1,
      "title": "Elixir of immortality",
      "slug": "elixir-of-immortality",
      "description": "<p>Want to live forever? Buy this now and I'll send a digital elixir that converts your soul into an NFT that will roam the internet for eternity!<\/p>",
      "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": "PUBLIC",
      "delivery_text": "Thanks again bud!",
      "additional_information": [
        {
          "required": true,
          "key": "3aecffd000e00e2211e94558007ffc37",
          "type": "checkbox",
          "label": "Do you agree to handing your soul over?"
        }
      ],
      "other_settings": {
        "faq": [
          {
            "answer": "Yes, trust me!",
            "question": "Will I really live forever?"
          }
        ],
        "video_url": "https:\/\/www.youtube.com\/watch?v=dQw4w9WgXcQ",
        "redirect_url": "https:\/\/666.com\/transfer-soul?customer_email=[customer_email]&order_id=[order_id]",
        "product_title": "The real elixir of immortality",
        "product_description": "Live forever, online."
      },
      "deleted_at": null,
      "created_at": "2024-01-09T22:56:49.000000Z",
      "updated_at": "2024-01-10T10:00:28.000000Z",
      "store_id": 1,
      "category_id": null,
      "section_id": null,
      "section_order": null,
      "is_discoverable": 1,
      "variants": [
        {
          "id": 1,
          "title": "Default"
        }
      ],
      "url": "https:\/\/example.sell.app\/product\/elixir-of-immortality"
    }
  ],
  "links": {
    // ...
  },
  "meta": {
    // ...
  }
}

POST/v2/products

Create a product

Programmatically create a product using the following endpoint. See the code examples for how to create a new product with the SellApp API.

Required attributes

  • Name
    title
    Type
    string
    Description

    The product title.

  • Name
    description
    Type
    string
    Description

    The product description.

  • Name
    visibility
    Type
    string
    Description

    The product visibility. One of four values:

    • PUBLIC Product can be visited and purchased.
    • ON_HOLD Product can be visited but not be purchased.
    • HIDDEN Product can be only visited via direct link and purchased.
    • PRIVATE Product cannot be visited or purchased.

Optional attributes

  • Name
    additional_information
    Type
    array
    Description

    The additional information input(s) of the product. The field supports 16 field types organized into categories for text input, selection, boolean, date, and special fields. Refer to the Field Type Details section below for examples.

    Text Input Fields: text, number, email, phone, currency, link, textarea

    Selection Fields: select, radio, checkbox-group, pillbox

    Boolean Fields: checkbox, switch

    Date Fields: date, date-range

    Special: hidden

    Required Properties (all field types):

    • type (string) - Field type from the list above
    • label (string) - Display label (2-100 characters, must be unique)
    • required (boolean) - Whether the field is mandatory for checkout

    Optional Properties:

    • key (string) - Custom identifier for invoice data (2-100 chars, letters/underscores only). Auto-generated from label if omitted
    • placeholder (string) - Placeholder text for applicable field types (2-255 characters)
    • description (string) - Help text displayed below the field (2-255 characters)
    • options (array) - Available options for selection fields (required for select, radio, checkbox-group, pillbox)
    • variant (string) - Visual style variant for selection fields and switch
    • date_options (object) - Date-specific configuration for date and date-range fields
  • Name
    images
    Type
    object
    Description

    The image(s) displaying the product.

  • Name
    other_settings
    Type
    array
    Description

    Customization settings of the product, with the following options:

    • redirect_url URL you want to redirect your customers to after a successful purchase. The redirect URL can utilize the following dynamic values:
      • [order_id] ID of the order
      • [customer_email] email of the customer who placed the order
    • video_url URL of a product video, will be displayed on product page. Supported services: YouTube, Vimeo, Dailymotion, Slideshare, Miro
    • product_title Meta title element of the product, will appear in search engines and social media.
    • product_description Meta description element of the product, will appear in search engines and social media.
    • faq Array of frequently asked questions to be displayed on the product page. Consists of:
      • question FAQ question.
      • answer FAQ answer.

Request

POST
/v2/products
$client = new http\Client;
$request = new http\Client\Request;

$body = new http\Message\Body;
$body->addForm([
  'title' => 'Immortality Elixir',
  'description' => 'Want to live forever? Buy this now and I'll send a digital elixir that converts your soul into an NFT that will roam the internet for eternity!',
  'visibility' => 'PUBLIC',
  'delivery_text' => 'Thanks for purchasing! Here is a 20% off coupon for your next purchase: 20FREE24',
  'additional_information[0][type]' => 'checkbox',
  'additional_information[0][required]' => '1',
  'additional_information[0][label]' => 'I agree to handing over my soul',
  'additional_information[1][type]' => 'email',
  'additional_information[1][required]' => '1',
  'additional_information[1][label]' => 'Soul Transfer Email',
  'additional_information[1][placeholder]' => 'your.soul@example.com',
  'additional_information[1][description]' => 'We will send your digital elixir here',
  'other_settings[redirect_url]' => 'https://666.com/transfer-soul?customer_email=[customer_email]&order_id=[order_id]',
  'other_settings[video_url]' => 'https://www.youtube.com/watch?v=dQw4w9WgXcQ',
  'other_settings[product_title]' => 'The real elixir of immortality',
  'other_settings[product_description]' => 'Live forever, online.',
  'other_settings[faq][0][question]' => 'Will I really live forever?',
  'other_settings[faq][0][answer]' => 'Yes, trust me!'
], [
  [
    'name' => 'images[]',
    'type' => null,
    'file' => 'path\\to\\image.png',
    'data' => null
  ]
]);

$request->setRequestUrl('https://sell.app/api/v2/products');
$request->setRequestMethod('POST');
$request->setBody($body);

$request->setHeaders([
  'Authorization' => 'Bearer {ApiKeyHere}'
]);

$client->enqueue($request)->send();
$response = $client->getResponse();

echo $response->getBody();

Response

{
  "data": {
    "id": 2,
    "title": "Immortality Elixir",
    "slug": "immortality-elixir",
    "description": "Want to live forever? Buy this now and I'll send a digital elixir that converts your soul into an NFT that will roam the internet for eternity!",
    "images": [
      {
        "path": "store\/1\/listings\/qXZHzR15vs09zbfn3yui5jO6QK0IbQP4M6QVydUn.png",
        "metadata": {
          "size": 39289,
          "filename": "qXZHzR15vs09zbfn3yui5jO6QK0IbQP4M6QVydUn",
          "extension": "png",
          "mime_type": "image\/png"
        }
      }
    ],
    "order": 2,
    "visibility": "PUBLIC",
    "delivery_text": "Thanks for purchasing! Here is a 20% off coupon for your next purchase: 20FREE24",
    "additional_information": [
      {
        "required": true,
        "key": "5ebae238c0afae7f4a4b96b30ff6f34c",
        "type": "checkbox",
        "label": "I agree to handing over my soul"
      },
      {
        "required": true,
        "key": "soul_transfer_email",
        "type": "email",
        "label": "Soul Transfer Email",
        "placeholder": "your.soul@example.com",
        "description": "We will send your digital elixir here"
      }
    ],
    "other_settings": {
      "faq": [
        {
          "answer": "Yes, trust me!",
          "question": "Will I really live forever?"
        }
      ],
      "video_url": "https:\/\/www.youtube.com\/watch?v=dQw4w9WgXcQ",
      "redirect_url": "https:\/\/666.com\/transfer-soul?customer_email=[customer_email]&order_id=[order_id]",
      "product_title": "The real elixir of immortality",
      "product_description": "Live forever, online."
    },
    "deleted_at": null,
    "created_at": "2024-01-10T12:16:10.000000Z",
    "updated_at": "2024-01-10T12:16:10.000000Z",
    "store_id": 1,
    "category_id": null,
    "section_id": null,
    "section_order": null,
    "is_discoverable": 1,
    "variants": [],
    "url": "https:\/\/example.sell.app\/product\/immortality-elixir"
  }
}

GET/v2/products/:id

Retrieve a product

This endpoint allows you to retrieve a specific product by providing the unique identifier. Refer to the list at the top of this page to see which properties are included with product objects.

Request

GET
/v2/products/:id
$client = new http\Client;
$request = new http\Client\Request;

$request->setRequestUrl('https://sell.app/api/v2/products/1');
$request->setRequestMethod('GET');
$request->setHeaders([
  'accept' => 'application/json',
  'Authorization' => 'Bearer {ApiKeyHere}'
]);

$client->enqueue($request)->send();
$response = $client->getResponse();

echo $response->getBody();

Response

{
  "data": [
    {
      "id": 1,
      "title": "Elixir of immortality",
      "slug": "elixir-of-immortality",
      "description": "<p>Want to live forever? Buy this now and I'll send a digital elixir that converts your soul into an NFT that will roam the internet for eternity!<\/p>",
      "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": "PUBLIC",
      "delivery_text": "Thanks again bud!",
      "additional_information": [
        {
          "required": true,
          "key": "3aecffd000e00e2211e94558007ffc37",
          "type": "checkbox",
          "label": "Do you agree to handing your soul over?"
        }
      ],
      "other_settings": {
        "faq": [
          {
            "answer": "Yes, trust me!",
            "question": "Will I really live forever?"
          }
        ],
        "video_url": "https:\/\/www.youtube.com\/watch?v=dQw4w9WgXcQ",
        "redirect_url": "https:\/\/666.com\/transfer-soul?customer_email=[customer_email]&order_id=[order_id]",
        "product_title": "The real elixir of immortality",
        "product_description": "Live forever, online."
      },
      "deleted_at": null,
      "created_at": "2024-01-09T22:56:49.000000Z",
      "updated_at": "2024-01-10T10:00:28.000000Z",
      "store_id": 1,
      "category_id": null,
      "section_id": null,
      "section_order": null,
      "is_discoverable": 1,
      "variants": [
        {
          "id": 1,
          "title": "Default"
        }
      ],
      "url": "https:\/\/example.sell.app\/product\/elixir-of-immortality"
    }
  ],
  "links": {
    // ...
  },
  "meta": {
    // ...
  }
}

PATCH/v2/products/:id

Update a product

Update a product's details with the following endpoint.

Optional attributes

  • Name
    title
    Type
    string
    Description

    The product title.

  • Name
    description
    Type
    string
    Description

    The product description.

  • Name
    visibility
    Type
    string
    Description

    The product visibility. One of four values:

    • PUBLIC Product can be visited and purchased.
    • ON_HOLD Product can be visited but not be purchased.
    • HIDDEN Product can be only visited via direct link and purchased.
    • PRIVATE Product cannot be visited or purchased.
  • Name
    additional_information
    Type
    array
    Description

    The additional information input(s) of the product. The field supports 16 field types organized into categories for text input, selection, boolean, date, and special fields. Refer to the Field Type Details section below for examples.

    Text Input Fields: text, number, email, phone, currency, link, textarea

    Selection Fields: select, radio, checkbox-group, pillbox

    Boolean Fields: checkbox, switch

    Date Fields: date, date-range

    Special: hidden

    Required Properties (all field types):

    • type (string) - Field type from the list above
    • label (string) - Display label (2-100 characters, must be unique)
    • required (boolean) - Whether the field is mandatory for checkout

    Optional Properties:

    • key (string) - Custom identifier for invoice data (2-100 chars, letters/underscores only). Auto-generated from label if omitted
    • placeholder (string) - Placeholder text for applicable field types (2-255 characters)
    • description (string) - Help text displayed below the field (2-255 characters)
    • options (array) - Available options for selection fields (required for select, radio, checkbox-group, pillbox)
    • variant (string) - Visual style variant for selection fields and switch
    • date_options (object) - Date-specific configuration for date and date-range fields
  • Name
    images
    Type
    object
    Description

    The image(s) displaying the product.

  • Name
    other_settings
    Type
    array
    Description

    Customization settings of the product, with the following options:

    • redirect_url URL you want to redirect your customers to after a successful purchase. The redirect URL can utilize the following dynamic values:
      • [order_id] ID of the order
      • [customer_email] email of the customer who placed the order
    • video_url URL of a product video, will be displayed on product page. Supported services: YouTube, Vimeo, Dailymotion, Slideshare, Miro
    • product_title Meta title element of the product, will appear in search engines and social media.
    • product_description Meta description element of the product, will appear in search engines and social media.
    • faq Array of frequently asked questions to be displayed on the product page. Consists of:
      • question FAQ question.
      • answer FAQ answer.

Request

PATCH
/v2/products/:id
$client = new http\Client;
$request = new http\Client\Request;

$body = new http\Message\Body;
$body->append('{
  "description": "Updated Description"
}');

$request->setRequestUrl('https://sell.app/api/v2/products/2');
$request->setRequestMethod('PATCH');
$request->setBody($body);

$request->setHeaders([
  'content-type' => 'application/json',
  'Accept' => 'text/json',
  'Authorization' => 'Bearer {ApiKeyHere}'
]);

$client->enqueue($request)->send();
$response = $client->getResponse();

echo $response->getBody();

Response

{
  "data": {
    "id": 2,
    "title": "Immortality Elixir",
    "slug": "immortality-elixir",
    "description": "Updated Description",
    "images": [
      {
        "path": "store\/1\/listings\/qXZHzR15vs09zbfn3yui5jO6QK0IbQP4M6QVydUn.png",
        "metadata": {
          "size": 39289,
          "filename": "qXZHzR15vs09zbfn3yui5jO6QK0IbQP4M6QVydUn",
          "extension": "png",
          "mime_type": "image\/png"
        }
      }
    ],
    "order": 2,
    "visibility": "PUBLIC",
    "delivery_text": "Thanks for purchasing! Here is a 20% off coupon for your next purchase: 20FREE24",
    "additional_information": [
      {
        "required": true,
        "key": "5ebae238c0afae7f4a4b96b30ff6f34c",
        "type": "checkbox",
        "label": "I agree to handing over my soul"
      }
    ],
    "other_settings": {
      "faq": [
        {
          "answer": "Yes, trust me!",
          "question": "Will I really live forever?"
        }
      ],
      "video_url": "https:\/\/www.youtube.com\/watch?v=dQw4w9WgXcQ",
      "redirect_url": "https:\/\/666.com\/transfer-soul?customer_email=[customer_email]&order_id=[order_id]",
      "product_title": "The real elixir of immortality",
      "product_description": "Live forever, online."
    },
    "deleted_at": null,
    "created_at": "2024-01-10T12:16:10.000000Z",
    "updated_at": "2024-01-10T12:16:10.000000Z",
    "store_id": 1,
    "category_id": null,
    "section_id": null,
    "section_order": null,
    "is_discoverable": 1,
    "variants": [],
    "url": "https:\/\/example.sell.app\/product\/immortality-elixir"
  }
}

DELETE/v2/products/:id

Delete a product

This endpoint allows you to delete a product.

Request

DELETE
/v2/products/:id
$client = new http\Client;
$request = new http\Client\Request;

$request->setRequestUrl('https://sell.app/api/v2/products/2');
$request->setRequestMethod('DELETE');
$request->setHeaders([
  'accept' => 'application/json',
  'Authorization' => 'Bearer {ApiKeyHere}'
]);

$client->enqueue($request)->send();
$response = $client->getResponse();

echo $response->getBody();