Skip to main content

Update Product Draft

Sparse-update the unpublished overlay for a product. Buyers still see the live product returned by Get Product.

draft_version is required, including the write that creates the first overlay. Read it from Get Product Draft. The same field allowlist as Update Product applies — status and currency are not accepted. Checkout appearance is not on this body — use Update Product Styles (/draft/styles), Update Product Settings (/draft/settings), and Update Product Media (/draft/media). Sending styles, settings, or media here is ignored. Checkout and waitlist field definitions are nested — see Custom Fields. Sending custom_fields or waitlist_custom_fields here is ignored. Checkout order bumps are nested — see Order Bumps. Sending order_bumps here is ignored. After-purchase cross-sells are nested — see Cross-sells. Sending cross_sells here is ignored.

A successful write returns has_draft: true, a new draft_version, and a fresh preview_url — see Draft preview.

Request​

PATCH /products/{id}/draft

Path Parameters​

ParameterTypeRequiredDescription
idstringYesProduct UUID

Request Body​

ParameterTypeRequiredDescription
draft_versionintegerYesCurrent overlay version from Get Product Draft. Minimum 1. A mismatch returns 409.

All other fields are optional and match Update Product. Only include the fields you want to change.

wall_id and footer_id are stored on the draft and wait until Publish Product. player is stored on the draft and does not connect or disconnect the course until publish. Publish applies only the course connects and disconnects this draft asked for. A draft that did not send player changes no courses. A course connect whose course was deleted is skipped. The thank-you redirect is stored on the draft until publish. A redirect to a course that is not connected yet reads back as null, which is not a failed write. Only Publish Product applies these course changes. Discard Product Draft, Unpublish Product, and publishing the draft from the dashboard drop them and do not change the live connected courses. None of wall_id, footer_id, or player are returned on this response. Read them on Get Product Draft with include.

Example Request​

curl -X PATCH "https://cart.easy.tools/api/v1/products/0632bef5-c308-42cd-9cba-89a7a4f722bb/draft" \
-H "Authorization: Bearer YOUR_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"draft_version": 7,
"name": "Premium Coffee Beans - winter"
}'

Set a mandatory checkout consent on the overlay — live checkout is unchanged until publish:

curl -X PATCH "https://cart.easy.tools/api/v1/products/0632bef5-c308-42cd-9cba-89a7a4f722bb/draft" \
-H "Authorization: Bearer YOUR_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"draft_version": 8,
"mandatory_consent": "I agree to the terms of sale"
}'

Set invoice remarks and footer copy on the overlay — live checkout is unchanged until publish:

curl -X PATCH "https://cart.easy.tools/api/v1/products/0632bef5-c308-42cd-9cba-89a7a4f722bb/draft" \
-H "Authorization: Bearer YOUR_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"draft_version": 9,
"invoice_remarks": "Thank you for your purchase!",
"footer_text": "Thanks for buying"
}'

Connect a course and make it the thank-you redirect when the draft is published. redirect is omitted, so it defaults to true:

curl -X PATCH "https://cart.easy.tools/api/v1/products/0632bef5-c308-42cd-9cba-89a7a4f722bb/draft" \
-H "Authorization: Bearer YOUR_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"draft_version": 10,
"player": {
"id": "a4e8c1d2-7b39-4f6a-9c05-1e2d8b4a6f70"
}
}'

Response​

Success Response (200)​

Returns the overlay. Shared product fields match Get Product Draft.

{
"id": "0632bef5-c308-42cd-9cba-89a7a4f722bb",
"status": "published",
"name": "Premium Coffee Beans - winter",
"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": true,
"draft_version": 8,
"draft_updated_at": "2026-09-10T14:09:08+00:00",
"preview_url": "https://cart.easy.tools/checkout-preview/0632bef5-c308-42cd-9cba-89a7a4f722bb?expires=1749384000&signature=abc123"
}

checkout_url is still the live checkout.

Response Fields​

Shared fields — including has_draft — are listed on Get Product. Draft reads add:

FieldTypeNullableDescription
draft_versionintegerNoNew overlay version after this write. Send it on the next draft write.
draft_updated_atstringNoWhen the overlay was last saved (ISO 8601) — the time of this write. Never null here, because a successful write always leaves an overlay.
preview_urlstringNoTemporary signed checkout preview. Always reminted. Expires after about one hour. Distinct from live checkout_url. See Draft preview.

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.

{
"message": "Product with ID 0632bef5-c308-42cd-9cba-89a7a4f722bb not found"
}

Conflict Error (409 — Stale Draft Version)​

Returned when draft_version does not match the current overlay version. GET the draft and retry with the current draft_version.

{
"message": "The draft was edited elsewhere. GET the draft and retry with the current draft_version."
}

Validation Error (422 Unprocessable Entity)​

Returned when draft_version is missing or the body fails the same field rules as Update Product. Easytools unavailable returns 502. An account not connected to Easytools returns 422 with Account is not connected to Easytools and no errors key. The draft is not saved. See Update Product.

{
"message": "The given data was invalid.",
"errors": {
"draft_version": [
"This field is required."
]
}
}