{
  "platform": [
    {
      "date": "2026-10-25",
      "version": "1.2.0",
      "title": "Versioned API, MCP output schemas, provider pages v2",
      "changes": [
        "API versioning: every REST endpoint is now also served at /api/v1/... (listed in /openapi.json). The unversioned /api/... paths stay as permanent aliases. Every /api response carries X-Whirrwork-API-Version: 1. Within v1 we only add fields and endpoints; nothing is removed or retyped without a new major version.",
        "MCP: all 13 tools now declare an outputSchema (JSON Schema), so agents can validate structuredContent and generate typed bindings. Schemas are open (new fields may appear) and stable within v1. scripts/check_mcp_schemas.py validates real tool outputs against them before each deploy.",
        "Provider pages redesigned: a fact sheet (jobs, service area, sourced prices, last checked with a freshness dot), jobs listed with their typical published price, service countries with flags and links to local pages, published areas with receipts, a 'How we know this' provenance trail, similar providers, and a 'For agents' box with the JSON and MCP call. Listing status is shown honestly: compiled from public sources, not yet claimed.",
        "Dark mode: card titles (jobs and providers) were nearly invisible on dark backgrounds; fixed site-wide.",
        "Data: first sourced prices for 6 jobs (home robot vacuums, home window-cleaning robots, robotic pool cleaners, self-cleaning litter boxes, home security drones, lost-pet drone searches), 3 new local lost-pet drone search operators (Alabama, Michigan, Northern California), and Tertill marked as discontinued per its maker. No API fields were removed."
      ]
    },
    {
      "date": "2026-10-25",
      "version": "1.1.1",
      "title": "Job pages in 12 languages, cleaner demand data",
      "changes": [
        "Job pages, geo pages and provider cards are now fully localized in all 11 non-English languages: the Bot or Not? verdict (previously English-only), the price chart, price and history tables, provider signals, the compare tray, empty states and calls to action. These strings are hand-written, not machine-translated. Dates are formatted for each locale.",
        "Fixed badly machine-translated price labels (for example the Japanese 'as of' label and every language's price note).",
        "Demand data: searches from crawlers, link-preview bots, browser prefetches and homepage example chips are now tagged (source bot, prefetch or example) and excluded from /api/demand and admin stats. User agents are checked but never stored. No API fields were removed."
      ]
    },
    {
      "date": "2026-10-25",
      "version": "1.1.0",
      "title": "Price history, bulk data and a much better agent toolkit",
      "changes": [
        "Append-only price history: every price we record becomes a permanent observation (data/price_observations.jsonl + D1). New GET /api/prices/history and MCP get_price_history.",
        "USD (or any currency) conversions with the dated ECB reference rate and source shown on every converted number (GET /api/fx).",
        "Immutable dated dataset snapshots on every build, and an automatic data changelog.",
        "MCP: new tools compare_providers, get_price_history, estimate_cost, get_rfq_template, get_rfq_status, list_categories, get_provider; richer schemas with examples; resources and prompts.",
        "REST: pagination (limit/offset + Link headers), sorting, field selection, ETag/304, structured error objects, provider filters (country, HQ, engagement model, robot type, price), /api/providers/compare, /api/estimate, /api/use-cases/{id}/rfq-template.",
        "Bulk downloads (JSON, JSONL, CSV) under CC BY 4.0 at /data/. Discovery: /.well-known/ai-catalog.json, MCP server card at /mcp/server-card, RFC 9727 /.well-known/api-catalog."
      ]
    },
    {
      "date": "2026-10-25",
      "version": "1.0.0",
      "title": "Launch",
      "changes": [
        "308 robot jobs, 651 providers, sourced price benchmarks, free RFQs, JSON API, OpenAPI 3.1, llms.txt and a remote MCP server."
      ]
    }
  ],
  "data": [
    {
      "date": "2026-10-25",
      "at": "2026-10-25T16:36:25.503Z",
      "snapshot": "2026-10-25T1636Z",
      "previous": "2026-10-25T1537Z",
      "summary": "1 provider(s) added; 5 provider(s) updated; 18 new price observation(s) (0 price change(s))",
      "use_cases_added": [],
      "use_cases_removed": [],
      "providers_added": [
        "aeroclean-solutions"
      ],
      "providers_removed": [],
      "providers_updated": [
        "somatic",
        "blue-robotics",
        "qysea",
        "1x-technologies",
        "main-exterior-solutions"
      ],
      "price_observations_added": 18,
      "price_changes": []
    },
    {
      "date": "2026-10-25",
      "at": "2026-10-25T15:37:55.713Z",
      "snapshot": "2026-10-25T1537Z",
      "previous": "2026-10-25T1512Z",
      "summary": "3 provider(s) added; 6 provider(s) updated; 21 new price observation(s) (0 price change(s))",
      "use_cases_added": [],
      "use_cases_removed": [],
      "providers_added": [
        "iron-sight-imagery",
        "northstar-drone-solutions",
        "norcal-lost-pet-recovery"
      ],
      "providers_removed": [],
      "providers_updated": [
        "ecovacs-robotics",
        "sunflower-labs",
        "maytronics-dolphin",
        "irobot",
        "whisker-litter-robot",
        "tertill"
      ],
      "price_observations_added": 21,
      "price_changes": []
    },
    {
      "date": "2026-10-25",
      "at": "2026-10-25T15:12:45.324Z",
      "snapshot": "2026-10-25T1512Z",
      "previous": "2026-10-25T1451Z",
      "summary": "9 provider(s) added",
      "use_cases_added": [],
      "use_cases_removed": [],
      "providers_added": [
        "galbot",
        "leju-robotics",
        "engineai",
        "eavision",
        "topxgun",
        "yijiahe",
        "shenhao-technology",
        "efy-intelligent-control",
        "cross1000"
      ],
      "providers_removed": [],
      "providers_updated": [],
      "price_observations_added": 0,
      "price_changes": []
    },
    {
      "date": "2026-10-25",
      "at": "2026-10-25T14:51:01.783Z",
      "snapshot": "2026-10-25T1451Z",
      "previous": "2026-10-25T1337Z",
      "summary": "1 provider(s) added; 1 provider(s) updated; 1 new price observation(s) (0 price change(s))",
      "use_cases_added": [],
      "use_cases_removed": [],
      "providers_added": [
        "main-exterior-solutions"
      ],
      "providers_removed": [],
      "providers_updated": [
        "exterior-drone-washing"
      ],
      "price_observations_added": 1,
      "price_changes": []
    },
    {
      "date": "2026-10-25",
      "at": "2026-10-25T13:37:49.204Z",
      "snapshot": "2026-10-25T1337Z",
      "previous": "2026-10-25T1336Z",
      "summary": "1 provider(s) updated; 4 new price observation(s) (0 price change(s))",
      "use_cases_added": [],
      "use_cases_removed": [],
      "providers_added": [],
      "providers_removed": [],
      "providers_updated": [
        "yarbo"
      ],
      "price_observations_added": 4,
      "price_changes": []
    },
    {
      "date": "2026-10-25",
      "at": "2026-10-25T13:36:18.866Z",
      "snapshot": "2026-10-25T1336Z",
      "previous": "2026-10-25",
      "summary": "16 provider(s) added; 2 provider(s) updated; 9 new price observation(s) (1 price change(s))",
      "use_cases_added": [],
      "use_cases_removed": [],
      "providers_added": [
        "mach-eureka-escalator",
        "juma-reinigungstechnik",
        "hydramaster-treadmaster",
        "cyberstein-robotics",
        "scarlett-entertainment",
        "high-voltage-events",
        "abbey-road-entertainment",
        "robots-de-leds",
        "robotron-brasil",
        "cybertron-cosplay",
        "snaplok-systems",
        "wohler",
        "svarmi",
        "earth-scan",
        "black-swift-technologies",
        "general-drones"
      ],
      "providers_removed": [],
      "providers_updated": [
        "sph-engineering",
        "ranmarine"
      ],
      "price_observations_added": 9,
      "price_changes": [
        {
          "id": "po_20261025_8693e849327e",
          "supersedes": "po_20261025_c9cc1b9bb91c",
          "use_case_id": "robotic-lawn-mowing",
          "provider_id": null
        }
      ]
    },
    {
      "date": "2026-10-25",
      "at": "2026-10-25T12:38:37.716Z",
      "snapshot": "2026-10-25",
      "previous": null,
      "summary": "First snapshot: 308 use cases, 651 providers, 250 price observations backfilled.",
      "use_cases_added": 308,
      "providers_added": 651,
      "price_observations_added": 250
    }
  ],
  "snapshots": [
    {
      "snapshot": "2026-10-25",
      "created_at": "2026-10-25T12:38:37.716Z",
      "counts": {
        "price_observations": 250,
        "categories": 20,
        "use_cases": 308,
        "providers": 651,
        "price_points": 250
      }
    },
    {
      "snapshot": "2026-10-25T1336Z",
      "created_at": "2026-10-25T13:36:18.866Z",
      "counts": {
        "price_observations": 259,
        "categories": 20,
        "use_cases": 308,
        "providers": 667,
        "price_points": 258
      }
    },
    {
      "snapshot": "2026-10-25T1337Z",
      "created_at": "2026-10-25T13:37:49.204Z",
      "counts": {
        "price_observations": 263,
        "categories": 20,
        "use_cases": 308,
        "providers": 667,
        "price_points": 262
      }
    },
    {
      "snapshot": "2026-10-25T1451Z",
      "created_at": "2026-10-25T14:51:01.783Z",
      "counts": {
        "price_observations": 264,
        "categories": 20,
        "use_cases": 308,
        "providers": 668,
        "price_points": 263
      }
    },
    {
      "snapshot": "2026-10-25T1512Z",
      "created_at": "2026-10-25T15:12:45.324Z",
      "counts": {
        "price_observations": 264,
        "categories": 20,
        "use_cases": 308,
        "providers": 677,
        "price_points": 263
      }
    },
    {
      "snapshot": "2026-10-25T1537Z",
      "created_at": "2026-10-25T15:37:55.713Z",
      "counts": {
        "price_observations": 285,
        "categories": 20,
        "use_cases": 308,
        "providers": 680,
        "price_points": 284
      }
    },
    {
      "snapshot": "2026-10-25T1636Z",
      "created_at": "2026-10-25T16:36:25.503Z",
      "counts": {
        "price_observations": 303,
        "categories": 20,
        "use_cases": 308,
        "providers": 681,
        "price_points": 302
      }
    }
  ],
  "note": "Snapshots are immutable dated copies of the full dataset kept in the repository (data/snapshots/). Bulk current data: /downloads/index.json"
}