The duplicate is the body id, else the channel identity (externalId: the variant id order lines carry for a simple product, the channel product id for a product with variants), else the SKU of a simple product. onDuplicate (default update) decides: 201 created, 200 updated, unchanged or skipped, 409 duplicate. A new product never takes a SKU another product holds (409). Variants not named survive unless overwriteVariants (default false). Unknown fields are refused (400).
Scope: products:write, channel:write or admin.
Idempotency: send Idempotency-Key; a retry with the same key replays the first answer.
Rate limit: write class, 1,200 requests per minute per tenant by default (read class 6,000). Every response carries X-RateLimit-Limit, X-RateLimit-Remaining and X-RateLimit-Reset; a refusal is 429 rate_limited with Retry-After.
