MCP Server

AnyAPI

io.github.getanyapi-com/anyapi
Data & Analytics Developer Tools Public & reachable MCP 2025-11-25

What this MCP does

Provides a catalog and execution layer for scraping and data APIs, including schema inspection, pricing quotes, durable requests, and cached results.

get_api
Get API details
Get the full definition of one API by SKU, including its normalized input/output JSON schemas, per-request and per-1,000-request USD pricing on every lane, and nullable trailing-30-day latency p50/p95/p99 with the successful sample count. Inspect latency before choosing a client or MCP tool timeout; p99 is an observation, not a maximum. Entries with heavy:true return large responses - plan to pass fields/max_items/summary to run_api.
Read only
Input schema
{'type': 'object', 'required': ['sku_id', 'context'], 'properties': {'sku_id': {'type': 'string', 'description': 'the API SKU slug to describe'}, 'context': {'type': 'string', 'description': 'Explain why you are calling this tool and how it fits into the user\'s overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person (\'I\', \'we\', \'you\') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): "Searching across the organization\'s repositories to find all open issues related to performance complaints and latency issues for team prioritization."'}}}
Output schema
{'type': 'object', 'required': ['scraper'], 'properties': {'scraper': {'type': 'object', 'required': ['id', 'slug', 'category', 'name', 'method', 'path', 'provider', 'execution', 'pricing', 'failover', 'description', 'lanes', 'latency', 'tryEligible'], 'properties': {'id': {'type': 'string'}, 'name': {'type': 'string'}, 'path': {'type': 'string'}, 'slug': {'type': 'string'}, 'heavy': {'type': 'boolean'}, 'lanes': {'type': ['null', 'array'], 'items': {'type': 'object', 'required': ['pricing', 'source'], 'properties': {'fields': {'type': ['null', 'array'], 'items': {'type': 'string'}}, 'health': {'type': ['null', 'object'], 'required': ['window', 'uptimePct', 'latencyP50Ms', 'uptimeSample', 'latencySample', 'requests', 'servedRequests'], 'properties': {'window': {'type': 'string'}, 'requests': {'type': 'integer'}, 'uptimePct': {'type': 'number'}, 'latencyP50Ms': {'type': 'integer'}, 'uptimeSample': {'type': 'integer'}, 'latencySample': {'type': 'integer'}, 'servedRequests': {'type': 'integer'}}, 'additionalProperties': False}, 'source': {'type': 'object', 'required': ['id', 'name', 'kind', 'artworkKey'], 'properties': {'id': {'type': 'string'}, 'kind': {'type': 'string'}, 'name': {'type': 'string'}, 'artworkKey': {'type': 'string'}}, 'additionalProperties': False}, 'pricing': {'type': 'object', 'required': ['model', 'unit', 'maxUsd', 'maxPer1kUsd'], 'properties': {'unit': {'type': 'string'}, 'model': {'type': 'string'}, 'addons': {'type': ['null', 'array'], 'items': {'type': 'object', 'required': ['id', 'label', 'field', 'usd'], 'properties': {'id': {'type': 'string'}, 'usd': {'type': 'number'}, 'field': {'type': 'string'}, 'label': {'type': 'string'}}, 'additionalProperties': False}}, 'maxUsd': {'type': 'number'}, 'baseUsd': {'type': ['null', 'number']}, 'perUnitUsd': {'type': ['null', 'number']}, 'maxPer1kUsd': {'type': 'number'}}, 'additionalProperties': False}}, 'additionalProperties': False}}, 'method': {'type': 'string'}, 'latency': {'type': ['null', 'object'], 'required': ['window', 'p50Ms', 'p95Ms', 'p99Ms', 'sample', 'basis'], 'properties': {'basis': {'type': 'string'}, 'p50Ms': {'type': 'integer'}, 'p95Ms': {'type': 'integer'}, 'p99Ms': {'type': 'integer'}, 'sample': {'type': 'integer'}, 'window': {'type': 'string'}}, 'additionalProperties': False}, 'pricing': {'type': 'object', 'required': ['from', 'failoverMaxUsd', 'failoverMaxPer1kUsd'], 'properties': {'from': {'type': 'object', 'required': ['model', 'unit', 'maxUsd', 'maxPer1kUsd'], 'properties': {'unit': {'type': 'string'}, 'model': {'type': 'string'}, 'addons': {'type': ['null', 'array'], 'items': {'type': 'object', 'required': ['id', 'label', 'field', 'usd'], 'properties': {'id': {'type': 'string'}, 'usd': {'type': 'number'}, 'field': {'type': 'string'}, 'label': {'type': 'string'}}, 'additionalProperties': False}}, 'maxUsd': {'type': 'number'}, 'baseUsd': {'type': ['null', 'number']}, 'perUnitUsd': {'type': ['null', 'number']}, 'maxPer1kUsd': {'type': 'number'}}, 'additionalProperties': False}, 'failoverMaxUsd': {'type': 'number'}, 'failoverMaxPer1kUsd': {'type': 'number'}}, 'additionalProperties': False}, 'category': {'type': 'string'}, 'failover': {'type': 'boolean'}, 'provider': {'type': 'string'}, 'execution': {'type': 'object', 'required': ['mode'], 'properties': {'mode': {'type': 'string'}}, 'additionalProperties': False}, 'description': {'type': 'string'}, 'inputSchema': True, 'tryEligible': {'type': 'boolean'}, 'tryMaxItems': {'type': ['null', 'integer']}, 'outputSchema': True, 'excludesCallerDelay': {'type': 'boolean'}}, 'description': 'the API definition with input/output schemas', 'additionalProperties': False}}, 'additionalProperties': False}
get_balance
Check wallet balance
Get the remaining wallet balance (in USD) for the AnyAPI key supplied as a Bearer token. Requires a valid AnyAPI key.
Read only
Input schema
{'type': 'object', 'required': ['context'], 'properties': {'context': {'type': 'string', 'description': 'Explain why you are calling this tool and how it fits into the user\'s overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person (\'I\', \'we\', \'you\') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): "Searching across the organization\'s repositories to find all open issues related to performance complaints and latency issues for team prioritization."'}}}
Output schema
{'type': 'object', 'required': ['balanceUsd'], 'properties': {'balanceUsd': {'type': 'number', 'description': 'remaining wallet balance for this API key, in USD'}}, 'additionalProperties': False}
get_request
Check a request
Inspect or resume a durable AnyAPI request returned by run_api. This reads AnyAPI's stored state and never repeats the paid provider dispatch. Poll again after retryAfterSeconds while status is queued or running.
Read only
Input schema
{'type': 'object', 'required': ['request_id', 'context'], 'properties': {'context': {'type': 'string', 'description': 'Explain why you are calling this tool and how it fits into the user\'s overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person (\'I\', \'we\', \'you\') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): "Searching across the organization\'s repositories to find all open issues related to performance complaints and latency issues for team prioritization."'}, 'request_id': {'type': 'string', 'description': 'durable request identifier returned by run_api'}}}
Output schema
{'type': 'object', 'required': ['output', 'provider', 'costUsd', 'items', 'replayed'], 'properties': {'hint': {'type': 'string', 'description': 'optional nudge. \'large_result:\' suggests fields/max_items/summary to keep future responses out of your context. \'paging_unavailable:\' means this result came from a source that cannot return a nextCursor, so it may be INCOMPLETE and you cannot page further - re-run with requireFields ["nextCursor"] (may cost more per request) if you need the full list'}, 'error': {'type': ['null', 'object'], 'required': ['code'], 'properties': {'code': {'type': 'string', 'description': 'safe AnyAPI error code'}}, 'description': 'safe AnyAPI failure code when durable work failed', 'additionalProperties': False}, 'items': {'type': 'integer', 'description': 'number of result rows returned. For per-result SKUs the per-item cost is charged against this; for input-priced SKUs (perItemUnit != result) the charge is per submitted input, independent of this count'}, 'output': {'description': 'normalized output payload'}, 'source': {'type': ['null', 'object'], 'required': ['id', 'name', 'kind', 'artworkKey'], 'properties': {'id': {'type': 'string'}, 'kind': {'type': 'string'}, 'name': {'type': 'string'}, 'artworkKey': {'type': 'string'}}, 'description': "the source that served this run: pass its id back in 'source' to prefer it again, or in 'ignoreSources' to avoid it. Absent when no source identity applies", 'additionalProperties': False}, 'status': {'type': 'string', 'description': 'durable request status: queued, running, succeeded, failed, or expired'}, 'costUsd': {'type': 'number', 'description': 'amount charged to the wallet in USD'}, 'jqError': {'type': 'string', 'description': 'present only when a jq expression failed; output then holds the full unshaped result and this explains why the reshape did not apply'}, 'provider': {'type': 'string', 'description': 'the provider serving the request (AnyAPI)'}, 'replayed': {'type': 'boolean', 'description': 'true when this response replays an identical earlier call (same API, same input) from the last few minutes instead of running again: nothing new was executed and costUsd restates the original charge, it was NOT charged a second time'}, 'resultId': {'type': 'string', 'description': 'opaque handle to the full result, cached ~15 min; pass it to read_result to dig deeper for free (no re-run, no charge). Absent when the result was too large to cache'}, 'requestId': {'type': 'string', 'description': 'durable request identifier; pass it to get_request to resume without repeating the paid POST'}, 'nextAction': {'type': ['null', 'object'], 'required': ['tool', 'requestId', 'retryAfterSeconds'], 'properties': {'tool': {'type': 'string', 'description': 'MCP tool to call next'}, 'requestId': {'type': 'string', 'description': 'request_id argument for the next tool call'}, 'retryAfterSeconds': {'type': 'integer', 'description': 'minimum delay before polling again'}}, 'description': 'machine-actionable resume instruction present while durable work is pending', 'additionalProperties': False}, 'serviceOutcome': {'type': 'string', 'description': 'end-to-end AnyAPI service outcome when known'}, 'settlementState': {'type': 'string', 'description': 'payment settlement state when known; independent of durable request status'}}, 'additionalProperties': False}
list_apis
Browse APIs
Browse available AnyAPI APIs as lightweight summaries (id, name, category, USD pricing) - no descriptions or schemas, so it stays cheap even across the whole catalog. Each pricing offer carries both `maxUsd` (billed per request) and `maxPer1kUsd` (the same price per 1,000 requests); quote the per-1k figure to a person. Optionally filter by category. Use search_apis for every ranked query, or get_api for one API's full schemas.
Read only
Input schema
{'type': 'object', 'required': ['context'], 'properties': {'context': {'type': 'string', 'description': 'Explain why you are calling this tool and how it fits into the user\'s overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person (\'I\', \'we\', \'you\') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): "Searching across the organization\'s repositories to find all open issues related to performance complaints and latency issues for team prioritization."'}, 'category': {'type': 'string', 'description': 'optional category slug to filter by'}}}
Output schema
{'type': 'object', 'required': ['scrapers'], 'properties': {'scrapers': {'type': ['null', 'array'], 'items': {'type': 'object', 'required': ['id', 'slug', 'category', 'name', 'method', 'path', 'provider', 'execution', 'pricing', 'failover'], 'properties': {'id': {'type': 'string'}, 'name': {'type': 'string'}, 'path': {'type': 'string'}, 'slug': {'type': 'string'}, 'heavy': {'type': 'boolean'}, 'method': {'type': 'string'}, 'pricing': {'type': 'object', 'required': ['from', 'failoverMaxUsd', 'failoverMaxPer1kUsd'], 'properties': {'from': {'type': 'object', 'required': ['model', 'unit', 'maxUsd', 'maxPer1kUsd'], 'properties': {'unit': {'type': 'string'}, 'model': {'type': 'string'}, 'addons': {'type': ['null', 'array'], 'items': {'type': 'object', 'required': ['id', 'label', 'field', 'usd'], 'properties': {'id': {'type': 'string'}, 'usd': {'type': 'number'}, 'field': {'type': 'string'}, 'label': {'type': 'string'}}, 'additionalProperties': False}}, 'maxUsd': {'type': 'number'}, 'baseUsd': {'type': ['null', 'number']}, 'perUnitUsd': {'type': ['null', 'number']}, 'maxPer1kUsd': {'type': 'number'}}, 'additionalProperties': False}, 'failoverMaxUsd': {'type': 'number'}, 'failoverMaxPer1kUsd': {'type': 'number'}}, 'additionalProperties': False}, 'category': {'type': 'string'}, 'failover': {'type': 'boolean'}, 'provider': {'type': 'string'}, 'execution': {'type': 'object', 'required': ['mode'], 'properties': {'mode': {'type': 'string'}}, 'additionalProperties': False}, 'excludesCallerDelay': {'type': 'boolean'}}, 'additionalProperties': False}, 'description': 'matching APIs (lightweight summaries: no description or schemas)'}}, 'additionalProperties': False}
quote_api
Quote a price
Get the exact price of a run_api call BEFORE running it - free, no key required, nothing is charged or executed. Pass the same sku_id and input you would give run_api: the quote resolves pricing exactly as the run will, and also validates your input against the API schema so you catch invalid_input for free. Returns maxCostUsd (the ceiling reserved), minCostUsd (the likely charge), and the base/per-item breakdown explaining why they differ. These are amounts this one call is charged, not catalog comparison rates: report them as-is and never scale them to 1,000 requests.
Read only
Input schema
{'type': 'object', 'required': ['sku_id', 'input', 'context'], 'properties': {'input': {'type': 'object', 'description': 'the exact input payload you plan to pass to run_api; the quote resolves pricing the same way the run will', 'additionalProperties': True}, 'sku_id': {'type': 'string', 'description': 'the API SKU slug to price'}, 'context': {'type': 'string', 'description': 'Explain why you are calling this tool and how it fits into the user\'s overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person (\'I\', \'we\', \'you\') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): "Searching across the organization\'s repositories to find all open issues related to performance complaints and latency issues for team prioritization."'}}}
Output schema
{'type': 'object', 'required': ['maxCostUsd', 'minCostUsd', 'baseUsd', 'perItemUsd', 'exact', 'pricing'], 'properties': {'exact': {'type': 'boolean', 'description': 'true when the price is exact (minCostUsd == maxCostUsd): a flat SKU or a sealed page'}, 'baseUsd': {'type': 'number', 'description': 'fixed cost per call in USD, charged regardless of count'}, 'pricing': {'type': 'string', 'description': 'a one-line human explanation of how this call is priced'}, 'maxCostUsd': {'type': 'number', 'description': 'the most this call can charge - the reserve held before running'}, 'minCostUsd': {'type': 'number', 'description': 'the likely charge - the cheapest route serves first'}, 'perItemUsd': {'type': 'number', 'description': 'marginal cost in USD per billable unit (see perItemUnit); 0 for a flat SKU'}, 'perItemUnit': {'type': 'string', 'description': "the unit perItemUsd is charged per: 'result' (default) or an input unit like 'username' for input-priced SKUs"}}, 'additionalProperties': False}
read_result
Read a saved result
Dig deeper into a paid run WITHOUT re-running or paying again. Pass the `result_id` from a prior run_api call plus any of fields/max_items/summary/jq to re-shape the full cached result (e.g. read the rest of the rows, or slice a large field with jq). Results are cached ~15 min and are private to your key; an expired id returns result_expired (re-run to refresh).
Read only
Input schema
{'type': 'object', 'required': ['result_id', 'context'], 'properties': {'jq': {'type': 'string', 'description': "optional: a jq expression to reshape the result; its output replaces 'output'. Example: '.data | {title, description, md: .markdown[:3500]}'. Sandboxed 250ms/2MB budget"}, 'fields': {'type': ['null', 'array'], 'items': {'type': 'string'}, 'description': "optional: keep only these keys on each result item (dotted paths like 'author.name' descend into nested objects)"}, 'context': {'type': 'string', 'description': 'Explain why you are calling this tool and how it fits into the user\'s overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person (\'I\', \'we\', \'you\') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): "Searching across the organization\'s repositories to find all open issues related to performance complaints and latency issues for team prioritization."'}, 'summary': {'type': 'boolean', 'description': 'optional: return only a structural outline (top-level keys, item counts, per-field byte sizes) instead of the full data'}, 'max_items': {'type': ['null', 'integer'], 'description': 'optional: cap the number of result items returned; a _truncated note reports how many were withheld'}, 'result_id': {'type': 'string', 'description': 'the resultId returned by a prior run_api call (cached ~15 min)'}}}
Output schema
{'type': 'object', 'required': ['output', 'provider', 'costUsd', 'items', 'replayed'], 'properties': {'hint': {'type': 'string', 'description': 'optional nudge. \'large_result:\' suggests fields/max_items/summary to keep future responses out of your context. \'paging_unavailable:\' means this result came from a source that cannot return a nextCursor, so it may be INCOMPLETE and you cannot page further - re-run with requireFields ["nextCursor"] (may cost more per request) if you need the full list'}, 'error': {'type': ['null', 'object'], 'required': ['code'], 'properties': {'code': {'type': 'string', 'description': 'safe AnyAPI error code'}}, 'description': 'safe AnyAPI failure code when durable work failed', 'additionalProperties': False}, 'items': {'type': 'integer', 'description': 'number of result rows returned. For per-result SKUs the per-item cost is charged against this; for input-priced SKUs (perItemUnit != result) the charge is per submitted input, independent of this count'}, 'output': {'description': 'normalized output payload'}, 'source': {'type': ['null', 'object'], 'required': ['id', 'name', 'kind', 'artworkKey'], 'properties': {'id': {'type': 'string'}, 'kind': {'type': 'string'}, 'name': {'type': 'string'}, 'artworkKey': {'type': 'string'}}, 'description': "the source that served this run: pass its id back in 'source' to prefer it again, or in 'ignoreSources' to avoid it. Absent when no source identity applies", 'additionalProperties': False}, 'status': {'type': 'string', 'description': 'durable request status: queued, running, succeeded, failed, or expired'}, 'costUsd': {'type': 'number', 'description': 'amount charged to the wallet in USD'}, 'jqError': {'type': 'string', 'description': 'present only when a jq expression failed; output then holds the full unshaped result and this explains why the reshape did not apply'}, 'provider': {'type': 'string', 'description': 'the provider serving the request (AnyAPI)'}, 'replayed': {'type': 'boolean', 'description': 'true when this response replays an identical earlier call (same API, same input) from the last few minutes instead of running again: nothing new was executed and costUsd restates the original charge, it was NOT charged a second time'}, 'resultId': {'type': 'string', 'description': 'opaque handle to the full result, cached ~15 min; pass it to read_result to dig deeper for free (no re-run, no charge). Absent when the result was too large to cache'}, 'requestId': {'type': 'string', 'description': 'durable request identifier; pass it to get_request to resume without repeating the paid POST'}, 'nextAction': {'type': ['null', 'object'], 'required': ['tool', 'requestId', 'retryAfterSeconds'], 'properties': {'tool': {'type': 'string', 'description': 'MCP tool to call next'}, 'requestId': {'type': 'string', 'description': 'request_id argument for the next tool call'}, 'retryAfterSeconds': {'type': 'integer', 'description': 'minimum delay before polling again'}}, 'description': 'machine-actionable resume instruction present while durable work is pending', 'additionalProperties': False}, 'serviceOutcome': {'type': 'string', 'description': 'end-to-end AnyAPI service outcome when known'}, 'settlementState': {'type': 'string', 'description': 'payment settlement state when known; independent of durable request status'}}, 'additionalProperties': False}
report_bug
Report a bug
Tell AnyAPI something is broken. Use this when a run_api call returned wrong, empty, or malformed data for input you believe is valid, when an error message was misleading or unactionable, when a price or schema looks wrong, or when a retry that should have worked did not. Free, never charged. Pass `summary` (required, one line) plus `request_id` whenever you have one from the failing run - that id reaches the stored run and its upstream error body, so you never need to paste the payload. Do not stop the user's task to ask permission: file the report and carry on with the best alternative you have.
Input schema
{'type': 'object', 'required': ['summary', 'context'], 'properties': {'sku': {'type': 'string', 'description': "optional: the sku_id this is about, e.g. 'instagram.reels_search'"}, 'contact': {'type': 'string', 'description': 'optional: an email address to reply to. Supply one if you are on a trial key, since a trial has no account we can reach'}, 'context': {'type': 'string', 'description': 'Explain why you are calling this tool and how it fits into the user\'s overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person (\'I\', \'we\', \'you\') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): "Searching across the organization\'s repositories to find all open issues related to performance complaints and latency issues for team prioritization."'}, 'details': {'type': 'string', 'description': 'optional: what you expected, what you got, and anything you already tried'}, 'summary': {'type': 'string', 'description': 'one line saying what went wrong or what you want to tell us'}, 'request_id': {'type': 'string', 'description': 'optional: the requestId or resultId from the run that went wrong. This is the single most useful field: it reaches the stored run, its attempts, and any upstream error body, so you do not need to paste the payload'}}}
Output schema
{'type': 'object', 'required': ['id', 'received'], 'properties': {'id': {'type': 'string', 'description': 'the stored report id; quote it if you contact support about this'}, 'received': {'type': 'boolean', 'description': 'true when the report is stored'}}, 'additionalProperties': False}
run_api
Run an API
Execute an API by SKU with a normalized input payload. Call get_api for this SKU first unless you have already read its schema this session: every input schema is strict (unknown fields are rejected, not ignored) and the field names differ between sibling APIs, so an input built from a description rather than a schema usually fails. Before setting a client or MCP tool timeout, call get_api and inspect its latency p50/p95/p99 and sample; p99 is an observation, not a maximum. Requires a valid AnyAPI key as a Bearer token. Charges the USD wallet. Some failed wallet-funded requests incur processing charges that we pass through at cost, with no markup; the error message shows the amount charged. Results can be large: pass `fields` (keep only the keys you need), `max_items` (cap rows), or `summary` (outline only) to trim the response and keep it out of your context — these never change what you are charged. Use quote_api first with the same arguments to see the exact price and validate your input without charging.
Destructive Open world
Input schema
{'type': 'object', 'required': ['sku_id', 'input', 'context'], 'properties': {'jq': {'type': 'string', 'description': "optional: a jq expression to reshape the result; its output replaces 'output' (multiple outputs collect into an array). Example: '.data | {title, description, md: .markdown[:3500]}'. Sandboxed 250ms/2MB budget; on failure the full result is returned with jqError. Does not change cost"}, 'input': {'type': 'object', 'description': 'normalized input payload matching the API input schema', 'additionalProperties': True}, 'fields': {'type': ['null', 'array'], 'items': {'type': 'string'}, 'description': "optional: keep only these keys on each result item (dotted paths like 'author.name' descend into nested objects). Shrinks the response without changing cost"}, 'sku_id': {'type': 'string', 'description': 'the API SKU slug to execute'}, 'context': {'type': 'string', 'description': 'Explain why you are calling this tool and how it fits into the user\'s overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person (\'I\', \'we\', \'you\') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): "Searching across the organization\'s repositories to find all open issues related to performance complaints and latency issues for team prioritization."'}, 'summary': {'type': 'boolean', 'description': 'optional: return only a structural outline (top-level keys, item counts, and per-field byte sizes) instead of the full data. Does not change cost'}, 'max_items': {'type': ['null', 'integer'], 'description': 'optional: cap the number of result items returned; a _truncated note reports how many were withheld. Does not change cost'}}}
Output schema
{'type': 'object', 'required': ['output', 'provider', 'costUsd', 'items', 'replayed'], 'properties': {'hint': {'type': 'string', 'description': 'optional nudge. \'large_result:\' suggests fields/max_items/summary to keep future responses out of your context. \'paging_unavailable:\' means this result came from a source that cannot return a nextCursor, so it may be INCOMPLETE and you cannot page further - re-run with requireFields ["nextCursor"] (may cost more per request) if you need the full list'}, 'error': {'type': ['null', 'object'], 'required': ['code'], 'properties': {'code': {'type': 'string', 'description': 'safe AnyAPI error code'}}, 'description': 'safe AnyAPI failure code when durable work failed', 'additionalProperties': False}, 'items': {'type': 'integer', 'description': 'number of result rows returned. For per-result SKUs the per-item cost is charged against this; for input-priced SKUs (perItemUnit != result) the charge is per submitted input, independent of this count'}, 'output': {'description': 'normalized output payload'}, 'source': {'type': ['null', 'object'], 'required': ['id', 'name', 'kind', 'artworkKey'], 'properties': {'id': {'type': 'string'}, 'kind': {'type': 'string'}, 'name': {'type': 'string'}, 'artworkKey': {'type': 'string'}}, 'description': "the source that served this run: pass its id back in 'source' to prefer it again, or in 'ignoreSources' to avoid it. Absent when no source identity applies", 'additionalProperties': False}, 'status': {'type': 'string', 'description': 'durable request status: queued, running, succeeded, failed, or expired'}, 'costUsd': {'type': 'number', 'description': 'amount charged to the wallet in USD'}, 'jqError': {'type': 'string', 'description': 'present only when a jq expression failed; output then holds the full unshaped result and this explains why the reshape did not apply'}, 'provider': {'type': 'string', 'description': 'the provider serving the request (AnyAPI)'}, 'replayed': {'type': 'boolean', 'description': 'true when this response replays an identical earlier call (same API, same input) from the last few minutes instead of running again: nothing new was executed and costUsd restates the original charge, it was NOT charged a second time'}, 'resultId': {'type': 'string', 'description': 'opaque handle to the full result, cached ~15 min; pass it to read_result to dig deeper for free (no re-run, no charge). Absent when the result was too large to cache'}, 'requestId': {'type': 'string', 'description': 'durable request identifier; pass it to get_request to resume without repeating the paid POST'}, 'nextAction': {'type': ['null', 'object'], 'required': ['tool', 'requestId', 'retryAfterSeconds'], 'properties': {'tool': {'type': 'string', 'description': 'MCP tool to call next'}, 'requestId': {'type': 'string', 'description': 'request_id argument for the next tool call'}, 'retryAfterSeconds': {'type': 'integer', 'description': 'minimum delay before polling again'}}, 'description': 'machine-actionable resume instruction present while durable work is pending', 'additionalProperties': False}, 'serviceOutcome': {'type': 'string', 'description': 'end-to-end AnyAPI service outcome when known'}, 'settlementState': {'type': 'string', 'description': 'payment settlement state when known; independent of durable request status'}}, 'additionalProperties': False}
search_apis
Search APIs
Search APIs by meaning and keyword across name, slug, and description, returning matches WITH their descriptions (schemas omitted), ranked most relevant first. Pass `query`, `category`, or `platform` - at least one, in any combination: a scope on its own is a complete search, so `category` or `platform` with no `query` enumerates it. Add `limit` to cap matches (default 25, maximum 50). Each result carries a `relevance` score in (0,1] relative to the top match; a relevance floor drops the weakly-matching tail, so `total` counts relevant matches before the limit. `ranking` says whether meaning-based ('semantic') or substring ('keyword') matching served the search. Entries with heavy:true return large responses - plan to pass fields/max_items/summary to run_api. Results carry NO input schema, so you cannot build a run_api call from them alone: before your FIRST run_api on any API, call get_api for it and use the schema it returns. Guessing the input is the single most common way a run fails - callers who read the schema first are rejected about a quarter as often. Use list_apis to browse everything.
Read only
Input schema
{'type': 'object', 'required': ['context'], 'properties': {'limit': {'type': ['null', 'integer'], 'description': 'optional cap on matches returned (default 25, maximum 50)'}, 'query': {'type': 'string', 'description': 'free-text search over API name, slug, and description; optional when category or platform is given'}, 'context': {'type': 'string', 'description': 'Explain why you are calling this tool and how it fits into the user\'s overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person (\'I\', \'we\', \'you\') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): "Searching across the organization\'s repositories to find all open issues related to performance complaints and latency issues for team prioritization."'}, 'category': {'type': 'string', 'description': 'optional category slug to narrow the search'}, 'platform': {'type': 'string', 'description': 'optional API slug prefix to narrow the search'}}}
Output schema
{'type': 'object', 'required': ['results', 'total', 'ranking'], 'properties': {'total': {'type': 'integer'}, 'ranking': {'type': 'string'}, 'results': {'type': ['null', 'array'], 'items': {'type': 'object', 'required': ['id', 'slug', 'category', 'name', 'description', 'method', 'path', 'provider', 'execution', 'pricing', 'failover', 'relevance'], 'properties': {'id': {'type': 'string'}, 'name': {'type': 'string'}, 'path': {'type': 'string'}, 'slug': {'type': 'string'}, 'heavy': {'type': 'boolean'}, 'method': {'type': 'string'}, 'pricing': {'type': 'object', 'required': ['from', 'failoverMaxUsd', 'failoverMaxPer1kUsd'], 'properties': {'from': {'type': 'object', 'required': ['model', 'unit', 'maxUsd', 'maxPer1kUsd'], 'properties': {'unit': {'type': 'string'}, 'model': {'type': 'string'}, 'addons': {'type': ['null', 'array'], 'items': {'type': 'object', 'required': ['id', 'label', 'field', 'usd'], 'properties': {'id': {'type': 'string'}, 'usd': {'type': 'number'}, 'field': {'type': 'string'}, 'label': {'type': 'string'}}, 'additionalProperties': False}}, 'maxUsd': {'type': 'number'}, 'baseUsd': {'type': ['null', 'number']}, 'perUnitUsd': {'type': ['null', 'number']}, 'maxPer1kUsd': {'type': 'number'}}, 'additionalProperties': False}, 'failoverMaxUsd': {'type': 'number'}, 'failoverMaxPer1kUsd': {'type': 'number'}}, 'additionalProperties': False}, 'category': {'type': 'string'}, 'failover': {'type': 'boolean'}, 'provider': {'type': 'string'}, 'execution': {'type': 'object', 'required': ['mode'], 'properties': {'mode': {'type': 'string'}}, 'additionalProperties': False}, 'relevance': {'type': 'number', 'description': 'relative relevance in (0,1], 1.0 = the best match'}, 'description': {'type': 'string'}, 'excludesCallerDelay': {'type': 'boolean'}}, 'additionalProperties': False}}}, 'additionalProperties': False}
send_feedback
Send feedback
Tell AnyAPI something that is not a defect: an API you wanted and could not find in the catalog, a field missing from a result you needed, a confusing part of the docs or tool descriptions, or what would have made a task easier. Free, never charged. Pass `summary` (required, one line) and use `details` for what you were trying to accomplish. Use report_bug instead when something behaved incorrectly.
Input schema
{'type': 'object', 'required': ['summary', 'context'], 'properties': {'sku': {'type': 'string', 'description': "optional: the sku_id this is about, e.g. 'instagram.reels_search'"}, 'contact': {'type': 'string', 'description': 'optional: an email address to reply to. Supply one if you are on a trial key, since a trial has no account we can reach'}, 'context': {'type': 'string', 'description': 'Explain why you are calling this tool and how it fits into the user\'s overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person (\'I\', \'we\', \'you\') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): "Searching across the organization\'s repositories to find all open issues related to performance complaints and latency issues for team prioritization."'}, 'details': {'type': 'string', 'description': 'optional: what you expected, what you got, and anything you already tried'}, 'summary': {'type': 'string', 'description': 'one line saying what went wrong or what you want to tell us'}, 'request_id': {'type': 'string', 'description': 'optional: the requestId or resultId from the run that went wrong. This is the single most useful field: it reaches the stored run, its attempts, and any upstream error body, so you do not need to paste the payload'}}}
Output schema
{'type': 'object', 'required': ['id', 'received'], 'properties': {'id': {'type': 'string', 'description': 'the stored report id; quote it if you contact support about this'}, 'received': {'type': 'boolean', 'description': 'true when the report is stored'}}, 'additionalProperties': False}
Changed
run_api
Oct. 1, 2026, 2:45 a.m.
Added
send_feedback
Sept. 17, 2026, 12:42 p.m.
Added
search_apis
Sept. 17, 2026, 12:42 p.m.
Added
run_api
Sept. 17, 2026, 12:42 p.m.
Added
report_bug
Sept. 17, 2026, 12:42 p.m.
Added
read_result
Sept. 17, 2026, 12:42 p.m.
Added
quote_api
Sept. 17, 2026, 12:42 p.m.
Added
list_apis
Sept. 17, 2026, 12:42 p.m.
Added
get_request
Sept. 17, 2026, 12:42 p.m.
Added
get_balance
Sept. 17, 2026, 12:42 p.m.
Added
get_api
Sept. 17, 2026, 12:42 p.m.