Whirrwork MCP
An official MCP server for Whirrwork that allows AI agents to search for robot use cases, find providers, compare robot vs human costs, estimate prices with sourced receipts, and submit RFQs for robot services globally.
Endpoint and access
No sign-in to connect and list tools. Individual tools may still need a vendor account, credentials, or permissions; check the documented prerequisites.
https://whirrwork.com/mcpWhat you can do with it
- Search for robot use cases and providers by country
- Compare robot vs human costs and get price estimates
- Find providers and compare their specs and prices
- Submit RFQs for robot services with buyer consent
Source and maintenance
Protocol and capabilities
- Server
- whirrwork 1.8.0
- MCP protocol
- 2025-06-18
- Tools
- 23 advertised
- Resources
- 4 advertised
- Resource templates
- 3 advertised
- Prompts
- 3 advertised
{
"tools": {
"listChanged": false
},
"prompts": {
"listChanged": false
},
"resources": {
"subscribe": false,
"listChanged": false
}
}Server-provided instructions
Untrusted server output shown for inspection. It is not Koskamo guidance and is excluded from knowledge search.
Tools
23 advertised
search_use_cases — Search robot jobs
Find the robot job (use case) that matches what the buyer wants, in plain words and in any of 12 languages. Returns matching use cases (id, name, price summary, provider count) plus matching providers and guides. Start here, then call get_use_case with the best id. Examples: "drone light show for a wedding", "robotic floor scrubbing for a warehouse", "limpieza de ventanas con drones", "无人机灯光秀".
{
"type": "object",
"required": [
"query"
],
"properties": {
"limit": {
"type": "integer",
"default": 8,
"maximum": 25,
"minimum": 1
},
"query": {
"type": "string",
"examples": [
"drone light show for 300 guests",
"crop spraying 500 hectares soybeans"
],
"maxLength": 300,
"minLength": 2,
"description": "What the buyer needs done, in their words"
},
"country": {
"type": "string",
"examples": [
"AE",
"BR",
"CA",
"Germany"
],
"description": "Buyer country: ISO 3166-1 alpha-2 (\"AE\") or English name (\"United Arab Emirates\")."
},
"language": {
"enum": [
"en",
"es",
"pt-BR",
"fr",
"de",
"zh",
"zh-Hant",
"ja",
"ar",
"hi",
"ko",
"id",
"tr"
],
"type": "string",
"examples": [
"es",
"pt-BR",
"zh"
],
"description": "Language for use-case text (machine-translated; English is authoritative). Default en."
}
},
"additionalProperties": false
}{
"type": "object",
"required": [
"query",
"use_cases",
"providers",
"next"
],
"properties": {
"next": {
"type": "string"
},
"query": {
"type": "string"
},
"guides": {
"type": "array",
"items": {
"type": "object",
"properties": {
"url": {
"type": "string"
},
"title": {
"type": "string"
}
}
}
},
"country": {
"type": [
"string",
"null"
]
},
"language": {
"type": "string"
},
"providers": {
"type": "array",
"items": {
"type": "object",
"required": [
"id",
"name"
],
"properties": {
"id": {
"type": "string"
},
"url": {
"type": "string"
},
"name": {
"type": "string"
},
"hq_country": {
"type": [
"string",
"null"
]
},
"matched_via_use_case": {
"type": "string"
}
}
}
},
"use_cases": {
"type": "array",
"items": {
"type": "object",
"required": [
"id",
"name",
"url"
],
"properties": {
"id": {
"type": "string"
},
"url": {
"type": "string"
},
"name": {
"type": "string"
},
"score": {
"type": "number"
},
"name_en": {
"type": "string"
},
"category": {
"type": [
"string",
"null"
]
},
"category_id": {
"type": "string"
},
"description": {
"type": "string"
},
"price_summary": {
"type": [
"string",
"null"
]
},
"provider_count": {
"type": "integer"
},
"matched_language": {
"type": "string"
},
"providers_in_country": {
"type": "integer"
},
"price_benchmark_count": {
"type": "integer"
}
}
}
},
"match_quality": {
"type": "string"
},
"detected_language": {
"type": [
"string",
"null"
]
}
}
}{
"title": "Search robot jobs",
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}get_use_case — Get a robot job
Everything about one job: what it is, robot types, ways to buy (service/rental/RaaS/purchase), honest buyer tips (including when a robot is overkill), regulatory notes, every sourced price benchmark (with source_url, as_of and a USD conversion), price-history counts, the RFQ checklist, and providers. Pass country (and optionally region) to rank providers by who serves that place, with the reason.
{
"type": "object",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"examples": [
"drone-light-show",
"commercial-floor-scrubbing"
],
"description": "Use case id from search_use_cases"
},
"region": {
"type": "string",
"description": "Optional sub-country region (e.g. \"US-CA\", \"California\", \"Mendoza\")"
},
"country": {
"type": "string",
"examples": [
"AE",
"BR",
"CA",
"Germany"
],
"description": "Buyer country: ISO 3166-1 alpha-2 (\"AE\") or English name (\"United Arab Emirates\")."
},
"language": {
"enum": [
"en",
"es",
"pt-BR",
"fr",
"de",
"zh",
"zh-Hant",
"ja",
"ar",
"hi",
"ko",
"id",
"tr"
],
"type": "string",
"examples": [
"es",
"pt-BR",
"zh"
],
"description": "Language for use-case text (machine-translated; English is authoritative). Default en."
}
},
"additionalProperties": false
}{
"type": "object",
"required": [
"id",
"name",
"url",
"price_benchmarks",
"providers"
],
"properties": {
"id": {
"type": "string"
},
"url": {
"type": "string"
},
"name": {
"type": "string"
},
"region": {
"type": [
"string",
"null"
]
},
"country": {
"type": [
"string",
"null"
]
},
"geo_url": {
"type": [
"string",
"null"
]
},
"name_en": {
"type": "string"
},
"rfq_url": {
"type": "string"
},
"category": {
"type": [
"string",
"null"
]
},
"language": {
"type": "string"
},
"providers": {
"type": "array",
"items": {
"type": "object",
"required": [
"id",
"name",
"url"
],
"properties": {
"id": {
"type": "string"
},
"url": {
"type": "string",
"description": "Whirrwork profile page"
},
"name": {
"type": "string"
},
"contact": {
"type": [
"object",
"null"
],
"properties": {
"email": {
"type": [
"string",
"null"
]
},
"phone": {
"type": [
"string",
"null"
]
},
"rfq_url": {
"type": [
"string",
"null"
]
}
}
},
"pricing": {
"type": "array",
"items": {
"type": "object",
"required": [
"source_url",
"as_of"
],
"properties": {
"low": {
"type": [
"number",
"null"
]
},
"usd": {
"type": [
"object",
"null"
],
"properties": {
"low": {
"type": [
"number",
"null"
]
},
"high": {
"type": [
"number",
"null"
]
},
"note": {
"type": "string"
},
"currency": {
"type": "string"
}
},
"description": "Labelled currency conversion at a dated FX rate (never a quote)"
},
"high": {
"type": [
"number",
"null"
],
"description": "null = \"from\" / starting at"
},
"unit": {
"type": "string"
},
"as_of": {
"type": "string",
"description": "YYYY-MM or YYYY-MM-DD the source states"
},
"region": {
"type": [
"string",
"null"
]
},
"currency": {
"type": "string"
},
"source_url": {
"type": "string",
"description": "Public page that states this price"
},
"description": {
"type": "string"
},
"older_price": {
"type": "boolean"
}
}
}
},
"website": {
"type": [
"string",
"null"
]
},
"coverage": {
"type": [
"string",
"null"
],
"description": "How this provider relates to the requested place (serves region / country / part / HQ only / worldwide)"
},
"hq_country": {
"type": [
"string",
"null"
]
},
"description": {
"type": "string"
},
"robot_types": {
"type": "array",
"items": {
"type": "string"
}
},
"source_urls": {
"type": "array",
"items": {
"type": "string"
}
},
"last_checked": {
"type": [
"string",
"null"
]
},
"use_case_ids": {
"type": "array",
"items": {
"type": "string"
}
},
"service_areas": {
"type": "array",
"items": {
"type": "object",
"properties": {
"city": {
"type": [
"string",
"null"
]
},
"region": {
"type": [
"string",
"null"
]
},
"country": {
"type": "string"
},
"source_url": {
"type": [
"string",
"null"
]
},
"derived_from": {
"type": "string"
}
}
}
},
"contact_routes": {
"type": "object"
},
"coverage_reason": {
"type": [
"string",
"null"
]
},
"service_regions": {
"type": "array",
"items": {
"type": "string"
}
},
"engagement_models": {
"type": "array",
"items": {
"type": "string"
}
},
"has_published_pricing": {
"type": "boolean"
},
"published_price_count": {
"type": "integer"
},
"min_published_price_usd": {
"type": [
"number",
"null"
]
}
}
}
},
"buyer_tips": {
"type": "array",
"items": {
"type": "string"
}
},
"category_id": {
"type": "string"
},
"description": {
"type": "string"
},
"robot_types": {
"type": "array",
"items": {
"type": "string"
}
},
"buyer_phrases": {
"type": "array",
"items": {
"type": "string"
}
},
"price_history": {
"type": [
"object",
"null"
],
"properties": {
"url": {
"type": "string"
},
"series": {
"type": "integer"
},
"observations": {
"type": "integer"
},
"changed_series": {
"type": "integer"
}
}
},
"price_summary": {
"type": [
"object",
"null"
],
"properties": {
"low": {
"type": [
"number",
"null"
]
},
"high": {
"type": [
"number",
"null"
]
},
"unit": {
"type": "string"
},
"count": {
"type": "integer"
},
"label": {
"type": "string"
},
"older": {
"type": "boolean"
},
"latest": {
"type": [
"string",
"null"
]
},
"currency": {
"type": "string"
}
}
},
"price_benchmarks": {
"type": "array",
"items": {
"type": "object",
"required": [
"source_url",
"as_of"
],
"properties": {
"low": {
"type": [
"number",
"null"
]
},
"usd": {
"type": [
"object",
"null"
],
"properties": {
"low": {
"type": [
"number",
"null"
]
},
"high": {
"type": [
"number",
"null"
]
},
"note": {
"type": "string"
},
"currency": {
"type": "string"
}
},
"description": "Labelled currency conversion at a dated FX rate (never a quote)"
},
"high": {
"type": [
"number",
"null"
],
"description": "null = \"from\" / starting at"
},
"unit": {
"type": "string"
},
"as_of": {
"type": "string",
"description": "YYYY-MM or YYYY-MM-DD the source states"
},
"region": {
"type": [
"string",
"null"
]
},
"currency": {
"type": "string"
},
"source_url": {
"type": "string",
"description": "Public page that states this price"
},
"description": {
"type": "string"
},
"older_price": {
"type": "boolean"
}
}
}
},
"regulatory_notes": {
"type": [
"string",
"null"
]
},
"rfq_template_url": {
"type": "string"
},
"engagement_models": {
"type": "array",
"items": {
"type": "string"
}
},
"machine_translated": {
"type": "boolean"
},
"what_to_specify_in_rfq": {
"type": "array",
"items": {
"type": "string"
}
}
}
}{
"title": "Get a robot job",
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}list_categories — List categories
The 20 job categories with use-case counts, for browsing when the buyer is vague.
{
"type": "object",
"properties": {
"language": {
"enum": [
"en",
"es",
"pt-BR",
"fr",
"de",
"zh",
"zh-Hant",
"ja",
"ar",
"hi",
"ko",
"id",
"tr"
],
"type": "string",
"examples": [
"es",
"pt-BR",
"zh"
],
"description": "Language for use-case text (machine-translated; English is authoritative). Default en."
}
},
"additionalProperties": false
}{
"type": "object",
"required": [
"categories"
],
"properties": {
"categories": {
"type": "array",
"items": {
"type": "object",
"required": [
"id",
"name",
"use_case_ids"
],
"properties": {
"id": {
"type": "string"
},
"name": {
"type": "string"
},
"name_en": {
"type": "string"
},
"use_case_ids": {
"type": "array",
"items": {
"type": "string"
}
},
"use_case_count": {
"type": "integer"
}
}
}
}
}
}{
"title": "List categories",
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}find_providers — Find providers
Shortlist providers for a job and place. Ranked: lists the region > lists the country > lists part of the country > headquartered there (HQ is not a service area) > works worldwide. Each result has coverage + coverage_reason, engagement models, published pricing with USD conversion, min_published_price_usd and public contact routes. Coverage is country-level unless the provider published regions. Filters combine (AND). Example: {"use_case":"drone-light-show","country":"AE"}; {"use_case":"commercial-floor-scrubbing","country":"CA","region":"ON","engagement_model":"raas"}.
{
"type": "object",
"properties": {
"near": {
"type": "string",
"description": "\"me\" = the country Cloudflare sees for this request (never stored), or a country name/code. Coordinates are not supported."
},
"sort": {
"enum": [
"relevance",
"name",
"-name",
"price",
"-price",
"last_checked"
],
"type": "string",
"default": "relevance"
},
"limit": {
"type": "integer",
"default": 15,
"maximum": 50,
"minimum": 1
},
"query": {
"type": "string",
"description": "Keyword filter on name/description"
},
"offset": {
"type": "integer",
"default": 0,
"minimum": 0
},
"region": {
"type": "string",
"description": "Sub-country region code or name, e.g. \"US-CA\", \"ON\", \"Mendoza\""
},
"country": {
"type": "string",
"examples": [
"AE",
"BR",
"CA",
"Germany"
],
"description": "Buyer country: ISO 3166-1 alpha-2 (\"AE\") or English name (\"United Arab Emirates\")."
},
"use_case": {
"type": "string",
"examples": [
"drone-light-show"
],
"description": "Use case id (recommended)"
},
"hq_country": {
"type": "string",
"description": "Only providers headquartered in this country"
},
"robot_type": {
"type": "string",
"description": "Substring match on robot types, e.g. \"drone\", \"AMR\", \"humanoid\""
},
"has_contact": {
"type": "boolean",
"description": "Only providers with a public email, phone or quote form"
},
"has_pricing": {
"type": "boolean",
"description": "Only providers that publish prices"
},
"max_price_usd": {
"type": "number",
"description": "Only providers whose lowest published price (converted to USD) is at or below this. Excludes providers without published prices."
},
"include_global": {
"type": "boolean",
"default": true,
"description": "Include providers that only say \"worldwide\" when a country is given"
},
"engagement_model": {
"enum": [
"service",
"rental",
"raas",
"purchase"
],
"type": "string"
}
},
"additionalProperties": false
}{
"type": "object",
"required": [
"count",
"providers"
],
"properties": {
"note": {
"type": "string"
},
"count": {
"type": "integer"
},
"region": {
"type": [
"string",
"null"
]
},
"country": {
"type": [
"string",
"null"
]
},
"ranking": {
"type": "string"
},
"use_case": {
"type": [
"string",
"null"
]
},
"providers": {
"type": "array",
"items": {
"type": "object",
"required": [
"id",
"name",
"url"
],
"properties": {
"id": {
"type": "string"
},
"url": {
"type": "string",
"description": "Whirrwork profile page"
},
"name": {
"type": "string"
},
"contact": {
"type": [
"object",
"null"
],
"properties": {
"email": {
"type": [
"string",
"null"
]
},
"phone": {
"type": [
"string",
"null"
]
},
"rfq_url": {
"type": [
"string",
"null"
]
}
}
},
"pricing": {
"type": "array",
"items": {
"type": "object",
"required": [
"source_url",
"as_of"
],
"properties": {
"low": {
"type": [
"number",
"null"
]
},
"usd": {
"type": [
"object",
"null"
],
"properties": {
"low": {
"type": [
"number",
"null"
]
},
"high": {
"type": [
"number",
"null"
]
},
"note": {
"type": "string"
},
"currency": {
"type": "string"
}
},
"description": "Labelled currency conversion at a dated FX rate (never a quote)"
},
"high": {
"type": [
"number",
"null"
],
"description": "null = \"from\" / starting at"
},
"unit": {
"type": "string"
},
"as_of": {
"type": "string",
"description": "YYYY-MM or YYYY-MM-DD the source states"
},
"region": {
"type": [
"string",
"null"
]
},
"currency": {
"type": "string"
},
"source_url": {
"type": "string",
"description": "Public page that states this price"
},
"description": {
"type": "string"
},
"older_price": {
"type": "boolean"
}
}
}
},
"website": {
"type": [
"string",
"null"
]
},
"coverage": {
"type": [
"string",
"null"
],
"description": "How this provider relates to the requested place (serves region / country / part / HQ only / worldwide)"
},
"hq_country": {
"type": [
"string",
"null"
]
},
"description": {
"type": "string"
},
"robot_types": {
"type": "array",
"items": {
"type": "string"
}
},
"source_urls": {
"type": "array",
"items": {
"type": "string"
}
},
"last_checked": {
"type": [
"string",
"null"
]
},
"use_case_ids": {
"type": "array",
"items": {
"type": "string"
}
},
"service_areas": {
"type": "array",
"items": {
"type": "object",
"properties": {
"city": {
"type": [
"string",
"null"
]
},
"region": {
"type": [
"string",
"null"
]
},
"country": {
"type": "string"
},
"source_url": {
"type": [
"string",
"null"
]
},
"derived_from": {
"type": "string"
}
}
}
},
"contact_routes": {
"type": "object"
},
"coverage_reason": {
"type": [
"string",
"null"
]
},
"service_regions": {
"type": "array",
"items": {
"type": "string"
}
},
"engagement_models": {
"type": "array",
"items": {
"type": "string"
}
},
"has_published_pricing": {
"type": "boolean"
},
"published_price_count": {
"type": "integer"
},
"min_published_price_usd": {
"type": [
"number",
"null"
]
}
}
}
},
"near_source": {
"type": "string"
},
"next_offset": {
"type": [
"integer",
"null"
]
}
}
}{
"title": "Find providers",
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}get_provider — Get a provider
Full public profile of one provider: website, HQ, service regions and explicit service areas (with sources), jobs, robot types, engagement models, published prices (with USD), contact routes, sources and last-checked date.
{
"type": "object",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"examples": [
"sky-elements"
]
},
"country": {
"type": "string",
"examples": [
"AE",
"BR",
"CA",
"Germany"
],
"description": "Buyer country: ISO 3166-1 alpha-2 (\"AE\") or English name (\"United Arab Emirates\")."
}
},
"additionalProperties": false
}{
"type": "object",
"required": [
"id",
"name",
"url"
],
"properties": {
"id": {
"type": "string"
},
"url": {
"type": "string",
"description": "Whirrwork profile page"
},
"name": {
"type": "string"
},
"contact": {
"type": [
"object",
"null"
],
"properties": {
"email": {
"type": [
"string",
"null"
]
},
"phone": {
"type": [
"string",
"null"
]
},
"rfq_url": {
"type": [
"string",
"null"
]
}
}
},
"pricing": {
"type": "array",
"items": {
"type": "object",
"required": [
"source_url",
"as_of"
],
"properties": {
"low": {
"type": [
"number",
"null"
]
},
"usd": {
"type": [
"object",
"null"
],
"properties": {
"low": {
"type": [
"number",
"null"
]
},
"high": {
"type": [
"number",
"null"
]
},
"note": {
"type": "string"
},
"currency": {
"type": "string"
}
},
"description": "Labelled currency conversion at a dated FX rate (never a quote)"
},
"high": {
"type": [
"number",
"null"
],
"description": "null = \"from\" / starting at"
},
"unit": {
"type": "string"
},
"as_of": {
"type": "string",
"description": "YYYY-MM or YYYY-MM-DD the source states"
},
"region": {
"type": [
"string",
"null"
]
},
"currency": {
"type": "string"
},
"source_url": {
"type": "string",
"description": "Public page that states this price"
},
"description": {
"type": "string"
},
"older_price": {
"type": "boolean"
}
}
}
},
"website": {
"type": [
"string",
"null"
]
},
"coverage": {
"type": [
"string",
"null"
],
"description": "How this provider relates to the requested place (serves region / country / part / HQ only / worldwide)"
},
"hq_country": {
"type": [
"string",
"null"
]
},
"description": {
"type": "string"
},
"robot_types": {
"type": "array",
"items": {
"type": "string"
}
},
"source_urls": {
"type": "array",
"items": {
"type": "string"
}
},
"last_checked": {
"type": [
"string",
"null"
]
},
"use_case_ids": {
"type": "array",
"items": {
"type": "string"
}
},
"service_areas": {
"type": "array",
"items": {
"type": "object",
"properties": {
"city": {
"type": [
"string",
"null"
]
},
"region": {
"type": [
"string",
"null"
]
},
"country": {
"type": "string"
},
"source_url": {
"type": [
"string",
"null"
]
},
"derived_from": {
"type": "string"
}
}
}
},
"contact_routes": {
"type": "object"
},
"coverage_reason": {
"type": [
"string",
"null"
]
},
"service_regions": {
"type": "array",
"items": {
"type": "string"
}
},
"engagement_models": {
"type": "array",
"items": {
"type": "string"
}
},
"has_published_pricing": {
"type": "boolean"
},
"published_price_count": {
"type": "integer"
},
"min_published_price_usd": {
"type": [
"number",
"null"
]
}
}
}{
"title": "Get a provider",
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}compare_providers — Compare providers
Side-by-side comparison of 2-10 providers: coverage for a country, engagement models, published prices (USD-normalized), HQ, contact routes, shared jobs, last checked. Facts only, no ratings.
{
"type": "object",
"required": [
"ids"
],
"properties": {
"ids": {
"type": "array",
"items": {
"type": "string"
},
"examples": [
[
"sky-elements",
"verge-aero"
]
],
"maxItems": 10,
"minItems": 2
},
"country": {
"type": "string",
"examples": [
"AE",
"BR",
"CA",
"Germany"
],
"description": "Buyer country: ISO 3166-1 alpha-2 (\"AE\") or English name (\"United Arab Emirates\")."
},
"use_case": {
"type": "string"
}
},
"additionalProperties": false
}{
"type": "object",
"required": [
"providers"
],
"properties": {
"note": {
"type": "string"
},
"matrix": {
"type": "object",
"description": "attribute -> provider id -> value"
},
"country": {
"type": [
"string",
"null"
]
},
"use_case": {
"type": [
"string",
"null"
]
},
"providers": {
"type": "array",
"items": {
"type": "object",
"required": [
"id",
"name",
"url"
],
"properties": {
"id": {
"type": "string"
},
"url": {
"type": "string",
"description": "Whirrwork profile page"
},
"name": {
"type": "string"
},
"contact": {
"type": [
"object",
"null"
],
"properties": {
"email": {
"type": [
"string",
"null"
]
},
"phone": {
"type": [
"string",
"null"
]
},
"rfq_url": {
"type": [
"string",
"null"
]
}
}
},
"pricing": {
"type": "array",
"items": {
"type": "object",
"required": [
"source_url",
"as_of"
],
"properties": {
"low": {
"type": [
"number",
"null"
]
},
"usd": {
"type": [
"object",
"null"
],
"properties": {
"low": {
"type": [
"number",
"null"
]
},
"high": {
"type": [
"number",
"null"
]
},
"note": {
"type": "string"
},
"currency": {
"type": "string"
}
},
"description": "Labelled currency conversion at a dated FX rate (never a quote)"
},
"high": {
"type": [
"number",
"null"
],
"description": "null = \"from\" / starting at"
},
"unit": {
"type": "string"
},
"as_of": {
"type": "string",
"description": "YYYY-MM or YYYY-MM-DD the source states"
},
"region": {
"type": [
"string",
"null"
]
},
"currency": {
"type": "string"
},
"source_url": {
"type": "string",
"description": "Public page that states this price"
},
"description": {
"type": "string"
},
"older_price": {
"type": "boolean"
}
}
}
},
"website": {
"type": [
"string",
"null"
]
},
"coverage": {
"type": [
"string",
"null"
],
"description": "How this provider relates to the requested place (serves region / country / part / HQ only / worldwide)"
},
"hq_country": {
"type": [
"string",
"null"
]
},
"description": {
"type": "string"
},
"robot_types": {
"type": "array",
"items": {
"type": "string"
}
},
"source_urls": {
"type": "array",
"items": {
"type": "string"
}
},
"last_checked": {
"type": [
"string",
"null"
]
},
"use_case_ids": {
"type": "array",
"items": {
"type": "string"
}
},
"service_areas": {
"type": "array",
"items": {
"type": "object",
"properties": {
"city": {
"type": [
"string",
"null"
]
},
"region": {
"type": [
"string",
"null"
]
},
"country": {
"type": "string"
},
"source_url": {
"type": [
"string",
"null"
]
},
"derived_from": {
"type": "string"
}
}
}
},
"contact_routes": {
"type": "object"
},
"coverage_reason": {
"type": [
"string",
"null"
]
},
"service_regions": {
"type": "array",
"items": {
"type": "string"
}
},
"engagement_models": {
"type": "array",
"items": {
"type": "string"
}
},
"has_published_pricing": {
"type": "boolean"
},
"published_price_count": {
"type": "integer"
},
"min_published_price_usd": {
"type": [
"number",
"null"
]
}
}
}
},
"shared_use_cases": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string"
},
"name": {
"type": "string"
}
}
}
}
}
}{
"title": "Compare providers",
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}get_prices — Get current prices
Current sourced prices for a job (benchmarks + provider-published), or for one provider. Every row has source_url and as_of. Set convert (e.g. "USD") to add a clearly labelled conversion with the FX rate, date and source. Benchmarks, not quotes.
{
"type": "object",
"properties": {
"limit": {
"type": "integer",
"default": 60,
"maximum": 200,
"minimum": 1
},
"convert": {
"type": "string",
"default": "USD",
"examples": [
"USD",
"EUR",
"BRL"
],
"description": "Convert to this ISO 4217 currency (dated ECB reference rate)"
},
"currency": {
"type": "string",
"description": "Only rows quoted in this ISO 4217 currency"
},
"provider": {
"type": "string"
},
"use_case": {
"type": "string",
"examples": [
"crop-spraying-drone"
]
},
"include_providers": {
"type": "boolean",
"default": true
}
},
"additionalProperties": false
}{
"type": "object",
"required": [
"count",
"prices"
],
"properties": {
"note": {
"type": "string"
},
"count": {
"type": "integer"
},
"prices": {
"type": "array",
"items": {
"type": "object",
"required": [
"source_url",
"as_of"
],
"properties": {
"low": {
"type": [
"number",
"null"
]
},
"high": {
"type": [
"number",
"null"
]
},
"kind": {
"type": "string"
},
"unit": {
"type": "string"
},
"as_of": {
"type": "string"
},
"region": {
"type": [
"string",
"null"
]
},
"display": {
"type": "string"
},
"currency": {
"type": "string"
},
"provider": {
"type": [
"string",
"null"
]
},
"use_case": {
"type": [
"string",
"null"
]
},
"converted": {
"type": [
"object",
"null"
],
"properties": {
"low": {
"type": [
"number",
"null"
]
},
"high": {
"type": [
"number",
"null"
]
},
"note": {
"type": "string"
},
"currency": {
"type": "string"
}
},
"description": "Labelled currency conversion at a dated FX rate (never a quote)"
},
"source_url": {
"type": "string"
},
"description": {
"type": "string"
},
"older_price": {
"type": "boolean"
},
"provider_id": {
"type": [
"string",
"null"
]
},
"use_case_id": {
"type": [
"string",
"null"
]
}
}
}
},
"fx_date": {
"type": [
"string",
"null"
]
},
"license": {
"type": "string"
},
"summary": {
"type": [
"object",
"null"
],
"properties": {
"low": {
"type": [
"number",
"null"
]
},
"high": {
"type": [
"number",
"null"
]
},
"unit": {
"type": "string"
},
"count": {
"type": "integer"
},
"label": {
"type": "string"
},
"older": {
"type": "boolean"
},
"latest": {
"type": [
"string",
"null"
]
},
"currency": {
"type": "string"
}
}
}
}
}{
"title": "Get current prices",
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}get_price_history — Get price history
Every price observation we have recorded (append-only; never overwritten) for a job and/or provider, grouped into series with trend (change_pct between first and latest observation). observed_at = when we recorded it; as_of = the date the source states. If every series has one observation, say so: there is no trend yet.
{
"type": "object",
"properties": {
"limit": {
"type": "integer",
"default": 100,
"maximum": 500,
"minimum": 1
},
"since": {
"type": "string",
"description": "YYYY-MM-DD; only observations recorded on/after this date"
},
"series": {
"type": "string",
"description": "A series_key to follow one price over time"
},
"provider": {
"type": "string"
},
"use_case": {
"type": "string",
"examples": [
"crop-spraying-drone"
]
}
},
"additionalProperties": false
}{
"type": "object",
"required": [
"total",
"observations",
"series"
],
"properties": {
"note": {
"type": "string"
},
"total": {
"type": "integer"
},
"series": {
"type": "array",
"items": {
"type": "object",
"required": [
"series_key"
],
"properties": {
"kind": {
"type": "string"
},
"unit": {
"type": [
"string",
"null"
]
},
"trend": {
"type": [
"object",
"null"
],
"description": "null when there is only one observation (no trend claimed)"
},
"latest": {
"type": [
"object",
"null"
]
},
"region": {
"type": [
"string",
"null"
]
},
"current": {
"type": "boolean"
},
"currency": {
"type": [
"string",
"null"
]
},
"series_key": {
"type": "string"
},
"source_url": {
"type": "string"
},
"description": {
"type": [
"string",
"null"
]
},
"provider_id": {
"type": [
"string",
"null"
]
},
"use_case_id": {
"type": [
"string",
"null"
]
},
"observations": {
"type": "integer"
},
"last_rechecked": {
"type": [
"object",
"null"
]
},
"last_observed_at": {
"type": "string"
},
"first_observed_at": {
"type": "string"
}
}
}
},
"source": {
"type": "string"
},
"license": {
"type": "string"
},
"pagination": {
"type": "object"
},
"observations": {
"type": "array",
"items": {
"type": "object",
"required": [
"id",
"series_key",
"source_url",
"observed_at"
],
"properties": {
"id": {
"type": "string"
},
"low": {
"type": [
"number",
"null"
]
},
"usd": {
"type": [
"object",
"null"
],
"properties": {
"low": {
"type": [
"number",
"null"
]
},
"high": {
"type": [
"number",
"null"
]
},
"note": {
"type": "string"
},
"currency": {
"type": "string"
}
},
"description": "Labelled currency conversion at a dated FX rate (never a quote)"
},
"high": {
"type": [
"number",
"null"
]
},
"kind": {
"enum": [
"benchmark",
"provider_published"
],
"type": "string"
},
"unit": {
"type": [
"string",
"null"
]
},
"as_of": {
"type": [
"string",
"null"
]
},
"origin": {
"type": [
"string",
"null"
]
},
"region": {
"type": [
"string",
"null"
]
},
"current": {
"type": "boolean"
},
"currency": {
"type": [
"string",
"null"
]
},
"series_key": {
"type": "string"
},
"source_url": {
"type": "string"
},
"supersedes": {
"type": [
"string",
"null"
]
},
"description": {
"type": [
"string",
"null"
]
},
"observed_at": {
"type": "string"
},
"provider_id": {
"type": [
"string",
"null"
]
},
"use_case_id": {
"type": [
"string",
"null"
]
},
"content_hash": {
"type": "string"
},
"use_case_ids": {
"type": "array",
"items": {
"type": "string"
}
},
"change_reason": {
"type": [
"string",
"null"
]
}
}
}
},
"tracking_since": {
"type": [
"string",
"null"
]
},
"source_rechecks": {
"type": [
"object",
"null"
]
}
}
}{
"title": "Get price history",
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}estimate_cost — Estimate a job cost from sourced benchmarks
Arithmetic on published prices: unit price × quantity, using exact unit conversions (acre↔hectare, sq ft↔m², mile↔km), preferring benchmarks whose region matches the country, converting currency at a dated ECB rate. Returns the range plus the basis rows (each with source_url, as_of, region match) and caveats. Returns estimate=null with a reason when no sourced benchmark fits; never invents a number. Example: {"use_case":"crop-spraying-drone","quantity":500,"unit":"hectare","country":"BR","currency":"USD"}.
{
"type": "object",
"required": [
"use_case"
],
"properties": {
"unit": {
"type": "string",
"description": "Unit of quantity, e.g. \"hectare\", \"acre\", \"show\", \"month\", \"sq ft\". Omit to use the most common benchmark unit."
},
"country": {
"type": "string",
"examples": [
"AE",
"BR",
"CA",
"Germany"
],
"description": "Buyer country: ISO 3166-1 alpha-2 (\"AE\") or English name (\"United Arab Emirates\")."
},
"currency": {
"type": "string",
"examples": [
"USD"
],
"description": "Express the result in this ISO 4217 currency"
},
"quantity": {
"type": "number",
"description": "How many units (hectares, shows, months, inspections…). Omit for a per-unit price.",
"exclusiveMinimum": 0
},
"use_case": {
"type": "string"
}
},
"additionalProperties": false
}{
"type": "object",
"required": [
"use_case_id",
"estimate"
],
"properties": {
"unit": {
"type": [
"string",
"null"
]
},
"basis": {
"type": "array",
"items": {
"type": "object",
"required": [
"source_url"
],
"properties": {
"cost": {
"type": [
"object",
"null"
]
},
"kind": {
"type": "string"
},
"as_of": {
"type": "string"
},
"region": {
"type": [
"string",
"null"
]
},
"source_url": {
"type": "string"
},
"unit_price": {
"type": "object"
},
"description": {
"type": "string"
},
"older_price": {
"type": "boolean"
},
"provider_id": {
"type": [
"string",
"null"
]
},
"region_match": {
"type": [
"string",
"null"
]
},
"used_in_range": {
"type": "boolean"
},
"unit_conversion": {
"type": [
"object",
"string",
"null"
]
}
}
}
},
"notes": {
"type": "array",
"items": {
"type": "string"
}
},
"method": {
"type": "string"
},
"reason": {
"type": "string"
},
"country": {
"type": [
"string",
"null"
]
},
"fx_date": {
"type": [
"string",
"null"
]
},
"currency": {
"type": [
"string",
"null"
]
},
"estimate": {
"type": [
"object",
"null"
],
"properties": {
"low": {
"type": [
"number",
"null"
]
},
"high": {
"type": [
"number",
"null"
]
},
"based_on": {
"type": "integer"
},
"currency": {
"type": "string"
}
},
"description": "null = no sourced benchmark fits; never guessed"
},
"quantity": {
"type": [
"number",
"null"
]
},
"use_case": {
"type": "string"
},
"fx_source": {
"type": "string"
},
"use_case_id": {
"type": "string"
},
"available_units": {
"type": "array",
"items": {
"type": "string"
}
}
}
}{
"title": "Estimate cost",
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}compare_robot_vs_human — Robot or human? Compare the cost
Cost comparison of human labour (or a human service) against robot options (buy, lease, robots-as-a-service, robot service provider) for one of 22 jobs in one of 8 countries (US, DE, GB, JP, CN, IN, BR, MX). Uses the same model as whirrwork.com/tools/robot-vs-human/: every default input has a source or is flagged as an assumption (see input_sources). Returns monthly/annual cost, cost per unit, payback months, break-even utilisation, 5-year NPV vs the baseline, a verdict, non-cost factors, sensitivity ranking, and projections to 2035 with a crossover year range (robots-fast, base, robots-slow). Projections are modelled estimates, not facts: say so, and quote the range rather than one year. Examples: {"job":"warehouse-picking","country":"US"}; {"job":"commercial-floor-cleaning","country":"DE","inputs":{"volume":60000}}; {"job":"machine-tending","country":"US","region":"US-TX","include_projections":false}.
{
"type": "object",
"required": [
"job"
],
"properties": {
"job": {
"type": "string",
"examples": [
"commercial-floor-cleaning",
"warehouse-picking",
"wind-turbine-inspection"
],
"description": "Job slug. One of the 22 jobs in GET /api/v1/robot-vs-human/jobs."
},
"inputs": {
"type": "object",
"examples": [
{
"wage": 21.5,
"volume": 60000
}
],
"properties": {
"svc": {
"type": "number"
},
"days": {
"type": "number"
},
"edge": {
"type": "number"
},
"life": {
"type": "number"
},
"raas": {
"type": "number"
},
"rate": {
"type": "number"
},
"wage": {
"type": "number"
},
"hours": {
"type": "number"
},
"kwh_h": {
"type": "number"
},
"lease": {
"type": "number"
},
"ratio": {
"type": "number"
},
"burden": {
"type": "number"
},
"months": {
"type": "number"
},
"raas_h": {
"type": "number"
},
"uptime": {
"type": "number"
},
"volume": {
"type": "number"
},
"failure": {
"type": "number"
},
"horizon": {
"type": "number"
},
"sup_min": {
"type": "number"
},
"purchase": {
"type": "number"
},
"kwh_price": {
"type": "number"
},
"maint_pct": {
"type": "number"
},
"svc_robot": {
"type": "number"
},
"human_rate": {
"type": "number"
},
"robot_rate": {
"type": "number"
},
"svc_aerial": {
"type": "number"
},
"integration": {
"type": "number"
},
"wage_growth": {
"type": "number"
},
"fee_hw_share": {
"type": "number"
},
"human_equip_h": {
"type": "number"
},
"svc_labour_share": {
"type": "number"
},
"robot_svc_labour_share": {
"type": "number"
}
},
"description": "Optional overrides of default inputs, in the country currency. Fractions as 0-1 (uptime 0.85, rate 0.08).",
"additionalProperties": false
},
"region": {
"type": "string",
"examples": [
"US-CA"
],
"description": "Optional regional wage preset: US states US-CA, US-TX, US-NY, US-FL, US-IL, US-WA, US-PA, US-OH; China CN-E, CN-C, CN-W, CN-NE."
},
"country": {
"enum": [
"US",
"DE",
"GB",
"JP",
"CN",
"IN",
"BR",
"MX"
],
"type": "string",
"default": "US",
"description": "Country for wage, on-cost and currency defaults (sourced: BLS, ILOSTAT, MHLW, NBS, Eurostat)."
},
"baseline": {
"type": "string",
"description": "Which human option to compare against (e.g. \"human\" or \"service\"). Defaults to the job default."
},
"include_tornado": {
"type": "boolean",
"default": true,
"description": "Include the sensitivity (tornado) ranking of inputs by NPV swing."
},
"include_projections": {
"type": "boolean",
"default": true,
"description": "Include 2026-2035 projections for three scenarios and the crossover year range."
}
},
"additionalProperties": false
}{
"type": "object",
"required": [
"model_version",
"label",
"job",
"country",
"currency",
"options",
"verdict",
"input_sources"
],
"properties": {
"job": {
"type": "object",
"required": [
"slug",
"name",
"unit"
],
"properties": {
"name": {
"type": "string"
},
"slug": {
"type": "string"
},
"unit": {
"type": "string"
},
"period": {
"type": "string"
},
"human_label": {
"type": "string"
},
"robot_label": {
"type": "string"
}
}
},
"label": {
"type": "string",
"description": "Always \"Whirrwork modelled estimates, not facts\""
},
"inputs": {
"type": "object",
"description": "Resolved inputs actually used (defaults + overrides), in the country currency; fractions 0-1",
"additionalProperties": {
"type": [
"number",
"null"
]
}
},
"region": {
"type": [
"string",
"null"
]
},
"country": {
"type": "string"
},
"license": {
"type": "string"
},
"noncost": {
"type": "object",
"additionalProperties": {
"type": "string"
}
},
"options": {
"type": "array",
"items": {
"type": "object",
"required": [
"id",
"side",
"annual",
"per_unit"
],
"properties": {
"id": {
"type": "string"
},
"side": {
"enum": [
"human",
"robot"
],
"type": "string"
},
"label": {
"type": "string"
},
"annual": {
"type": [
"number",
"null"
]
},
"robots": {
"type": [
"integer",
"null"
]
},
"monthly": {
"type": [
"number",
"null"
]
},
"upfront": {
"type": [
"number",
"null"
]
},
"per_unit": {
"type": [
"number",
"null"
]
},
"utilisation": {
"type": [
"number",
"null"
]
},
"payback_months": {
"type": [
"number",
"null"
],
"description": "null = never pays back (or this is the baseline)"
},
"npv_vs_baseline": {
"type": [
"number",
"null"
]
},
"breakeven_utilisation": {
"type": [
"number",
"null"
],
"description": "Share of available hours a robot must work to break even; >1 = unreachable"
}
}
}
},
"verdict": {
"type": "object",
"required": [
"winner"
],
"properties": {
"notes": {
"type": "array",
"items": {
"type": "string"
}
},
"winner": {
"enum": [
"robot",
"human",
"toss-up",
"n/a"
],
"type": "string"
},
"saving_pct": {
"type": [
"number",
"null"
]
},
"robot_option": {
"type": [
"string",
"null"
]
},
"saving_annual": {
"type": [
"number",
"null"
]
}
}
},
"baseline": {
"type": [
"string",
"null"
]
},
"currency": {
"type": "string"
},
"crossover": {
"type": "object",
"properties": {
"base": {
"type": [
"integer",
"string",
"null"
]
},
"fast": {
"type": [
"integer",
"string",
"null"
]
},
"note": {
"type": "string"
},
"slow": {
"type": [
"integer",
"string",
"null"
]
}
}
},
"best_robot": {
"type": [
"string",
"null"
]
},
"wage_basis": {
"type": [
"string",
"null"
]
},
"projections": {
"type": "object",
"description": "Per scenario (slow, base, fast): yearly cost per unit 2026-2035, constant 2026 money",
"additionalProperties": {
"type": "array",
"items": {
"type": "object",
"required": [
"year"
],
"properties": {
"year": {
"type": "integer"
},
"ratio": {
"type": [
"number",
"null"
]
},
"robot_option": {
"type": [
"string",
"null"
]
},
"human_per_unit": {
"type": [
"number",
"null"
]
},
"robot_per_unit": {
"type": [
"number",
"null"
]
}
}
}
}
},
"sensitivity": {
"type": "object",
"properties": {
"npv": {
"type": [
"number",
"null"
]
},
"top": {
"type": "array",
"items": {
"type": "object",
"required": [
"input"
],
"properties": {
"low": {
"type": [
"number",
"null"
]
},
"high": {
"type": [
"number",
"null"
]
},
"input": {
"type": "string"
},
"npv_low": {
"type": [
"number",
"null"
]
},
"npv_high": {
"type": [
"number",
"null"
]
}
}
}
},
"option": {
"type": [
"string",
"null"
]
}
}
},
"input_sources": {
"type": "object",
"description": "Per input: status (sourced | derived | converted | assumption | user), source_id, source_url, note",
"additionalProperties": {
"type": "object",
"required": [
"status"
],
"properties": {
"note": {
"type": [
"string",
"null"
]
},
"status": {
"enum": [
"sourced",
"derived",
"converted",
"assumption",
"user"
],
"type": "string"
},
"source_id": {
"type": [
"string",
"null"
]
},
"source_url": {
"type": [
"string",
"null"
]
}
}
}
},
"model_version": {
"type": "string"
},
"calculator_url": {
"type": "string"
},
"methodology_url": {
"type": "string"
}
}
}{
"title": "Robot or human?",
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}robot_or_ladder — Robot or ladder? (the Ladder Test)
Does this job need a robot at all? Rule-based verdict from the Ladder Test (the same rules as whirrwork.com/tools/robot-or-ladder/): answer up to 6 questions yes / no / unsure and get ladder, robot, both or tossup, the reasons on each side with their points, what to find out first, and (with job) the sourced price and provider counts for that job. No numbers except our own counts; nothing is stored. Questions: ladder = could a competent person with a ladder do it in an afternoon?; risk = is it dangerous for a person (height, confined space, live wires)?; scale = is it big (many hectares, a whole facade, a warehouse)?; repeat = will it repeat often (weekly, daily)?; data = do you need measurements or records (maps, thermal, logs)?; hands = does it need hands-on fixing (repair, not just looking)? Examples: {"ladder":"yes","risk":"no","scale":"no","repeat":"no"}; {"ladder":"no","risk":"yes","scale":"yes","data":"yes","job":"roof-inspection-drone"}.
{
"type": "object",
"properties": {
"job": {
"type": "string",
"examples": [
"roof-inspection-drone"
],
"maxLength": 120,
"description": "Optional job (use case) id from search_use_cases, to add its sourced price and provider counts"
},
"data": {
"enum": [
"yes",
"no",
"unsure"
],
"type": "string"
},
"risk": {
"enum": [
"yes",
"no",
"unsure"
],
"type": "string"
},
"hands": {
"enum": [
"yes",
"no",
"unsure"
],
"type": "string"
},
"scale": {
"enum": [
"yes",
"no",
"unsure"
],
"type": "string"
},
"ladder": {
"enum": [
"yes",
"no",
"unsure"
],
"type": "string"
},
"repeat": {
"enum": [
"yes",
"no",
"unsure"
],
"type": "string"
},
"language": {
"enum": [
"en",
"es",
"pt-BR",
"fr",
"de",
"zh",
"zh-Hant",
"ja",
"ar",
"hi",
"ko",
"id",
"tr"
],
"type": "string",
"examples": [
"es",
"pt-BR",
"zh"
],
"description": "Language for use-case text (machine-translated; English is authoritative). Default en."
}
},
"additionalProperties": false
}{
"type": "object",
"required": [
"tool",
"verdict",
"reasons",
"url"
],
"properties": {
"of": {
"type": "integer"
},
"job": {
"type": [
"object",
"null"
],
"properties": {
"id": {
"type": "string"
},
"url": {
"type": "string"
},
"name": {
"type": "string"
},
"prices_url": {
"type": "string"
},
"robot_vs_human": {
"type": [
"string",
"null"
]
},
"sourced_prices": {
"type": "integer"
},
"listed_providers": {
"type": "integer"
}
}
},
"url": {
"type": "string"
},
"tool": {
"type": "string"
},
"guide": {
"type": "string"
},
"label": {
"type": "string",
"description": "Rule-based verdict, not a measurement or a cost estimate"
},
"rules": {
"type": [
"object",
"array",
"string"
]
},
"method": {
"type": "string"
},
"answers": {
"type": "object"
},
"reasons": {
"type": "array",
"items": {
"type": "object",
"properties": {
"text": {
"type": "string"
},
"answer": {
"type": "string"
},
"points": {
"type": "number"
},
"question": {
"type": "string"
},
"points_to": {
"type": "string"
}
}
}
},
"verdict": {
"enum": [
"ladder",
"robot",
"both",
"tossup",
"none"
],
"type": "string"
},
"version": {
"type": "string"
},
"answered": {
"type": "integer"
},
"buy_hint": {
"type": [
"string",
"null"
]
},
"find_out": {
"type": "array",
"items": {
"type": "object",
"properties": {
"text": {
"type": "string"
},
"question": {
"type": "string"
}
}
}
},
"headline": {
"type": "string"
},
"language": {
"type": "string"
},
"questions": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string"
},
"text": {
"type": "string"
},
"answers": {
"type": "array",
"items": {
"type": "string"
}
}
}
}
},
"explanation": {
"type": [
"string",
"null"
]
},
"robot_points": {
"type": "integer"
},
"person_points": {
"type": "integer"
}
}
}{
"title": "Robot or ladder?",
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}estimate_drone_spraying_cost — Drone spraying cost for a field
Cost of drone crop spraying for the buyer's field: every published per-acre, per-hectare, per-mu (China) and per-10-are (Japan) drone spraying rate in the dataset x area x passes, with the best-matching rate for the country (national, recent first), the same-country span, flags taken from the source (chemicals extra, minimum area, starting price, older than 12 months) and every rate's source_url and as_of. Same maths as whirrwork.com/tools/drone-spraying-cost/. Only unit conversion (1 ha = 2.4710538 acres = 15 mu = 10 x 10 a); currencies are NEVER converted. Not a quote and not a Whirrwork estimate: say so. If country_has_rates is false, say there is no published rate for that country rather than borrowing one. Examples: {"area":100,"unit":"acre","country":"US"}; {"area":40,"unit":"ha","passes":3,"country":"BR"}; {"area":250,"unit":"ha","country":"CN"}.
{
"type": "object",
"properties": {
"area": {
"type": "number",
"maximum": 10000000,
"examples": [
100
],
"description": "Field area in the chosen unit",
"exclusiveMinimum": 0
},
"unit": {
"enum": [
"acre",
"ha"
],
"type": "string",
"description": "Area unit (default: the unit of the best-matching rate)"
},
"passes": {
"type": "integer",
"maximum": 50,
"minimum": 1,
"description": "Number of spray passes (default 1)"
},
"country": {
"type": "string",
"pattern": "^[A-Za-z]{2}$",
"examples": [
"US",
"BR",
"CN"
],
"description": "Buyer country, ISO 3166-1 alpha-2"
},
"currency": {
"type": "string",
"pattern": "^[A-Za-z]{3}$",
"description": "Currency of own_rate (ISO 4217)"
},
"language": {
"enum": [
"en",
"es",
"pt-BR",
"fr",
"de",
"zh",
"zh-Hant",
"ja",
"ar",
"hi",
"ko",
"id",
"tr"
],
"type": "string",
"examples": [
"es",
"pt-BR",
"zh"
],
"description": "Language for use-case text (machine-translated; English is authoritative). Default en."
},
"own_rate": {
"type": "number",
"maximum": 10000000,
"minimum": 0,
"description": "A rate the buyer was quoted, per chosen unit, to compare"
},
"rate_index": {
"type": "integer",
"minimum": 0,
"description": "Use this published rate (index from rates[].index) as the headline instead of the automatic pick"
}
},
"additionalProperties": false
}{
"type": "object",
"required": [
"tool",
"rates",
"formula",
"url"
],
"properties": {
"job": {
"type": "object"
},
"url": {
"type": "string"
},
"area": {
"type": [
"number",
"null"
]
},
"tool": {
"type": "string"
},
"unit": {
"type": "string"
},
"input": {
"type": "object"
},
"label": {
"type": "string"
},
"rates": {
"type": "array",
"items": {
"type": "object",
"required": [
"index",
"published",
"source_url"
],
"properties": {
"as_of": {
"type": [
"string",
"null"
]
},
"flags": {
"type": "array",
"items": {
"type": "string"
}
},
"index": {
"type": "integer"
},
"region": {
"type": [
"string",
"null"
]
},
"country": {
"type": [
"string",
"null"
]
},
"provider": {
"type": [
"object",
"null"
]
},
"published": {
"type": "object",
"properties": {
"low": {
"type": [
"number",
"null"
]
},
"high": {
"type": [
"number",
"null"
]
},
"unit": {
"type": "string"
},
"currency": {
"type": "string"
}
}
},
"source_url": {
"type": "string"
},
"description": {
"type": "string"
},
"converted_unit": {
"type": "boolean"
},
"rate_per_your_unit": {
"type": "object"
},
"cost_for_your_field": {
"type": [
"object",
"null"
]
}
}
}
},
"method": {
"type": "string"
},
"passes": {
"type": "integer"
},
"formula": {
"type": "string"
},
"version": {
"type": "string"
},
"language": {
"type": "string"
},
"selected": {
"type": [
"object",
"null"
],
"description": "Best-matching published rate for the country (null when none applies)"
},
"your_rate": {
"type": [
"object",
"null"
]
},
"hectare_in_acres": {
"type": "number"
},
"country_has_rates": {
"type": "boolean"
},
"same_country_span": {
"type": [
"object",
"null"
]
},
"countries_with_rates": {
"type": "array",
"items": {
"type": "string"
}
},
"hourly_rates_not_converted": {
"type": "array",
"items": {
"type": "object"
}
}
}
}{
"title": "Drone spraying cost",
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}estimate_drone_show_cost — Drone light show cost
Cost of a drone light show of N drones: every published per-drone price x drones (best match for the country first, peak-date prices only when peak=true), plus the published whole shows closest in drone count (NEVER scaled to your size; implied per drone = show price / stated drones), the same-country span, a check of a quote the buyer received (per drone vs the published range in that currency) and too_few_receipts when fewer than 3 prices apply to the country. Every price has source_url and as_of. Same maths as whirrwork.com/tools/drone-show-cost/. Currencies are NEVER converted. Not a quote and not a Whirrwork estimate: say so. Examples: {"drones":200,"country":"US"}; {"drones":100,"country":"GB","quote":9000,"currency":"GBP"}; {"drones":500,"country":"CN"}.
{
"type": "object",
"properties": {
"peak": {
"type": "boolean",
"description": "Peak date (e.g. July 4th, New Year's Eve): include peak-date prices"
},
"quote": {
"type": "number",
"description": "Total price the buyer was quoted, to check against published prices",
"exclusiveMinimum": 0
},
"drones": {
"type": "integer",
"maximum": 20000,
"minimum": 1,
"examples": [
200
],
"description": "Number of drones in the show"
},
"country": {
"type": "string",
"pattern": "^[A-Za-z]{2}$",
"examples": [
"US",
"GB",
"AE",
"CN"
],
"description": "Buyer country, ISO 3166-1 alpha-2"
},
"currency": {
"type": "string",
"pattern": "^[A-Za-z]{3}$",
"description": "Currency of quote (ISO 4217)"
},
"language": {
"enum": [
"en",
"es",
"pt-BR",
"fr",
"de",
"zh",
"zh-Hant",
"ja",
"ar",
"hi",
"ko",
"id",
"tr"
],
"type": "string",
"examples": [
"es",
"pt-BR",
"zh"
],
"description": "Language for use-case text (machine-translated; English is authoritative). Default en."
}
},
"additionalProperties": false
}{
"type": "object",
"required": [
"tool",
"prices",
"formula",
"url"
],
"properties": {
"job": {
"type": "object"
},
"url": {
"type": "string"
},
"peak": {
"type": "boolean"
},
"tool": {
"type": "string"
},
"input": {
"type": "object"
},
"label": {
"type": "string"
},
"drones": {
"type": [
"integer",
"null"
]
},
"method": {
"type": "string"
},
"prices": {
"type": "array",
"items": {
"type": "object",
"required": [
"index",
"type",
"published",
"source_url"
],
"properties": {
"type": {
"enum": [
"per_drone",
"whole_show"
],
"type": "string"
},
"as_of": {
"type": [
"string",
"null"
]
},
"flags": {
"type": "array",
"items": {
"type": "string"
}
},
"index": {
"type": "integer"
},
"region": {
"type": [
"string",
"null"
]
},
"country": {
"type": [
"string",
"null"
]
},
"published": {
"type": "object",
"properties": {
"low": {
"type": [
"number",
"null"
]
},
"high": {
"type": [
"number",
"null"
]
},
"unit": {
"type": "string"
},
"currency": {
"type": "string"
}
}
},
"source_url": {
"type": "string"
},
"description": {
"type": "string"
},
"implied_per_drone": {
"type": [
"object",
"number",
"null"
]
},
"cost_for_your_show": {
"type": [
"object",
"null"
]
},
"applies_to_your_country": {
"type": "string"
}
}
}
},
"country": {
"type": [
"string",
"null"
]
},
"formula": {
"type": "string"
},
"version": {
"type": "string"
},
"language": {
"type": "string"
},
"selected": {
"type": [
"object",
"null"
],
"description": "Best-matching per-drone price applied to your drone count (null when none applies)"
},
"your_quote": {
"type": [
"object",
"null"
]
},
"too_few_receipts": {
"type": [
"boolean",
"null"
]
},
"same_country_span": {
"type": [
"object",
"null"
]
},
"countries_with_prices": {
"type": "array",
"items": {
"type": "string"
}
},
"nearest_published_shows": {
"type": "array",
"items": {
"type": "object"
}
},
"receipts_for_your_country": {
"type": [
"integer",
"null"
]
}
}
}{
"title": "Drone show cost",
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}buy_rent_or_hire — Buy, rent or hire a robot service?
Total cost of buying a robot vs renting it (lease / robots-as-a-service) vs hiring a service over a period, with break-even months and the cheapest option ("within_10_percent" = too close to call). Defaults come only from sourced price rows hand-tagged buy / rent / service for the job (each with source_url and as_of; pick another with buy_receipt / rent_receipt / service_receipt, or "none"); any number the buyer gives overrides the receipt. Running costs (upkeep, staff hours x wage, setup fee, resale) are the buyer's own and have no default. Same maths as whirrwork.com/tools/buy-rent-or-hire/. Without job, returns jobs_with_receipts. Not a quote, not a forecast. Examples: {"job":"commercial-floor-scrubbing","months":36}; {"job":"crop-spraying-drone","months":24,"qty":300}; {"job":"commercial-floor-scrubbing","months":60,"upkeep":150,"hours":20,"wage":18}.
{
"type": "object",
"properties": {
"buy": {
"type": "number",
"maximum": 1000000000,
"minimum": 0,
"description": "Purchase price (overrides the receipt)"
},
"end": {
"enum": [
"low",
"mid",
"high"
],
"type": "string",
"description": "Which end of each published range to use (default low)"
},
"job": {
"type": "string",
"examples": [
"commercial-floor-scrubbing"
],
"maxLength": 120,
"description": "Job (use case) id; omit to list jobs that have tagged receipts"
},
"qty": {
"type": "number",
"maximum": 10000000,
"minimum": 0,
"description": "Service amount per month in the service receipt's unit (hectares, sq ft, visits...)"
},
"rent": {
"type": "number",
"maximum": 100000000,
"minimum": 0,
"description": "Rent / RaaS per month (overrides the receipt)"
},
"wage": {
"type": "number",
"maximum": 100000,
"minimum": 0,
"description": "Wage per staff hour"
},
"hours": {
"type": "number",
"maximum": 744,
"minimum": 0,
"description": "Staff hours per month to run it (buy and rent)"
},
"setup": {
"type": "number",
"maximum": 1000000000,
"minimum": 0,
"description": "One-off setup fee when renting"
},
"months": {
"type": "integer",
"maximum": 120,
"minimum": 1,
"description": "Period in months (default 36)"
},
"resale": {
"type": "number",
"maximum": 1000000000,
"minimum": 0,
"description": "Resale value at the end when bought"
},
"upkeep": {
"type": "number",
"maximum": 100000000,
"minimum": 0,
"description": "Upkeep per month when bought"
},
"service": {
"type": "number",
"maximum": 100000000,
"minimum": 0,
"description": "Service price per unit (overrides the receipt)"
},
"currency": {
"type": "string",
"pattern": "^[A-Za-z]{3}$",
"description": "Currency of your own numbers (ISO 4217)"
},
"language": {
"enum": [
"en",
"es",
"pt-BR",
"fr",
"de",
"zh",
"zh-Hant",
"ja",
"ar",
"hi",
"ko",
"id",
"tr"
],
"type": "string",
"examples": [
"es",
"pt-BR",
"zh"
],
"description": "Language for use-case text (machine-translated; English is authoritative). Default en."
},
"buy_receipt": {
"type": [
"integer",
"string"
],
"description": "Receipt index from receipts_available, or \"none\" to leave this option out"
},
"rent_receipt": {
"type": [
"integer",
"string"
],
"description": "Receipt index from receipts_available, or \"none\" to leave this option out"
},
"service_receipt": {
"type": [
"integer",
"string"
],
"description": "Receipt index from receipts_available, or \"none\" to leave this option out"
}
},
"additionalProperties": false
}{
"type": "object",
"required": [
"tool",
"url",
"formula"
],
"properties": {
"job": {
"type": [
"object",
"null"
]
},
"url": {
"type": "string"
},
"tool": {
"type": "string"
},
"input": {
"type": "object"
},
"label": {
"type": "string"
},
"issues": {
"type": "array",
"items": {
"type": [
"object",
"string"
]
}
},
"method": {
"type": "string"
},
"months": {
"type": "integer"
},
"ranked": {
"type": "array",
"items": {
"type": [
"string",
"object"
]
}
},
"formula": {
"type": "string"
},
"options": {
"type": "object",
"description": "buy / rent / service: totals, per month, source (receipt | yours) and the receipt used"
},
"version": {
"type": "string"
},
"cheapest": {
"type": [
"string",
"null"
]
},
"currency": {
"type": [
"string",
"null"
]
},
"language": {
"type": "string"
},
"warnings": {
"type": "array",
"items": {
"type": "object",
"properties": {
"code": {
"type": "string"
},
"text": {
"type": "string"
}
}
}
},
"break_even_months": {
"type": [
"object",
"null"
]
},
"receipts_reviewed": {
"type": [
"string",
"object",
"null"
]
},
"within_10_percent": {
"type": [
"boolean",
"null"
]
},
"jobs_with_receipts": {
"type": "array",
"items": {
"type": "object"
}
},
"receipts_available": {
"type": [
"object",
"null"
]
}
}
}{
"title": "Buy, rent or hire?",
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}find_robots_for_job — Find robot types and models for a job
Which kinds of robot do a job (primary type first, then alternatives), with the commercial models we have catalogued for each type: maker-published key specs, list price where published, and the Whirrwork assessment (a score only when independent trials or tests exist; otherwise "Not enough evidence to rate"). Use search_use_cases first to get the job id. Example: {"job":"crop-spraying-drone"}
{
"type": "object",
"required": [
"job"
],
"properties": {
"job": {
"type": "string",
"examples": [
"crop-spraying-drone",
"commercial-floor-scrubbing",
"solar-farm-cleaning"
],
"maxLength": 120,
"minLength": 2,
"description": "Job (use case) id from search_use_cases"
}
},
"additionalProperties": false
}{
"type": "object",
"required": [
"job",
"types"
],
"properties": {
"job": {
"type": "object",
"required": [
"id",
"url"
],
"properties": {
"id": {
"type": "string"
},
"url": {
"type": "string"
},
"name": {
"type": "string"
}
}
},
"note": {
"type": "string"
},
"types": {
"type": "array",
"items": {
"type": "object",
"required": [
"id",
"name",
"url"
],
"properties": {
"id": {
"type": "string"
},
"url": {
"type": "string"
},
"name": {
"type": "string"
},
"role": {
"enum": [
"primary",
"alternative"
],
"type": "string"
},
"family": {
"type": "string"
},
"models": {
"type": "array",
"items": {
"type": "object",
"required": [
"id",
"name",
"maker",
"url",
"assessment"
],
"properties": {
"id": {
"type": "string"
},
"url": {
"type": "string"
},
"name": {
"type": "string"
},
"maker": {
"type": "string"
},
"status": {
"type": "string"
},
"summary": {
"type": "string"
},
"type_ids": {
"type": "array",
"items": {
"type": "string"
}
},
"key_specs": {
"type": "object",
"additionalProperties": {
"type": "object",
"properties": {
"unit": {
"type": [
"string",
"null"
]
},
"value": {
"type": [
"number",
"null"
]
},
"value_max": {
"type": [
"number",
"null"
]
}
}
}
},
"assessment": {
"type": "object",
"required": [
"rated",
"label",
"score"
],
"properties": {
"band": {
"type": [
"string",
"null"
]
},
"label": {
"type": "string",
"description": "\"Whirrwork assessment, not a lab test\" or \"Not enough evidence to rate\""
},
"rated": {
"type": "boolean"
},
"score": {
"type": [
"integer",
"null"
],
"description": "0-100; null when not rated"
},
"evidence_count": {
"type": "integer"
}
}
},
"list_price": {
"type": [
"object",
"null"
],
"properties": {
"unit": {
"type": "string"
},
"amount": {
"type": [
"number",
"null"
]
},
"checked": {
"type": "string"
},
"currency": {
"type": "string"
},
"source_url": {
"type": "string"
},
"amount_high": {
"type": [
"number",
"null"
]
},
"as_published": {
"type": "string"
}
},
"description": "Maker-published list price with source (not a quote)"
},
"provider_id": {
"type": [
"string",
"null"
]
},
"official_url": {
"type": "string"
}
}
}
},
"as_listed": {
"type": "string"
},
"job_count": {
"type": "integer"
},
"key_specs": {
"type": "array",
"items": {
"type": "object",
"properties": {
"key": {
"type": "string"
},
"label": {
"type": "string"
}
}
}
},
"description": {
"type": "string"
},
"family_name": {
"type": [
"string",
"null"
]
},
"model_count": {
"type": "integer"
}
}
}
},
"model_count": {
"type": "integer"
},
"methodology_url": {
"type": "string"
}
}
}{
"title": "Find robots for a job",
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}get_robot_model — Get a robot model
One commercial robot model: every maker-published spec with its source URL and the date we checked it (unknown specs are absent, never guessed), maker claims labelled as such, list price if published, independent evidence (trials, tests, certifications, documented deployments) with findings, the jobs its type does, and the Whirrwork assessment with its components. Quote specs with their source.
{
"type": "object",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"examples": [
"dji-agras-t50",
"boston-dynamics-spot"
],
"maxLength": 120,
"minLength": 2,
"description": "Model id from find_robots_for_job or /api/v1/robot-models"
}
},
"additionalProperties": false
}{
"type": "object",
"required": [
"id",
"name",
"specs",
"assessment",
"evidence"
],
"properties": {
"id": {
"type": "string"
},
"url": {
"type": "string"
},
"jobs": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string"
},
"url": {
"type": "string"
},
"name": {
"type": "string"
},
"role": {
"type": "string"
}
}
}
},
"name": {
"type": "string"
},
"note": {
"type": [
"string",
"null"
]
},
"maker": {
"type": "string"
},
"specs": {
"type": "array",
"items": {
"type": "object",
"required": [
"key",
"label",
"as_published",
"source_url",
"checked"
],
"properties": {
"key": {
"type": "string"
},
"unit": {
"type": [
"string",
"null"
]
},
"label": {
"type": "string"
},
"value": {
"type": [
"number",
"null"
]
},
"checked": {
"type": "string"
},
"value_max": {
"type": [
"number",
"null"
]
},
"source_url": {
"type": "string"
},
"maker_claim": {
"type": "boolean"
},
"as_published": {
"type": "string"
}
}
}
},
"types": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string"
},
"url": {
"type": "string"
},
"name": {
"type": "string"
}
}
}
},
"status": {
"type": "string"
},
"summary": {
"type": "string"
},
"evidence": {
"type": "array",
"items": {
"type": "object",
"required": [
"id",
"kind",
"title",
"url"
],
"properties": {
"id": {
"type": "string"
},
"url": {
"type": "string"
},
"date": {
"type": "string"
},
"kind": {
"type": "string"
},
"note": {
"type": [
"string",
"null"
]
},
"title": {
"type": "string"
},
"checked": {
"type": "string"
},
"finding": {
"type": "string"
},
"direction": {
"type": "string"
},
"publisher": {
"type": "string"
},
"applies_to": {
"type": "string"
},
"kind_label": {
"type": "string"
}
}
}
},
"spec_url": {
"type": [
"string",
"null"
]
},
"type_ids": {
"type": "array",
"items": {
"type": "string"
}
},
"assessment": {
"type": "object",
"required": [
"rated",
"label",
"score",
"components"
],
"properties": {
"band": {
"type": [
"string",
"null"
]
},
"label": {
"type": "string"
},
"rated": {
"type": "boolean"
},
"score": {
"type": [
"integer",
"null"
]
},
"reasons": {
"type": "array",
"items": {
"type": "string"
}
},
"components": {
"type": "object",
"description": "evidence (0-60), transparency (0-20), strength (0-20 or not scored), with their inputs"
},
"evidence_count": {
"type": "integer"
},
"methodology_url": {
"type": "string"
},
"performance_evidence_count": {
"type": "integer"
}
}
},
"list_price": {
"type": [
"object",
"null"
],
"properties": {
"unit": {
"type": "string"
},
"amount": {
"type": [
"number",
"null"
]
},
"checked": {
"type": "string"
},
"currency": {
"type": "string"
},
"source_url": {
"type": "string"
},
"amount_high": {
"type": [
"number",
"null"
]
},
"as_published": {
"type": "string"
}
},
"description": "Maker-published list price with source (not a quote)"
},
"specs_note": {
"type": "string"
},
"provider_id": {
"type": [
"string",
"null"
]
},
"maker_claims": {
"type": "array",
"items": {
"type": "object",
"properties": {
"text": {
"type": "string"
},
"label": {
"type": "string"
},
"checked": {
"type": "string"
},
"source_url": {
"type": "string"
}
}
}
},
"official_url": {
"type": "string"
}
}
}{
"title": "Get a robot model",
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}compare_robot_models — Compare robot models
Side-by-side specs of 2-4 models of the same robot type: one row per spec with each model's maker-published value and source (null = not published), plus each model's assessment. Models of different types are refused with an explanation. Example: {"ids":["tennant-x4-rovr","avidbots-neo-2"]}
{
"type": "object",
"required": [
"ids"
],
"properties": {
"ids": {
"type": "array",
"items": {
"type": "string"
},
"examples": [
[
"dji-agras-t50",
"dji-agras-t25"
]
],
"maxItems": 4,
"minItems": 2
}
},
"additionalProperties": false
}{
"type": "object",
"required": [
"type",
"models",
"rows"
],
"properties": {
"url": {
"type": "string"
},
"note": {
"type": "string"
},
"rows": {
"type": "array",
"items": {
"type": "object",
"required": [
"key",
"values"
],
"properties": {
"key": {
"type": "string"
},
"label": {
"type": "string"
},
"values": {
"type": "array",
"items": {
"type": [
"object",
"null"
],
"properties": {
"key": {
"type": "string"
},
"unit": {
"type": [
"string",
"null"
]
},
"label": {
"type": "string"
},
"value": {
"type": [
"number",
"null"
]
},
"checked": {
"type": "string"
},
"value_max": {
"type": [
"number",
"null"
]
},
"source_url": {
"type": "string"
},
"maker_claim": {
"type": "boolean"
},
"as_published": {
"type": "string"
}
}
}
},
"maker_claim": {
"type": "boolean"
}
}
}
},
"type": {
"type": "object",
"properties": {
"id": {
"type": "string"
},
"name": {
"type": "string"
}
}
},
"models": {
"type": "array",
"items": {
"type": "object",
"required": [
"id",
"name",
"maker",
"url",
"assessment"
],
"properties": {
"id": {
"type": "string"
},
"url": {
"type": "string"
},
"name": {
"type": "string"
},
"maker": {
"type": "string"
},
"status": {
"type": "string"
},
"summary": {
"type": "string"
},
"type_ids": {
"type": "array",
"items": {
"type": "string"
}
},
"key_specs": {
"type": "object",
"additionalProperties": {
"type": "object",
"properties": {
"unit": {
"type": [
"string",
"null"
]
},
"value": {
"type": [
"number",
"null"
]
},
"value_max": {
"type": [
"number",
"null"
]
}
}
}
},
"assessment": {
"type": "object",
"required": [
"rated",
"label",
"score"
],
"properties": {
"band": {
"type": [
"string",
"null"
]
},
"label": {
"type": "string",
"description": "\"Whirrwork assessment, not a lab test\" or \"Not enough evidence to rate\""
},
"rated": {
"type": "boolean"
},
"score": {
"type": [
"integer",
"null"
],
"description": "0-100; null when not rated"
},
"evidence_count": {
"type": "integer"
}
}
},
"list_price": {
"type": [
"object",
"null"
],
"properties": {
"unit": {
"type": "string"
},
"amount": {
"type": [
"number",
"null"
]
},
"checked": {
"type": "string"
},
"currency": {
"type": "string"
},
"source_url": {
"type": "string"
},
"amount_high": {
"type": [
"number",
"null"
]
},
"as_published": {
"type": "string"
}
},
"description": "Maker-published list price with source (not a quote)"
},
"provider_id": {
"type": [
"string",
"null"
]
},
"official_url": {
"type": "string"
}
}
}
}
}
}{
"title": "Compare robot models",
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}list_countries — Coverage by country
For each country: providers that list it as a service area, providers serving parts of it (with sub-regions), and providers headquartered there; plus the number of worldwide providers. Use to tell the buyer honestly how well their country is covered.
{
"type": "object",
"properties": {
"country": {
"type": "string",
"description": "Optional: just this country"
}
},
"additionalProperties": false
}{
"type": "object",
"required": [
"global_providers"
],
"properties": {
"url": {
"type": "string"
},
"code": {
"type": "string"
},
"name": {
"type": "string"
},
"countries": {
"type": "array",
"items": {
"type": "object",
"required": [
"code"
],
"properties": {
"code": {
"type": "string"
},
"name": {
"type": "string"
},
"sub_regions": {
"type": "array",
"items": {
"type": "object",
"properties": {
"slug": {
"type": "string"
},
"region": {
"type": "string"
},
"providers": {
"type": "integer"
},
"region_code": {
"type": [
"string",
"null"
]
}
}
}
},
"providers_hq": {
"type": "integer"
},
"providers_serving": {
"type": "integer"
},
"providers_serving_part": {
"type": "integer"
}
}
}
},
"sub_regions": {
"type": "array"
},
"providers_hq": {
"type": "integer"
},
"global_providers": {
"type": "integer"
},
"providers_serving": {
"type": "integer"
},
"providers_serving_part": {
"type": "integer"
}
},
"description": "Without country: { global_providers, countries[] }. With country: that country's counts + url."
}{
"title": "Coverage by country",
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}get_rfq_template — Get the RFQ template for a job
The exact fields to collect from the buyer before submit_rfq: core fields (required flags, formats) plus the job-specific checklist suppliers need to price it (as extra.{key}), regulatory notes, and a filled example. Ask the buyer for these, then call submit_rfq.
{
"type": "object",
"required": [
"use_case"
],
"properties": {
"language": {
"enum": [
"en",
"es",
"pt-BR",
"fr",
"de",
"zh",
"zh-Hant",
"ja",
"ar",
"hi",
"ko",
"id",
"tr"
],
"type": "string",
"examples": [
"es",
"pt-BR",
"zh"
],
"description": "Language for use-case text (machine-translated; English is authoritative). Default en."
},
"use_case": {
"type": "string",
"examples": [
"commercial-floor-scrubbing"
]
}
},
"additionalProperties": false
}{
"type": "object",
"required": [
"use_case_id",
"fields"
],
"properties": {
"notes": {
"type": "array",
"items": {
"type": "string"
}
},
"fields": {
"type": "array",
"items": {
"type": "object",
"required": [
"key"
],
"properties": {
"key": {
"type": "string"
},
"type": {
"type": "string"
},
"value": {
"type": "string"
},
"required": {
"type": "boolean"
},
"description": {
"type": "string"
}
}
}
},
"submit": {
"type": "object"
},
"example": {
"type": "object"
},
"use_case": {
"type": "string"
},
"buyer_tips": {
"type": "array",
"items": {
"type": "string"
}
},
"use_case_id": {
"type": "string"
},
"regulatory_notes": {
"type": [
"string",
"null"
]
},
"engagement_models": {
"type": "array",
"items": {
"type": "string"
}
},
"supplier_checklist": {
"type": "array",
"items": {
"type": "string"
}
},
"supplier_checklist_localized": {
"type": "array",
"items": {
"type": "string"
}
}
}
}{
"title": "Get RFQ template",
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}submit_rfq — Submit a request for quotes
Submit a request for quotes for a real buyer who explicitly agreed to be contacted by matched suppliers (consent=true). Stored, auto-matched to providers by job + country, and reviewed by a human before anything is forwarded; nothing is emailed automatically. Returns id, status, matched provider ids, and a private status_url/access key for get_rfq_status. Use test=true for testing.
{
"type": "object",
"required": [
"job",
"country",
"contact_email",
"consent"
],
"properties": {
"job": {
"type": "string",
"maxLength": 300,
"description": "One sentence: what, where, how big"
},
"test": {
"type": "boolean",
"description": "Mark as a test (excluded from stats, deleted)"
},
"extra": {
"type": "object",
"description": "Answers to the job checklist, keyed as in get_rfq_template",
"additionalProperties": {
"type": "string"
}
},
"consent": {
"type": "boolean",
"const": true,
"description": "Must be true: the buyer agreed to share the request (incl. email) with matched suppliers"
},
"country": {
"type": "string",
"examples": [
"AE",
"BR",
"CA",
"Germany"
],
"description": "Buyer country: ISO 3166-1 alpha-2 (\"AE\") or English name (\"United Arab Emirates\")."
},
"details": {
"type": "string",
"maxLength": 5000
},
"date_end": {
"type": "string",
"format": "date"
},
"location": {
"type": "string",
"description": "City / site"
},
"agent_name": {
"type": "string",
"description": "Your agent/product name"
},
"budget_max": {
"type": "number"
},
"budget_min": {
"type": "number"
},
"date_start": {
"type": "string",
"format": "date"
},
"use_case_id": {
"type": "string"
},
"contact_name": {
"type": "string"
},
"contact_email": {
"type": "string",
"format": "email"
},
"contact_phone": {
"type": "string",
"description": "Optional phone/WhatsApp/WeChat, international format"
},
"date_flexible": {
"type": "boolean"
},
"provider_hint": {
"type": "string",
"description": "Optional provider id the buyer prefers"
},
"budget_currency": {
"type": "string",
"description": "ISO 4217"
},
"contact_company": {
"type": "string"
}
},
"additionalProperties": false
}{
"type": "object",
"required": [
"id",
"status"
],
"properties": {
"id": {
"type": "string"
},
"status": {
"enum": [
"received",
"matched",
"sent_to_suppliers",
"quoted",
"closed"
],
"type": "string"
},
"is_test": {
"type": "boolean"
},
"message": {
"type": "string"
},
"access_key": {
"type": "string"
},
"status_url": {
"type": "string"
},
"matched_provider_ids": {
"type": "array",
"items": {
"type": "string"
}
}
}
}{
"title": "Submit RFQ",
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": false,
"destructiveHint": false
}get_rfq_status — Check an RFQ
Status of a submitted RFQ (received → matched → sent_to_suppliers → quoted → closed) with its status history. Needs the id and the access key returned by submit_rfq (the key= part of status_url).
{
"type": "object",
"required": [
"id",
"key"
],
"properties": {
"id": {
"type": "string",
"examples": [
"RFQ-261025-ABCDE"
]
},
"key": {
"type": "string"
}
},
"additionalProperties": false
}{
"type": "object",
"required": [
"id",
"status"
],
"properties": {
"id": {
"type": "string"
},
"status": {
"enum": [
"received",
"matched",
"sent_to_suppliers",
"quoted",
"closed"
],
"type": "string"
},
"country": {
"type": [
"string",
"null"
]
},
"created_at": {
"type": "string"
},
"updated_at": {
"type": [
"string",
"null"
]
},
"use_case_id": {
"type": [
"string",
"null"
]
},
"status_history": {
"type": "array",
"items": {
"type": "object",
"properties": {
"at": {
"type": "string"
},
"note": {
"type": [
"string",
"null"
]
},
"to_status": {
"type": "string"
},
"from_status": {
"type": [
"string",
"null"
]
}
}
}
},
"matched_provider_count": {
"type": "integer"
}
}
}{
"title": "Check RFQ status",
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}search_stats — Search citable robot statistics
Search Whirrwork Research: 100+ citable statistics on robot adoption, industrial and service robots, humanoids, drones, agriculture, cleaning, warehouses, labour shortages, wages, prices and funding, plus figures from Whirrwork's own dataset. Each result has the exact figure with unit and scope, the primary source (publisher, title, date, URL, Wayback archive), access and last-verified dates, a confidence level (high/medium/low), source_type (primary/secondary/whirrwork) and a permanent URL. Quote figures with their source and date; prefer high-confidence primary sources. Call get_stat for the verbatim quote, caveats and ready-made APA/Chicago/MLA/BibTeX citations. Examples: "humanoid robots sold 2025", "robot density Korea", "drone spraying price per acre", "robotics funding", topic="labour".
{
"type": "object",
"properties": {
"limit": {
"type": "integer",
"default": 10,
"maximum": 50,
"minimum": 1
},
"query": {
"type": "string",
"examples": [
"industrial robot installations China",
"humanoid price",
"labour shortage Japan"
],
"description": "Keywords (English). Omit to list by topic."
},
"topic": {
"enum": [
"adoption",
"service",
"humanoids",
"drones",
"agriculture",
"cleaning",
"warehouse",
"construction",
"labour",
"prices",
"funding",
"regulation",
"whirrwork"
],
"type": "string",
"description": "Optional topic filter"
},
"confidence": {
"enum": [
"high",
"medium",
"low"
],
"type": "string"
},
"source_type": {
"enum": [
"primary",
"secondary",
"whirrwork"
],
"type": "string"
}
},
"additionalProperties": false
}{
"type": "object",
"required": [
"count",
"stats"
],
"properties": {
"note": {
"type": "string"
},
"count": {
"type": "integer"
},
"query": {
"type": [
"string",
"null"
]
},
"stats": {
"type": "array",
"items": {
"type": "object",
"required": [
"slug",
"url",
"claim",
"figure",
"confidence",
"source"
],
"properties": {
"url": {
"type": "string",
"description": "Permanent Whirrwork page for this statistic"
},
"slug": {
"type": "string"
},
"claim": {
"type": "string",
"description": "One-sentence claim (English)"
},
"quote": {
"type": [
"object",
"null"
],
"properties": {
"lang": {
"type": "string"
},
"text": {
"type": "string"
}
}
},
"scope": {
"type": "object",
"properties": {
"period": {
"type": "string"
},
"geography": {
"type": "string"
}
}
},
"stale": {
"type": "boolean",
"description": "true = not re-verified for more than 180 days"
},
"topic": {
"type": "string"
},
"figure": {
"type": "object",
"required": [
"display"
],
"properties": {
"unit": {
"type": "string"
},
"value": {
"type": [
"number",
"null"
]
},
"display": {
"type": "string"
}
}
},
"source": {
"type": "object",
"required": [
"type",
"name",
"title",
"url"
],
"properties": {
"url": {
"type": "string"
},
"kind": {
"type": "string"
},
"name": {
"type": "string"
},
"type": {
"enum": [
"primary",
"secondary",
"whirrwork"
],
"type": "string"
},
"title": {
"type": "string"
},
"date_note": {
"type": [
"string",
"null"
]
},
"published": {
"type": [
"string",
"null"
],
"description": "Publication date stated by the source (null = not stated; see date_note)"
},
"publisher": {
"type": [
"string",
"null"
]
},
"archive_url": {
"type": [
"string",
"null"
],
"description": "Wayback Machine copy"
},
"archived_at": {
"type": [
"string",
"null"
]
},
"primary_note": {
"type": [
"string",
"null"
]
}
}
},
"caveats": {
"type": "array",
"items": {
"type": "string"
}
},
"license": {
"type": "string"
},
"measure": {
"type": "string",
"description": "How the figure was produced: official statistic, company claim, list price, survey, estimate, forecast..."
},
"release": {
"type": [
"string",
"null"
]
},
"accessed": {
"type": "string"
},
"citations": {
"type": "object",
"properties": {
"apa": {
"type": "string"
},
"mla": {
"type": "string"
},
"bibtex": {
"type": "string"
},
"chicago": {
"type": "string"
},
"source_apa": {
"type": "string"
}
}
},
"confidence": {
"enum": [
"high",
"medium",
"low"
],
"type": "string"
},
"link_check": {
"type": [
"object",
"null"
]
},
"quote_note": {
"type": [
"string",
"null"
]
},
"report_url": {
"type": [
"string",
"null"
]
},
"attribution": {
"type": "string"
},
"source_type": {
"enum": [
"primary",
"secondary",
"whirrwork"
],
"type": "string"
},
"verification": {
"type": [
"string",
"null"
]
},
"last_verified": {
"type": "string"
}
}
}
},
"topic": {
"type": [
"string",
"null"
]
},
"total": {
"type": "integer"
},
"topics": {
"type": "array",
"items": {
"type": "string"
}
},
"license": {
"type": "string"
},
"release": {
"type": "string"
},
"attribution": {
"type": "string"
},
"standards_url": {
"type": "string"
}
}
}{
"title": "Search citable robot statistics",
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}get_stat — Get one statistic with citations
One Whirrwork Research statistic by slug: claim, figure, scope, measure type, primary source with archive link, publication/access/last-verified dates, verbatim source passage (when licensing allows), confidence, caveats, and citations in APA, Chicago, MLA and BibTeX (plus an APA citation of the original source). Licensed CC BY 4.0: attribute "Whirrwork (https://whirrwork.com), CC BY 4.0" and the original source.
{
"type": "object",
"required": [
"slug"
],
"properties": {
"slug": {
"type": "string",
"examples": [
"industrial-robot-installations-world-2025",
"robot-density-korea-2024"
]
}
},
"additionalProperties": false
}{
"type": "object",
"required": [
"slug",
"url",
"claim",
"figure",
"confidence",
"source"
],
"properties": {
"url": {
"type": "string",
"description": "Permanent Whirrwork page for this statistic"
},
"slug": {
"type": "string"
},
"claim": {
"type": "string",
"description": "One-sentence claim (English)"
},
"quote": {
"type": [
"object",
"null"
],
"properties": {
"lang": {
"type": "string"
},
"text": {
"type": "string"
}
}
},
"scope": {
"type": "object",
"properties": {
"period": {
"type": "string"
},
"geography": {
"type": "string"
}
}
},
"stale": {
"type": "boolean",
"description": "true = not re-verified for more than 180 days"
},
"topic": {
"type": "string"
},
"figure": {
"type": "object",
"required": [
"display"
],
"properties": {
"unit": {
"type": "string"
},
"value": {
"type": [
"number",
"null"
]
},
"display": {
"type": "string"
}
}
},
"source": {
"type": "object",
"required": [
"type",
"name",
"title",
"url"
],
"properties": {
"url": {
"type": "string"
},
"kind": {
"type": "string"
},
"name": {
"type": "string"
},
"type": {
"enum": [
"primary",
"secondary",
"whirrwork"
],
"type": "string"
},
"title": {
"type": "string"
},
"date_note": {
"type": [
"string",
"null"
]
},
"published": {
"type": [
"string",
"null"
],
"description": "Publication date stated by the source (null = not stated; see date_note)"
},
"publisher": {
"type": [
"string",
"null"
]
},
"archive_url": {
"type": [
"string",
"null"
],
"description": "Wayback Machine copy"
},
"archived_at": {
"type": [
"string",
"null"
]
},
"primary_note": {
"type": [
"string",
"null"
]
}
}
},
"caveats": {
"type": "array",
"items": {
"type": "string"
}
},
"license": {
"type": "string"
},
"measure": {
"type": "string",
"description": "How the figure was produced: official statistic, company claim, list price, survey, estimate, forecast..."
},
"release": {
"type": [
"string",
"null"
]
},
"accessed": {
"type": "string"
},
"citations": {
"type": "object",
"properties": {
"apa": {
"type": "string"
},
"mla": {
"type": "string"
},
"bibtex": {
"type": "string"
},
"chicago": {
"type": "string"
},
"source_apa": {
"type": "string"
}
}
},
"confidence": {
"enum": [
"high",
"medium",
"low"
],
"type": "string"
},
"link_check": {
"type": [
"object",
"null"
]
},
"quote_note": {
"type": [
"string",
"null"
]
},
"report_url": {
"type": [
"string",
"null"
]
},
"attribution": {
"type": "string"
},
"source_type": {
"enum": [
"primary",
"secondary",
"whirrwork"
],
"type": "string"
},
"verification": {
"type": [
"string",
"null"
]
},
"last_verified": {
"type": "string"
}
}
}{
"title": "Get one statistic with citations",
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}Prompts
3 advertised
find_and_quote — Find suppliers and request quotes
End-to-end: identify the job, check prices, shortlist providers for a location, collect RFQ fields, submit with consent.
- job
- What the buyer needs (required)
- location
- Country / city (required)
evaluate_robot_vs_human — Robot or not?
Honest assessment of whether a robot makes sense for this job, using buyer tips and prices.
- job
- No description (required)
price_check — Is this quote reasonable?
Compare a quote the buyer received against sourced benchmarks and price history.
- job
- No description (required)
- quote
- e.g. "BRL 120 per hectare" (required)
- country
- No description
Resources
4 advertised
categories — Categories and use-case ids
All categories with their use case ids and names
whirrwork://categoriescountries — Coverage by country
whirrwork://countrieslicense — Data license (CC BY 4.0)
whirrwork://licenseagent-guide — How to use Whirrwork as an agent
whirrwork://guide/agentsuse-case — Robot job
Full use case JSON (prices, checklist, providers)
whirrwork://use-case/{id}provider — Provider
Provider JSON
whirrwork://provider/{id}price-history — Price history for a job
Append-only observations + series
whirrwork://price-history/{use_case_id}30-day availability
Aggregated from read-only remote checks; this is not a tool-execution or security guarantee.
- Successful checks
- 1 of 1 (100%)
- Average latency
- 366 ms
- 95th percentile latency
- 366 ms
Maintenance history
Public check and source-refresh events. Editorial and ownership records remain private.
- · probe · passed · 366 ms · metadata changed · 23 tool(s), 4 resource(s), 3 resource template(s), 3 prompt(s)
Connect from your client
Each snippet registers the same endpoint; pick the client you use.
Claude Code
claude mcp add --transport http whirrwork-mcp https://whirrwork.com/mcpCodex
codex mcp add whirrwork-mcp --url https://whirrwork.com/mcpCursor
{
"mcpServers": {
"whirrwork-mcp": {
"url": "https://whirrwork.com/mcp"
}
}
}Cline
{
"mcpServers": {
"whirrwork-mcp": {
"type": "streamableHttp",
"url": "https://whirrwork.com/mcp",
"disabled": false
}
}
}VS Code
{
"servers": {
"whirrwork-mcp": {
"type": "http",
"url": "https://whirrwork.com/mcp"
}
}
}Gemini CLI
gemini mcp add --transport http whirrwork-mcp https://whirrwork.com/mcpClaude Desktop
{
"mcpServers": {
"whirrwork-mcp": {
"url": "https://whirrwork.com/mcp"
}
}
}Windsurf
{
"mcpServers": {
"whirrwork-mcp": {
"serverUrl": "https://whirrwork.com/mcp"
}
}
}Let your agent find its tools
Find servers like Whirrwork MCP from your agent. Add Koskamo once to search the index for endpoints, access requirements, and client setup. Public discovery needs no key.
Other data and analytics servers
Do you run Whirrwork MCP?
Prove ownership with a DNS record, a well-known file, or your Official MCP Registry entry, and your edits publish immediately. Proofs are re-checked weekly; admins can still hide or remove a listing.