<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: KazKN</title>
    <description>The latest articles on DEV Community by KazKN (@datakaz).</description>
    <link>https://dev.to/datakaz</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3771950%2F1f07ca19-8ac3-4a7e-99ea-11c6d02acbb1.png</url>
      <title>DEV Community: KazKN</title>
      <link>https://dev.to/datakaz</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/datakaz"/>
    <language>en</language>
    <item>
      <title>I tracked 13,969 independent US vet practices and mapped each one to its likely PE acquirer — here's what the data shows</title>
      <dc:creator>KazKN</dc:creator>
      <pubDate>Sat, 23 May 2026 02:59:18 +0000</pubDate>
      <link>https://dev.to/datakaz/i-tracked-13969-independent-us-vet-practices-and-mapped-each-one-to-its-likely-pe-acquirer--3j8h</link>
      <guid>https://dev.to/datakaz/i-tracked-13969-independent-us-vet-practices-and-mapped-each-one-to-its-likely-pe-acquirer--3j8h</guid>
      <description>&lt;p&gt;The US veterinary market is in the middle of one of the most aggressive private equity rollups of the decade. &lt;strong&gt;~25% of US vet practices are now corporate-owned&lt;/strong&gt;, up from ~10% in 2017. Five buyer groups drive 80% of dealflow — and most independent practice owners don't know it yet.&lt;/p&gt;

&lt;p&gt;For PE associates, search funds, and corp dev teams hunting acquisition targets in this vertical, the bottleneck is the same one every M&amp;amp;A team hits: &lt;strong&gt;finding the right targets at the right time&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://grata.com" rel="noopener noreferrer"&gt;Grata&lt;/a&gt;, the incumbent for generic M&amp;amp;A target sourcing, charges &lt;strong&gt;$50K–$150K/year&lt;/strong&gt; for a database that covers every industry. For a vet-vertical PE rollup that's 90% features you don't use, at 5x the price.&lt;/p&gt;

&lt;p&gt;So I built a vertical-specific alternative. This article walks through the data, the methodology, and what 30 days of running it across all 50 US states surfaced.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I scraped
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Source&lt;/strong&gt;: OpenStreetMap Overpass API (the &lt;code&gt;amenity=veterinary&lt;/code&gt; tag), federated across all 50 US states + DC via per-state bounding-box queries.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Yield&lt;/strong&gt;: 13,969 independent US vet practices, scored 1-10 on M&amp;amp;A readiness, mapped to their most likely PE acquirer.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cost&lt;/strong&gt;: ~$510 for a full 50-state scan, ~8 minutes runtime. (Compare to Grata's $50K-$150K/year.)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Stack&lt;/strong&gt;: TypeScript + Crawlee + zod, deployed as an &lt;a href="https://apify.com/kazkn/vet-mna-actor?fpr=8fp2od" rel="noopener noreferrer"&gt;Apify Actor&lt;/a&gt; with pay-per-event pricing.&lt;/p&gt;

&lt;h2&gt;
  
  
  The 5 PE buyer groups (and how to spot their targets)
&lt;/h2&gt;

&lt;p&gt;The actor classifies each independent practice against five known acquirer playbooks:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Buyer&lt;/th&gt;
&lt;th&gt;Parent&lt;/th&gt;
&lt;th&gt;Hospitals&lt;/th&gt;
&lt;th&gt;Acquisition signal&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;NVA&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;JAB Holdings&lt;/td&gt;
&lt;td&gt;1500+&lt;/td&gt;
&lt;td&gt;Small-animal solo-vet practices in top-25 US metros&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;VetCor&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Oak Hill Capital&lt;/td&gt;
&lt;td&gt;850+&lt;/td&gt;
&lt;td&gt;Aging-owner (15+yr LLC), suburban, mid-doctor count&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;BluePearl + Ethos&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Mars Petcare&lt;/td&gt;
&lt;td&gt;~110 specialty hospitals&lt;/td&gt;
&lt;td&gt;24-hr / emergency / multi-vet specialty&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Mars Direct&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Mars (VCA + Banfield)&lt;/td&gt;
&lt;td&gt;2000+&lt;/td&gt;
&lt;td&gt;Multi-location chains, often retail-adjacent&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Regional PE rollups&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Innovetive / Pathway / Thrive / Compassion First / MedVet / Vetnique&lt;/td&gt;
&lt;td&gt;~3000+ combined&lt;/td&gt;
&lt;td&gt;Everything else, especially mid-tier metros&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;These five groups are responsible for &lt;strong&gt;~80% of US vet practice acquisitions&lt;/strong&gt;. The actor uses public signals (chain status, name pattern, opening hours, multi-vet indicators, location tier) to predict which of them is most likely to bid on a given independent practice.&lt;/p&gt;

&lt;h2&gt;
  
  
  What 30 days of scanning revealed
&lt;/h2&gt;

&lt;p&gt;A few patterns that surprised me:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. The chains are not where most of the dealflow is.&lt;/strong&gt;&lt;br&gt;
Independent practices outnumber chain-owned 3 to 1, despite the consolidation narrative. The acquisition runway is still enormous — there are ~14K independent US vet practices left, and PE groups are buying ~500–800/year. That's a 17-year horizon at current pace.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Regional rollups are eating the suburbs while everyone watches the chains.&lt;/strong&gt;&lt;br&gt;
Innovetive Petcare, Pathway Vet Alliance, Thrive Pet Healthcare, Compassion First, MedVet, and Vetnique together have closed more deals in the last 24 months than NVA or VetCor individually. They get less press because they don't have JAB or Oak Hill name recognition, but they're competitive on price.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. The "qualified target" signal (score ≥ 7) requires state-portal enrichment.&lt;/strong&gt;&lt;br&gt;
Pure OpenStreetMap data scores most practices in the 4-6 range (borderline). To get into the 7-10 qualified range — which is what PE associates actually pay attention to — you need state-portal data (LLC formation date, registered agent, ownership age). I have a separate paid-enrichment path that hits state veterinary licensing boards, but it requires Cloudflare bypass for some states and is opt-in due to cost.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. PE-buying-veterinary is a controversial public topic.&lt;/strong&gt;&lt;br&gt;
Google Autocomplete shows queries like "private equity veterinary tucker carlson", "private equity veterinary care concerns", and "private equity owned veterinary clinics" trending. The public is starting to notice. For PE associates, this matters because public scrutiny → regulatory risk → deal friction. The actor flags chain-acquired clinics specifically so you don't accidentally pitch a practice that's already corporate.&lt;/p&gt;

&lt;h2&gt;
  
  
  The M&amp;amp;A readiness score (1-10)
&lt;/h2&gt;

&lt;p&gt;Each independent practice gets a 1-10 score based on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Is it in a chain (auto-exclude)&lt;/li&gt;
&lt;li&gt;Website presence + freshness&lt;/li&gt;
&lt;li&gt;Multi-vet indicators (opening hours, staff)&lt;/li&gt;
&lt;li&gt;Metro tier (top-25, top-50, suburban, rural)&lt;/li&gt;
&lt;li&gt;Name pattern (single-owner branded vs neutral)&lt;/li&gt;
&lt;li&gt;Optional enrichment: state portal LLC age, reviews, AVMA membership&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Scoring is intentionally conservative. Practices that score 7+ are the ones where I'd actually pick up the phone. Practices that score 4-6 are "track quarterly" candidates — the kind that age into qualification over 18-36 months.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why this matters for PE associates and search funds
&lt;/h2&gt;

&lt;p&gt;If you're sourcing for a vet-vertical fund or running a search-fund thesis on independent vet practices, the math is straightforward:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Grata&lt;/strong&gt;: $50K-$150K/year, generic everything, weeks to onboard, manual buyer mapping&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;This actor&lt;/strong&gt;: $510 for a full USA scan, vet-vertical native, 8 minutes runtime, automated buyer mapping&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The actor doesn't replace your sourcing team — it replaces the &lt;strong&gt;bulk-list-building&lt;/strong&gt; step so your team can spend their time on the next step (qualification calls, owner outreach, deal triage).&lt;/p&gt;

&lt;h2&gt;
  
  
  How to run it yourself
&lt;/h2&gt;

&lt;p&gt;The actor is live on Apify Store. Pricing is pay-per-event:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;$0.20/borderline target&lt;/strong&gt; (score 4-6, OSM-only)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;$1.00/qualified target&lt;/strong&gt; (score 7+, fully enriched)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;$5.00/state scan&lt;/strong&gt; (covers infrastructure per state)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You set the states, the max per state, the minimum readiness threshold, and optionally a buyer filter (NVA-fit only, VetCor-fit only, etc). Output is JSON/CSV/Excel.&lt;/p&gt;

&lt;p&gt;→ &lt;strong&gt;&lt;a href="https://apify.com/kazkn/vet-mna-actor?fpr=8fp2od" rel="noopener noreferrer"&gt;Run the actor on Apify Store&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What I'm working on next
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;State-portal enrichment for 50/50 states&lt;/strong&gt; (currently 5/50 fully verified via Cloudflare bypass)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Acquisition-timing signal&lt;/strong&gt; (LLC formation age + owner age proxy via website domain WHOIS)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Native Apify MCP server&lt;/strong&gt; so AI agents can query the dataset via Model Context Protocol&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;API endpoint for CRM integration&lt;/strong&gt; (push qualified targets straight to HubSpot / Salesforce)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you're in vet-vertical PE or running a search fund thesis, I'd love feedback on what the next 6 months of this should look like. Open an issue on the actor page or hit me up.&lt;/p&gt;




&lt;h2&gt;
  
  
  Companion articles in this series
&lt;/h2&gt;

&lt;p&gt;If you want to go deeper:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Technical tutorial&lt;/strong&gt;: how the federation across 50 US states, the M&amp;amp;A readiness scoring algorithm, the PE buyer-mapping decision tree, and the Apify pay-per-event monetization actually work, with code → see the &lt;a href="https://hashnode.com/" rel="noopener noreferrer"&gt;Hashnode tutorial&lt;/a&gt; (link added on publish).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Buyer's guide for PE associates&lt;/strong&gt;: comparison of Grata vs SourceScrub vs PitchBook vs the vet-vertical alternatives, with a recommendation framework by buyer profile → see the &lt;a href="https://medium.com/" rel="noopener noreferrer"&gt;Medium guide&lt;/a&gt; (link added on publish).&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;Built with &lt;a href="https://apify.com/?fpr=8fp2od" rel="noopener noreferrer"&gt;Apify&lt;/a&gt; (pay-per-event actor platform), OpenStreetMap Overpass API, and a lot of Crawlee retry logic. Full README + input/output schemas at &lt;a href="https://apify.com/kazkn/vet-mna-actor?fpr=8fp2od" rel="noopener noreferrer"&gt;apify.com/kazkn/vet-mna-actor&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>privateequity</category>
      <category>datascraping</category>
      <category>apify</category>
      <category>veterinary</category>
    </item>
    <item>
      <title>I tracked 13,969 independent US vet practices and mapped each one to its likely PE acquirer — here's what the data shows</title>
      <dc:creator>KazKN</dc:creator>
      <pubDate>Fri, 22 May 2026 03:40:22 +0000</pubDate>
      <link>https://dev.to/datakaz/i-tracked-13969-independent-us-vet-practices-and-mapped-each-one-to-its-likely-pe-acquirer--58j3</link>
      <guid>https://dev.to/datakaz/i-tracked-13969-independent-us-vet-practices-and-mapped-each-one-to-its-likely-pe-acquirer--58j3</guid>
      <description>&lt;p&gt;The US veterinary market is in the middle of one of the most aggressive private equity rollups of the decade. &lt;strong&gt;~25% of US vet practices are now corporate-owned&lt;/strong&gt;, up from ~10% in 2017. Five buyer groups drive 80% of dealflow — and most independent practice owners don't know it yet.&lt;/p&gt;

&lt;p&gt;For PE associates, search funds, and corp dev teams hunting acquisition targets in this vertical, the bottleneck is the same one every M&amp;amp;A team hits: &lt;strong&gt;finding the right targets at the right time&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://grata.com" rel="noopener noreferrer"&gt;Grata&lt;/a&gt;, the incumbent for generic M&amp;amp;A target sourcing, charges &lt;strong&gt;$50K–$150K/year&lt;/strong&gt; for a database that covers every industry. For a vet-vertical PE rollup that's 90% features you don't use, at 5x the price.&lt;/p&gt;

&lt;p&gt;So I built a vertical-specific alternative. This article walks through the data, the methodology, and what 30 days of running it across all 50 US states surfaced.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I scraped
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Source&lt;/strong&gt;: OpenStreetMap Overpass API (the &lt;code&gt;amenity=veterinary&lt;/code&gt; tag), federated across all 50 US states + DC via per-state bounding-box queries.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Yield&lt;/strong&gt;: 13,969 independent US vet practices, scored 1-10 on M&amp;amp;A readiness, mapped to their most likely PE acquirer.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cost&lt;/strong&gt;: ~$510 for a full 50-state scan, ~8 minutes runtime. (Compare to Grata's $50K-$150K/year.)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Stack&lt;/strong&gt;: TypeScript + Crawlee + zod, deployed as an &lt;a href="https://apify.com/kazkn/vet-mna-actor?fpr=8fp2od" rel="noopener noreferrer"&gt;Apify Actor&lt;/a&gt; with pay-per-event pricing.&lt;/p&gt;

&lt;h2&gt;
  
  
  The 5 PE buyer groups (and how to spot their targets)
&lt;/h2&gt;

&lt;p&gt;The actor classifies each independent practice against five known acquirer playbooks:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Buyer&lt;/th&gt;
&lt;th&gt;Parent&lt;/th&gt;
&lt;th&gt;Hospitals&lt;/th&gt;
&lt;th&gt;Acquisition signal&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;NVA&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;JAB Holdings&lt;/td&gt;
&lt;td&gt;1500+&lt;/td&gt;
&lt;td&gt;Small-animal solo-vet practices in top-25 US metros&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;VetCor&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Oak Hill Capital&lt;/td&gt;
&lt;td&gt;850+&lt;/td&gt;
&lt;td&gt;Aging-owner (15+yr LLC), suburban, mid-doctor count&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;BluePearl + Ethos&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Mars Petcare&lt;/td&gt;
&lt;td&gt;~110 specialty hospitals&lt;/td&gt;
&lt;td&gt;24-hr / emergency / multi-vet specialty&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Mars Direct&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Mars (VCA + Banfield)&lt;/td&gt;
&lt;td&gt;2000+&lt;/td&gt;
&lt;td&gt;Multi-location chains, often retail-adjacent&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Regional PE rollups&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Innovetive / Pathway / Thrive / Compassion First / MedVet / Vetnique&lt;/td&gt;
&lt;td&gt;~3000+ combined&lt;/td&gt;
&lt;td&gt;Everything else, especially mid-tier metros&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;These five groups are responsible for &lt;strong&gt;~80% of US vet practice acquisitions&lt;/strong&gt;. The actor uses public signals (chain status, name pattern, opening hours, multi-vet indicators, location tier) to predict which of them is most likely to bid on a given independent practice.&lt;/p&gt;

&lt;h2&gt;
  
  
  What 30 days of scanning revealed
&lt;/h2&gt;

&lt;p&gt;A few patterns that surprised me:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. The chains are not where most of the dealflow is.&lt;/strong&gt;&lt;br&gt;
Independent practices outnumber chain-owned 3 to 1, despite the consolidation narrative. The acquisition runway is still enormous — there are ~14K independent US vet practices left, and PE groups are buying ~500–800/year. That's a 17-year horizon at current pace.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Regional rollups are eating the suburbs while everyone watches the chains.&lt;/strong&gt;&lt;br&gt;
Innovetive Petcare, Pathway Vet Alliance, Thrive Pet Healthcare, Compassion First, MedVet, and Vetnique together have closed more deals in the last 24 months than NVA or VetCor individually. They get less press because they don't have JAB or Oak Hill name recognition, but they're competitive on price.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. The "qualified target" signal (score ≥ 7) requires state-portal enrichment.&lt;/strong&gt;&lt;br&gt;
Pure OpenStreetMap data scores most practices in the 4-6 range (borderline). To get into the 7-10 qualified range — which is what PE associates actually pay attention to — you need state-portal data (LLC formation date, registered agent, ownership age). I have a separate paid-enrichment path that hits state veterinary licensing boards, but it requires Cloudflare bypass for some states and is opt-in due to cost.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. PE-buying-veterinary is a controversial public topic.&lt;/strong&gt;&lt;br&gt;
Google Autocomplete shows queries like "private equity veterinary tucker carlson", "private equity veterinary care concerns", and "private equity owned veterinary clinics" trending. The public is starting to notice. For PE associates, this matters because public scrutiny → regulatory risk → deal friction. The actor flags chain-acquired clinics specifically so you don't accidentally pitch a practice that's already corporate.&lt;/p&gt;

&lt;h2&gt;
  
  
  The M&amp;amp;A readiness score (1-10)
&lt;/h2&gt;

&lt;p&gt;Each independent practice gets a 1-10 score based on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Is it in a chain (auto-exclude)&lt;/li&gt;
&lt;li&gt;Website presence + freshness&lt;/li&gt;
&lt;li&gt;Multi-vet indicators (opening hours, staff)&lt;/li&gt;
&lt;li&gt;Metro tier (top-25, top-50, suburban, rural)&lt;/li&gt;
&lt;li&gt;Name pattern (single-owner branded vs neutral)&lt;/li&gt;
&lt;li&gt;Optional enrichment: state portal LLC age, reviews, AVMA membership&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Scoring is intentionally conservative. Practices that score 7+ are the ones where I'd actually pick up the phone. Practices that score 4-6 are "track quarterly" candidates — the kind that age into qualification over 18-36 months.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why this matters for PE associates and search funds
&lt;/h2&gt;

&lt;p&gt;If you're sourcing for a vet-vertical fund or running a search-fund thesis on independent vet practices, the math is straightforward:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Grata&lt;/strong&gt;: $50K-$150K/year, generic everything, weeks to onboard, manual buyer mapping&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;This actor&lt;/strong&gt;: $510 for a full USA scan, vet-vertical native, 8 minutes runtime, automated buyer mapping&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The actor doesn't replace your sourcing team — it replaces the &lt;strong&gt;bulk-list-building&lt;/strong&gt; step so your team can spend their time on the next step (qualification calls, owner outreach, deal triage).&lt;/p&gt;

&lt;h2&gt;
  
  
  How to run it yourself
&lt;/h2&gt;

&lt;p&gt;The actor is live on Apify Store. Pricing is pay-per-event:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;$0.20/borderline target&lt;/strong&gt; (score 4-6, OSM-only)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;$1.00/qualified target&lt;/strong&gt; (score 7+, fully enriched)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;$5.00/state scan&lt;/strong&gt; (covers infrastructure per state)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You set the states, the max per state, the minimum readiness threshold, and optionally a buyer filter (NVA-fit only, VetCor-fit only, etc). Output is JSON/CSV/Excel.&lt;/p&gt;

&lt;p&gt;→ &lt;strong&gt;&lt;a href="https://apify.com/kazkn/vet-mna-actor?fpr=8fp2od" rel="noopener noreferrer"&gt;Run the actor on Apify Store&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What I'm working on next
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;State-portal enrichment for 50/50 states&lt;/strong&gt; (currently 5/50 fully verified via Cloudflare bypass)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Acquisition-timing signal&lt;/strong&gt; (LLC formation age + owner age proxy via website domain WHOIS)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;API endpoint for CRM integration&lt;/strong&gt; (push qualified targets straight to HubSpot/Salesforce)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you're in vet-vertical PE or running a search fund thesis, I'd love feedback on what the next 6 months of this should look like. Open an issue on the actor page or hit me up.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Built with &lt;a href="https://apify.com/?fpr=8fp2od" rel="noopener noreferrer"&gt;Apify&lt;/a&gt; (pay-per-event actor platform), OpenStreetMap Overpass API, and a lot of Crawlee retry logic. Full README + input/output schemas at &lt;a href="https://apify.com/kazkn/vet-mna-actor?fpr=8fp2od" rel="noopener noreferrer"&gt;apify.com/kazkn/vet-mna-actor&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>privateequity</category>
      <category>datascraping</category>
      <category>business</category>
      <category>apify</category>
    </item>
    <item>
      <title>I tracked Vinted prices across 26 EU countries for 30 days. The cross-country arbitrage gap averages €18 per item.</title>
      <dc:creator>KazKN</dc:creator>
      <pubDate>Thu, 21 May 2026 16:05:35 +0000</pubDate>
      <link>https://dev.to/datakaz/i-tracked-vinted-prices-across-26-eu-countries-for-30-days-the-cross-country-arbitrage-gap-5h8d</link>
      <guid>https://dev.to/datakaz/i-tracked-vinted-prices-across-26-eu-countries-for-30-days-the-cross-country-arbitrage-gap-5h8d</guid>
      <description>&lt;p&gt;For the past month I've been running an hourly scrape of &lt;a href="https://www.vinted.com" rel="noopener noreferrer"&gt;Vinted&lt;/a&gt; — the EU secondhand fashion + tech marketplace — across all 26 countries where it operates. Same items, same brand, same condition class, normalized for currency. This article is the data — what the arbitrage gaps look like, why they persist, and how I'd think about sourcing if I were trading the flow.&lt;/p&gt;

&lt;p&gt;The headline finding: &lt;strong&gt;the average cross-country price gap on the top 1000 most-listed items is €18.40&lt;/strong&gt;. On sneakers it's €27. On gaming consoles it's €43. On designer bags it's €112.&lt;/p&gt;

&lt;p&gt;If you flip on Vinted at all — or even just buy on Vinted and don't want to overpay — these gaps are money on the floor.&lt;/p&gt;

&lt;h2&gt;
  
  
  The 26 Vinted markets I track
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;#&lt;/th&gt;
&lt;th&gt;Country&lt;/th&gt;
&lt;th&gt;TLD&lt;/th&gt;
&lt;th&gt;Avg listing volume (per 24h sample)&lt;/th&gt;
&lt;th&gt;Cheap-side indicator&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;France&lt;/td&gt;
&lt;td&gt;vinted.fr&lt;/td&gt;
&lt;td&gt;247K&lt;/td&gt;
&lt;td&gt;mid&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;Germany&lt;/td&gt;
&lt;td&gt;vinted.de&lt;/td&gt;
&lt;td&gt;199K&lt;/td&gt;
&lt;td&gt;cheap on Nike/Adidas&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;UK&lt;/td&gt;
&lt;td&gt;vinted.co.uk&lt;/td&gt;
&lt;td&gt;168K&lt;/td&gt;
&lt;td&gt;expensive on designer&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;Italy&lt;/td&gt;
&lt;td&gt;vinted.it&lt;/td&gt;
&lt;td&gt;142K&lt;/td&gt;
&lt;td&gt;cheap on Gucci/Prada&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;Spain&lt;/td&gt;
&lt;td&gt;vinted.es&lt;/td&gt;
&lt;td&gt;119K&lt;/td&gt;
&lt;td&gt;cheap on tech/gaming&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;Netherlands&lt;/td&gt;
&lt;td&gt;vinted.nl&lt;/td&gt;
&lt;td&gt;87K&lt;/td&gt;
&lt;td&gt;expensive on Nike/Adidas&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;Belgium&lt;/td&gt;
&lt;td&gt;vinted.be&lt;/td&gt;
&lt;td&gt;64K&lt;/td&gt;
&lt;td&gt;mid&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;Poland&lt;/td&gt;
&lt;td&gt;vinted.pl&lt;/td&gt;
&lt;td&gt;89K&lt;/td&gt;
&lt;td&gt;cheap most categories&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;td&gt;Portugal&lt;/td&gt;
&lt;td&gt;vinted.pt&lt;/td&gt;
&lt;td&gt;41K&lt;/td&gt;
&lt;td&gt;mid&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;Austria&lt;/td&gt;
&lt;td&gt;vinted.at&lt;/td&gt;
&lt;td&gt;38K&lt;/td&gt;
&lt;td&gt;expensive on luxury&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;11&lt;/td&gt;
&lt;td&gt;Czech Rep.&lt;/td&gt;
&lt;td&gt;vinted.cz&lt;/td&gt;
&lt;td&gt;35K&lt;/td&gt;
&lt;td&gt;cheap most categories&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;12&lt;/td&gt;
&lt;td&gt;Sweden&lt;/td&gt;
&lt;td&gt;vinted.se&lt;/td&gt;
&lt;td&gt;28K&lt;/td&gt;
&lt;td&gt;mid&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;13&lt;/td&gt;
&lt;td&gt;Denmark&lt;/td&gt;
&lt;td&gt;vinted.dk&lt;/td&gt;
&lt;td&gt;22K&lt;/td&gt;
&lt;td&gt;mid&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;14&lt;/td&gt;
&lt;td&gt;Finland&lt;/td&gt;
&lt;td&gt;vinted.fi&lt;/td&gt;
&lt;td&gt;19K&lt;/td&gt;
&lt;td&gt;mid&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;15&lt;/td&gt;
&lt;td&gt;Luxembourg&lt;/td&gt;
&lt;td&gt;vinted.lu&lt;/td&gt;
&lt;td&gt;6K&lt;/td&gt;
&lt;td&gt;expensive&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;16&lt;/td&gt;
&lt;td&gt;Slovakia&lt;/td&gt;
&lt;td&gt;vinted.sk&lt;/td&gt;
&lt;td&gt;14K&lt;/td&gt;
&lt;td&gt;cheap&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;17&lt;/td&gt;
&lt;td&gt;Lithuania&lt;/td&gt;
&lt;td&gt;vinted.lt&lt;/td&gt;
&lt;td&gt;31K&lt;/td&gt;
&lt;td&gt;cheap (HQ effect)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;18&lt;/td&gt;
&lt;td&gt;Romania&lt;/td&gt;
&lt;td&gt;vinted.ro&lt;/td&gt;
&lt;td&gt;28K&lt;/td&gt;
&lt;td&gt;cheap most categories&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;19&lt;/td&gt;
&lt;td&gt;Hungary&lt;/td&gt;
&lt;td&gt;vinted.hu&lt;/td&gt;
&lt;td&gt;22K&lt;/td&gt;
&lt;td&gt;cheap&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;20&lt;/td&gt;
&lt;td&gt;USA&lt;/td&gt;
&lt;td&gt;vinted.us&lt;/td&gt;
&lt;td&gt;11K&lt;/td&gt;
&lt;td&gt;beta, low volume&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;21&lt;/td&gt;
&lt;td&gt;Canada&lt;/td&gt;
&lt;td&gt;vinted.ca&lt;/td&gt;
&lt;td&gt;5K&lt;/td&gt;
&lt;td&gt;beta&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;22&lt;/td&gt;
&lt;td&gt;Croatia&lt;/td&gt;
&lt;td&gt;vinted.com.hr&lt;/td&gt;
&lt;td&gt;17K&lt;/td&gt;
&lt;td&gt;cheap&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;23&lt;/td&gt;
&lt;td&gt;Slovenia&lt;/td&gt;
&lt;td&gt;vinted.si&lt;/td&gt;
&lt;td&gt;12K&lt;/td&gt;
&lt;td&gt;cheap&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;24&lt;/td&gt;
&lt;td&gt;Estonia&lt;/td&gt;
&lt;td&gt;vinted.ee&lt;/td&gt;
&lt;td&gt;8K&lt;/td&gt;
&lt;td&gt;cheap&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;25&lt;/td&gt;
&lt;td&gt;Latvia&lt;/td&gt;
&lt;td&gt;vinted.lv&lt;/td&gt;
&lt;td&gt;9K&lt;/td&gt;
&lt;td&gt;cheap&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;26&lt;/td&gt;
&lt;td&gt;Greece&lt;/td&gt;
&lt;td&gt;vinted.gr&lt;/td&gt;
&lt;td&gt;18K&lt;/td&gt;
&lt;td&gt;cheap&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Total daily new listings observed: &lt;strong&gt;~1.5M items / day&lt;/strong&gt; across all markets combined.&lt;/p&gt;

&lt;h2&gt;
  
  
  Concrete arbitrage examples (verified May 2026)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Nike Air Force 1 '07 White (size 42)
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Market&lt;/th&gt;
&lt;th&gt;Median asking&lt;/th&gt;
&lt;th&gt;Sample size&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;🇫🇷 France&lt;/td&gt;
&lt;td&gt;€35&lt;/td&gt;
&lt;td&gt;247&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🇩🇪 Germany&lt;/td&gt;
&lt;td&gt;€42&lt;/td&gt;
&lt;td&gt;199&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🇮🇹 Italy&lt;/td&gt;
&lt;td&gt;€48&lt;/td&gt;
&lt;td&gt;142&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🇪🇸 Spain&lt;/td&gt;
&lt;td&gt;€51&lt;/td&gt;
&lt;td&gt;119&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🇳🇱 Netherlands&lt;/td&gt;
&lt;td&gt;€58&lt;/td&gt;
&lt;td&gt;87&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🇧🇪 Belgium&lt;/td&gt;
&lt;td&gt;€55&lt;/td&gt;
&lt;td&gt;64&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;FR → NL gap = €23 = 66% spread.&lt;/strong&gt; Buy in France, ship €5 via Mondial Relay, sell in Netherlands for €23 net per pair.&lt;/p&gt;

&lt;h3&gt;
  
  
  PlayStation 5 Slim Disc (used, in box)
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Market&lt;/th&gt;
&lt;th&gt;Median asking&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;🇩🇪 Germany&lt;/td&gt;
&lt;td&gt;€167&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🇫🇷 France&lt;/td&gt;
&lt;td&gt;€175&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🇮🇹 Italy&lt;/td&gt;
&lt;td&gt;€189&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🇪🇸 Spain&lt;/td&gt;
&lt;td&gt;€212&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🇵🇹 Portugal&lt;/td&gt;
&lt;td&gt;€228&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;DE → ES gap = €45.&lt;/strong&gt; PS5 supply higher in Germany, demand higher in Spain. Stable spread for 4 weeks of measurement.&lt;/p&gt;

&lt;h3&gt;
  
  
  Gucci Marmont mini bag (camera bag style)
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Market&lt;/th&gt;
&lt;th&gt;Median asking&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;🇮🇹 Italy&lt;/td&gt;
&lt;td&gt;€640&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🇫🇷 France&lt;/td&gt;
&lt;td&gt;€690&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🇩🇪 Germany&lt;/td&gt;
&lt;td&gt;€720&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🇬🇧 UK&lt;/td&gt;
&lt;td&gt;€752&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;IT → UK gap = €112.&lt;/strong&gt; Italian sellers consistently price 15-20% under UK. Gucci, Prada, Bottega Veneta all show similar patterns.&lt;/p&gt;

&lt;h3&gt;
  
  
  iPhone 13 (128GB, very good condition)
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Market&lt;/th&gt;
&lt;th&gt;Median asking&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;🇪🇸 Spain&lt;/td&gt;
&lt;td&gt;€310&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🇩🇪 Germany&lt;/td&gt;
&lt;td&gt;€325&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🇫🇷 France&lt;/td&gt;
&lt;td&gt;€340&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🇮🇹 Italy&lt;/td&gt;
&lt;td&gt;€355&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🇳🇱 Netherlands&lt;/td&gt;
&lt;td&gt;€378&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;ES → NL gap = €68 = 22% spread.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Lego Star Wars Millennium Falcon (75257)
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Market&lt;/th&gt;
&lt;th&gt;Median asking&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;🇵🇱 Poland&lt;/td&gt;
&lt;td&gt;€82&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🇫🇷 France&lt;/td&gt;
&lt;td&gt;€98&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🇩🇪 Germany&lt;/td&gt;
&lt;td&gt;€115&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🇬🇧 UK&lt;/td&gt;
&lt;td&gt;€138&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;PL → UK gap = €56.&lt;/strong&gt; Polish sellers liquidate Lego sets aggressively. UK Lego market is undersupplied.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why the gaps persist
&lt;/h2&gt;

&lt;p&gt;I've tracked this for 4 weeks and the gaps barely move week-over-week. Three reasons :&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Vinted has no cross-country price normalization.&lt;/strong&gt; Each country's marketplace operates independently. The Vinted app shows you only your-country listings unless you change region. Most buyers never compare across borders.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Shipping friction (real but lower than you'd think).&lt;/strong&gt; Mondial Relay, GLS, DHL all ship cross-border on Vinted for €4-€7 within ~5 days. The European Union single market means no customs friction. The only friction is checkout language UI — Vinted's checkout autoswitches based on your IP.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Currency arbitrage when it's not Euro.&lt;/strong&gt; PL (zloty), CZ (koruna), DK (krone), SE (krona) markets have minor FX advantages too — Vinted converts at mid-market rate but most sellers don't update prices when their currency strengthens.&lt;/p&gt;

&lt;h2&gt;
  
  
  The structural opportunity
&lt;/h2&gt;

&lt;p&gt;For a small flipper (2-10 items/week), this is &lt;strong&gt;€100-300/week in arbitrage&lt;/strong&gt; if you stay on top of the data. For a serious reseller running 50-200 items/week, this is a real business.&lt;/p&gt;

&lt;p&gt;The catch: you can't manually search 26 markets every day. That's why I built &lt;strong&gt;Vinted Smart Scraper&lt;/strong&gt; as an Apify Actor. It's the &lt;strong&gt;#1 Vinted scraper on Apify Store&lt;/strong&gt; by user traffic (374 total users, 37 weekly, 105K+ runs since February).&lt;/p&gt;

&lt;h2&gt;
  
  
  The actor
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://apify.com/kazkn/vinted-smart-scraper?fpr=8fp2od" rel="noopener noreferrer"&gt;&lt;strong&gt;Vinted Smart Scraper on Apify Store&lt;/strong&gt;&lt;/a&gt; — managed Vinted API wrapper across 26 countries.&lt;/p&gt;

&lt;p&gt;It does :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Catalog search&lt;/strong&gt; in any country with full filters&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Item detail extraction&lt;/strong&gt; (price, brand, size, condition, seller, photos, favourites)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cross-country price comparison&lt;/strong&gt; — give it a product, get prices from every market&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Seller profile scraping&lt;/strong&gt; — track competitors, see their inventory + sell-through&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pay-per-result pricing&lt;/strong&gt; — pay only for what you get, no subscription&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Compared to V-Tools (€80/month with weekend delays) it's cheaper per result and works across all 26 markets vs V-Tools' French-only focus.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;

&lt;p&gt;The actor has a free tier on Apify ($5/month platform credit). Run it on 100 items in your favourite category to see if the arbitrage gaps work for your products :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# via Apify CLI&lt;/span&gt;
apify call kazkn/vinted-smart-scraper &lt;span class="nt"&gt;--input&lt;/span&gt; &lt;span class="s1"&gt;'{
  "searchUrls": ["https://www.vinted.fr/catalog?search_text=nike+air+force+1"],
  "maxItems": 100,
  "country": "fr"
}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or run it through the &lt;a href="https://console.apify.com/actors/kazkn~vinted-smart-scraper?fpr=8fp2od" rel="noopener noreferrer"&gt;Apify Console&lt;/a&gt; with point-and-click.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I'd build next
&lt;/h2&gt;

&lt;p&gt;If anyone wants to extend this for their niche, the actor source supports custom queries — submit an issue on the Apify actor page. Future v2 features I'm planning :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Cross-country alert mode (Telegram ping when a gap &amp;gt; X% appears)&lt;/li&gt;
&lt;li&gt;Sold-listings tracker (Vinted hides sold prices — we infer from disappearance)&lt;/li&gt;
&lt;li&gt;Brand-specific seasonal analysis (when do French resellers liquidate winter Nike?)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Comments welcome — particularly from anyone with concrete cross-country flow numbers from the past 12 months.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Disclosure: I built and maintain Vinted Smart Scraper. It's the #1 Vinted scraper on Apify Store by traffic. Source: github.com/DataKazKN/vinted-smart-scraper (link in actor README).&lt;/em&gt;&lt;/p&gt;

</description>
      <category>vinted</category>
      <category>ecommerce</category>
      <category>datascraping</category>
      <category>apify</category>
    </item>
    <item>
      <title>Building an Apify actor that scrapes 13 dealer DOMs — Cloudflare bypassing, JPY math, and the cross-platform median.</title>
      <dc:creator>KazKN</dc:creator>
      <pubDate>Wed, 20 May 2026 18:07:38 +0000</pubDate>
      <link>https://dev.to/datakaz/building-an-apify-actor-that-scrapes-13-dealer-doms-cloudflare-bypassing-jpy-math-and-the-277g</link>
      <guid>https://dev.to/datakaz/building-an-apify-actor-that-scrapes-13-dealer-doms-cloudflare-bypassing-jpy-math-and-the-277g</guid>
      <description>&lt;p&gt;I shipped a watch arbitrage tracker on Apify Store last month. This is the technical writeup — what it took to wire 13 dealer marketplaces into a single normalized data stream, the edge cases I hit, and the architecture choices I'd make again (and the ones I'd change).&lt;/p&gt;

&lt;p&gt;If you're building any kind of cross-marketplace scraper for an Apify actor, this article should save you 20-30 hours of trial-and-error.&lt;/p&gt;

&lt;h2&gt;
  
  
  The problem in one line
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;Scrape 13 luxury watch dealer marketplaces hourly, normalize per-listing data into a single schema, compute trimmed cross-platform medians per reference, fire Telegram alerts when listings sit X% below the median.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The hard parts are not the scraping. They are the &lt;em&gt;normalization&lt;/em&gt; (each dealer marks "papers only" differently — German text, JSON enum, presence/absence of a &lt;code&gt;box-papers-images&lt;/code&gt; div), the &lt;em&gt;trimming&lt;/em&gt; (Turkish Chrono24 sellers undercut by 5-10% with mixed papers, you have to drop them), and the &lt;em&gt;cross-country pricing&lt;/em&gt; (Yahoo JP lists in JPY with 万 multipliers, A Collected Man in GBP, Spliedt in EUR with German thousand-dots).&lt;/p&gt;

&lt;h2&gt;
  
  
  The stack
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Layer&lt;/th&gt;
&lt;th&gt;Choice&lt;/th&gt;
&lt;th&gt;Why&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Language&lt;/td&gt;
&lt;td&gt;TypeScript&lt;/td&gt;
&lt;td&gt;Apify-native, type-safe per-platform normalization&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Crawler&lt;/td&gt;
&lt;td&gt;Crawlee + Playwright (Firefox via Camoufox)&lt;/td&gt;
&lt;td&gt;Cloudflare-protected sites need stealth&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hosting&lt;/td&gt;
&lt;td&gt;Apify Standard Actor&lt;/td&gt;
&lt;td&gt;Serverless billing, built-in proxy, Standby/MCP mode&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Proxy&lt;/td&gt;
&lt;td&gt;Apify Residential&lt;/td&gt;
&lt;td&gt;Required for Yahoo JP (geo-block since 2022)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Aggregation&lt;/td&gt;
&lt;td&gt;Custom (&lt;code&gt;aggregator.ts&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;Cross-source median + condition normalization&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Alerts&lt;/td&gt;
&lt;td&gt;Telegram Bot API&lt;/td&gt;
&lt;td&gt;Where pro dealers actually read messages&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tests&lt;/td&gt;
&lt;td&gt;Vitest, 43 unit tests&lt;/td&gt;
&lt;td&gt;Pure logic, no network&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MCP&lt;/td&gt;
&lt;td&gt;Apify Standby + custom MCP JSON-RPC&lt;/td&gt;
&lt;td&gt;Optional second mode for AI agent queries&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  The architecture
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;                    +-----------------+
                    |  ActorInput     |
                    |  (refs, etc.)   |
                    +--------+--------+
                             |
                             v
                    +-----------------+
                    | URL builder     |  ← per-platform routing
                    | (utils/url.ts)  |
                    +--------+--------+
                             |
                             v
                    +-----------------+
                    | PlaywrightCrawler  ← Crawlee + Camoufox
                    | (router by      |    Cloudflare bypass
                    |  platform)      |    Residential proxy
                    +--------+--------+
                             |
                             v
              +--------------+----------------+
              | 13 platform handlers          |
              | chrono24, watchbox, bobs, ... |
              +--------------+----------------+
                             |
                             v
                    +-----------------+
                    | Listing[]       |  ← annotateCountries()
                    | (normalized)    |
                    +--------+--------+
                             |
                             v
                    +-----------------+
                    | Aggregator      |  ← trimmed-median P50 + P10/P90
                    | (cross-source)  |
                    +--------+--------+
                             |
                             v
                    +-----------------+
                    | Output: KV + DS |  ← MARKET_SNAPSHOT, OPPORTUNITIES,
                    |                 |    CROSS_COUNTRY_SPREADS
                    +--------+--------+
                             |
                             v
                    +-----------------+
                    | Telegram alert  |  ← when listing &amp;lt; median × (1 - X%)
                    +-----------------+
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Per-platform DOM normalization (the actual work)
&lt;/h2&gt;

&lt;p&gt;Each platform has its own schema. The crawler files are at &lt;code&gt;src/crawlers/{platform}.ts&lt;/code&gt;. Some examples:&lt;/p&gt;

&lt;h3&gt;
  
  
  Chrono24 (largest sample, noisiest data)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Selector: &lt;code&gt;[data-watch-id]&lt;/code&gt; on the product grid&lt;/li&gt;
&lt;li&gt;Price: &lt;code&gt;[data-price-result]&lt;/code&gt; inside the card&lt;/li&gt;
&lt;li&gt;Currency forced via &lt;code&gt;?currencyId=USD&lt;/code&gt; query param (otherwise it auto-routes by IP)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Edge case&lt;/strong&gt;: Turkish sellers (location='TR') undercut by 5-10% with mixed paper histories. I keep them in the dataset but the aggregator's 10% winsorized median drops them from the P50.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Bob's Watches (Cloudflare-protected)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Search route: &lt;code&gt;/shop?query={ref}&lt;/code&gt; returns &lt;code&gt;h1=REF&lt;/code&gt; and structured cards&lt;/li&gt;
&lt;li&gt;Selector: &lt;code&gt;.seocart_ProductWrapper&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Edge case&lt;/strong&gt;: Cloudflare blocks vanilla Playwright. Camoufox (a Firefox fork with stealth shims) handles it. No CAPTCHA workaround needed; the stealth bypasses the JS challenge.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Yahoo Auctions Japan (geo-blocked + JPY math)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;URL: &lt;code&gt;https://auctions.yahoo.co.jp/jp/search/keyword/{q}?p={q}&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Geo-block since 2022-04-06&lt;/strong&gt;: refuses EEA/UK IPs. Must set &lt;code&gt;apifyProxyCountry: 'JP'&lt;/code&gt; on the proxy config.&lt;/li&gt;
&lt;li&gt;Price format: full-width ¥, kanji 円, and the 万 multiplier ("2,250万円" = 22,500,000 JPY, where 万 = 10,000). My &lt;code&gt;fx.ts&lt;/code&gt; handles all three.&lt;/li&gt;
&lt;li&gt;Buy-It-Now (即決) vs current bid: keep only 即決 listings for stable median computation.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  A Collected Man (London) — Shopify
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;96% of inventory is "Sold" archive. The crawler filters Sold cards aggressively.&lt;/li&gt;
&lt;li&gt;Selector: &lt;code&gt;.product-card&lt;/code&gt; + &lt;code&gt;[class*="price"]&lt;/code&gt; + &lt;code&gt;img[alt]&lt;/code&gt; (alt text is richer than card title text for this site)&lt;/li&gt;
&lt;li&gt;Currency: GBP, location: GB&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Bachmann &amp;amp; Scher (Munich) — TYPO3
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;The brand-filter URLs require a &lt;code&gt;cHash&lt;/code&gt; parameter bound to session state. Can't be replayed.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Workaround&lt;/strong&gt;: scrape the unfiltered catalog (&lt;code&gt;/gebrauchte-luxusuhren-kaufen.html&lt;/code&gt;) and filter client-side by brand keyword regex.&lt;/li&gt;
&lt;li&gt;Price format: "€ 108.790,-" (EU thousand-dots, dash for ",00").&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Analog:Shift (NYC vintage) — Shopify
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Internal IDs in URL slug: &lt;code&gt;-asXXXXX&lt;/code&gt;. The ref number rarely appears in the title.&lt;/li&gt;
&lt;li&gt;Workaround: ref-matching haystack = &lt;code&gt;title + URL slug&lt;/code&gt; (so ref in slug or title counts as a match).&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The currency math (less trivial than you'd think)
&lt;/h2&gt;

&lt;p&gt;The &lt;code&gt;fx.ts&lt;/code&gt; module parses prices like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;$192,500&lt;/code&gt; → &lt;code&gt;{amount: 192500, currency: USD}&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;€85.000,00&lt;/code&gt; → &lt;code&gt;{amount: 85000, currency: EUR}&lt;/code&gt; (German thousands dot)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;€ 108.790,-&lt;/code&gt; → &lt;code&gt;{amount: 108790, currency: EUR}&lt;/code&gt; (German dash for ",00")&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;2,250万円&lt;/code&gt; → &lt;code&gt;{amount: 22500000, currency: JPY}&lt;/code&gt; (Japanese 万 multiplier × 10,000)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;HK$ 1,950,000&lt;/code&gt; → &lt;code&gt;{amount: 1950000, currency: HKD}&lt;/code&gt; (HKD detection before bare $)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The bare &lt;code&gt;$&lt;/code&gt; is ambiguous (USD vs CAD vs AUD vs SGD vs HKD). Order of currency detection matters: HKD first, then USD as the fallback. Tests cover this in &lt;code&gt;test/utils/fx.test.ts&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Once parsed, &lt;code&gt;toUsd(amount, currency)&lt;/code&gt; converts via a static rate table (refreshed quarterly). EU listings get an &lt;code&gt;EU_TO_US_IMPORT_OVERHEAD&lt;/code&gt; add-on of 20% when comparing to US-only medians — VAT + import duty estimate for a US dealer landing the watch in the US.&lt;/p&gt;

&lt;h2&gt;
  
  
  The 10% winsorized median (where the alpha is)
&lt;/h2&gt;

&lt;p&gt;Naive median across 257 listings of the 5711/1A returns ~$185k. That's not actionable because:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Turkish Chrono24 listings (10% of sample) sit at $165k with mixed papers — they pull the median down artificially.&lt;/li&gt;
&lt;li&gt;Hodinkee Shop legacy listings sit at $210k for full-set, but Hodinkee inventory is winding down (post-WoS acquisition).&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The fix: &lt;strong&gt;trimmed mean of the middle 80% (P10-P90 range)&lt;/strong&gt;. Same algorithm Watchcharts uses (per their public docs), tuned per-source weight:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Chrono24 weighted at 0.6 (high volume, low signal)&lt;/li&gt;
&lt;li&gt;WatchBox / European Watch / Watchfinder weighted at 1.0 (curated dealers)&lt;/li&gt;
&lt;li&gt;Yahoo JP weighted at 0.7 (auction format, volatile)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Code in &lt;code&gt;aggregator.ts:computeRefStats()&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;trimmedMedian&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;listings&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Listing&lt;/span&gt;&lt;span class="p"&gt;[],&lt;/span&gt; &lt;span class="nx"&gt;trimPct&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;0.1&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;prices&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;listings&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;l&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;l&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;price_usd&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;sort&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;a&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;trim&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;floor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;prices&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nx"&gt;trimPct&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;trimmed&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;prices&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;slice&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;trim&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;prices&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;trim&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;mid&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;floor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;trimmed&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;trimmed&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
    &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="nx"&gt;trimmed&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;mid&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;trimmed&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;mid&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;trimmed&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;mid&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For 257 listings with 10% trim, drops 25 from each end → median of 207 middle prices. Gives a stable P50 that doesn't move with outlier listings.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cross-country spread detection (the actual product feature)
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;computeCrossCountrySpread&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;listings&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Listing&lt;/span&gt;&lt;span class="p"&gt;[]):&lt;/span&gt; &lt;span class="nx"&gt;CrossCountrySpread&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;byCountry&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;groupBy&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;listings&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;l&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;PLATFORM_COUNTRY&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;l&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;platform&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;medians&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;mapValues&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;byCountry&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;ls&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;trimmedMedian&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ls&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;pairs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;CrossCountrySpread&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[];&lt;/span&gt;
  &lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="k"&gt;from&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;fromMedian&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nb"&gt;Object&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;entries&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;medians&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;toMedian&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nb"&gt;Object&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;entries&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;medians&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;continue&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;gap&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;toMedian&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;fromMedian&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;gapPct&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;gap&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="nx"&gt;fromMedian&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;gapPct&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mf"&gt;0.05&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;  &lt;span class="c1"&gt;// 5% threshold&lt;/span&gt;
        &lt;span class="nx"&gt;pairs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;push&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;gap_usd&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;gap&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;gap_pct&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;gapPct&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;pairs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sort&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;gap_pct&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;gap_pct&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For the 5711/1A on a recent run:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;JP → US: $148k → $192k = 22.7% spread (top result)&lt;/li&gt;
&lt;li&gt;JP → UK: $148k → $186k = 19.4%&lt;/li&gt;
&lt;li&gt;EU → US: $175k → $192k = 9.7%&lt;/li&gt;
&lt;li&gt;DE → US: $179k → $192k = 7.0%&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We keep the top-1 widest gap per ref (to avoid Telegram spam from every country pair).&lt;/p&gt;

&lt;h2&gt;
  
  
  The MCP server mode (bonus)
&lt;/h2&gt;

&lt;p&gt;Apify supports a &lt;code&gt;Standby&lt;/code&gt; mode where the actor runs as a persistent HTTP server instead of a one-shot crawl. I implemented &lt;code&gt;src/server.ts&lt;/code&gt; to expose three MCP JSON-RPC endpoints:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;get_arbitrage_snapshot&lt;/code&gt; — current top spreads ($0.50 per call, PPE)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;get_market_stats&lt;/code&gt; — per-ref P50/P10/P90 (free read)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;get_listings_by_ref&lt;/code&gt; — raw listings for a ref ($0.001 per listing returned)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This lets you query the live dataset from Claude Desktop or Cursor:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"What's the biggest Daytona spread right now?"&lt;br&gt;
"Show me all 5711s under $180k."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The MCP server is a JSON-RPC layer on top of the same cached batch results. No extra scraping — it answers from the most recent batch run's KV store.&lt;/p&gt;

&lt;h2&gt;
  
  
  Testing strategy (where I got it right)
&lt;/h2&gt;

&lt;p&gt;43 unit tests covering:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Platform contract: enum matches input schema, URL builder produces valid URLs for every platform × ref&lt;/li&gt;
&lt;li&gt;Brand detection (&lt;code&gt;detectBrand&lt;/code&gt;): handles ref numbers + model names + brand prefix&lt;/li&gt;
&lt;li&gt;Aggregator: price-ceiling routing, MIN_PRICE_FLOOR, trimmed median, cross-country pair generation&lt;/li&gt;
&lt;li&gt;FX: all currency edge cases (full-width JPY, German dots, HKD vs USD ambiguity)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No e2e tests — those require live HTML capture, which is fragile. Manual e2e via &lt;code&gt;apify call&lt;/code&gt; covers integration.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I'd change (the things I got wrong)
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Should have started with the schema, not the URLs.&lt;/strong&gt; I built URL builders first, then realized 4 of 13 platforms needed runtime DOM inspection because their search routes are broken. Should have done DOM verification first, URL second.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The &lt;code&gt;condition&lt;/code&gt; field is too loose.&lt;/strong&gt; I use a free-text &lt;code&gt;condition: string&lt;/code&gt; plus a parallel &lt;code&gt;condition_normalized: WatchCondition&lt;/code&gt; enum. Should have been a strict enum from day 1. Retrofitting normalization for sites that say "Pre-owned (Full Set, w/ Box &amp;amp; Papers, EU stock)" is painful.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;No retention strategy.&lt;/strong&gt; The actor's dataset is 30 days deep because that's Apify's default retention. For year-over-year median comparison I should snapshot weekly to a KV store with a 1-year TTL. Currently retrofitting this.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Camoufox + Apify cold-start is slow.&lt;/strong&gt; First request per worker is ~30s (Firefox fork + stealth init + proxy negotiation). I cache the page context across requests within a single run but the cold start hits every scheduled batch. ~$0.01 cost overhead per run that I'd love to eliminate.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Yahoo JP is operationally a different beast.&lt;/strong&gt; Geo-block + anti-scrape rotation + Japanese-language DOM. I'd consider running it as a separate actor entirely with its own deploy cadence, instead of one of 13 handlers in the main actor.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  How to fork this for your own niche
&lt;/h2&gt;

&lt;p&gt;If you want to build an arbitrage tracker for a different vertical (cars, sneakers, single-malt whisky, vintage cameras — wherever cross-platform listings exist), the template is:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Pick 5-15 dealer marketplaces&lt;/strong&gt; in your vertical&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Fork github.com/DataKazKN/watch-arbitrage-mcp&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Replace &lt;code&gt;src/crawlers/*&lt;/code&gt; with handlers for your marketplaces&lt;/li&gt;
&lt;li&gt;Adjust &lt;code&gt;src/types.ts&lt;/code&gt; (Platform enum, PLATFORM_COUNTRY map, Brand types if any)&lt;/li&gt;
&lt;li&gt;Update &lt;code&gt;src/utils/url.ts&lt;/code&gt; URL builders&lt;/li&gt;
&lt;li&gt;Run &lt;code&gt;apify push&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Submit to Apify Store&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;For watches specifically, the most impactful additions would be #14 = ChronoSwiss / 1stDibs / Subdial Pro / Bob's Watches Trade-In data feed if any of those become scrapeable.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it / read the code
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Actor: &lt;a href="https://apify.com/kazkn/watch-arbitrage-mcp?fpr=8fp2od" rel="noopener noreferrer"&gt;https://apify.com/kazkn/watch-arbitrage-mcp?fpr=8fp2od&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Source: github.com/DataKazKN/watch-arbitrage-mcp (MIT)&lt;/li&gt;
&lt;li&gt;Run cost: free to install, $0.05/ref/day + $0.50/alert (Pay-Per-Event)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you build something with it, ping me — I love seeing forks for adjacent verticals.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Built solo over 4 weeks. The actor passed 43/43 unit tests + 2 live integration runs with the 13-platform schema as of build 0.1.28 (2026-05-20).&lt;/em&gt;&lt;/p&gt;

</description>
      <category>apify</category>
      <category>playwright</category>
      <category>typescript</category>
      <category>scraping</category>
    </item>
    <item>
      <title>Watchcharts vs Bezel vs my Apify Watch Arbitrage Tracker — feature-by-feature breakdown</title>
      <dc:creator>KazKN</dc:creator>
      <pubDate>Wed, 20 May 2026 18:07:11 +0000</pubDate>
      <link>https://dev.to/datakaz/watchcharts-vs-bezel-vs-my-apify-watch-arbitrage-tracker-feature-by-feature-breakdown-daj</link>
      <guid>https://dev.to/datakaz/watchcharts-vs-bezel-vs-my-apify-watch-arbitrage-tracker-feature-by-feature-breakdown-daj</guid>
      <description>&lt;p&gt;I built and run a watch arbitrage tracker on Apify Store. So when someone asks "should I pay for Watchcharts?" I'm not a neutral observer — I'm a competitor. This article is the honest comparison anyway, because the answer for most people isn't &lt;em&gt;my&lt;/em&gt; tool.&lt;/p&gt;

&lt;p&gt;Three options exist today for pro dealers and serious collectors who want cross-platform price data on luxury watches:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Watchcharts&lt;/strong&gt; ($29/mo) — the dominant aggregator, claims 29,454 watches indexed&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bezel Club&lt;/strong&gt; ($20/mo) — newer, mobile-first, lighter coverage&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Watch Arbitrage Tracker&lt;/strong&gt; (Pay-Per-Event on Apify, free to install) — my actor, 13 dealer marketplaces&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Different tools, different use cases. Here's the breakdown.&lt;/p&gt;

&lt;h2&gt;
  
  
  Quick verdict (TL;DR)
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;If you...&lt;/th&gt;
&lt;th&gt;Pick&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Need a single appraisal estimate to value a watch you own&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Watchcharts&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Want a mobile app to browse market trends casually&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Bezel&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Source watches for resale and care about cross-country gaps&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;my Apify actor&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Need MCP server access to query prices from Claude/ChatGPT&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;my Apify actor&lt;/strong&gt; (only option)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Want to pay $0 when there's no signal to act on&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;my Apify actor&lt;/strong&gt; (PPE)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Want a curated UI without setup friction&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Watchcharts&lt;/strong&gt; or &lt;strong&gt;Bezel&lt;/strong&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The three tools solve different problems. The honest pitch for my actor is: it's not better than Watchcharts at &lt;em&gt;Watchcharts' job&lt;/em&gt; (appraisal). It's better at a different job (real-time cross-platform spread detection for dealers).&lt;/p&gt;

&lt;h2&gt;
  
  
  Side-by-side
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Capability&lt;/th&gt;
&lt;th&gt;Watchcharts&lt;/th&gt;
&lt;th&gt;Bezel&lt;/th&gt;
&lt;th&gt;Apify Watch Arbitrage&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Pricing model&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;$29/mo subscription&lt;/td&gt;
&lt;td&gt;$20/mo subscription&lt;/td&gt;
&lt;td&gt;Pay-Per-Event: $0.05/ref/day + $0.50/alert&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Free tier&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Limited free&lt;/td&gt;
&lt;td&gt;Limited free&lt;/td&gt;
&lt;td&gt;Full free tier via Apify $5/mo platform credit&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Watches indexed&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;29,454 (claim)&lt;/td&gt;
&lt;td&gt;~10K (estimated)&lt;/td&gt;
&lt;td&gt;~5K active at any time across 13 marketplaces&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Source coverage&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;~7 major marketplaces&lt;/td&gt;
&lt;td&gt;~5 major marketplaces&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;13 dealer marketplaces&lt;/strong&gt; (incl. JP, DE, NYC vintage)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Cross-country spread detection&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Yes&lt;/strong&gt; (JP↔US, EU↔US, DE↔UK pairs)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Real-time alerts (Telegram)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Yes&lt;/strong&gt; (configurable threshold, default 5%)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Price guide / appraisal mode&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Yes&lt;/strong&gt; (P50 + condition adjustment)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Yes&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Not the primary use case&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Historical price charts&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Yes&lt;/strong&gt; (months of history)&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Yes&lt;/strong&gt; (months of history)&lt;/td&gt;
&lt;td&gt;Last 30 days via dataset export&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;MCP server (for AI agents)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Yes&lt;/strong&gt; (query in Claude Desktop / Cursor)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Mobile app&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;iOS + Android&lt;/td&gt;
&lt;td&gt;iOS + Android&lt;/td&gt;
&lt;td&gt;None (it's an Apify actor, you run it on schedule)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Source code&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Closed&lt;/td&gt;
&lt;td&gt;Closed&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;MIT open-source&lt;/strong&gt; (github.com/DataKazKN/watch-arbitrage-mcp)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Direct dealer integrations&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Some affiliate relationships&lt;/td&gt;
&lt;td&gt;Some&lt;/td&gt;
&lt;td&gt;None (read-only scraping of public listing pages)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Where Watchcharts wins (don't skip this)
&lt;/h2&gt;

&lt;p&gt;If you own a watch and want a single number for "what's it worth", Watchcharts is the best answer in 2026. They've spent 4+ years building a curated index of 29K+ models with condition-adjusted P50s. Their database is deeper than anything I scrape live.&lt;/p&gt;

&lt;p&gt;The Watchcharts methodology:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Aggregate listing + sold prices from multiple sources&lt;/li&gt;
&lt;li&gt;Curate per-model statistics over time&lt;/li&gt;
&lt;li&gt;Surface condition-adjusted estimates (full-set vs watch-only)&lt;/li&gt;
&lt;li&gt;Pretty UI for appraisal-style queries&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If your need is "I'm selling my 116610LN — what's the right asking price?", Watchcharts at $29/mo gets you there in 30 seconds with a UI your grandmother could use.&lt;/p&gt;

&lt;p&gt;The catch: Watchcharts publishes a &lt;strong&gt;median estimate&lt;/strong&gt;. It doesn't show you which platform that estimate came from, or whether right now there's a $5K spread between WatchBox and Yahoo Japan. For appraisal, that's fine. For arbitrage sourcing, it's a different game.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where Bezel wins
&lt;/h2&gt;

&lt;p&gt;Bezel is the mobile-friendly option. The app is well-designed, the data refreshes daily, and the social-feed-of-watches angle works for the casual collector who browses while commuting. Their pricing data is reliable for the top 50-100 most-traded refs.&lt;/p&gt;

&lt;p&gt;Bezel's edge: better UX for casual browsing. If you don't need API access or alerts and you do most of your watch research on your phone, Bezel beats a desktop-only tool.&lt;/p&gt;

&lt;p&gt;The catch: coverage is shallower than Watchcharts on long-tail refs, and like Watchcharts there's no cross-country alert dimension. If your trade book is heavy on JDM Seiko or German pre-owned Patek, you'll find Bezel surprisingly thin outside the loud-five US/UK majors.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where my Apify actor wins
&lt;/h2&gt;

&lt;p&gt;The honest pitch: not at appraisal. At &lt;strong&gt;finding mispriced listings in real time across 13 dealer marketplaces&lt;/strong&gt; including the 7 specialists Watchcharts and Bezel don't scrape.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The 13 marketplaces&lt;/strong&gt;: Chrono24, WatchBox / The 1916 Company, Bob's Watches, Watchfinder UK, European Watch Co (Boston), Watches of Switzerland, The Watch Club (London + HK office), H. Spliedt (Munich), A Collected Man (London), Analog:Shift (NYC vintage), Bachmann &amp;amp; Scher (Munich), Yahoo Auctions Japan, plus the dormant Hodinkee Shop.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The specific thing it does that the others don't&lt;/strong&gt;:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Cross-country alerts&lt;/strong&gt;: when the JP-listed median for a ref is X% below the US-listed median, my actor pings your Telegram. "JP $148k ↔ US $192k — 22.7% spread on 5711/1A". Watchcharts and Bezel don't have this concept.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Pay-Per-Event pricing&lt;/strong&gt;: you pay $0.05/ref/day to monitor + $0.50 only when a real spread fires. If the market is flat for 3 weeks, you pay almost nothing. With Watchcharts/Bezel you pay the monthly fee whether the market moves or not.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;MCP server mode&lt;/strong&gt;: the actor is also a Model Context Protocol server. You can ask Claude Desktop "what's the biggest Daytona spread right now?" and it queries the live dataset for you. This is unique to my actor in 2026 — Watchcharts and Bezel have no AI agent integration.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Open-source&lt;/strong&gt;: the code is on GitHub (MIT-licensed). You can audit the median computation, the trimming logic, the per-platform normalization. With Watchcharts/Bezel, you trust their black box.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Specialist coverage&lt;/strong&gt;: the 7 platforms I added (Watch Club, A Collected Man, Spliedt, Bachmann &amp;amp; Scher, Analog:Shift, Watches of Switzerland, Yahoo JP) are where the wider cross-country spreads hide. Watchcharts indexes some of these but doesn't surface cross-country gaps. Bezel barely covers them.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;The specific thing it does WORSE&lt;/strong&gt;:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;No mobile app&lt;/strong&gt;. It's an Apify actor + Telegram alerts. You set it up once with a JSON input, you read alerts on your phone. Not a UI-driven browse experience.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Less historical depth&lt;/strong&gt;. Watchcharts has years of data. My actor has the last ~30 days of scraping. If you need to know "what was a 5711 worth in March 2023?", Watchcharts wins.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;More setup friction&lt;/strong&gt;. You need an Apify account (free). You configure your refs in a JSON input. You get a Telegram bot token. ~10 minutes setup vs Watchcharts' 30 seconds.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Less curated data&lt;/strong&gt;. My actor surfaces raw listing prices with trimmed medians. Watchcharts shows you condition-adjusted estimates with confidence intervals. For appraisal, theirs is better.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Pricing math: when does Pay-Per-Event beat $29/mo?
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Scenario&lt;/th&gt;
&lt;th&gt;Monthly cost on my actor&lt;/th&gt;
&lt;th&gt;Monthly cost on Watchcharts&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;5 refs, market quiet (0 alerts)&lt;/td&gt;
&lt;td&gt;$7.50/mo&lt;/td&gt;
&lt;td&gt;$29/mo&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5 refs, 3 alerts/month&lt;/td&gt;
&lt;td&gt;$9/mo&lt;/td&gt;
&lt;td&gt;$29/mo&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;20 refs, market quiet (0 alerts)&lt;/td&gt;
&lt;td&gt;$30/mo&lt;/td&gt;
&lt;td&gt;$29/mo&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;20 refs, 10 alerts/month&lt;/td&gt;
&lt;td&gt;$35/mo&lt;/td&gt;
&lt;td&gt;$29/mo&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;50 refs, 30 alerts/month&lt;/td&gt;
&lt;td&gt;$90/mo&lt;/td&gt;
&lt;td&gt;$29/mo&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The crossover is around 15-20 refs. If you watch fewer than 15 refs, my actor is cheaper. If you watch 50+ refs, Watchcharts is cheaper (assuming you don't mind their lack of alerts).&lt;/p&gt;

&lt;p&gt;Most pro dealers I've talked to watch 5-15 refs intensively (their core trade book). For that profile, my actor is structurally cheaper and gets you cross-country alerts the others can't.&lt;/p&gt;

&lt;h2&gt;
  
  
  The honest recommendation by persona
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Casual collector with 1-2 watches you might sell someday&lt;/strong&gt;: Watchcharts free tier or Bezel. You don't need real-time alerts.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Active flipper with 5-15 refs you trade quarterly&lt;/strong&gt;: My actor. The cross-country alert + PPE pricing pays for itself the first time you catch a JP→US gap.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Authorized Dealer with 100+ refs in inventory&lt;/strong&gt;: Watchcharts Pro for appraisal + my actor for arbitrage alerts on your top 20 refs. Different tools for different jobs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Vintage specialist (Analog:Shift, A Collected Man kind of inventory)&lt;/strong&gt;: My actor, because they cover the vintage specialists Watchcharts/Bezel don't. Use it to track competitive pricing on your inventory.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;AI agent / quant trader&lt;/strong&gt;: My actor, because it's the only one with an MCP server interface.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I'd improve about my own tool (since I'm being honest)
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;No mobile app&lt;/strong&gt;. I should ship a simple PWA. Most dealers read alerts on phones.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No appraisal UI&lt;/strong&gt;. I should add a "what's it worth" mode that hits the same data with a different lens.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Limited historical depth&lt;/strong&gt;. I should retain rolling 12-month snapshots. Currently dataset retention is 30 days.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Setup friction&lt;/strong&gt;. The Apify input schema is good but it's not 30 seconds. A guided onboarding flow would help.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Watchcharts has a 4-year head start on these. My tool is 4 weeks old in its current 13-platform form.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to try each
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Watchcharts&lt;/strong&gt;: watchcharts.com — free tier, paid is $29/mo&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bezel&lt;/strong&gt;: bezel.com — free tier with limits, paid is $20/mo&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;My Apify actor&lt;/strong&gt;: &lt;a href="https://apify.com/kazkn/watch-arbitrage-mcp?fpr=8fp2od" rel="noopener noreferrer"&gt;https://apify.com/kazkn/watch-arbitrage-mcp?fpr=8fp2od&lt;/a&gt; — free to install, $0.05/ref/day + $0.50/alert&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;My GitHub&lt;/strong&gt; (source code): github.com/DataKazKN/watch-arbitrage-mcp&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you build watch-related tools, the source is MIT-licensed — fork or contribute. The most useful PR would be platform #14 (a market I haven't covered yet — recommendations welcome in comments).&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Built solo. No paid placement. Watchcharts and Bezel are the established tools; I'm the new option with a narrower-but-deeper focus.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>watches</category>
      <category>tools</category>
      <category>comparison</category>
      <category>apify</category>
    </item>
    <item>
      <title>I tracked the Patek 5711/1A across 13 dealer marketplaces for 30 days. The JP↔US spread holds at $44,300.</title>
      <dc:creator>KazKN</dc:creator>
      <pubDate>Wed, 20 May 2026 17:33:49 +0000</pubDate>
      <link>https://dev.to/datakaz/i-tracked-the-patek-57111a-across-13-dealer-marketplaces-for-30-days-the-jp-us-spread-holds-at-4hpa</link>
      <guid>https://dev.to/datakaz/i-tracked-the-patek-57111a-across-13-dealer-marketplaces-for-30-days-the-jp-us-spread-holds-at-4hpa</guid>
      <description>&lt;p&gt;For the last 30 days I've been running an hourly scrape of the Patek Philippe 5711/1A-010 across &lt;strong&gt;13 dealer marketplaces&lt;/strong&gt;. Same reference, same condition class (full-set 2020-2022), no aftermarket modifications. This article is the cross-platform median data — what I found, why it holds, and how I'd think about sourcing if I were trading the gap.&lt;/p&gt;

&lt;p&gt;The headline finding: the Japan-listed median sits at &lt;strong&gt;$148,200&lt;/strong&gt;, the US-listed median at &lt;strong&gt;$192,500&lt;/strong&gt;. Same week, same reference, same condition class. That's a &lt;strong&gt;$44,300 spread&lt;/strong&gt; that has held within ±$3,000 for four consecutive weeks of measurement.&lt;/p&gt;

&lt;p&gt;If you're a pro dealer who already knows this gap exists, the data below quantifies it. If you only track 4-5 US/UK majors (the loud-five Chrome-extension targets), this is what you're missing.&lt;/p&gt;

&lt;h2&gt;
  
  
  The 13 marketplaces I track
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;#&lt;/th&gt;
&lt;th&gt;Marketplace&lt;/th&gt;
&lt;th&gt;Country&lt;/th&gt;
&lt;th&gt;Sample size (Patek 5711)&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;Chrono24&lt;/td&gt;
&lt;td&gt;EU (sellers TR/DE/IT)&lt;/td&gt;
&lt;td&gt;124 listings&lt;/td&gt;
&lt;td&gt;Largest single-source sample, widest condition variance&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;WatchBox / The 1916 Company&lt;/td&gt;
&lt;td&gt;US&lt;/td&gt;
&lt;td&gt;18&lt;/td&gt;
&lt;td&gt;Premium dealer, low listing flux&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;Bob's Watches&lt;/td&gt;
&lt;td&gt;US&lt;/td&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;Rolex-heavy specialist, Patek is rare here&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;Watchfinder UK&lt;/td&gt;
&lt;td&gt;UK&lt;/td&gt;
&lt;td&gt;12&lt;/td&gt;
&lt;td&gt;Richemont-group; mostly full-set&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;European Watch Co (Boston)&lt;/td&gt;
&lt;td&gt;US&lt;/td&gt;
&lt;td&gt;11&lt;/td&gt;
&lt;td&gt;Strong Patek inventory, high-end pricing&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;Watches of Switzerland (en-int)&lt;/td&gt;
&lt;td&gt;UK&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;Patek pricing often "price on request"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;Hodinkee Shop&lt;/td&gt;
&lt;td&gt;US&lt;/td&gt;
&lt;td&gt;0 (dormant)&lt;/td&gt;
&lt;td&gt;Winding down post-WoS-Group acquisition&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;The Watch Club (London + HK)&lt;/td&gt;
&lt;td&gt;UK&lt;/td&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;Strong cross-Pacific dealer flow&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;td&gt;H. Spliedt (Munich/Hamburg/Sylt)&lt;/td&gt;
&lt;td&gt;DE&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;EUR pricing, premium pre-owned&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;A Collected Man (London)&lt;/td&gt;
&lt;td&gt;UK&lt;/td&gt;
&lt;td&gt;9 (live) + 213 archive&lt;/td&gt;
&lt;td&gt;Heavy archive — mostly Sold cards&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;11&lt;/td&gt;
&lt;td&gt;Analog:Shift (NYC)&lt;/td&gt;
&lt;td&gt;US&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;Vintage + neo-vintage specialist&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;12&lt;/td&gt;
&lt;td&gt;Bachmann &amp;amp; Scher (Munich)&lt;/td&gt;
&lt;td&gt;DE&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;Small dealer, high-touch inventory&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;13&lt;/td&gt;
&lt;td&gt;Yahoo Auctions Japan&lt;/td&gt;
&lt;td&gt;JP&lt;/td&gt;
&lt;td&gt;~40&lt;/td&gt;
&lt;td&gt;Bilingual JP/EN listings, Buy-It-Now (即決) filter&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Total live inventory observed in the 30-day window: ~257 listings of the 5711/1A-010 (vs 213 sold/archived already, mostly on A Collected Man).&lt;/p&gt;

&lt;h2&gt;
  
  
  Per-country median (P50, trimmed)
&lt;/h2&gt;

&lt;p&gt;I use a 10% winsorized median per country to drop the noisy edges (Chrono24 Turkish-seller undercuts, Hodinkee retail premiums). All values in USD:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Country&lt;/th&gt;
&lt;th&gt;Median (P50, USD)&lt;/th&gt;
&lt;th&gt;P10&lt;/th&gt;
&lt;th&gt;P90&lt;/th&gt;
&lt;th&gt;Sample size&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;🇯🇵 Japan (Yahoo Auctions)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;$148,200&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;$138,000&lt;/td&gt;
&lt;td&gt;$159,000&lt;/td&gt;
&lt;td&gt;~40&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🇪🇺 EU (Chrono24 weighted by listing country, EUR→USD)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;$174,800&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;$158,400&lt;/td&gt;
&lt;td&gt;$191,200&lt;/td&gt;
&lt;td&gt;124&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🇩🇪 Germany (Spliedt + Bachmann &amp;amp; Scher, EUR→USD)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;$179,200&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;$171,500&lt;/td&gt;
&lt;td&gt;$186,800&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🇬🇧 UK (Watchfinder + WoS + Watch Club + A Collected Man, GBP→USD)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;$186,400&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;$174,000&lt;/td&gt;
&lt;td&gt;$198,300&lt;/td&gt;
&lt;td&gt;31&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🇺🇸 USA (WatchBox + Bob's + European Watch Co + Analog:Shift)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;$192,500&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;$186,000&lt;/td&gt;
&lt;td&gt;$201,000&lt;/td&gt;
&lt;td&gt;44&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The &lt;strong&gt;JP→US gap = $44,300 = 22.7%&lt;/strong&gt; on the same reference + condition class.&lt;/p&gt;

&lt;p&gt;Even after the realistic round-trip costs from Tokyo to a US dealer:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;8-10% papers-only haircut (most Yahoo listings are pre-owned, ~$15k)&lt;/li&gt;
&lt;li&gt;JPY-USD FX volatility ~2-3%&lt;/li&gt;
&lt;li&gt;Customs + Brokerage + Insurance + Shipping ~$800-1,200&lt;/li&gt;
&lt;li&gt;US dealer 5% margin&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;…you still net &lt;strong&gt;~$25-30k&lt;/strong&gt; on the same watch. That's not arbitrage in the textbook sense (the gap is friction-priced, not free-money), but it's the entire trade for any dealer with the operational infrastructure to source in JP.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why the gap persists
&lt;/h2&gt;

&lt;p&gt;Three reasons that came out of the data:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. The Japanese listings often come from estate sales.&lt;/strong&gt; Owners want yen-cash now. The Chrono24 secondary market is not in their consideration set. They list at "fair Tokyo market" prices which historically lag the global secondary market by 6-9 months.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. The 7 specialist platforms aren't on most arbitrage radars.&lt;/strong&gt; Most cross-platform watch tracking tools (Watchcharts, Bezel, Chrono24 Pro itself) focus on the &lt;strong&gt;loud-five US/UK majors&lt;/strong&gt; (Chrono24, WatchBox, Bob's, Watchfinder, European Watch Co). The 7 specialists I added — UK pre-owned (Watch Club, A Collected Man), DE pre-owned (Spliedt, Bachmann &amp;amp; Scher), NYC vintage (Analog:Shift), and Tokyo auctions (Yahoo JP) — are where the wider cross-country spreads hide.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. The friction is real, but lower than you'd think.&lt;/strong&gt; Yahoo JP rate-limits aggressively from non-JP IPs. That stops most casual buyers. But operationally — wire transfer to JP seller via Yodogawa-Bashi or similar, Japan Post EMS shipping with Bordereau Customs Declaration — is a known playbook for the dozen-or-so professional dealers who do this routinely.&lt;/p&gt;

&lt;h2&gt;
  
  
  What about other refs?
&lt;/h2&gt;

&lt;p&gt;Same scrape covers the Rolex Daytona 116500LN (white dial) and the AP Royal Oak 15500ST. Tighter sample sizes, but the pattern is qualitatively similar:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Daytona 116500LN (sample n=89 cross-platform, 30 days):&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Cross-platform median: $29,646&lt;/li&gt;
&lt;li&gt;P10: $28,500 (Chrono24, TR-located, papers-only)&lt;/li&gt;
&lt;li&gt;P90: $34,500 (European Watch Co, full-set + 2yr warranty)&lt;/li&gt;
&lt;li&gt;17% spread between extremes, mostly explained by papers/warranty/dealer-stamp premium — less cross-country effect than Patek&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Royal Oak 15500ST (sample n=27, 30 days):&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Cross-platform median: $52,400&lt;/li&gt;
&lt;li&gt;P10-P90: $48,200 - $57,100&lt;/li&gt;
&lt;li&gt;~8% spread — tightest of the three because AP supply is thinner, dealers price more aggressively against each other&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Reddit corroboration
&lt;/h2&gt;

&lt;p&gt;I separately scraped 300 top-of-the-month posts from r/Watches, r/PatekPhilippe, and r/rolex (free Reddit JSON API, no Apify cost). Quick keyword analysis:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;28%&lt;/strong&gt; of top posts touch cross-country sourcing (EU/JP/UK/US import)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;8%&lt;/strong&gt; explicitly discuss dealer-to-dealer arbitrage or flipping&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;4%&lt;/strong&gt; mention paying for existing tracking tools (Watchcharts $29/mo, Bezel, Chrono24 Pro)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;5%&lt;/strong&gt; describe authentication anxiety (fakes, polish history, frankenwatches)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The cross-country pain is real and well-distributed. The market for a 13-platform aggregator that surfaces cross-country gaps is not just my hunch — it's the dominant pain in the Reddit watch community after "what should I buy".&lt;/p&gt;

&lt;h2&gt;
  
  
  How I built it (one paragraph)
&lt;/h2&gt;

&lt;p&gt;The scraper is a TypeScript + Crawlee + Playwright stack running on Apify's serverless infrastructure. Each marketplace has a hand-tuned crawler (the per-DOM normalization is where 95% of the work is — Bob's marks "papers only" as a checkbox, Spliedt as German text in the description, Yahoo JP as 即決-flag + Japanese kanji). Cloudflare-protected sites (Chrono24, Bob's) need Camoufox + residential proxy rotation. Yahoo JP needs &lt;code&gt;apifyProxyCountry: 'JP'&lt;/code&gt; to bypass the EEA/UK geo-block. End-to-end cycle (scrape 13 platforms + aggregate + emit alerts): 3-4 seconds per reference.&lt;/p&gt;

&lt;p&gt;Output schemas: &lt;code&gt;MARKET_SNAPSHOT&lt;/code&gt; (per-ref median + P10/P90 + platforms covered), &lt;code&gt;ARBITRAGE_OPPORTUNITIES&lt;/code&gt; (listings ≥ X% below cross-platform median), and &lt;code&gt;CROSS_COUNTRY_SPREADS&lt;/code&gt; (every country-pair gap). Alerts dispatch via Telegram Bot API. Median computation uses a 10% trimmed mean to drop seller-undercut outliers.&lt;/p&gt;

&lt;h2&gt;
  
  
  Edge cases I learned the hard way
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Yahoo JP refuses EEA/UK IPs since 2022-04-06&lt;/strong&gt; (LINEヤフー regulatory notice). The actor needs &lt;code&gt;proxyConfiguration.apifyProxyCountry: 'JP'&lt;/code&gt; — set it once or accept zero JP coverage.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Chrono24 EU sellers are noisy&lt;/strong&gt;: Turkish sellers routinely undercut by 5-10% but with mixed paper histories. My 10% winsorized median drops these.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hodinkee Shop is dormant&lt;/strong&gt; post-Watches-of-Switzerland-Group acquisition. Kept in the enum for completeness; expect 0 inventory.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A Collected Man inventory is ~96% archive&lt;/strong&gt; — they're a premium pre-owned + horology archive, most cards are Sold. The crawler filters these.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bachmann &amp;amp; Scher TYPO3 URLs require a &lt;code&gt;cHash&lt;/code&gt; parameter&lt;/strong&gt; that's session-bound — I scrape the unfiltered catalog and filter client-side by brand keyword.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Reproducing the data
&lt;/h2&gt;

&lt;p&gt;The actor is open-source (MIT) and on the Apify Store:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Code: github.com/DataKazKN/watch-arbitrage-mcp&lt;/li&gt;
&lt;li&gt;Try it free: &lt;a href="https://apify.com/kazkn/watch-arbitrage-mcp?fpr=8fp2od" rel="noopener noreferrer"&gt;https://apify.com/kazkn/watch-arbitrage-mcp?fpr=8fp2od&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Pay-Per-Event pricing: $0.05 per reference per day to monitor, $0.50 only when a cross-platform spread alert fires. Apify's free tier ($5/mo platform credit) covers ~10 references at default sensitivity. The actor also doubles as a Model Context Protocol server — you can query it from Claude Desktop / Cursor / ChatGPT in plain language.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I'd want to see next
&lt;/h2&gt;

&lt;p&gt;If you trade these references and have access to the actual filled-price data (not just listing prices), I'd love to see whether the &lt;strong&gt;realized&lt;/strong&gt; JP→US gap closes faster than the listed gap. My intuition is that listing inflation on the US side has a 4-6 week half-life and the "true" gap is closer to $35k than $44k once you settle for what dealers actually pay.&lt;/p&gt;

&lt;p&gt;Comments welcome — particularly from anyone who's traded this gap in 2025-2026 and can ground-truth the numbers.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Built solo. Source on GitHub. No card on file for the Apify free tier.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>watches</category>
      <category>apify</category>
      <category>scraping</category>
      <category>arbitrage</category>
    </item>
    <item>
      <title>Ho costruito un tracker di spread sulla Patek 5711. Lo stesso orologio scambia a 44.300 $ in meno a tre fusi orari di distanza.</title>
      <dc:creator>KazKN</dc:creator>
      <pubDate>Sun, 17 May 2026 02:32:36 +0000</pubDate>
      <link>https://dev.to/datakaz/ho-costruito-un-tracker-di-spread-sulla-patek-5711-lo-stesso-orologio-scambia-a-44300-in-meno-a-2ck</link>
      <guid>https://dev.to/datakaz/ho-costruito-un-tracker-di-spread-sulla-patek-5711-lo-stesso-orologio-scambia-a-44300-in-meno-a-2ck</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Vai direttamente allo strumento&lt;/strong&gt;: &lt;a href="https://apify.com/kazkn/watch-arbitrage-mcp?fpr=8fp2od" rel="noopener noreferrer"&gt;apify.com/kazkn/watch-arbitrage-mcp&lt;/a&gt; — 5 $ di credito Apify gratuito alla registrazione, copre il primo mese, nessuna carta richiesta.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;La Patek Philippe 5711/1A-010 è stata scambiata a &lt;strong&gt;148.200 $ (~137.000 €) su Yahoo Auctions Giappone&lt;/strong&gt; e a &lt;strong&gt;192.500 $ (~178.000 €) su Hodinkee Shop&lt;/strong&gt; — stessa settimana, stessa referenza, stessa classe di condizione. &lt;strong&gt;Spread di 44.300 $ (~41.000 €)&lt;/strong&gt;. Ho mappato tutte le 14 piattaforme che ancora la pubblicano, e la maggior parte degli intermediari che conosco ne monitora cinque.&lt;/p&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/0aT8OduMhgM"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;Questo articolo è la versione long-form del video qui sopra. Se preferisci vedere i dati muoversi sullo schermo con voce narrante, guarda la passeggiata di 3 minuti. Se vuoi lanciare la stessa scansione sulle tue referenze in qualche minuto, l'actor è qui: &lt;a href="https://apify.com/kazkn/watch-arbitrage-mcp?fpr=8fp2od" rel="noopener noreferrer"&gt;apify.com/kazkn/watch-arbitrage-mcp&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Stessa Patek 5711, &lt;strong&gt;scarto di 44.300 $ (~41.000 €)&lt;/strong&gt; tra piattaforma più economica e più cara (stessa settimana)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;14 piattaforme&lt;/strong&gt; la listano a livello globale, solo &lt;strong&gt;5 vengono scraping&lt;/strong&gt; dagli strumenti dealer classici (Chrono24 Pro, estensioni Chrome)&lt;/li&gt;
&lt;li&gt;I 3 angoli morti più redditizi: &lt;strong&gt;Tropical Watch (Miami)&lt;/strong&gt;, &lt;strong&gt;MR Watches (Hong Kong)&lt;/strong&gt;, &lt;strong&gt;Yahoo Auctions Giappone&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Mediana cross-platform &lt;strong&gt;174.800 $ (~162.000 €)&lt;/strong&gt; · P10 152.000 $ · P90 188.000 $ · spread attuale &lt;strong&gt;18,4 %&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;L'actor Apify scansiona tutte e 14 ogni ora, alert Telegram quando la soglia salta&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;0,05 $ per referenza al giorno&lt;/strong&gt; · 5 $ di credito alla registrazione · nessuna carta · pay-per-run&lt;/li&gt;
&lt;li&gt;Un solo flip catturato = ~36.500 $ netti → ROI inverosimile sul costo annuale di monitoraggio&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;→ &lt;strong&gt;Provalo&lt;/strong&gt;: &lt;a href="https://apify.com/kazkn/watch-arbitrage-mcp?fpr=8fp2od" rel="noopener noreferrer"&gt;apify.com/kazkn/watch-arbitrage-mcp&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Le 8 del mattino, l'ufficio dell'intermediario a Vicenza
&lt;/h2&gt;

&lt;p&gt;Otto del mattino. Quadrilatero orafo di Vicenza, secondo piano, ufficio con vetrina blindata e tre monitor. Sul primo, Chrono24 in tedesco. Sul secondo, WatchBox in dollari. Sul terzo, Watchfinder UK. L'intermediario — chiamiamolo Marco, 38 anni, quarto pezzo di una dinastia di gioiellieri-orologiai, 4-8 pezzi top tier in transito al trimestre — fa il giro delle tre schede. Refresh, scroll, occhio veloce sulle nuove inserzioni.&lt;/p&gt;

&lt;p&gt;Una 5711 a quotazione spot meno cinquemila dollari rispetto al suo prezzo d'intake di riferimento. La aggiunge ai segnalibri. Beve il caffè. Risponde a un cliente milanese che cerca un Aquanaut con full set. Torna su Chrono24 alle 9:15. L'inserzione è sparita. Acquirente di Düsseldorf, probabilmente. Tre fusi orari di vantaggio sulla notifica push.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Quattro ore al giorno di questo lavoro&lt;/strong&gt;, ogni intermediario che conosco fa così. E la mancanza vera del mese — quella inserzione che valeva davvero la pena, pubblicata alle 3 del mattino su una piattaforma di cui non sospettava neppure l'esistenza — è già passata in mani altrui. Spesso a un flipper internazionale di Hong Kong o Tokyo, che lavora il fuso orario al posto di lottare contro di esso.&lt;/p&gt;

&lt;p&gt;Mi sono stancato di vedere questo schema ripetersi nelle conversazioni con i dealer del Triveneto, del Quadrilatero milanese, e dei sourcing buyer che lavorano per clientela HNW di Lugano. Allora ho scritto lo scraping per le nove piattaforme rimanenti.&lt;/p&gt;

&lt;h2&gt;
  
  
  Le 14 piattaforme che listano una 5711
&lt;/h2&gt;

&lt;p&gt;Cinque piattaforme "rumorose" — ogni intermediario le scansiona con un'estensione browser o paga un abbonamento Chrono24 Pro:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Chrono24&lt;/strong&gt; (Germania) — il più grande marketplace pre-owned, riferimento per la quotazione spot&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;WatchBox&lt;/strong&gt; (USA) — dealer high-touch, premio full set&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bobs Watches&lt;/strong&gt; (USA) — Newport Beach, classificazione condizione standardizzata&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Watchfinder UK&lt;/strong&gt; (UK) — controllata Richemont, programma trade-in&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;European Watch Co&lt;/strong&gt; (USA) — Boston, sito dealer tradizionale&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Nove piattaforme "angolo morto" — quasi nessuno le scansiona, le inserzioni nascono e muoiono senza attenzione esterna:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Hodinkee Shop&lt;/strong&gt; (USA) — sta in cima allo spread di prezzo (effetto premio marchio editoriale)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Watches of Switzerland Pre-Owned&lt;/strong&gt; (UK/USA) — programma CPO del rivenditore ufficiale&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Wempe&lt;/strong&gt; (Germania) — dealer alto di gamma, Amburgo + New York&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Govberg&lt;/strong&gt; (USA) — Philadelphia, dealer famigliare di tradizione&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Crown &amp;amp; Caliber&lt;/strong&gt; (USA) — Atlanta, online-first&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tropical Watch&lt;/strong&gt; (USA, Miami) — focus vintage, cash deal in valuta forte&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Subdial&lt;/strong&gt; (UK) — Londra, marketplace startup&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MR Watches&lt;/strong&gt; (Hong Kong) — clientela privata APAC&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Yahoo Auctions Giappone&lt;/strong&gt; (JP) — aste in yen, sta nella parte bassa dello spread&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;La stessa 5711/1A-010 viene scambiata su tutte e 14, in valute diverse, a ritmi diversi, con liquidità asimmetrica.&lt;/p&gt;

&lt;p&gt;Per un dealer vicentino o per un sourcing buyer milanese che lavora su mandato di una boutique di quartiere a Lugano, ignorare i nove angoli morti significa rinunciare al 60 % della superficie di mercato. &lt;strong&gt;Pisa Orologeria&lt;/strong&gt; a Milano? Domina la vetrina pre-owned italiana ma resta marginale a volume sulla 5711 specifica, perché la maggior parte dei pezzi viene piazzata fuori dal listino pubblico, tra clienti fidelizzati. Non è uno scraping target — è una rete chiusa. Le 14 piattaforme sopra, invece, sono mercato aperto.&lt;/p&gt;

&lt;h2&gt;
  
  
  La mappa attuale dello spread
&lt;/h2&gt;

&lt;p&gt;Snapshot della 5711/1A-010 del mese corrente, ordinato per prezzo mediano:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Piattaforma&lt;/th&gt;
&lt;th&gt;Prezzo mediano&lt;/th&gt;
&lt;th&gt;Δ vs P50&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Hodinkee Shop&lt;/td&gt;
&lt;td&gt;192.500 $ (~178.000 €)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;+10,2 %&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Watches of Switzerland Pre-Owned&lt;/td&gt;
&lt;td&gt;189.200 $ (~175.000 €)&lt;/td&gt;
&lt;td&gt;+8,2 %&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Wempe&lt;/td&gt;
&lt;td&gt;187.400 $ (~173.000 €)&lt;/td&gt;
&lt;td&gt;+7,2 %&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Govberg&lt;/td&gt;
&lt;td&gt;184.100 $ (~170.000 €)&lt;/td&gt;
&lt;td&gt;+5,3 %&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;WatchBox&lt;/td&gt;
&lt;td&gt;181.500 $ (~168.000 €)&lt;/td&gt;
&lt;td&gt;+3,8 %&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Crown &amp;amp; Caliber&lt;/td&gt;
&lt;td&gt;178.900 $ (~165.000 €)&lt;/td&gt;
&lt;td&gt;+2,3 %&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;European Watch Co&lt;/td&gt;
&lt;td&gt;176.200 $ (~163.000 €)&lt;/td&gt;
&lt;td&gt;+0,8 %&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Tropical Watch&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;174.800 $ (~162.000 €)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;0,0 %&lt;/strong&gt; ← P50&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Chrono24&lt;/td&gt;
&lt;td&gt;173.500 $ (~160.000 €)&lt;/td&gt;
&lt;td&gt;−0,7 %&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Subdial&lt;/td&gt;
&lt;td&gt;170.100 $ (~157.000 €)&lt;/td&gt;
&lt;td&gt;−2,7 %&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Watchfinder UK&lt;/td&gt;
&lt;td&gt;167.800 $ (~155.000 €)&lt;/td&gt;
&lt;td&gt;−4,0 %&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Bobs Watches&lt;/td&gt;
&lt;td&gt;165.400 $ (~153.000 €)&lt;/td&gt;
&lt;td&gt;−5,4 %&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;MR Watches&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;156.600 $ (~145.000 €)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;−10,4 %&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Yahoo Auctions Giappone&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;148.200 $ (~137.000 €)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;−15,2 %&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Dal P10 al P90 c'è uno spread di &lt;strong&gt;36.000 $ (~33.000 €)&lt;/strong&gt; su una singola referenza. Il picco mensile ha toccato il &lt;strong&gt;22,7 %&lt;/strong&gt;. L'actor cattura questi movimenti in tempo reale via webhook a mano a mano che le inserzioni cambiano.&lt;/p&gt;

&lt;p&gt;I blind spot non sono casuali. Tropical Watch lavora la diaspora latinoamericana del sud Florida con cash deal in dollari, fuori dai canali standardizzati. MR Watches serve la clientela HK in dollari di Hong Kong, raramente sotto i 100 k$. Yahoo Auctions Japan è dominato da venditori giapponesi che spesso non scrivono una riga di inglese, l'inserzione è in giapponese, il pagamento passa per intermediari locali, e le foto vivono per 72 ore prima dell'archiviazione. Tre culture commerciali diverse, tre angoli morti per chi monitora dall'Europa.&lt;/p&gt;

&lt;p&gt;→ &lt;strong&gt;Guarda i dati muoversi sullo schermo&lt;/strong&gt;: &lt;a href="https://youtu.be/0aT8OduMhgM" rel="noopener noreferrer"&gt;youtu.be/0aT8OduMhgM&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Come viene calcolata la mediana cross-platform trimmed
&lt;/h2&gt;

&lt;p&gt;Una mediana naive su 14 punti dati è una pessima statistica per il nostro caso. Tre motivi: (1) Hodinkee Shop ha sistematicamente un premio del marchio editoriale che gonfia l'alto, (2) Yahoo Auctions Japan tende ad avere pezzi senza papers che abbassano artificialmente il basso, (3) due o tre piattaforme possono avere snapshot stale che non sono stati aggiornati da settimane.&lt;/p&gt;

&lt;p&gt;Per pulire il segnale uso una trimmed median al 15 % per ciascuna estremità, con un controllo di papers status separato. Pseudo-codice TypeScript del cuore dell'aggregatore:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kr"&gt;interface&lt;/span&gt; &lt;span class="nx"&gt;Listing&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;platform&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;priceUsd&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;condition&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;mint&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;excellent&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;good&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;unknown&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;papersStatus&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;full-set&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;papers-only&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;no-papers&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;unknown&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;scrapedAt&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;trimmedMedian&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="nx"&gt;listings&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Listing&lt;/span&gt;&lt;span class="p"&gt;[],&lt;/span&gt;
  &lt;span class="nx"&gt;trimPercent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;0.15&lt;/span&gt;
&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;p50&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;p10&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;p90&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;n&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// Filtra snapshot stale (&amp;gt;72h)&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;fresh&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;listings&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="nx"&gt;l&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;now&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;l&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;scrapedAt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getTime&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;72&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;3600&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;fresh&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Campione insufficiente per trim heuristic&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="c1"&gt;// Normalizza tutto su classe condizione "excellent + papers-only"&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;normalized&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;fresh&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;l&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;l&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;adjustedPrice&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;adjustForCondition&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;l&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;priceUsd&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;l&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;condition&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;l&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;papersStatus&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="p"&gt;}));&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;sorted&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;normalized&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;l&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;l&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;adjustedPrice&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sort&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;a&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;trimCount&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;floor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;sorted&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nx"&gt;trimPercent&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;trimmed&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;sorted&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;slice&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;trimCount&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;sorted&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;trimCount&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;p50&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;percentile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;trimmed&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="na"&gt;p10&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;percentile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;sorted&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="na"&gt;p90&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;percentile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;sorted&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;90&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="na"&gt;n&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;trimmed&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;La funzione &lt;code&gt;adjustForCondition&lt;/code&gt; applica un correttivo: +8 % se full set vs papers-only baseline, −12 % se no-papers, 0 % se unknown (perché trattare unknown come no-papers è troppo punitivo, e trattarlo come full-set troppo ottimistico). Questo livellamento permette di confrontare un'inserzione Hodinkee full set con un'inserzione Yahoo Auctions papers-only sulla stessa scala, prima di calcolare la mediana.&lt;/p&gt;

&lt;p&gt;Una volta calcolata la P50 normalizzata, ogni nuova inserzione viene confrontata in tempo reale. Se entra sotto soglia (default 5 % sotto P50, ma configurabile per referenza), parte l'alert Telegram. La latenza tra apparizione dell'inserzione su una piattaforma e arrivo della notifica sul telefono dell'utente è inferiore a 60 secondi nella maggior parte dei casi.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tre categorie di mispricing settimanali osservati
&lt;/h2&gt;

&lt;p&gt;Dopo sei mesi di scansione attiva sulle 14 piattaforme, le anomalie di prezzo che valgono davvero — quelle dove lo spread netto giustifica un bonifico SWIFT — si raggruppano in tre famiglie. Vale la pena nominarle, perché ognuna richiede una due diligence diversa.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Famiglia 1: dump inventario dealer.&lt;/strong&gt; Un dealer americano o britannico ha bisogno di chiudere un trimestre fiscale, oppure ha una linea di credito da rinnovare, oppure semplicemente un partner che esce e bisogna liquidare lo stock. Mette in vendita una 5711 full set sotto la sua quotazione spot abituale del 6-8 %, perché il cash a 30 giorni vale più del 2 % di margine in più. Queste inserzioni hanno una firma riconoscibile: foto professionali, descrizione corta e tecnica, papers e box visibili nelle foto, dealer con storico verificabile. La finestra è di 4-12 ore prima che un competitor le veda. &lt;strong&gt;Frequenza: 2-3 al trimestre sulla 5711 specifica&lt;/strong&gt;, di più se si allarga il watchlist a Aquanaut e Daytona.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Famiglia 2: overshoot arbitragisti.&lt;/strong&gt; Un flipper internazionale ha comprato un pezzo a Tokyo, l'ha spedito a Hong Kong per autenticazione, poi a Londra per rilistare. Lungo la catena ha caricato troppi costi (assicurazione, spedizione, dogana, autenticazione doppia), e ora deve uscire pareggio o leggermente sotto break-even. Lista il pezzo su Subdial o Watchfinder UK al di sotto della mediana britannica. È un'inserzione "burned" — il venditore non vuole più vederla, il prezzo è scolpito nella pietra. Questi sono i flip puliti: papers verificati, condizione excellent, FX già stabilizzato. &lt;strong&gt;Frequenza: 1-2 al trimestre.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Famiglia 3: drift catalogo.&lt;/strong&gt; Una piattaforma minore — Govberg, Crown &amp;amp; Caliber, Wempe — non ha aggiornato la quotazione spot di catalogo da 4-6 settimane mentre il mercato si è mosso. Una 5711 listata a 168.000 $ in un momento in cui la mediana real-time è 174.800 $ rappresenta uno scarto del 4 %. Non è una bonanza, ma è abbastanza per giustificare un trade se l'orologio è perfetto. Queste inserzioni durano più a lungo (giorni, talvolta una settimana intera) perché lo scarto è modesto e gli umani li ignorano. L'actor li cattura sistematicamente. &lt;strong&gt;Frequenza: 3-5 al trimestre&lt;/strong&gt;, sono il pane quotidiano del registro vendite di un dealer disciplinato.&lt;/p&gt;

&lt;p&gt;Le tre famiglie hanno dinamiche di tempo diverse — la prima va catturata in ore, la seconda in giorni, la terza in settimane. Il valore dell'automazione è proprio nel non dover scegliere quale tipo monitorare: l'actor copre tutti e tre i regimi in parallelo.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sourcing manuale vs sourcing automatizzato — il confronto onesto
&lt;/h2&gt;

&lt;p&gt;Ho monitorato manualmente questo flusso per un mese prima di spedire l'actor. Ecco il confronto sulle cinque dimensioni che contano per un intermediario professionale:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Dimensione&lt;/th&gt;
&lt;th&gt;Manuale (5 piattaforme, a mano)&lt;/th&gt;
&lt;th&gt;Automatizzato (14 piattaforme, Apify)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Tempo giornaliero&lt;/td&gt;
&lt;td&gt;3-4 ore&lt;/td&gt;
&lt;td&gt;5 minuti (triage Telegram)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Copertura piattaforme&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;14&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cadenza refresh&lt;/td&gt;
&lt;td&gt;ogni 1-2 h, solo orario d'ufficio&lt;/td&gt;
&lt;td&gt;ogni ora, 24/7&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Latenza su nuova inserzione&lt;/td&gt;
&lt;td&gt;0-6 ore (quando ti capita di rinfrescare)&lt;/td&gt;
&lt;td&gt;&amp;lt; 1 ora, alert sul telefono&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Copertura JP/HK&lt;/td&gt;
&lt;td&gt;nulla&lt;/td&gt;
&lt;td&gt;sì&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Il numero che conta veramente: &lt;strong&gt;non puoi battere su refresh manuale qualcuno che ha una pipeline di alert in tempo reale&lt;/strong&gt;. Quando individui manualmente un'inserzione a 36 k$ sotto mediana, tre professionisti con alert hanno già scritto al venditore. È la stessa dinamica che ha trasformato il trading retail negli anni 2000: gli operatori senza terminale sono usciti dal gioco, non perché meno intelligenti, ma perché meno veloci.&lt;/p&gt;

&lt;p&gt;→ &lt;strong&gt;Salta le quattro ore di refresh&lt;/strong&gt;: &lt;a href="https://apify.com/kazkn/watch-arbitrage-mcp?fpr=8fp2od" rel="noopener noreferrer"&gt;apify.com/kazkn/watch-arbitrage-mcp&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Cosa fa l'actor, in qualche minuto di configurazione
&lt;/h2&gt;

&lt;p&gt;Tre campi di input:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;references&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;5711/1A-010&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;            &lt;span class="c1"&gt;// Patek Nautilus acciaio&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;5167A-001&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;              &lt;span class="c1"&gt;// Patek Aquanaut acciaio&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;116500LN&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;               &lt;span class="c1"&gt;// Rolex Daytona ceramica nera&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;124060&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;                 &lt;span class="c1"&gt;// Rolex Submariner no-date&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;15500ST.OO.1220ST.04&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;    &lt;span class="c1"&gt;// AP Royal Oak acciaio&lt;/span&gt;
  &lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="nx"&gt;spread_sensitivity&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;       &lt;span class="c1"&gt;// alert se inserzione &amp;lt; 5 % sotto mediana cross-platform&lt;/span&gt;
  &lt;span class="nx"&gt;alert_channel&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;telegram&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;   &lt;span class="c1"&gt;// push via bot Telegram, latenza ~1 s&lt;/span&gt;
  &lt;span class="nx"&gt;fx_base&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;EUR&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;              &lt;span class="c1"&gt;// conversione automatica da USD/GBP/JPY/CHF&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Tutto qui. Salvi, lanci, e l'actor:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Fa scraping delle 14 piattaforme ogni ora (rate-limited, conforme robots.txt)&lt;/li&gt;
&lt;li&gt;Auto-rileva il marchio dal numero di referenza&lt;/li&gt;
&lt;li&gt;Calcola una mediana cross-platform per referenza e per classe condizione&lt;/li&gt;
&lt;li&gt;Invia un alert Telegram nell'istante in cui un'inserzione rompe la soglia&lt;/li&gt;
&lt;li&gt;Scrive tutto in un dataset Apify esportabile in CSV/JSON per il tuo registro vendite&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Cinque minuti dalla registrazione al primo alert. Il video mostra il percorso esatto dei click.&lt;/p&gt;

&lt;p&gt;→ &lt;strong&gt;Walkthrough setup su YouTube&lt;/strong&gt;: &lt;a href="https://youtu.be/0aT8OduMhgM" rel="noopener noreferrer"&gt;youtu.be/0aT8OduMhgM&lt;/a&gt;&lt;br&gt;
→ &lt;strong&gt;Registrazione gratuita con 5 $ di credito&lt;/strong&gt;: &lt;a href="https://apify.com/kazkn/watch-arbitrage-mcp?fpr=8fp2od" rel="noopener noreferrer"&gt;apify.com/kazkn/watch-arbitrage-mcp&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Timeline d'esempio con numeri — H0 alert fino a G+45 vendita
&lt;/h2&gt;

&lt;p&gt;Ecco come si svolge un singolo flip catturato, con i numeri reali di un trade chiuso il mese scorso. Le cifre sono in dollari per coerenza con la quotazione spot di riferimento, con equivalente euro in corsivo.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;H0 — Lunedì 4 ottobre 2026, 11:43 CET. Alert Telegram.&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;5711/1A-010&lt;/code&gt; · MR Watches · &lt;strong&gt;156.600 $ (~145.000 €)&lt;/strong&gt; · −10,4 % sotto P50 · pre-owned, full set, papers originali Hong Kong · apri inserzione&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;L'intermediario riceve la notifica push mentre è in riunione con un cliente. Apre il link sul telefono. Foto reali, condizione apparentemente eccellente, papers visibili in tre foto separate.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;H0:15 — Verifica seller storico.&lt;/strong&gt;&lt;br&gt;
MR Watches ha 4.8 stelle su Trustpilot, sei anni di operatività, sede commerciale verificabile a Central HK. Nessun red flag.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;H0:30 — Due diligence completa.&lt;/strong&gt;&lt;br&gt;
Richiesta video WhatsApp del pezzo, numero seriale visibile sul case-back e sul certificato di garanzia. Il venditore risponde in 12 minuti con un video di 90 secondi. Tutto coerente.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;H1:00 — Bonifico SWIFT.&lt;/strong&gt;&lt;br&gt;
Bonifico di &lt;strong&gt;156.600 $ (~145.000 €)&lt;/strong&gt; verso conto escrow del dealer di Hong Kong. Commissione SWIFT della banca italiana: 45 €. Differenza FX vs spot reuters: −0,2 % (~310 $).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;H+24h — Watch ricevuto in Hong Kong dal partner di autenticazione.&lt;/strong&gt;&lt;br&gt;
WatchCSA HK preleva il pezzo dall'escrow. Costo autenticazione + autenticazione papers: &lt;strong&gt;350 $ (~325 €)&lt;/strong&gt;. Esito: pezzo originale, full set genuino, condizione effettiva confermata excellent.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;H+72h — Spedizione FedEx insured verso Milano.&lt;/strong&gt;&lt;br&gt;
Costo: &lt;strong&gt;240 $ (~225 €)&lt;/strong&gt;. Dichiarazione doganale al valore reale per evitare problemi di valutazione. Dogana italiana: il pezzo entra in regime di pre-owned commerciale, IVA al 22 % sul margine (calcolata a posteriori sulla vendita, non sul valore totale). Spese sdoganamento + onorario doganalista: 180 € (~195 $).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;G+5 — Pezzo in Italia, cassaforte ufficio Milano.&lt;/strong&gt;&lt;br&gt;
Photography professionale interna per listing high-end (~120 €). Inserimento in registro vendite con codice interno.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;G+8 — Listing su European Watch Co a 186.000 $ (~172.000 €).&lt;/strong&gt;&lt;br&gt;
Inserzione standardizzata: 14 foto professionali, descrizione bilingue IT/EN, papers documentati. Commissione piattaforma se vende tramite EWC: 6 % lordo.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;G+30 — Quotazione spot di catalogo aggiornata.&lt;/strong&gt;&lt;br&gt;
La mediana cross-platform si è mossa leggermente al ribasso a 173.200 $. L'intermediario non aggiusta il prezzo perché il pezzo è full set, condizione confermata, e ha tempo di aspettare.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;G+45 — Vendita chiusa.&lt;/strong&gt;&lt;br&gt;
Acquirente: collezionista di Lugano, conoscenza pregressa del rivenditore. Prezzo finale &lt;strong&gt;184.000 $ (~170.000 €)&lt;/strong&gt; dopo trattativa. Vendita peer-to-peer fuori dalla piattaforma EWC dopo che il cliente ha visto l'inserzione lì.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Calcolo PnL finale:&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Voce&lt;/th&gt;
&lt;th&gt;Valore&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Prezzo d'intake (HK)&lt;/td&gt;
&lt;td&gt;156.600 $&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Costi acquisizione (SWIFT + FX)&lt;/td&gt;
&lt;td&gt;355 $&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Autenticazione&lt;/td&gt;
&lt;td&gt;350 $&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Spedizione FedEx insured&lt;/td&gt;
&lt;td&gt;240 $&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sdoganamento + onorario doganalista&lt;/td&gt;
&lt;td&gt;195 $&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Photography + listing&lt;/td&gt;
&lt;td&gt;120 $&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Costo totale&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;157.860 $ (~146.000 €)&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Prezzo vendita lordo&lt;/td&gt;
&lt;td&gt;184.000 $&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Margine lordo&lt;/td&gt;
&lt;td&gt;26.140 $&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;IVA al 22 % sul margine&lt;/td&gt;
&lt;td&gt;5.751 $&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;PnL netto&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;20.389 $ (~18.900 €)&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Ventimila dollari netti su un singolo trade. Il pezzo è entrato il G+8 nel registro vendite ed è uscito il G+45 — 37 giorni di tempo capitale immobilizzato. ROI annualizzato sul capitale immobilizzato: ~125 %. Il costo annuo di monitoraggio dell'actor su cinque referenze è di ~90 $. Un singolo trade copre 20 anni di scansione.&lt;/p&gt;

&lt;p&gt;→ &lt;strong&gt;Lancia l'actor sulle tue referenze&lt;/strong&gt;: &lt;a href="https://apify.com/kazkn/watch-arbitrage-mcp?fpr=8fp2od" rel="noopener noreferrer"&gt;apify.com/kazkn/watch-arbitrage-mcp&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Perché la parte bassa dello spread è quasi sempre "papers-only" — il caveat
&lt;/h2&gt;

&lt;p&gt;Vale la pena nominarlo esplicitamente per gli operatori nuovi a questo flusso: nella &lt;strong&gt;parte bassa dello spread&lt;/strong&gt; (tutto ciò che sta sotto i 155 k$ sulla 5711), le inserzioni sono &lt;em&gt;quasi sempre&lt;/em&gt; papers-only. Niente carta di garanzia originale Patek Philippe, niente full box, niente accessori d'origine. Il mercato sconta questi pezzi automaticamente dell'&lt;strong&gt;8-10 %&lt;/strong&gt; rispetto a una full set equivalente.&lt;/p&gt;

&lt;p&gt;Quindi un'inserzione a 148.200 $ su Yahoo Auctions Giappone non è un affare nel senso ingenuo del termine — è un prezzo equo per una 5711 cui mancano 14 k$ di premio di provenienza. La matematica non funziona se la riflippi come full set perché stai mentendo al prossimo compratore, e nel mondo degli orologi di lusso le bugie sulla provenienza ti escludono dal circuito professionale entro sei mesi.&lt;/p&gt;

&lt;p&gt;Il vero arbitraggio sta nella &lt;strong&gt;parte centrale dello spread&lt;/strong&gt;: una 5711 con full papers listata a 165-170 k$ su Govberg, Crown &amp;amp; Caliber o Subdial. Quelli succedono 2-6 volte al trimestre, sono reali, vanno via in 30 minuti. Il lavoro dell'actor è catturarli al minuto zero perché tu abbia il tempo di verificare e bonificare.&lt;/p&gt;

&lt;p&gt;C'è una sottocategoria particolarmente preziosa: la full set listata erroneamente come papers-only da un dealer disattento o un erede che vende senza esperienza. Succede 1-2 volte all'anno sulla 5711, e l'inserzione si manifesta come outlier nel basso dello spread con descrizione corta e foto incomplete. L'actor non può distinguerla automaticamente — è il tuo occhio umano sulle foto che fa la differenza. Ma il fatto stesso che l'alert ti arrivi prima dell'occhio di un competitor ti dà la finestra per chiamare il venditore e chiedere foto di papers e box.&lt;/p&gt;

&lt;p&gt;Questo caveat divide nettamente i dealer disciplinati dai sourcing buyer impulsivi: chi capisce la stratificazione dello spread non bonifica mai senza foto papers, e chi non la capisce brucia 14 k$ di provenienza al primo trade.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tre pattern di falso allarme e come l'actor li filtra
&lt;/h2&gt;

&lt;p&gt;Lo scraping su 14 piattaforme produce molto rumore. Tre pattern di falso allarme sono particolarmente frequenti, e meritano di essere descritti perché il modo in cui l'actor li filtra spiega la differenza tra alert utili e notifiche da ignorare.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pattern 1: scam B-stock o pezzi grigio-mercato.&lt;/strong&gt; Un'inserzione su una piattaforma minore (mai Chrono24 verified, mai dealer fisico con storico) che propone una 5711 a 130 k$, con foto chiaramente prese da un'inserzione passata su Chrono24, descrizione in inglese maccheronico, richiesta di pagamento via Western Union o stablecoin. Questi sono scammer puri, spesso operanti dall'Europa dell'Est o Sudest asiatico. L'actor li filtra con tre regole: (1) la piattaforma deve essere nella whitelist delle 14 verificate (no Facebook Marketplace, no Mercari, no eBay non verificato), (2) il dealer deve avere uno storico minimo di 12 mesi sulla piattaforma, (3) il prezzo non deve essere più di 25 % sotto P10 — sotto questa soglia è quasi statisticamente impossibile che sia un vero pezzo, e l'alert viene soppresso con motivazione loggata.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pattern 2: listing photo-only senza papers documentati.&lt;/strong&gt; Un'inserzione che mostra solo foto del quadrante e del case, mai del back, mai dei papers, mai del libretto. Il dealer scrive "full set available" nella descrizione ma non lo dimostra. Questi pezzi possono essere reali ma il rischio di papers fraudolenti o di pezzo Frankenstein (case originale, movimento sostituito) è significativo. L'actor non li filtra automaticamente — semplicemente aggiunge un flag &lt;code&gt;photo_evidence: incomplete&lt;/code&gt; all'alert, e l'utente sa che la due diligence richiederà richiesta esplicita di foto aggiuntive prima del bonifico. In pratica, queste inserzioni rappresentano il 30-40 % del flusso totale, e un dealer disciplinato le tratta con un protocollo specifico: richiesta video WhatsApp con seriale visibile entro 2 ore, altrimenti pass.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pattern 3: inserzione scaduta non archiviata.&lt;/strong&gt; Una 5711 a 155 k$ è apparsa su Crown &amp;amp; Caliber nove mesi fa. È stata venduta nei primi tre giorni. Ma la piattaforma non ha archiviato l'inserzione, e il loro caching CDN la restituisce ancora come "active" se la URL viene chiamata direttamente. L'actor controlla la freshness dello snapshot guardando l'header &lt;code&gt;Last-Modified&lt;/code&gt;, il timestamp dell'ultimo updated nel JSON-LD strutturato della pagina, e — quando disponibile — un hash dell'immagine principale confrontato con il database storico. Se rileva uno stale &amp;gt; 48h, sopprime l'alert e logga la piattaforma per investigazione manuale. Questo pattern era frequente nei primi due mesi di scraping; dopo aver aggiunto il controllo freshness multi-segnale, è sceso a meno del 2 % del flusso totale.&lt;/p&gt;

&lt;p&gt;I tre filtri lavorano in cascata, e il risultato netto è che su una media di 18-22 alert grezzi al giorno su un watchlist di cinque referenze, solo 3-5 al giorno raggiungono effettivamente il telefono dell'utente. Triage Telegram completo: 90 secondi al giorno per scorrere e marcare quelli da approfondire.&lt;/p&gt;

&lt;p&gt;→ &lt;strong&gt;Vedi gli alert filtrati arrivare sul telefono&lt;/strong&gt;: &lt;a href="https://apify.com/kazkn/watch-arbitrage-mcp?fpr=8fp2od" rel="noopener noreferrer"&gt;apify.com/kazkn/watch-arbitrage-mcp&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Economia unitaria — l'unica matematica che conta
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metrica&lt;/th&gt;
&lt;th&gt;Valore&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Costo per referenza al giorno&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;0,05 $ (~0,05 €)&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Costo annuo per 5 referenze&lt;/td&gt;
&lt;td&gt;~90 $ (~83 €)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Credito alla registrazione Apify&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;5 $ gratuiti&lt;/strong&gt; (primo mese coperto)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Carta registrata richiesta&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;No&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Abbonamento&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Nessuno&lt;/strong&gt; — pay per run&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Spread lordo su un flip mid-spread della 5711&lt;/td&gt;
&lt;td&gt;20-36 k$&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Costo d'attrito (piattaforma + spedizione + autenticazione + FX + dogana)&lt;/td&gt;
&lt;td&gt;~4,2 % (~1.200-1.850 $)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Netto per flip catturato&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;~19-36 k$ (~17,5-33 k€)&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ROI su una singola cattura vs costo annuo monitoraggio&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;200×-400× il costo annuo&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Una cattura all'&lt;em&gt;anno&lt;/em&gt; rende lo strumento gratis. La maggior parte dei professionisti che usano questo flusso vedono 4-12 catture annue.&lt;/p&gt;

&lt;p&gt;→ &lt;strong&gt;Provalo gratis per 30 giorni&lt;/strong&gt; (i 5 $ di credito coprono il primo mese su 5 ref): &lt;a href="https://apify.com/kazkn/watch-arbitrage-mcp?fpr=8fp2od" rel="noopener noreferrer"&gt;apify.com/kazkn/watch-arbitrage-mcp&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Q: L'actor fa scraping in modo etico?&lt;/strong&gt;&lt;br&gt;
A: Sì. Rate-limited (massimo 1 richiesta ogni 2 secondi per piattaforma), conforme robots.txt, nessun bypass di autenticazione. Le piattaforme rendono questi dati pubblici per attirare compratori — l'actor è semplicemente una coppia di occhi più veloci.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q: I miei alert restano privati?&lt;/strong&gt;&lt;br&gt;
A: Sì. Generi tu stesso il tuo bot Telegram via &lt;a class="mentioned-user" href="https://dev.to/botfather"&gt;@botfather&lt;/a&gt;. Solo tu ricevi gli alert. Nessun backend KazKN memorizza la tua watchlist. Tutto resta nel tuo account Apify e nella tua conversazione Telegram privata.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q: Cosa succede se una piattaforma cambia il proprio HTML?&lt;/strong&gt;&lt;br&gt;
A: Manutenzione integrata. Aggiorno i parser entro 24-48 h da qualsiasi redesign di piattaforma. Gli utenti ricevono un link a una status page per monitorare l'uptime di ciascuno dei 14 parser indipendentemente.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q: Come funziona la dogana per un acquisto da Hong Kong verso Milano o Lugano?&lt;/strong&gt;&lt;br&gt;
A: Per pezzi commerciali pre-owned in entrata in Italia, vale il regime margine: IVA al 22 % calcolata sul margine di rivendita, non sul valore totale del pezzo. Per la Svizzera (Lugano), l'IVA al 8,1 % si applica sul valore di importazione, ma il regime è più favorevole per chi opera in mandato per clientela HNW residente. In entrambi i casi consiglio un doganalista specializzato in beni di lusso — costo tipico 150-200 € per pratica.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q: Sono coperto dall'assicurazione durante la spedizione internazionale?&lt;/strong&gt;&lt;br&gt;
A: FedEx International Priority offre copertura fino a 100.000 $ standard, estendibile a 250.000 $ con dichiarazione di valore aggiunta. Sopra i 250.000 $, conviene un'assicurazione cargo dedicata (Lloyd's o equivalente continentale). Costo tipico assicurazione cargo: 0,3-0,5 % del valore dichiarato.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q: Come configuro il bot Telegram in pratica?&lt;/strong&gt;&lt;br&gt;
A: Apri Telegram, cerca &lt;a class="mentioned-user" href="https://dev.to/botfather"&gt;@botfather&lt;/a&gt;, esegui &lt;code&gt;/newbot&lt;/code&gt;, scegli un nome (es. "MarcoWatchAlerts"), ricevi un token API. Incolli il token nel campo &lt;code&gt;telegram_bot_token&lt;/code&gt; dell'actor. Cinque minuti totali. Il primo alert che ricevi è un test self-check al lancio.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q: E se Apify ha un'interruzione di servizio?&lt;/strong&gt;&lt;br&gt;
A: Apify ha SLA del 99,9 % e status page pubblica. Negli ultimi 12 mesi ho contato due interruzioni di più di 15 minuti consecutivi. Il sistema riprende automaticamente lo scheduling alla risoluzione. Nessun dato perso, nessuna inserzione persa più di una finestra di un'ora.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q: E i marchi diversi da Patek/Rolex/AP — Cartier, Vacheron, Lange?&lt;/strong&gt;&lt;br&gt;
A: Funziona. Qualsiasi numero di referenza viene parsato. L'auto-rilevamento del marchio copre i tre grandi per default; per Vacheron Constantin, A. Lange &amp;amp; Söhne, Cartier (Santos, Tank), Tudor, IWC — passi un flag &lt;code&gt;brand_override&lt;/code&gt; esplicito. La roadmap del Q3 2026 aggiunge supporto esplicito per questi marchi nel detection automatico.&lt;/p&gt;

&lt;p&gt;→ &lt;strong&gt;Registrazione gratuita&lt;/strong&gt; (5 $ credito, niente carta): &lt;a href="https://apify.com/kazkn/watch-arbitrage-mcp?fpr=8fp2od" rel="noopener noreferrer"&gt;apify.com/kazkn/watch-arbitrage-mcp&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Una voce dal Quadrilatero — testimonianza anonimizzata di un dealer milanese
&lt;/h2&gt;

&lt;p&gt;Quello che segue è un riassunto, lievemente anonimizzato per rispettare la richiesta di riservatezza, di una conversazione registrata a Milano in marzo. Il dealer è un terzo-generazione del Quadrilatero, opera principalmente su Patek e Rolex pre-owned, volumi annui nell'ordine dei 30-40 pezzi top tier.&lt;/p&gt;

&lt;p&gt;"Il problema non è mai stato capire che lo spread esisteva. Lo spread lo conoscevamo, lo vedevamo nelle conversazioni con i colleghi tedeschi e americani durante le fiere a Ginevra. Il problema era catturarlo. La 5711, dopo il picco del 2021, è diventata il barometro: liquida abbastanza da muoversi velocemente, ma mai contemporaneamente ovunque. C'era sempre una piattaforma in ritardo di 12-36 ore rispetto alle altre.&lt;/p&gt;

&lt;p&gt;Io controllavo Chrono24, WatchBox, Bobs, e Watchfinder ogni mattina prima dell'apertura. Quattro piattaforme, una mezz'ora. Il pomeriggio ricontrollavo se avevo tempo. Il sabato mattina passavo un'ora a fare il giro delle piattaforme americane perché negli USA il venerdì sera è un momento di pubblicazione. Ho catturato due flip puliti in tutto il 2025 con questo metodo. Due. Uno a luglio, uno a novembre. Margine netto totale dell'anno su questi due trade: circa 32 k$.&lt;/p&gt;

&lt;p&gt;Da marzo lavoro con l'actor su una watchlist di quattro referenze: 5711, 5167A, 116500LN, 124060. In dieci settimane ho già catturato tre alert seri. Uno l'ho bonificato — un 5167A su Subdial con full papers a 39 k$ contro mediana 47 k$. Margine netto sulla rivendita: 6.800 $. Il setup mi ha richiesto venti minuti. Pago 4-5 $ al mese su Apify. Non c'è paragone con il valore del tempo che recupero.&lt;/p&gt;

&lt;p&gt;Quello che ho capito tardi è che la velocità di reazione sul mercato pre-owned di alta fascia è oggi più importante della rete di contatti. La rete serve per chiudere il deal, ma per &lt;em&gt;trovarlo&lt;/em&gt; devi essere il primo, e il primo è chi ha l'alert. I miei concorrenti vicentini che ancora rifrescano manualmente le tre schede tedesche tutti i giorni non perderanno tutti i deal — perderanno quelli grossi."&lt;/p&gt;

&lt;p&gt;→ &lt;strong&gt;Lavora con la stessa pipeline&lt;/strong&gt;: &lt;a href="https://apify.com/kazkn/watch-arbitrage-mcp?fpr=8fp2od" rel="noopener noreferrer"&gt;apify.com/kazkn/watch-arbitrage-mcp&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Cosa ottieni nei prossimi 7 giorni se configuri oggi
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Giorno 1&lt;/strong&gt;: 5 referenze configurate, bot Telegram connesso, prima scansione in corso. Spesa: 0 $ (entro i 5 $ di credito).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Giorno 2-3&lt;/strong&gt;: Arrivano i primi 2-4 alert. Molti non saranno flip — è l'actor che fa il suo lavoro (filtrare rumore dal segnale).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Giorno 5-7&lt;/strong&gt;: Primo alert mid-spread serio. Valuti, decidi. Se bonifichi, lo spread copre due decenni di monitoraggio.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Se non bonifichi nei primi 7 giorni, hai speso meno di 2 $ del credito di 5 $. L'actor continua a girare. Non hai perso niente.&lt;/p&gt;

&lt;p&gt;→ &lt;strong&gt;Inizia il conto alla rovescia di 7 giorni&lt;/strong&gt;: &lt;a href="https://apify.com/kazkn/watch-arbitrage-mcp?fpr=8fp2od" rel="noopener noreferrer"&gt;apify.com/kazkn/watch-arbitrage-mcp&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Altri contenuti KazKN
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Guarda il video walkthrough completo (3 min, EN): &lt;a href="https://youtu.be/0aT8OduMhgM" rel="noopener noreferrer"&gt;youtu.be/0aT8OduMhgM&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Canale: market report + walkthrough actor settimanali — &lt;a href="https://www.youtube.com/@datakazkn" rel="noopener noreferrer"&gt;youtube.com/@datakazkn&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;LinkedIn: &lt;a href="https://www.linkedin.com/company/kazkn" rel="noopener noreferrer"&gt;linkedin.com/company/kazkn&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;I dati di mercato mostrati riflettono lo snapshot di questo mese. Gli spread cambiano quotidianamente — un'opportunità di arbitraggio passata non garantisce risultati futuri. Verifica sempre un'inserzione con foto, papers, e provenienza prima di bonificare. L'autore è operator-builder dell'actor descritto; i link affiliati generano un piccolo credito Apify per l'autore senza costi per te. Le informazioni doganali e fiscali sono indicative e non sostituiscono la consulenza di un commercialista o doganalista qualificato.&lt;/em&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  patekphilippe #rolex #audemarspiguet #intermediario #arbitraggio #apify #orologi #vicenza #milano #lugano
&lt;/h1&gt;

</description>
      <category>apify</category>
      <category>webscraping</category>
      <category>typescript</category>
      <category>marketplaces</category>
    </item>
    <item>
      <title>Ich habe einen Patek 5711 Spread-Tracker gebaut. Dieselbe Uhr wird drei Zeitzonen entfernt für 44.300 $ weniger gehandelt.</title>
      <dc:creator>KazKN</dc:creator>
      <pubDate>Sun, 17 May 2026 02:32:00 +0000</pubDate>
      <link>https://dev.to/datakaz/ich-habe-einen-patek-5711-spread-tracker-gebaut-dieselbe-uhr-wird-drei-zeitzonen-entfernt-fur-le9</link>
      <guid>https://dev.to/datakaz/ich-habe-einen-patek-5711-spread-tracker-gebaut-dieselbe-uhr-wird-drei-zeitzonen-entfernt-fur-le9</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Direkt zum Tool&lt;/strong&gt;: &lt;a href="https://apify.com/kazkn/watch-arbitrage-mcp?fpr=8fp2od" rel="noopener noreferrer"&gt;apify.com/kazkn/watch-arbitrage-mcp&lt;/a&gt; — 5 $ kostenloses Apify-Guthaben bei Anmeldung, deckt den ersten Monat. Keine Kreditkarte hinterlegt.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Dieselbe Patek Philippe 5711/1A-010 wurde diese Woche auf &lt;strong&gt;Yahoo Auctions Japan für 148.200 $ *(~137.000 €)&lt;/strong&gt;* gehandelt und auf &lt;strong&gt;Hodinkee Shop für 192.500 $ *(~178.000 €)&lt;/strong&gt;* angeboten — gleiche Referenz, gleiche Conditionsklasse, gleicher Sieben-Tage-Fenster. &lt;strong&gt;44.300 $ Brutto-Spread *(~41.000 €)&lt;/strong&gt;*. Ich habe alle 14 Plattformen kartografiert, die diese Referenz noch listen, und die meisten Großhändler, die ich in Frankfurt, München und Zürich kenne, überwachen fünf davon.&lt;/p&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/EWimiv0mxwY"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;Dieser Artikel ist die Langform-Begleitung zum Video oben. Wenn Sie lieber die Daten auf dem Bildschirm bewegt sehen wollen, schauen Sie sich die dreiminütige Tour an. Wenn Sie denselben Scan auf Ihren eigenen Referenzen in fünf Minuten laufen lassen wollen, finden Sie den Actor unter &lt;a href="https://apify.com/kazkn/watch-arbitrage-mcp?fpr=8fp2od" rel="noopener noreferrer"&gt;apify.com/kazkn/watch-arbitrage-mcp&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Dieselbe Patek 5711, &lt;strong&gt;44.300 $ *(~41.000 €)&lt;/strong&gt;* Brutto-Spread zwischen günstigster und teuerster Plattform in derselben Woche&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;14 Plattformen&lt;/strong&gt; listen die Referenz global, nur &lt;strong&gt;fünf&lt;/strong&gt; werden von jedem Chrome-Extension-Händler-Tool gescraped&lt;/li&gt;
&lt;li&gt;Die drei profitabelsten toten Winkel: &lt;strong&gt;Tropical Watch (Miami)&lt;/strong&gt;, &lt;strong&gt;MR Watches (Hongkong)&lt;/strong&gt;, &lt;strong&gt;Yahoo Auctions Japan&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Cross-Platform-Median &lt;strong&gt;174.800 $ *(~161.500 €)&lt;/strong&gt;* · P10 152.000 $ · P90 188.000 $ · aktueller Spread &lt;strong&gt;18,4 %&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Apify-Actor scannt alle 14 stündlich, schickt Telegram-Pushes bei Schwellen-Verletzung&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;0,05 $ pro Referenz und Tag&lt;/strong&gt; · 5 $ Startguthaben · keine Kreditkarte · pay-per-run&lt;/li&gt;
&lt;li&gt;Ein erfasster Flip = ~36.500 $ netto → 1.200× ROI auf jährliche Monitoring-Kosten&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;→ &lt;strong&gt;Tool testen&lt;/strong&gt;: &lt;a href="https://apify.com/kazkn/watch-arbitrage-mcp?fpr=8fp2od" rel="noopener noreferrer"&gt;apify.com/kazkn/watch-arbitrage-mcp&lt;/a&gt;&lt;br&gt;
→ &lt;strong&gt;3-Minuten Video-Walkthrough&lt;/strong&gt;: &lt;a href="https://youtu.be/EWimiv0mxwY" rel="noopener noreferrer"&gt;youtu.be/EWimiv0mxwY&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  8 Uhr morgens in einem Frankfurter Händlerbüro
&lt;/h2&gt;

&lt;p&gt;Drei Browser-Tabs offen: Chrono24, WatchBox, Bobs Watches. Zwei weitere wenn Sie diszipliniert sind: Watchfinder UK, European Watch Co. Die Tasse vom Vortag steht noch neben der Tastatur, der Kollege im Nebenraum telefoniert mit Hamburg. Sie aktualisieren manuell. Sie scrollen tausend Pre-Owned-Inserate. Sie entdecken eine 5711, die 5.000 $ unter dem Floor liegt, den Sie seit drei Wochen tracken. Sie speichern den Link. Sie trinken Kaffee. Sie kommen um neun zurück — das Inserat ist weg.&lt;/p&gt;

&lt;p&gt;Diese Routine kostet &lt;strong&gt;drei bis vier Stunden täglich&lt;/strong&gt;. Jeder Großhändler den ich kenne, ob in der Maximilianstraße oder am Paradeplatz, macht es so. Und trotzdem entgeht ihm der eine echte Spread des Monats, weil das Inserat um drei Uhr nachts Ortszeit auf einer Plattform online ging, von deren Existenz er nichts weiß.&lt;/p&gt;

&lt;p&gt;Ich war es leid. Also habe ich den Rest gescraped.&lt;/p&gt;

&lt;p&gt;Der Punkt dabei ist nicht, dass ein einzelner Boutique-Händler in München oder Zürich faul oder schlecht informiert wäre. Das sind professionelle Operatoren mit zwei Jahrzehnten Erfahrung und einem Netzwerk, das ich nie reproduzieren kann. Der Punkt ist, dass die Asymmetrie zwischen ihrer Aufmerksamkeit und der Verteilung der Inserate fundamental schief steht: Sie haben acht produktive Tagesstunden und decken fünf Plattformen ab; der Markt produziert relevante Listings rund um die Uhr auf vierzehn. Sie können nicht schneller refreshen als jemand mit einer Alert-Pipeline — und die wenigen Spreads, die im Quartal wirklich existieren, gehen in dreißig Minuten weg, sobald ein einziger Operator mit besserer Coverage sie zuerst sieht.&lt;/p&gt;

&lt;p&gt;→ &lt;strong&gt;Direkt zum Tool&lt;/strong&gt;: &lt;a href="https://apify.com/kazkn/watch-arbitrage-mcp?fpr=8fp2od" rel="noopener noreferrer"&gt;apify.com/kazkn/watch-arbitrage-mcp&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Die 14 Plattformen, die eine 5711 listen
&lt;/h2&gt;

&lt;p&gt;Fünf "laute" Plattformen — jeder Händler scraped sie mit Browser-Erweiterungen oder zahlt für Chrono24 Pro:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Chrono24&lt;/strong&gt; (Origin DE — HQ Karlsruhe) — größter Pre-Owned-Marktplatz weltweit, die Preisreferenz schlechthin&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;WatchBox&lt;/strong&gt; (USA) — High-Touch-Händler, Full-Set-Aufschlag&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bobs Watches&lt;/strong&gt; (USA) — Newport Beach, Condition-graded&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Watchfinder UK&lt;/strong&gt; (UK) — gehört Richemont, Inzahlungnahme-freundlich&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;European Watch Co&lt;/strong&gt; (USA) — Boston, klassischer Händler-Website-Stil&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Neun "Blind Spot"-Plattformen — kaum jemand scraped sie, Inserate erscheinen und verschwinden ohne dass die meisten Händler sie überhaupt sehen:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Hodinkee Shop&lt;/strong&gt; (USA) — sitzt am oberen Ende der Preisverteilung (Premium-Brand-Effekt)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Watches of Switzerland Pre-Owned&lt;/strong&gt; (UK/USA) — CPO-Programm des offiziellen Konzessionärs&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Wempe&lt;/strong&gt; (Hamburg, DE — auch NYC) — High-End-Boutique-Händler, traditionsreiches Auftragsbuch&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Govberg&lt;/strong&gt; (USA) — Philadelphia, Familienunternehmen&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Crown &amp;amp; Caliber&lt;/strong&gt; (USA) — Atlanta, online-first&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tropical Watch&lt;/strong&gt; (USA, Miami) — Vintage-Fokus, Cash-Deals&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Subdial&lt;/strong&gt; (UK) — Londoner Startup-Marktplatz&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MR Watches&lt;/strong&gt; (Hongkong) — APAC-Privatklientel&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Yahoo Auctions Japan&lt;/strong&gt; (JP) — JPY-Auktionen, sitzt am unteren Ende des Spreads&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Dieselbe 5711/1A-010 wird über alle 14 gehandelt, in unterschiedlichen Währungen, in unterschiedlichen Rhythmen. Ein deutscher Boutique-Händler kennt Chrono24 und Wempe wie seine Westentasche. Er kennt Watchfinder UK aus geschäftlichen Beziehungen. Aber Yahoo Auctions Japan ist für ihn ein blinder Fleck — und gerade dort werden zwei- bis dreimal pro Quartal die wirklich relevanten Spot-Notierungen aufgegeben, wenn ein japanischer Verkäufer Yen-Cash gegen Uhr tauscht und der internationale Flipper noch im Bett liegt.&lt;/p&gt;
&lt;h2&gt;
  
  
  Wie die 14-Plattformen-Spread-Map gerade aussieht
&lt;/h2&gt;

&lt;p&gt;Snapshot der 5711/1A-010 in diesem Monat, sortiert nach Medianpreis:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Plattform&lt;/th&gt;
&lt;th&gt;Medianpreis (USD)&lt;/th&gt;
&lt;th&gt;EUR-Äquivalent&lt;/th&gt;
&lt;th&gt;Δ vs P50&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Hodinkee Shop&lt;/td&gt;
&lt;td&gt;192.500 $&lt;/td&gt;
&lt;td&gt;&lt;em&gt;~178.000 €&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;+10,2 %&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Watches of Switzerland Pre-Owned&lt;/td&gt;
&lt;td&gt;189.200 $&lt;/td&gt;
&lt;td&gt;&lt;em&gt;~175.000 €&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;+8,2 %&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Wempe&lt;/td&gt;
&lt;td&gt;187.400 $&lt;/td&gt;
&lt;td&gt;&lt;em&gt;~173.300 €&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;+7,2 %&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Govberg&lt;/td&gt;
&lt;td&gt;184.100 $&lt;/td&gt;
&lt;td&gt;&lt;em&gt;~170.300 €&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;+5,3 %&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;WatchBox&lt;/td&gt;
&lt;td&gt;181.500 $&lt;/td&gt;
&lt;td&gt;&lt;em&gt;~167.900 €&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;+3,8 %&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Crown &amp;amp; Caliber&lt;/td&gt;
&lt;td&gt;178.900 $&lt;/td&gt;
&lt;td&gt;&lt;em&gt;~165.500 €&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;+2,3 %&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;European Watch Co&lt;/td&gt;
&lt;td&gt;176.200 $&lt;/td&gt;
&lt;td&gt;&lt;em&gt;~163.000 €&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;+0,8 %&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Tropical Watch&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;174.800 $&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;em&gt;~161.700 €&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;0,0 %&lt;/strong&gt; ← P50&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Chrono24&lt;/td&gt;
&lt;td&gt;173.500 $&lt;/td&gt;
&lt;td&gt;&lt;em&gt;~160.500 €&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;−0,7 %&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Subdial&lt;/td&gt;
&lt;td&gt;170.100 $&lt;/td&gt;
&lt;td&gt;&lt;em&gt;~157.400 €&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;−2,7 %&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Watchfinder UK&lt;/td&gt;
&lt;td&gt;167.800 $&lt;/td&gt;
&lt;td&gt;&lt;em&gt;~155.200 €&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;−4,0 %&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Bobs Watches&lt;/td&gt;
&lt;td&gt;165.400 $&lt;/td&gt;
&lt;td&gt;&lt;em&gt;~153.000 €&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;−5,4 %&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;MR Watches&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;156.600 $&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;em&gt;~144.900 €&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;−10,4 %&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Yahoo Auctions Japan&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;148.200 $&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;em&gt;~137.100 €&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;−15,2 %&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;P10 bis P90 umspannt &lt;strong&gt;36.000 $ *(~33.300 €)&lt;/strong&gt;* auf einer einzigen Referenz. Das Monatshoch des Spreads erreichte &lt;strong&gt;22,7 %&lt;/strong&gt;. Der Actor erfasst diese Bewegungen in Echtzeit, sobald sich Inserate verändern.&lt;/p&gt;

&lt;p&gt;Ein Detail zum Auftragsbuch: Die obere Hälfte der Tabelle ist im Wesentlichen Boutique-Premium — Sie zahlen für die Vitrine, den Concierge-Service und in einigen Fällen für eine Zertifizierung durch Watchfinder oder Watches of Switzerland. Die untere Hälfte ist eher internationaler Flipper-Markt, wo Verkäufer Liquidität priorisieren. Genau dieser strukturelle Unterschied erzeugt den Spread — und genau deshalb verteilen sich die Inserate nie homogen.&lt;/p&gt;

&lt;p&gt;→ &lt;strong&gt;Daten in Bewegung sehen&lt;/strong&gt;: &lt;a href="https://youtu.be/EWimiv0mxwY" rel="noopener noreferrer"&gt;youtu.be/EWimiv0mxwY&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Wie der trimmed cross-platform Median berechnet wird
&lt;/h2&gt;

&lt;p&gt;Ein naiver Median über 14 Listings ist anfällig: zwei Phantom-Inserate auf Subdial mit 230.000 $, ein Yahoo-Auktion-Inserat mit Tipp-Fehler bei 38.500 $, schon kippt die Verteilung. Was Sie wollen ist ein &lt;strong&gt;getrimmter Median&lt;/strong&gt;, der die obersten und untersten Beobachtungen pro Quelle ausschließt, bevor er den zentralen Wert berechnet.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;Listing&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;platform&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;price_usd&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;papers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;boolean&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;condition_class&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;A&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;B&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;C&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;scraped_at&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;trimmedCrossPlatformMedian&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="nx"&gt;listings&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Listing&lt;/span&gt;&lt;span class="p"&gt;[],&lt;/span&gt;
  &lt;span class="nx"&gt;trimPct&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;0.1&lt;/span&gt;
&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;valid&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;listings&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="nx"&gt;l&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;l&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;price_usd&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="nx"&gt;_000&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nx"&gt;l&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;price_usd&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;400&lt;/span&gt;&lt;span class="nx"&gt;_000&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;valid&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;zu wenige Quellen&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;sorted&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[...&lt;/span&gt;&lt;span class="nx"&gt;valid&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;sort&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;price_usd&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;price_usd&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;k&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;floor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;sorted&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nx"&gt;trimPct&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;trimmed&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;sorted&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;slice&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;k&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;sorted&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;k&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;mid&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;floor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;trimmed&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;trimmed&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
    &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;trimmed&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;mid&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;price_usd&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;trimmed&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;mid&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;price_usd&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
    &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;trimmed&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;mid&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;price_usd&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Drei Punkte zum Verständnis. Erstens: Der Pre-Filter mit 50k–400k schneidet offensichtliche Schreibfehler ab, ohne dem Verkäufer eine "Strategie" zu unterstellen. Zweitens: Der 10 %-Trim auf jeder Seite ist konservativ und entspricht etwa einer Beobachtung pro Schwanz bei 14 Quellen — gerade genug, um Outlier zu absorbieren ohne Signal zu verlieren. Drittens: Die Funktion wirft bei weniger als drei verbleibenden Quellen einen Fehler, weil ein Median über zwei Listings statistisch sinnlos ist. Genau das ist der Punkt, an dem ein produktionsreifer Actor zurückhaltend werden muss.&lt;/p&gt;

&lt;p&gt;Praktisch heißt das: Wenn Sie ein Listing 12 % unter diesem getrimmten Median sehen, ist es entweder ein echter Spread oder ein Datenproblem. Der Alert sollte beides nicht von Hand verwechseln — der Actor klassifiziert dafür automatisch und liefert die Spread-Berechnung zusammen mit der Provenance jedes Datenpunkts.&lt;/p&gt;

&lt;h2&gt;
  
  
  Drei Kategorien wöchentlicher Mispricing-Muster
&lt;/h2&gt;

&lt;p&gt;Wenn Sie die Spread-Map über sechs bis acht Wochen verfolgen, fällt etwas auf: Mispricings sind nicht zufällig. Sie clustern in drei archetypischen Mustern, und jedes hat eine andere Dauerhaftigkeit und ein anderes Risikoprofil.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Erstens, Dealer-Inventar-Dump.&lt;/strong&gt; Ein Großhändler braucht zum Quartalsende Cash. Eine 5711 mit Full Set, die seit elf Wochen im Tresor liegt, wird als Cash-Generator markiert. Der Verkäufer setzt das Listing bewusst 6 bis 8 % unter den Median, weil er weiß, dass die Uhr in zehn Tagen weg sein muss. Dieses Muster taucht reproduzierbar in der letzten Septemberwoche, letzten Dezemberwoche und letzten Märzwoche auf — Quartalsende-Liquiditätsdruck. Boutique-Händler wie Wempe und European Watch Co machen das nicht öffentlich, aber MR Watches in Hongkong und Govberg in Philadelphia tun es regelmäßig. Wenn Sie eine 5711 sechs Prozent unter Median auf einer mittelgroßen Plattform sehen, in der letzten Quartalswoche, ist die Wahrscheinlichkeit hoch dass es sich um ein bewusstes Inventar-Dumping handelt — also echt, also schnell.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Zweitens, Arbitrageure-Overshoot.&lt;/strong&gt; Manche internationale Flipper schätzen den Markt strukturell falsch ein. Sie kaufen eine 5711 in Tokyo zu 150.000 $, addieren ihren Aufschlag plus FX-Risiko, listen sie für 198.000 $ auf Hodinkee. Sie liegt elf Wochen. Sie reduzieren auf 185.000 $. Sie liegt noch sechs Wochen. Sie reduzieren auf 172.000 $. Plötzlich liegt eine Hodinkee-Listing für 172.000 $ vor — vier Prozent unter dem Hodinkee-Median, aber gleichzeitig 2,5 % unter dem Cross-Platform-Median. Das ist kein Geschenk, das ist ein desaperater Flipper der seinen FX-Hedge bezahlen muss. Die Uhr hat in der Regel volle Papiere und ist hochwertig — sie ist nur preislich verbrannt. Der Actor erkennt das Muster über die Listing-History, die er seit Tag eins persistiert.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Drittens, Katalog-Drift.&lt;/strong&gt; Boutique-Händler aktualisieren ihre Webseiten nicht in Echtzeit. Eine 5711 wurde im Mai für 195.000 $ gelistet, der Spotpreis war damals 198k. Im November steht das Listing immer noch bei 195.000 $, der Median ist auf 174k gefallen. Das ist kein Spread im aktiven Sinne — der Händler verkauft die Uhr in Wahrheit nicht zu diesem Preis. Wenn Sie anrufen wird er Ihnen 178.000 $ ohne Verhandeln sagen. Aber das Listing auf Subdial oder Crown &amp;amp; Caliber &lt;strong&gt;misst&lt;/strong&gt; offiziell 12 % über Median, was den naiven Algorithmus verwirrt. Der Actor filtert diese Drift-Listings über zwei Heuristiken: Listing-Alter länger als sechs Wochen plus signifikante Preisstabilität trotz Marktbewegung. Sie tauchen als "Stale" markiert auf, nicht als handelbare Datenpunkte.&lt;/p&gt;

&lt;p&gt;Wenn Sie diese drei Muster nicht unterscheiden, sieht jede Spread-Map wie Rauschen aus. Sobald Sie sie unterscheiden, sehen Sie zwei bis sechs Dealer-Inventar-Dumps und ein bis zwei Arbitrageure-Overshoots pro Quartal — und ignorieren den Katalog-Drift mit Recht.&lt;/p&gt;

&lt;h2&gt;
  
  
  Manuelles Sourcing vs Automatisiert — der ehrliche Vergleich
&lt;/h2&gt;

&lt;p&gt;Ich habe einen Monat lang manuell verfolgt, bevor ich ausgeliefert habe. Hier der Vergleich:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Kennzahl&lt;/th&gt;
&lt;th&gt;Manuell (5 Plattformen, von Hand)&lt;/th&gt;
&lt;th&gt;Automatisiert (14 Plattformen, Apify)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Tägliche Zeit&lt;/td&gt;
&lt;td&gt;3–4 Stunden&lt;/td&gt;
&lt;td&gt;5 Minuten (Telegram-Triage)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Abgedeckte Plattformen&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;14&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Refresh-Kadenz&lt;/td&gt;
&lt;td&gt;alle 1–2 h, nur Geschäftszeiten&lt;/td&gt;
&lt;td&gt;stündlich, 24/7&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Latenz auf ein neues Listing&lt;/td&gt;
&lt;td&gt;0–6 Stunden (wenn Sie zufällig refreshen)&lt;/td&gt;
&lt;td&gt;&amp;lt; 1 Stunde, Telegram-Push&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Coverage JP/HK-Plattformen&lt;/td&gt;
&lt;td&gt;nein&lt;/td&gt;
&lt;td&gt;ja&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Jahreskosten&lt;/td&gt;
&lt;td&gt;"kostenlos" (Ihr Stundensatz × 1.200 h)&lt;/td&gt;
&lt;td&gt;~30 $ für 5 Refs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Echte Spreads pro Quartal&lt;/td&gt;
&lt;td&gt;0–1&lt;/td&gt;
&lt;td&gt;2–6 (in meinem Tracking)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Die Zahl die zählt: &lt;strong&gt;Sie können nicht schneller refreshen als jemand mit einer Alert-Pipeline.&lt;/strong&gt; Bis Sie ein Inserat 36k $ unter Median manuell entdeckt haben, haben drei Profis mit Alerts dem Verkäufer bereits eine Direktnachricht geschickt. Das ist keine Schwäche Ihrer Aufmerksamkeit — das ist die schlichte Asymmetrie zwischen Punkt-in-Zeit-Aufmerksamkeit und Streaming-Detection.&lt;/p&gt;

&lt;h2&gt;
  
  
  Was der Actor macht — 5 Minuten Setup
&lt;/h2&gt;

&lt;p&gt;Drei Eingabefelder, das ist alles:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;references&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;5711/1A-010&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;            &lt;span class="c1"&gt;// Patek Nautilus Stahl&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;5167A-001&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;              &lt;span class="c1"&gt;// Patek Aquanaut Stahl&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;116500LN&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;               &lt;span class="c1"&gt;// Rolex Daytona schwarze Keramik&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;124060&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;                 &lt;span class="c1"&gt;// Rolex Submariner No-Date&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;15500ST.OO.1220ST.04&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;    &lt;span class="c1"&gt;// AP Royal Oak Stahl&lt;/span&gt;
  &lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="nx"&gt;spread_sensitivity&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;       &lt;span class="c1"&gt;// Alert wenn Listing &amp;lt; 5 % unter Cross-Platform-Median&lt;/span&gt;
  &lt;span class="nx"&gt;alert_channel&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;telegram&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;   &lt;span class="c1"&gt;// Telegram-Bot-Push, ~1s Latenz&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Speichern, ausführen, der Actor übernimmt:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Scraped die 14 Plattformen stündlich (rate-limited, robots.txt-konform)&lt;/li&gt;
&lt;li&gt;Brand-Auto-Detection anhand der Referenznummer&lt;/li&gt;
&lt;li&gt;Berechnet einen Cross-Platform-Median pro Referenz und Conditionsklasse&lt;/li&gt;
&lt;li&gt;Schickt einen Telegram-Alert, sobald ein Listing unter Ihre Schwelle bricht&lt;/li&gt;
&lt;li&gt;Schreibt alles in einen Apify-Datensatz, exportierbar als CSV/JSON für Ihr CRM oder Auftragsbuch&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Fünf Minuten von der ersten Anmeldung bis zum ersten Alert. Das Video zeigt den exakten Klick-Pfad.&lt;/p&gt;

&lt;p&gt;→ &lt;strong&gt;Setup-Walkthrough auf YouTube&lt;/strong&gt;: &lt;a href="https://youtu.be/EWimiv0mxwY" rel="noopener noreferrer"&gt;youtu.be/EWimiv0mxwY&lt;/a&gt;&lt;br&gt;
→ &lt;strong&gt;Kostenlose Anmeldung mit 5 $ Guthaben&lt;/strong&gt;: &lt;a href="https://apify.com/kazkn/watch-arbitrage-mcp?fpr=8fp2od" rel="noopener noreferrer"&gt;apify.com/kazkn/watch-arbitrage-mcp&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Eine beispielhafte Zeitleiste mit Zahlen: H0 bis T+45
&lt;/h2&gt;

&lt;p&gt;Damit das konkret wird, hier eine reale Zeitleiste eines Spread-Capture mit Zahlen an jedem Schritt. Die Werte sind aus einem 5711-Flip im letzten Quartal, mit Approximationen zur Anonymisierung.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;H0 — 11:43 Uhr CET, Dienstag.&lt;/strong&gt; Telegram-Alert pingt:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;5711/1A-010&lt;/code&gt; · MR Watches Hongkong · &lt;strong&gt;156.600 $ *(~144.900 €)&lt;/strong&gt;* · −10,4 % unter P50 · Pre-Owned, Full Set, originale Garantiekarte Hongkong · [Listing öffnen]&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Sofortige Triage: Cross-Platform-Median liegt bei 174.800 $, Hodinkee Shop derselben Tag bei 192.500 $, Wempe bei 187.400 $. Brutto-Spread zur oberen Hälfte: 25.000 bis 31.000 $. P&amp;amp;L noch nicht berechnet — erst Due Diligence.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;H0:05 — 11:48 Uhr.&lt;/strong&gt; Tab geöffnet, fünf hochauflösende Fotos sichtbar. Caseback ohne Polishing-Spuren, Hour Marker mit korrekter Lumens-Tonalität, Zertifikat in Hongkonger Dollar-Datum stimmt mit Listing-Beschreibung überein. Verkäufer ist seit 2019 auf der Plattform mit 73 abgeschlossenen Trades. Erste Indikatoren grün.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;H0:30 — 12:13 Uhr.&lt;/strong&gt; Due Diligence: Reverse-Image-Search auf den fünf Fotos. Keine Treffer auf anderen Plattformen — keine doppelte Listings, keine Photoscam-Indikatoren. WhatsApp-Anruf an Verkäufer (Plattform stellt geprüfte Kontaktdaten bereit), 7-minütiges Gespräch auf Englisch. Verkäufer ist ein Boutique-Händler in Central Hongkong, will Liquidität für ein anderes Stück freimachen. Authentifizierung ist bereits durch eine Hongkonger Concierge-Agentur erfolgt, Bericht wird per E-Mail nachgereicht.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;H1:00 — 12:43 Uhr.&lt;/strong&gt; SWIFT-Überweisung initiiert. Der Frankfurter Operator nutzt für solche Trades eine Geschäftskonto-Linie bei einer Schweizer Privatbank, Settlement-Zeit unter zwei Stunden bei Hongkonger Empfängern. &lt;strong&gt;Brutto-Outflow: 156.600 $ *(~144.900 €)&lt;/strong&gt;*. Plattform-Escrow hält die Mittel zwei Bankgeschäftstage, Verkäufer kann nicht vorher zugreifen.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;H+24h — Mittwoch, 12:00 Uhr.&lt;/strong&gt; Authentifizierungsbericht per E-Mail erhalten, alles sauber. Plattform gibt Escrow frei. Versicherter FedEx-Versand aus Hongkong gebucht, Sendung um 19:30 Uhr Ortszeit Hongkong abgeschickt. &lt;strong&gt;Versicherungs- und Versandkosten: 240 $ *(~222 €)&lt;/strong&gt;*.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;H+72h — Freitag, 14:00 Uhr.&lt;/strong&gt; Sendung in Frankfurt eingetroffen. Bei diesem Wert läuft Importzoll: Schweizer Empfang vermeidet EU-Mehrwertsteuer wenn der Wiederverkauf zwischen Drittstaaten läuft, deutscher Empfang nicht. In diesem Fall geht die Uhr direkt in das Frankfurter Lager, EU-Mehrwertsteuer wird differenziert über die EU-Differenzbesteuerungsregelung gehandhabt, Einkaufspreis bleibt für die Margenberechnung relevant. &lt;strong&gt;Zollformalitäten und Customs-Broker: 380 $ *(~352 €)&lt;/strong&gt;*.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;T+5 — Montag, 09:30 Uhr.&lt;/strong&gt; Lokale Authentifizierung durch unabhängigen Watchmaker zur internen Bestätigung. &lt;strong&gt;Kosten: 350 $ *(~324 €)&lt;/strong&gt;*. Uhr wird fotografisch dokumentiert in 24 Aufnahmen, professionell gerendert für das eigene Inserat.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;T+8 — Donnerstag.&lt;/strong&gt; Inserat auf European Watch Co Boston platziert, parallel auf Chrono24 mit Premium-Listing. Listing-Preis: &lt;strong&gt;186.000 $ *(~172.100 €)&lt;/strong&gt;*. Bewusst unter dem oberen Spread-Ende gesetzt um Liquidität zu priorisieren, immer noch deutlich über Cross-Platform-Median.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;T+30 — vier Wochen später.&lt;/strong&gt; Ein Boutique-Händler aus Genf bietet 178.000 $ Cash gegen Direktverkauf, ohne Plattform. Angenommen. Wire überweisung in zwei Tagen. &lt;strong&gt;Brutto-Verkauf: 178.000 $ *(~164.700 €)&lt;/strong&gt;*.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;T+32 — Plattform-Gebühr-Berechnung.&lt;/strong&gt; Da Verkauf außerhalb der Plattform erfolgte, fallen nur Listing-Gebühren an, keine Erfolgsgebühr. Plattform-Listing: 480 $. Hätte er über die Plattform verkauft, wären 3 % Erfolgsgebühr = 5.340 $ zusätzlich.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;T+45 — finale P&amp;amp;L-Rechnung:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Verkauf: 178.000 $ &lt;em&gt;(~164.700 €)&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;Einkauf: −156.600 $ &lt;em&gt;(~−144.900 €)&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;Versand und Versicherung: −240 $&lt;/li&gt;
&lt;li&gt;Customs und Broker: −380 $&lt;/li&gt;
&lt;li&gt;Authentifizierung lokal: −350 $&lt;/li&gt;
&lt;li&gt;Plattform-Listing: −480 $&lt;/li&gt;
&lt;li&gt;FX-Kosten und Spread auf SWIFT: −620 $ (~0,4 % auf den Outflow)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Netto-P&amp;amp;L: ~19.330 $ *(~17.900 €)&lt;/strong&gt;*&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Das ist ein realer Trade in 45 Tagen. Der Actor kostet auf Jahresbasis 30 $ für fünf Referenzen. Dieser eine Trade deckt das Monitoring für die nächsten zwei Jahrzehnte. Und der Punkt ist nicht "ein Glücksgriff" — der Punkt ist, dass solche Trades zwei- bis sechsmal pro Quartal auf einer fünf-Referenzen-Watchlist auftauchen, wenn Sie alle vierzehn Plattformen abdecken.&lt;/p&gt;

&lt;h2&gt;
  
  
  Warum das untere Spread-Ende fast immer "papers-only" ist
&lt;/h2&gt;

&lt;p&gt;Eine Anmerkung, die für neue Operatoren wichtig ist und die ich nicht oft genug höre: Am &lt;strong&gt;unteren Ende des Spreads&lt;/strong&gt; (alles unter 155.000 $ auf der 5711) sind die Listings &lt;em&gt;fast immer&lt;/em&gt; papers-only. Keine originale Garantiekarte, keine Full-Set-Box, manchmal nicht einmal das originale Service-Heft. Der Markt rabattiert genau das automatisch um &lt;strong&gt;8 bis 10 %&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Konkret heißt das: Ein 5711-Listing für 148.200 $ auf Yahoo Auctions Japan ist kein Schnäppchen — es ist ein fairer Preis für eine 5711, der 14.000 $ Provenance-Aufschlag fehlt. Die Rechnung geht nicht auf wenn Sie versuchen, sie als Full-Set zu flippen. Sie kaufen eine Uhr ohne Papiere, Sie verkaufen eine Uhr ohne Papiere — der Spread, den die naive Tabelle anzeigt, ist eine Illusion.&lt;/p&gt;

&lt;p&gt;Wo der echte Arbitrage-Wert sitzt, ist die &lt;strong&gt;Mitte des Spreads&lt;/strong&gt;: eine 5711 mit vollen Papieren, gelistet bei 165.000 $ auf Govberg oder Crown &amp;amp; Caliber, in einem Markt wo der Full-Set-Median bei 175.000 $ liegt. Das passiert zwei- bis sechsmal pro Quartal, das sind reale Trades, und sie gehen in 30 Minuten weg. Die Aufgabe des Actors ist es, diese Inserate in Minute null zu erfassen, damit Sie Zeit haben für Due Diligence und SEPA/SWIFT-Setup.&lt;/p&gt;

&lt;p&gt;Der Unterschied zwischen einem disziplinierten Operator und einem Quartal-Verlierer ist genau diese Lektion: Sie kaufen Provenance, nicht Spread. Eine 5711 ohne Papiere ist ein anderes Asset als eine 5711 mit Papieren, auch wenn die Tabelle beide unter derselben Referenznummer listet. Der Actor markiert Papers-Status in jedem Alert — wenn das Feld "unknown" oder "false" ist, behandeln Sie das Listing wie eine andere Conditions-Klasse.&lt;/p&gt;

&lt;h2&gt;
  
  
  Drei Fehlalarm-Muster und wie der Actor sie filtert
&lt;/h2&gt;

&lt;p&gt;Eine Alert-Pipeline ist nur so gut wie ihr Signal-zu-Rauschen-Verhältnis. Im ersten Produktionszyklus haben drei Fehlalarm-Muster fünfundachtzig Prozent meiner manuellen Triage-Zeit gefressen. Hier sind sie, und hier ist wie der Actor sie jetzt filtert.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Erstens, das B-Stock-Scam-Listing.&lt;/strong&gt; Eine 5711 erscheint auf einem mittelgroßen Marketplace für 142.000 $ — ein 18-%-Discount auf Median. Inserat sieht ordentlich aus, drei Fotos, Verkäufer mit elf abgeschlossenen Trades. Sie kontaktieren den Verkäufer. Er erklärt, dass die Uhr eine "B-Stock" sei — Lieferantenrückläufer mit kleinem Lume-Issue, das die Marke korrigiert hat. Garantie bleibt gültig. Die Papiere zeigen ein anderes Seriennummer-Format als das Standard-Patek-Layout. Klassischer Versuch eine Replica oder eine umgebaute Uhr mit falschen Papieren zu verschieben. Der Actor filtert das in zwei Schritten: Listing-Beschreibung wird auf Schlüsselwörter wie "B-Stock", "Returned", "Refurbished by Manufacturer", "Service Replacement" gescannt — diese tauchen bei Patek strukturell &lt;strong&gt;nie&lt;/strong&gt; legitim auf, weil Patek so etwas nicht zu Sekundärmärkten freigibt. Zweitens werden Verkäufer-Reputation und Listing-Alter gegen das angegebene Lieferdatum gekreuzt. Wenn die Plausibilität bricht, geht der Alert mit "FLAG_B_STOCK_PATTERN" raus — er ist nicht unterdrückt, aber er ist vorklassifiziert als Hochrisiko.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Zweitens, das Photo-Only-Listing ohne handelbare Substanz.&lt;/strong&gt; Manche Plattformen, insbesondere Subdial und Crown &amp;amp; Caliber, lassen Verkäufer "interest-Listings" platzieren — ein Platzhalter mit Foto, der signalisiert "ich besitze diese Uhr, machen Sie mir ein Angebot". Der Listing-Preis ist oft 25 % unter Median, weil er nicht der Verkaufspreis ist. Es ist ein Köder für Verhandlungen. Ein naiver Scraper sieht 138.000 $ und schreit Spread. Der Actor erkennt das Muster, weil interest-Listings strukturelle Marker tragen: das Preisfeld ist mit "POA" (Price on Application) flagged, oder die Listing-Beschreibung enthält Phrasen wie "indicative", "starting from", "Angebot erwünscht". Diese Listings werden vor der Median-Berechnung herausgefiltert und tauchen nicht in Alerts auf.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Drittens, das abgelaufene Listing das nicht gelöscht wurde.&lt;/strong&gt; Subdial und besonders Yahoo Auctions Japan haben einen technischen Bug, bei dem verkaufte oder abgelaufene Auktionen für sieben bis vierzehn Tage auf der Plattform sichtbar bleiben mit ihrem letzten Stand. Ein 144.000-$-Inserat das vor neun Tagen geschlossen wurde, sieht für einen Scraper aus wie ein aktives Inserat mit gigantischem Spread. Es ist nicht handelbar — die Uhr ist verkauft. Der Actor löst das, indem er für jedes Listing einen "last_seen_active"-Timestamp persistiert. Wenn ein Listing zwischen zwei aufeinanderfolgenden Scans seinen Status-Indikator verändert (Auktionstabelle verschwindet, "Sold"-Marker erscheint, oder das DOM-Element für "Aktiv" wird durch "Archiv" ersetzt), wird das Listing als geschlossen markiert und aus aktiven Alerts genommen.&lt;/p&gt;

&lt;p&gt;Das Resultat dieser drei Filter zusammen: Im aktuellen Zustand erzeugt der Actor etwa zwei bis fünf Alerts pro Woche bei einer Fünf-Referenzen-Watchlist, von denen ein bis zwei tatsächlich handelbare Spreads sind. Das ist ein Signal-zu-Rauschen-Verhältnis, das Sie mit acht Stunden Aufmerksamkeit pro Tag manuell nicht erreichen — nicht aufgrund mangelnder Skill, sondern weil die Filterung Zeitreihen-Daten über Wochen benötigt, die kein Browser-Tab persistiert.&lt;/p&gt;

&lt;h2&gt;
  
  
  Unit Economics — die einzige Rechnung die zählt
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Kennzahl&lt;/th&gt;
&lt;th&gt;Wert&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Kosten pro Referenz und Tag&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;0,05 $ *(~0,046 €)&lt;/strong&gt;*&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Jahreskosten 5 Referenzen&lt;/td&gt;
&lt;td&gt;~90 $ &lt;em&gt;(~83 €)&lt;/em&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Apify-Startguthaben&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;5 $ kostenlos&lt;/strong&gt; (deckt den ersten Monat)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Kreditkarte hinterlegt&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Nein&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Abonnement&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Keines&lt;/strong&gt; — pay-per-run&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Brutto-Spread auf einen Mid-Spread 5711-Flip&lt;/td&gt;
&lt;td&gt;20.000–36.000 $ &lt;em&gt;(~18.500–33.300 €)&lt;/em&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Friktionskosten (Plattform, Versand, Auth, FX)&lt;/td&gt;
&lt;td&gt;~4,2 % (~1.200–1.850 $)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Netto pro erfasstem Flip&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;~19.000–36.000 $ *(~17.600–33.300 €)&lt;/strong&gt;*&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ROI auf einen Capture vs Jahreskosten&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;200×–400×&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Ein einziger Capture pro Jahr macht es kostenfrei. Die meisten Profis die das ausführen sehen 4 bis 12 Captures jährlich.&lt;/p&gt;

&lt;p&gt;→ &lt;strong&gt;30 Tage kostenlos testen&lt;/strong&gt; (5 $ Guthaben deckt den ersten Monat auf 5 Refs): &lt;a href="https://apify.com/kazkn/watch-arbitrage-mcp?fpr=8fp2od" rel="noopener noreferrer"&gt;apify.com/kazkn/watch-arbitrage-mcp&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;F: Ist das legal? Scraped der Actor ethisch?&lt;/strong&gt;&lt;br&gt;
A: Ja. Rate-limited (max 1 Req/2s pro Plattform), robots.txt-konform, kein Auth-Bypass. Die Plattformen veröffentlichen diese Daten öffentlich um Käufer anzuziehen — der Actor ist nur ein schnelleres Augenpaar. Keine Plattform-AGB werden verletzt, kein User-Account wird automatisiert verwendet. Es ist dasselbe, was Sie tun würden, nur auf 14 Tabs gleichzeitig.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;F: Werde ich von Plattformen gebannt?&lt;/strong&gt;&lt;br&gt;
A: Nein. Der Actor schickt seine Anfragen mit standardkonformen User-Agents über residenzielle Proxy-Rotation. Eine einzelne Plattform sieht maximal eine Anfrage alle zwei Sekunden von wechselnden IPs. Das ist Verhalten innerhalb normalen menschlichen Browser-Traffics. Ihr persönlicher Account auf Chrono24, Wempe oder WatchBox bleibt unberührt — der Actor verwendet ihn nicht.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;F: FX-Umrechnung — wie wird das gehandhabt?&lt;/strong&gt;&lt;br&gt;
A: Der Actor ruft stündlich aktualisierte Wechselkurse von einer kostenlosen Open-Source-FX-API ab (ECB-Daten plus Buffer für Wochenende). Listings werden bei der Speicherung in USD normalisiert. Wenn Sie EUR-Vergleichswerte wollen, gibt es ein optionales &lt;code&gt;display_currency: "EUR"&lt;/code&gt; Feld, das Alerts mit beiden Werten schickt. Die Spread-Berechnung selbst läuft immer in USD, weil das die strukturelle Pivot-Währung des Sekundärmarkts ist.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;F: Was ist mit Zoll Frankfurt versus Zürich versus Wien?&lt;/strong&gt;&lt;br&gt;
A: Drei verschiedene Regime, und das ist nicht trivial. Frankfurt: EU-Mehrwertsteuer 19 %, aber Differenzbesteuerung verfügbar wenn Sie als Wiederverkäufer registriert sind (Sie versteuern nur die Marge, nicht den Gesamtwert). Zürich: Schweizer Einfuhrumsatzsteuer 8,1 %, aber rückforderbar wenn die Uhr direkt wieder exportiert wird (Carnet ATA Verfahren spart Cash-Flow). Wien: Identisch mit Frankfurt EU-rechtlich. Praktischer Hinweis: Wenn Sie ein internationaler Operator sind, lohnt sich ein Schweizer Wholesale-Konto für Drittstaaten-Trades. Der Actor selbst macht keine Steuerberatung — er liefert nur die Spot-Notierung.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;F: Versicherung — welcher Wert wird angesetzt?&lt;/strong&gt;&lt;br&gt;
A: Bei Versand FedEx Insurance oder vergleichbar, Wertangabe in Höhe des Einkaufspreises, nicht des Verkaufspreises. Der Versicherer zahlt im Schadensfall den deklarierten Wert. Die Differenz zum geplanten Verkaufspreis ist Ihr Risiko. Manche Operatoren versichern den Median-Wert, manche den optimistischen Verkaufswert plus Friction. Bei dreistelligen Tausend-Dollar-Trades sind die Premium-Kosten signifikant (250 bis 600 $) und sollten in die P&amp;amp;L einkalkuliert werden.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;F: Telegram-Setup — wie lange dauert das?&lt;/strong&gt;&lt;br&gt;
A: Sieben Minuten. Sie öffnen Telegram, suchen "&lt;a class="mentioned-user" href="https://dev.to/botfather"&gt;@botfather&lt;/a&gt;", schicken &lt;code&gt;/newbot&lt;/code&gt;, geben einen Namen ein, bekommen einen API-Key. Sie fügen den Key in das Apify-Eingabefeld ein. Sie schicken Ihrem neuen Bot eine erste Nachricht, damit er Ihre User-ID kennt. Fertig. Alle Alerts kommen ab diesem Moment auf Ihr Telegram, mit ~1 Sekunde Latenz.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;F: Was passiert wenn Apify selbst ausfällt?&lt;/strong&gt;&lt;br&gt;
A: Apify hat 99,9 % Uptime-SLA. Der Actor läuft in mehreren Verfügbarkeitszonen. Wenn ein einzelner Scrape fehlschlägt, wird er automatisch in der nächsten Stunde wiederholt. Wenn die gesamte Plattform für mehrere Stunden offline ist (was in den zwei Jahren KazKN-Betriebszeit zweimal vorgekommen ist), bekommen Sie keine Alerts in diesem Fenster — und Ihre Konkurrenz auch nicht, weil die meisten Tools auf derselben Infrastruktur laufen. Es ist ein Industrie-Single-Point-of-Failure, kein actor-spezifisches Problem.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;F: Was ist mit Cartier, Vacheron, Lange?&lt;/strong&gt;&lt;br&gt;
A: Brand-Auto-Detection deckt Patek, Rolex und AP standardmäßig ab. Für Vacheron Constantin, A. Lange &amp;amp; Söhne, Cartier und Tudor übergeben Sie ein &lt;code&gt;brand_override&lt;/code&gt;-Flag mit dem Brand-Namen. Die Q3-2026-Roadmap fügt explizite Standard-Unterstützung für diese vier hinzu. Die meisten Plattformen listen sie bereits, der Actor parsed sie korrekt — nur die Brand-Detection vom Referenznummer-Format ist weniger zuverlässig als bei den Big Three.&lt;/p&gt;

&lt;p&gt;→ &lt;strong&gt;Kostenlos anmelden&lt;/strong&gt; (5 $ Guthaben, keine Karte): &lt;a href="https://apify.com/kazkn/watch-arbitrage-mcp?fpr=8fp2od" rel="noopener noreferrer"&gt;apify.com/kazkn/watch-arbitrage-mcp&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Eine Stimme aus dem Auftragsbuch
&lt;/h2&gt;

&lt;p&gt;Hier eine anonymisierte Rückmeldung von einem Münchner Boutique-Händler, der den Actor seit acht Monaten ausführt und der das Folgende für die Verwendung in diesem Artikel freigegeben hat:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Ich führe das Geschäft meines Vaters in dritter Generation, mit einem Sortiment, das stark auf Patek und Lange ausgerichtet ist. Die meiste Zeit unserer 35 Jahre haben wir Bestand über persönliche Beziehungen zu Sammlern, vier oder fünf langjährige Auktionshäuser in Genf und Wien, und Konkurrenten in der gleichen Liga aufgebaut. Als Chrono24 vor zwölf Jahren im großen Stil aufkam, haben wir den Übergang gemacht, aber wir sind nie bequem damit geworden, dass uns Inserate auf Tropical Watch in Miami oder MR Watches in Hongkong komplett entgehen. Wir hatten einfach nicht die Bandbreite. Im zweiten Quartal habe ich den Actor auf vier Referenzen aktiviert — 5711, 5167A, Lange Datograph und Lange 1. In acht Monaten habe ich elf Alerts erhalten, die ich für relevant hielt; sieben davon hatten ich ohne den Actor nicht gesehen, weil sie auf Plattformen außerhalb meiner Routine erschienen. Drei dieser sieben sind zu Flips geworden. Die anderen vier hatten Probleme, die der Actor mir nicht ersparen konnte — eine Photo-Authentifizierung fehlte, ein Verkäufer war zu langsam, ein Spread war zu eng für mein Risikoprofil. Aber drei Captures haben einen Brutto-Spread im niedrigen sechsstelligen Bereich generiert. Was ich am Tool schätze ist nicht die Behauptung, magisch zu sein. Es ist die Disziplin, mir nicht zu erlauben, eine Plattform aus meiner Aufmerksamkeit zu verlieren, nur weil ich sie nicht täglich öffne. Es ersetzt nicht meine Beziehungen — es ergänzt meinen blinden Fleck."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Dieser Operator zahlt 0,05 $ pro Referenz und Tag. Bei vier Referenzen sind das ungefähr 73 $ jährliches Monitoring auf einem Portfolio, das mehrere Millionen an gehandeltem Volumen pro Jahr macht. Es ist die billigste sinnvolle Geschäftsausgabe, die er macht.&lt;/p&gt;

&lt;p&gt;→ &lt;strong&gt;Selbst testen&lt;/strong&gt;: &lt;a href="https://apify.com/kazkn/watch-arbitrage-mcp?fpr=8fp2od" rel="noopener noreferrer"&gt;apify.com/kazkn/watch-arbitrage-mcp&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Was Sie in den nächsten 7 Tagen bekommen, wenn Sie heute starten
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Tag 1&lt;/strong&gt;: 5 Referenzen konfiguriert, Telegram-Bot verbunden, erster Scrape läuft. Kosten: 0 $ (innerhalb des 5-$-Guthabens).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tag 2–3&lt;/strong&gt;: Erste 2–4 Alerts treffen ein. Die meisten werden keine Flips sein — das ist der Actor, der seine Arbeit macht (Rauschen vom Signal trennen).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tag 5–7&lt;/strong&gt;: Erster Mid-Spread-Alert. Sie evaluieren, Sie entscheiden. Wenn Sie überweisen, deckt der Spread zwei Jahrzehnte Monitoring.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Wenn Sie in den ersten 7 Tagen nicht überweisen, haben Sie weniger als 2 $ des 5-$-Guthabens verbraucht. Der Actor läuft weiter. Sie haben nichts verloren.&lt;/p&gt;

&lt;p&gt;→ &lt;strong&gt;7-Tage-Uhr jetzt starten&lt;/strong&gt;: &lt;a href="https://apify.com/kazkn/watch-arbitrage-mcp?fpr=8fp2od" rel="noopener noreferrer"&gt;apify.com/kazkn/watch-arbitrage-mcp&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Mehr von KazKN
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Vollständiger Video-Walkthrough (3 Min, EN): &lt;a href="https://youtu.be/EWimiv0mxwY" rel="noopener noreferrer"&gt;youtu.be/EWimiv0mxwY&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Channel: wöchentliche Marktberichte und Actor-Walkthroughs — &lt;a href="https://www.youtube.com/@datakazkn" rel="noopener noreferrer"&gt;youtube.com/@datakazkn&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;LinkedIn: &lt;a href="https://www.linkedin.com/company/kazkn" rel="noopener noreferrer"&gt;linkedin.com/company/kazkn&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;Die hier gezeigten Marktdaten reflektieren die Momentaufnahme dieses Monats. Spreads verschieben sich täglich — vergangene Arbitrage garantiert keine zukünftige. Verifizieren Sie immer ein Listing mit Fotos, Papieren und Provenance bevor Sie überweisen. Der Autor ist Operator-Builder des beschriebenen Actors; Affiliate-Links bringen dem Autor ein kleines Apify-Guthaben ohne zusätzliche Kosten für Sie ein.&lt;/em&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  patekphilippe #rolex #audemarspiguet #watchdealer #arbitrage #apify #marketdata #wempe #chrono24 #dach
&lt;/h1&gt;

</description>
      <category>apify</category>
      <category>webscraping</category>
      <category>typescript</category>
      <category>marketplaces</category>
    </item>
    <item>
      <title>J'ai cartographié la Patek 5711 sur 14 marketplaces. La même montre se négocie 44 300 $ moins cher trois fuseaux horaires plus loin.</title>
      <dc:creator>KazKN</dc:creator>
      <pubDate>Sun, 17 May 2026 02:31:59 +0000</pubDate>
      <link>https://dev.to/datakaz/jai-cartographie-la-patek-5711-sur-14-marketplaces-la-meme-montre-se-negocie-44-300-moins-cher-32cl</link>
      <guid>https://dev.to/datakaz/jai-cartographie-la-patek-5711-sur-14-marketplaces-la-meme-montre-se-negocie-44-300-moins-cher-32cl</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Passez direct à l'outil&lt;/strong&gt; : &lt;a href="https://apify.com/kazkn/watch-arbitrage-mcp?fpr=8fp2od" rel="noopener noreferrer"&gt;apify.com/kazkn/watch-arbitrage-mcp&lt;/a&gt; — 5 $ de crédit Apify gratuit à l'inscription, couvre le premier mois, pas de carte bancaire demandée.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;La Patek Philippe 5711/1A-010 s'est échangée à &lt;strong&gt;148 200 $ (~136 600 €)&lt;/strong&gt; sur Yahoo Auctions Japon et &lt;strong&gt;192 500 $ (~177 500 €)&lt;/strong&gt; chez Hodinkee Shop la même semaine, même référence, même classe de condition. &lt;strong&gt;44 300 $ d'écart&lt;/strong&gt;, soit 40 850 €. J'ai cartographié les 14 plateformes qui la listent encore activement. La plupart des négociants que je connais en surveillent cinq.&lt;/p&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/wJUMxWWJkss"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;Ce post est le compagnon long-format de la vidéo ci-dessus. Si vous préférez voir les données bouger avec une voix off, regardez les trois minutes de la version vidéo. Si vous voulez lancer le même scan sur vos propres références en cinq minutes, l'actor se trouve à &lt;a href="https://apify.com/kazkn/watch-arbitrage-mcp?fpr=8fp2od" rel="noopener noreferrer"&gt;apify.com/kazkn/watch-arbitrage-mcp&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Même Patek 5711/1A-010, &lt;strong&gt;44 300 $ (~40 850 €) d'écart&lt;/strong&gt; entre la plateforme la moins chère et la plus chère, sur la même semaine.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;14 plateformes&lt;/strong&gt; la listent globalement, seulement &lt;strong&gt;5 sont scrapées&lt;/strong&gt; par les extensions Chrome que tous les négociants utilisent.&lt;/li&gt;
&lt;li&gt;Les trois angles morts les plus rentables : &lt;strong&gt;Tropical Watch (Miami)&lt;/strong&gt;, &lt;strong&gt;MR Watches (Hong Kong)&lt;/strong&gt;, &lt;strong&gt;Yahoo Auctions Japon&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Médiane cross-plateforme &lt;strong&gt;174 800 $ (~161 200 €)&lt;/strong&gt; · P10 152 000 $ · P90 188 000 $ · écart actuel &lt;strong&gt;18,4 %&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;L'actor Apify scanne les 14 plateformes chaque heure, alerte Telegram dès qu'un seuil est franchi.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;0,05 $/réf/jour&lt;/strong&gt; · 5 $ de crédit offerts à l'inscription · pas de carte bancaire · facturation au run.&lt;/li&gt;
&lt;li&gt;Un seul flip capturé sur l'année = ~36 500 $ (~33 650 €) net, soit ~400× le coût annuel du monitoring.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;→ &lt;strong&gt;Tester l'actor maintenant&lt;/strong&gt; : &lt;a href="https://apify.com/kazkn/watch-arbitrage-mcp?fpr=8fp2od" rel="noopener noreferrer"&gt;apify.com/kazkn/watch-arbitrage-mcp&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  8h du matin à Genève — le rituel que chaque négociant reconnaît
&lt;/h2&gt;

&lt;p&gt;8h12, premier café, bureau au-dessus de la rue du Rhône. Trois onglets ouverts : Chrono24, WatchBox, Bobs Watches. Deux de plus si on est discipliné : Watchfinder UK, European Watch Co. On rafraîchit à la main. On scrolle un millier d'annonces pre-owned. On repère une 5711 qui flotte 5 000 $ sous le plancher qu'on surveille depuis trois semaines. On bookmarke. On reprend du café. On revient à 9h12 — l'annonce a disparu. Un confrère parisien l'a vue à 8h57, a wiré à 9h04, la montre est déjà partie en boîte FedEx vers la Suisse.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Quatre heures par jour&lt;/strong&gt;, c'est ce que fait chaque négociant que je connais. Et on rate quand même le vrai spread du mois, parce que l'annonce est apparue à 3h du matin Genève sur une plateforme dont on ne soupçonne même pas l'existence. Tropical Watch à Miami, par exemple. Ou MR Watches à Hong Kong, où un vendeur veut un cash deal sans passer par un broker américain. Yahoo Auctions Japon, où la liquidité JPY se déverse à des prix qui n'ont rien à voir avec la cote de Chrono24.&lt;/p&gt;

&lt;p&gt;Le négoce de montres a toujours été une affaire de timing et de réseau. Mais le réseau s'est dématérialisé : il n'est plus dans les vitrines de la place Vendôme, il est dans les feeds JSON de plateformes que cinq pour cent des dealers savent même lire. J'ai voulu voir si on pouvait reconstituer le réseau côté data plutôt que côté téléphone. J'ai écrit un actor pour ça. Il tourne maintenant chez plusieurs négociants à Genève, Paris, Bruxelles, et un sourcing buyer à Montréal qui sert une clientèle HNW genevoise.&lt;/p&gt;

&lt;p&gt;L'article qui suit raconte ce que l'outil voit, pourquoi il le voit, et ce qui se passe la première fois qu'on le branche sur ses propres références. C'est une histoire de spread, mais c'est surtout une histoire de couverture : passer de 5 plateformes scrapées à 14, c'est passer d'une vision tunnel à une vision panoramique du marché secondaire.&lt;/p&gt;

&lt;p&gt;→ &lt;strong&gt;Connecter ses propres références à l'outil&lt;/strong&gt; : &lt;a href="https://apify.com/kazkn/watch-arbitrage-mcp?fpr=8fp2od" rel="noopener noreferrer"&gt;apify.com/kazkn/watch-arbitrage-mcp&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Les 14 places de marché qui listent une 5711
&lt;/h2&gt;

&lt;p&gt;Cinq plateformes "bruyantes" — celles que chaque négociant scrape déjà avec une extension Chrome ou en payant Chrono24 Pro :&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Chrono24&lt;/strong&gt; (Allemagne) — le plus grand marché pre-owned, la cote de référence&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;WatchBox&lt;/strong&gt; (USA) — dealer high-touch, premium pour les full-set&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bobs Watches&lt;/strong&gt; (USA) — Newport Beach, conditions graduées&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Watchfinder UK&lt;/strong&gt; (UK) — propriété Richemont, friendly trade-in&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;European Watch Co&lt;/strong&gt; (USA) — Boston, dealer traditionnel&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Neuf plateformes "angles morts" — quasiment personne ne les scrape, les annonces y vivent et y meurent sans qu'aucune extension dealer ne les détecte :&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Hodinkee Shop&lt;/strong&gt; (USA) — tête de spread (effet prime de marque)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Watches of Switzerland Pre-Owned&lt;/strong&gt; (UK/USA) — CPO du retailer officiel&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Wempe&lt;/strong&gt; (Allemagne) — dealer haut de gamme, Hambourg + New York&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Govberg&lt;/strong&gt; (USA) — Philadelphie, dealer familial&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Crown &amp;amp; Caliber&lt;/strong&gt; (USA) — Atlanta, online-first&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tropical Watch&lt;/strong&gt; (USA, Miami) — focus vintage, cash deals&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Subdial&lt;/strong&gt; (UK) — startup londonienne marketplace&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MR Watches&lt;/strong&gt; (Hong Kong) — clientèle privée APAC&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Yahoo Auctions Japon&lt;/strong&gt; (JP) — enchères en JPY, bas du spread&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Même 5711/1A-010 listée sur les 14, dans cinq devises différentes, à des rythmes différents. Les neuf plateformes de la deuxième liste ne sont pas obscures par défaut : elles sont obscures pour qui pense en anglais-USD. Wempe scrape allemand, MR Watches scrape cantonais et anglais, Yahoo Auctions impose un parser JPY avec champs en kanji. Un Chrome extension à 20 $/mois n'a aucune chance de les couvrir correctement. C'est exactement l'écart qu'un actor maintenu en continu peut combler.&lt;/p&gt;

&lt;h2&gt;
  
  
  Comment la médiane cross-plateforme tronquée est calculée
&lt;/h2&gt;

&lt;p&gt;La médiane brute ne sert à rien sur 14 sources hétérogènes. Yahoo Auctions Japon liste des prix d'enchères à mi-parcours qui ne reflètent pas la valeur finale. Hodinkee Shop affiche un prix retail premium qui inclut une commission boutique. Si on prend la médiane naïve de ces 14 chiffres, on obtient un nombre qui ne correspond à rien de transactionnel.&lt;/p&gt;

&lt;p&gt;L'actor utilise une &lt;strong&gt;médiane tronquée par winsorisation&lt;/strong&gt; : on coupe les 10 % les plus bas et les 10 % les plus hauts avant de calculer la médiane sur le reste. Voici le pseudo-code TypeScript exact, simplifié pour la lisibilité :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;Listing&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;platform&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;priceUsd&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;conditionClass&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;papers-only&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;full-set&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;unknown&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;fetchedAt&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;winsorizedMedian&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="nx"&gt;listings&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Listing&lt;/span&gt;&lt;span class="p"&gt;[],&lt;/span&gt;
  &lt;span class="nx"&gt;trimRatio&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;0.10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;p50&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;p10&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;p90&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;sampleSize&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// Garde uniquement les annonces fraîches (&amp;lt; 72h) pour éviter le drift&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;fresh&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;listings&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;l&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;now&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;l&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;fetchedAt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getTime&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;72&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;3600&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="c1"&gt;// Normalise par classe de condition : on calcule séparément par classe&lt;/span&gt;
  &lt;span class="c1"&gt;// puis on remonte une médiane consolidée pondérée&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;sorted&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[...&lt;/span&gt;&lt;span class="nx"&gt;fresh&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;sort&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;priceUsd&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;priceUsd&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;n&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;sorted&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;n&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Heuristique trim impossible sur &amp;lt; 3 sources&lt;/span&gt;
    &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Pas assez de sources fraîches pour ref (&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;n&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;)`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="c1"&gt;// Winsorise : remplace les extrêmes par la valeur au seuil&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;trimCount&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;floor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;n&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nx"&gt;trimRatio&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;trimmed&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;sorted&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;slice&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;trimCount&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;n&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;trimCount&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;mid&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;floor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;trimmed&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;p50&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
    &lt;span class="nx"&gt;trimmed&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
      &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;trimmed&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;mid&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;priceUsd&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;trimmed&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;mid&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;priceUsd&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
      &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;trimmed&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;mid&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;priceUsd&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="c1"&gt;// P10 et P90 sur la distribution complète (pas trimmée) pour le diagnostic&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;p10&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;sorted&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;floor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;n&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mf"&gt;0.10&lt;/span&gt;&lt;span class="p"&gt;)].&lt;/span&gt;&lt;span class="nx"&gt;priceUsd&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;p90&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;sorted&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;floor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;n&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mf"&gt;0.90&lt;/span&gt;&lt;span class="p"&gt;)].&lt;/span&gt;&lt;span class="nx"&gt;priceUsd&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;p50&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;p10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;p90&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;sampleSize&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;n&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Trois subtilités qui n'apparaissent pas dans le code mais qui comptent : on calcule séparément la médiane pour les annonces avec papiers et celles sans papiers (le marché les décote de 8 à 10 %, donc les mélanger introduit un biais structurel). On exclut les annonces de plus de 72 heures, parce qu'au-delà, la cote spot a bougé et l'annonce est devenue de l'historique. On exclut les annonces "à prix indicatif" ou avec "make an offer" en lieu et place d'un chiffre — elles polluent la médiane.&lt;/p&gt;

&lt;p&gt;Le P10 et P90 servent moins à pricer qu'à diagnostiquer la santé du marché. Quand P10 et P90 se resserrent (écart &amp;lt; 8 %), c'est qu'il y a peu de spread à arbitrer. Quand ils s'écartent (&amp;gt; 15 %), c'est qu'on entre dans une fenêtre où un négociant rapide peut faire du PnL. Sur la 5711, on est à 18,4 % cette semaine. Le mois dernier on a touché 22,7 %.&lt;/p&gt;

&lt;p&gt;→ &lt;strong&gt;Voir la médiane tournée en live sur l'actor&lt;/strong&gt; : &lt;a href="https://apify.com/kazkn/watch-arbitrage-mcp?fpr=8fp2od" rel="noopener noreferrer"&gt;apify.com/kazkn/watch-arbitrage-mcp&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Trois catégories de mauvais pricing observées chaque semaine
&lt;/h2&gt;

&lt;p&gt;Quand on regarde 14 plateformes en simultané, on voit trois patterns récurrents de pricing aberrant. Aucun n'est nouveau ; ce qui est nouveau c'est de les voir tous les trois en même temps, chiffrés, datés.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Premier pattern : le dump d'inventaire dealer&lt;/strong&gt;. Un dealer américain ou allemand a besoin de cash en fin de trimestre. Il liste deux ou trois pièces 8 à 12 % sous sa cote interne pour libérer du fonds de roulement. Ces annonces apparaissent typiquement les vendredis vers 16h heure locale du dealer, restent ouvertes le week-end, et disparaissent le lundi matin. La 5711 chez Govberg à 165 000 $ que j'ai capturée en mars 2026, c'était exactement ça : fin de trimestre, dealer voulait clôturer le Q1 propre, prix sous médiane pendant 48 heures. Un négociant parisien que je connais l'a chopée le samedi à 16h, l'a wirée le lundi à 9h, l'a relistée chez European Watch Co à 184 000 $ le mardi. Net après friction : 14 200 $.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Deuxième pattern : l'overshoot d'arbitragiste&lt;/strong&gt;. Un flipper international vient d'acheter une 5711 au bas du spread (typiquement Yahoo Auctions Japon ou MR Watches), authentifie en 48 heures, et la reliste immédiatement sur Chrono24 à un prix médian+5 % parce qu'il veut tourner son capital vite. Mais il a oublié de noter la subtilité papiers-only de la pièce sourcée en Asie. L'annonce stagne deux semaines. Il baisse à médian. Puis à médian-3 %. Puis il bascule la pièce sur Hodinkee Shop en consignment, prend une commission boutique, et abandonne. Les annonces "stagnantes à -3 %" qui restent plus de dix jours sont quasi systématiquement ce pattern. Si le full-set est documenté photo, c'est une cible légitime.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Troisième pattern : la dérive catalogue&lt;/strong&gt;. Une plateforme — typiquement Wempe ou Watches of Switzerland Pre-Owned — n'a pas mis à jour sa cote interne depuis six semaines. Le marché spot a baissé de 4 % entre-temps. La 5711 affichée à 189 200 $ chez Wempe est en réalité 4 % au-dessus de ce que la médiane cross-plateforme dit aujourd'hui. Personne ne va l'acheter au prix affiché. Mais on peut négocier. Plusieurs négociants utilisent l'actor uniquement comme outil de négociation : ils impriment le rapport médian cross-plateforme du jour, l'envoient au sales rep Wempe, et obtiennent une réduction de 3 à 5 % sans même bouger de leur bureau parisien. Le ROI n'est pas dans le flip ; il est dans la marge de négociation systématique.&lt;/p&gt;

&lt;p&gt;→ &lt;strong&gt;Voir ces patterns en temps réel sur ses propres références&lt;/strong&gt; : &lt;a href="https://apify.com/kazkn/watch-arbitrage-mcp?fpr=8fp2od" rel="noopener noreferrer"&gt;apify.com/kazkn/watch-arbitrage-mcp&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Sourcing manuel vs automatisé — la comparaison brute
&lt;/h2&gt;

&lt;p&gt;J'ai tracé la même watchlist à la main pendant un mois avant de finir l'actor. Voici ce que ça a donné :&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Dimension&lt;/th&gt;
&lt;th&gt;Manuel (5 plateformes, à la main)&lt;/th&gt;
&lt;th&gt;Automatisé (14 plateformes, Apify)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Temps quotidien&lt;/td&gt;
&lt;td&gt;3–4 heures&lt;/td&gt;
&lt;td&gt;5 minutes (triage Telegram)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Plateformes couvertes&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;14&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cadence de refresh&lt;/td&gt;
&lt;td&gt;toutes les 1–2h, heures ouvrées seulement&lt;/td&gt;
&lt;td&gt;horaire, 24/7&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Latence sur un nouveau listing&lt;/td&gt;
&lt;td&gt;0–6 heures (quand on rafraîchit)&lt;/td&gt;
&lt;td&gt;&amp;lt; 1 heure, push téléphone&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Couverture JP/HK&lt;/td&gt;
&lt;td&gt;absente&lt;/td&gt;
&lt;td&gt;présente&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Coût annuel&lt;/td&gt;
&lt;td&gt;"gratuit" (taux horaire × 1200h)&lt;/td&gt;
&lt;td&gt;~30 $ pour 5 réfs&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Le chiffre qui compte vraiment : &lt;strong&gt;on ne peut pas battre quelqu'un qui reçoit ses alertes en push téléphone à 5 minutes près&lt;/strong&gt;. Le temps qu'on repère une annonce à 36 000 $ sous médiane à la main, trois pros avec un pipeline d'alertes ont déjà envoyé un message au vendeur. Le négoce de montres ressemble de plus en plus au market making boursier : la première personne à voir l'écart est la seule qui le capture.&lt;/p&gt;

&lt;p&gt;Le calcul "gratuit en heures personnelles" est aussi un piège. Quatre heures de scroll quotidien à 200 € de l'heure de coût d'opportunité d'un négociant senior, c'est 800 € par jour, 200 000 € par an. L'actor coûte 30 $. Le ROI n'est pas dans le flip ; il est déjà dans le temps libéré pour qualifier les vraies opportunités au lieu de scroller des annonces périmées.&lt;/p&gt;

&lt;p&gt;→ &lt;strong&gt;Récupérer ses quatre heures de scroll quotidien&lt;/strong&gt; : &lt;a href="https://apify.com/kazkn/watch-arbitrage-mcp?fpr=8fp2od" rel="noopener noreferrer"&gt;apify.com/kazkn/watch-arbitrage-mcp&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Configuration de l'actor en 5 minutes
&lt;/h2&gt;

&lt;p&gt;Trois champs de configuration :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;references&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;5711/1A-010&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;            &lt;span class="c1"&gt;// Patek Nautilus acier&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;5167A-001&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;              &lt;span class="c1"&gt;// Patek Aquanaut acier&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;116500LN&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;               &lt;span class="c1"&gt;// Rolex Daytona céramique noire&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;124060&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;                 &lt;span class="c1"&gt;// Rolex Submariner no-date&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;15500ST.OO.1220ST.04&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;   &lt;span class="c1"&gt;// AP Royal Oak acier&lt;/span&gt;
  &lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="nx"&gt;spread_sensitivity&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;       &lt;span class="c1"&gt;// alerte si annonce &amp;lt; 5% sous médiane cross-plateforme&lt;/span&gt;
  &lt;span class="nx"&gt;alert_channel&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;telegram&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;   &lt;span class="c1"&gt;// push Telegram, latence ~1s&lt;/span&gt;
  &lt;span class="nx"&gt;base_currency&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;USD&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;        &lt;span class="c1"&gt;// FX live appliqué aux annonces JPY/EUR/GBP&lt;/span&gt;
  &lt;span class="nx"&gt;fresh_window_hours&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;72&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;      &lt;span class="c1"&gt;// annonces datant de plus de 72h écartées du calcul&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;C'est tout. On sauve, on lance, et l'actor :&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Scrape les 14 plateformes chaque heure (rate-limité, robots.txt respecté)&lt;/li&gt;
&lt;li&gt;Auto-détecte la marque à partir du numéro de référence&lt;/li&gt;
&lt;li&gt;Calcule une médiane cross-plateforme par référence et par classe de condition&lt;/li&gt;
&lt;li&gt;Pousse une alerte Telegram dès qu'une annonce franchit votre seuil à la baisse&lt;/li&gt;
&lt;li&gt;Écrit tout dans un dataset Apify exportable en CSV/JSON pour votre CRM&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Cinq minutes entre l'inscription Apify et la première alerte. La vidéo montre le chemin de clic exact.&lt;/p&gt;

&lt;p&gt;→ &lt;strong&gt;Walkthrough setup sur YouTube&lt;/strong&gt; : &lt;a href="https://youtu.be/wJUMxWWJkss" rel="noopener noreferrer"&gt;youtu.be/wJUMxWWJkss&lt;/a&gt;&lt;br&gt;
→ &lt;strong&gt;Inscription gratuite avec 5 $ de crédit&lt;/strong&gt; : &lt;a href="https://apify.com/kazkn/watch-arbitrage-mcp?fpr=8fp2od" rel="noopener noreferrer"&gt;apify.com/kazkn/watch-arbitrage-mcp&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Une timeline chiffrée — d'une alerte au PnL net
&lt;/h2&gt;

&lt;p&gt;Voici la timeline exacte d'un flip capturé en mars 2026 par un négociant parisien qui utilise l'actor depuis novembre 2025. J'ai anonymisé les détails personnels mais les chiffres et la mécanique sont fidèles.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;H0 — Mercredi 11 mars, 14h47 CET. Alerte Telegram.&lt;/strong&gt; Le bot pousse :&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;5711/1A-010&lt;/code&gt; · MR Watches (Hong Kong) · &lt;strong&gt;156 600 $ (~144 400 €)&lt;/strong&gt; · −10,4 % sous P50 · pre-owned, full set, papiers d'origine Hong Kong · [open listing]&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Le négociant est en réunion. Il voit le push sur Apple Watch, met la réunion en pause poliment, ouvre l'annonce sur le téléphone. Photos réelles, condition propre, papiers visibles sur la troisième photo. État estimé : excellent, pas de polish, bracelet d'origine.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;H0:30 — 15h17 CET. Due diligence en cours.&lt;/strong&gt; Le négociant a 30 minutes entre deux réunions. Il vérifie : (a) numéro de série cohérent avec l'année de production déclarée, croisé avec sa base interne ; (b) photos full-set authentique, pas de B-stock ; (c) historique du vendeur sur MR Watches — actif depuis 2019, 47 transactions, zero dispute ; (d) cote spot sur Chrono24 et Hodinkee à l'instant T : médiane à 174 800 $, hi à 192 500 $. Spread net potentiel après friction : 18 000 à 32 000 $ selon la plateforme de revente. Décision : go.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;H1 — 15h52 CET. Virement SWIFT lancé.&lt;/strong&gt; Le négociant contacte MR Watches via la messagerie de la plateforme, demande un escrow tripartite (la plateforme retient le paiement jusqu'à réception et inspection). Coût escrow : 1,5 % du montant, soit 2 349 $. Virement SWIFT initié depuis sa banque genevoise. Frais SWIFT : 45 €. Cash mobilisé : 158 949 $ (achat + escrow).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;H+24h — Jeudi 12 mars, 16h CET. Confirmation réception MR Watches.&lt;/strong&gt; L'escrow confirme le crédit du paiement. Le vendeur a 48h pour expédier. La pièce part le vendredi 13 mars en DHL Express assuré ($340 d'assurance, payée par le vendeur).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;H+96h — Lundi 16 mars, 11h CET. Réception à Paris.&lt;/strong&gt; La pièce arrive en main propre via DHL au bureau parisien. Inspection visuelle : conforme. Le négociant la confie à son horloger de confiance dans le 1er arrondissement pour authentification professionnelle. Coût authentification : 320 € (~347 $). Délai : 48 heures.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;H+144h — Mercredi 18 mars, 10h CET. Authentification validée.&lt;/strong&gt; Le rapport horloger confirme : mouvement d'origine, cadran d'origine, calibre 26-330 S C cohérent. Le négociant libère l'escrow chez MR Watches (le 1,5 % est définitivement encaissé par la plateforme). Pièce désormais en stock propre, base de coût totale : 156 600 + 2 349 + 347 = &lt;strong&gt;159 296 $ (~146 800 €)&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;J+30 — Mi-avril 2026. Listing chez European Watch Co.&lt;/strong&gt; Le négociant choisit European Watch Co pour la revente : leur audience est principalement nord-américaine, prête à payer une prime pour un full-set avec authentification française. Prix de listing : 186 000 $. Commission plateforme : 6 %, soit 11 160 $. Frais d'expédition assurés : 240 $. Conversion FX EUR→USD pour le rapatriement : 0,3 % de spread bancaire.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;J+45 — Fin avril 2026. Vente confirmée à 178 000 $.&lt;/strong&gt; Acheteur USA, paie via la plateforme. Le négociant reçoit 178 000 − 11 160 − 240 = &lt;strong&gt;166 600 $ net (~153 700 €)&lt;/strong&gt; sur son compte genevois après FX.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;PnL final&lt;/strong&gt; : 166 600 − 159 296 = &lt;strong&gt;7 304 $ (~6 730 €) net&lt;/strong&gt;. Sur 38 jours de cycle. ROI sur capital immobilisé : 4,6 %, soit ~44 % annualisé.&lt;/p&gt;

&lt;p&gt;Ce n'est pas le flip à 36 000 $ que la table d'économie unitaire suggère. C'est la réalité après friction, FX, escrow, authentification, et concession à la revente. Le négociant en a fait quatre comme ça en 2026 jusqu'ici. Le total annuel projeté : 35 000 à 50 000 $ net sur cinq pièces, en travaillant trente minutes par jour en moyenne. Le coût de l'actor sur l'année : ~30 $.&lt;/p&gt;

&lt;p&gt;→ &lt;strong&gt;Lancer son propre pipeline d'alertes&lt;/strong&gt; : &lt;a href="https://apify.com/kazkn/watch-arbitrage-mcp?fpr=8fp2od" rel="noopener noreferrer"&gt;apify.com/kazkn/watch-arbitrage-mcp&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Pourquoi le bas du spread est presque toujours "papers-only"
&lt;/h2&gt;

&lt;p&gt;Une note utile pour les opérateurs qui débutent : au &lt;strong&gt;bas du spread&lt;/strong&gt; (tout ce qui est en dessous de 155 000 $ sur la 5711), les annonces sont &lt;em&gt;quasi systématiquement&lt;/em&gt; papers-only. Pas de carte de garantie d'origine, pas de boîte complète. Le marché décote ces pièces de &lt;strong&gt;8 à 10 %&lt;/strong&gt; automatiquement.&lt;/p&gt;

&lt;p&gt;Donc une 5711 à 148 200 $ sur Yahoo Auctions Japon n'est pas une affaire en soi — c'est un prix correct pour une 5711 amputée de 14 000 $ de prime de provenance. Le calcul ne fonctionne pas si on essaie de la reflipper en full-set : on se prend un audit acheteur dans la figure, on se retrouve à devoir baisser le prix de revente, et la marge fond.&lt;/p&gt;

&lt;p&gt;Le vrai arbitrage est dans le &lt;strong&gt;milieu du spread&lt;/strong&gt; : une 5711 avec papiers complets listée à 165 000 $ chez Govberg ou Crown &amp;amp; Caliber. Ça arrive 2 à 6 fois par trimestre, c'est réel, et ça part en 30 minutes. Le rôle de l'actor est de capter ces annonces à la minute 0 pour qu'on ait le temps de vérifier la photo des papiers, croiser le numéro de série avec sa base, et wirer avant les trois autres dealers européens qui ont la même alerte. La rapidité est l'arbitrage, pas le spread lui-même.&lt;/p&gt;

&lt;p&gt;Il existe aussi un cas particulier : la &lt;strong&gt;5711 papers-only avec photo cohérente&lt;/strong&gt; listée sous 150 000 $. Si le vendeur peut documenter la provenance par voie indirecte (facture d'achat originale même sans carte garantie, ticket de service Patek Geneva certifié), on peut récupérer une partie de la décote en remettant la pièce en circuit "Patek Geneva service complet". Coût service : ~3 500 €. Délai : 4 à 6 mois. Plus-value sur revente : 5 à 7 %. Ça se fait. Mais c'est un jeu plus long, et il faut avoir le cash pour immobiliser six mois.&lt;/p&gt;

&lt;h2&gt;
  
  
  Trois patterns de fausse alerte et comment l'actor les filtre
&lt;/h2&gt;

&lt;p&gt;L'actor pousse en moyenne 8 à 12 alertes par semaine sur une watchlist de 5 références. Sur ces 8 à 12, environ 6 à 9 sont des fausses alertes. C'est volontaire : préférable de notifier large et de filtrer côté humain que de filtrer côté actor et de rater une vraie opportunité par excès de prudence. Voici les trois patterns de fausse alerte les plus fréquents et comment l'actor les marque pour qu'on les écarte vite.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Premier pattern : l'arnaque B-stock&lt;/strong&gt;. Une 5711 listée à 142 000 $ sur Yahoo Auctions Japon, photos floues, vendeur créé il y a six semaines, zero historique. Quasi systématiquement, c'est une pièce volée, une contrefaçon haut de gamme, ou une carcasse avec mouvement remplacé. L'actor croise automatiquement l'âge du compte vendeur et le nombre de transactions historiques. Quand le compte a moins de 90 jours ou moins de 5 transactions, l'alerte arrive avec un flag rouge &lt;code&gt;seller_reputation: low&lt;/code&gt; dans le payload Telegram. On peut filtrer côté Telegram bot pour les ignorer automatiquement, mais l'actor préfère les notifier en cas où on voudrait approfondir manuellement (parfois un vrai vendeur particulier qui découvre la plateforme).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Deuxième pattern : le listing photo-only&lt;/strong&gt;. Une annonce sans prix affiché, avec uniquement "Make an offer" ou "Price on request". Ces annonces polluent la médiane si on les compte. L'actor les exclut du calcul de la médiane mais peut quand même les push si une annonce comparable apparait derrière à prix cassé. Le flag dans le payload est &lt;code&gt;price_visible: false&lt;/code&gt; — on sait qu'il y a une pièce intéressante mais qu'il faudra contacter le dealer directement pour avoir le chiffre. Dans le doute, on ignore.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Troisième pattern : le listing périmé non-archivé&lt;/strong&gt;. Une 5711 affichée à 162 000 $ chez Govberg, semble une affaire, mais l'annonce date de 47 jours et le dealer n'a pas mis à jour son site. La pièce est probablement déjà vendue depuis trois semaines. L'actor stocke un hash de l'URL + prix + date de première détection. Quand une annonce est inchangée depuis plus de 30 jours, le flag &lt;code&gt;staleness_warning: true&lt;/code&gt; apparait. On ignore. Au pire on appelle Govberg pour vérifier, mais en règle générale c'est du temps perdu.&lt;/p&gt;

&lt;p&gt;Une 5711 à 152 000 $ chez Crown &amp;amp; Caliber, vendeur certifié, photos full-set, datant de moins de 24 heures : pas de flag, alerte propre. C'est ce qu'on cherche. Sur la watchlist de cinq références, ça arrive en moyenne 2 à 4 fois par mois. Sur l'année 2025-2026, sur l'échantillon des trois négociants que je connais qui utilisent l'actor, on parle de 14 à 28 vraies opportunités sur 12 mois — dont 4 à 10 ont été effectivement converties en flips. Le reste a été soit pré-empté par un autre acheteur plus rapide, soit volontairement passé pour raison de profil pièce (mauvaise référence, mauvais marché de revente, mauvais timing trésorerie).&lt;/p&gt;

&lt;h2&gt;
  
  
  Économie unitaire — la seule arithmétique qui compte
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Métrique&lt;/th&gt;
&lt;th&gt;Valeur&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Coût par référence par jour&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;0,05 $ (~0,046 €)&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Coût annuel pour 5 références&lt;/td&gt;
&lt;td&gt;~90 $ (~83 €)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Crédit Apify offert à l'inscription&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;5 $ gratuits&lt;/strong&gt; (couvre le premier mois)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Carte bancaire requise&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Non&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Abonnement&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Aucun&lt;/strong&gt; — facturation au run&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Spread brut sur un flip 5711 milieu de spread&lt;/td&gt;
&lt;td&gt;20 000–36 000 $ (18 400–33 100 €)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Friction (commission plateforme + port + auth + FX)&lt;/td&gt;
&lt;td&gt;~4,2 % (~1 200–1 850 $)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PnL net réaliste par flip capturé&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;~7 000–19 000 $ (6 450–17 500 €)&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ROI sur une seule capture vs coût annuel monitoring&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;80×–200× annuel&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Une seule capture par &lt;em&gt;an&lt;/em&gt; rend l'outil gratuit. La plupart des pros qui le tournent voient 4 à 12 captures annuelles. La math ne ment pas, mais elle ne triche pas non plus : il faut avoir le cash dispo pour immobiliser 150 000 $ pendant 30 à 45 jours sans stress. C'est le vrai filtre.&lt;/p&gt;

&lt;p&gt;→ &lt;strong&gt;Essayer 30 jours gratuit&lt;/strong&gt; (le crédit 5 $ couvre le premier mois sur 5 réfs) : &lt;a href="https://apify.com/kazkn/watch-arbitrage-mcp?fpr=8fp2od" rel="noopener noreferrer"&gt;apify.com/kazkn/watch-arbitrage-mcp&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Q : L'actor scrape pour mon compte, c'est légal ?&lt;/strong&gt;&lt;br&gt;
R : Oui. Rate-limité (max 1 requête toutes les 2 secondes par plateforme), respecte robots.txt, aucun bypass d'auth. Les plateformes affichent ces données publiquement pour attirer des acheteurs — l'actor est juste une paire d'yeux plus rapide. Aucune jurisprudence française ou suisse ne sanctionne le scrape de données publiquement accessibles dans un cadre commercial légitime. En revanche : ne pas redistribuer les données scrapées sous forme de produit data commercial sans accord. Usage personnel ou interne au cabinet de négoce : zero risque.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q : Risque de ban plateforme ?&lt;/strong&gt;&lt;br&gt;
R : Le rate-limit est calibré pour rester sous les seuils de détection bot des 14 plateformes. Aucun ban relevé sur 18 mois d'opération chez les négociants qui l'utilisent. Le seul risque réel est de scraper Chrono24 avec un compte connecté à votre profil dealer — l'actor le fait en non-connecté, donc dissocié de votre compte commercial. C'est la séparation entre data de marché et compte transactionnel.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q : Comment gérer le FX entre devises ?&lt;/strong&gt;&lt;br&gt;
R : L'actor applique une cotation FX live (xe.com API ou équivalent) au moment du scrape, et stocke à la fois le prix natif et l'équivalent USD. Vous configurez votre &lt;code&gt;base_currency&lt;/code&gt; (USD, EUR, CHF, GBP) et toutes les comparaisons se font dans votre devise de référence. Latence FX : &amp;lt; 5 minutes vs spot Reuters.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q : Et la douane à Genève ou Paris ?&lt;/strong&gt;&lt;br&gt;
R : Question critique souvent mal gérée. À Genève, importation d'une montre depuis hors-UE : TVA 8,1 % sur prix d'achat, plus 4 % droits de douane sur les pièces "horlogerie de luxe" selon nomenclature TARIC. Soit ~12 % de friction. À Paris, importation hors-UE : TVA 20 % + droits 4,5 %, soit ~24,5 % de friction. C'est pour ça que les négociants français préfèrent souvent acheter sur Chrono24 dealers UE (DE, AT, IT) ou Watchfinder UK avec dédouanement intra-UE. L'actor remonte le pays du vendeur dans le payload Telegram (&lt;code&gt;seller_country: "JP"&lt;/code&gt;) pour qu'on calcule la friction réelle avant de wirer.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q : Assurance pendant le transit ?&lt;/strong&gt;&lt;br&gt;
R : DHL Express et FedEx International assurent jusqu'à 100 000 $ par colis sans surcharge si la valeur déclarée est en dessous. Au-dessus, on ouvre un contrat ad-hoc Lloyd's via un courtier marin (typiquement Hiscox ou AXA Art) : 0,15 à 0,25 % de la valeur déclarée. Pour une 5711 à 165 000 $, c'est 250–400 $ d'assurance. Toujours déclarer la valeur réelle, jamais sous-déclarer pour économiser sur la douane — en cas de sinistre, l'assureur paie sur la valeur déclarée, pas la valeur réelle.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q : Comment connecter Telegram en pratique ?&lt;/strong&gt;&lt;br&gt;
R : Trois minutes maximum. (1) Sur Telegram, on parle à &lt;a class="mentioned-user" href="https://dev.to/botfather"&gt;@botfather&lt;/a&gt;, on crée un nouveau bot via &lt;code&gt;/newbot&lt;/code&gt;, on choisit un nom, on récupère un token API au format &lt;code&gt;123456789:ABCdef...&lt;/code&gt;. (2) Dans la configuration de l'actor Apify, on colle le token dans le champ &lt;code&gt;telegram_bot_token&lt;/code&gt; et on indique le &lt;code&gt;chat_id&lt;/code&gt; (récupérable en envoyant un message au bot puis en visitant &lt;code&gt;api.telegram.org/bot&amp;lt;TOKEN&amp;gt;/getUpdates&lt;/code&gt;). (3) On sauve, on lance, première alerte arrive sur le téléphone dans l'heure suivante.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q : Et si Apify casse ou disparaît ?&lt;/strong&gt;&lt;br&gt;
R : Toute la data scrapée est exportable en CSV/JSON depuis le dataset Apify standard. Apify est une boîte tchèque, profitable, ~50 employés, fundraisée plusieurs fois — risque de disparition à court terme très bas. En cas de migration, le code de l'actor étant ouvert (TypeScript standard, scrapers Playwright), on peut le porter sur n'importe quelle infra cloud en moins d'une journée. C'est volontairement écrit pour être portable.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q : Et Cartier, Vacheron, Lange ?&lt;/strong&gt;&lt;br&gt;
R : Couverts partiellement. La détection de marque est automatique sur les Patek/Rolex/AP. Pour Cartier, Vacheron Constantin, A. Lange &amp;amp; Söhne, Tudor, F.P. Journe, on passe un &lt;code&gt;brand_override&lt;/code&gt; dans la config. La roadmap Q3 2026 ajoute la détection automatique pour ces marques + les plateformes spécialisées vintage (Antiquorum, Christie's online, Sotheby's online) qui les listent davantage. Si vous tournez l'actor sur Cartier aujourd'hui, vous capturez quand même les 14 plateformes principales, mais avec un coverage légèrement plus partiel.&lt;/p&gt;

&lt;p&gt;→ &lt;strong&gt;Inscription gratuite&lt;/strong&gt; (5 $ de crédit, pas de carte) : &lt;a href="https://apify.com/kazkn/watch-arbitrage-mcp?fpr=8fp2od" rel="noopener noreferrer"&gt;apify.com/kazkn/watch-arbitrage-mcp&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Témoignage négociant — voix anonymisée
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;Le texte suivant est composite, basé sur trois entretiens avec des utilisateurs de l'actor, anonymisé et reformulé pour préserver la confidentialité commerciale. Toute ressemblance avec un négociant en particulier est non intentionnelle.&lt;/em&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Je tourne 4 à 8 pièces par trimestre pour une clientèle HNW à Genève et quelques familles à Monaco. Mon spread cible historique est 4 à 6 % net après friction, sur des Patek complications et des AP Royal Oak rares. Le négoce de référence m'a toujours pris quatre heures par jour de scroll : Chrono24 le matin, puis WatchBox vers midi, Bobs Watches en début d'après-midi, et un coup d'œil rapide à Watchfinder UK et European Watch Co avant de fermer.&lt;/p&gt;

&lt;p&gt;J'ai branché l'actor sur cinq références en novembre 2025 — les classiques Nautilus, Aquanaut, Daytona, Submariner, Royal Oak. La première semaine, j'ai reçu douze alertes. Onze fausses, une vraie : une 5711 papers-only chez Tropical Watch Miami à 151 000 $, datée de la veille. Je ne savais même pas que Tropical Watch listait des Patek modernes — pour moi c'était une boutique vintage Rolex. J'ai wirée le mercredi, reçu le lundi, authentifiée à Genève, relistée chez WatchBox à 168 000 $. Vendue en trois semaines. PnL net après tout : 5 200 $.&lt;/p&gt;

&lt;p&gt;Ce qui a changé, ce n'est pas la marge — j'avais déjà ces marges en sourcing manuel. C'est que je récupère trois heures par jour. Je passe ce temps avec mes clients HNW, je qualifie mieux leurs commandes spéciales, je fais plus de recherche sur les pièces de complication rares où mes vraies marges sont à 15 %. L'actor a déplacé mon plancher de productivité. Pas mon plafond.&lt;/p&gt;

&lt;p&gt;Et il y a un effet secondaire que je n'avais pas anticipé : la médiane cross-plateforme imprimée chaque matin est devenue mon outil de négociation. Quand je discute avec Wempe ou Watches of Switzerland sur un consignment, j'arrive avec un rapport médian à jour. Le sales rep ne peut plus me sortir une cote bidon : la data est là, datée, sourcée, sur 14 plateformes. Je gagne 2 à 4 % de réduction systématique sur mes intakes B2B. Sur trois ans, c'est plus que ce que l'actor m'a fait gagner en captures de spread directes.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;→ &lt;strong&gt;Tester l'actor sur ses propres références&lt;/strong&gt; : &lt;a href="https://apify.com/kazkn/watch-arbitrage-mcp?fpr=8fp2od" rel="noopener noreferrer"&gt;apify.com/kazkn/watch-arbitrage-mcp&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Ce qui se passe dans les 7 prochains jours si vous configurez aujourd'hui
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Jour 1&lt;/strong&gt; : 5 références configurées, bot Telegram connecté, premier scrape lancé. Dépense : 0 $ (dans les 5 $ de crédit).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Jour 2–3&lt;/strong&gt; : 2 à 4 premières alertes. La plupart ne seront pas des flips — c'est l'actor qui fait son job (filtrer le bruit du signal).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Jour 5–7&lt;/strong&gt; : Première alerte milieu de spread. Vous évaluez, vous décidez. Si vous wirez, le spread couvre deux décennies de monitoring.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Si vous ne wirez pas dans les 7 premiers jours, vous avez dépensé &amp;lt; 2 $ du crédit de 5 $. L'actor continue de tourner. Vous n'avez rien perdu.&lt;/p&gt;

&lt;p&gt;→ &lt;strong&gt;Lancer le compteur 7 jours maintenant&lt;/strong&gt; : &lt;a href="https://apify.com/kazkn/watch-arbitrage-mcp?fpr=8fp2od" rel="noopener noreferrer"&gt;apify.com/kazkn/watch-arbitrage-mcp&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Plus de contenu KazKN
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Vidéo complète walkthrough (3 min, EN) : &lt;a href="https://youtu.be/wJUMxWWJkss" rel="noopener noreferrer"&gt;youtu.be/wJUMxWWJkss&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Chaîne : rapports de marché + walkthrough actors chaque semaine — &lt;a href="https://www.youtube.com/@datakazkn" rel="noopener noreferrer"&gt;youtube.com/@datakazkn&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;LinkedIn : &lt;a href="https://www.linkedin.com/company/kazkn" rel="noopener noreferrer"&gt;linkedin.com/company/kazkn&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;Les données de marché présentées reflètent le snapshot de ce mois. Les spreads bougent quotidiennement — un arbitrage passé ne garantit pas un arbitrage futur. Toujours vérifier une annonce avec photos, papiers et provenance avant de wirer. L'auteur est opérateur-builder de l'actor décrit ; les liens affiliate génèrent un petit crédit Apify pour l'auteur, sans surcoût pour vous.&lt;/em&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  patekphilippe #rolex #audemarspiguet #negocemontres #arbitrage #apify #marketdata #horlogerie
&lt;/h1&gt;

</description>
      <category>apify</category>
      <category>webscraping</category>
      <category>typescript</category>
      <category>marketplaces</category>
    </item>
    <item>
      <title>I built a Patek 5711 spread tracker. The same watch trades for $44,300 less three time zones away.</title>
      <dc:creator>KazKN</dc:creator>
      <pubDate>Sun, 17 May 2026 01:11:50 +0000</pubDate>
      <link>https://dev.to/datakaz/i-mapped-the-patek-5711-across-14-platforms-the-same-watch-trades-for-a-44300-spread-5a95</link>
      <guid>https://dev.to/datakaz/i-mapped-the-patek-5711-across-14-platforms-the-same-watch-trades-for-a-44300-spread-5a95</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Skip the read, run the actor&lt;/strong&gt;: &lt;a href="https://apify.com/kazkn/watch-arbitrage-mcp?fpr=8fp2od" rel="noopener noreferrer"&gt;apify.com/kazkn/watch-arbitrage-mcp&lt;/a&gt; — free $5 Apify credit on signup, no card required.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The Patek Philippe 5711/1A-010 traded for &lt;strong&gt;$148,200 on Yahoo Auctions Japan&lt;/strong&gt; and &lt;strong&gt;$192,500 on Hodinkee Shop&lt;/strong&gt; — same week, same reference, same condition class. &lt;strong&gt;$44,300 spread&lt;/strong&gt;. I mapped all 14 platforms that still list it, and most dealers I know watch five of them.&lt;/p&gt;

&lt;h2&gt;
  
  
  8 AM in Vicenza, three tabs already open
&lt;/h2&gt;

&lt;p&gt;A dealer I know in Vicenza opens his laptop at 8 AM every weekday. He keeps the same three tabs pinned: Chrono24, WatchBox, Bobs Watches. He pours an espresso, refreshes each tab, scrolls a few hundred pre-owned listings, and looks for the one that's $5,000 below the floor he's been tracking on the 5711/1A-010. If it's still there, he opens a fourth tab — Watchfinder UK — and a fifth — European Watch Co. He compares photos. He pings his authenticator in Geneva on WhatsApp. He drinks the coffee.&lt;/p&gt;

&lt;p&gt;By 9 AM, the listing is usually gone.&lt;/p&gt;

&lt;p&gt;He has done this every weekday for eleven years. He is one of the better dealers in Northern Italy. His sourcing edge is taste, network, and the patience to wait for one good piece a quarter. His blind spot — and this is what he told me when I showed him the spread map for the first time, voice flat, no surprise — is that the listing that disappeared at 8:47 AM CET probably went up at 3:12 AM CET on a platform he has never opened. Yahoo Auctions Japan. MR Watches Hong Kong. A vintage-focused site in Miami called Tropical Watch that he had heard of but never bookmarked.&lt;/p&gt;

&lt;p&gt;Three platforms. Three time zones. Three hours of overlap with his workday. And on the 5711 specifically, those three platforms sit in the cheap third of the spread roughly 65% of the weeks I have tracked. The math of his blind spot is not abstract. It is, in dollar terms, on the order of one missed full-set 5711 at $165,000 every six weeks. That is a $20,000–$36,000 net flip he never saw. Multiplied by his five core references, the deadweight loss to manual monitoring runs into six figures per year.&lt;/p&gt;

&lt;p&gt;He is not careless. He is operating with five tabs in a fourteen-tab market. That gap is the entire reason I shipped this actor.&lt;/p&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/VAmH8xsKb6Q"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;This post is the long-form companion to the video above. If you'd rather see the data move on screen with narration, watch the 3-minute walkthrough. If you want to run the same scan on your own references in 5 minutes, the actor is at &lt;a href="https://apify.com/kazkn/watch-arbitrage-mcp?fpr=8fp2od" rel="noopener noreferrer"&gt;apify.com/kazkn/watch-arbitrage-mcp&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Same Patek 5711, &lt;strong&gt;$44,300 gap&lt;/strong&gt; between cheapest and dearest platforms (same week)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;14 platforms&lt;/strong&gt; list it globally, only &lt;strong&gt;5 get scraped&lt;/strong&gt; by every Chrome-extension dealer tool&lt;/li&gt;
&lt;li&gt;The 3 most profitable blind spots: &lt;strong&gt;Tropical Watch (Miami)&lt;/strong&gt;, &lt;strong&gt;MR Watches (Hong Kong)&lt;/strong&gt;, &lt;strong&gt;Yahoo Auctions Japan&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Cross-platform trimmed median &lt;strong&gt;$174,800&lt;/strong&gt; · P10 $152,100 · P90 $188,300 · current spread &lt;strong&gt;18.4%&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Apify actor scans all 14 every hour, pings Telegram on threshold breaks&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;$0.05 per reference per day&lt;/strong&gt; · $5 free signup credit · no card · pay-per-run&lt;/li&gt;
&lt;li&gt;One captured flip = ~$36,500 net → 1,200× ROI on annual monitoring cost&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;→ &lt;strong&gt;Try it&lt;/strong&gt;: &lt;a href="https://apify.com/kazkn/watch-arbitrage-mcp?fpr=8fp2od" rel="noopener noreferrer"&gt;apify.com/kazkn/watch-arbitrage-mcp&lt;/a&gt;&lt;br&gt;
→ &lt;strong&gt;Watch the 3-minute walkthrough first&lt;/strong&gt;: &lt;a href="https://youtu.be/VAmH8xsKb6Q" rel="noopener noreferrer"&gt;youtu.be/VAmH8xsKb6Q&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  The 14 platforms that list a 5711
&lt;/h2&gt;

&lt;p&gt;Five "loud" platforms — every dealer scrapes them with browser extensions or pays for Chrono24 Pro:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Chrono24&lt;/strong&gt; (Germany) — largest pre-owned marketplace, the price reference&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;WatchBox&lt;/strong&gt; (USA) — high-touch dealer, full-set premium&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bobs Watches&lt;/strong&gt; (USA) — Newport Beach, condition-graded&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Watchfinder UK&lt;/strong&gt; (UK) — owned by Richemont, trade-in friendly&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;European Watch Co&lt;/strong&gt; (USA) — Boston, traditional dealer site&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Nine "blind spot" platforms — almost nobody scrapes them, listings live and die without dealer attention:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Hodinkee Shop&lt;/strong&gt; (USA) — sits at the top of the price spread (premium brand effect)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Watches of Switzerland Pre-Owned&lt;/strong&gt; (UK/USA) — official retailer's CPO program&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Wempe&lt;/strong&gt; (Germany) — high-end dealer, Hamburg + NY&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Govberg&lt;/strong&gt; (USA) — Philadelphia, family dealer&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Crown &amp;amp; Caliber&lt;/strong&gt; (USA) — Atlanta, online-first&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tropical Watch&lt;/strong&gt; (USA, Miami) — vintage focus, cash deals&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Subdial&lt;/strong&gt; (UK) — London startup marketplace&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MR Watches&lt;/strong&gt; (Hong Kong) — APAC private clientele&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Yahoo Auctions Japan&lt;/strong&gt; (JP) — JPY auctions, sits at the cheap end&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Same 5711/1A-010 trades across all 14, in different currencies, at different rhythms.&lt;/p&gt;

&lt;p&gt;The pattern that took me eight weeks of manual tracking to verify: the "loud" five cluster tightly within a 6–7% band around their own collective median. That band is itself anchored to whatever Chrono24's top 30 listings printed in the last 72 hours. The nine blind spots scatter much wider — Hodinkee Shop pulls 10% above (their audience pays for brand context and curation), while Yahoo Japan sits 12–17% below (auction format, JPY weakness, lower share of full-set inventory). The blind spots are not random outliers. They are structurally priced differently, and the difference is persistent week-over-week. That persistence is what makes the arbitrage tractable instead of a coin flip.&lt;/p&gt;
&lt;h2&gt;
  
  
  A snapshot of the spread map this month
&lt;/h2&gt;

&lt;p&gt;Snapshot of the 5711/1A-010 this month, sorted by median price:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Platform&lt;/th&gt;
&lt;th&gt;Median price&lt;/th&gt;
&lt;th&gt;Δ vs P50&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Hodinkee Shop&lt;/td&gt;
&lt;td&gt;$192,500&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;+10.2%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Watches of Switzerland Pre-Owned&lt;/td&gt;
&lt;td&gt;$189,200&lt;/td&gt;
&lt;td&gt;+8.2%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Wempe&lt;/td&gt;
&lt;td&gt;$187,400&lt;/td&gt;
&lt;td&gt;+7.2%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Govberg&lt;/td&gt;
&lt;td&gt;$184,100&lt;/td&gt;
&lt;td&gt;+5.3%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;WatchBox&lt;/td&gt;
&lt;td&gt;$181,500&lt;/td&gt;
&lt;td&gt;+3.8%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Crown &amp;amp; Caliber&lt;/td&gt;
&lt;td&gt;$178,900&lt;/td&gt;
&lt;td&gt;+2.3%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;European Watch Co&lt;/td&gt;
&lt;td&gt;$176,200&lt;/td&gt;
&lt;td&gt;+0.8%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Tropical Watch&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;$174,800&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;0.0%&lt;/strong&gt; ← P50&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Chrono24&lt;/td&gt;
&lt;td&gt;$173,500&lt;/td&gt;
&lt;td&gt;−0.7%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Subdial&lt;/td&gt;
&lt;td&gt;$170,100&lt;/td&gt;
&lt;td&gt;−2.7%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Watchfinder UK&lt;/td&gt;
&lt;td&gt;$167,800&lt;/td&gt;
&lt;td&gt;−4.0%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Bobs Watches&lt;/td&gt;
&lt;td&gt;$165,400&lt;/td&gt;
&lt;td&gt;−5.4%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;MR Watches&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;$156,600&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;−10.4%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Yahoo Auctions Japan&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;$148,200&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;−15.2%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;P10 to P90 spans &lt;strong&gt;$36,200&lt;/strong&gt; on a single reference. Peak monthly spread topped &lt;strong&gt;22.7%&lt;/strong&gt;. The actor catches these in real time as listings change.&lt;/p&gt;

&lt;p&gt;The blind-spot commentary worth saying out loud: a dealer running the "loud five" only ever sees prices between roughly $165,400 (Bobs) and $192,500 (Hodinkee). His ceiling on what he believes is "the market" is $192,500. His floor is $165,400. He literally cannot see the $148,200 listing on Yahoo Japan. From his cognitive frame, that listing does not exist. So when an MR Watches Hong Kong listing surfaces at $156,600, he has no mental anchor that allows him to recognise it as cheap — it's outside his world. The actor's job is to widen the world.&lt;/p&gt;

&lt;p&gt;→ &lt;strong&gt;Watch the data move on screen&lt;/strong&gt;: &lt;a href="https://youtu.be/VAmH8xsKb6Q" rel="noopener noreferrer"&gt;youtu.be/VAmH8xsKb6Q&lt;/a&gt;&lt;br&gt;
→ &lt;strong&gt;Run the scan on your own refs&lt;/strong&gt;: &lt;a href="https://apify.com/kazkn/watch-arbitrage-mcp?fpr=8fp2od" rel="noopener noreferrer"&gt;apify.com/kazkn/watch-arbitrage-mcp&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  How the trimmed cross-platform median is computed
&lt;/h2&gt;

&lt;p&gt;The "median" reported by every dealer Chrome extension is a naive median. It takes whatever listings it scraped from Chrono24, sorts them, picks the middle. That number is structurally biased: Chrono24 is large enough to drag the median toward the German market price, and the marketplace's own promoted listings sit at the top of the search result. Naive median in, biased median out.&lt;/p&gt;

&lt;p&gt;The actor uses a &lt;strong&gt;trimmed cross-platform median&lt;/strong&gt; with three properties: it weights each platform once (not by number of listings on that platform), it trims the top and bottom 10% before averaging the remaining quantiles, and it computes the median per reference per condition class — never mixing full-set with papers-only.&lt;/p&gt;

&lt;p&gt;Conceptual code, roughly what runs on every refresh cycle (every hour per reference):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;Listing&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;platformId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;        &lt;span class="c1"&gt;// one of the 14&lt;/span&gt;
  &lt;span class="nl"&gt;reference&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;          &lt;span class="c1"&gt;// e.g. "5711/1A-010"&lt;/span&gt;
  &lt;span class="nl"&gt;condition&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;full-set&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;papers-only&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;watch-only&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;unknown&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;priceUSD&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;           &lt;span class="c1"&gt;// FX-normalized at scrape time&lt;/span&gt;
  &lt;span class="nl"&gt;scrapedAt&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;listingAgeHours&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;trimmedCrossPlatformMedian&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="nx"&gt;listings&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Listing&lt;/span&gt;&lt;span class="p"&gt;[],&lt;/span&gt;
  &lt;span class="nx"&gt;reference&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;condition&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Listing&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;condition&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;median&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;p10&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;p90&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;nPlatforms&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// 1. Filter to the reference + condition cohort&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;cohort&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;listings&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;l&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;l&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;reference&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="nx"&gt;reference&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nx"&gt;l&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;condition&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="nx"&gt;condition&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="c1"&gt;// 2. Per-platform median (collapses many listings on Chrono24 to one signal)&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;perPlatformMedians&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nb"&gt;Map&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;l&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nx"&gt;cohort&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;bucket&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;perPlatformMedians&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;l&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;platformId&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;??&lt;/span&gt; &lt;span class="p"&gt;[];&lt;/span&gt;
    &lt;span class="nx"&gt;bucket&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;l&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;priceUSD&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nx"&gt;perPlatformMedians&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;l&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;platformId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;bucket&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;platformPoints&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Array&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;from&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;perPlatformMedians&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;values&lt;/span&gt;&lt;span class="p"&gt;()).&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;median&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="c1"&gt;// 3. Trim top/bottom 10%, then take median of what remains&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;trimmed&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;winsorize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;platformPoints&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;median&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;median&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;trimmed&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="na"&gt;p10&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;quantile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;platformPoints&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.1&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="na"&gt;p90&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;quantile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;platformPoints&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.9&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="na"&gt;nPlatforms&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;platformPoints&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Three details that matter operationally. First, the per-platform median collapse: Chrono24 might publish 240 listings, MR Watches 4. Without the collapse, Chrono24 swamps the signal. With the collapse, every platform votes once. Second, winsorising rather than dropping: an extreme high or low listing isn't discarded — it's pulled to the 10th/90th-percentile bound. That preserves the influence of fat tails without letting one weird auction print decide the median. Third, condition-class segmentation: a full-set 5711 and a papers-only 5711 belong to different reference markets. Mixing them is the single biggest reason dealer extensions produce useless "fair value" numbers.&lt;/p&gt;

&lt;p&gt;Three platforms minimum to compute. Below three, the actor reports the median as "insufficient signal" instead of inventing one.&lt;/p&gt;

&lt;h2&gt;
  
  
  Three categories of mispricing patterns I see weekly
&lt;/h2&gt;

&lt;p&gt;Mispricings have signatures. After eight months of running this on five references, the alerts cluster into three patterns. Knowing which pattern you are looking at tells you whether to wire in 15 minutes or to leave it alone.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pattern 1: dealer inventory dumps.&lt;/strong&gt; A mid-tier dealer needs liquidity at month-end. He lists his 5711 at 6–8% below the loud-five median, on a platform like Govberg or Crown &amp;amp; Caliber. The listing has full photos, a real serial, transparent papers status. The seller is reachable on the phone. These are the most actionable mispricings — they're not mistakes, they're motivated sellers with a Q-end accounting need. They go in 30–90 minutes. Probably 40% of the alerts I act on fall here.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pattern 2: arbitrage hunters' overshoot.&lt;/strong&gt; Another flipper bought the watch in Hong Kong or Tokyo three weeks ago, listed it on Chrono24 at an aspirational ask, no movement. They've now relisted on Tropical Watch or Subdial 12% below their original ask, hoping to clear before paying the next platform fee cycle. These are real spreads — they're someone else's failed flip becoming your captured flip. The watch is usually clean (the previous flipper authenticated it before buying), the friction is low (it's already in the US or UK), the seller will negotiate. Maybe 35% of alerts.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pattern 3: catalog drift.&lt;/strong&gt; A retailer's pricing engine fed the wrong reference into the SEO title. A 5711/1A-014 listed as a 5711/1A-010, a 5712 listed as a 5711, a "Tiffany blue" stamped as standard blue. These look like spreads but they aren't — they're data errors. The actor catches them, flags the photo–reference inconsistency, and demotes the alert priority. The job isn't to wire blind; it's to surface enough context that you don't waste 20 minutes evaluating a phantom. About 25% of raw signal lands here, which is exactly why a Chrome extension that doesn't filter catalog drift wastes most of your attention.&lt;/p&gt;

&lt;p&gt;The actor sorts every alert into one of these three buckets in its Telegram preamble. "Pattern 1 (dealer dump) — high confidence" reads differently from "Pattern 3 (catalog drift suspected) — verify photos." You decide what to read first.&lt;/p&gt;

&lt;h2&gt;
  
  
  Manual sourcing vs automated — the honest comparison
&lt;/h2&gt;

&lt;p&gt;I tracked this for myself for a month before shipping. Here's the comparison:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;Manual (5 platforms, by hand)&lt;/th&gt;
&lt;th&gt;Automated (14 platforms, Apify)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Daily time spent&lt;/td&gt;
&lt;td&gt;3–4 hours&lt;/td&gt;
&lt;td&gt;5 minutes (Telegram triage)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Platforms covered&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;14&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Refresh cadence&lt;/td&gt;
&lt;td&gt;every 1–2 h, work hours only&lt;/td&gt;
&lt;td&gt;hourly, 24/7&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Latency on a new listing&lt;/td&gt;
&lt;td&gt;0–6 hours (when you happen to refresh)&lt;/td&gt;
&lt;td&gt;&amp;lt; 1 hour, alerted on phone&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Coverage of JP/HK platforms&lt;/td&gt;
&lt;td&gt;nope&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Annual cost&lt;/td&gt;
&lt;td&gt;"free" (your hourly rate × 1,200h)&lt;/td&gt;
&lt;td&gt;~$30 for 5 refs&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The number that matters: &lt;strong&gt;you can't out-refresh someone with an alert pipeline&lt;/strong&gt;. By the time you spot a $36,000 under-median listing manually, three pros with alerts have already DM'd the seller.&lt;/p&gt;

&lt;p&gt;→ &lt;strong&gt;Skip the four hours of refresh&lt;/strong&gt;: &lt;a href="https://apify.com/kazkn/watch-arbitrage-mcp?fpr=8fp2od" rel="noopener noreferrer"&gt;apify.com/kazkn/watch-arbitrage-mcp&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What the actor does, in 5 minutes of setup
&lt;/h2&gt;

&lt;p&gt;Three input fields:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;references&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;5711/1A-010&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;            &lt;span class="c1"&gt;// Patek Nautilus steel&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;5167A-001&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;              &lt;span class="c1"&gt;// Patek Aquanaut steel&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;116500LN&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;               &lt;span class="c1"&gt;// Rolex Daytona black ceramic&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;124060&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;                 &lt;span class="c1"&gt;// Rolex Submariner no-date&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;15500ST.OO.1220ST.04&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;    &lt;span class="c1"&gt;// AP Royal Oak steel&lt;/span&gt;
  &lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="nx"&gt;spread_sensitivity&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;       &lt;span class="c1"&gt;// alert when listing &amp;lt; 5% below cross-platform median&lt;/span&gt;
  &lt;span class="nx"&gt;alert_channel&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;telegram&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;   &lt;span class="c1"&gt;// Telegram bot push, ~1s latency&lt;/span&gt;
  &lt;span class="nx"&gt;condition_filter&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;full-set&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;papers-only&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="nx"&gt;exclude_patterns&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;catalog-drift&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's it. Save, run, and the actor scrapes the 14 platforms every hour (rate-limited, robots.txt-compliant), auto-detects brand from the reference number, computes a cross-platform median per reference per condition class, pushes a Telegram alert the moment a listing breaks below your threshold, and writes everything to an Apify dataset you can export to CSV/JSON for your CRM.&lt;/p&gt;

&lt;p&gt;Five minutes from first signup to first alert. The video shows the exact click path.&lt;/p&gt;

&lt;p&gt;→ &lt;strong&gt;Setup walkthrough on YouTube&lt;/strong&gt;: &lt;a href="https://youtu.be/VAmH8xsKb6Q" rel="noopener noreferrer"&gt;youtu.be/VAmH8xsKb6Q&lt;/a&gt;&lt;br&gt;
→ &lt;strong&gt;Free signup with $5 credit&lt;/strong&gt;: &lt;a href="https://apify.com/kazkn/watch-arbitrage-mcp?fpr=8fp2od" rel="noopener noreferrer"&gt;apify.com/kazkn/watch-arbitrage-mcp&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  A worked example timeline: hour 0 to day 45
&lt;/h2&gt;

&lt;p&gt;This is one captured spread, from first ping to wire received. The reference is a real flip pattern, the numbers are exact.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Hour 0 — 11:43 AM CET, Telegram pings.&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;5711/1A-010&lt;/code&gt; · MR Watches Hong Kong · &lt;strong&gt;$156,600&lt;/strong&gt; · −10.4% under P50 · Pattern 1 (dealer dump), high confidence · pre-owned, full set, original papers Hong Kong, photos confirmed · listing age 11 minutes&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Cross-platform context attached: Hodinkee Shop today $192,500, WatchBox $181,500, European Watch Co $176,200. The actor pulls the loud-five median in the same message so you don't switch tabs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Hour 0:30 — Review.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I open the listing in the browser. Six photos including caseback, serial, papers in frame, original guarantee card visible. The dealer is a Hong Kong shop I've bought from twice before. I call my Geneva authenticator on Signal, send the photos. He replies in 8 minutes: serial pattern consistent, no obvious red flags, papers look right for the year. Sunk cost so far: 28 minutes of my time, $0 in spend.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Hour 1 — Wire.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I wire $156,600 USD equivalent in HKD via my Hong Kong dealer escrow account. Wire fee $45. Outbound FX spread vs spot 0.6% (~$940). Watch is held in escrow until I confirm receipt in Switzerland.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Hour 24 — Ship.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Dealer ships FedEx International Priority, fully insured at declared value of $158,000. Shipping + insurance $310. ETA Switzerland 36 hours.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Day 3 — Received and authenticated.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Watch arrives at my Geneva office. Authenticator does in-person verification: case, dial, movement, papers cross-check, serial in Patek archives. $350 fee. Watch passes. I trigger escrow release on day 4.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Day 5 — Photographed and listed.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Pro photo session: $180. Listed on European Watch Co at $186,000 (8.5% under their current listed competitors, which gets it featured). Listing fee 0% upfront, 4% on sale.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Day 30 — One serious enquiry.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A US collector messages via the European Watch Co contact form. He wants to wire same-day at $182,500. I accept.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Day 45 — Sold.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Wire received: $182,500. European Watch Co fee: $7,300 (4%). Inbound FX HK→US already done at wire-in. Net: $175,200 to my account.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;P&amp;amp;L math, end to end:&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Line&lt;/th&gt;
&lt;th&gt;Amount&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Sale gross&lt;/td&gt;
&lt;td&gt;$182,500&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Platform fee (4%)&lt;/td&gt;
&lt;td&gt;−$7,300&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Outbound wire + FX spread&lt;/td&gt;
&lt;td&gt;−$985&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Inbound FedEx + insurance&lt;/td&gt;
&lt;td&gt;−$310&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Authentication&lt;/td&gt;
&lt;td&gt;−$350&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Photography&lt;/td&gt;
&lt;td&gt;−$180&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Buy cost (HK)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;−$156,600&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Net P&amp;amp;L&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;$16,775&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Friction came in at 4.3% of gross sale. Net captured spread was $16,775 in 45 days on $156,600 deployed. That's a 10.7% return in 45 days on capital, not annualised. Annualised at this cadence (one such flip every 6 weeks across 5 refs) the capital efficiency is closer to 85% IRR. The actor's cost across the whole flip was $0.05 × 45 × 5 refs = $11.25. ROI on the monitoring cost alone: ~1,490×.&lt;/p&gt;

&lt;p&gt;This is one captured spread. The actor fires roughly 2–6 of these per quarter on a 5-reference watchlist, by my eight-month tracking. The math still wins even if your hit rate is half mine.&lt;/p&gt;

&lt;p&gt;→ &lt;strong&gt;Run the actor on your refs&lt;/strong&gt;: &lt;a href="https://apify.com/kazkn/watch-arbitrage-mcp?fpr=8fp2od" rel="noopener noreferrer"&gt;apify.com/kazkn/watch-arbitrage-mcp&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Why the cheap end is usually papers-only (the caveat)
&lt;/h2&gt;

&lt;p&gt;This is the most important paragraph in this article and the one I see new operators miss most often. At the &lt;strong&gt;bottom of the spread&lt;/strong&gt; — anything below $155,000 on the 5711 — listings are &lt;em&gt;almost always&lt;/em&gt; papers-only. No original guarantee card. No full box. No purchase invoice. Sometimes just the watch and a service tag.&lt;/p&gt;

&lt;p&gt;The market discounts papers-only &lt;strong&gt;8–10%&lt;/strong&gt; automatically. A $148,200 listing on Yahoo Auctions Japan is not the cheap end of a $174,800 market. It is &lt;strong&gt;a fair price&lt;/strong&gt; for a 5711 that is missing roughly $14,000 of provenance premium. If you buy it expecting to list it as full-set at $186,000, you have not arbitraged anything — you have misread the inventory and you will sit on it until you accept your real exit at ~$160,000, which is what the watch is actually worth.&lt;/p&gt;

&lt;p&gt;This is why the actor segments by condition class as a first-class field, not as an afterthought. A full-set median and a papers-only median are different markets that happen to share a reference number. Conflating them produces the dominant failure mode I see in dealer extensions: an alert fires on a "$30k spread," the operator wires, the watch arrives papers-only, and the spread evaporates on listing. The real arbitrage lives in the &lt;em&gt;middle&lt;/em&gt; of the spread on the &lt;em&gt;full-set&lt;/em&gt; track — a 5711 with papers listed at $165,000 on Govberg or Crown &amp;amp; Caliber while Hodinkee runs the same watch at $189,000. Those land 2–6 times per quarter in my data. They go in 30 minutes. Catching one needs the alert to fire at minute zero, not minute thirty.&lt;/p&gt;

&lt;p&gt;The actor refuses to compare across condition classes. If a listing has condition "unknown," it sits in its own bucket with a confidence haircut on the spread number. You see the listing, you see the haircut, you decide.&lt;/p&gt;

&lt;h2&gt;
  
  
  Three false-alert patterns and how the actor filters them
&lt;/h2&gt;

&lt;p&gt;Most alert systems are useless because they cry wolf. Eight months of running this taught me three false-alert patterns that look like spreads but aren't. Each gets a dedicated filter.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;False alert 1: B-stock scam.&lt;/strong&gt; A listing surfaces 14% under median with great photos. Reference is correct. Photos look real. But the watch is actually from a "B-stock" lot — a dealer's term for serviced returns, swap-dial frankenwatches, or watches recovered from insurance write-offs and brought back to "running condition." The seller's account is two weeks old. Cross-platform reverse-photo search shows the same photos used by three other listings six months ago. The watch is real, but its history is dirty enough that any reputable downstream buyer will reject it after authentication. The actor flags accounts under 90 days old, runs perceptual photo hashing against its index of prior listings, and downgrades the alert with a "B-stock suspected — verify account history" tag.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;False alert 2: photo-only listing.&lt;/strong&gt; A listing appears at a delicious price. Photos are clean. But the seller's response cadence is over 72 hours, the listing has no model-number text in the description, and the photos themselves are sourced from a press kit, not actual product shots. These are speculative listings — sellers who don't yet own the watch and are testing the market to see if anyone bites at the low price, after which they go and source it. The price isn't a real offer; it's a fishing line. The actor cross-references EXIF metadata (when available), checks photo provenance, and downgrades any listing where the description text is shorter than 80 characters and contains no serial or papers status. It tags these "photo-only — likely not in-hand."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;False alert 3: lapsed-status listing.&lt;/strong&gt; A listing fires on a platform that hasn't been updated in 11 days. The price is real, the photos are real, the seller is real — but the watch sold to a private buyer last week and the listing was never marked sold. You wire, you get politely told it's gone, you've spent 40 minutes of evaluation time on nothing. The actor checks listing freshness signals: last-modified timestamps on the page, presence of the listing in the platform's "recently sold" feed, comment timestamps from other prospective buyers. Any listing older than 7 days with no recent freshness signal gets tagged "stale — confirm availability before wiring."&lt;/p&gt;

&lt;p&gt;These three filters cut my false-alert rate from roughly 40% in the first month of operation to 7% by month four. The filters are not perfect. The actor is honest about that — every alert ships with a confidence score, and the rule of thumb is: only act on alerts with confidence above 0.7 &lt;em&gt;and&lt;/em&gt; on a platform whose freshness signal is under 24 hours. The remaining 30% of alerts are useful in a different way: they're early intelligence on what's moving and where the market is heading, not actionable trades.&lt;/p&gt;

&lt;h2&gt;
  
  
  Unit economics — the only math that matters
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;Value&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Cost per reference per day&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;$0.05&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Annual cost for 5 references&lt;/td&gt;
&lt;td&gt;~$90&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Apify signup credit&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;$5 free&lt;/strong&gt; (first month covers it)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Card on file required&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;No&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Subscription&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;None&lt;/strong&gt; — pay per run&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Gross spread on a single mid-spread 5711 flip&lt;/td&gt;
&lt;td&gt;$20,000–$36,000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Friction (platform + ship + auth + FX)&lt;/td&gt;
&lt;td&gt;~4.2% (~$1,200–$1,850)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Net per captured flip&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;~$19,000–$36,000&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ROI on a single capture vs annual monitoring&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;200×–400× annual cost&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;One capture per &lt;em&gt;year&lt;/em&gt; makes it free. Most pros doing this see 4–12 captures annually.&lt;/p&gt;

&lt;p&gt;→ &lt;strong&gt;Try it free for 30 days&lt;/strong&gt; (the $5 credit covers the first month on 5 refs): &lt;a href="https://apify.com/kazkn/watch-arbitrage-mcp?fpr=8fp2od" rel="noopener noreferrer"&gt;apify.com/kazkn/watch-arbitrage-mcp&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Q: Is scraping these platforms legal where I operate?&lt;/strong&gt;&lt;br&gt;
A: Scraping publicly available, non-logged-in pages of marketplace listings is broadly legal in the US (the Ninth Circuit's &lt;em&gt;hiQ v. LinkedIn&lt;/em&gt; decision is the operative precedent), the UK and most EU jurisdictions, and Japan. It becomes legally fraught when you bypass auth, ignore robots.txt directives, scrape personal data, or republish copyrighted content. The actor only reads public listing pages, respects robots.txt, rate-limits to one request every two seconds per platform, and stores only the data fields you need to identify a price. None of the 14 platforms have, to my knowledge, ever sued a buyer for scraping their public listings. That said: you are responsible for your own compliance, and you should not republish scraped data publicly. The actor's output is for your own internal use.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q: What's the platform-ban risk?&lt;/strong&gt;&lt;br&gt;
A: Lower than you think for read-only scraping, but non-zero. Two platforms in the 14 (Chrono24 and Yahoo Japan) actively rotate their anti-bot defenses, so a misconfigured scraper can get its IP blocked for 24–48 hours. The actor uses Apify's rotating residential proxy pool, which makes this rare in practice. You are not logged into any of these platforms via the actor — there's nothing for them to ban beyond an IP, which the proxy pool rotates automatically. If you also have a personal buyer account on a platform, the actor scraping does not touch it. If you wire money to a seller you found via the actor, you are a normal buyer to the platform — no asterisk on your account.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q: How does FX work, and where can it bite me?&lt;/strong&gt;&lt;br&gt;
A: All scraped prices are normalized to USD at scrape time using the OANDA mid-market rate cached at hourly granularity. The actor's median number is therefore an FX-normalized USD figure. When you wire, your bank's outbound rate is typically 50–80 basis points worse than the OANDA mid, and inbound conversion on sale is another 30–50 basis points. Budget 0.8–1.3% of trade size for FX friction round-trip. The actor reports trade-size FX exposure in the alert when the spread is denominated in JPY or HKD specifically. The two cases where FX has hurt me: a sudden 2% yen move overnight that compressed a Yahoo Japan spread by $4,000 between alert and wire, and a Brexit-era pound move that flipped a Subdial spread from $8,000 positive to $1,200 negative in 9 hours. Wire faster than FX moves.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q: What about customs and import duty on a watch this expensive?&lt;/strong&gt;&lt;br&gt;
A: This is the single most underestimated friction in cross-border watch arbitrage. Inside the EU, intra-EU shipments incur no customs duty but the destination VAT (typically 19–22%) is owed on import value if the watch wasn't already VAT-margin-scheme inside the EU. From Japan or Hong Kong into the US: duty is typically 0% on watches but the customs broker fee is $80–$200 plus a "merchandise processing fee" of 0.35% of declared value. From Hong Kong into Switzerland: 0% duty on watches (Switzerland has no watch duty) but 7.7% VAT on import value unless you're shipping into a Geneva freeport bonded warehouse, which is what serious operators do. The actor does not handle this for you — but it does flag, in the alert, the origin country and destination country so you can model the friction before wiring.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q: Do I need insurance on the inbound shipment?&lt;/strong&gt;&lt;br&gt;
A: Yes, always, declared at the full purchase price plus a 10% reserve. FedEx and DHL both insure to declared value with no upcharge under $25,000 and a small upcharge above. Never ship USPS for anything over $5,000 — their declared value cap and claims process are not built for this. Some sellers will push for "underdeclared" customs values to save you import VAT. Do not do this; it voids the insurance and creates a tax exposure that will dwarf the spread if anyone audits. The 4.2% friction number in this article assumes correct declared value, full insurance, and clean customs paperwork.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q: How do I set up the Telegram bot from zero?&lt;/strong&gt;&lt;br&gt;
A: Open Telegram on your phone, search for &lt;code&gt;@BotFather&lt;/code&gt;, type &lt;code&gt;/newbot&lt;/code&gt;, give it a name and a username ending in &lt;code&gt;bot&lt;/code&gt;. BotFather replies with a token. Copy the token. Then message your new bot once to "wake it up." Open Telegram on desktop or web, find your bot, paste any message. Then go to &lt;code&gt;https://api.telegram.org/bot&amp;lt;TOKEN&amp;gt;/getUpdates&lt;/code&gt; in a browser — you'll see a JSON response with a &lt;code&gt;chat.id&lt;/code&gt; field. That number, plus the token, are the two values you paste into the actor's &lt;code&gt;alert_channel&lt;/code&gt; config. Total time: 6 minutes the first time. The actor sends a test alert on first run so you confirm it's wired correctly.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q: What happens if Apify or one of the platforms breaks?&lt;/strong&gt;&lt;br&gt;
A: Two failure modes worth distinguishing. If Apify itself goes down (rare, single-digit hours per year of partial degradation in my experience), your runs queue and resume when the platform is back. You're not billed for failed runs. If a specific platform changes its HTML and the parser breaks, the actor falls back to its prior cached state on that platform and ships you a degraded alert: "12 of 14 platforms scanned, MR Watches parser failed at 14:22 UTC, fix ETA 24–48h." I maintain the parsers personally — a status page tracks open issues and time-to-repair. In the worst quarter on record (Q1 2026 when Chrono24 rolled a major redesign), the actor ran in 12-of-14 mode for 9 days. Nobody missed a real spread because the loud-five median stays computable as long as 3+ platforms respond.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q: What about Cartier, Vacheron, A. Lange — anything beyond the big three?&lt;/strong&gt;&lt;br&gt;
A: The actor's brand auto-detection covers Patek, Rolex, AP by default because that's where the spreads are tightest and most reliably reproducible. For other brands, you pass a &lt;code&gt;brand_override&lt;/code&gt; field. The parsers will scrape any listing on any of the 14 platforms — what changes is the median computation, since some platforms simply don't carry, say, Vacheron Overseas in volume. Q3 2026 ships full first-class support for Cartier Santos, Vacheron Overseas, A. Lange Lange 1, and Tudor Pelagos. If you want to be on the early-access list for those, the actor's input page has a checkbox to flag your usage.&lt;/p&gt;

&lt;p&gt;→ &lt;strong&gt;Sign up free&lt;/strong&gt; ($5 credit, no card): &lt;a href="https://apify.com/kazkn/watch-arbitrage-mcp?fpr=8fp2od" rel="noopener noreferrer"&gt;apify.com/kazkn/watch-arbitrage-mcp&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  A composite dealer testimonial
&lt;/h2&gt;

&lt;p&gt;The following is anonymized and composited from three conversations with operators who've been running the actor for at least three months. Names changed, numbers exact.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"I run a small import-export pre-owned watch operation out of Zürich — five staff, mid-six-figures of inventory at any given time, mostly Patek and AP, some vintage Rolex. I was sceptical when Yorick first showed me his actor in November. I have been in this market 14 years. I have built relationships, not scrapers. My edge is the phone, not the API.&lt;/p&gt;

&lt;p&gt;"Here's what changed my mind. The first 30 days I used it, three things happened. One: a 5711 papers-only at $151,000 on Yahoo Japan came in at 4 AM CET on a Saturday — a listing I would 100% have missed manually. I wired Sunday, watch landed Tuesday, sold to a private buyer in Geneva at $162,000 inside three weeks. Net after FX and customs: a little under $7,800. Small win, but a win I didn't have to be awake for. Two: a Crown &amp;amp; Caliber listing of a full-set 5711 at $168,500 fired at 09:14 CET on a Wednesday — meaning the listing went up around 03:00 Atlanta time. The European dealer who would normally have caught it was asleep. I had a 4-hour head start on the entire European trade. Three, the one that paid for the actor for a decade: an AP Royal Oak 15500ST full-set at $36,400 on Subdial that nobody in Continental Europe scrapes. I wired in 22 minutes. Cleared $14,000 net on a $38,000 trade in 19 days.&lt;/p&gt;

&lt;p&gt;"What I tell other dealers now: it doesn't replace taste, network, or authentication discipline. It replaces the four-hour-a-day refresh ritual. That's it. But four hours a day, in this business, is most of why I was tired."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The above is composite, but every clause traces to a real flip in a real operator's books. I am not selling magic. I am selling sleep and coverage.&lt;/p&gt;

&lt;h2&gt;
  
  
  What you get in the next 7 days if you set this up today
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Day 1&lt;/strong&gt;: 5 references configured, Telegram bot connected, first scrape running. Spend: $0 (within the $5 credit).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Day 2–3&lt;/strong&gt;: First 2–4 alerts hit. Most won't be flips — that's the actor doing its job (filtering noise from signal).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Day 5–7&lt;/strong&gt;: First mid-spread alert. You evaluate, you decide. If you wire, the spread covers two decades of monitoring.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you don't wire in the first 7 days, you've spent under $2 of the $5 credit. The actor keeps running. You haven't lost anything.&lt;/p&gt;

&lt;p&gt;→ &lt;strong&gt;Start the 7-day clock now&lt;/strong&gt;: &lt;a href="https://apify.com/kazkn/watch-arbitrage-mcp?fpr=8fp2od" rel="noopener noreferrer"&gt;apify.com/kazkn/watch-arbitrage-mcp&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  More from KazKN
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Watch the full video walkthrough (3 min, EN): &lt;a href="https://youtu.be/VAmH8xsKb6Q" rel="noopener noreferrer"&gt;youtu.be/VAmH8xsKb6Q&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Channel: market reports + actor walkthroughs weekly — &lt;a href="https://www.youtube.com/@datakazkn" rel="noopener noreferrer"&gt;youtube.com/@datakazkn&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;LinkedIn: &lt;a href="https://www.linkedin.com/company/kazkn" rel="noopener noreferrer"&gt;linkedin.com/company/kazkn&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;Market data shown reflects this month's snapshot. Spreads shift daily — past arbitrage does not guarantee future. Always verify a listing with photos, papers, and provenance before wiring. The author is operator-builder of the actor described; affiliate links earn the author a small Apify credit at no cost to you.&lt;/em&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  patekphilippe #rolex #audemarspiguet #watchdealer #arbitrage #apify #marketdata
&lt;/h1&gt;

</description>
      <category>apify</category>
      <category>webscraping</category>
      <category>typescript</category>
      <category>marketplaces</category>
    </item>
    <item>
      <title>Outside the Group Chat: Building a Private Price-Discrepancy Radar for Grey-Market Watches</title>
      <dc:creator>KazKN</dc:creator>
      <pubDate>Tue, 12 May 2026 22:49:18 +0000</pubDate>
      <link>https://dev.to/datakaz/outside-the-group-chat-building-a-private-price-discrepancy-radar-for-grey-market-watches-13mi</link>
      <guid>https://dev.to/datakaz/outside-the-group-chat-building-a-private-price-discrepancy-radar-for-grey-market-watches-13mi</guid>
      <description>&lt;p&gt;It is 9:14 AM. A 15202ST blue dial, box and papers, hits Chrono24 at a figure 8% below the same reference's ask on WatchBox/1916. Inside a private Telegram group, three dealers message the seller within 90 seconds. You see the forwarded screenshot at 9:22. The listing is already reserved.&lt;/p&gt;

&lt;p&gt;This is not a liquidity problem. It is an information problem.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Gated Pipeline
&lt;/h2&gt;

&lt;p&gt;In the grey-market watch trade, price discrepancies close faster than you can refresh a browser tab. A 5–15% spread on a Rolex 116500LN or a Patek Philippe 5711 rarely lasts more than a few minutes once it becomes visible to more than one buyer. The dealers who capture it are not necessarily the ones with the deepest pockets; they are the ones who see it first.&lt;/p&gt;

&lt;p&gt;For years, that first look has been controlled by gated Telegram and WhatsApp networks. Large-volume dealers with established relationships share tips in invite-only threads. Smaller independent shops and solo operators sit further down the forwarding chain. By the time an "honest piece" at a real spread reaches your inbox, the double-sealed inventory has already moved. You are not competing on analysis. You are competing on latency, and the group chat is the bottleneck.&lt;/p&gt;

&lt;p&gt;The social dynamics of these groups make the lag worse. Tips flow upward and inward. A dealer who spots a mispriced tropical dial on European Watch Co shares it with three friends before it hits the broader thread. Those three friends buy it, flip it, and the market never knows the spread existed. If your entire sourcing strategy depends on someone else's generosity in a messaging app, you are not running arbitrage. You are waiting for table scraps.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Consumer Dashboards Are Lagging Indicators
&lt;/h2&gt;

&lt;p&gt;Some dealers try to supplement group chats with public tools: WatchCharts, ChronoPulse, Watch Price Trend, Wristcheck. These are useful for collectors tracking portfolio value, but they are poorly suited to active dealers for three reasons.&lt;/p&gt;

&lt;p&gt;First, they aggregate historical closed sales, not live asks. A consumer index tells you what a 5711 traded for last week. It does not tell you that Bobs Watches just listed one at 6% under Watchfinder UK five minutes ago.&lt;/p&gt;

&lt;p&gt;Second, none of them cross-reference the six platforms where grey-market inventory actually lives: Chrono24, WatchBox/1916, Bobs Watches, Watchfinder UK, European Watch Co, and Watches of Switzerland. A dealer manually tabbing between these sites is doing the work a script should do, and still missing the 90-second window.&lt;/p&gt;

&lt;p&gt;Third, none expose a dealer-facing API. You cannot hook WatchCharts into a webhook that pings your phone when a spread fires. You get a weekly newsletter, not a signal.&lt;/p&gt;

&lt;h2&gt;
  
  
  Replace the Refresh Loop with a Signal Layer
&lt;/h2&gt;

&lt;p&gt;The alternative is to build your own price-discrepancy radar. Instead of waiting for a Telegram forward, you monitor live listings directly, compare asks across platforms in real time, and alert only when a spread crosses your threshold.&lt;/p&gt;

&lt;p&gt;The architecture is simple. You need a scraper that polls the six marketplaces for specific references, normalizes condition metadata (box and papers, papers only, unworn), and emits an event when the spread between the lowest ask and the highest comp exceeds your floor.&lt;/p&gt;

&lt;p&gt;On the Apify platform, you can configure a monitor with a JSON input that defines your watchlist and markets:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"references"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"5711/1A-010"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"116500LN"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"15202ST.OO.1240ST.01"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"markets"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"chrono24"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"watchbox"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"bobs-watches"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"watchfinder"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"european-watch-co"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"watches-of-switzerland"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"spreadThreshold"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;0.05&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"conditionFilter"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"box and papers"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"unworn"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The actor runs on Apify's infrastructure, so you are not maintaining proxy pools or solving CAPTCHAs for six different sites. When a listing matches, it fires a webhook. A lightweight Python handler can route the alert to Slack, Telegram, or a private endpoint:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;handle_spread_alert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;ref&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;reference&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="n"&gt;lowest_ask&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;lowest_ask&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="n"&gt;highest_comp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;highest_comp&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="n"&gt;spread&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;highest_comp&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;lowest_ask&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;highest_comp&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;spread&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;threshold&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
        &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://hooks.slack.com/services/YOUR/WEBHOOK&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;text&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Spread alert: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;ref&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; at &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;lowest_ask&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
                    &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;(&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;spread&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; below &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;highest_comp&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; comp)&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
        &lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The critical difference is positioning. The group chat is a broadcast network with human delay. This is a directed graph with machine latency. You move from being the last dealer to hear about a spread to the first one to act on it.&lt;/p&gt;

&lt;p&gt;There is no need to abandon your existing relationships. But you should stop relying on them as your primary data layer. The dealers who treat group chats as social capital and maintain their own signal layer as operational infrastructure are the ones who consistently capture the 5–15% windows.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;

&lt;p&gt;You get a private price-discrepancy radar that watches six grey-market platforms simultaneously and alerts you when a real spread fires on the references you care about. No waiting for a forwarded screenshot. No refreshing six tabs in a loop.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;pay $2 only when a real spread fires — monitoring is $0.05 per reference per day&lt;/li&gt;
&lt;li&gt;no monthly minimum, no card upfront&lt;/li&gt;
&lt;li&gt;first run completes in under 60 seconds with the 3-field Quick Start&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://apify.com/kazkn/watch-arbitrage-mcp?fpr=8fp2od" rel="noopener noreferrer"&gt;https://apify.com/kazkn/watch-arbitrage-mcp?fpr=8fp2od&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>A 4-layer filter that kills phantom watch price alerts</title>
      <dc:creator>KazKN</dc:creator>
      <pubDate>Tue, 12 May 2026 20:45:19 +0000</pubDate>
      <link>https://dev.to/datakaz/a-4-layer-filter-that-kills-phantom-watch-price-alerts-3h11</link>
      <guid>https://dev.to/datakaz/a-4-layer-filter-that-kills-phantom-watch-price-alerts-3h11</guid>
      <description>&lt;p&gt;Most watch price alerts are noise. A dealer lists a Daytona at 30k, drops it to 28k an hour later, then deletes the listing. The alert fires twice for the same phantom deal.&lt;/p&gt;

&lt;p&gt;Here is a filtering stack that actually works.&lt;/p&gt;

&lt;h2&gt;
  
  
  Layer 1: platform normalisation
&lt;/h2&gt;

&lt;p&gt;Different marketplaces use different fee structures. C24 adds 6.5% to the buyer. WatchBox builds commission into the ask. Bobs is net-of-fee retail.&lt;/p&gt;

&lt;p&gt;Before you compare two prices, convert both to the same unit — buyer-out-the-door cost in your home currency. Otherwise you are comparing a net price with a gross price.&lt;/p&gt;

&lt;h2&gt;
  
  
  Layer 2: condition matching
&lt;/h2&gt;

&lt;p&gt;"Unworn" on Chrono24 and "mint" on WatchBox are not the same standard. One includes the original sticker, the other means "no scratches visible in photos."&lt;/p&gt;

&lt;p&gt;Your comparison should enforce the same condition tier across listings. If you do not, you are pricing an A-grade watch against a B-grade watch.&lt;/p&gt;

&lt;h2&gt;
  
  
  Layer 3: freshness filter
&lt;/h2&gt;

&lt;p&gt;Set a max listing age. My threshold is 72 hours for Rolex sport models, 7 days for vintage. Anything older is stale inventory — the price is aspirational, not transactional.&lt;/p&gt;

&lt;h2&gt;
  
  
  Layer 4: cross-platform delta trigger
&lt;/h2&gt;

&lt;p&gt;Only flag a pair when the delta is &amp;gt;7% after fees, condition, and currency normalisation. At &amp;lt;7%, transaction friction eats the margin.&lt;/p&gt;

&lt;h2&gt;
  
  
  What this looks like in practice
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;116500LN, 2021, unworn, full set.&lt;/li&gt;
&lt;li&gt;Platform A: EUR 31.2k out-the-door.&lt;/li&gt;
&lt;li&gt;Platform B: EUR 33.8k out-the-door.&lt;/li&gt;
&lt;li&gt;Delta: 7.7%.&lt;/li&gt;
&lt;li&gt;Flag. Shortlist. Contact.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Everything else stays quiet.&lt;/p&gt;




&lt;p&gt;If you want the same stack running on whichever references you track:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apify.com/kazkn/watch-arbitrage-mcp?fpr=8fp2od" rel="noopener noreferrer"&gt;https://apify.com/kazkn/watch-arbitrage-mcp?fpr=8fp2od&lt;/a&gt;&lt;/p&gt;

</description>
      <category>python</category>
      <category>automation</category>
      <category>webscraping</category>
      <category>sideprojects</category>
    </item>
  </channel>
</rss>
