Get Product
Retrieve a specific product from your store. This is the live product. For the unpublished overlay, see Get Product Draft.
Request
GET /products/{id}
Path Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
id | string | Yes | Product UUID |
Query Parameters
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
include | string | No | — | Comma-separated tokens. custom_fields and waitlist_custom_fields expand checkout / waitlist field definitions — see Custom Fields. styles, settings, and media expand checkout appearance — see Checkout appearance. Those keys stay null when omitted. wall_id, footer_id, and player return Easytools attachments and can be mixed with the tokens above — see Easytools attachments. Those three keys are omitted unless named. Unknown tokens are ignored. |
Example Request
curl -X GET "https://cart.easy.tools/api/v1/products/0632bef5-c308-42cd-9cba-89a7a4f722bb" \
-H "Authorization: Bearer YOUR_API_TOKEN"
Expand checkout appearance:
curl -X GET "https://cart.easy.tools/api/v1/products/0632bef5-c308-42cd-9cba-89a7a4f722bb?include=styles,settings,media" \
-H "Authorization: Bearer YOUR_API_TOKEN"
Expand checkout and waitlist custom fields:
curl -X GET "https://cart.easy.tools/api/v1/products/0632bef5-c308-42cd-9cba-89a7a4f722bb?include=custom_fields,waitlist_custom_fields" \
-H "Authorization: Bearer YOUR_API_TOKEN"
Read the Love wall, legal footer, and connected courses:
curl -X GET "https://cart.easy.tools/api/v1/products/0632bef5-c308-42cd-9cba-89a7a4f722bb?include=wall_id,footer_id,player" \
-H "Authorization: Bearer YOUR_API_TOKEN"
Response
Success Response (200)
Returns a single product with its variants.
{
"id": "0632bef5-c308-42cd-9cba-89a7a4f722bb",
"status": "published",
"name": "Premium Coffee Beans",
"description": "High-quality arabica coffee beans from Colombia",
"slug": "premium-coffee-beans",
"image_url": "https://example.com/images/coffee-beans.jpg",
"checkout_url": "https://cart.easy.tools/checkout/0632bef5-c308-42cd-9cba-89a7a4f722bb",
"currency": "usd",
"file": {
"name": "My ebook.pdf",
"url": "https://mysite.com/ebook.pdf",
"download_url": "https://cart.easy.tools/api/v1/product-files/9c1e7f42-3b8a-4d6e-9f10-2a5c7d3e8b41/download?expires=1749384000&signature=abc123"
},
"files": [
{
"name": "My ebook.pdf",
"url": "https://mysite.com/ebook.pdf",
"download_url": "https://cart.easy.tools/api/v1/product-files/9c1e7f42-3b8a-4d6e-9f10-2a5c7d3e8b41/download?expires=1749384000&signature=abc123"
},
{
"name": "Bonus chapter.pdf",
"url": "https://mysite.com/bonus-chapter.pdf",
"download_url": "https://cart.easy.tools/api/v1/product-files/4f7a2d18-6c93-4e5b-8a21-0d9e3f6b7c52/download?expires=1749384000&signature=abc123"
}
],
"active_from": "2026-01-01T00:00:00+00:00",
"active_until": "2026-12-31T23:59:59+00:00",
"show_active_until_counter": true,
"redirect_url": "https://mysite.com/thank-you",
"redirect_time": 5,
"add_redirect_params": true,
"webhook_url": "https://mysite.com/webhook",
"terms_url": "https://mysite.com/terms",
"policy_url": "https://mysite.com/privacy",
"contact_email": "support@mysite.com",
"refund_days": 14,
"delegable": false,
"show_discount_field": true,
"hide_tax_id_field": false,
"require_tax_id": false,
"photo_zoomable": true,
"show_confetti": true,
"generate_qr_code": false,
"show_delegation": false,
"delegation_label": null,
"delegable_if_multiple": false,
"has_shipping": false,
"delivery_enabled": false,
"delivery_service": null,
"delivery_address_optional": true,
"delivery_options": null,
"shipping_phone_required": false,
"phone_tooltip": null,
"mandatory_consent": null,
"optional_consent": null,
"digital_consent": null,
"newsletter_consent": null,
"newsletter_consent_required": false,
"newsletter_discount": null,
"invoice_remarks": null,
"vat_rate": null,
"gtu_code": null,
"flat_rate": null,
"exempt_tax_kind": null,
"tax_category": null,
"dashboard_header": null,
"long_description": null,
"cta_text": null,
"cta_url": null,
"contact_phone": null,
"contact_website_url": null,
"contact_additional_info": null,
"footer_text": "",
"waitlist_enabled": false,
"waitlist_require_first_name": false,
"waitlist_require_last_name": false,
"qr_code_info": null,
"credits": null,
"reset_credits": false,
"variants": [
{
"id": "d91c65aa-b221-4aa4-b626-cf0d8a198749",
"status": "published",
"type": "one_time",
"recurring_options": null,
"name": "250g Package",
"amount": 1999,
"currency": "usd",
"checkout_url": "https://cart.easy.tools/checkout/premium-coffee?plan=price_123",
"custom_id": "SKU-250G",
"is_hidden": false,
"trial_period_days": null,
"active_cycles": null,
"cancel_early": false,
"keep_access_after_expiring": false,
"allow_multiple_subscriptions": false,
"active_days": 365,
"quantity": 100,
"has_quantity": true,
"old_price": 29,
"active_from": "2026-01-01T00:00:00+00:00",
"active_until": "2026-12-31T23:59:59+00:00",
"access_until": null,
"show_active_until_counter": true,
"tax_behavior": "exclusive",
"refund_days": 14,
"redirect_url": "https://mysite.com/thank-you",
"redirect_time": 5,
"file": {
"name": "Product Guide.pdf",
"url": "https://mysite.com/files/guide.pdf",
"download_url": "https://cart.easy.tools/api/v1/product-files/b8d4e6a2-51c7-4f39-9e0b-3a7c2d18f5e6/download?expires=1749384000&signature=abc123"
},
"files": [
{
"name": "Product Guide.pdf",
"url": "https://mysite.com/files/guide.pdf",
"download_url": "https://cart.easy.tools/api/v1/product-files/b8d4e6a2-51c7-4f39-9e0b-3a7c2d18f5e6/download?expires=1749384000&signature=abc123"
},
{
"name": "Quick Start.pdf",
"url": "https://mysite.com/files/quick-start.pdf",
"download_url": "https://cart.easy.tools/api/v1/product-files/2e9b5c71-8d40-4a6f-b312-7f5a9c04d8e3/download?expires=1749384000&signature=abc123"
}
],
"invoice_remarks": "Thank you for your purchase!",
"has_shipping": false,
"delivery_enabled": false,
"delivery_service": null,
"delivery_address_optional": true,
"delivery_options": null,
"shipping_phone_required": false,
"phone_tooltip": null,
"mandatory_consent": null,
"optional_consent": null,
"digital_consent": null,
"newsletter_consent": null,
"newsletter_consent_required": false,
"newsletter_discount": null,
"vat_rate": null,
"gtu_code": null,
"flat_rate": null,
"exempt_tax_kind": null,
"tax_category": null,
"dashboard_header": null,
"long_description": null,
"cta_text": null,
"cta_url": null,
"credits": null,
"show_net_price": false,
"pay_what_you_want": null,
"purchase_button_text": null,
"upsells": [],
"custom_fields": null
},
{
"id": "e903c6d6-163e-4080-a99a-4ee5a1e4f17a",
"status": "published",
"type": "recurring",
"recurring_options": {
"interval": "month",
"interval_count": 1
},
"name": "Monthly Subscription - 250g",
"amount": 1799,
"currency": "usd",
"checkout_url": null,
"custom_id": null,
"is_hidden": false,
"trial_period_days": 14,
"active_cycles": 12,
"cancel_early": true,
"keep_access_after_expiring": false,
"allow_multiple_subscriptions": false,
"active_days": null,
"quantity": null,
"has_quantity": false,
"old_price": null,
"active_from": null,
"active_until": null,
"access_until": null,
"show_active_until_counter": null,
"tax_behavior": "exclusive",
"refund_days": null,
"redirect_url": null,
"redirect_time": null,
"file": null,
"files": [],
"invoice_remarks": null,
"has_shipping": false,
"delivery_enabled": false,
"delivery_service": null,
"delivery_address_optional": true,
"delivery_options": null,
"shipping_phone_required": false,
"phone_tooltip": null,
"mandatory_consent": null,
"optional_consent": null,
"digital_consent": null,
"newsletter_consent": null,
"newsletter_consent_required": false,
"newsletter_discount": null,
"vat_rate": null,
"gtu_code": null,
"flat_rate": null,
"exempt_tax_kind": null,
"tax_category": null,
"dashboard_header": null,
"long_description": null,
"cta_text": null,
"cta_url": null,
"credits": null,
"show_net_price": false,
"pay_what_you_want": null,
"purchase_button_text": null,
"upsells": [],
"custom_fields": null
}
],
"custom_fields": null,
"waitlist_custom_fields": null,
"styles": null,
"settings": null,
"media": null,
"has_draft": false
}
When include=styles,settings,media is sent, those keys are objects / an array
instead of null:
{
"styles": {
"brand_color": "#111827",
"main_background_color": "#f9fafb",
"background_color": "#fcfcfd",
"text_color": "#111828",
"card_background_color": "#ffffff",
"card_text_color": "#111828",
"border_color": "#d0d5dd",
"main_border_color": "transparent",
"price_text_color": "#111828",
"shadow_color": "#111827",
"border_radius": 12,
"shadow_opacity": 3,
"darkmode_enabled": false,
"branding_theme_id": null
},
"settings": {
"logo_url": null,
"logo_square_url": null,
"show_logo": true,
"thank_you": {
"heading": null,
"text": null,
"button_text": null,
"button_url": null
},
"waitlist_thank_you": {
"heading": null,
"text": null,
"show_confetti": false,
"redirect_url": null,
"redirect_time": null,
"add_redirect_params": true,
"button_text": null,
"button_url": null
},
"confirmation_email": {
"heading": null,
"content": null
},
"checkout_recovery": {
"enabled": null,
"coupon": null
}
},
"media": [
{
"file_url": "https://cdn.example.com/products/7f3a1c2e-9b4d-4e8a-a1c6-2d5e8f0b3a19.webp",
"type": "image",
"thumbnail_url": null
}
]
}
See Styles Object, Settings Object, and Media Item Object.
include=wall_id,footer_id,player adds those keys. They are absent from the
body above.
{
"wall_id": "8c2e1a40-6f5b-4d83-a917-3b0e6c4d2f18",
"footer_id": "5d9a7c31-2e84-4b16-8f0a-6c3d1e9b4a27",
"player": {
"redirect_id": "a4e8c1d2-7b39-4f6a-9c05-1e2d8b4a6f70",
"player_ids": [
"a4e8c1d2-7b39-4f6a-9c05-1e2d8b4a6f70"
]
}
}
wall_id or footer_id is null when that token was sent and nothing is
attached. player is null when nothing is connected and there is no
thank-you redirect. A field that cannot be resolved is
{ "message": "The Easytools attachment could not be resolved." } and this
GET stays 200. See Easytools attachments
and Player Object.
Response Fields
Core Fields
| Field | Type | Nullable | Description |
|---|---|---|---|
id | string | No | Unique identifier for the product (UUID) |
status | string | No | Product status ("published" or "draft") |
name | string | No | Product name |
description | string | Yes | Product description |
slug | string | Yes | URL-friendly product slug |
image_url | string | Yes | URL to the stored product image. See Product images. |
checkout_url | string | No | Direct checkout URL for the product |
currency | string | No | ISO currency code (e.g., "usd", "eur") |
file | object | Yes | First attached downloadable file (null if none). For multi-file products this reflects only the first entry of files. See File Object. |
files | array | No | All attached downloadable files (up to 5, empty if none). Each entry is a File Object. |
variants | array | No | Published variants (status: published). Archived variants are omitted. Each item is the full product variant object, including always-present upsells ([] when none) and custom_fields: null (expand that key on the variant GET, not here). Overlay-only variants appear on Get Product Draft. |
custom_fields | array | Yes | Checkout custom-field definitions. Always present. null unless include=custom_fields. When requested, the stored array (possibly empty) — not the { items, pagination } envelope. See Custom Fields. |
waitlist_custom_fields | array | Yes | Waitlist custom-field definitions. Always present. null unless include=waitlist_custom_fields. |
styles | object | Yes | Checkout appearance tokens. Always present. null unless include=styles. When requested, an object (defaults if nothing has been stored). See Styles Object. |
settings | object | Yes | Checkout logos, thank-you, confirmation email, and recovery. Always present. null unless include=settings. When requested, an object (defaults if nothing has been stored). See Settings Object. |
media | array | Yes | Gallery membership in display order. Always present. null unless include=media. When requested, a bare array (possibly empty) — not { items, pagination }. Cover remains image_url. See Media Item Object. |
wall_id | string | Yes | Love wall UUID. Omitted unless include=wall_id. null when that token is set and nothing is attached. A failed lookup is { "message": "The Easytools attachment could not be resolved." } and the product stays 200. See Easytools attachments. |
footer_id | string | Yes | Product legal footer UUID. Omitted unless include=footer_id. null when that token is set and nothing is attached. The same failure object, and the product stays 200. |
player | object | Yes | Connected courses. Omitted unless include=player. null when that token is set, nothing is connected, and there is no thank-you redirect. Otherwise a Player Object, or the same failure object when any course or redirect lookup fails. disconnect is not returned. |
has_draft | boolean | No | Whether an unpublished overlay exists. Independent of status. See Status and has_draft. |
Availability Settings
| Field | Type | Nullable | Description |
|---|---|---|---|
active_from | string | Yes | Start selling date (ISO 8601 format) |
active_until | string | Yes | Stop selling date (ISO 8601 format) |
show_active_until_counter | boolean | Yes | Show countdown timer on checkout page |
Redirect Settings
| Field | Type | Nullable | Description |
|---|---|---|---|
redirect_url | string | Yes | Post-purchase redirect URL |
redirect_time | integer | Yes | Redirect delay in seconds |
add_redirect_params | boolean | Yes | Include order parameters in redirect URL |
Integration Settings
| Field | Type | Nullable | Description |
|---|---|---|---|
webhook_url | string | Yes | Webhook URL for order events |
terms_url | string | Yes | Terms & conditions URL |
policy_url | string | Yes | Privacy policy URL |
contact_email | string | Yes | Product contact email |
Checkout Options
| Field | Type | Nullable | Description |
|---|---|---|---|
refund_days | integer | Yes | Refund period in days (0 = no refunds) |
delegable | boolean | No | Allow order delegation/gifting |
show_discount_field | boolean | No | Show promo code field on checkout |
hide_tax_id_field | boolean | No | Hide tax ID field on checkout |
require_tax_id | boolean | No | Require tax ID on checkout |
photo_zoomable | boolean | No | Enable image zoom on checkout |
show_confetti | boolean | No | Show confetti animation after purchase |
generate_qr_code | boolean | No | Generate QR code for product |
show_delegation | boolean | No | Show the access-delegation control on checkout |
delegation_label | string | Yes | Label for the access-delegation control |
delegable_if_multiple | boolean | No | Allow delegation only when buying more than one |
has_shipping | boolean | No | Collect a delivery address at checkout. Distinct from delivery_enabled. |
delivery_enabled | boolean | No | Enable parcel delivery |
delivery_service | string | Yes | Carrier slug when parcel delivery is enabled. See Checkout form. |
delivery_address_optional | boolean | No | Whether the delivery address is optional |
delivery_options | object | Yes | Parcel package. See Delivery Options Object. |
shipping_phone_required | boolean | No | Require a phone number with the delivery address |
phone_tooltip | string | Yes | Helper text for the shipping phone field |
mandatory_consent | string | Yes | Label for the mandatory checkout consent. null turns it off. |
optional_consent | string | Yes | Label for the optional checkout consent. null turns it off. |
digital_consent | string | Yes | Label for the digital-content consent. null turns it off. |
newsletter_consent | string | Yes | Label for the newsletter opt-in. null turns it off. |
newsletter_consent_required | boolean | No | Whether the newsletter opt-in is required |
newsletter_discount | object | Yes | Discount offered with newsletter opt-in. See Newsletter Discount Object. |
Invoice, tax, portal, waitlist, and QR
| Field | Type | Nullable | Description |
|---|---|---|---|
invoice_remarks | string | Yes | Remarks printed on invoices |
vat_rate | string | Yes | VAT rate as stored (23, zw, np). null inherits store defaults at checkout. |
gtu_code | integer | Yes | GTU code 1–13 as stored, not a GTU_01 label |
flat_rate | number | Yes | Flat-rate tax percent from the allowed set |
exempt_tax_kind | string | Yes | Exemption basis when VAT is zw |
tax_category | string | Yes | Tax category slug. Distinct from variant tax_behavior. |
dashboard_header | string | Yes | Self-service portal header |
long_description | string | Yes | Self-service portal body. Distinct from description. |
cta_text | string | Yes | Self-service portal call-to-action label |
cta_url | string | Yes | Self-service portal call-to-action URL |
contact_phone | string | Yes | Product contact phone |
contact_website_url | string | Yes | Product contact website. Distinct from the store website_url. |
contact_additional_info | string | Yes | Extra product contact copy |
footer_text | string | Yes | Checkout footer copy. Create omit may persist as "" rather than JSON null. |
waitlist_enabled | boolean | No | Whether the waitlist is enabled |
waitlist_require_first_name | boolean | No | Whether the waitlist requires a first name |
waitlist_require_last_name | boolean | No | Whether the waitlist requires a last name |
qr_code_info | string | Yes | Extra text shown with the QR code |
credits | integer | Yes | QR credits. null means credits are off, not zero. Maximum 4294967295. |
reset_credits | boolean | No | Whether credits reset after use |
See Invoice, tax, portal, waitlist, and QR.
File Object
| Field | Type | Nullable | Description |
|---|---|---|---|
name | string | No | Display name shown in the customer portal (max 100 characters) |
url | string | No | The file's stored location, and the value to send back when writing files. A file uploaded to your store is not publicly readable at this URL — follow download_url for the contents. A file attached by link carries that URL exactly as it was provided. |
download_url | string | Yes | A temporary signed link to download the file. It needs no Authorization header and expires about an hour after the read. null on a file that exists only on an unpublished overlay — see Downloadable files. |
Read download_url — not url — to fetch a file's contents, and request the product
again for a fresh link rather than storing it. See
Downloadable files.
The singular file field is kept for backward compatibility and always mirrors the first entry of files. For products with multiple downloadable files, read files to get the complete list.
Error Responses
Bad Request (400)
{
"message": "Invalid product ID"
}
Not Found Error (404)
Returned when the UUID does not exist, belongs to another store, or points at an archived
product. Only draft and published products can be retrieved.
{
"message": "Product with ID 0632bef5-c308-42cd-9cba-89a7a4f722bb not found"
}