Create Draft
POST/api/v2/listing-drafts
Create a listing draft.
products:writeGrant this scope to your token under Settings → Developer → Personal Access Tokens.
Fields:
purpose(required,create|update) —createbuilds a new-listing draft;updateseeds a draft from an existing live listing.product_id(required if purpose=create, integer) — product to list.sales_channel_id(required if purpose=create, integer) — target channel.sales_channel_category_id(nullable, integer) — channel category driving the field schema. Omit it to have the product's channel category resolved automatically: the product's own override on this channel, else the category its product type is mapped to on the channel (that category's default template is used unlesssales_channel_product_template_idis given). A draft that still has no category records amissing_categoryvalidation error and stays indraftstate — it can never reachreadyuntil a category is set.category_provenance(nullable,override|type_map|manual) — where a suppliedsales_channel_category_idcame from, so the draft records it; pass the value returned by Resolve Draft Categories or List Product Channel Categories. A category supplied without it is recorded asmanual; a category resolved automatically records its own provenance. Echoed ascategory_provenancein the response (null when the draft has no category).sales_channel_product_template_id(nullable, integer) — template pre-mapping category fields. Optional: a draft is fully publishable without one (fill fields via overrides).sales_channel_listing_profile_id(nullable, integer) — channel listing profile.product_listing_id(required if purpose=update, integer) — live listing to seed from.
The draft is resolved + validated on creation; the response includes fields[] (schema + resolved value + provenance + raw override), resolved_values and validation_errors.
Authentication: Requires Bearer token.
variant_context — describes whether this draft targets a single VARIANT of a matrix family rather than the family itself. When is_variant_child is true, parent_sku / parent_name identify the family and sibling_count is how many variants it has. Publishing a single child is permitted, but it creates a standalone channel item with no variant group — publish the parent to list the whole family as one grouped listing. null when the draft has no product.
Each field's schema reports the channel's constraints. cardinality is the MAXIMUM number of values the field accepts (0 = unbounded) and min_cardinality is the MINIMUM (0 = none). A channel can require several entries on one field - Walmart's Cloth Baby Diapers category asks for at least 4 Key Features and 4 additional images - and rejects the item after accepting the submission, so supply at least min_cardinality values before publishing.
Refusals (422): the draft is refused, with the reason in message, when the product is outside the channel's catalog, or when the account was connected through the Shopify App Store and the channel is a marketplace (Amazon, eBay, Walmart, Temu, TikTok Shop, Faire) or the product is already listed on a different Shopify store. Update drafts (purpose: update) follow the same rules.
Request
Responses
- 201
- 401
- 403
- 422
- 429
Created
Unauthenticated — the bearer token is missing, revoked, expired, or malformed. Never retry automatically; fix the credential. See the Errors guide.
Forbidden — the token lacks a required scope, the endpoint is not available to API tokens, or the user behind the token lacks the permission. A human must adjust the token scopes or user permissions; do not retry.
Unprocessable Entity
Rate limited — platform limit is 1,000 requests/min; individual tokens may carry lower limits. Honor the Retry-After header before retrying. See the Rate Limits guide.