WatchTraderHub to Chrono24 XML feed: field mapping reference

Prepared for the Chrono24 import team.

This document lists every element and every value the WatchTraderHub (WTH) feed can send, so the feed can be mapped to your import schema without opening a single sample file. Every value list in it is checked against the feed code by an automated build check, so the document and the feed cannot drift apart.

How to read this

We built our inventory fields against your dealer listing form, so for nearly every dropdown we already send your exact label as a plain string, for example Yellow gold, Sapphire crystal or 10 ATM. Those need no translation.

Three fields are not labels and are spelled out below: condition is an integer, original_box and original_papers are yes/no flags, and year_is_approximate is a yes flag that only ever appears next to a year.

Where a table says a field is omitted when the value is off-list, it means the value we hold is not on the list printed underneath that table: a colour or a material typed free-hand into an older record, or carried in by a spreadsheet import before we offered a dropdown for it. We leave the element out rather than send the raw text, because every one of these is a closed dropdown on your side and a string outside the list is discarded on import anyway.

Where a section header says a value is our proposal, it means your published import schema has no element for it and we picked a name. Tell us what you would rather receive and we will change it.

Element names in this feed are the ones your import team already mapped when the feed went live. We have deliberately not renamed anything to match your XML template, because that would break the existing mapping. A few of our names differ from the template on purpose: we send glass where the template says crystal, clasp where it says clasp_type, bracelet_width where it says lug_width, and other where it says other_attributes.

Fetching the feed

Detail Value
Method GET
URL https://www.watchtraderhub.com/api/feeds/chrono24/{configuration-id}
Authentication HTTP Basic
Response content type application/xml; charset=utf-8
Caching Cache-Control: private, no-store, so every request is generated fresh

The configuration id is a UUID. Each dealer generates their own URL, username and password in WatchTraderHub and sends all three to you; the password is a random string we hash on our side and cannot recover, so a dealer who has lost it regenerates rather than looks it up.

A wrong or missing credential returns 401 with a WWW-Authenticate: Basic header. Every request, successful or not, is logged and shown to the dealer, which is how they confirm the import is running.

The response is one articles root element containing zero or more article elements. Watches and accessories arrive in the same document and are told apart by the type element inside basic_information:

Watch, Accessory

An article is only present while the dealer has it published, listed on the Chrono24 channel, and passing the exclusion rules at the end of this document. An article that disappears from the feed has been sold, unpublished or delisted.


Watch article

Structure

<article>
  <basic_information>
    <article_id>SN-10482</article_id>
    <type>Watch</type>
    <price>8500</price>
    <currency>EUR</currency>
    <brand>Rolex</brand>
    <model>Submariner Date</model>
    <reference_number>126610LN</reference_number>
    <condition>2</condition>
    <taxation_scheme>margin</taxation_scheme>
    <item_location>Germany</item_location>
    <item_location_region>Munich, Bavaria</item_location_region>
    <description>Full set, purchased 2021, serviced 2025.</description>
    <handling_time>1-3 days</handling_time>
    <gender>mens</gender>
  </basic_information>
  <images>
    <image>https://www.watchtraderhub.com/api/img/inventory/.../1.jpg</image>
    <image>https://www.watchtraderhub.com/api/img/inventory/.../2.jpg</image>
    <image>https://www.watchtraderhub.com/api/img/inventory/.../3.jpg</image>
  </images>
  <case>
    <case_material>Steel</case_material>
    <case_diameter>41</case_diameter>
    <case_thickness>12.5</case_thickness>
    <dial_color>Black</dial_color>
    <glass>Sapphire crystal</glass>
    <bezel_material>Ceramic</bezel_material>
    <dial_numerals>No numerals</dial_numerals>
  </case>
  <caliber>
    <movement_type>Automatic</movement_type>
    <caliber>3235</caliber>
    <power_reserve>70 hours</power_reserve>
  </caliber>
  <bracelet>
    <bracelet_material>Steel</bracelet_material>
    <bracelet_color>Steel</bracelet_color>
    <bracelet_width>20</bracelet_width>
    <clasp>Fold clasp</clasp>
    <clasp_material>Steel</clasp_material>
  </bracelet>
  <miscellaneous>
    <year>2021</year>
    <year_is_approximate>yes</year_is_approximate>
    <original_box>yes</original_box>
    <original_papers>yes</original_papers>
    <warranty_months>12</warranty_months>
    <water_resistance>30 ATM</water_resistance>
    <functions>Chronograph, Date</functions>
    <other>Screw-Down Crown, Luminous hands</other>
  </miscellaneous>
</article>

The four optional sections (case, caliber, bracelet, miscellaneous) are omitted entirely when the dealer filled in none of the fields inside them. basic_information and images are always present.

basic_information

Element What it carries Omitted when
article_id The dealer's own stock number, or our internal id if they keep none. See below. Never
type Always Watch for this article kind. Never
price The dealer's asking price after their Chrono24 markup and optional round-to-99. Plain number, no separators, no currency symbol. Never
currency ISO code, upper case. Defaults to EUR when the dealer set none. Never
brand Manufacturer name as typed by the dealer. Never
model Model name. Never
reference_number Manufacturer reference. Never
condition Integer 0 to 5, see the condition table. Never
taxation_scheme margin or regular, see taxation. Never
item_location The dealer's country of dispatch, full English name (for example Germany), from their business profile. The profile has no country
item_location_region City, then state or region, joined with a comma (for example Munich, Bavaria). Neither is set
description Free text. HTML is stripped, entities are resolved, runs of whitespace are collapsed to one space, and the result is cut at 1700 characters. The dealer wrote none
handling_time One of the handling time values below. Item level first, otherwise the dealer's feed default. Neither is set
gender mens or ladies. Item level first, otherwise the dealer's feed default. Neither is set, or off-list

article_id

The value is decided once, the first time an article is served to you, and then frozen on our side. It is, in order of preference: the dealer's stock number, or our internal item id prefixed with WTH- when they keep no stock numbers.

Freezing matters because you match a feed entry to an existing listing by article_id. A dealer who later edits their stock number, or a bulk backfill that assigns stock numbers to old items, does not change the id of anything you are already carrying. A delisted and re-listed item starts fresh and will arrive under whatever its stock number is at that point.

When a dealer holds several identical units of one watch, we expand it into one article per unit and suffix each id with a hyphen and the unit number, for example SN-10482-1, SN-10482-2, SN-10482-3. The base id is never sent on its own in that case.

Condition

condition carries a single integer, aligned one to one with the six grades on your conditions page. The second column is our own stored value, shown so a support conversation about one listing can be traced back through our system.

We send We store Chrono24 grade
0 new New
1 unworn Like new & unworn
2 very_good Very good (minor signs of wear)
3 good Good (moderate signs of wear)
4 fair Fair (major signs of wear)
5 poor Incomplete

Two notes. Our worst grade is "Poor", which lands in your "Incomplete" slot; some watches a dealer grades Poor are heavily worn but complete and running, so the description is the place to confirm whether parts are actually missing.

And because you do not accept 0 on a margin-scheme listing, a watch graded New whose effective tax treatment is margin is sent as 1, not 0. That floor is applied only to the value in this feed. The watch's stored condition, and what every other sales channel sees, is unchanged.

Taxation

taxation_scheme carries margin for an item under the margin scheme, and regular for everything else. The item's own tax treatment wins; where the item has none, the dealer's organization default applies. In full:

Effective treatment We send
standard regular
margin margin
zero_rated regular
exempt regular
reverse_charge regular
out_of_scope regular
no_tax regular

Handling time

1-3 days, 4-7 days, 8-14 days, 15-30 days, more than 30 days

Gender

mens, ladies

These are tokens rather than the labels your listing form shows. If you would rather receive the form labels, say so and we will switch.

images

images holds one image element per photo, in the order the dealer arranged them, so the first is the one they chose as the main picture. At most 16 are sent, which is the number your form accepts; a dealer with more photos has the rest dropped from the tail of their order.

Every URL is an absolute https link on our domain under /api/img/, ending in .jpg. Our storage holds WebP originals, and we convert on the way out because your importer green-tints WebP when it converts YCbCr to RGB. The URLs are public and need no authentication, so an import worker can fetch them directly.

Photos a dealer has marked internal (purchase receipts, service invoices, authentication paperwork) are never sent, and they are not counted towards the three-photo minimum either.

case

Element What it carries Omitted when
case_material Case material label. Not set, or off-list
case_diameter Millimetres, plain number (for example 41 or 41.5). Not set
case_thickness Millimetres, plain number. Not set
dial_color Dial colour label. Not set, or off-list
glass Crystal material label. Your template calls this element crystal. Not set, or off-list
bezel_material Bezel material label. Not set, or off-list
dial_numerals Dial numerals label. Not set, or off-list

case_material

Rose gold, Yellow gold, Steel, Titanium, Aluminum, Platinum, White gold, Gold/Steel, Silver, Plastic, Ceramic, Palladium, Tungsten, Tantalum, Carbon, Bronze, Brass, Gold-plated, Sapphire crystal

Nineteen values, matching your case material dropdown exactly. Our own form offers red gold as a separate case material, but your case list does not have it (red gold appears only on your bracelet, bezel and clasp lists), so a red gold case is sent as Rose gold.

dial_color

White, Black, Gold (solid), Silver (solid), Mother of pearl, Silver, Champagne, Blue, Bordeaux, Bronze, Yellow, Gold, Grey, Green, Orange, Red, Purple, Pink, Brown, Turquoise, Meteorite, Skeletonized

glass

Sapphire crystal, Mineral Glass, Plexiglass, Glass, Plastic

bezel_material

Aluminum, Carbon, Ceramic, Gold/Steel, Palladium, Rose gold, Plastic, Platinum, Red gold, Silver, Steel, Tantalum, Titanium, Tungsten, White gold, Yellow gold, Bronze, Gem-set, Brass, Gold-plated, Rubber

dial_numerals

Arabic numerals, Roman numerals, No numerals, Gemstones, Lines

caliber

Element What it carries Omitted when
movement_type Winding mechanism label. Not set, or off-list
caliber Movement reference as typed by the dealer, free text (for example 3235). Not set
power_reserve Whole hours followed by the word hours, for example 70 hours. Not set or zero

movement_type

Automatic, Manual winding, Quartz, Solar, Smartwatch

Our own form offers three movement types your list does not have. All three regulate with a quartz crystal, so they collapse onto Quartz rather than being dropped:

We store We send
automatic Automatic
manual_winding Manual winding
quartz Quartz
solar Solar
smartwatch Smartwatch
spring_drive Quartz
meca_quartz Quartz
tuning_fork Quartz

If you would rather have Spring Drive, Meca-Quartz and Tuning Fork arrive as their own strings, tell us and we will stop collapsing them.

bracelet

Element What it carries Omitted when
bracelet_material Bracelet or strap material label. Not set, or off-list
bracelet_color Bracelet or strap colour label. Not set, or off-list
bracelet_width Lug width in millimetres, plain number. Your template calls this element lug_width. Not set
clasp Clasp type label. Your template calls this element clasp_type. Not set, or off-list
clasp_material Clasp material label. Not set, or off-list

bracelet_material

Calf skin, Ostrich skin, Crocodile skin, Leather, Snake skin, Plastic, Steel, Titanium, Gold/Steel, Rose gold, Red gold, Yellow gold, Aluminium, Platinum, White gold, Silver, Rubber, Shark skin, Satin, Ceramic, Lizard skin, Silicon, Alligator skin, Brass, Gold-plated, Textile

bracelet_color

Black, Brown, Silver, Gold, Steel, Beige, Blue, Bordeaux, Bronze, Yellow, Grey, Green, Orange, Red, Purple, White, Pink, Gold/Steel

clasp

Fold clasp, Fold clasp, hidden, Double-fold clasp, Buckle, Jewelry clasp, No clasp

clasp_material

Plastic, Steel, Silver, Titanium, Gold/Steel, Rose Gold, Red gold, Yellow gold, Aluminum, Platinum, White Gold, Bronze

Note the casing of Rose Gold and White Gold in this list. It is the casing your clasp material dropdown uses, and it differs from the case and bezel lists, where the same two materials are lower case. We follow each list as published.

miscellaneous

Element What it carries Omitted when
year Four-digit year of production. The dealer marked the year unknown, or never set one
year_is_approximate The single value yes, meaning the year beside it is an estimate. Never sent as no. The year is exact, or there is no year
original_box yes or no Never
original_papers yes or no Never
warranty_months Whole months of dealer warranty, from the dealer's feed default. The default is zero
water_resistance Water resistance label. Not set, or off-list
functions Complications, comma-separated, in the order listed below. The watch has none
other Other characteristics, comma-separated, in the order listed below. The watch has none

Scope of delivery

We store scope of delivery as one field and send it as your two flags. Both are always present, because scope of delivery is one of your required fields:

Dealer selected original_box original_papers
Full set yes yes
Box only yes no
Papers only no yes
Watch only no no

An item too old to carry the field at all, imported before we added it, is sent as watch only, which is the claim least likely to disappoint a buyer.

Year

year_is_approximate never appears on its own. It is sent only next to a year, and only with the value yes. Where the dealer ticked "year unknown" we omit year entirely rather than send a guess, on the understanding that your importer reads an absent year as unknown.

water_resistance

Not water resistant, 1 ATM, 2 ATM, 2.5 ATM, 3 ATM, 4 ATM, 5 ATM, 6 ATM, 7 ATM, 8 ATM, 9 ATM, 10 ATM, 15 ATM, 20 ATM, 30 ATM, 40 ATM, 50 ATM, 60 ATM, 70 ATM, 80 ATM, 90 ATM, 100 ATM, 110 ATM, 120 ATM, Over 120 ATM

functions and other

Our form offers one combined list of features. We split it on the way out along the same line your form does: the 21 complications go in functions, and the 30 remaining characteristics go in other. Both are comma-and-space separated in a single element.

functions:

Chronograph, Double chronograph, Flyback, Panorama date, Repeater, Tourbillon, Annual calendar, 4-year calendar, Perpetual calendar, Alarm, Chiming clock, Moon phase, Minute repeater, Date, Weekday, Month, Year, Tachymeter, Jumping hour, Equation of time, GMT

other:

Central seconds, Small seconds, Guilloché dial, Gemstones and/or diamonds, Luminous numerals, Genevian Seal, Chronometer, Rotating Bezel, Limited Edition, Crown Left, Screw-Down Crown, Guilloché dial (handwork), Tempered blue hands, Luminous hands, Display back, Skeletonized, Power Reserve Display, Helium Valve, Quick Set, Screw-Down Push-Buttons, Only Original Parts, Luminous indices, PVD/DLC coating, World time watch, Master Chronometer, Smartwatch, Solar watch, One-hand watches, Vintage, Special Edition

Both lists are sent with the accents your form uses, so the two Guilloché entries carry a UTF-8 e-acute. The document is served as UTF-8 and so is the feed.


Accessory article

Accessories are watch parts and related goods: dials, movements, bracelets, boxes, tools, winders. On your side they are a listing whose "Style of watch" is Parts/Accessories, with an "Ad type" naming the kind of part.

Your published XML template has no element for either of those, so the two elements below are our proposal: accessory_type inside basic_information, carrying your Ad type label verbatim, and quantity for the stock flag. If your accessory import expects different element names, or a different place in the tree, tell us and we will change the feed. Nothing else about an accessory article is invented; every other element is the one the watch articles already use.

Structure

<article>
  <basic_information>
    <article_id>WTH-PART-2f5c9d61-4f0a-4a1e-9d63-6f5d1c2b7a90</article_id>
    <type>Accessory</type>
    <accessory_type>Dial</accessory_type>
    <price>250</price>
    <currency>EUR</currency>
    <brand>Rolex</brand>
    <model>Submariner 16610 dial, tritium</model>
    <condition>2</condition>
    <taxation_scheme>margin</taxation_scheme>
    <item_location>Germany</item_location>
    <item_location_region>Munich, Bavaria</item_location_region>
    <description>Original dial, light patina, no cracks.</description>
    <quantity>12</quantity>
  </basic_information>
  <images>
    <image>https://www.watchtraderhub.com/api/img/spare-parts/.../1.jpg</image>
  </images>
  <miscellaneous>
    <year>1998</year>
  </miscellaneous>
</article>
Element What it carries Omitted when
article_id Always our internal part id prefixed with WTH-PART-. Parts have no dealer stock number in this feed, so unlike watches the id never varies. Never
type Always Accessory. Never
accessory_type One of the 17 Ad type labels below. Our proposal. Never
price Same treatment as a watch: asking price plus the dealer's Chrono24 markup and optional round-to-99. Never
currency ISO code, defaults to EUR. Never
brand The part's manufacturer. Never
model The part name, cut at 90 characters to fit your Model field. Never
condition The same integer 0 to 5 as a watch, including the margin-scheme floor. Never
taxation_scheme margin or regular, resolved exactly as for a watch: the part's own treatment first, then the dealer's organization default. Never
item_location Dealer's country. The profile has no country
item_location_region Dealer's city and region. Neither is set
description Free text, HTML stripped, cut at 1700 characters. The dealer wrote none
quantity How many identical units the dealer holds, when that is more than one. Our proposal, for your "Several items available" flag. The dealer holds exactly one
image One or more photo URLs, same JPEG rewrite and same 16 cap as watches. Never (at least one is required)
year Four-digit year of production, inside miscellaneous. The dealer marked the year unknown

accessory_type

Bracelet/strap, Link/Bar, Buckle, Dial, Bezel, Crown/Pusher, Hand(s), Movement (parts), Movement (complete), Case, Glass/Crystal, Box, Watch Winders, Tools, Cleaning, Books/Calendars, Other

These are the labels on your Ad type dropdown, spelled exactly as it spells them. A part whose type we cannot place is sent as Other.

What an accessory does not carry

An accessory article has no reference_number, and no case, caliber or bracelet section. Your Parts/Accessories form does not ask for any of it, and we do not hold it against a part.

Two more differences from watches worth knowing. Accessories have no internal photo concept, so every photo a dealer attached to a part is sent. And an accessory needs only one photo to be eligible, against three for a watch.

Unlike watches, an accessory held in several units is one article with a quantity, not one article per unit. We did not want to invent a suffixed article_id scheme for a listing type whose schema is still open. Say the word if you would rather have them expanded the way watches are.


Exclusion rules

A published, Chrono24-listed item that fails any of these is left out of the feed. The dealer sees the reason in their WatchTraderHub channel page and can fix it themselves, so an item missing from your import is usually about to reappear.

The strings below are what a dealer is shown, word for word, which makes them useful in a support conversation.

Watches

A watch is excluded when:

  • Brand, model or reference number is missing: Missing required field (brand, model, or reference number)
  • The condition is not one we can grade: Invalid or missing condition: "none"
  • It has no photo the public may see: No public photos, minimum 3 required
  • It has one: Only 1 public photo, minimum 3 required
  • It has two: Only 2 public photos, minimum 3 required
  • The price after markup is not positive: Calculated feed price is zero or negative

The photo minimum counts only photos the dealer has left public. A watch with five photos of which three are internal paperwork is excluded at two.

Accessories

An accessory is excluded when:

  • The manufacturer is missing: Manufacturer is missing
  • The name is missing or too long for your Model field: Part name is missing or exceeds the 90 character limit
  • The condition is not one we can grade: Invalid or missing condition: "none"
  • It has neither a production year nor the "year unknown" flag: Year of production is missing, and it is not marked unknown
  • The price is not positive, or the stock is below one: Price must be positive and quantity must be at least 1
  • It has no photo: No photos, minimum 1 required

Limits

Limit Value
Minimum photos, watch 3
Minimum photos, accessory 1
Maximum photos per article 16
Maximum description characters 1700
Maximum model characters, accessory 90

Questions

Reply to the dealer who sent you this feed and they will pass it on, or answer in the thread you already have with them. Anything about element names, missing fields, or the two proposed accessory elements is worth asking; the feed is ours to change.

Every value list in this document is checked against the feed code by an automated build check, and the document is republished whenever the feed changes. The current version is always at https://www.watchtraderhub.com/docs/chrono24-feed-mapping, with a PDF at https://www.watchtraderhub.com/docs/chrono24-xml-feed-mapping.pdf