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
| Parameter | Type | Required | Description |
|---|---|---|---|
id | string | Yes | Product UUID |
Request Body
| Parameter | Type | Required | Description |
|---|---|---|---|
draft_version | integer | Yes | Current 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:
| Field | Type | Nullable | Description |
|---|---|---|---|
draft_version | integer | No | New overlay version after this write. Send it on the next draft write. |
draft_updated_at | string | No | When the overlay was last saved (ISO 8601) — the time of this write. Never null here, because a successful write always leaves an overlay. |
preview_url | string | No | Temporary 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."
]
}
}