A directory of agent services, with metrics.
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Optional. 'Bearer asa_...' free API key: higher rate limits and outcome reports. Get one at https://agentservicedirectory.com/connect
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
Recently detected changes to monitored documentation and API schemas, across all reviewed services or for one. A detected change is pending interpretation, not necessarily a breaking change.
Limit to one service.
Default 7.
Tool list last changed Oct 23, 2026.
Recently detected changes to monitored documentation and API schemas, across all reviewed services or for one. A detected change is pending interpretation, not necessarily a breaking change.
| Argument | Type | Description |
|---|---|---|
| id | string | Limit to one service. |
| days | integer | Default 7. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"id": {
"type": "string",
"maxLength": 80,
"description": "Limit to one service."
},
"days": {
"type": "integer",
"maximum": 30,
"minimum": 1,
"description": "Default 7."
}
}
}Individual check results for a service over the last days, newest first. Use it to see patterns (intermittent failures, slowdowns) behind the summary figures.
| Argument | Type | Description |
|---|---|---|
| id* | string | |
| days | integer | Default 7. |
| limit | integer | Default 50. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"maxLength": 80
},
"days": {
"type": "integer",
"maximum": 30,
"minimum": 1,
"description": "Default 7."
},
"limit": {
"type": "integer",
"maximum": 200,
"minimum": 1,
"description": "Default 50."
}
}
}The weekly State of Agent Services report: coverage, probe results, payment networks, prices and purpose tags across everything we track. Counts and distributions only, with their method. Omit id for the latest published report; 'current' gives provisional week-to-date figures.
| Argument | Type | Description |
|---|---|---|
| id | string | Report id (the Monday that starts the week, e.g. '2026-10-19'), or 'current'. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"id": {
"type": "string",
"pattern": "^(current|\\d{4}-\\d{2}-\\d{2})$",
"description": "Report id (the Monday that starts the week, e.g. '2026-10-19'), or 'current'."
}
}
}Full evidence and connection details for one service, plus a referral_id. Use the referral_id with report_outcome after you use the service (valid 7 days).
| Argument | Type | Description |
|---|---|---|
| id* | string | A service id from search_services, e.g. 'svc_...' or 'cand_...'. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"maxLength": 80,
"description": "A service id from search_services, e.g. 'svc_...' or 'cand_...'."
}
}
}How many services we track and how many checks ran in the last 24 hours.
No arguments.
{
"type": "object",
"properties": {}
}The capability tree: what services do, as branches, leaves and leaves' children, each with a one-line description and the number of services in it (zeros included). Read it once (follow its guide), choose the most specific node that matches your task, then call search_services with branch set to its id, or up to three ids separated by commas when more than one fits. format "text" returns the same tree as plain text, one line per node: the cheapest to read. Keep it and pass since_revision later to get only what changed. IDs are permanent: an id that moved (listed under moved) still works as a branch filter.
| Argument | Type | Description |
|---|---|---|
| format | string | json (default) or text: one line per node, about half the size of json. |
| since_revision | integer | The revision of a copy you hold: returns only the node changes since then (or unchanged: true) instead of the tree. Service counts are refreshed every hour and are not changes. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"format": {
"enum": [
"json",
"text"
],
"type": "string",
"description": "json (default) or text: one line per node, about half the size of json."
},
"since_revision": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 0,
"description": "The revision of a copy you hold: returns only the node changes since then (or unchanged: true) instead of the tree. Service counts are refreshed every hour and are not changes."
}
}
}After using a service, report whether it worked. Requires a free API key (Authorization: Bearer asd_...; get one with POST https://agentservicedirectory.com/api/v1/keys). Quote the referral_id from get_service. Reports are stored as unverified claims and published only after moderation. Never include task data, secrets or personal information.
| Argument | Type | Description |
|---|---|---|
| outcome* | string | |
| operation | string | Which operation, e.g. 'GET /v1/search'. |
| service_id | string | If you have no referral_id. |
| referral_id | string | From get_service. Preferred. |
| failure_kind | string | |
| task_category | string | Broad category only, e.g. 'web-search'. No task content. |
| idempotency_key* | string | Unique per report; retries with the same key are not counted twice. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"outcome",
"idempotency_key"
],
"properties": {
"outcome": {
"enum": [
"success",
"failure",
"unknown"
],
"type": "string"
},
"operation": {
"type": "string",
"maxLength": 120,
"description": "Which operation, e.g. 'GET /v1/search'."
},
"service_id": {
"type": "string",
"maxLength": 80,
"description": "If you have no referral_id."
},
"referral_id": {
"type": "string",
"maxLength": 80,
"description": "From get_service. Preferred."
},
"failure_kind": {
"enum": [
"no_response",
"payment_failed",
"bad_output",
"wrong_price",
"auth_required",
"rate_limited",
"other"
],
"type": "string"
},
"task_category": {
"type": "string",
"maxLength": 60,
"description": "Broad category only, e.g. 'web-search'. No task content."
},
"idempotency_key": {
"type": "string",
"maxLength": 100,
"minLength": 1,
"description": "Unique per report; retries with the same key are not counted twice."
}
}
}Find services an agent can use, by what they do: remote MCP servers (with the tools each lists), local MCP servers (packages), pay-per-call APIs (x402, MPP), A2A agents and task marketplaces, with our checks for each. Search by words (query) or by capability tree node (branch); filter on type, access (none_asked, payment, credentials), max_price_usd and the evidence (passing, min_pass_rate); then call get_service for connection details. Results are compact; use limit/offset to page.
| Argument | Type | Description |
|---|---|---|
| tag | string | Purpose tag, e.g. 'web-search'. |
| acts | string | What the service's own text says it does in the world when called: read_only, or what it changes. Values: read_only, sends_messages, spends_money, books_or_orders, writes_data, deletes_data, posts_publicly, controls_devices. Comma-separated values are alternatives. Strict: services whose own text states nothing on this are left out (stated-facts/2). |
| sort | string | Default: relevance when query is given, otherwise evidence. relevance (the default when q is given): first services in a place the query names (search/5, by the place's name, description or the words agents use for it), and among them those breaking fewer of the conditions read from the request, then, when no covers filter names a place, those whose own text does not limit them to particular places (search/10: a stated country or region and not worldwide comes later; nothing is hidden), then those meeting more conditions (search/7: pay per call, no API key, MCP, a price limit; an observation counts twice a statement; see query_conditions), then the better-matched place, then services matching more of the query's words (and, among those matching as many, the rarer words), then those meeting more of the preferences read, then those whose provider's domain starts with the first word used (its own site: q=stripe puts stripe.com first), then those whose name is, starts with or contains the words used, then the rest; within each group, the evidence order (evidence/2). evidence (evidence/2, the default without q): first services with at least 5 checks in 30 days, then by the share of those checks passed, then by how long we have watched them (longest first), then by payers as the registry reports them, as a tiebreak only. provider-mix/1: in every sort but name and recent, each provider's results after its first three come after every other provider's first three, so one provider cannot fill a page; provider= (or host=) lists one provider's services in plain order, and group=provider gives one per provider. median_ms and p95_ms: fastest first over 30 days, services without the figure last. |
Tell us what is missing or wrong: a service or kind of service we don't list, a metric you need, a feature, wrong data or unclear docs. No key needed. We use it to decide where to look next; counts by kind are public on the roadmap, the messages are not. Never include task data, secrets or personal information.
| Argument | Type | Description |
|---|---|---|
| kind* | string | |
| note | string | What you needed or what is wrong, in a sentence or two. |
| about | string | A service id, host, or the kind of service, e.g. 'marine weather forecasts'. |
| contact | string | Only if you want a reply. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"kind"
],
"properties": {
"kind": {
"enum": [
"missing_service",
"missing_metric",
"feature_request",
"wrong_data",
"unclear_docs",
"other"
],
"type": "string"
},
"note": {
"type": "string",
"maxLength": 500,
"description": "What you needed or what is wrong, in a sentence or two."
},
"about": {
"type": "string",
"maxLength": 120,
"description": "A service id, host, or the kind of service, e.g. 'marine weather forecasts'."
},
"contact": {
"type": "string",
"maxLength": 200,
"description": "Only if you want a reply."
}
}
}| tier | string |
| type | string |
| limit | integer | Default 10, maximum 25. |
| query | string | Text search (search/10) over names, hosts, URLs, operator names, the tool names an MCP server lists, and the name of a service's place in the capability tree when that place passed our three placement checks. Write it as words or a sentence: words about payment or shape rather than purpose (mcp, api, pay, per, no, key, ..., and the words of a payment phrase such as "pay per call" or "$0.01 a request") are set aside and numbers left out (use the filters for those), and the response's query_words says which words were used. A service matches at least half the words (one of one or two). Services in a place the query names (by the place's name, description or the words agents use for it) rank first; then more matched words, then words found at the start of a word (send in 'Send Email' before send inside 'Godsend'), then the rarer words. A word of three or more characters matches the start of a word, or anywhere inside a name, host or operator word; one of seven or more also matches by its first five characters; a shorter word matches a whole word. Conditions read from the request (search/7): a fixed table turns phrases into conditions that rank, never filter. Pay per call, per request, x402, MPP, L402, USDC, no account or no signup: asks for payment. No API key, without a key, no auth, keyless, no sign-in: does not ask for credentials (observed or stated); "an API key is fine" lifts it. MCP: an MCP server (remote, hosted or endpoint: a remote one; local, install or package: a local one). A2A or agent card: an A2A agent. Under, below, at most $X, or a cent or less: a price per call at or below X. Fastest or low latency: faster first. For each service a condition is met by our observation, met by a statement (the operator's, a registry's, an OpenAPI description's), not known, or broken (observed or stated against it): services breaking fewer come first, then those meeting more, an observation counting twice a statement; one not known ranks below one met and above one broken. A condition in the same clause as preferably, ideally, if possible or would be nice is a preference: it orders only among services otherwise level. query_conditions in the response says which were read, from which words, and which are preferences; a filter given explicitly always wins. E.g. 'weather', or 'send an SMS, pay per call, no account'. |
| scope | string | directory (default): services that meet the listing criteria (https://agentservicedirectory.com/methodology#directory); index: everything we watch. |
| access | string | What the service asks of a caller (access/1): 'payment' (our plain request got HTTP 402), 'credentials' (HTTP 401, or its agent card or MCP Registry entry says so) or 'none_asked' (answered without asking for either, and nothing stated says credentials are needed). Services with no value are left out. |
| branch | string | Capability tree id from get_tree, e.g. 'messaging/email/validation', 'places/weather' or 'places' (a node includes everything under it), or 'other'. Up to three ids separated by commas list services in any of them. |
| covers | string | A country (ISO 3166-1 alpha-2, e.g. AT) the service's own text says its data or job is about; a service that states a region including it (EU, Europe) or worldwide matches too. Comma-separated values are alternatives. Strict: services whose own text states nothing on this are left out (stated-facts/2). |
| format | string | A format the service's own text names for what it returns. Values: json, csv, xml, pdf, html, text, markdown, image, audio, video, geojson. Comma-separated values are alternatives. Strict: services whose own text states nothing on this are left out (stated-facts/2). |
| offset | integer |
| network | string | Payment network, e.g. 'eip155:8453' (Base) or 'solana'. |
| passing | boolean | true: latest check passed. |
| audience | string | Who the service's own text says it is for. Values: consumers, businesses, developers, agents. Comma-separated values are alternatives. Strict: services whose own text states nothing on this are left out (stated-facts/2). |
| currency | string | ISO 4217 code (USD so far): services whose payment terms, seen in their own HTTP 402 answers to our checks, are in this currency; a stablecoin counts as the currency it tracks (USDC as USD). Services whose currency we have not observed are left out. |
| delivery | string | How the service's own text says results come back. Values: sync, async, webhook, streaming, batch. Comma-separated values are alternatives. Strict: services whose own text states nothing on this are left out (stated-facts/2). |
| language | string | A language (ISO 639-1, e.g. de) the service's own text says its content or output is in. Comma-separated values are alternatives. Strict: services whose own text states nothing on this are left out (stated-facts/2). |
| provider | string | Only endpoints from this provider (registrable domain, e.g. 'example.com'), as given in a result's provider field. |
| freshness | string | How current the service's own text says its data is. Values: live, hourly, daily, weekly, periodic, static. Comma-separated values are alternatives. Strict: services whose own text states nothing on this are left out (stated-facts/2). |
| max_p95_ms | integer | Over the last 30 days of our checks (response-times/1, measured from eastern North America; one operation per service, timeouts counted at the time limit); services with too few checks for the figure are left out. Maximum 95th-percentile response time in milliseconds. |
| min_checks | integer | Minimum checks in the last 30 days, to avoid judging on one check. |
| min_payers | integer | Minimum unique payers in 30 days, as reported by the registry. |
| data_stored | string | Whether the service's own text says it keeps or logs what callers send. Values: true, false. Comma-separated values are alternatives. Strict: services whose own text states nothing on this are left out (stated-facts/2). |
| processed_in | string | A country (ISO 3166-1 alpha-2) where the service's own text says it processes or stores data; a stated region including it or worldwide matches too. Comma-separated values are alternatives. Strict: services whose own text states nothing on this are left out (stated-facts/2). |
| max_median_ms | integer | Over the last 30 days of our checks (response-times/1, measured from eastern North America; one operation per service, timeouts counted at the time limit); services with too few checks for the figure are left out. Maximum median response time in milliseconds. |
| max_price_usd | number | Maximum price per call in USD stablecoin, where the price is known. |
| min_pass_rate | number | Share of checks passed in the last 30 days, 0 to 1. |
| payment_model | string | 'per_call': it asked for payment for our request (HTTP 402). Services whose payment model is not known are left out. |
| payment_method | string | A way to pay the service's own text names. Payment protocols (x402, MPP, L402) are observed from payment requests: see access.observed. Values: card, bank, invoice, crypto, stablecoin, paypal. Comma-separated values are alternatives. Strict: services whose own text states nothing on this are left out (stated-facts/2). |
| one_per_provider | boolean | Return one endpoint per provider (registrable domain): the first under the chosen sort (by default, the evidence order: the share of checks passed, then how long we have watched it). |
| max_terms_changes_90d | integer | Only services whose observed x402 payment terms changed at most this many times in the last 90 days (0 = unchanged). Short histories are labelled limited. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"tag": {
"type": "string",
"maxLength": 32,
"description": "Purpose tag, e.g. 'web-search'."
},
"acts": {
"type": "string",
"maxLength": 80,
"description": "What the service's own text says it does in the world when called: read_only, or what it changes. Values: read_only, sends_messages, spends_money, books_or_orders, writes_data, deletes_data, posts_publicly, controls_devices. Comma-separated values are alternatives. Strict: services whose own text states nothing on this are left out (stated-facts/2)."
},
"sort": {
"enum": [
"relevance",
"evidence",
"pass_rate",
"payers",
"price",
"median_ms",
"p95_ms",
"recent",
"name"
],
"type": "string",
"description": "Default: relevance when query is given, otherwise evidence. relevance (the default when q is given): first services in a place the query names (search/5, by the place's name, description or the words agents use for it), and among them those breaking fewer of the conditions read from the request, then, when no covers filter names a place, those whose own text does not limit them to particular places (search/10: a stated country or region and not worldwide comes later; nothing is hidden), then those meeting more conditions (search/7: pay per call, no API key, MCP, a price limit; an observation counts twice a statement; see query_conditions), then the better-matched place, then services matching more of the query's words (and, among those matching as many, the rarer words), then those meeting more of the preferences read, then those whose provider's domain starts with the first word used (its own site: q=stripe puts stripe.com first), then those whose name is, starts with or contains the words used, then the rest; within each group, the evidence order (evidence/2). evidence (evidence/2, the default without q): first services with at least 5 checks in 30 days, then by the share of those checks passed, then by how long we have watched them (longest first), then by payers as the registry reports them, as a tiebreak only. provider-mix/1: in every sort but name and recent, each provider's results after its first three come after every other provider's first three, so one provider cannot fill a page; provider= (or host=) lists one provider's services in plain order, and group=provider gives one per provider. median_ms and p95_ms: fastest first over 30 days, services without the figure last."
},
"tier": {
"enum": [
"reviewed",
"discovered"
],
"type": "string"
},
"type": {
"enum": [
"api_endpoint",
"task_marketplace",
"mcp_server",
"mcp_local",
"a2a_agent",
"web_api"
],
"type": "string"
},
"limit": {
"type": "integer",
"maximum": 25,
"minimum": 1,
"description": "Default 10, maximum 25."
},
"query": {
"type": "string",
"maxLength": 300,
"description": "Text search (search/10) over names, hosts, URLs, operator names, the tool names an MCP server lists, and the name of a service's place in the capability tree when that place passed our three placement checks. Write it as words or a sentence: words about payment or shape rather than purpose (mcp, api, pay, per, no, key, ..., and the words of a payment phrase such as \"pay per call\" or \"$0.01 a request\") are set aside and numbers left out (use the filters for those), and the response's query_words says which words were used. A service matches at least half the words (one of one or two). Services in a place the query names (by the place's name, description or the words agents use for it) rank first; then more matched words, then words found at the start of a word (send in 'Send Email' before send inside 'Godsend'), then the rarer words. A word of three or more characters matches the start of a word, or anywhere inside a name, host or operator word; one of seven or more also matches by its first five characters; a shorter word matches a whole word. Conditions read from the request (search/7): a fixed table turns phrases into conditions that rank, never filter. Pay per call, per request, x402, MPP, L402, USDC, no account or no signup: asks for payment. No API key, without a key, no auth, keyless, no sign-in: does not ask for credentials (observed or stated); \"an API key is fine\" lifts it. MCP: an MCP server (remote, hosted or endpoint: a remote one; local, install or package: a local one). A2A or agent card: an A2A agent. Under, below, at most $X, or a cent or less: a price per call at or below X. Fastest or low latency: faster first. For each service a condition is met by our observation, met by a statement (the operator's, a registry's, an OpenAPI description's), not known, or broken (observed or stated against it): services breaking fewer come first, then those meeting more, an observation counting twice a statement; one not known ranks below one met and above one broken. A condition in the same clause as preferably, ideally, if possible or would be nice is a preference: it orders only among services otherwise level. query_conditions in the response says which were read, from which words, and which are preferences; a filter given explicitly always wins. E.g. 'weather', or 'send an SMS, pay per call, no account'."
},
"scope": {
"enum": [
"directory",
"index"
],
"type": "string",
"description": "directory (default): services that meet the listing criteria (https://agentservicedirectory.com/methodology#directory); index: everything we watch."
},
"access": {
"enum": [
"payment",
"credentials",
"none_asked"
],
"type": "string",
"description": "What the service asks of a caller (access/1): 'payment' (our plain request got HTTP 402), 'credentials' (HTTP 401, or its agent card or MCP Registry entry says so) or 'none_asked' (answered without asking for either, and nothing stated says credentials are needed). Services with no value are left out."
},
"branch": {
"type": "string",
"maxLength": 250,
"description": "Capability tree id from get_tree, e.g. 'messaging/email/validation', 'places/weather' or 'places' (a node includes everything under it), or 'other'. Up to three ids separated by commas list services in any of them."
},
"covers": {
"type": "string",
"maxLength": 80,
"description": "A country (ISO 3166-1 alpha-2, e.g. AT) the service's own text says its data or job is about; a service that states a region including it (EU, Europe) or worldwide matches too. Comma-separated values are alternatives. Strict: services whose own text states nothing on this are left out (stated-facts/2)."
},
"format": {
"type": "string",
"maxLength": 80,
"description": "A format the service's own text names for what it returns. Values: json, csv, xml, pdf, html, text, markdown, image, audio, video, geojson. Comma-separated values are alternatives. Strict: services whose own text states nothing on this are left out (stated-facts/2)."
},
"offset": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 0
},
"network": {
"type": "string",
"maxLength": 80,
"description": "Payment network, e.g. 'eip155:8453' (Base) or 'solana'."
},
"passing": {
"type": "boolean",
"description": "true: latest check passed."
},
"audience": {
"type": "string",
"maxLength": 80,
"description": "Who the service's own text says it is for. Values: consumers, businesses, developers, agents. Comma-separated values are alternatives. Strict: services whose own text states nothing on this are left out (stated-facts/2)."
},
"currency": {
"type": "string",
"maxLength": 3,
"description": "ISO 4217 code (USD so far): services whose payment terms, seen in their own HTTP 402 answers to our checks, are in this currency; a stablecoin counts as the currency it tracks (USDC as USD). Services whose currency we have not observed are left out."
},
"delivery": {
"type": "string",
"maxLength": 80,
"description": "How the service's own text says results come back. Values: sync, async, webhook, streaming, batch. Comma-separated values are alternatives. Strict: services whose own text states nothing on this are left out (stated-facts/2)."
},
"language": {
"type": "string",
"maxLength": 80,
"description": "A language (ISO 639-1, e.g. de) the service's own text says its content or output is in. Comma-separated values are alternatives. Strict: services whose own text states nothing on this are left out (stated-facts/2)."
},
"provider": {
"type": "string",
"maxLength": 253,
"description": "Only endpoints from this provider (registrable domain, e.g. 'example.com'), as given in a result's provider field."
},
"freshness": {
"type": "string",
"maxLength": 80,
"description": "How current the service's own text says its data is. Values: live, hourly, daily, weekly, periodic, static. Comma-separated values are alternatives. Strict: services whose own text states nothing on this are left out (stated-facts/2)."
},
"max_p95_ms": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 0,
"description": "Over the last 30 days of our checks (response-times/1, measured from eastern North America; one operation per service, timeouts counted at the time limit); services with too few checks for the figure are left out. Maximum 95th-percentile response time in milliseconds."
},
"min_checks": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 0,
"description": "Minimum checks in the last 30 days, to avoid judging on one check."
},
"min_payers": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 0,
"description": "Minimum unique payers in 30 days, as reported by the registry."
},
"data_stored": {
"type": "string",
"maxLength": 80,
"description": "Whether the service's own text says it keeps or logs what callers send. Values: true, false. Comma-separated values are alternatives. Strict: services whose own text states nothing on this are left out (stated-facts/2)."
},
"processed_in": {
"type": "string",
"maxLength": 80,
"description": "A country (ISO 3166-1 alpha-2) where the service's own text says it processes or stores data; a stated region including it or worldwide matches too. Comma-separated values are alternatives. Strict: services whose own text states nothing on this are left out (stated-facts/2)."
},
"max_median_ms": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 0,
"description": "Over the last 30 days of our checks (response-times/1, measured from eastern North America; one operation per service, timeouts counted at the time limit); services with too few checks for the figure are left out. Maximum median response time in milliseconds."
},
"max_price_usd": {
"type": "number",
"minimum": 0,
"description": "Maximum price per call in USD stablecoin, where the price is known."
},
"min_pass_rate": {
"type": "number",
"maximum": 1,
"minimum": 0,
"description": "Share of checks passed in the last 30 days, 0 to 1."
},
"payment_model": {
"enum": [
"per_call"
],
"type": "string",
"description": "'per_call': it asked for payment for our request (HTTP 402). Services whose payment model is not known are left out."
},
"payment_method": {
"type": "string",
"maxLength": 80,
"description": "A way to pay the service's own text names. Payment protocols (x402, MPP, L402) are observed from payment requests: see access.observed. Values: card, bank, invoice, crypto, stablecoin, paypal. Comma-separated values are alternatives. Strict: services whose own text states nothing on this are left out (stated-facts/2)."
},
"one_per_provider": {
"type": "boolean",
"description": "Return one endpoint per provider (registrable domain): the first under the chosen sort (by default, the evidence order: the share of checks passed, then how long we have watched it)."
},
"max_terms_changes_90d": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 0,
"description": "Only services whose observed x402 payment terms changed at most this many times in the last 90 days (0 = unchanged). Short histories are labelled limited."
}
}
}