Skip to main content

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​

ParameterTypeRequiredDescription
idstringYesProduct UUID

Query Parameters​

ParameterTypeRequiredDefaultDescription
includestringNo—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​

FieldTypeNullableDescription
idstringNoUnique identifier for the product (UUID)
statusstringNoProduct status ("published" or "draft")
namestringNoProduct name
descriptionstringYesProduct description
slugstringYesURL-friendly product slug
image_urlstringYesURL to the stored product image. See Product images.
checkout_urlstringNoDirect checkout URL for the product
currencystringNoISO currency code (e.g., "usd", "eur")
fileobjectYesFirst attached downloadable file (null if none). For multi-file products this reflects only the first entry of files. See File Object.
filesarrayNoAll attached downloadable files (up to 5, empty if none). Each entry is a File Object.
variantsarrayNoPublished 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_fieldsarrayYesCheckout 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_fieldsarrayYesWaitlist custom-field definitions. Always present. null unless include=waitlist_custom_fields.
stylesobjectYesCheckout appearance tokens. Always present. null unless include=styles. When requested, an object (defaults if nothing has been stored). See Styles Object.
settingsobjectYesCheckout 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.
mediaarrayYesGallery 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_idstringYesLove 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_idstringYesProduct 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.
playerobjectYesConnected 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_draftbooleanNoWhether an unpublished overlay exists. Independent of status. See Status and has_draft.

Availability Settings​

FieldTypeNullableDescription
active_fromstringYesStart selling date (ISO 8601 format)
active_untilstringYesStop selling date (ISO 8601 format)
show_active_until_counterbooleanYesShow countdown timer on checkout page

Redirect Settings​

FieldTypeNullableDescription
redirect_urlstringYesPost-purchase redirect URL
redirect_timeintegerYesRedirect delay in seconds
add_redirect_paramsbooleanYesInclude order parameters in redirect URL

Integration Settings​

FieldTypeNullableDescription
webhook_urlstringYesWebhook URL for order events
terms_urlstringYesTerms & conditions URL
policy_urlstringYesPrivacy policy URL
contact_emailstringYesProduct contact email

Checkout Options​

FieldTypeNullableDescription
refund_daysintegerYesRefund period in days (0 = no refunds)
delegablebooleanNoAllow order delegation/gifting
show_discount_fieldbooleanNoShow promo code field on checkout
hide_tax_id_fieldbooleanNoHide tax ID field on checkout
require_tax_idbooleanNoRequire tax ID on checkout
photo_zoomablebooleanNoEnable image zoom on checkout
show_confettibooleanNoShow confetti animation after purchase
generate_qr_codebooleanNoGenerate QR code for product
show_delegationbooleanNoShow the access-delegation control on checkout
delegation_labelstringYesLabel for the access-delegation control
delegable_if_multiplebooleanNoAllow delegation only when buying more than one
has_shippingbooleanNoCollect a delivery address at checkout. Distinct from delivery_enabled.
delivery_enabledbooleanNoEnable parcel delivery
delivery_servicestringYesCarrier slug when parcel delivery is enabled. See Checkout form.
delivery_address_optionalbooleanNoWhether the delivery address is optional
delivery_optionsobjectYesParcel package. See Delivery Options Object.
shipping_phone_requiredbooleanNoRequire a phone number with the delivery address
phone_tooltipstringYesHelper text for the shipping phone field
mandatory_consentstringYesLabel for the mandatory checkout consent. null turns it off.
optional_consentstringYesLabel for the optional checkout consent. null turns it off.
digital_consentstringYesLabel for the digital-content consent. null turns it off.
newsletter_consentstringYesLabel for the newsletter opt-in. null turns it off.
newsletter_consent_requiredbooleanNoWhether the newsletter opt-in is required
newsletter_discountobjectYesDiscount offered with newsletter opt-in. See Newsletter Discount Object.

Invoice, tax, portal, waitlist, and QR​

FieldTypeNullableDescription
invoice_remarksstringYesRemarks printed on invoices
vat_ratestringYesVAT rate as stored (23, zw, np). null inherits store defaults at checkout.
gtu_codeintegerYesGTU code 1–13 as stored, not a GTU_01 label
flat_ratenumberYesFlat-rate tax percent from the allowed set
exempt_tax_kindstringYesExemption basis when VAT is zw
tax_categorystringYesTax category slug. Distinct from variant tax_behavior.
dashboard_headerstringYesSelf-service portal header
long_descriptionstringYesSelf-service portal body. Distinct from description.
cta_textstringYesSelf-service portal call-to-action label
cta_urlstringYesSelf-service portal call-to-action URL
contact_phonestringYesProduct contact phone
contact_website_urlstringYesProduct contact website. Distinct from the store website_url.
contact_additional_infostringYesExtra product contact copy
footer_textstringYesCheckout footer copy. Create omit may persist as "" rather than JSON null.
waitlist_enabledbooleanNoWhether the waitlist is enabled
waitlist_require_first_namebooleanNoWhether the waitlist requires a first name
waitlist_require_last_namebooleanNoWhether the waitlist requires a last name
qr_code_infostringYesExtra text shown with the QR code
creditsintegerYesQR credits. null means credits are off, not zero. Maximum 4294967295.
reset_creditsbooleanNoWhether credits reset after use

See Invoice, tax, portal, waitlist, and QR.

File Object​

FieldTypeNullableDescription
namestringNoDisplay name shown in the customer portal (max 100 characters)
urlstringNoThe 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_urlstringYesA 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.

note

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