ASYNC
Admission outcomes
POST, PATCH, PUT and DELETE on /product-listings/async take the same entries, maxItems 100. HTTP 202 means at least one entry was confirmed admitted, or the batch was empty; admitted entries are then processed for you, with nothing to poll. The report is { submissionId, acceptedCount, failures }: acceptedCount plus failures equals the entries sent, and each failure has index, error, retryable and, when safe to echo, sourceListingId. With nothing admitted: 503 for unconfirmed, retryable or blocked sends; otherwise 500 for internal failures; 413 when only size failed; otherwise 400. Listing existence, auctions and provider authority are checked during processing.
ASYNC
Idempotency and retries
Send one Idempotency-Key header: 1–128 visible ASCII characters, no comma. Without one, a key is generated and echoed on the report; if that response is lost, the key cannot be recovered. After a lost or uncertain response, resend the exact batch, unchanged and in the same order, with the same key, rejected entries included. retryable marks failures where that resend is appropriate (ENQUEUE_UNCONFIRMED may already be queued); validation and size errors are not retryable. Correct invalid entries in a new request with a new key, leaving out admitted and uncertain ones. submissionId is for correlation only. To look at listings yourself, use GET on /product-listings; delegated tokens also need product-listings:read.
SYNC
Completed-write outcomes
POST, PATCH, PUT and DELETE on /product-listings: maxItems 100; [] returns HTTP 200 with []. Each entry runs in its own transaction. On partial success, HTTP 200 returns only failures as { listingSourceId, sourceListingId, error }. If every non-empty entry fails, the first failure becomes an application/problem+json response. Do not replay successful entries.
POST
Create fields and prices
POST requires sourceListingId, url and images; include localized title and description when available (the current contract allows omission or null). Seller and address fields are not supported. Availability is nullable. Asking price is { type: MONETARY, currency: EUR, amount: 420000 } in minor currency units, or { type: ON_REQUEST }; null records no price.
PATCH
Preserve or clear
Omitted members preserve existing facts. null clears title, description, availability, price and each price estimate. url: null, images: null and auction: null are invalid (400 BAD_BODY_VALUE). images: [] clears images. The complete batch contract is validated before entry transactions begin.
PUT
Upsert semantics
For existing listings, omit title, description, availability or prices to preserve, send null to clear or a value to set. Omit images to preserve, [] to clear, or an array to replace; null is invalid. Omit url or send null to preserve; a URL replaces it. New listings require sourceListingId, url and images; omitted/null title, description, availability and prices record no value.
AUCTION
Auction membership and lot timing
Omit auction to preserve its context; auction: null is invalid. Within auction, auctionId must identify an existing auction for the same provider: omit to preserve membership, null to clear, an ID to set. For lotNumber, cataloguePosition and each timing leaf (biddingOpens, scheduledCloses, reportedClosedAt), omit to preserve, null to clear, or supply a value to set. Timing values are RFC3339 instants.
DELETE
Batch withdrawal and restoration
DELETE takes an array of { sourceListingId } on either path. It withdraws listings, which is reversible, and preserves their history; PUT restores a withdrawn listing before applying current facts. Read the outcome by your mode: the admission report for asynchronous, failed entries for synchronous.