curl --request POST \
--url https://{host}/v1/sellers/{sellerId}/watches \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/vnd.api+json' \
--data '
{
"data": {
"type": "watches",
"attributes": {
"externalIdentifier": "PIM-10294",
"reference": "126610LN",
"name": "Submariner Date",
"description": "Full set, bought from an authorised dealer in 2023.",
"price": 1450000,
"shippingCosts": 0,
"box": true,
"papers": true,
"warranty": true,
"specifications": {
"AVAILABILITY": "READY_TO_SHIP_IN_1_3_DAYS",
"STATE": "PRE_OWNED",
"CONDITION": "VERY_GOOD",
"YEAR_OF_PRODUCTION": "2023",
"CASE_MATERIAL": "STEEL",
"DIAL": "BLACK"
},
"imageSources": [
"https://your-pim.example/images/10294-front.jpg",
"https://your-pim.example/images/10294-clasp.jpg"
]
},
"relationships": {
"watchModel": {
"data": {
"type": "watch-models",
"id": "482"
}
}
}
}
}
'{
"data": {
"type": "watches",
"id": "91827",
"attributes": {
"reference": "116610LN",
"name": "Rolex Submariner Date",
"description": "Full set, bought new in 2019 and worn sparingly.",
"translatedDescription": "Full set, bought new in 2019 and worn sparingly.",
"externalIdentifier": "PIM-10294",
"dealerProductCode": "RLX-116610LN-02",
"price": 1295000,
"shippingCosts": 0,
"priceOnRequest": false,
"applicationFee": 38850,
"box": true,
"warranty": true,
"papers": true,
"status": "available",
"reviewNote": null,
"reserved": false,
"feedManaged": false,
"minimumProposal": 1165500,
"agreedPrice": null,
"favorited": false,
"viewerOrder": null,
"webUrl": "https://wristler.eu/nl/horloges/91827-rolex-submariner-date-116610ln",
"purchasable": true,
"availabilityOnRequest": false,
"productSafety": null,
"manufacturerWarranty": null,
"referencedWatchUuid": null,
"specifications": {
"AVAILABILITY": "READY_TO_SHIP_IN_1_3_DAYS",
"STATE": "PRE_OWNED",
"CONDITION": "VERY_GOOD",
"YEAR_OF_PRODUCTION": "2019",
"CASE_MATERIAL": "STEEL"
},
"specificationLabels": {
"AVAILABILITY": {
"label": "Availability",
"value": "Ready to ship in 1-3 days"
},
"STATE": {
"label": "State",
"value": "Pre-owned"
},
"CONDITION": {
"label": "Condition",
"value": "Very good"
},
"YEAR_OF_PRODUCTION": {
"label": "Year of production",
"value": "2019"
},
"CASE_MATERIAL": {
"label": "Case material",
"value": "Steel"
}
},
"createdAt": "2026-08-04T08:21:00.000000Z",
"updatedAt": "2026-09-19T12:02:11.000000Z"
},
"relationships": {
"seller": {
"links": {
"related": "https://api.wristler.eu/v1/sellers/42/watches/91827/seller"
}
},
"images": {
"links": {
"related": "https://api.wristler.eu/v1/sellers/42/watches/91827/images",
"self": "https://api.wristler.eu/v1/sellers/42/watches/91827/relationships/images"
}
},
"watchModel": {
"links": {
"related": "https://api.wristler.eu/v1/sellers/42/watches/91827/watch-model"
}
}
},
"links": {
"self": "https://api.wristler.eu/v1/sellers/42/watches/91827"
}
}
}{
"errors": [
{
"status": "404",
"code": "watch_reserved",
"title": "Not Found",
"detail": "<string>",
"meta": {},
"source": {
"pointer": "/data/attributes/reference",
"parameter": "<string>"
}
}
],
"jsonapi": {
"version": "1.0"
}
}{
"errors": [
{
"status": "404",
"code": "watch_reserved",
"title": "Not Found",
"detail": "<string>",
"meta": {},
"source": {
"pointer": "/data/attributes/reference",
"parameter": "<string>"
}
}
],
"jsonapi": {
"version": "1.0"
}
}{
"errors": [
{
"status": "404",
"code": "watch_reserved",
"title": "Not Found",
"detail": "<string>",
"meta": {},
"source": {
"pointer": "/data/attributes/reference",
"parameter": "<string>"
}
}
],
"jsonapi": {
"version": "1.0"
}
}Create listing
Scope: watches:write
The business comes from the address, so there is no need to name it in the body. If you do, it has to be the same one.
Do not send data.id — we mint it, and a client-generated one is refused with
403. Your own identifier goes in externalIdentifier, which is what you look
the listing up by afterwards.
watchModel is required: the id of one of GET /v1/watch-models, which you
can narrow by filter[brand] and search with filter[q].
Photographs: either imageSources (URLs we fetch, for images you already
host) or imageHandles (handles from POST /v1/uploads, for files you are
holding). Not both — each replaces the gallery whole. Up to 8.
duplicateOf starts from a listing you already have: its specifications,
its gallery and everything it says about the watch are copied, and whatever the
body carries is laid over the top. The copy is a draft with its own
identifier cleared — what it says about the watch is right, what it says about
this one has not been looked at yet. A shop that sells the same reference twice
a month should not fill in the same twelve fields twice a month.
A new listing never starts live. Leave status out or send available and it
goes into review (awaiting_review), the same as one added in the dashboard — so it
needs at least one photo (imageHandles or imageSources) and a price of at least
€ 1,000 (or priceOnRequest: true), or the create is a 422 on status. Send draft
and it stays a draft only the business can see, with or without them. Anything else
is refused. With duplicateOf the copy is a draft unless you send available; sent
as available, it is judged on the gallery and price it takes from its source unless
the body sends others.
| Refusal | Status | code |
|---|---|---|
Into review without a photo or a price (source.pointer is /data/attributes/status) | 422 | — |
duplicateOf is not a listing of this business | 422 | no_such_listing |
| The body names another business than the address | 422 | seller_mismatch |
externalIdentifier already used in this inventory, or any other field rule | 422 | — (source.pointer names the field) |
A read-only attribute sent: images, reserved, reviewNote, translatedDescription, descriptionTranslations, applicationFee, feedManaged, minimumProposal, agreedPrice, favorited, viewerOrder, webUrl, purchasable, availabilityOnRequest, productSafety, manufacturerWarranty, specificationLabels, createdAt or updatedAt | 403 | read_only_field |
curl --request POST \
--url https://{host}/v1/sellers/{sellerId}/watches \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/vnd.api+json' \
--data '
{
"data": {
"type": "watches",
"attributes": {
"externalIdentifier": "PIM-10294",
"reference": "126610LN",
"name": "Submariner Date",
"description": "Full set, bought from an authorised dealer in 2023.",
"price": 1450000,
"shippingCosts": 0,
"box": true,
"papers": true,
"warranty": true,
"specifications": {
"AVAILABILITY": "READY_TO_SHIP_IN_1_3_DAYS",
"STATE": "PRE_OWNED",
"CONDITION": "VERY_GOOD",
"YEAR_OF_PRODUCTION": "2023",
"CASE_MATERIAL": "STEEL",
"DIAL": "BLACK"
},
"imageSources": [
"https://your-pim.example/images/10294-front.jpg",
"https://your-pim.example/images/10294-clasp.jpg"
]
},
"relationships": {
"watchModel": {
"data": {
"type": "watch-models",
"id": "482"
}
}
}
}
}
'{
"data": {
"type": "watches",
"id": "91827",
"attributes": {
"reference": "116610LN",
"name": "Rolex Submariner Date",
"description": "Full set, bought new in 2019 and worn sparingly.",
"translatedDescription": "Full set, bought new in 2019 and worn sparingly.",
"externalIdentifier": "PIM-10294",
"dealerProductCode": "RLX-116610LN-02",
"price": 1295000,
"shippingCosts": 0,
"priceOnRequest": false,
"applicationFee": 38850,
"box": true,
"warranty": true,
"papers": true,
"status": "available",
"reviewNote": null,
"reserved": false,
"feedManaged": false,
"minimumProposal": 1165500,
"agreedPrice": null,
"favorited": false,
"viewerOrder": null,
"webUrl": "https://wristler.eu/nl/horloges/91827-rolex-submariner-date-116610ln",
"purchasable": true,
"availabilityOnRequest": false,
"productSafety": null,
"manufacturerWarranty": null,
"referencedWatchUuid": null,
"specifications": {
"AVAILABILITY": "READY_TO_SHIP_IN_1_3_DAYS",
"STATE": "PRE_OWNED",
"CONDITION": "VERY_GOOD",
"YEAR_OF_PRODUCTION": "2019",
"CASE_MATERIAL": "STEEL"
},
"specificationLabels": {
"AVAILABILITY": {
"label": "Availability",
"value": "Ready to ship in 1-3 days"
},
"STATE": {
"label": "State",
"value": "Pre-owned"
},
"CONDITION": {
"label": "Condition",
"value": "Very good"
},
"YEAR_OF_PRODUCTION": {
"label": "Year of production",
"value": "2019"
},
"CASE_MATERIAL": {
"label": "Case material",
"value": "Steel"
}
},
"createdAt": "2026-08-04T08:21:00.000000Z",
"updatedAt": "2026-09-19T12:02:11.000000Z"
},
"relationships": {
"seller": {
"links": {
"related": "https://api.wristler.eu/v1/sellers/42/watches/91827/seller"
}
},
"images": {
"links": {
"related": "https://api.wristler.eu/v1/sellers/42/watches/91827/images",
"self": "https://api.wristler.eu/v1/sellers/42/watches/91827/relationships/images"
}
},
"watchModel": {
"links": {
"related": "https://api.wristler.eu/v1/sellers/42/watches/91827/watch-model"
}
}
},
"links": {
"self": "https://api.wristler.eu/v1/sellers/42/watches/91827"
}
}
}{
"errors": [
{
"status": "404",
"code": "watch_reserved",
"title": "Not Found",
"detail": "<string>",
"meta": {},
"source": {
"pointer": "/data/attributes/reference",
"parameter": "<string>"
}
}
],
"jsonapi": {
"version": "1.0"
}
}{
"errors": [
{
"status": "404",
"code": "watch_reserved",
"title": "Not Found",
"detail": "<string>",
"meta": {},
"source": {
"pointer": "/data/attributes/reference",
"parameter": "<string>"
}
}
],
"jsonapi": {
"version": "1.0"
}
}{
"errors": [
{
"status": "404",
"code": "watch_reserved",
"title": "Not Found",
"detail": "<string>",
"meta": {},
"source": {
"pointer": "/data/attributes/reference",
"parameter": "<string>"
}
}
],
"jsonapi": {
"version": "1.0"
}
}Authorizations
Headers
Optional. A UUID per logical operation, not per attempt: a retry carrying the same key gets the first attempt's answer back, headers and all, rather than performing the write twice. Honoured for 24 hours.
A refusal is an answer. A 422 is remembered like any other, so sending a
corrected body under the same key answers 422 idempotency_key_reuse rather
than accepting the correction — the point of a key is that one key means one
decision. Use a new key for a new attempt at the request, and keep the old one
only for retrying the same bytes after a timeout.
A 5xx is the exception: nothing was decided, so the key is released and the
same one may be retried.
| Refusal | Status | code |
|---|---|---|
| The same key with a different body | 422 | idempotency_key_reuse |
| The first request with this key is still running | 409 | idempotency_in_progress |
| The key's record vanished between two requests: retry with a new key | 409 | idempotency_conflict |
| A key longer than 191 characters | 400 | idempotency_key_invalid |
A replayed answer carries Idempotent-Replay: true.
191