API Plan Finder
Server Details
Compare API plans on 42 conditions with cost: scraping, SERP, search, browser, email, TTS, STT, docs
- Status
- Healthy
- Uptime
- 99.2% over 22 days
- Last Tested
- Transport
- Streamable HTTP ยท MCP 2025-11-25
- URL
TDQS
Scored across 6 tools
Most tools have distinct roles: search finds candidate plans, check_conditions judges named plans, get_details dumps one plan's facts, cost_scenarios models cost scaling, relax_conditions finds which requirement to loosen, and verify_answer audits a draft. However, search and check_conditions share nearly identical opening descriptions and output format (cost + condition verdicts), so an agent may pick the wrong one when the user's intent is borderline.
Five of six names are snake_case verb_noun patterns (check_conditions, get_details, relax_conditions, verify_answer) or close (cost_scenarios is noun-based). 'search' is a bare verb, a minor deviation, but the overall set is readable and predictable.
Six tools is well-scoped for a plan-discovery/verification domain. Each covers a distinct stage (discover, check, inspect, project cost, relax, verify) with no redundant tools padding the surface.
The surface covers discovery, named-plan checking, deep details, cost projection, constraint relaxation, and answer verification, which is strong lifecycle coverage for a lookup/analysis server. Minor gaps exist, e.g. no direct multi-plan comparison or provider catalog browse tool, though search arguably subsumes browsing.
Available Tools
6 toolscheck_conditionsCheck plans against conditionsARead-onlyIdempotentInspect
Call this right before choosing or buying an API plan: it returns, for each plan, whether it meets every condition, the monthly cost, and the official sentence behind each verdict. Use this when: the user names specific plans (by name, id or pricing-page URL) and wants to know whether they meet the workload and conditions, or which plan of the same product is the cheapest that does. Do not use this when: the user has no plans in mind yet (use search). Call it right before you choose or buy a tool or plan; format "brief" returns a short answer. Check specific plans, given by plan id, plan name or pricing-page URL, against the workload and conditions; up to 20 plans in one call are judged against the same conditions. Returns met / not met / unknown per condition with the official source sentence, which plans and billing options each value applies to, and a purchase link. For each plan it also names the cheapest plan of the same product that meets every required condition, with its monthly cost, or null if none does. An ambiguous name or URL returns the candidate plans instead of a guess. If you already have candidate plans or providers (for example from a web search), pass them as providers (search) or offer_ids (check_conditions) so that only those are judged. Example: 2 plans by id against 100,000 emails a month with a dedicated IP.
| Name | Required | Description | Default |
|---|---|---|---|
| plans | No | Plans given by provider and plan name (e.g. "ScrapingBee Freelance") or by pricing-page URL, for plans found elsewhere. A name or URL that fits several plans returns the candidates under resolution and no verdict. | |
| detail | No | summary returns one source sentence per fact; full returns every recorded fact and sentence. | summary |
| format | No | brief returns, per plan, the plan, provider, whether it meets all, the monthly cost and the requested conditions only, each with its verdict, a one-line reason, one source sentence and its source (about a quarter of the full size); the verdicts and costs are those of full. Call it right before choosing or buying a plan. | full |
| mcp_auth | No | Ways to authenticate to the provider's hosted MCP endpoint, any one of which will do: api_key, oauth. Met when the endpoint accepts at least one of them; implies a hosted endpoint. | |
| needs_zdr | No | Zero data retention must be usable on this plan. A provider that offers it only on a custom enterprise agreement does not meet it on its listed plans. | |
| offer_ids | No | Plan ids to check (from search or get_details). | |
| preferred | No | Nice-to-have conditions; they do not filter, they break ties. | |
| needs_soc2 | No | The provider must hold a SOC 2 report: true for Type I or Type II, "II" for Type II. | |
| needs_batch | No | The plan must transcribe recorded audio (a file or a stored recording), for speech-to-text. A plan priced for live audio only is not met. | |
| data_regions | No | Regions where data must be stored or processed, e.g. ["EU"]. Different from exit-IP countries. | |
| needs_korean | No | The service must voice Korean text (text-to-speech) or transcribe Korean speech (speech-to-text). | |
| billing_types | No | Acceptable billing: monthly_subscription (A plan with a fixed fee (or minimum commitment) billed every month.) annual_subscription (A plan paid for a year at a time.) pay_as_you_go (No plan fee; a price per unit of use, billed after use or drawn from a balance topped up with any amount.) prepaid_credits (Money paid before use: a credit pack, a balance topped up first, or a plan amount charged in advance for the period.) Free plans always qualify. | |
| monthly_pages | No | Pages per month by type: plain_html (static pages), javascript (needs rendering), premium_proxy (blocked sites that need residential/premium proxies), javascript_premium_proxy (both). | |
| needs_inbound | No | The service must receive email for the buyer and hand it on (inbound parsing, routes), for transactional email. | |
| monthly_emails | No | Emails sent per month, for transactional email APIs (SendGrid, Mailgun, Postmark, Resend, Amazon SES, Brevo, Mailtrap, Loops). It is the whole workload: give it instead of monthly_pages, monthly_searches and monthly_browser_hours, not with them. Only email products can serve it; other products are out of scope. | |
| search_engines | No | Search engines whose results the plan must return, each at the plan's search price: google, bing, yahoo, yandex, baidu, duckduckgo, naver, brave (brave is Brave's own index). monthly_searches is the total over all of them. | |
| captcha_solving | No | The plan must solve CAPTCHAs for the browser sessions (the vendor does it, not the buyer own service). | |
| min_concurrency | No | Minimum number of concurrent requests (or browsers) the plan must allow. | |
| needs_streaming | No | The service must return audio in real time as it is made (streaming or a WebSocket), for text-to-speech; for speech-to-text, it must transcribe live audio as it arrives. A speech-to-text price line is per mode, so a plan priced for recorded audio only is not met. | |
| monthly_searches | No | Search requests per month (one results page each). | |
| needs_remote_mcp | No | The provider must host a remote MCP endpoint (a URL an MCP client connects to). An official server that can only be run on the buyer own machine does not meet it. | |
| proxies_included | No | The plan must include proxy traffic of the vendor (some gigabytes in the plan fee). Proxy traffic sold only per gigabyte on top of the fee, or only on another plan, does not count. | |
| search_countries | No | ISO 3166-1 alpha-2 codes of the countries whose search results the searches must return (the search engine's country setting, e.g. Google gl), e.g. ["GB","CA"]. Different from exit_ip_countries. | |
| exit_ip_countries | No | ISO 3166-1 alpha-2 codes of countries the page requests must exit from, e.g. ["US","DE"]. For search results of a country use search_countries. | |
| min_pages_per_doc | No | Pages one document may have at the most the plan allows, for document parsing. Met when the stated limit is at least this many (or the pages say there is no page limit); a plan whose pages do not state a limit is unknown. The limit of the largest way of sending (batch or asynchronous) counts. | |
| needs_diarization | No | The plan must label who spoke (speaker diarization), for speech-to-text. Where the vendor charges extra for it, the extra price is added to the monthly cost; where the pages state no price or no inclusion the plan is unknown. | |
| needs_no_training | No | An official page must say the vendor does not use the buyer's text, audio or documents to train its models without the buyer opting in. A use that is on by default with an opt-out to ask for does not count. | |
| session_recording | No | The plan must record browser sessions (video or replay) that the buyer can watch afterwards. | |
| monthly_characters | No | Characters of text voiced per month, for text-to-speech APIs (ElevenLabs, Cartesia, Deepgram Aura, OpenAI, Google Cloud, Amazon Polly, Azure, Gradium, Rime, Inworld, MiniMax, Murf, Hume). It is the whole workload: give it instead of monthly_pages, monthly_searches, monthly_browser_hours and monthly_emails, not with them. Only text-to-speech products can serve it; other products are out of scope. | |
| needs_dedicated_ip | No | The plan must come with a dedicated sending IP address, for transactional email. A dedicated IP sold only as an add-on on top of the plan, or only on another plan, does not count. | |
| needs_official_mcp | No | The provider must publish its own MCP server (hosted by it or run by the buyer), stated in its official documentation. A server only a third party published does not count. | |
| ai_extraction_pages | No | How many of the pages need their fields extracted by an AI model (from a prompt or a schema, or automatically) without writing selectors. Each page counts in one of the two extraction fields. | |
| min_pages_per_crawl | No | Pages one crawl job (from one start URL, following links) must be able to reach. A plan whose crawl has no page cap meets any number; give the size of the largest site to crawl. Different from the monthly page total. | |
| min_sending_domains | No | Sending domains the plan must let one account authenticate, for transactional email. Met when the stated limit is at least this many (or the pages say it is unlimited); a plan whose pages do not state a limit is unknown. | |
| min_session_minutes | No | Minutes one browser session must be able to run on this plan, for hosted browsers. Met when the stated longest session of the plan is at least this long; a plan whose pages do not state a session limit is unknown, and a limit the page gives only for another plan is not met. | |
| monthly_audio_hours | No | Hours of audio transcribed per month, for speech-to-text APIs (Deepgram, AssemblyAI, Speechmatics, Amazon Transcribe, Google Cloud, OpenAI). A price given per minute is multiplied by 60. It is the whole workload: give it instead of monthly_pages, monthly_searches, monthly_browser_hours, monthly_emails and monthly_characters, not with them. Only speech-to-text products can serve it; other products are out of scope. | |
| monthly_pages_total | No | Total pages per month when the split by type is not known yet. Costs and verdicts then cover every share of JavaScript-rendered pages from 0% to 100% of the total (no premium proxies), and the result lists monthly_pages under needs_input. | |
| needs_voice_cloning | No | The plan must let the account clone a voice from its own recording, for text-to-speech. Cloning limited to eligible customers, a request form or an enterprise plan does not count for a plan that is not that plan. | |
| persistent_profiles | No | The plan must keep browser profiles (login state, cookies) between sessions. | |
| search_result_types | No | Result types the parsed search response must contain: organic, ads, local_pack, knowledge_graph, people_also_ask, related_searches, shopping, news, images, videos, ai_overview. | |
| max_monthly_cost_usd | No | Monthly budget in USD before tax. Compared with listed prices; annual plans use their per-month equivalent. | |
| needs_batch_discount | No | An official page must say a batch or asynchronous way of sending documents costs less than the list price on the plan, for document parsing. The budget and the cost are judged at the list price, not at the batch price. | |
| needs_commercial_use | No | The plan must allow commercial use of the generated audio, for text-to-speech. A free plan limited to non-commercial use does not count; a plan whose pages do not say is unknown. | |
| needs_no_min_billing | No | An official page must say audio is billed by the second (or an increment of seconds) with no minimum billed duration per request, for speech-to-text. A page that says nothing about rounding is unknown. | |
| monthly_browser_hours | No | Browser time per month in hours, for hosted browsers (Browserbase, Browserless) billed by browser time. It is the whole workload: give it instead of monthly_pages, monthly_searches and browser_seconds_per_page, not with them. Only browser products can serve it; other products are out of scope. | |
| max_overage_usd_per_1k | No | The most the plan may charge for each 1,000 emails beyond its included volume, in USD, for transactional email. A plan whose extra price is not published as a per-1,000 figure is unknown. | |
| min_log_retention_days | No | Days the plan must keep the logs or events of sent email where the account can read them, for transactional email. Longer retention sold as an add-on does not count. | |
| monthly_document_pages | No | Pages of documents parsed per month, for document-parsing APIs (LlamaParse, Reducto, Unstructured, Mistral OCR, LandingAI, Amazon Textract, Google Document AI, Azure Document Intelligence, Datalab, Mathpix, Mindee, Nanonets, Upstage). A price given per credit is multiplied by the credits one page costs. It is the whole workload: give it instead of monthly_pages, monthly_searches, monthly_browser_hours, monthly_emails, monthly_characters and monthly_audio_hours, not with them. Only document-parsing products can serve it; other products are out of scope. | |
| needs_table_extraction | No | The service must return the tables of a page as structure (rows and cells), not only the text, for document parsing. | |
| search_returns_content | No | The search response itself must carry the text of the result pages (extracted content), not only titles, links and snippets. | |
| min_requests_per_minute | No | Minimum request rate the plan must allow, per minute. | |
| browser_seconds_per_page | No | Browser time per page in seconds, for headless-browser products billed by time. Every plan must then serve pages that take this long: a hosted browser does, a request-based API only when one request may run that long. | |
| realtime_search_required | No | Search results must be returned in real time (not through a queue). | |
| target_errors_not_billed | No | Error responses from the target site (e.g. 404) must not be billed. | |
| needs_recurring_free_tier | No | The plan must be usable every month without paying (a free plan with a monthly allowance or a monthly free credit). | |
| failed_requests_not_billed | No | Requests that fail on the provider side (timeouts, blocks, 5xx) must not be billed. A flat monthly price for unlimited requests meets it, since no request is billed on its own; when only success-based billing will do, use only_successful_requests_billed. | |
| structured_extraction_pages | No | How many of the pages must come back as JSON fields rather than HTML or text, by any method the plan offers (CSS or XPath selectors, a schema, or AI). When the fields must be found without writing selectors, use ai_extraction_pages instead; each page counts in one of the two. | |
| only_successful_requests_billed | No | Billing must count successful requests only: each successful request is charged (or draws credits) and failed ones cost nothing. A flat monthly price for unlimited requests does not meet it, since the price is the same whatever succeeds. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only cover the safety profile (readOnly, idempotent, non-destructive, closed-world), and the description adds substantive behavior on top: per-condition verdicts of met/not met/unknown with the official source sentence, a purchase link, the cheapest qualifying plan of the same product, a 20-plan cap, and candidate resolution instead of guessing on ambiguous names/URLs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The when/when-not framing is front-loaded and the return-value sentence is well placed, but the definition is repetitive: the 'call it right before choosing or buying' directive and the plan-identifier enumeration both appear twice, adding length without new information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 58-parameter tool with a rich output schema, the description covers selection, scope limits, ambiguity handling and expected output adequately. It does not touch the workload inputs (monthly_emails, monthly_pages, etc.), but the exhaustive schema and output schema carry that burden.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all 58 parameters and their semantics in depth. The description restates the plans-vs-offer_ids choice and the brief format behavior but adds no syntax or format detail the schema lacks, making the baseline 3 appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Check specific plans ... against the workload and conditions') and enumerates the accepted identifiers (plan id, plan name, pricing-page URL). It also explicitly differentiates itself from the sibling search tool, so an agent can tell them apart without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides an explicit 'Use this when' (user names specific plans and wants to know if they meet the load, or which same-product plan is cheapest that does) and a 'Do not use this when' routing to search for users with no plans in mind. It also specifies timing ('right before you choose or buy') and a fallback for pre-existing candidates (offer_ids from web search).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cost_scenariosPlan costs as the workload changesARead-onlyIdempotentInspect
Use this when: the user asks how the cost changes as the workload grows or shifts, or at what volume another plan becomes the cheapest. Do not use this when: the workload is fixed (use search). Show how API plan costs change when the monthly workload changes, for example twice the pages or a larger share of JavaScript pages. Along the path from the current to a target workload it returns the cheapest fully matching plan at both ends, each workload where the cheapest plan changes, and for tracked plans where the cost first steps up, where the plan can no longer cover the volume and where the budget is exceeded. Costs follow published pricing rules (whole packs of extra credits, per-period pack limits, per-connection browser billing, monthly minimums) with official source sentences. Example: 10,000 searches a month growing to 200,000.
| Name | Required | Description | Default |
|---|---|---|---|
| scale | No | Multiply every monthly count by this factor for the end of the path, e.g. 2 for twice the current workload. Give target or scale. | |
| detail | No | summary returns one source sentence per fact; full returns every recorded fact and sentence. | summary |
| target | No | Workload at the end of the path; fields not given keep their current value. Give target or scale. | |
| mcp_auth | No | Ways to authenticate to the provider's hosted MCP endpoint, any one of which will do: api_key, oauth. Met when the endpoint accepts at least one of them; implies a hosted endpoint. | |
| needs_zdr | No | Zero data retention must be usable on this plan. A provider that offers it only on a custom enterprise agreement does not meet it on its listed plans. | |
| offer_ids | No | Compare only these plans and follow each of them along the path. Default: every plan that can serve the workload, following the cheapest full match at the start. | |
| preferred | No | Nice-to-have conditions; they do not filter, they break ties. | |
| needs_soc2 | No | The provider must hold a SOC 2 report: true for Type I or Type II, "II" for Type II. | |
| needs_batch | No | The plan must transcribe recorded audio (a file or a stored recording), for speech-to-text. A plan priced for live audio only is not met. | |
| data_regions | No | Regions where data must be stored or processed, e.g. ["EU"]. Different from exit-IP countries. | |
| needs_korean | No | The service must voice Korean text (text-to-speech) or transcribe Korean speech (speech-to-text). | |
| billing_types | No | Acceptable billing: monthly_subscription (A plan with a fixed fee (or minimum commitment) billed every month.) annual_subscription (A plan paid for a year at a time.) pay_as_you_go (No plan fee; a price per unit of use, billed after use or drawn from a balance topped up with any amount.) prepaid_credits (Money paid before use: a credit pack, a balance topped up first, or a plan amount charged in advance for the period.) Free plans always qualify. | |
| monthly_pages | No | Pages per month by type: plain_html (static pages), javascript (needs rendering), premium_proxy (blocked sites that need residential/premium proxies), javascript_premium_proxy (both). | |
| needs_inbound | No | The service must receive email for the buyer and hand it on (inbound parsing, routes), for transactional email. | |
| product_types | No | Limit to these product types. Default: every type that can serve the workload. | |
| search_engines | No | Search engines whose results the plan must return, each at the plan's search price: google, bing, yahoo, yandex, baidu, duckduckgo, naver, brave (brave is Brave's own index). monthly_searches is the total over all of them. | |
| captcha_solving | No | The plan must solve CAPTCHAs for the browser sessions (the vendor does it, not the buyer own service). | |
| min_concurrency | No | Minimum number of concurrent requests (or browsers) the plan must allow. | |
| needs_streaming | No | The service must return audio in real time as it is made (streaming or a WebSocket), for text-to-speech; for speech-to-text, it must transcribe live audio as it arrives. A speech-to-text price line is per mode, so a plan priced for recorded audio only is not met. | |
| monthly_searches | No | Search requests per month (one results page each). | |
| needs_remote_mcp | No | The provider must host a remote MCP endpoint (a URL an MCP client connects to). An official server that can only be run on the buyer own machine does not meet it. | |
| proxies_included | No | The plan must include proxy traffic of the vendor (some gigabytes in the plan fee). Proxy traffic sold only per gigabyte on top of the fee, or only on another plan, does not count. | |
| search_countries | No | ISO 3166-1 alpha-2 codes of the countries whose search results the searches must return (the search engine's country setting, e.g. Google gl), e.g. ["GB","CA"]. Different from exit_ip_countries. | |
| exit_ip_countries | No | ISO 3166-1 alpha-2 codes of countries the page requests must exit from, e.g. ["US","DE"]. For search results of a country use search_countries. | |
| min_pages_per_doc | No | Pages one document may have at the most the plan allows, for document parsing. Met when the stated limit is at least this many (or the pages say there is no page limit); a plan whose pages do not state a limit is unknown. The limit of the largest way of sending (batch or asynchronous) counts. | |
| needs_diarization | No | The plan must label who spoke (speaker diarization), for speech-to-text. Where the vendor charges extra for it, the extra price is added to the monthly cost; where the pages state no price or no inclusion the plan is unknown. | |
| needs_no_training | No | An official page must say the vendor does not use the buyer's text, audio or documents to train its models without the buyer opting in. A use that is on by default with an opt-out to ask for does not count. | |
| session_recording | No | The plan must record browser sessions (video or replay) that the buyer can watch afterwards. | |
| needs_dedicated_ip | No | The plan must come with a dedicated sending IP address, for transactional email. A dedicated IP sold only as an add-on on top of the plan, or only on another plan, does not count. | |
| needs_official_mcp | No | The provider must publish its own MCP server (hosted by it or run by the buyer), stated in its official documentation. A server only a third party published does not count. | |
| ai_extraction_pages | No | How many of the pages need their fields extracted by an AI model (from a prompt or a schema, or automatically) without writing selectors. Each page counts in one of the two extraction fields. | |
| min_pages_per_crawl | No | Pages one crawl job (from one start URL, following links) must be able to reach. A plan whose crawl has no page cap meets any number; give the size of the largest site to crawl. Different from the monthly page total. | |
| min_sending_domains | No | Sending domains the plan must let one account authenticate, for transactional email. Met when the stated limit is at least this many (or the pages say it is unlimited); a plan whose pages do not state a limit is unknown. | |
| min_session_minutes | No | Minutes one browser session must be able to run on this plan, for hosted browsers. Met when the stated longest session of the plan is at least this long; a plan whose pages do not state a session limit is unknown, and a limit the page gives only for another plan is not met. | |
| monthly_pages_total | No | Total pages per month when the split by type is not known yet. Costs and verdicts then cover every share of JavaScript-rendered pages from 0% to 100% of the total (no premium proxies), and the result lists monthly_pages under needs_input. | |
| needs_voice_cloning | No | The plan must let the account clone a voice from its own recording, for text-to-speech. Cloning limited to eligible customers, a request form or an enterprise plan does not count for a plan that is not that plan. | |
| persistent_profiles | No | The plan must keep browser profiles (login state, cookies) between sessions. | |
| search_result_types | No | Result types the parsed search response must contain: organic, ads, local_pack, knowledge_graph, people_also_ask, related_searches, shopping, news, images, videos, ai_overview. | |
| max_monthly_cost_usd | No | Monthly budget in USD before tax. Compared with listed prices; annual plans use their per-month equivalent. | |
| needs_batch_discount | No | An official page must say a batch or asynchronous way of sending documents costs less than the list price on the plan, for document parsing. The budget and the cost are judged at the list price, not at the batch price. | |
| needs_commercial_use | No | The plan must allow commercial use of the generated audio, for text-to-speech. A free plan limited to non-commercial use does not count; a plan whose pages do not say is unknown. | |
| needs_no_min_billing | No | An official page must say audio is billed by the second (or an increment of seconds) with no minimum billed duration per request, for speech-to-text. A page that says nothing about rounding is unknown. | |
| max_overage_usd_per_1k | No | The most the plan may charge for each 1,000 emails beyond its included volume, in USD, for transactional email. A plan whose extra price is not published as a per-1,000 figure is unknown. | |
| min_log_retention_days | No | Days the plan must keep the logs or events of sent email where the account can read them, for transactional email. Longer retention sold as an add-on does not count. | |
| needs_table_extraction | No | The service must return the tables of a page as structure (rows and cells), not only the text, for document parsing. | |
| search_returns_content | No | The search response itself must carry the text of the result pages (extracted content), not only titles, links and snippets. | |
| min_requests_per_minute | No | Minimum request rate the plan must allow, per minute. | |
| browser_seconds_per_page | No | Browser time per page in seconds, for headless-browser products billed by time. Every plan must then serve pages that take this long: a hosted browser does, a request-based API only when one request may run that long. | |
| realtime_search_required | No | Search results must be returned in real time (not through a queue). | |
| target_errors_not_billed | No | Error responses from the target site (e.g. 404) must not be billed. | |
| needs_recurring_free_tier | No | The plan must be usable every month without paying (a free plan with a monthly allowance or a monthly free credit). | |
| failed_requests_not_billed | No | Requests that fail on the provider side (timeouts, blocks, 5xx) must not be billed. A flat monthly price for unlimited requests meets it, since no request is billed on its own; when only success-based billing will do, use only_successful_requests_billed. | |
| structured_extraction_pages | No | How many of the pages must come back as JSON fields rather than HTML or text, by any method the plan offers (CSS or XPath selectors, a schema, or AI). When the fields must be found without writing selectors, use ai_extraction_pages instead; each page counts in one of the two. | |
| only_successful_requests_billed | No | Billing must count successful requests only: each successful request is charged (or draws credits) and failed ones cost nothing. A flat monthly price for unlimited requests does not meet it, since the price is the same whatever succeeds. |
Output Schema
| Name | Required | Description |
|---|---|---|
| path | Yes | |
| as_of | Yes | |
| notes | Yes | |
| plans | Yes | Every plan named above, with the official facts its costs were computed from. |
| at_end | Yes | Up to three cheapest full matches at the target workload. |
| counts | Yes | |
| request | No | |
| tracked | Yes | |
| at_start | Yes | Up to three cheapest full matches at the current workload. |
| compared | Yes | |
| switches | Yes | Each workload on the path where the cheapest full match changes. |
| link_notes | No | The note of each link level (link.link_level) of the plans in this result, stated once. |
| assumptions | Yes | |
| needs_input | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint/idempotentHint/destructiveHint=false and openWorldHint=false, so the safety profile is covered. The description goes further by disclosing the pricing model actually applied (whole packs of extra credits, per-period pack limits, per-connection browser billing, monthly minimums) and that costs are backed by official source sentences, which the annotations cannot convey. It stops short of noting how tie-breaking or unknown-plan cases are reported.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The when/when-not routing is front-loaded in the first two clauses, and the example at the end anchors the abstract path language. The middle paragraph is dense and enumerates the pricing rules in one long sentence, but every clause carries information an agent needs to interpret the result.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 54-parameter, nested-schema tool with an output schema present, the description covers the essentials: the growth-path framing, what is returned, the pricing rules and the official-source guarantee. Return-shape details are legitimately delegated to the output schema. Only tie-breaking and behavior when plans cannot serve the workload are left implicit.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% across 54 parameters, so the schema already carries the parameter documentation burden. The description only illustrates scale/target usage ('twice the pages or a larger share of JavaScript pages', '10,000 searches a month growing to 200,000'), which adds concreteness but no semantics the schema lacks. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb+resource ('show how API plan costs change when the monthly workload changes') and states exactly what is produced: the cheapest fully matching plan at both ends, each workload where the cheapest plan changes, and the step-up/coverage/budget thresholds. This is clearly distinguishable from siblings like search and check_conditions, which evaluate fixed conditions rather than a growth path.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit routing is given in both directions: 'Use this when: the user asks how the cost changes as the workload grows or shifts' and 'Do not use this when: the workload is fixed (use search)', naming the alternative tool and the condition that selects it. Nothing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_detailsGet recorded conditions of a plan or productARead-onlyIdempotentInspect
Use this when: you need every recorded condition, pricing rule and source sentence of one plan or product found by search or named by the user. Do not use this when: you want to compare plans against a workload (use search or check_conditions). Get every recorded condition for one API plan or product: value, which plans it applies to, exceptions, official source sentence, check date and purchase link. A product too long for one response comes with one source sentence per fact. Example: every recorded condition of 1 plan found by search.
| Name | Required | Description | Default |
|---|---|---|---|
| offer_id | No | A plan id, e.g. "firecrawl-standard". | |
| product_id | No | A product id, e.g. "firecrawl-api". |
Output Schema
| Name | Required | Description |
|---|---|---|
| as_of | Yes | |
| offers | Yes | |
| product | Yes | |
| provider | Yes | |
| link_notes | No | The note of each link level (link.link_level) of the plans in this result, stated once. |
| evidence_detail | No | Present when the product was too long for one response: each fact carries one source sentence. Ask for a plan by offer_id for every sentence. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive and closed-world, so safety is covered. The description adds real behavioral context beyond that: the exact returned fields (value, applicable plans, exceptions, source sentence, check date, purchase link) and the truncation rule that a long product ships one source sentence per fact.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded appropriately with the when/when-not framing, but the phrase 'every recorded condition' recurs three times (when-clause, main sentence, example) and the example sentence restates the opening. The repetition dilutes an otherwise tight structure.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With a full output schema and full annotation coverage, the description only needs to add selection and behavior context, which it largely does. It is complete enough to call correctly, though the input parameter contract is left entirely to the structured fields.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the schema's own description already states 'Give exactly one of offer_id or product_id', so the required semantics are fully documented in structured data. The description only alludes to the input indirectly ('found by search or named by the user') without adding format or mutual-exclusion detail beyond the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource (get every recorded condition, pricing rule and source sentence of one plan or product) and explicitly distinguishes itself from siblings by naming search and check_conditions for the comparison use case. An agent can tell it apart from check_conditions or cost_scenarios without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Uses an explicit 'Use this when / Do not use this when' pattern, names the alternative tools (search, check_conditions) for the excluded case, and gives a concrete example scenario. The routing decision is fully specified.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
relax_conditionsSmallest condition changes that admit plansARead-onlyIdempotentInspect
Use this when: search finds no plan or too few plans and the user wants to know which condition to loosen and by how much. Do not use this when: plans already match (use search or check_conditions). When no API plan, or too few API plans, meet every required condition: for each condition the user can change, returns the smallest change that lets at least one plan meet everything (for example the monthly budget needed, the concurrency available, or one exit-IP country to drop) and the plans it admits with their monthly cost. Also lists plans that fail only because a condition is not stated on the official pages, with the pages checked and the check date, so the user can confirm with the provider. Example: no plan meets 5,000 hours of audio a month under $100.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum plans listed for each change and under confirm_with_provider (default 3). | |
| detail | No | summary returns one source sentence per fact; full returns every recorded fact and sentence. | summary |
| mcp_auth | No | Ways to authenticate to the provider's hosted MCP endpoint, any one of which will do: api_key, oauth. Met when the endpoint accepts at least one of them; implies a hosted endpoint. | |
| needs_zdr | No | Zero data retention must be usable on this plan. A provider that offers it only on a custom enterprise agreement does not meet it on its listed plans. | |
| preferred | No | Nice-to-have conditions; they do not filter, they break ties. | |
| needs_soc2 | No | The provider must hold a SOC 2 report: true for Type I or Type II, "II" for Type II. | |
| negotiable | No | Conditions the user said can change: monthly_volume, concurrency, rate_limit, monthly_budget, billing_type, free_allowance, failed_request_billing, success_billing, target_error_billing, geo_targeting, data_region, serp_response_mode, serp_localization, serp_result_types, serp_engines, crawl_page_limit, mcp_official, mcp_remote, mcp_auth, zdr, soc2, search_content, min_session_minutes, proxies_included, captcha_solving, session_recording, persistent_profiles, dedicated_ip, sending_domains, log_retention_days, inbound_parse, overage_per_1k, commercial_use, voice_cloning, streaming, languages_ko, data_not_used_for_training, batch, diarization, no_min_billing, batch_discount, max_pages_per_doc, table_extraction. Default: every required condition, each marked ask_user because the user has not said it can change. | |
| needs_batch | No | The plan must transcribe recorded audio (a file or a stored recording), for speech-to-text. A plan priced for live audio only is not met. | |
| data_regions | No | Regions where data must be stored or processed, e.g. ["EU"]. Different from exit-IP countries. | |
| needs_korean | No | The service must voice Korean text (text-to-speech) or transcribe Korean speech (speech-to-text). | |
| billing_types | No | Acceptable billing: monthly_subscription (A plan with a fixed fee (or minimum commitment) billed every month.) annual_subscription (A plan paid for a year at a time.) pay_as_you_go (No plan fee; a price per unit of use, billed after use or drawn from a balance topped up with any amount.) prepaid_credits (Money paid before use: a credit pack, a balance topped up first, or a plan amount charged in advance for the period.) Free plans always qualify. | |
| monthly_pages | No | Pages per month by type: plain_html (static pages), javascript (needs rendering), premium_proxy (blocked sites that need residential/premium proxies), javascript_premium_proxy (both). | |
| needs_inbound | No | The service must receive email for the buyer and hand it on (inbound parsing, routes), for transactional email. | |
| product_types | No | Limit to these product types. Default: every type that can serve the workload. | |
| search_engines | No | Search engines whose results the plan must return, each at the plan's search price: google, bing, yahoo, yandex, baidu, duckduckgo, naver, brave (brave is Brave's own index). monthly_searches is the total over all of them. | |
| captcha_solving | No | The plan must solve CAPTCHAs for the browser sessions (the vendor does it, not the buyer own service). | |
| min_concurrency | No | Minimum number of concurrent requests (or browsers) the plan must allow. | |
| needs_streaming | No | The service must return audio in real time as it is made (streaming or a WebSocket), for text-to-speech; for speech-to-text, it must transcribe live audio as it arrives. A speech-to-text price line is per mode, so a plan priced for recorded audio only is not met. | |
| monthly_searches | No | Search requests per month (one results page each). | |
| needs_remote_mcp | No | The provider must host a remote MCP endpoint (a URL an MCP client connects to). An official server that can only be run on the buyer own machine does not meet it. | |
| proxies_included | No | The plan must include proxy traffic of the vendor (some gigabytes in the plan fee). Proxy traffic sold only per gigabyte on top of the fee, or only on another plan, does not count. | |
| search_countries | No | ISO 3166-1 alpha-2 codes of the countries whose search results the searches must return (the search engine's country setting, e.g. Google gl), e.g. ["GB","CA"]. Different from exit_ip_countries. | |
| exit_ip_countries | No | ISO 3166-1 alpha-2 codes of countries the page requests must exit from, e.g. ["US","DE"]. For search results of a country use search_countries. | |
| min_pages_per_doc | No | Pages one document may have at the most the plan allows, for document parsing. Met when the stated limit is at least this many (or the pages say there is no page limit); a plan whose pages do not state a limit is unknown. The limit of the largest way of sending (batch or asynchronous) counts. | |
| needs_diarization | No | The plan must label who spoke (speaker diarization), for speech-to-text. Where the vendor charges extra for it, the extra price is added to the monthly cost; where the pages state no price or no inclusion the plan is unknown. | |
| needs_no_training | No | An official page must say the vendor does not use the buyer's text, audio or documents to train its models without the buyer opting in. A use that is on by default with an opt-out to ask for does not count. | |
| session_recording | No | The plan must record browser sessions (video or replay) that the buyer can watch afterwards. | |
| needs_dedicated_ip | No | The plan must come with a dedicated sending IP address, for transactional email. A dedicated IP sold only as an add-on on top of the plan, or only on another plan, does not count. | |
| needs_official_mcp | No | The provider must publish its own MCP server (hosted by it or run by the buyer), stated in its official documentation. A server only a third party published does not count. | |
| ai_extraction_pages | No | How many of the pages need their fields extracted by an AI model (from a prompt or a schema, or automatically) without writing selectors. Each page counts in one of the two extraction fields. | |
| min_pages_per_crawl | No | Pages one crawl job (from one start URL, following links) must be able to reach. A plan whose crawl has no page cap meets any number; give the size of the largest site to crawl. Different from the monthly page total. | |
| min_sending_domains | No | Sending domains the plan must let one account authenticate, for transactional email. Met when the stated limit is at least this many (or the pages say it is unlimited); a plan whose pages do not state a limit is unknown. | |
| min_session_minutes | No | Minutes one browser session must be able to run on this plan, for hosted browsers. Met when the stated longest session of the plan is at least this long; a plan whose pages do not state a session limit is unknown, and a limit the page gives only for another plan is not met. | |
| monthly_pages_total | No | Total pages per month when the split by type is not known yet. Costs and verdicts then cover every share of JavaScript-rendered pages from 0% to 100% of the total (no premium proxies), and the result lists monthly_pages under needs_input. | |
| needs_voice_cloning | No | The plan must let the account clone a voice from its own recording, for text-to-speech. Cloning limited to eligible customers, a request form or an enterprise plan does not count for a plan that is not that plan. | |
| persistent_profiles | No | The plan must keep browser profiles (login state, cookies) between sessions. | |
| search_result_types | No | Result types the parsed search response must contain: organic, ads, local_pack, knowledge_graph, people_also_ask, related_searches, shopping, news, images, videos, ai_overview. | |
| max_monthly_cost_usd | No | Monthly budget in USD before tax. Compared with listed prices; annual plans use their per-month equivalent. | |
| needs_batch_discount | No | An official page must say a batch or asynchronous way of sending documents costs less than the list price on the plan, for document parsing. The budget and the cost are judged at the list price, not at the batch price. | |
| needs_commercial_use | No | The plan must allow commercial use of the generated audio, for text-to-speech. A free plan limited to non-commercial use does not count; a plan whose pages do not say is unknown. | |
| needs_no_min_billing | No | An official page must say audio is billed by the second (or an increment of seconds) with no minimum billed duration per request, for speech-to-text. A page that says nothing about rounding is unknown. | |
| max_overage_usd_per_1k | No | The most the plan may charge for each 1,000 emails beyond its included volume, in USD, for transactional email. A plan whose extra price is not published as a per-1,000 figure is unknown. | |
| min_log_retention_days | No | Days the plan must keep the logs or events of sent email where the account can read them, for transactional email. Longer retention sold as an add-on does not count. | |
| needs_table_extraction | No | The service must return the tables of a page as structure (rows and cells), not only the text, for document parsing. | |
| search_returns_content | No | The search response itself must carry the text of the result pages (extracted content), not only titles, links and snippets. | |
| min_requests_per_minute | No | Minimum request rate the plan must allow, per minute. | |
| browser_seconds_per_page | No | Browser time per page in seconds, for headless-browser products billed by time. Every plan must then serve pages that take this long: a hosted browser does, a request-based API only when one request may run that long. | |
| realtime_search_required | No | Search results must be returned in real time (not through a queue). | |
| target_errors_not_billed | No | Error responses from the target site (e.g. 404) must not be billed. | |
| needs_recurring_free_tier | No | The plan must be usable every month without paying (a free plan with a monthly allowance or a monthly free credit). | |
| failed_requests_not_billed | No | Requests that fail on the provider side (timeouts, blocks, 5xx) must not be billed. A flat monthly price for unlimited requests meets it, since no request is billed on its own; when only success-based billing will do, use only_successful_requests_billed. | |
| structured_extraction_pages | No | How many of the pages must come back as JSON fields rather than HTML or text, by any method the plan offers (CSS or XPath selectors, a schema, or AI). When the fields must be found without writing selectors, use ai_extraction_pages instead; each page counts in one of the two. | |
| only_successful_requests_billed | No | Billing must count successful requests only: each successful request is charged (or draws credits) and failed ones cost nothing. A flat monthly price for unlimited requests does not meet it, since the price is the same whatever succeeds. |
Output Schema
| Name | Required | Description |
|---|---|---|
| as_of | Yes | |
| notes | Yes | |
| counts | Yes | |
| changes | Yes | |
| request | No | |
| link_notes | No | The note of each link level (link.link_level) of the plans in this result, stated once. |
| assumptions | Yes | |
| needs_input | Yes | |
| confirm_with_provider | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false, so the safety profile is covered; the description still adds substantive behavior: it returns the minimal loosening per condition plus the plans it admits with cost, and separately lists plans failing only because a condition is not stated on official pages, with pages checked and check date. It does not discuss rate limits or the cost of the computation, hence not a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with when-to-use and when-not before behavior and an example; nearly every sentence earns its place. Slightly dense and the phrasing 'no API plan, or too few API plans' is a little awkward, but no real padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained, yet the description explains the two result classes (smallest change + admitted plans, and unstated-condition plans with sources) and the unknown/confirm-with-provider fallback. It never states that the original conditions are passed through the same parameter set, a minor gap for a 53-parameter tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds semantics the schema cannot: it names the kinds of change returned (monthly budget, concurrency, one exit-IP country) and ties them to the negotiable/required condition split, clarifying that only conditions the user can change are loosened.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource (return the smallest change per changeable condition that admits plans) and explicitly contrasts itself with siblings search and check_conditions. An agent can tell it apart from check_conditions without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Opens with an explicit 'Use this when' (search finds no plan or too few) and 'Do not use this when: plans already match (use search or check_conditions)', naming the alternatives and the selecting condition.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
searchFind API plans by conditionsARead-onlyIdempotentInspect
Call this right before choosing or buying an API plan: it returns, for each plan, whether it meets every condition, the monthly cost, and the official sentence behind each verdict. Use this when: the user wants to know which API plans (web scraping, SERP, web search, browser infrastructure, transactional email, text-to-speech, speech-to-text, document parsing) fit a monthly workload, budget or required conditions, or what one would cost per month at that workload. Do not use this when: the user wants to scrape, search the web, send email, generate speech, transcribe audio or parse a document itself (this tool reads no pages and calls no provider), needs proxies only, or asks about an API outside these fields. Call it right before you choose or buy a tool or plan; format "brief" returns a short answer. Find API plans (web scraping, SERP, web search, browser infrastructure, transactional email, text-to-speech, speech-to-text, document parsing) that meet required conditions: monthly pages by type (plain HTML, JavaScript rendering, blocked sites that need premium proxies), monthly searches, concurrency, requests per minute, monthly budget before tax, billing type, exit-IP countries, search engines, search-result countries and parsed result types, pages per crawl, data storage region and structured (JSON) or AI extraction. Browser infrastructure is asked in monthly browser hours, transactional email in monthly emails, text-to-speech in monthly characters, speech-to-text in monthly audio hours and document parsing in monthly document pages, each with its own conditions (for example session length, dedicated IP, voice cloning, Korean, live or recorded audio, speaker labels, pages per document, table extraction, batch discount). For search APIs it also checks the agent connection: an official or remote (hosted) MCP server and how it signs in (API key or OAuth), zero data retention on the plan, a SOC 2 report, and whether results carry the page text. Returns each plan's monthly cost, whether it meets every required condition, and for every condition met / not met / unknown with the official source sentence and check date, plus a purchase link. Plans with an unknown required condition are listed separately as partial matches. If nothing matches, returns how many plans each condition excluded and the cheapest plan that meets all the other conditions. If you already have candidate plans or providers (for example from a web search), pass them as providers (search) or offer_ids (check_conditions) so that only those are judged. Hosts that support MCP Apps show the result as a comparison card. Example: 50,000 SERP searches a month in GB under $100; 300 hours of Korean audio a month with speaker labels.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum plans returned in each list (default and maximum 5). | |
| detail | No | summary returns one source sentence per fact; full returns every recorded fact and sentence. | summary |
| format | No | brief returns, per plan, the plan, provider, whether it meets all, the monthly cost and the requested conditions only, each with its verdict, a one-line reason, one source sentence and its source (about a quarter of the full size); the verdicts and costs are those of full. Call it right before choosing or buying a plan. | full |
| mcp_auth | No | Ways to authenticate to the provider's hosted MCP endpoint, any one of which will do: api_key, oauth. Met when the endpoint accepts at least one of them; implies a hosted endpoint. | |
| needs_zdr | No | Zero data retention must be usable on this plan. A provider that offers it only on a custom enterprise agreement does not meet it on its listed plans. | |
| preferred | No | Nice-to-have conditions; they do not filter, they break ties. | |
| providers | No | Judge only the plans of these providers (candidates you already have, for example from a web search). Give provider ids or names as listed, such as "tavily", "Brave Search API" or "You.com"; case does not matter. Names that are not providers here are listed under unknown_providers in the result. | |
| needs_soc2 | No | The provider must hold a SOC 2 report: true for Type I or Type II, "II" for Type II. | |
| needs_batch | No | The plan must transcribe recorded audio (a file or a stored recording), for speech-to-text. A plan priced for live audio only is not met. | |
| data_regions | No | Regions where data must be stored or processed, e.g. ["EU"]. Different from exit-IP countries. | |
| needs_korean | No | The service must voice Korean text (text-to-speech) or transcribe Korean speech (speech-to-text). | |
| billing_types | No | Acceptable billing: monthly_subscription (A plan with a fixed fee (or minimum commitment) billed every month.) annual_subscription (A plan paid for a year at a time.) pay_as_you_go (No plan fee; a price per unit of use, billed after use or drawn from a balance topped up with any amount.) prepaid_credits (Money paid before use: a credit pack, a balance topped up first, or a plan amount charged in advance for the period.) Free plans always qualify. | |
| monthly_pages | No | Pages per month by type: plain_html (static pages), javascript (needs rendering), premium_proxy (blocked sites that need residential/premium proxies), javascript_premium_proxy (both). | |
| needs_inbound | No | The service must receive email for the buyer and hand it on (inbound parsing, routes), for transactional email. | |
| product_types | No | Limit to these product types. Default: every type that can serve the workload. | |
| monthly_emails | No | Emails sent per month, for transactional email APIs (SendGrid, Mailgun, Postmark, Resend, Amazon SES, Brevo, Mailtrap, Loops). It is the whole workload: give it instead of monthly_pages, monthly_searches and monthly_browser_hours, not with them. Only email products can serve it; other products are out of scope. | |
| search_engines | No | Search engines whose results the plan must return, each at the plan's search price: google, bing, yahoo, yandex, baidu, duckduckgo, naver, brave (brave is Brave's own index). monthly_searches is the total over all of them. | |
| captcha_solving | No | The plan must solve CAPTCHAs for the browser sessions (the vendor does it, not the buyer own service). | |
| min_concurrency | No | Minimum number of concurrent requests (or browsers) the plan must allow. | |
| needs_streaming | No | The service must return audio in real time as it is made (streaming or a WebSocket), for text-to-speech; for speech-to-text, it must transcribe live audio as it arrives. A speech-to-text price line is per mode, so a plan priced for recorded audio only is not met. | |
| monthly_searches | No | Search requests per month (one results page each). | |
| needs_remote_mcp | No | The provider must host a remote MCP endpoint (a URL an MCP client connects to). An official server that can only be run on the buyer own machine does not meet it. | |
| proxies_included | No | The plan must include proxy traffic of the vendor (some gigabytes in the plan fee). Proxy traffic sold only per gigabyte on top of the fee, or only on another plan, does not count. | |
| search_countries | No | ISO 3166-1 alpha-2 codes of the countries whose search results the searches must return (the search engine's country setting, e.g. Google gl), e.g. ["GB","CA"]. Different from exit_ip_countries. | |
| exit_ip_countries | No | ISO 3166-1 alpha-2 codes of countries the page requests must exit from, e.g. ["US","DE"]. For search results of a country use search_countries. | |
| min_pages_per_doc | No | Pages one document may have at the most the plan allows, for document parsing. Met when the stated limit is at least this many (or the pages say there is no page limit); a plan whose pages do not state a limit is unknown. The limit of the largest way of sending (batch or asynchronous) counts. | |
| needs_diarization | No | The plan must label who spoke (speaker diarization), for speech-to-text. Where the vendor charges extra for it, the extra price is added to the monthly cost; where the pages state no price or no inclusion the plan is unknown. | |
| needs_no_training | No | An official page must say the vendor does not use the buyer's text, audio or documents to train its models without the buyer opting in. A use that is on by default with an opt-out to ask for does not count. | |
| session_recording | No | The plan must record browser sessions (video or replay) that the buyer can watch afterwards. | |
| monthly_characters | No | Characters of text voiced per month, for text-to-speech APIs (ElevenLabs, Cartesia, Deepgram Aura, OpenAI, Google Cloud, Amazon Polly, Azure, Gradium, Rime, Inworld, MiniMax, Murf, Hume). It is the whole workload: give it instead of monthly_pages, monthly_searches, monthly_browser_hours and monthly_emails, not with them. Only text-to-speech products can serve it; other products are out of scope. | |
| needs_dedicated_ip | No | The plan must come with a dedicated sending IP address, for transactional email. A dedicated IP sold only as an add-on on top of the plan, or only on another plan, does not count. | |
| needs_official_mcp | No | The provider must publish its own MCP server (hosted by it or run by the buyer), stated in its official documentation. A server only a third party published does not count. | |
| ai_extraction_pages | No | How many of the pages need their fields extracted by an AI model (from a prompt or a schema, or automatically) without writing selectors. Each page counts in one of the two extraction fields. | |
| min_pages_per_crawl | No | Pages one crawl job (from one start URL, following links) must be able to reach. A plan whose crawl has no page cap meets any number; give the size of the largest site to crawl. Different from the monthly page total. | |
| min_sending_domains | No | Sending domains the plan must let one account authenticate, for transactional email. Met when the stated limit is at least this many (or the pages say it is unlimited); a plan whose pages do not state a limit is unknown. | |
| min_session_minutes | No | Minutes one browser session must be able to run on this plan, for hosted browsers. Met when the stated longest session of the plan is at least this long; a plan whose pages do not state a session limit is unknown, and a limit the page gives only for another plan is not met. | |
| monthly_audio_hours | No | Hours of audio transcribed per month, for speech-to-text APIs (Deepgram, AssemblyAI, Speechmatics, Amazon Transcribe, Google Cloud, OpenAI). A price given per minute is multiplied by 60. It is the whole workload: give it instead of monthly_pages, monthly_searches, monthly_browser_hours, monthly_emails and monthly_characters, not with them. Only speech-to-text products can serve it; other products are out of scope. | |
| monthly_pages_total | No | Total pages per month when the split by type is not known yet. Costs and verdicts then cover every share of JavaScript-rendered pages from 0% to 100% of the total (no premium proxies), and the result lists monthly_pages under needs_input. | |
| needs_voice_cloning | No | The plan must let the account clone a voice from its own recording, for text-to-speech. Cloning limited to eligible customers, a request form or an enterprise plan does not count for a plan that is not that plan. | |
| persistent_profiles | No | The plan must keep browser profiles (login state, cookies) between sessions. | |
| search_result_types | No | Result types the parsed search response must contain: organic, ads, local_pack, knowledge_graph, people_also_ask, related_searches, shopping, news, images, videos, ai_overview. | |
| max_monthly_cost_usd | No | Monthly budget in USD before tax. Compared with listed prices; annual plans use their per-month equivalent. | |
| needs_batch_discount | No | An official page must say a batch or asynchronous way of sending documents costs less than the list price on the plan, for document parsing. The budget and the cost are judged at the list price, not at the batch price. | |
| needs_commercial_use | No | The plan must allow commercial use of the generated audio, for text-to-speech. A free plan limited to non-commercial use does not count; a plan whose pages do not say is unknown. | |
| needs_no_min_billing | No | An official page must say audio is billed by the second (or an increment of seconds) with no minimum billed duration per request, for speech-to-text. A page that says nothing about rounding is unknown. | |
| monthly_browser_hours | No | Browser time per month in hours, for hosted browsers (Browserbase, Browserless) billed by browser time. It is the whole workload: give it instead of monthly_pages, monthly_searches and browser_seconds_per_page, not with them. Only browser products can serve it; other products are out of scope. | |
| max_overage_usd_per_1k | No | The most the plan may charge for each 1,000 emails beyond its included volume, in USD, for transactional email. A plan whose extra price is not published as a per-1,000 figure is unknown. | |
| min_log_retention_days | No | Days the plan must keep the logs or events of sent email where the account can read them, for transactional email. Longer retention sold as an add-on does not count. | |
| monthly_document_pages | No | Pages of documents parsed per month, for document-parsing APIs (LlamaParse, Reducto, Unstructured, Mistral OCR, LandingAI, Amazon Textract, Google Document AI, Azure Document Intelligence, Datalab, Mathpix, Mindee, Nanonets, Upstage). A price given per credit is multiplied by the credits one page costs. It is the whole workload: give it instead of monthly_pages, monthly_searches, monthly_browser_hours, monthly_emails, monthly_characters and monthly_audio_hours, not with them. Only document-parsing products can serve it; other products are out of scope. | |
| needs_table_extraction | No | The service must return the tables of a page as structure (rows and cells), not only the text, for document parsing. | |
| search_returns_content | No | The search response itself must carry the text of the result pages (extracted content), not only titles, links and snippets. | |
| min_requests_per_minute | No | Minimum request rate the plan must allow, per minute. | |
| browser_seconds_per_page | No | Browser time per page in seconds, for headless-browser products billed by time. Every plan must then serve pages that take this long: a hosted browser does, a request-based API only when one request may run that long. | |
| realtime_search_required | No | Search results must be returned in real time (not through a queue). | |
| target_errors_not_billed | No | Error responses from the target site (e.g. 404) must not be billed. | |
| needs_recurring_free_tier | No | The plan must be usable every month without paying (a free plan with a monthly allowance or a monthly free credit). | |
| failed_requests_not_billed | No | Requests that fail on the provider side (timeouts, blocks, 5xx) must not be billed. A flat monthly price for unlimited requests meets it, since no request is billed on its own; when only success-based billing will do, use only_successful_requests_billed. | |
| structured_extraction_pages | No | How many of the pages must come back as JSON fields rather than HTML or text, by any method the plan offers (CSS or XPath selectors, a schema, or AI). When the fields must be found without writing selectors, use ai_extraction_pages instead; each page counts in one of the two. | |
| only_successful_requests_billed | No | Billing must count successful requests only: each successful request is charged (or draws credits) and failed ones cost nothing. A flat monthly price for unlimited requests does not meet it, since the price is the same whatever succeeds. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, but the description goes well beyond them: it discloses how unknown conditions are surfaced (separate partial-match list), what happens on zero matches (per-condition exclusion counts plus the cheapest plan meeting the rest), and that the format param trades size for detail. These are real behavioral traits an agent cannot get from the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose/return statement is front-loaded and the when/when-not structure is easy to scan, but the body is roughly 500 words with visible redundancy: the full product-type list appears twice verbatim, and 'call it right before choosing or buying' is stated twice. Those repeated blocks should have been cut.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 59-parameter, all-optional query over a complex domain with an output schema present, the description covers what matters: the product taxonomy, which workload parameter applies to which product, unknown/partial-match handling, the no-match fallback, and the brief-vs-full format trade-off. Nothing needed to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description earns an extra point by mapping workload parameters to product families (browser hours, emails, characters, audio hours, document pages) and by giving worked examples ('50,000 SERP searches a month in GB under $100'; '300 hours of Korean audio a month with speaker labels') that tie several parameters together โ value beyond the field-level text.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb and resource โ find API plans that meet required conditions โ and spells out the exact output (per-plan verdict, monthly cost, official source sentence). It also frames the tool's role in the workflow ('call it right before choosing or buying a plan'), which separates it from data-returning siblings like get_details or verify_answer.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It has explicit 'Use this when' and 'Do not use this when' blocks, and the negative block is unusually concrete: it excludes scraping, searching, sending email, generating speech, transcribing audio and parsing documents, and states the reason ('this tool reads no pages and calls no provider'). It also routes the agent to siblings by naming providers (search) vs offer_ids (check_conditions).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
verify_answerCheck an answer's plan claims against the recorded factsARead-onlyIdempotentInspect
Use this when: you have drafted an answer that names API plans, costs or whether they meet the user's conditions, before you give it. Do not use this when: you have not looked up any plan yet (use search). Check what a drafted answer says about API plans against the recorded official facts, using the user's conditions as given in request. For each plan claim (plan id, name or pricing-page URL, with the stated billing, monthly cost, whether it meets every condition, single condition verdicts and recorded values) it returns conflicts with the official source sentences, the check date and a one-line fix: a plan not in the catalog, unmet or unknown conditions stated as met, met stated as unmet, a condition verdict, a cost outside the computed cost or range, or a value that differs. It also lists verdicts that rest on a derived value, official pages that disagree or a two-value price range (state the condition), plans it could not check (an ambiguous name returns the candidates), the cheapest plan that meets every condition when the answer does not name it, and words of the question that suggest a condition the request does not carry. Example: a drafted answer says 1 plan costs $49 a month for 100,000 emails.
| Name | Required | Description | Default |
|---|---|---|---|
| claims | Yes | One entry per plan the answer names, with what the answer says about it. | |
| request | Yes | The user's workload and required conditions as you understood them, in the search input format. Each claim is judged against these, not against earlier calls. | |
| question | No | The user's words, if available. Read only for words that suggest a condition the request does not carry. |
Output Schema
| Name | Required | Description |
|---|---|---|
| limits | Yes | Known gaps of the record that the request touches. They are not conflicts. |
| omitted | Yes | The cheapest plan that meets every required condition of the request, when the answer does not name it. |
| evidence | Yes | The official sentences ({source, quote}) of each fact id that conflicts and conditional refer to, once per fact. |
| conflicts | Yes | Claims the record contradicts or does not back. Correct each before giving the answer. facts are keys of evidence. |
| unchecked | Yes | Claims that could not be checked: an ambiguous name (candidates listed), a plan not in this catalog, a condition the request does not carry, a key with no recorded field, or claims past the result size limit (call again with them). |
| consistent | Yes | True when no claim conflicts with the record (all claims are judged, also those left out of this result for its size). |
| conditional | Yes | Verdicts or costs of the answer that rest on a derived value, official pages that disagree, or a price range of two official values. State the condition with the claim. |
| request_used | Yes | The request the claims were judged against. |
| checked_scope | Yes | What this call checked and what it did not. |
| request_may_omit | Yes | Words of the question that suggest a condition the request does not carry. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, closed-world and non-destructive, so the safety profile is covered. The description goes further by disclosing edge-case behavior the annotations do not: ambiguous plan names return candidates, some plans land in an unchecked bucket, derived-value verdicts and two-value price ranges are flagged, and the check date is returned. It leans heavily on enumerating outputs, which the output schema already carries, but the edge-case handling is real added value.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded correctly: trigger, anti-trigger, core action, then outcomes. The long middle 'For each plan claim (...)' enumeration is dense and partly duplicates the output schema, but the structure keeps the routing decision first and the detail after.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present the description need not explain return values, and it still covers the tricky behaviors an agent needs: what counts as a conflict, unverifiable plans, ambiguous-name handling, and the extra cheapest-plan and question-wording signals. Complete for a verification tool of this complexity, with only minor redundancy.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents request, claims, question and every claim field (plan, values, billing, meets_all, conditions, monthly_cost_usd). The description only restates that the user's conditions are used 'as given in request' and that claims carry 'stated billing, monthly cost, whether it meets every condition, single condition verdicts and recorded values' โ a mild restatement of the schema, not new syntax or format detail. Baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Starts with a precise trigger and a specific verb+resource: 'Check what a drafted answer says about API plans against the recorded official facts.' It also names the sibling it is not ('use search' when no plan has been looked up), so an agent can separate it from check_conditions and search without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit when ('you have drafted an answer that names API plans, costs or whether they meet the user's conditions, before you give it') and when-not ('you have not looked up any plan yet (use search)'), with the alternative tool named. Nothing is left to inference for the core decision.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
5 tool updates
- Changed
check_conditions9 fields changed- added
Input schema / properties / min_pages_per_docAdded value: +{ + "description": "Pages one document may have at the most the plan allows, for document parsing. Met when the stated limit is at least this many (or the pages say there is no page limit); a plan whose pages do not state a limit is unknown. The limit of the largest way of sending (batch or asynchronous) counts.", + "minimum": 1, + "type": "integer" +} - added
Input schema / properties / monthly_document_pagesAdded value: +{ + "description": "Pages of documents parsed per month, for document-parsing APIs (LlamaParse, Reducto, Unstructured, Mistral OCR, LandingAI, Amazon Textract, Google Document AI, Azure Document Intelligence, Datalab, Mathpix, Mindee, Nanonets, Upstage). A price given per credit is multiplied by the credits one page costs. It is the whole workload: give it instead of monthly_pages, monthly_searches, monthly_browser_hours, monthly_emails, monthly_characters and monthly_audio_hours, not with them. Only document-parsing products can serve it; other products are out of scope.", + "exclusiveMinimum": 0, + "type": "number" +} - added
Input schema / properties / needs_batch_discountAdded value: +{ + "description": "An official page must say a batch or asynchronous way of sending documents costs less than the list price on the plan, for document parsing. The budget and the cost are judged at the list price, not at the batch price.", + "type": "boolean" +} - changed
Input schema / properties / needs_no_training / descriptionPrevious value: -"An official page must say the vendor does not use the buyer's text and audio to train its models without the buyer opting in. A use that is on by default with an opt-out to ask for does not count."New value: +"An official page must say the vendor does not use the buyer's text, audio or documents to train its models without the buyer opting in. A use that is on by default with an opt-out to ask for does not count." - added
Input schema / properties / needs_table_extractionAdded value: +{ + "description": "The service must return the tables of a page as structure (rows and cells), not only the text, for document parsing.", + "type": "boolean" +} - added
Input schema / properties / preferred / properties / min_pages_per_docAdded value: +{ + "description": "Pages one document may have at the most the plan allows, for document parsing. Met when the stated limit is at least this many (or the pages say there is no page limit); a plan whose pages do not state a limit is unknown. The limit of the largest way of sending (batch or asynchronous) counts.", + "minimum": 1, + "type": "integer" +} - added
Input schema / properties / preferred / properties / needs_batch_discountAdded value: +{ + "description": "An official page must say a batch or asynchronous way of sending documents costs less than the list price on the plan, for document parsing. The budget and the cost are judged at the list price, not at the batch price.", + "type": "boolean" +} - changed
Input schema / properties / preferred / properties / needs_no_training / descriptionPrevious value: -"An official page must say the vendor does not use the buyer's text and audio to train its models without the buyer opting in. A use that is on by default with an opt-out to ask for does not count."New value: +"An official page must say the vendor does not use the buyer's text, audio or documents to train its models without the buyer opting in. A use that is on by default with an opt-out to ask for does not count." - added
Input schema / properties / preferred / properties / needs_table_extractionAdded value: +{ + "description": "The service must return the tables of a page as structure (rows and cells), not only the text, for document parsing.", + "type": "boolean" +}
- Changed
cost_scenarios9 fields changed- added
Input schema / properties / min_pages_per_docAdded value: +{ + "description": "Pages one document may have at the most the plan allows, for document parsing. Met when the stated limit is at least this many (or the pages say there is no page limit); a plan whose pages do not state a limit is unknown. The limit of the largest way of sending (batch or asynchronous) counts.", + "minimum": 1, + "type": "integer" +} - added
Input schema / properties / needs_batch_discountAdded value: +{ + "description": "An official page must say a batch or asynchronous way of sending documents costs less than the list price on the plan, for document parsing. The budget and the cost are judged at the list price, not at the batch price.", + "type": "boolean" +} - changed
Input schema / properties / needs_no_training / descriptionPrevious value: -"An official page must say the vendor does not use the buyer's text and audio to train its models without the buyer opting in. A use that is on by default with an opt-out to ask for does not count."New value: +"An official page must say the vendor does not use the buyer's text, audio or documents to train its models without the buyer opting in. A use that is on by default with an opt-out to ask for does not count." - added
Input schema / properties / needs_table_extractionAdded value: +{ + "description": "The service must return the tables of a page as structure (rows and cells), not only the text, for document parsing.", + "type": "boolean" +} - added
Input schema / properties / preferred / properties / min_pages_per_docAdded value: +{ + "description": "Pages one document may have at the most the plan allows, for document parsing. Met when the stated limit is at least this many (or the pages say there is no page limit); a plan whose pages do not state a limit is unknown. The limit of the largest way of sending (batch or asynchronous) counts.", + "minimum": 1, + "type": "integer" +} - added
Input schema / properties / preferred / properties / needs_batch_discountAdded value: +{ + "description": "An official page must say a batch or asynchronous way of sending documents costs less than the list price on the plan, for document parsing. The budget and the cost are judged at the list price, not at the batch price.", + "type": "boolean" +} - changed
Input schema / properties / preferred / properties / needs_no_training / descriptionPrevious value: -"An official page must say the vendor does not use the buyer's text and audio to train its models without the buyer opting in. A use that is on by default with an opt-out to ask for does not count."New value: +"An official page must say the vendor does not use the buyer's text, audio or documents to train its models without the buyer opting in. A use that is on by default with an opt-out to ask for does not count." - added
Input schema / properties / preferred / properties / needs_table_extractionAdded value: +{ + "description": "The service must return the tables of a page as structure (rows and cells), not only the text, for document parsing.", + "type": "boolean" +} - changed
Input schema / properties / product_types / items / enumPrevious value: -[ - "scraping_api", - "serp_api", - "headless_browser", - "platform", - "email_api", - "tts_api", - "stt_api" -]New value: +[ + "scraping_api", + "serp_api", + "headless_browser", + "platform", + "email_api", + "tts_api", + "stt_api", + "docparse_api" +]
- Changed
relax_conditions11 fields changed- added
Input schema / properties / min_pages_per_docAdded value: +{ + "description": "Pages one document may have at the most the plan allows, for document parsing. Met when the stated limit is at least this many (or the pages say there is no page limit); a plan whose pages do not state a limit is unknown. The limit of the largest way of sending (batch or asynchronous) counts.", + "minimum": 1, + "type": "integer" +} - added
Input schema / properties / needs_batch_discountAdded value: +{ + "description": "An official page must say a batch or asynchronous way of sending documents costs less than the list price on the plan, for document parsing. The budget and the cost are judged at the list price, not at the batch price.", + "type": "boolean" +} - changed
Input schema / properties / needs_no_training / descriptionPrevious value: -"An official page must say the vendor does not use the buyer's text and audio to train its models without the buyer opting in. A use that is on by default with an opt-out to ask for does not count."New value: +"An official page must say the vendor does not use the buyer's text, audio or documents to train its models without the buyer opting in. A use that is on by default with an opt-out to ask for does not count." - added
Input schema / properties / needs_table_extractionAdded value: +{ + "description": "The service must return the tables of a page as structure (rows and cells), not only the text, for document parsing.", + "type": "boolean" +} - changed
Input schema / properties / negotiable / descriptionPrevious value: -"Conditions the user said can change: monthly_volume, concurrency, rate_limit, monthly_budget, billing_type, free_allowance, failed_request_billing, success_billing, target_error_billing, geo_targeting, data_region, serp_response_mode, serp_localization, serp_result_types, serp_engines, crawl_page_limit, mcp_official, mcp_remote, mcp_auth, zdr, soc2, search_content, min_session_minutes, proxies_included, captcha_solving, session_recording, persistent_profiles, dedicated_ip, sending_domains, log_retention_days, inbound_parse, overage_per_1k, commercial_use, voice_cloning, streaming, languages_ko, data_not_used_for_training, batch, diarization, no_min_billing. Default: every required condition, each marked ask_user because the user has not said it can change."New value: +"Conditions the user said can change: monthly_volume, concurrency, rate_limit, monthly_budget, billing_type, free_allowance, failed_request_billing, success_billing, target_error_billing, geo_targeting, data_region, serp_response_mode, serp_localization, serp_result_types, serp_engines, crawl_page_limit, mcp_official, mcp_remote, mcp_auth, zdr, soc2, search_content, min_session_minutes, proxies_included, captcha_solving, session_recording, persistent_profiles, dedicated_ip, sending_domains, log_retention_days, inbound_parse, overage_per_1k, commercial_use, voice_cloning, streaming, languages_ko, data_not_used_for_training, batch, diarization, no_min_billing, batch_discount, max_pages_per_doc, table_extraction. Default: every required condition, each marked ask_user because the user has not said it can change." - changed
Input schema / properties / negotiable / items / enumPrevious value: -[ - "monthly_volume", - "concurrency", - "rate_limit", - "monthly_budget", - "billing_type", - "free_allowance", - "failed_request_billing", - "success_billing", - "target_error_billing", - "geo_targeting", - "data_region", - "serp_response_mode", - "serp_localization", - "serp_result_types", - "serp_engines", - "crawl_page_limit", - "mcp_official", - "mcp_remote", - "mcp_auth", - "zdr", - "soc2", - "search_content", - "min_session_minutes", - "proxies_included", - "captcha_solving", - "session_recording", - "persistent_profiles", - "dedicated_ip", - "sending_domains", - "log_retention_days", - "inbound_parse", - "overage_per_1k", - "commercial_use", - "voice_cloning", - "streaming", - "languages_ko", - "data_not_used_for_training", - "batch", - "diarization", - "no_min_billing" -]New value: +[ + "monthly_volume", + "concurrency", + "rate_limit", + "monthly_budget", + "billing_type", + "free_allowance", + "failed_request_billing", + "success_billing", + "target_error_billing", + "geo_targeting", + "data_region", + "serp_response_mode", + "serp_localization", + "serp_result_types", + "serp_engines", + "crawl_page_limit", + "mcp_official", + "mcp_remote", + "mcp_auth", + "zdr", + "soc2", + "search_content", + "min_session_minutes", + "proxies_included", + "captcha_solving", + "session_recording", + "persistent_profiles", + "dedicated_ip", + "sending_domains", + "log_retention_days", + "inbound_parse", + "overage_per_1k", + "commercial_use", + "voice_cloning", + "streaming", + "languages_ko", + "data_not_used_for_training", + "batch", + "diarization", + "no_min_billing", + "batch_discount", + "max_pages_per_doc", + "table_extraction" +] - added
Input schema / properties / preferred / properties / min_pages_per_docAdded value: +{ + "description": "Pages one document may have at the most the plan allows, for document parsing. Met when the stated limit is at least this many (or the pages say there is no page limit); a plan whose pages do not state a limit is unknown. The limit of the largest way of sending (batch or asynchronous) counts.", + "minimum": 1, + "type": "integer" +} - added
Input schema / properties / preferred / properties / needs_batch_discountAdded value: +{ + "description": "An official page must say a batch or asynchronous way of sending documents costs less than the list price on the plan, for document parsing. The budget and the cost are judged at the list price, not at the batch price.", + "type": "boolean" +} - changed
Input schema / properties / preferred / properties / needs_no_training / descriptionPrevious value: -"An official page must say the vendor does not use the buyer's text and audio to train its models without the buyer opting in. A use that is on by default with an opt-out to ask for does not count."New value: +"An official page must say the vendor does not use the buyer's text, audio or documents to train its models without the buyer opting in. A use that is on by default with an opt-out to ask for does not count." - added
Input schema / properties / preferred / properties / needs_table_extractionAdded value: +{ + "description": "The service must return the tables of a page as structure (rows and cells), not only the text, for document parsing.", + "type": "boolean" +} - changed
Input schema / properties / product_types / items / enumPrevious value: -[ - "scraping_api", - "serp_api", - "headless_browser", - "platform", - "email_api", - "tts_api", - "stt_api" -]New value: +[ + "scraping_api", + "serp_api", + "headless_browser", + "platform", + "email_api", + "tts_api", + "stt_api", + "docparse_api" +]
- Changed
search10 fields changed- added
Input schema / properties / min_pages_per_docAdded value: +{ + "description": "Pages one document may have at the most the plan allows, for document parsing. Met when the stated limit is at least this many (or the pages say there is no page limit); a plan whose pages do not state a limit is unknown. The limit of the largest way of sending (batch or asynchronous) counts.", + "minimum": 1, + "type": "integer" +} - added
Input schema / properties / monthly_document_pagesAdded value: +{ + "description": "Pages of documents parsed per month, for document-parsing APIs (LlamaParse, Reducto, Unstructured, Mistral OCR, LandingAI, Amazon Textract, Google Document AI, Azure Document Intelligence, Datalab, Mathpix, Mindee, Nanonets, Upstage). A price given per credit is multiplied by the credits one page costs. It is the whole workload: give it instead of monthly_pages, monthly_searches, monthly_browser_hours, monthly_emails, monthly_characters and monthly_audio_hours, not with them. Only document-parsing products can serve it; other products are out of scope.", + "exclusiveMinimum": 0, + "type": "number" +} - added
Input schema / properties / needs_batch_discountAdded value: +{ + "description": "An official page must say a batch or asynchronous way of sending documents costs less than the list price on the plan, for document parsing. The budget and the cost are judged at the list price, not at the batch price.", + "type": "boolean" +} - changed
Input schema / properties / needs_no_training / descriptionPrevious value: -"An official page must say the vendor does not use the buyer's text and audio to train its models without the buyer opting in. A use that is on by default with an opt-out to ask for does not count."New value: +"An official page must say the vendor does not use the buyer's text, audio or documents to train its models without the buyer opting in. A use that is on by default with an opt-out to ask for does not count." - added
Input schema / properties / needs_table_extractionAdded value: +{ + "description": "The service must return the tables of a page as structure (rows and cells), not only the text, for document parsing.", + "type": "boolean" +} - added
Input schema / properties / preferred / properties / min_pages_per_docAdded value: +{ + "description": "Pages one document may have at the most the plan allows, for document parsing. Met when the stated limit is at least this many (or the pages say there is no page limit); a plan whose pages do not state a limit is unknown. The limit of the largest way of sending (batch or asynchronous) counts.", + "minimum": 1, + "type": "integer" +} - added
Input schema / properties / preferred / properties / needs_batch_discountAdded value: +{ + "description": "An official page must say a batch or asynchronous way of sending documents costs less than the list price on the plan, for document parsing. The budget and the cost are judged at the list price, not at the batch price.", + "type": "boolean" +} - changed
Input schema / properties / preferred / properties / needs_no_training / descriptionPrevious value: -"An official page must say the vendor does not use the buyer's text and audio to train its models without the buyer opting in. A use that is on by default with an opt-out to ask for does not count."New value: +"An official page must say the vendor does not use the buyer's text, audio or documents to train its models without the buyer opting in. A use that is on by default with an opt-out to ask for does not count." - added
Input schema / properties / preferred / properties / needs_table_extractionAdded value: +{ + "description": "The service must return the tables of a page as structure (rows and cells), not only the text, for document parsing.", + "type": "boolean" +} - changed
Input schema / properties / product_types / items / enumPrevious value: -[ - "scraping_api", - "serp_api", - "headless_browser", - "platform", - "email_api", - "tts_api", - "stt_api" -]New value: +[ + "scraping_api", + "serp_api", + "headless_browser", + "platform", + "email_api", + "tts_api", + "stt_api", + "docparse_api" +]
- Changed
verify_answer16 fields changed- added
Input schema / properties / claims / items / properties / conditions / properties / min_pages_per_docAdded value: +{ + "enum": [ + "met", + "not_met", + "unknown" + ], + "type": "string" +} - added
Input schema / properties / claims / items / properties / conditions / properties / needs_batch_discountAdded value: +{ + "enum": [ + "met", + "not_met", + "unknown" + ], + "type": "string" +} - added
Input schema / properties / claims / items / properties / conditions / properties / needs_table_extractionAdded value: +{ + "enum": [ + "met", + "not_met", + "unknown" + ], + "type": "string" +} - added
Input schema / properties / claims / items / properties / values / properties / batch_discountAdded value: +{ + "type": [ + "number", + "string", + "boolean", + "object", + "array", + "null" + ] +} - added
Input schema / properties / claims / items / properties / values / properties / max_pages_per_docAdded value: +{ + "type": [ + "number", + "string", + "boolean", + "object", + "array", + "null" + ] +} - added
Input schema / properties / claims / items / properties / values / properties / table_extractionAdded value: +{ + "type": [ + "number", + "string", + "boolean", + "object", + "array", + "null" + ] +} - added
Input schema / properties / request / properties / min_pages_per_docAdded value: +{ + "description": "Pages one document may have at the most the plan allows, for document parsing. Met when the stated limit is at least this many (or the pages say there is no page limit); a plan whose pages do not state a limit is unknown. The limit of the largest way of sending (batch or asynchronous) counts.", + "minimum": 1, + "type": "integer" +} - added
Input schema / properties / request / properties / monthly_document_pagesAdded value: +{ + "description": "Pages of documents parsed per month, for document-parsing APIs (LlamaParse, Reducto, Unstructured, Mistral OCR, LandingAI, Amazon Textract, Google Document AI, Azure Document Intelligence, Datalab, Mathpix, Mindee, Nanonets, Upstage). A price given per credit is multiplied by the credits one page costs. It is the whole workload: give it instead of monthly_pages, monthly_searches, monthly_browser_hours, monthly_emails, monthly_characters and monthly_audio_hours, not with them. Only document-parsing products can serve it; other products are out of scope.", + "exclusiveMinimum": 0, + "type": "number" +} - added
Input schema / properties / request / properties / needs_batch_discountAdded value: +{ + "description": "An official page must say a batch or asynchronous way of sending documents costs less than the list price on the plan, for document parsing. The budget and the cost are judged at the list price, not at the batch price.", + "type": "boolean" +} - changed
Input schema / properties / request / properties / needs_no_training / descriptionPrevious value: -"An official page must say the vendor does not use the buyer's text and audio to train its models without the buyer opting in. A use that is on by default with an opt-out to ask for does not count."New value: +"An official page must say the vendor does not use the buyer's text, audio or documents to train its models without the buyer opting in. A use that is on by default with an opt-out to ask for does not count." - added
Input schema / properties / request / properties / needs_table_extractionAdded value: +{ + "description": "The service must return the tables of a page as structure (rows and cells), not only the text, for document parsing.", + "type": "boolean" +} - added
Input schema / properties / request / properties / preferred / properties / min_pages_per_docAdded value: +{ + "description": "Pages one document may have at the most the plan allows, for document parsing. Met when the stated limit is at least this many (or the pages say there is no page limit); a plan whose pages do not state a limit is unknown. The limit of the largest way of sending (batch or asynchronous) counts.", + "minimum": 1, + "type": "integer" +} - added
Input schema / properties / request / properties / preferred / properties / needs_batch_discountAdded value: +{ + "description": "An official page must say a batch or asynchronous way of sending documents costs less than the list price on the plan, for document parsing. The budget and the cost are judged at the list price, not at the batch price.", + "type": "boolean" +} - changed
Input schema / properties / request / properties / preferred / properties / needs_no_training / descriptionPrevious value: -"An official page must say the vendor does not use the buyer's text and audio to train its models without the buyer opting in. A use that is on by default with an opt-out to ask for does not count."New value: +"An official page must say the vendor does not use the buyer's text, audio or documents to train its models without the buyer opting in. A use that is on by default with an opt-out to ask for does not count." - added
Input schema / properties / request / properties / preferred / properties / needs_table_extractionAdded value: +{ + "description": "The service must return the tables of a page as structure (rows and cells), not only the text, for document parsing.", + "type": "boolean" +} - changed
Input schema / properties / request / properties / product_types / items / enumPrevious value: -[ - "scraping_api", - "serp_api", - "headless_browser", - "platform", - "email_api", - "tts_api", - "stt_api" -]New value: +[ + "scraping_api", + "serp_api", + "headless_browser", + "platform", + "email_api", + "tts_api", + "stt_api", + "docparse_api" +]
5 tool updates
- Changed
check_conditions29 fields changed- added
Input schema / properties / max_overage_usd_per_1kAdded value: +{ + "description": "The most the plan may charge for each 1,000 emails beyond its included volume, in USD, for transactional email. A plan whose extra price is not published as a per-1,000 figure is unknown.", + "minimum": 0, + "type": "number" +} - added
Input schema / properties / min_log_retention_daysAdded value: +{ + "description": "Days the plan must keep the logs or events of sent email where the account can read them, for transactional email. Longer retention sold as an add-on does not count.", + "minimum": 1, + "type": "integer" +} - added
Input schema / properties / min_sending_domainsAdded value: +{ + "description": "Sending domains the plan must let one account authenticate, for transactional email. Met when the stated limit is at least this many (or the pages say it is unlimited); a plan whose pages do not state a limit is unknown.", + "minimum": 1, + "type": "integer" +} - added
Input schema / properties / monthly_audio_hoursAdded value: +{ + "description": "Hours of audio transcribed per month, for speech-to-text APIs (Deepgram, AssemblyAI, Speechmatics, Amazon Transcribe, Google Cloud, OpenAI). A price given per minute is multiplied by 60. It is the whole workload: give it instead of monthly_pages, monthly_searches, monthly_browser_hours, monthly_emails and monthly_characters, not with them. Only speech-to-text products can serve it; other products are out of scope.", + "exclusiveMinimum": 0, + "type": "number" +} - added
Input schema / properties / monthly_charactersAdded value: +{ + "description": "Characters of text voiced per month, for text-to-speech APIs (ElevenLabs, Cartesia, Deepgram Aura, OpenAI, Google Cloud, Amazon Polly, Azure, Gradium, Rime, Inworld, MiniMax, Murf, Hume). It is the whole workload: give it instead of monthly_pages, monthly_searches, monthly_browser_hours and monthly_emails, not with them. Only text-to-speech products can serve it; other products are out of scope.", + "exclusiveMinimum": 0, + "type": "number" +} - added
Input schema / properties / monthly_emailsAdded value: +{ + "description": "Emails sent per month, for transactional email APIs (SendGrid, Mailgun, Postmark, Resend, Amazon SES, Brevo, Mailtrap, Loops). It is the whole workload: give it instead of monthly_pages, monthly_searches and monthly_browser_hours, not with them. Only email products can serve it; other products are out of scope.", + "exclusiveMinimum": 0, + "type": "number" +} - added
Input schema / properties / needs_batchAdded value: +{ + "description": "The plan must transcribe recorded audio (a file or a stored recording), for speech-to-text. A plan priced for live audio only is not met.", + "type": "boolean" +} - added
Input schema / properties / needs_commercial_useAdded value: +{ + "description": "The plan must allow commercial use of the generated audio, for text-to-speech. A free plan limited to non-commercial use does not count; a plan whose pages do not say is unknown.", + "type": "boolean" +} - added
Input schema / properties / needs_dedicated_ipAdded value: +{ + "description": "The plan must come with a dedicated sending IP address, for transactional email. A dedicated IP sold only as an add-on on top of the plan, or only on another plan, does not count.", + "type": "boolean" +} - added
Input schema / properties / needs_diarizationAdded value: +{ + "description": "The plan must label who spoke (speaker diarization), for speech-to-text. Where the vendor charges extra for it, the extra price is added to the monthly cost; where the pages state no price or no inclusion the plan is unknown.", + "type": "boolean" +} - added
Input schema / properties / needs_inboundAdded value: +{ + "description": "The service must receive email for the buyer and hand it on (inbound parsing, routes), for transactional email.", + "type": "boolean" +} - added
Input schema / properties / needs_koreanAdded value: +{ + "description": "The service must voice Korean text (text-to-speech) or transcribe Korean speech (speech-to-text).", + "type": "boolean" +} - added
Input schema / properties / needs_no_min_billingAdded value: +{ + "description": "An official page must say audio is billed by the second (or an increment of seconds) with no minimum billed duration per request, for speech-to-text. A page that says nothing about rounding is unknown.", + "type": "boolean" +} - added
Input schema / properties / needs_no_trainingAdded value: +{ + "description": "An official page must say the vendor does not use the buyer's text and audio to train its models without the buyer opting in. A use that is on by default with an opt-out to ask for does not count.", + "type": "boolean" +} - added
Input schema / properties / needs_streamingAdded value: +{ + "description": "The service must return audio in real time as it is made (streaming or a WebSocket), for text-to-speech; for speech-to-text, it must transcribe live audio as it arrives. A speech-to-text price line is per mode, so a plan priced for recorded audio only is not met.", + "type": "boolean" +} - added
Input schema / properties / needs_voice_cloningAdded value: +{ + "description": "The plan must let the account clone a voice from its own recording, for text-to-speech. Cloning limited to eligible customers, a request form or an enterprise plan does not count for a plan that is not that plan.", + "type": "boolean" +} - added
Input schema / properties / preferred / properties / max_overage_usd_per_1kAdded value: +{ + "description": "The most the plan may charge for each 1,000 emails beyond its included volume, in USD, for transactional email. A plan whose extra price is not published as a per-1,000 figure is unknown.", + "minimum": 0, + "type": "number" +} - added
Input schema / properties / preferred / properties / min_log_retention_daysAdded value: +{ + "description": "Days the plan must keep the logs or events of sent email where the account can read them, for transactional email. Longer retention sold as an add-on does not count.", + "minimum": 1, + "type": "integer" +} - added
Input schema / properties / preferred / properties / min_sending_domainsAdded value: +{ + "description": "Sending domains the plan must let one account authenticate, for transactional email. Met when the stated limit is at least this many (or the pages say it is unlimited); a plan whose pages do not state a limit is unknown.", + "minimum": 1, + "type": "integer" +} - added
Input schema / properties / preferred / properties / needs_batchAdded value: +{ + "description": "The plan must transcribe recorded audio (a file or a stored recording), for speech-to-text. A plan priced for live audio only is not met.", + "type": "boolean" +} - added
Input schema / properties / preferred / properties / needs_commercial_useAdded value: +{ + "description": "The plan must allow commercial use of the generated audio, for text-to-speech. A free plan limited to non-commercial use does not count; a plan whose pages do not say is unknown.", + "type": "boolean" +} - added
Input schema / properties / preferred / properties / needs_dedicated_ipAdded value: +{ + "description": "The plan must come with a dedicated sending IP address, for transactional email. A dedicated IP sold only as an add-on on top of the plan, or only on another plan, does not count.", + "type": "boolean" +} - added
Input schema / properties / preferred / properties / needs_diarizationAdded value: +{ + "description": "The plan must label who spoke (speaker diarization), for speech-to-text. Where the vendor charges extra for it, the extra price is added to the monthly cost; where the pages state no price or no inclusion the plan is unknown.", + "type": "boolean" +} - added
Input schema / properties / preferred / properties / needs_inboundAdded value: +{ + "description": "The service must receive email for the buyer and hand it on (inbound parsing, routes), for transactional email.", + "type": "boolean" +} - added
Input schema / properties / preferred / properties / needs_koreanAdded value: +{ + "description": "The service must voice Korean text (text-to-speech) or transcribe Korean speech (speech-to-text).", + "type": "boolean" +} - added
Input schema / properties / preferred / properties / needs_no_min_billingAdded value: +{ + "description": "An official page must say audio is billed by the second (or an increment of seconds) with no minimum billed duration per request, for speech-to-text. A page that says nothing about rounding is unknown.", + "type": "boolean" +} - added
Input schema / properties / preferred / properties / needs_no_trainingAdded value: +{ + "description": "An official page must say the vendor does not use the buyer's text and audio to train its models without the buyer opting in. A use that is on by default with an opt-out to ask for does not count.", + "type": "boolean" +} - added
Input schema / properties / preferred / properties / needs_streamingAdded value: +{ + "description": "The service must return audio in real time as it is made (streaming or a WebSocket), for text-to-speech; for speech-to-text, it must transcribe live audio as it arrives. A speech-to-text price line is per mode, so a plan priced for recorded audio only is not met.", + "type": "boolean" +} - added
Input schema / properties / preferred / properties / needs_voice_cloningAdded value: +{ + "description": "The plan must let the account clone a voice from its own recording, for text-to-speech. Cloning limited to eligible customers, a request form or an enterprise plan does not count for a plan that is not that plan.", + "type": "boolean" +}
- Changed
cost_scenarios27 fields changed- added
Input schema / properties / max_overage_usd_per_1kAdded value: +{ + "description": "The most the plan may charge for each 1,000 emails beyond its included volume, in USD, for transactional email. A plan whose extra price is not published as a per-1,000 figure is unknown.", + "minimum": 0, + "type": "number" +} - added
Input schema / properties / min_log_retention_daysAdded value: +{ + "description": "Days the plan must keep the logs or events of sent email where the account can read them, for transactional email. Longer retention sold as an add-on does not count.", + "minimum": 1, + "type": "integer" +} - added
Input schema / properties / min_sending_domainsAdded value: +{ + "description": "Sending domains the plan must let one account authenticate, for transactional email. Met when the stated limit is at least this many (or the pages say it is unlimited); a plan whose pages do not state a limit is unknown.", + "minimum": 1, + "type": "integer" +} - added
Input schema / properties / needs_batchAdded value: +{ + "description": "The plan must transcribe recorded audio (a file or a stored recording), for speech-to-text. A plan priced for live audio only is not met.", + "type": "boolean" +} - added
Input schema / properties / needs_commercial_useAdded value: +{ + "description": "The plan must allow commercial use of the generated audio, for text-to-speech. A free plan limited to non-commercial use does not count; a plan whose pages do not say is unknown.", + "type": "boolean" +} - added
Input schema / properties / needs_dedicated_ipAdded value: +{ + "description": "The plan must come with a dedicated sending IP address, for transactional email. A dedicated IP sold only as an add-on on top of the plan, or only on another plan, does not count.", + "type": "boolean" +} - added
Input schema / properties / needs_diarizationAdded value: +{ + "description": "The plan must label who spoke (speaker diarization), for speech-to-text. Where the vendor charges extra for it, the extra price is added to the monthly cost; where the pages state no price or no inclusion the plan is unknown.", + "type": "boolean" +} - added
Input schema / properties / needs_inboundAdded value: +{ + "description": "The service must receive email for the buyer and hand it on (inbound parsing, routes), for transactional email.", + "type": "boolean" +} - added
Input schema / properties / needs_koreanAdded value: +{ + "description": "The service must voice Korean text (text-to-speech) or transcribe Korean speech (speech-to-text).", + "type": "boolean" +} - added
Input schema / properties / needs_no_min_billingAdded value: +{ + "description": "An official page must say audio is billed by the second (or an increment of seconds) with no minimum billed duration per request, for speech-to-text. A page that says nothing about rounding is unknown.", + "type": "boolean" +} - added
Input schema / properties / needs_no_trainingAdded value: +{ + "description": "An official page must say the vendor does not use the buyer's text and audio to train its models without the buyer opting in. A use that is on by default with an opt-out to ask for does not count.", + "type": "boolean" +} - added
Input schema / properties / needs_streamingAdded value: +{ + "description": "The service must return audio in real time as it is made (streaming or a WebSocket), for text-to-speech; for speech-to-text, it must transcribe live audio as it arrives. A speech-to-text price line is per mode, so a plan priced for recorded audio only is not met.", + "type": "boolean" +} - added
Input schema / properties / needs_voice_cloningAdded value: +{ + "description": "The plan must let the account clone a voice from its own recording, for text-to-speech. Cloning limited to eligible customers, a request form or an enterprise plan does not count for a plan that is not that plan.", + "type": "boolean" +} - added
Input schema / properties / preferred / properties / max_overage_usd_per_1kAdded value: +{ + "description": "The most the plan may charge for each 1,000 emails beyond its included volume, in USD, for transactional email. A plan whose extra price is not published as a per-1,000 figure is unknown.", + "minimum": 0, + "type": "number" +} - added
Input schema / properties / preferred / properties / min_log_retention_daysAdded value: +{ + "description": "Days the plan must keep the logs or events of sent email where the account can read them, for transactional email. Longer retention sold as an add-on does not count.", + "minimum": 1, + "type": "integer" +} - added
Input schema / properties / preferred / properties / min_sending_domainsAdded value: +{ + "description": "Sending domains the plan must let one account authenticate, for transactional email. Met when the stated limit is at least this many (or the pages say it is unlimited); a plan whose pages do not state a limit is unknown.", + "minimum": 1, + "type": "integer" +} - added
Input schema / properties / preferred / properties / needs_batchAdded value: +{ + "description": "The plan must transcribe recorded audio (a file or a stored recording), for speech-to-text. A plan priced for live audio only is not met.", + "type": "boolean" +} - added
Input schema / properties / preferred / properties / needs_commercial_useAdded value: +{ + "description": "The plan must allow commercial use of the generated audio, for text-to-speech. A free plan limited to non-commercial use does not count; a plan whose pages do not say is unknown.", + "type": "boolean" +} - added
Input schema / properties / preferred / properties / needs_dedicated_ipAdded value: +{ + "description": "The plan must come with a dedicated sending IP address, for transactional email. A dedicated IP sold only as an add-on on top of the plan, or only on another plan, does not count.", + "type": "boolean" +} - added
Input schema / properties / preferred / properties / needs_diarizationAdded value: +{ + "description": "The plan must label who spoke (speaker diarization), for speech-to-text. Where the vendor charges extra for it, the extra price is added to the monthly cost; where the pages state no price or no inclusion the plan is unknown.", + "type": "boolean" +} - added
Input schema / properties / preferred / properties / needs_inboundAdded value: +{ + "description": "The service must receive email for the buyer and hand it on (inbound parsing, routes), for transactional email.", + "type": "boolean" +} - added
Input schema / properties / preferred / properties / needs_koreanAdded value: +{ + "description": "The service must voice Korean text (text-to-speech) or transcribe Korean speech (speech-to-text).", + "type": "boolean" +} - added
Input schema / properties / preferred / properties / needs_no_min_billingAdded value: +{ + "description": "An official page must say audio is billed by the second (or an increment of seconds) with no minimum billed duration per request, for speech-to-text. A page that says nothing about rounding is unknown.", + "type": "boolean" +} - added
Input schema / properties / preferred / properties / needs_no_trainingAdded value: +{ + "description": "An official page must say the vendor does not use the buyer's text and audio to train its models without the buyer opting in. A use that is on by default with an opt-out to ask for does not count.", + "type": "boolean" +} - added
Input schema / properties / preferred / properties / needs_streamingAdded value: +{ + "description": "The service must return audio in real time as it is made (streaming or a WebSocket), for text-to-speech; for speech-to-text, it must transcribe live audio as it arrives. A speech-to-text price line is per mode, so a plan priced for recorded audio only is not met.", + "type": "boolean" +} - added
Input schema / properties / preferred / properties / needs_voice_cloningAdded value: +{ + "description": "The plan must let the account clone a voice from its own recording, for text-to-speech. Cloning limited to eligible customers, a request form or an enterprise plan does not count for a plan that is not that plan.", + "type": "boolean" +} - changed
Input schema / properties / product_types / items / enumPrevious value: -[ - "scraping_api", - "serp_api", - "headless_browser", - "platform" -]New value: +[ + "scraping_api", + "serp_api", + "headless_browser", + "platform", + "email_api", + "tts_api", + "stt_api" +]
- Changed
relax_conditions29 fields changed- added
Input schema / properties / max_overage_usd_per_1kAdded value: +{ + "description": "The most the plan may charge for each 1,000 emails beyond its included volume, in USD, for transactional email. A plan whose extra price is not published as a per-1,000 figure is unknown.", + "minimum": 0, + "type": "number" +} - added
Input schema / properties / min_log_retention_daysAdded value: +{ + "description": "Days the plan must keep the logs or events of sent email where the account can read them, for transactional email. Longer retention sold as an add-on does not count.", + "minimum": 1, + "type": "integer" +} - added
Input schema / properties / min_sending_domainsAdded value: +{ + "description": "Sending domains the plan must let one account authenticate, for transactional email. Met when the stated limit is at least this many (or the pages say it is unlimited); a plan whose pages do not state a limit is unknown.", + "minimum": 1, + "type": "integer" +} - added
Input schema / properties / needs_batchAdded value: +{ + "description": "The plan must transcribe recorded audio (a file or a stored recording), for speech-to-text. A plan priced for live audio only is not met.", + "type": "boolean" +} - added
Input schema / properties / needs_commercial_useAdded value: +{ + "description": "The plan must allow commercial use of the generated audio, for text-to-speech. A free plan limited to non-commercial use does not count; a plan whose pages do not say is unknown.", + "type": "boolean" +} - added
Input schema / properties / needs_dedicated_ipAdded value: +{ + "description": "The plan must come with a dedicated sending IP address, for transactional email. A dedicated IP sold only as an add-on on top of the plan, or only on another plan, does not count.", + "type": "boolean" +} - added
Input schema / properties / needs_diarizationAdded value: +{ + "description": "The plan must label who spoke (speaker diarization), for speech-to-text. Where the vendor charges extra for it, the extra price is added to the monthly cost; where the pages state no price or no inclusion the plan is unknown.", + "type": "boolean" +} - added
Input schema / properties / needs_inboundAdded value: +{ + "description": "The service must receive email for the buyer and hand it on (inbound parsing, routes), for transactional email.", + "type": "boolean" +} - added
Input schema / properties / needs_koreanAdded value: +{ + "description": "The service must voice Korean text (text-to-speech) or transcribe Korean speech (speech-to-text).", + "type": "boolean" +} - added
Input schema / properties / needs_no_min_billingAdded value: +{ + "description": "An official page must say audio is billed by the second (or an increment of seconds) with no minimum billed duration per request, for speech-to-text. A page that says nothing about rounding is unknown.", + "type": "boolean" +} - added
Input schema / properties / needs_no_trainingAdded value: +{ + "description": "An official page must say the vendor does not use the buyer's text and audio to train its models without the buyer opting in. A use that is on by default with an opt-out to ask for does not count.", + "type": "boolean" +} - added
Input schema / properties / needs_streamingAdded value: +{ + "description": "The service must return audio in real time as it is made (streaming or a WebSocket), for text-to-speech; for speech-to-text, it must transcribe live audio as it arrives. A speech-to-text price line is per mode, so a plan priced for recorded audio only is not met.", + "type": "boolean" +} - added
Input schema / properties / needs_voice_cloningAdded value: +{ + "description": "The plan must let the account clone a voice from its own recording, for text-to-speech. Cloning limited to eligible customers, a request form or an enterprise plan does not count for a plan that is not that plan.", + "type": "boolean" +} - changed
Input schema / properties / negotiable / descriptionPrevious value: -"Conditions the user said can change: monthly_volume, concurrency, rate_limit, monthly_budget, billing_type, free_allowance, failed_request_billing, success_billing, target_error_billing, geo_targeting, data_region, serp_response_mode, serp_localization, serp_result_types, serp_engines, crawl_page_limit, mcp_official, mcp_remote, mcp_auth, zdr, soc2, search_content, min_session_minutes, proxies_included, captcha_solving, session_recording, persistent_profiles. Default: every required condition, each marked ask_user because the user has not said it can change."New value: +"Conditions the user said can change: monthly_volume, concurrency, rate_limit, monthly_budget, billing_type, free_allowance, failed_request_billing, success_billing, target_error_billing, geo_targeting, data_region, serp_response_mode, serp_localization, serp_result_types, serp_engines, crawl_page_limit, mcp_official, mcp_remote, mcp_auth, zdr, soc2, search_content, min_session_minutes, proxies_included, captcha_solving, session_recording, persistent_profiles, dedicated_ip, sending_domains, log_retention_days, inbound_parse, overage_per_1k, commercial_use, voice_cloning, streaming, languages_ko, data_not_used_for_training, batch, diarization, no_min_billing. Default: every required condition, each marked ask_user because the user has not said it can change." - changed
Input schema / properties / negotiable / items / enumPrevious value: -[ - "monthly_volume", - "concurrency", - "rate_limit", - "monthly_budget", - "billing_type", - "free_allowance", - "failed_request_billing", - "success_billing", - "target_error_billing", - "geo_targeting", - "data_region", - "serp_response_mode", - "serp_localization", - "serp_result_types", - "serp_engines", - "crawl_page_limit", - "mcp_official", - "mcp_remote", - "mcp_auth", - "zdr", - "soc2", - "search_content", - "min_session_minutes", - "proxies_included", - "captcha_solving", - "session_recording", - "persistent_profiles" -]New value: +[ + "monthly_volume", + "concurrency", + "rate_limit", + "monthly_budget", + "billing_type", + "free_allowance", + "failed_request_billing", + "success_billing", + "target_error_billing", + "geo_targeting", + "data_region", + "serp_response_mode", + "serp_localization", + "serp_result_types", + "serp_engines", + "crawl_page_limit", + "mcp_official", + "mcp_remote", + "mcp_auth", + "zdr", + "soc2", + "search_content", + "min_session_minutes", + "proxies_included", + "captcha_solving", + "session_recording", + "persistent_profiles", + "dedicated_ip", + "sending_domains", + "log_retention_days", + "inbound_parse", + "overage_per_1k", + "commercial_use", + "voice_cloning", + "streaming", + "languages_ko", + "data_not_used_for_training", + "batch", + "diarization", + "no_min_billing" +] - added
Input schema / properties / preferred / properties / max_overage_usd_per_1kAdded value: +{ + "description": "The most the plan may charge for each 1,000 emails beyond its included volume, in USD, for transactional email. A plan whose extra price is not published as a per-1,000 figure is unknown.", + "minimum": 0, + "type": "number" +} - added
Input schema / properties / preferred / properties / min_log_retention_daysAdded value: +{ + "description": "Days the plan must keep the logs or events of sent email where the account can read them, for transactional email. Longer retention sold as an add-on does not count.", + "minimum": 1, + "type": "integer" +} - added
Input schema / properties / preferred / properties / min_sending_domainsAdded value: +{ + "description": "Sending domains the plan must let one account authenticate, for transactional email. Met when the stated limit is at least this many (or the pages say it is unlimited); a plan whose pages do not state a limit is unknown.", + "minimum": 1, + "type": "integer" +} - added
Input schema / properties / preferred / properties / needs_batchAdded value: +{ + "description": "The plan must transcribe recorded audio (a file or a stored recording), for speech-to-text. A plan priced for live audio only is not met.", + "type": "boolean" +} - added
Input schema / properties / preferred / properties / needs_commercial_useAdded value: +{ + "description": "The plan must allow commercial use of the generated audio, for text-to-speech. A free plan limited to non-commercial use does not count; a plan whose pages do not say is unknown.", + "type": "boolean" +} - added
Input schema / properties / preferred / properties / needs_dedicated_ipAdded value: +{ + "description": "The plan must come with a dedicated sending IP address, for transactional email. A dedicated IP sold only as an add-on on top of the plan, or only on another plan, does not count.", + "type": "boolean" +} - added
Input schema / properties / preferred / properties / needs_diarizationAdded value: +{ + "description": "The plan must label who spoke (speaker diarization), for speech-to-text. Where the vendor charges extra for it, the extra price is added to the monthly cost; where the pages state no price or no inclusion the plan is unknown.", + "type": "boolean" +} - added
Input schema / properties / preferred / properties / needs_inboundAdded value: +{ + "description": "The service must receive email for the buyer and hand it on (inbound parsing, routes), for transactional email.", + "type": "boolean" +} - added
Input schema / properties / preferred / properties / needs_koreanAdded value: +{ + "description": "The service must voice Korean text (text-to-speech) or transcribe Korean speech (speech-to-text).", + "type": "boolean" +} - added
Input schema / properties / preferred / properties / needs_no_min_billingAdded value: +{ + "description": "An official page must say audio is billed by the second (or an increment of seconds) with no minimum billed duration per request, for speech-to-text. A page that says nothing about rounding is unknown.", + "type": "boolean" +} - added
Input schema / properties / preferred / properties / needs_no_trainingAdded value: +{ + "description": "An official page must say the vendor does not use the buyer's text and audio to train its models without the buyer opting in. A use that is on by default with an opt-out to ask for does not count.", + "type": "boolean" +} - added
Input schema / properties / preferred / properties / needs_streamingAdded value: +{ + "description": "The service must return audio in real time as it is made (streaming or a WebSocket), for text-to-speech; for speech-to-text, it must transcribe live audio as it arrives. A speech-to-text price line is per mode, so a plan priced for recorded audio only is not met.", + "type": "boolean" +} - added
Input schema / properties / preferred / properties / needs_voice_cloningAdded value: +{ + "description": "The plan must let the account clone a voice from its own recording, for text-to-speech. Cloning limited to eligible customers, a request form or an enterprise plan does not count for a plan that is not that plan.", + "type": "boolean" +} - changed
Input schema / properties / product_types / items / enumPrevious value: -[ - "scraping_api", - "serp_api", - "headless_browser", - "platform" -]New value: +[ + "scraping_api", + "serp_api", + "headless_browser", + "platform", + "email_api", + "tts_api", + "stt_api" +]
- Changed
search30 fields changed- added
Input schema / properties / max_overage_usd_per_1kAdded value: +{ + "description": "The most the plan may charge for each 1,000 emails beyond its included volume, in USD, for transactional email. A plan whose extra price is not published as a per-1,000 figure is unknown.", + "minimum": 0, + "type": "number" +} - added
Input schema / properties / min_log_retention_daysAdded value: +{ + "description": "Days the plan must keep the logs or events of sent email where the account can read them, for transactional email. Longer retention sold as an add-on does not count.", + "minimum": 1, + "type": "integer" +} - added
Input schema / properties / min_sending_domainsAdded value: +{ + "description": "Sending domains the plan must let one account authenticate, for transactional email. Met when the stated limit is at least this many (or the pages say it is unlimited); a plan whose pages do not state a limit is unknown.", + "minimum": 1, + "type": "integer" +} - added
Input schema / properties / monthly_audio_hoursAdded value: +{ + "description": "Hours of audio transcribed per month, for speech-to-text APIs (Deepgram, AssemblyAI, Speechmatics, Amazon Transcribe, Google Cloud, OpenAI). A price given per minute is multiplied by 60. It is the whole workload: give it instead of monthly_pages, monthly_searches, monthly_browser_hours, monthly_emails and monthly_characters, not with them. Only speech-to-text products can serve it; other products are out of scope.", + "exclusiveMinimum": 0, + "type": "number" +} - added
Input schema / properties / monthly_charactersAdded value: +{ + "description": "Characters of text voiced per month, for text-to-speech APIs (ElevenLabs, Cartesia, Deepgram Aura, OpenAI, Google Cloud, Amazon Polly, Azure, Gradium, Rime, Inworld, MiniMax, Murf, Hume). It is the whole workload: give it instead of monthly_pages, monthly_searches, monthly_browser_hours and monthly_emails, not with them. Only text-to-speech products can serve it; other products are out of scope.", + "exclusiveMinimum": 0, + "type": "number" +} - added
Input schema / properties / monthly_emailsAdded value: +{ + "description": "Emails sent per month, for transactional email APIs (SendGrid, Mailgun, Postmark, Resend, Amazon SES, Brevo, Mailtrap, Loops). It is the whole workload: give it instead of monthly_pages, monthly_searches and monthly_browser_hours, not with them. Only email products can serve it; other products are out of scope.", + "exclusiveMinimum": 0, + "type": "number" +} - added
Input schema / properties / needs_batchAdded value: +{ + "description": "The plan must transcribe recorded audio (a file or a stored recording), for speech-to-text. A plan priced for live audio only is not met.", + "type": "boolean" +} - added
Input schema / properties / needs_commercial_useAdded value: +{ + "description": "The plan must allow commercial use of the generated audio, for text-to-speech. A free plan limited to non-commercial use does not count; a plan whose pages do not say is unknown.", + "type": "boolean" +} - added
Input schema / properties / needs_dedicated_ipAdded value: +{ + "description": "The plan must come with a dedicated sending IP address, for transactional email. A dedicated IP sold only as an add-on on top of the plan, or only on another plan, does not count.", + "type": "boolean" +} - added
Input schema / properties / needs_diarizationAdded value: +{ + "description": "The plan must label who spoke (speaker diarization), for speech-to-text. Where the vendor charges extra for it, the extra price is added to the monthly cost; where the pages state no price or no inclusion the plan is unknown.", + "type": "boolean" +} - added
Input schema / properties / needs_inboundAdded value: +{ + "description": "The service must receive email for the buyer and hand it on (inbound parsing, routes), for transactional email.", + "type": "boolean" +} - added
Input schema / properties / needs_koreanAdded value: +{ + "description": "The service must voice Korean text (text-to-speech) or transcribe Korean speech (speech-to-text).", + "type": "boolean" +} - added
Input schema / properties / needs_no_min_billingAdded value: +{ + "description": "An official page must say audio is billed by the second (or an increment of seconds) with no minimum billed duration per request, for speech-to-text. A page that says nothing about rounding is unknown.", + "type": "boolean" +} - added
Input schema / properties / needs_no_trainingAdded value: +{ + "description": "An official page must say the vendor does not use the buyer's text and audio to train its models without the buyer opting in. A use that is on by default with an opt-out to ask for does not count.", + "type": "boolean" +} - added
Input schema / properties / needs_streamingAdded value: +{ + "description": "The service must return audio in real time as it is made (streaming or a WebSocket), for text-to-speech; for speech-to-text, it must transcribe live audio as it arrives. A speech-to-text price line is per mode, so a plan priced for recorded audio only is not met.", + "type": "boolean" +} - added
Input schema / properties / needs_voice_cloningAdded value: +{ + "description": "The plan must let the account clone a voice from its own recording, for text-to-speech. Cloning limited to eligible customers, a request form or an enterprise plan does not count for a plan that is not that plan.", + "type": "boolean" +} - added
Input schema / properties / preferred / properties / max_overage_usd_per_1kAdded value: +{ + "description": "The most the plan may charge for each 1,000 emails beyond its included volume, in USD, for transactional email. A plan whose extra price is not published as a per-1,000 figure is unknown.", + "minimum": 0, + "type": "number" +} - added
Input schema / properties / preferred / properties / min_log_retention_daysAdded value: +{ + "description": "Days the plan must keep the logs or events of sent email where the account can read them, for transactional email. Longer retention sold as an add-on does not count.", + "minimum": 1, + "type": "integer" +} - added
Input schema / properties / preferred / properties / min_sending_domainsAdded value: +{ + "description": "Sending domains the plan must let one account authenticate, for transactional email. Met when the stated limit is at least this many (or the pages say it is unlimited); a plan whose pages do not state a limit is unknown.", + "minimum": 1, + "type": "integer" +} - added
Input schema / properties / preferred / properties / needs_batchAdded value: +{ + "description": "The plan must transcribe recorded audio (a file or a stored recording), for speech-to-text. A plan priced for live audio only is not met.", + "type": "boolean" +} - added
Input schema / properties / preferred / properties / needs_commercial_useAdded value: +{ + "description": "The plan must allow commercial use of the generated audio, for text-to-speech. A free plan limited to non-commercial use does not count; a plan whose pages do not say is unknown.", + "type": "boolean" +} - added
Input schema / properties / preferred / properties / needs_dedicated_ipAdded value: +{ + "description": "The plan must come with a dedicated sending IP address, for transactional email. A dedicated IP sold only as an add-on on top of the plan, or only on another plan, does not count.", + "type": "boolean" +} - added
Input schema / properties / preferred / properties / needs_diarizationAdded value: +{ + "description": "The plan must label who spoke (speaker diarization), for speech-to-text. Where the vendor charges extra for it, the extra price is added to the monthly cost; where the pages state no price or no inclusion the plan is unknown.", + "type": "boolean" +} - added
Input schema / properties / preferred / properties / needs_inboundAdded value: +{ + "description": "The service must receive email for the buyer and hand it on (inbound parsing, routes), for transactional email.", + "type": "boolean" +} - added
Input schema / properties / preferred / properties / needs_koreanAdded value: +{ + "description": "The service must voice Korean text (text-to-speech) or transcribe Korean speech (speech-to-text).", + "type": "boolean" +} - added
Input schema / properties / preferred / properties / needs_no_min_billingAdded value: +{ + "description": "An official page must say audio is billed by the second (or an increment of seconds) with no minimum billed duration per request, for speech-to-text. A page that says nothing about rounding is unknown.", + "type": "boolean" +} - added
Input schema / properties / preferred / properties / needs_no_trainingAdded value: +{ + "description": "An official page must say the vendor does not use the buyer's text and audio to train its models without the buyer opting in. A use that is on by default with an opt-out to ask for does not count.", + "type": "boolean" +} - added
Input schema / properties / preferred / properties / needs_streamingAdded value: +{ + "description": "The service must return audio in real time as it is made (streaming or a WebSocket), for text-to-speech; for speech-to-text, it must transcribe live audio as it arrives. A speech-to-text price line is per mode, so a plan priced for recorded audio only is not met.", + "type": "boolean" +} - added
Input schema / properties / preferred / properties / needs_voice_cloningAdded value: +{ + "description": "The plan must let the account clone a voice from its own recording, for text-to-speech. Cloning limited to eligible customers, a request form or an enterprise plan does not count for a plan that is not that plan.", + "type": "boolean" +} - changed
Input schema / properties / product_types / items / enumPrevious value: -[ - "scraping_api", - "serp_api", - "headless_browser", - "platform" -]New value: +[ + "scraping_api", + "serp_api", + "headless_browser", + "platform", + "email_api", + "tts_api", + "stt_api" +]
- Changed
verify_answer56 fields changed- added
Input schema / properties / claims / items / properties / conditions / properties / max_overage_usd_per_1kAdded value: +{ + "enum": [ + "met", + "not_met", + "unknown" + ], + "type": "string" +} - added
Input schema / properties / claims / items / properties / conditions / properties / min_log_retention_daysAdded value: +{ + "enum": [ + "met", + "not_met", + "unknown" + ], + "type": "string" +} - added
Input schema / properties / claims / items / properties / conditions / properties / min_sending_domainsAdded value: +{ + "enum": [ + "met", + "not_met", + "unknown" + ], + "type": "string" +} - added
Input schema / properties / claims / items / properties / conditions / properties / needs_batchAdded value: +{ + "enum": [ + "met", + "not_met", + "unknown" + ], + "type": "string" +} - added
Input schema / properties / claims / items / properties / conditions / properties / needs_commercial_useAdded value: +{ + "enum": [ + "met", + "not_met", + "unknown" + ], + "type": "string" +} - added
Input schema / properties / claims / items / properties / conditions / properties / needs_dedicated_ipAdded value: +{ + "enum": [ + "met", + "not_met", + "unknown" + ], + "type": "string" +} - added
Input schema / properties / claims / items / properties / conditions / properties / needs_diarizationAdded value: +{ + "enum": [ + "met", + "not_met", + "unknown" + ], + "type": "string" +} - added
Input schema / properties / claims / items / properties / conditions / properties / needs_inboundAdded value: +{ + "enum": [ + "met", + "not_met", + "unknown" + ], + "type": "string" +} - added
Input schema / properties / claims / items / properties / conditions / properties / needs_koreanAdded value: +{ + "enum": [ + "met", + "not_met", + "unknown" + ], + "type": "string" +} - added
Input schema / properties / claims / items / properties / conditions / properties / needs_no_min_billingAdded value: +{ + "enum": [ + "met", + "not_met", + "unknown" + ], + "type": "string" +} - added
Input schema / properties / claims / items / properties / conditions / properties / needs_no_trainingAdded value: +{ + "enum": [ + "met", + "not_met", + "unknown" + ], + "type": "string" +} - added
Input schema / properties / claims / items / properties / conditions / properties / needs_streamingAdded value: +{ + "enum": [ + "met", + "not_met", + "unknown" + ], + "type": "string" +} - added
Input schema / properties / claims / items / properties / conditions / properties / needs_voice_cloningAdded value: +{ + "enum": [ + "met", + "not_met", + "unknown" + ], + "type": "string" +} - added
Input schema / properties / claims / items / properties / values / properties / batchAdded value: +{ + "type": [ + "number", + "string", + "boolean", + "object", + "array", + "null" + ] +} - added
Input schema / properties / claims / items / properties / values / properties / commercial_useAdded value: +{ + "type": [ + "number", + "string", + "boolean", + "object", + "array", + "null" + ] +} - added
Input schema / properties / claims / items / properties / values / properties / data_not_used_for_trainingAdded value: +{ + "type": [ + "number", + "string", + "boolean", + "object", + "array", + "null" + ] +} - added
Input schema / properties / claims / items / properties / values / properties / dedicated_ipAdded value: +{ + "type": [ + "number", + "string", + "boolean", + "object", + "array", + "null" + ] +} - added
Input schema / properties / claims / items / properties / values / properties / diarizationAdded value: +{ + "type": [ + "number", + "string", + "boolean", + "object", + "array", + "null" + ] +} - added
Input schema / properties / claims / items / properties / values / properties / diarization_addonAdded value: +{ + "type": [ + "number", + "string", + "boolean", + "object", + "array", + "null" + ] +} - added
Input schema / properties / claims / items / properties / values / properties / inbound_parseAdded value: +{ + "type": [ + "number", + "string", + "boolean", + "object", + "array", + "null" + ] +} - added
Input schema / properties / claims / items / properties / values / properties / languages_koAdded value: +{ + "type": [ + "number", + "string", + "boolean", + "object", + "array", + "null" + ] +} - added
Input schema / properties / claims / items / properties / values / properties / log_retention_daysAdded value: +{ + "type": [ + "number", + "string", + "boolean", + "object", + "array", + "null" + ] +} - added
Input schema / properties / claims / items / properties / values / properties / no_min_billingAdded value: +{ + "type": [ + "number", + "string", + "boolean", + "object", + "array", + "null" + ] +} - added
Input schema / properties / claims / items / properties / values / properties / sending_domainsAdded value: +{ + "type": [ + "number", + "string", + "boolean", + "object", + "array", + "null" + ] +} - added
Input schema / properties / claims / items / properties / values / properties / streamingAdded value: +{ + "type": [ + "number", + "string", + "boolean", + "object", + "array", + "null" + ] +} - added
Input schema / properties / claims / items / properties / values / properties / voice_cloningAdded value: +{ + "type": [ + "number", + "string", + "boolean", + "object", + "array", + "null" + ] +} - added
Input schema / properties / request / properties / max_overage_usd_per_1kAdded value: +{ + "description": "The most the plan may charge for each 1,000 emails beyond its included volume, in USD, for transactional email. A plan whose extra price is not published as a per-1,000 figure is unknown.", + "minimum": 0, + "type": "number" +} - added
Input schema / properties / request / properties / min_log_retention_daysAdded value: +{ + "description": "Days the plan must keep the logs or events of sent email where the account can read them, for transactional email. Longer retention sold as an add-on does not count.", + "minimum": 1, + "type": "integer" +} - added
Input schema / properties / request / properties / min_sending_domainsAdded value: +{ + "description": "Sending domains the plan must let one account authenticate, for transactional email. Met when the stated limit is at least this many (or the pages say it is unlimited); a plan whose pages do not state a limit is unknown.", + "minimum": 1, + "type": "integer" +} - added
Input schema / properties / request / properties / monthly_audio_hoursAdded value: +{ + "description": "Hours of audio transcribed per month, for speech-to-text APIs (Deepgram, AssemblyAI, Speechmatics, Amazon Transcribe, Google Cloud, OpenAI). A price given per minute is multiplied by 60. It is the whole workload: give it instead of monthly_pages, monthly_searches, monthly_browser_hours, monthly_emails and monthly_characters, not with them. Only speech-to-text products can serve it; other products are out of scope.", + "exclusiveMinimum": 0, + "type": "number" +} - added
Input schema / properties / request / properties / monthly_charactersAdded value: +{ + "description": "Characters of text voiced per month, for text-to-speech APIs (ElevenLabs, Cartesia, Deepgram Aura, OpenAI, Google Cloud, Amazon Polly, Azure, Gradium, Rime, Inworld, MiniMax, Murf, Hume). It is the whole workload: give it instead of monthly_pages, monthly_searches, monthly_browser_hours and monthly_emails, not with them. Only text-to-speech products can serve it; other products are out of scope.", + "exclusiveMinimum": 0, + "type": "number" +} - added
Input schema / properties / request / properties / monthly_emailsAdded value: +{ + "description": "Emails sent per month, for transactional email APIs (SendGrid, Mailgun, Postmark, Resend, Amazon SES, Brevo, Mailtrap, Loops). It is the whole workload: give it instead of monthly_pages, monthly_searches and monthly_browser_hours, not with them. Only email products can serve it; other products are out of scope.", + "exclusiveMinimum": 0, + "type": "number" +} - added
Input schema / properties / request / properties / needs_batchAdded value: +{ + "description": "The plan must transcribe recorded audio (a file or a stored recording), for speech-to-text. A plan priced for live audio only is not met.", + "type": "boolean" +} - added
Input schema / properties / request / properties / needs_commercial_useAdded value: +{ + "description": "The plan must allow commercial use of the generated audio, for text-to-speech. A free plan limited to non-commercial use does not count; a plan whose pages do not say is unknown.", + "type": "boolean" +} - added
Input schema / properties / request / properties / needs_dedicated_ipAdded value: +{ + "description": "The plan must come with a dedicated sending IP address, for transactional email. A dedicated IP sold only as an add-on on top of the plan, or only on another plan, does not count.", + "type": "boolean" +} - added
Input schema / properties / request / properties / needs_diarizationAdded value: +{ + "description": "The plan must label who spoke (speaker diarization), for speech-to-text. Where the vendor charges extra for it, the extra price is added to the monthly cost; where the pages state no price or no inclusion the plan is unknown.", + "type": "boolean" +} - added
Input schema / properties / request / properties / needs_inboundAdded value: +{ + "description": "The service must receive email for the buyer and hand it on (inbound parsing, routes), for transactional email.", + "type": "boolean" +} - added
Input schema / properties / request / properties / needs_koreanAdded value: +{ + "description": "The service must voice Korean text (text-to-speech) or transcribe Korean speech (speech-to-text).", + "type": "boolean" +} - added
Input schema / properties / request / properties / needs_no_min_billingAdded value: +{ + "description": "An official page must say audio is billed by the second (or an increment of seconds) with no minimum billed duration per request, for speech-to-text. A page that says nothing about rounding is unknown.", + "type": "boolean" +} - added
Input schema / properties / request / properties / needs_no_trainingAdded value: +{ + "description": "An official page must say the vendor does not use the buyer's text and audio to train its models without the buyer opting in. A use that is on by default with an opt-out to ask for does not count.", + "type": "boolean" +} - added
Input schema / properties / request / properties / needs_streamingAdded value: +{ + "description": "The service must return audio in real time as it is made (streaming or a WebSocket), for text-to-speech; for speech-to-text, it must transcribe live audio as it arrives. A speech-to-text price line is per mode, so a plan priced for recorded audio only is not met.", + "type": "boolean" +} - added
Input schema / properties / request / properties / needs_voice_cloningAdded value: +{ + "description": "The plan must let the account clone a voice from its own recording, for text-to-speech. Cloning limited to eligible customers, a request form or an enterprise plan does not count for a plan that is not that plan.", + "type": "boolean" +} - added
Input schema / properties / request / properties / preferred / properties / max_overage_usd_per_1kAdded value: +{ + "description": "The most the plan may charge for each 1,000 emails beyond its included volume, in USD, for transactional email. A plan whose extra price is not published as a per-1,000 figure is unknown.", + "minimum": 0, + "type": "number" +} - added
Input schema / properties / request / properties / preferred / properties / min_log_retention_daysAdded value: +{ + "description": "Days the plan must keep the logs or events of sent email where the account can read them, for transactional email. Longer retention sold as an add-on does not count.", + "minimum": 1, + "type": "integer" +} - added
Input schema / properties / request / properties / preferred / properties / min_sending_domainsAdded value: +{ + "description": "Sending domains the plan must let one account authenticate, for transactional email. Met when the stated limit is at least this many (or the pages say it is unlimited); a plan whose pages do not state a limit is unknown.", + "minimum": 1, + "type": "integer" +} - added
Input schema / properties / request / properties / preferred / properties / needs_batchAdded value: +{ + "description": "The plan must transcribe recorded audio (a file or a stored recording), for speech-to-text. A plan priced for live audio only is not met.", + "type": "boolean" +} - added
Input schema / properties / request / properties / preferred / properties / needs_commercial_useAdded value: +{ + "description": "The plan must allow commercial use of the generated audio, for text-to-speech. A free plan limited to non-commercial use does not count; a plan whose pages do not say is unknown.", + "type": "boolean" +} - added
Input schema / properties / request / properties / preferred / properties / needs_dedicated_ipAdded value: +{ + "description": "The plan must come with a dedicated sending IP address, for transactional email. A dedicated IP sold only as an add-on on top of the plan, or only on another plan, does not count.", + "type": "boolean" +} - added
Input schema / properties / request / properties / preferred / properties / needs_diarizationAdded value: +{ + "description": "The plan must label who spoke (speaker diarization), for speech-to-text. Where the vendor charges extra for it, the extra price is added to the monthly cost; where the pages state no price or no inclusion the plan is unknown.", + "type": "boolean" +} - added
Input schema / properties / request / properties / preferred / properties / needs_inboundAdded value: +{ + "description": "The service must receive email for the buyer and hand it on (inbound parsing, routes), for transactional email.", + "type": "boolean" +} - added
Input schema / properties / request / properties / preferred / properties / needs_koreanAdded value: +{ + "description": "The service must voice Korean text (text-to-speech) or transcribe Korean speech (speech-to-text).", + "type": "boolean" +} - added
Input schema / properties / request / properties / preferred / properties / needs_no_min_billingAdded value: +{ + "description": "An official page must say audio is billed by the second (or an increment of seconds) with no minimum billed duration per request, for speech-to-text. A page that says nothing about rounding is unknown.", + "type": "boolean" +} - added
Input schema / properties / request / properties / preferred / properties / needs_no_trainingAdded value: +{ + "description": "An official page must say the vendor does not use the buyer's text and audio to train its models without the buyer opting in. A use that is on by default with an opt-out to ask for does not count.", + "type": "boolean" +} - added
Input schema / properties / request / properties / preferred / properties / needs_streamingAdded value: +{ + "description": "The service must return audio in real time as it is made (streaming or a WebSocket), for text-to-speech; for speech-to-text, it must transcribe live audio as it arrives. A speech-to-text price line is per mode, so a plan priced for recorded audio only is not met.", + "type": "boolean" +} - added
Input schema / properties / request / properties / preferred / properties / needs_voice_cloningAdded value: +{ + "description": "The plan must let the account clone a voice from its own recording, for text-to-speech. Cloning limited to eligible customers, a request form or an enterprise plan does not count for a plan that is not that plan.", + "type": "boolean" +} - changed
Input schema / properties / request / properties / product_types / items / enumPrevious value: -[ - "scraping_api", - "serp_api", - "headless_browser", - "platform" -]New value: +[ + "scraping_api", + "serp_api", + "headless_browser", + "platform", + "email_api", + "tts_api", + "stt_api" +]
5 tool updates
- Changed
check_conditions11 fields changed- added
Input schema / properties / captcha_solvingAdded value: +{ + "description": "The plan must solve CAPTCHAs for the browser sessions (the vendor does it, not the buyer own service).", + "type": "boolean" +} - added
Input schema / properties / min_session_minutesAdded value: +{ + "description": "Minutes one browser session must be able to run on this plan, for hosted browsers. Met when the stated longest session of the plan is at least this long; a plan whose pages do not state a session limit is unknown, and a limit the page gives only for another plan is not met.", + "exclusiveMinimum": 0, + "type": "number" +} - added
Input schema / properties / monthly_browser_hoursAdded value: +{ + "description": "Browser time per month in hours, for hosted browsers (Browserbase, Browserless) billed by browser time. It is the whole workload: give it instead of monthly_pages, monthly_searches and browser_seconds_per_page, not with them. Only browser products can serve it; other products are out of scope.", + "exclusiveMinimum": 0, + "type": "number" +} - added
Input schema / properties / persistent_profilesAdded value: +{ + "description": "The plan must keep browser profiles (login state, cookies) between sessions.", + "type": "boolean" +} - added
Input schema / properties / preferred / properties / captcha_solvingAdded value: +{ + "description": "The plan must solve CAPTCHAs for the browser sessions (the vendor does it, not the buyer own service).", + "type": "boolean" +} - added
Input schema / properties / preferred / properties / min_session_minutesAdded value: +{ + "description": "Minutes one browser session must be able to run on this plan, for hosted browsers. Met when the stated longest session of the plan is at least this long; a plan whose pages do not state a session limit is unknown, and a limit the page gives only for another plan is not met.", + "exclusiveMinimum": 0, + "type": "number" +} - added
Input schema / properties / preferred / properties / persistent_profilesAdded value: +{ + "description": "The plan must keep browser profiles (login state, cookies) between sessions.", + "type": "boolean" +} - added
Input schema / properties / preferred / properties / proxies_includedAdded value: +{ + "description": "The plan must include proxy traffic of the vendor (some gigabytes in the plan fee). Proxy traffic sold only per gigabyte on top of the fee, or only on another plan, does not count.", + "type": "boolean" +} - added
Input schema / properties / preferred / properties / session_recordingAdded value: +{ + "description": "The plan must record browser sessions (video or replay) that the buyer can watch afterwards.", + "type": "boolean" +} - added
Input schema / properties / proxies_includedAdded value: +{ + "description": "The plan must include proxy traffic of the vendor (some gigabytes in the plan fee). Proxy traffic sold only per gigabyte on top of the fee, or only on another plan, does not count.", + "type": "boolean" +} - added
Input schema / properties / session_recordingAdded value: +{ + "description": "The plan must record browser sessions (video or replay) that the buyer can watch afterwards.", + "type": "boolean" +}
- Changed
cost_scenarios10 fields changed- added
Input schema / properties / captcha_solvingAdded value: +{ + "description": "The plan must solve CAPTCHAs for the browser sessions (the vendor does it, not the buyer own service).", + "type": "boolean" +} - added
Input schema / properties / min_session_minutesAdded value: +{ + "description": "Minutes one browser session must be able to run on this plan, for hosted browsers. Met when the stated longest session of the plan is at least this long; a plan whose pages do not state a session limit is unknown, and a limit the page gives only for another plan is not met.", + "exclusiveMinimum": 0, + "type": "number" +} - added
Input schema / properties / persistent_profilesAdded value: +{ + "description": "The plan must keep browser profiles (login state, cookies) between sessions.", + "type": "boolean" +} - added
Input schema / properties / preferred / properties / captcha_solvingAdded value: +{ + "description": "The plan must solve CAPTCHAs for the browser sessions (the vendor does it, not the buyer own service).", + "type": "boolean" +} - added
Input schema / properties / preferred / properties / min_session_minutesAdded value: +{ + "description": "Minutes one browser session must be able to run on this plan, for hosted browsers. Met when the stated longest session of the plan is at least this long; a plan whose pages do not state a session limit is unknown, and a limit the page gives only for another plan is not met.", + "exclusiveMinimum": 0, + "type": "number" +} - added
Input schema / properties / preferred / properties / persistent_profilesAdded value: +{ + "description": "The plan must keep browser profiles (login state, cookies) between sessions.", + "type": "boolean" +} - added
Input schema / properties / preferred / properties / proxies_includedAdded value: +{ + "description": "The plan must include proxy traffic of the vendor (some gigabytes in the plan fee). Proxy traffic sold only per gigabyte on top of the fee, or only on another plan, does not count.", + "type": "boolean" +} - added
Input schema / properties / preferred / properties / session_recordingAdded value: +{ + "description": "The plan must record browser sessions (video or replay) that the buyer can watch afterwards.", + "type": "boolean" +} - added
Input schema / properties / proxies_includedAdded value: +{ + "description": "The plan must include proxy traffic of the vendor (some gigabytes in the plan fee). Proxy traffic sold only per gigabyte on top of the fee, or only on another plan, does not count.", + "type": "boolean" +} - added
Input schema / properties / session_recordingAdded value: +{ + "description": "The plan must record browser sessions (video or replay) that the buyer can watch afterwards.", + "type": "boolean" +}
- Changed
relax_conditions12 fields changed- added
Input schema / properties / captcha_solvingAdded value: +{ + "description": "The plan must solve CAPTCHAs for the browser sessions (the vendor does it, not the buyer own service).", + "type": "boolean" +} - added
Input schema / properties / min_session_minutesAdded value: +{ + "description": "Minutes one browser session must be able to run on this plan, for hosted browsers. Met when the stated longest session of the plan is at least this long; a plan whose pages do not state a session limit is unknown, and a limit the page gives only for another plan is not met.", + "exclusiveMinimum": 0, + "type": "number" +} - changed
Input schema / properties / negotiable / descriptionPrevious value: -"Conditions the user said can change: monthly_volume, concurrency, rate_limit, monthly_budget, billing_type, free_allowance, failed_request_billing, success_billing, target_error_billing, geo_targeting, data_region, serp_response_mode, serp_localization, serp_result_types, serp_engines, crawl_page_limit, mcp_official, mcp_remote, mcp_auth, zdr, soc2, search_content. Default: every required condition, each marked ask_user because the user has not said it can change."New value: +"Conditions the user said can change: monthly_volume, concurrency, rate_limit, monthly_budget, billing_type, free_allowance, failed_request_billing, success_billing, target_error_billing, geo_targeting, data_region, serp_response_mode, serp_localization, serp_result_types, serp_engines, crawl_page_limit, mcp_official, mcp_remote, mcp_auth, zdr, soc2, search_content, min_session_minutes, proxies_included, captcha_solving, session_recording, persistent_profiles. Default: every required condition, each marked ask_user because the user has not said it can change." - changed
Input schema / properties / negotiable / items / enumPrevious value: -[ - "monthly_volume", - "concurrency", - "rate_limit", - "monthly_budget", - "billing_type", - "free_allowance", - "failed_request_billing", - "success_billing", - "target_error_billing", - "geo_targeting", - "data_region", - "serp_response_mode", - "serp_localization", - "serp_result_types", - "serp_engines", - "crawl_page_limit", - "mcp_official", - "mcp_remote", - "mcp_auth", - "zdr", - "soc2", - "search_content" -]New value: +[ + "monthly_volume", + "concurrency", + "rate_limit", + "monthly_budget", + "billing_type", + "free_allowance", + "failed_request_billing", + "success_billing", + "target_error_billing", + "geo_targeting", + "data_region", + "serp_response_mode", + "serp_localization", + "serp_result_types", + "serp_engines", + "crawl_page_limit", + "mcp_official", + "mcp_remote", + "mcp_auth", + "zdr", + "soc2", + "search_content", + "min_session_minutes", + "proxies_included", + "captcha_solving", + "session_recording", + "persistent_profiles" +] - added
Input schema / properties / persistent_profilesAdded value: +{ + "description": "The plan must keep browser profiles (login state, cookies) between sessions.", + "type": "boolean" +} - added
Input schema / properties / preferred / properties / captcha_solvingAdded value: +{ + "description": "The plan must solve CAPTCHAs for the browser sessions (the vendor does it, not the buyer own service).", + "type": "boolean" +} - added
Input schema / properties / preferred / properties / min_session_minutesAdded value: +{ + "description": "Minutes one browser session must be able to run on this plan, for hosted browsers. Met when the stated longest session of the plan is at least this long; a plan whose pages do not state a session limit is unknown, and a limit the page gives only for another plan is not met.", + "exclusiveMinimum": 0, + "type": "number" +} - added
Input schema / properties / preferred / properties / persistent_profilesAdded value: +{ + "description": "The plan must keep browser profiles (login state, cookies) between sessions.", + "type": "boolean" +} - added
Input schema / properties / preferred / properties / proxies_includedAdded value: +{ + "description": "The plan must include proxy traffic of the vendor (some gigabytes in the plan fee). Proxy traffic sold only per gigabyte on top of the fee, or only on another plan, does not count.", + "type": "boolean" +} - added
Input schema / properties / preferred / properties / session_recordingAdded value: +{ + "description": "The plan must record browser sessions (video or replay) that the buyer can watch afterwards.", + "type": "boolean" +} - added
Input schema / properties / proxies_includedAdded value: +{ + "description": "The plan must include proxy traffic of the vendor (some gigabytes in the plan fee). Proxy traffic sold only per gigabyte on top of the fee, or only on another plan, does not count.", + "type": "boolean" +} - added
Input schema / properties / session_recordingAdded value: +{ + "description": "The plan must record browser sessions (video or replay) that the buyer can watch afterwards.", + "type": "boolean" +}
- Changed
search11 fields changed- added
Input schema / properties / captcha_solvingAdded value: +{ + "description": "The plan must solve CAPTCHAs for the browser sessions (the vendor does it, not the buyer own service).", + "type": "boolean" +} - added
Input schema / properties / min_session_minutesAdded value: +{ + "description": "Minutes one browser session must be able to run on this plan, for hosted browsers. Met when the stated longest session of the plan is at least this long; a plan whose pages do not state a session limit is unknown, and a limit the page gives only for another plan is not met.", + "exclusiveMinimum": 0, + "type": "number" +} - added
Input schema / properties / monthly_browser_hoursAdded value: +{ + "description": "Browser time per month in hours, for hosted browsers (Browserbase, Browserless) billed by browser time. It is the whole workload: give it instead of monthly_pages, monthly_searches and browser_seconds_per_page, not with them. Only browser products can serve it; other products are out of scope.", + "exclusiveMinimum": 0, + "type": "number" +} - added
Input schema / properties / persistent_profilesAdded value: +{ + "description": "The plan must keep browser profiles (login state, cookies) between sessions.", + "type": "boolean" +} - added
Input schema / properties / preferred / properties / captcha_solvingAdded value: +{ + "description": "The plan must solve CAPTCHAs for the browser sessions (the vendor does it, not the buyer own service).", + "type": "boolean" +} - added
Input schema / properties / preferred / properties / min_session_minutesAdded value: +{ + "description": "Minutes one browser session must be able to run on this plan, for hosted browsers. Met when the stated longest session of the plan is at least this long; a plan whose pages do not state a session limit is unknown, and a limit the page gives only for another plan is not met.", + "exclusiveMinimum": 0, + "type": "number" +} - added
Input schema / properties / preferred / properties / persistent_profilesAdded value: +{ + "description": "The plan must keep browser profiles (login state, cookies) between sessions.", + "type": "boolean" +} - added
Input schema / properties / preferred / properties / proxies_includedAdded value: +{ + "description": "The plan must include proxy traffic of the vendor (some gigabytes in the plan fee). Proxy traffic sold only per gigabyte on top of the fee, or only on another plan, does not count.", + "type": "boolean" +} - added
Input schema / properties / preferred / properties / session_recordingAdded value: +{ + "description": "The plan must record browser sessions (video or replay) that the buyer can watch afterwards.", + "type": "boolean" +} - added
Input schema / properties / proxies_includedAdded value: +{ + "description": "The plan must include proxy traffic of the vendor (some gigabytes in the plan fee). Proxy traffic sold only per gigabyte on top of the fee, or only on another plan, does not count.", + "type": "boolean" +} - added
Input schema / properties / session_recordingAdded value: +{ + "description": "The plan must record browser sessions (video or replay) that the buyer can watch afterwards.", + "type": "boolean" +}
- Changed
verify_answer21 fields changed- added
Input schema / properties / claims / items / properties / conditions / properties / captcha_solvingAdded value: +{ + "enum": [ + "met", + "not_met", + "unknown" + ], + "type": "string" +} - added
Input schema / properties / claims / items / properties / conditions / properties / min_session_minutesAdded value: +{ + "enum": [ + "met", + "not_met", + "unknown" + ], + "type": "string" +} - added
Input schema / properties / claims / items / properties / conditions / properties / persistent_profilesAdded value: +{ + "enum": [ + "met", + "not_met", + "unknown" + ], + "type": "string" +} - added
Input schema / properties / claims / items / properties / conditions / properties / proxies_includedAdded value: +{ + "enum": [ + "met", + "not_met", + "unknown" + ], + "type": "string" +} - added
Input schema / properties / claims / items / properties / conditions / properties / session_recordingAdded value: +{ + "enum": [ + "met", + "not_met", + "unknown" + ], + "type": "string" +} - added
Input schema / properties / claims / items / properties / values / properties / captcha_solvingAdded value: +{ + "type": [ + "number", + "string", + "boolean", + "object", + "array", + "null" + ] +} - added
Input schema / properties / claims / items / properties / values / properties / max_session_minutesAdded value: +{ + "type": [ + "number", + "string", + "boolean", + "object", + "array", + "null" + ] +} - added
Input schema / properties / claims / items / properties / values / properties / persistent_profilesAdded value: +{ + "type": [ + "number", + "string", + "boolean", + "object", + "array", + "null" + ] +} - added
Input schema / properties / claims / items / properties / values / properties / proxiesAdded value: +{ + "type": [ + "number", + "string", + "boolean", + "object", + "array", + "null" + ] +} - added
Input schema / properties / claims / items / properties / values / properties / session_recordingAdded value: +{ + "type": [ + "number", + "string", + "boolean", + "object", + "array", + "null" + ] +} - added
Input schema / properties / request / properties / captcha_solvingAdded value: +{ + "description": "The plan must solve CAPTCHAs for the browser sessions (the vendor does it, not the buyer own service).", + "type": "boolean" +} - added
Input schema / properties / request / properties / min_session_minutesAdded value: +{ + "description": "Minutes one browser session must be able to run on this plan, for hosted browsers. Met when the stated longest session of the plan is at least this long; a plan whose pages do not state a session limit is unknown, and a limit the page gives only for another plan is not met.", + "exclusiveMinimum": 0, + "type": "number" +} - added
Input schema / properties / request / properties / monthly_browser_hoursAdded value: +{ + "description": "Browser time per month in hours, for hosted browsers (Browserbase, Browserless) billed by browser time. It is the whole workload: give it instead of monthly_pages, monthly_searches and browser_seconds_per_page, not with them. Only browser products can serve it; other products are out of scope.", + "exclusiveMinimum": 0, + "type": "number" +} - added
Input schema / properties / request / properties / persistent_profilesAdded value: +{ + "description": "The plan must keep browser profiles (login state, cookies) between sessions.", + "type": "boolean" +} - added
Input schema / properties / request / properties / preferred / properties / captcha_solvingAdded value: +{ + "description": "The plan must solve CAPTCHAs for the browser sessions (the vendor does it, not the buyer own service).", + "type": "boolean" +} - added
Input schema / properties / request / properties / preferred / properties / min_session_minutesAdded value: +{ + "description": "Minutes one browser session must be able to run on this plan, for hosted browsers. Met when the stated longest session of the plan is at least this long; a plan whose pages do not state a session limit is unknown, and a limit the page gives only for another plan is not met.", + "exclusiveMinimum": 0, + "type": "number" +} - added
Input schema / properties / request / properties / preferred / properties / persistent_profilesAdded value: +{ + "description": "The plan must keep browser profiles (login state, cookies) between sessions.", + "type": "boolean" +} - added
Input schema / properties / request / properties / preferred / properties / proxies_includedAdded value: +{ + "description": "The plan must include proxy traffic of the vendor (some gigabytes in the plan fee). Proxy traffic sold only per gigabyte on top of the fee, or only on another plan, does not count.", + "type": "boolean" +} - added
Input schema / properties / request / properties / preferred / properties / session_recordingAdded value: +{ + "description": "The plan must record browser sessions (video or replay) that the buyer can watch afterwards.", + "type": "boolean" +} - added
Input schema / properties / request / properties / proxies_includedAdded value: +{ + "description": "The plan must include proxy traffic of the vendor (some gigabytes in the plan fee). Proxy traffic sold only per gigabyte on top of the fee, or only on another plan, does not count.", + "type": "boolean" +} - added
Input schema / properties / request / properties / session_recordingAdded value: +{ + "description": "The plan must record browser sessions (video or replay) that the buyer can watch afterwards.", + "type": "boolean" +}
5 tool updates
- Changed
check_conditions1 field changed- changed
Output schema / anyOfPrevious value: -[ - { - "properties": { - "answer": { - "description": "One sentence that opens the answer: the cheapest checked plan (or plan of the same product) that meets every required condition with its link, or, when none does, the closest checked plan with what it does not meet or what is unknown, and its link. The plan is written as a markdown link, [Provider Plan](visit link), at the end of the sentence.", - "type": "string" - }, - "as_of": { - "type": "string" - }, - "assumptions": { - "items": { - "type": "string" - }, - "type": "array" - }, - "link_notes": { - "additionalProperties": { - "type": "string" - }, - "description": "The note of each link level (link.link_level) of the plans in this result, stated once.", - "type": "object" - }, - "needs_input": { - "items": { - "properties": { - "field": { - "type": "string" - }, - "reason": { - "type": "string" - } - }, - "required": [ - "field", - "reason" - ], - "type": "object" - }, - "type": "array" - }, - "notes": { - "items": { - "type": "string" - }, - "type": "array" - }, - "request": { - "type": "object" - }, - "resolution": { - "description": "How each entry of plans was read.", - "items": { - "properties": { - "candidates": { - "items": { - "properties": { - "listed": { - "type": "boolean" - }, - "offer_id": { - "type": "string" - }, - "offer_name": { - "type": "string" - }, - "product_name": { - "type": "string" - }, - "provider_name": { - "type": "string" - } - }, - "required": [ - "offer_id", - "offer_name", - "provider_name" - ], - "type": "object" - }, - "type": "array" - }, - "candidates_total": { - "type": "integer" - }, - "input": { - "type": "string" - }, - "matched_by": { - "enum": [ - "id", - "name", - "url", - null - ] - }, - "note": { - "type": [ - "string", - "null" - ] - }, - "offer_id": { - "type": [ - "string", - "null" - ] - }, - "status": { - "description": "resolved: one plan, checked in results; ambiguous: several plans fit, listed in candidates and not checked; not_found: no plan in the catalog fits.", - "enum": [ - "resolved", - "ambiguous", - "not_found" - ] - } - }, - "required": [ - "input", - "status", - "offer_id", - "candidates" - ], - "type": "object" - }, - "type": "array" - }, - "results": { - "items": { - "properties": { - "assumptions": { - "items": { - "type": "string" - }, - "type": "array" - }, - "at_limit": { - "description": "Present for a plan with no automatic extra usage: what the official page says happens at the limit (kind no_extra_usage or restart_by_hand), with its sentence. With a workload that needs restarts, restarts gives their count, the price of each and the total, the numbers of monthly_cost.explanation.", - "properties": { - "evidence": { - "properties": { - "quote": { - "type": "string" - }, - "source": { - "type": "string" - } - }, - "type": "object" - }, - "kind": { - "enum": [ - "no_extra_usage", - "restart_by_hand" - ] - }, - "restarts": { - "properties": { - "count": { - "properties": { - "high": { - "type": "integer" - }, - "low": { - "type": "integer" - } - }, - "type": "object" - }, - "total_usd": { - "properties": { - "high": { - "type": "number" - }, - "low": { - "type": "number" - } - }, - "type": "object" - }, - "usd_each": { - "type": "number" - } - }, - "type": "object" - }, - "text": { - "type": "string" - } - }, - "required": [ - "kind", - "text", - "evidence" - ], - "type": "object" - }, - "billing": { - "type": "string" - }, - "billing_options": { - "items": { - "type": "string" - }, - "type": "array" - }, - "cheapest_in_product": { - "description": "The cheapest listed plan of the same product that meets every required condition of this call; is_this_plan is true when that is the checked plan. null when no plan of the product meets them all.", - "properties": { - "billing": { - "type": "string" - }, - "is_this_plan": { - "type": "boolean" - }, - "monthly_cost": { - "type": "object" - }, - "offer_id": { - "type": "string" - }, - "offer_name": { - "type": "string" - }, - "page_url": { - "type": "string" - } - }, - "required": [ - "offer_id", - "offer_name", - "billing", - "monthly_cost", - "is_this_plan" - ], - "type": [ - "object", - "null" - ] - }, - "checked_at": { - "type": [ - "string", - "null" - ] - }, - "conditions": { - "items": { - "properties": { - "condition": { - "type": "string" - }, - "facts": { - "description": "Facts the verdict was judged from. The monthly budget is judged from monthly_cost; its price facts are listed there only.", - "items": { - "properties": { - "also_stated_in": { - "description": "get_details only: other official machine-readable documents of the provider (llms.txt, llms-full.txt, OpenAPI files, MCP tool listings) that contain the same quoted sentences.", - "items": { - "type": "string" - }, - "type": "array" - }, - "applies_to": { - "description": "get_details only: billing options (billing) or search engines (search_engines) the fact is limited to.", - "type": [ - "object", - "null" - ] - }, - "at_limit": { - "description": "Present for a plan with no automatic extra usage: what the official page says happens at the limit (kind no_extra_usage or restart_by_hand), with its sentence. With a workload that needs restarts, restarts gives their count, the price of each and the total, the numbers of monthly_cost.explanation.", - "properties": { - "evidence": { - "properties": { - "quote": { - "type": "string" - }, - "source": { - "type": "string" - } - }, - "type": "object" - }, - "kind": { - "enum": [ - "no_extra_usage", - "restart_by_hand" - ] - }, - "restarts": { - "properties": { - "count": { - "properties": { - "high": { - "type": "integer" - }, - "low": { - "type": "integer" - } - }, - "type": "object" - }, - "total_usd": { - "properties": { - "high": { - "type": "number" - }, - "low": { - "type": "number" - } - }, - "type": "object" - }, - "usd_each": { - "type": "number" - } - }, - "type": "object" - }, - "text": { - "type": "string" - } - }, - "required": [ - "kind", - "text", - "evidence" - ], - "type": "object" - }, - "checked_at": { - "type": [ - "string", - "null" - ] - }, - "concurrency_unit": { - "description": "get_details, concurrency only: the unit the page states the value in (unit, text such as \"100 threads\"). Against concurrent requests: equals_requests (value, text and the official line of the unit rule) when the unit rule counts this unit as requests, else note \"not the same unit as concurrent requests\"; \"unit not stated\" when the page names none.", - "type": "object" - }, - "derived": { - "description": "How the value follows from the quoted sentence when it is not literal.", - "type": "string" - }, - "evidence": { - "items": { - "properties": { - "quote": { - "description": "The sentence as it appears on that page.", - "type": "string" - }, - "retrieved_at": { - "description": "Date the page was read (YYYY-MM-DD). Only with detail=full.", - "type": "string" - }, - "source": { - "description": "Official page the sentence was found on.", - "type": "string" - }, - "source_type": { - "description": "Only with detail=full.", - "enum": [ - "official_pricing", - "official_docs", - "third_party" - ] - } - }, - "required": [ - "source", - "quote" - ], - "type": "object" - }, - "type": "array" - }, - "exceptions": { - "description": "get_details only: plans with a different value.", - "type": "array" - }, - "key": { - "type": "string" - }, - "label": { - "type": "string" - }, - "level": { - "description": "Where the fact is recorded: offer (the plan), product or provider.", - "type": [ - "string", - "null" - ] - }, - "note": { - "type": "string" - }, - "stale": { - "type": "boolean" - }, - "status": { - "description": "TRUE: stated with the value; FALSE / NOT_SUPPORTED: stated as unavailable; UNKNOWN: not stated; CONFLICT: official pages disagree (value lists each version); STALE: past its recheck date; MISSING: not recorded.", - "enum": [ - "TRUE", - "FALSE", - "NOT_SUPPORTED", - "UNKNOWN", - "CONFLICT", - "STALE", - "MISSING" - ] - }, - "value": {}, - "via_exception": { - "description": "Present and true when a plan-specific exception replaced the general value.", - "type": "boolean" - } - }, - "required": [ - "key", - "status", - "value", - "level", - "evidence", - "checked_at" - ], - "type": "object" - }, - "type": "array" - }, - "label": { - "type": "string" - }, - "reason": { - "type": "string" - }, - "required": { - "type": "boolean" - }, - "verdict": { - "enum": [ - "MET", - "UNMET", - "UNKNOWN", - "UNIT_MISMATCH", - "UNIT_UNKNOWN" - ] - } - }, - "required": [ - "condition", - "label", - "required", - "verdict", - "reason", - "facts" - ], - "type": "object" - }, - "type": "array" - }, - "facts_omitted": { - "description": "search only: present and true when the source sentences under the conditions were left out so that the response fits one response; the verdicts, reasons and costs are unchanged. Ask check_conditions with the offer_id or get_details for the sentences.", - "type": "boolean" - }, - "link": { - "properties": { - "affiliate": { - "properties": { - "disclosure": { - "type": [ - "string", - "null" - ] - }, - "program": { - "type": [ - "string", - "null" - ] - }, - "status": { - "type": "string" - } - }, - "required": [ - "status" - ], - "type": "object" - }, - "landing": { - "type": "string" - }, - "link_level": { - "type": "string" - }, - "provider_url": { - "description": "The provider page itself. Only in a page made for a browser, where url is this service's address that forwards to it; MCP and REST results do not carry it.", - "type": "string" - }, - "url": { - "description": "The only address to visit the plan: this service's /go/<offer_id>?r=<token> address, which forwards to the provider page. The token is made for this response and holds nothing about you.", - "type": "string" - } - }, - "required": [ - "url", - "landing", - "link_level", - "affiliate" - ], - "type": "object" - }, - "listed": { - "type": "boolean" - }, - "match": { - "enum": [ - "FULL_MATCH", - "PARTIAL_MATCH", - "NO_MATCH" - ] - }, - "meets_all": { - "description": "Judged against the required conditions of this call only: true when every one is met, false when one is not met, \"unknown\" when none fails and one is not stated on the official pages.", - "enum": [ - true, - false, - "unknown" - ] - }, - "monthly_cost": { - "properties": { - "explanation": { - "type": "string" - }, - "facts": { - "description": "Price facts the cost was computed from.", - "items": { - "properties": { - "also_stated_in": { - "description": "get_details only: other official machine-readable documents of the provider (llms.txt, llms-full.txt, OpenAPI files, MCP tool listings) that contain the same quoted sentences.", - "items": { - "type": "string" - }, - "type": "array" - }, - "applies_to": { - "description": "get_details only: billing options (billing) or search engines (search_engines) the fact is limited to.", - "type": [ - "object", - "null" - ] - }, - "at_limit": { - "description": "Present for a plan with no automatic extra usage: what the official page says happens at the limit (kind no_extra_usage or restart_by_hand), with its sentence. With a workload that needs restarts, restarts gives their count, the price of each and the total, the numbers of monthly_cost.explanation.", - "properties": { - "evidence": { - "properties": { - "quote": { - "type": "string" - }, - "source": { - "type": "string" - } - }, - "type": "object" - }, - "kind": { - "enum": [ - "no_extra_usage", - "restart_by_hand" - ] - }, - "restarts": { - "properties": { - "count": { - "properties": { - "high": { - "type": "integer" - }, - "low": { - "type": "integer" - } - }, - "type": "object" - }, - "total_usd": { - "properties": { - "high": { - "type": "number" - }, - "low": { - "type": "number" - } - }, - "type": "object" - }, - "usd_each": { - "type": "number" - } - }, - "type": "object" - }, - "text": { - "type": "string" - } - }, - "required": [ - "kind", - "text", - "evidence" - ], - "type": "object" - }, - "checked_at": { - "type": [ - "string", - "null" - ] - }, - "concurrency_unit": { - "description": "get_details, concurrency only: the unit the page states the value in (unit, text such as \"100 threads\"). Against concurrent requests: equals_requests (value, text and the official line of the unit rule) when the unit rule counts this unit as requests, else note \"not the same unit as concurrent requests\"; \"unit not stated\" when the page names none.", - "type": "object" - }, - "derived": { - "description": "How the value follows from the quoted sentence when it is not literal.", - "type": "string" - }, - "evidence": { - "items": { - "properties": { - "quote": { - "description": "The sentence as it appears on that page.", - "type": "string" - }, - "retrieved_at": { - "description": "Date the page was read (YYYY-MM-DD). Only with detail=full.", - "type": "string" - }, - "source": { - "description": "Official page the sentence was found on.", - "type": "string" - }, - "source_type": { - "description": "Only with detail=full.", - "enum": [ - "official_pricing", - "official_docs", - "third_party" - ] - } - }, - "required": [ - "source", - "quote" - ], - "type": "object" - }, - "type": "array" - }, - "exceptions": { - "description": "get_details only: plans with a different value.", - "type": "array" - }, - "key": { - "type": "string" - }, - "label": { - "type": "string" - }, - "level": { - "description": "Where the fact is recorded: offer (the plan), product or provider.", - "type": [ - "string", - "null" - ] - }, - "note": { - "type": "string" - }, - "stale": { - "type": "boolean" - }, - "status": { - "description": "TRUE: stated with the value; FALSE / NOT_SUPPORTED: stated as unavailable; UNKNOWN: not stated; CONFLICT: official pages disagree (value lists each version); STALE: past its recheck date; MISSING: not recorded.", - "enum": [ - "TRUE", - "FALSE", - "NOT_SUPPORTED", - "UNKNOWN", - "CONFLICT", - "STALE", - "MISSING" - ] - }, - "value": {}, - "via_exception": { - "description": "Present and true when a plan-specific exception replaced the general value.", - "type": "boolean" - } - }, - "required": [ - "key", - "status", - "value", - "level", - "evidence", - "checked_at" - ], - "type": "object" - }, - "type": "array" - }, - "high": { - "type": [ - "number", - "null" - ] - }, - "low": { - "type": [ - "number", - "null" - ] - }, - "lower_bound": { - "type": [ - "number", - "null" - ] - }, - "status": { - "enum": [ - "exact", - "range", - "lower_bound", - "unknown" - ] - }, - "upfront_usd": { - "type": [ - "number", - "null" - ] - }, - "usd": { - "type": [ - "number", - "null" - ] - } - }, - "required": [ - "status", - "usd", - "explanation" - ], - "type": "object" - }, - "offer_id": { - "type": "string" - }, - "offer_name": { - "type": "string" - }, - "page_url": { - "type": "string" - }, - "preferred_met": { - "type": "integer" - }, - "prices_exclude_tax": { - "type": [ - "boolean", - "null" - ] - }, - "product_id": { - "type": "string" - }, - "product_name": { - "type": "string" - }, - "provider_id": { - "type": "string" - }, - "provider_name": { - "type": "string" - }, - "unknown_conditions": { - "items": { - "type": "string" - }, - "type": "array" - }, - "unmet_conditions": { - "items": { - "type": "string" - }, - "type": "array" - }, - "verdict": { - "description": "One sentence: the conditions met, or the ones not met or not stated, with the reason.", - "type": "string" - } - }, - "required": [ - "offer_id", - "offer_name", - "product_id", - "provider_name", - "match", - "meets_all", - "verdict", - "billing", - "monthly_cost", - "conditions", - "unmet_conditions", - "unknown_conditions", - "link", - "checked_at", - "cheapest_in_product" - ], - "type": "object" - }, - "type": "array" - }, - "show_text": { - "description": "Ready to show: one line per listed plan, in list order, \"Meets all N: [Provider Plan](visit link)\" for a plan that meets every required condition of the call, \"Closest: [Provider Plan](visit link)\" for any other. The plan is a markdown link to its visit link, which carries the token of this response. Absent when no plan is listed.", - "type": "string" - } - }, - "required": [ - "answer", - "as_of", - "needs_input", - "results", - "assumptions", - "notes" - ], - "type": "object" - }, - { - "properties": { - "answer": { - "type": "string" - }, - "as_of": { - "type": "string" - }, - "format": { - "enum": [ - "brief" - ] - }, - "needs_input": { - "items": { - "properties": { - "field": { - "type": "string" - }, - "reason": { - "type": "string" - } - }, - "required": [ - "field", - "reason" - ], - "type": "object" - }, - "type": "array" - }, - "resolution": { - "type": "array" - }, - "results": { - "items": { - "properties": { - "conditions": { - "items": { - "properties": { - "condition": { - "type": "string" - }, - "quote": { - "description": "One official source sentence, 200 characters at most.", - "type": "string" - }, - "reason": { - "description": "One line, 120 characters at most.", - "type": "string" - }, - "required": { - "description": "Present only on a preferred (nice-to-have) condition.", - "enum": [ - false - ] - }, - "source": { - "description": "Official page the sentence was found on.", - "type": [ - "string", - "null" - ] - }, - "verdict": { - "enum": [ - "MET", - "UNMET", - "UNKNOWN", - "UNIT_MISMATCH", - "UNIT_UNKNOWN" - ] - } - }, - "required": [ - "condition", - "verdict", - "reason" - ], - "type": "object" - }, - "type": "array" - }, - "match": { - "enum": [ - "FULL_MATCH", - "PARTIAL_MATCH", - "NO_MATCH" - ] - }, - "meets_all": { - "description": "Judged against the required conditions of this call only: true when every one is met, false when one is not met, \"unknown\" when none fails and one is not stated on the official pages.", - "enum": [ - true, - false, - "unknown" - ] - }, - "monthly_cost": { - "description": "status, usd, and low, high or lower_bound when they differ; as in the full result.", - "type": "object" - }, - "offer_id": { - "type": "string" - }, - "offer_name": { - "type": "string" - }, - "provider": { - "type": "string" - } - }, - "required": [ - "offer_id", - "offer_name", - "provider", - "meets_all", - "monthly_cost", - "conditions" - ], - "type": "object" - }, - "type": "array" - }, - "show_text": { - "description": "Ready to show: one line per listed plan, in list order, \"Meets all N: [Provider Plan](visit link)\" for a plan that meets every required condition of the call, \"Closest: [Provider Plan](visit link)\" for any other. The plan is a markdown link to its visit link, which carries the token of this response. Absent when no plan is listed.", - "type": "string" - } - }, - "required": [ - "format", - "answer", - "as_of", - "needs_input", - "results" - ], - "type": "object" - } -]New value: +[ + { + "properties": { + "answer": { + "description": "One sentence that opens the answer: the cheapest checked plan (or plan of the same product) that meets every required condition with its link, or, when none does, the closest checked plan with what it does not meet or what is unknown, and its link. The plan is written as a markdown link, [Provider Plan](visit link), at the end of the sentence.", + "type": "string" + }, + "as_of": { + "type": "string" + }, + "assumptions": { + "items": { + "type": "string" + }, + "type": "array" + }, + "link_notes": { + "additionalProperties": { + "type": "string" + }, + "description": "The note of each link level (link.link_level) of the plans in this result, stated once.", + "type": "object" + }, + "needs_input": { + "items": { + "properties": { + "field": { + "type": "string" + }, + "reason": { + "type": "string" + } + }, + "required": [ + "field", + "reason" + ], + "type": "object" + }, + "type": "array" + }, + "notes": { + "items": { + "type": "string" + }, + "type": "array" + }, + "request": { + "type": "object" + }, + "resolution": { + "description": "How each entry of plans was read.", + "items": { + "properties": { + "candidates": { + "items": { + "properties": { + "listed": { + "type": "boolean" + }, + "offer_id": { + "type": "string" + }, + "offer_name": { + "type": "string" + }, + "product_name": { + "type": "string" + }, + "provider_name": { + "type": "string" + } + }, + "required": [ + "offer_id", + "offer_name", + "provider_name" + ], + "type": "object" + }, + "type": "array" + }, + "candidates_total": { + "type": "integer" + }, + "input": { + "type": "string" + }, + "matched_by": { + "enum": [ + "id", + "name", + "url", + null + ] + }, + "note": { + "type": [ + "string", + "null" + ] + }, + "offer_id": { + "type": [ + "string", + "null" + ] + }, + "status": { + "description": "resolved: one plan, checked in results; ambiguous: several plans fit, listed in candidates and not checked; not_found: no plan in the catalog fits.", + "enum": [ + "resolved", + "ambiguous", + "not_found" + ] + } + }, + "required": [ + "input", + "status", + "offer_id", + "candidates" + ], + "type": "object" + }, + "type": "array" + }, + "results": { + "items": { + "properties": { + "assumptions": { + "items": { + "type": "string" + }, + "type": "array" + }, + "at_limit": { + "description": "Present for a plan with no automatic extra usage: what the official page says happens at the limit (kind no_extra_usage or restart_by_hand), with its sentence. With a workload that needs restarts, restarts gives their count, the price of each and the total, the numbers of monthly_cost.explanation.", + "properties": { + "evidence": { + "properties": { + "quote": { + "type": "string" + }, + "source": { + "type": "string" + } + }, + "type": "object" + }, + "kind": { + "enum": [ + "no_extra_usage", + "restart_by_hand" + ] + }, + "restarts": { + "properties": { + "count": { + "properties": { + "high": { + "type": "integer" + }, + "low": { + "type": "integer" + } + }, + "type": "object" + }, + "total_usd": { + "properties": { + "high": { + "type": "number" + }, + "low": { + "type": "number" + } + }, + "type": "object" + }, + "usd_each": { + "type": "number" + } + }, + "type": "object" + }, + "text": { + "type": "string" + } + }, + "required": [ + "kind", + "text", + "evidence" + ], + "type": "object" + }, + "billing": { + "type": "string" + }, + "billing_options": { + "items": { + "type": "string" + }, + "type": "array" + }, + "cheapest_in_product": { + "description": "The cheapest listed plan of the same product that meets every required condition of this call; is_this_plan is true when that is the checked plan. null when no plan of the product meets them all.", + "properties": { + "billing": { + "type": "string" + }, + "is_this_plan": { + "type": "boolean" + }, + "monthly_cost": { + "type": "object" + }, + "offer_id": { + "type": "string" + }, + "offer_name": { + "type": "string" + }, + "page_url": { + "type": "string" + } + }, + "required": [ + "offer_id", + "offer_name", + "billing", + "monthly_cost", + "is_this_plan" + ], + "type": [ + "object", + "null" + ] + }, + "checked_at": { + "type": [ + "string", + "null" + ] + }, + "conditions": { + "items": { + "properties": { + "condition": { + "type": "string" + }, + "facts": { + "description": "Facts the verdict was judged from. The monthly budget is judged from monthly_cost; its price facts are listed there only.", + "items": { + "properties": { + "also_stated_in": { + "description": "get_details only: other official machine-readable documents of the provider (llms.txt, llms-full.txt, OpenAPI files, MCP tool listings) that contain the same quoted sentences.", + "items": { + "type": "string" + }, + "type": "array" + }, + "applies_to": { + "description": "get_details only: billing options (billing) or search engines (search_engines) the fact is limited to.", + "type": [ + "object", + "null" + ] + }, + "at_limit": { + "description": "Present for a plan with no automatic extra usage: what the official page says happens at the limit (kind no_extra_usage or restart_by_hand), with its sentence. With a workload that needs restarts, restarts gives their count, the price of each and the total, the numbers of monthly_cost.explanation.", + "properties": { + "evidence": { + "properties": { + "quote": { + "type": "string" + }, + "source": { + "type": "string" + } + }, + "type": "object" + }, + "kind": { + "enum": [ + "no_extra_usage", + "restart_by_hand" + ] + }, + "restarts": { + "properties": { + "count": { + "properties": { + "high": { + "type": "integer" + }, + "low": { + "type": "integer" + } + }, + "type": "object" + }, + "total_usd": { + "properties": { + "high": { + "type": "number" + }, + "low": { + "type": "number" + } + }, + "type": "object" + }, + "usd_each": { + "type": "number" + } + }, + "type": "object" + }, + "text": { + "type": "string" + } + }, + "required": [ + "kind", + "text", + "evidence" + ], + "type": "object" + }, + "checked_at": { + "type": [ + "string", + "null" + ] + }, + "concurrency_unit": { + "description": "get_details, concurrency only: the unit the page states the value in (unit, text such as \"100 threads\"). Against concurrent requests: equals_requests (value, text and the official line of the unit rule) when the unit rule counts this unit as requests, else note \"not the same unit as concurrent requests\"; \"unit not stated\" when the page names none.", + "type": "object" + }, + "derived": { + "description": "How the value follows from the quoted sentence when it is not literal.", + "type": "string" + }, + "evidence": { + "items": { + "properties": { + "quote": { + "description": "The sentence as it appears on that page.", + "type": "string" + }, + "retrieved_at": { + "description": "Date the page was read (YYYY-MM-DD). Only with detail=full.", + "type": "string" + }, + "source": { + "description": "Official page the sentence was found on.", + "type": "string" + }, + "source_type": { + "description": "Only with detail=full.", + "enum": [ + "official_pricing", + "official_docs", + "third_party" + ] + } + }, + "required": [ + "source", + "quote" + ], + "type": "object" + }, + "type": "array" + }, + "exceptions": { + "description": "get_details only: plans with a different value.", + "type": "array" + }, + "key": { + "type": "string" + }, + "label": { + "type": "string" + }, + "level": { + "description": "Where the fact is recorded: offer (the plan), product or provider.", + "type": [ + "string", + "null" + ] + }, + "note": { + "type": "string" + }, + "stale": { + "type": "boolean" + }, + "status": { + "description": "TRUE: stated with the value; FALSE / NOT_SUPPORTED: stated as unavailable; UNKNOWN: not stated; CONFLICT: official pages disagree (value lists each version); STALE: past its recheck date; MISSING: not recorded.", + "enum": [ + "TRUE", + "FALSE", + "NOT_SUPPORTED", + "UNKNOWN", + "CONFLICT", + "STALE", + "MISSING" + ] + }, + "value": {}, + "via_exception": { + "description": "Present and true when a plan-specific exception replaced the general value.", + "type": "boolean" + } + }, + "required": [ + "key", + "status", + "value", + "level", + "evidence", + "checked_at" + ], + "type": "object" + }, + "type": "array" + }, + "label": { + "type": "string" + }, + "reason": { + "type": "string" + }, + "required": { + "type": "boolean" + }, + "verdict": { + "enum": [ + "MET", + "UNMET", + "UNKNOWN", + "UNIT_MISMATCH", + "UNIT_UNKNOWN" + ] + } + }, + "required": [ + "condition", + "label", + "required", + "verdict", + "reason", + "facts" + ], + "type": "object" + }, + "type": "array" + }, + "facts_omitted": { + "description": "search only: present and true when the source sentences under the conditions were left out so that the response fits one response; the verdicts, reasons and costs are unchanged. Ask check_conditions with the offer_id or get_details for the sentences.", + "type": "boolean" + }, + "link": { + "properties": { + "affiliate": { + "properties": { + "disclosure": { + "type": [ + "string", + "null" + ] + }, + "program": { + "type": [ + "string", + "null" + ] + }, + "status": { + "type": "string" + } + }, + "required": [ + "status" + ], + "type": "object" + }, + "landing": { + "type": "string" + }, + "link_level": { + "type": "string" + }, + "provider_url": { + "description": "The provider page itself. Only in a page made for a browser, where url is this service's address that forwards to it; MCP and REST results do not carry it.", + "type": "string" + }, + "url": { + "description": "The only address to visit the plan: this service's /go/<offer_id>?r=<token> address, which forwards to the provider page. The token is made for this response and holds nothing about you.", + "type": "string" + } + }, + "required": [ + "url", + "landing", + "link_level", + "affiliate" + ], + "type": "object" + }, + "listed": { + "type": "boolean" + }, + "match": { + "enum": [ + "FULL_MATCH", + "PARTIAL_MATCH", + "NO_MATCH" + ] + }, + "meets_all": { + "description": "Judged against the required conditions of this call only: true when every one is met, false when one is not met, \"unknown\" when none fails and one is not stated on the official pages.", + "enum": [ + true, + false, + "unknown" + ] + }, + "monthly_cost": { + "properties": { + "explanation": { + "type": "string" + }, + "facts": { + "description": "Price facts the cost was computed from.", + "items": { + "properties": { + "also_stated_in": { + "description": "get_details only: other official machine-readable documents of the provider (llms.txt, llms-full.txt, OpenAPI files, MCP tool listings) that contain the same quoted sentences.", + "items": { + "type": "string" + }, + "type": "array" + }, + "applies_to": { + "description": "get_details only: billing options (billing) or search engines (search_engines) the fact is limited to.", + "type": [ + "object", + "null" + ] + }, + "at_limit": { + "description": "Present for a plan with no automatic extra usage: what the official page says happens at the limit (kind no_extra_usage or restart_by_hand), with its sentence. With a workload that needs restarts, restarts gives their count, the price of each and the total, the numbers of monthly_cost.explanation.", + "properties": { + "evidence": { + "properties": { + "quote": { + "type": "string" + }, + "source": { + "type": "string" + } + }, + "type": "object" + }, + "kind": { + "enum": [ + "no_extra_usage", + "restart_by_hand" + ] + }, + "restarts": { + "properties": { + "count": { + "properties": { + "high": { + "type": "integer" + }, + "low": { + "type": "integer" + } + }, + "type": "object" + }, + "total_usd": { + "properties": { + "high": { + "type": "number" + }, + "low": { + "type": "number" + } + }, + "type": "object" + }, + "usd_each": { + "type": "number" + } + }, + "type": "object" + }, + "text": { + "type": "string" + } + }, + "required": [ + "kind", + "text", + "evidence" + ], + "type": "object" + }, + "checked_at": { + "type": [ + "string", + "null" + ] + }, + "concurrency_unit": { + "description": "get_details, concurrency only: the unit the page states the value in (unit, text such as \"100 threads\"). Against concurrent requests: equals_requests (value, text and the official line of the unit rule) when the unit rule counts this unit as requests, else note \"not the same unit as concurrent requests\"; \"unit not stated\" when the page names none.", + "type": "object" + }, + "derived": { + "description": "How the value follows from the quoted sentence when it is not literal.", + "type": "string" + }, + "evidence": { + "items": { + "properties": { + "quote": { + "description": "The sentence as it appears on that page.", + "type": "string" + }, + "retrieved_at": { + "description": "Date the page was read (YYYY-MM-DD). Only with detail=full.", + "type": "string" + }, + "source": { + "description": "Official page the sentence was found on.", + "type": "string" + }, + "source_type": { + "description": "Only with detail=full.", + "enum": [ + "official_pricing", + "official_docs", + "third_party" + ] + } + }, + "required": [ + "source", + "quote" + ], + "type": "object" + }, + "type": "array" + }, + "exceptions": { + "description": "get_details only: plans with a different value.", + "type": "array" + }, + "key": { + "type": "string" + }, + "label": { + "type": "string" + }, + "level": { + "description": "Where the fact is recorded: offer (the plan), product or provider.", + "type": [ + "string", + "null" + ] + }, + "note": { + "type": "string" + }, + "stale": { + "type": "boolean" + }, + "status": { + "description": "TRUE: stated with the value; FALSE / NOT_SUPPORTED: stated as unavailable; UNKNOWN: not stated; CONFLICT: official pages disagree (value lists each version); STALE: past its recheck date; MISSING: not recorded.", + "enum": [ + "TRUE", + "FALSE", + "NOT_SUPPORTED", + "UNKNOWN", + "CONFLICT", + "STALE", + "MISSING" + ] + }, + "value": {}, + "via_exception": { + "description": "Present and true when a plan-specific exception replaced the general value.", + "type": "boolean" + } + }, + "required": [ + "key", + "status", + "value", + "level", + "evidence", + "checked_at" + ], + "type": "object" + }, + "type": "array" + }, + "high": { + "type": [ + "number", + "null" + ] + }, + "low": { + "type": [ + "number", + "null" + ] + }, + "lower_bound": { + "type": [ + "number", + "null" + ] + }, + "status": { + "enum": [ + "exact", + "range", + "lower_bound", + "unknown" + ] + }, + "upfront_usd": { + "type": [ + "number", + "null" + ] + }, + "usd": { + "type": [ + "number", + "null" + ] + } + }, + "required": [ + "status", + "usd", + "explanation" + ], + "type": "object" + }, + "offer_id": { + "type": "string" + }, + "offer_name": { + "type": "string" + }, + "page_url": { + "type": "string" + }, + "plan_page": { + "description": "The link to give the user with this plan, as a markdown link named \"<provider> <plan> โ plan page\" (its pricing and sign-up page). The evidence sources under the conditions are for citing a condition.", + "type": "string" + }, + "preferred_met": { + "type": "integer" + }, + "prices_exclude_tax": { + "type": [ + "boolean", + "null" + ] + }, + "product_id": { + "type": "string" + }, + "product_name": { + "type": "string" + }, + "provider_id": { + "type": "string" + }, + "provider_name": { + "type": "string" + }, + "unknown_conditions": { + "items": { + "type": "string" + }, + "type": "array" + }, + "unmet_conditions": { + "items": { + "type": "string" + }, + "type": "array" + }, + "verdict": { + "description": "One sentence: the conditions met, or the ones not met or not stated, with the reason.", + "type": "string" + } + }, + "required": [ + "offer_id", + "offer_name", + "product_id", + "provider_name", + "match", + "meets_all", + "verdict", + "billing", + "monthly_cost", + "conditions", + "unmet_conditions", + "unknown_conditions", + "link", + "checked_at", + "cheapest_in_product" + ], + "type": "object" + }, + "type": "array" + }, + "show_text": { + "description": "Ready to show: one line per listed plan, in list order, \"Meets all N: [Provider Plan](visit link)\" for a plan that meets every required condition of the call, \"Closest: [Provider Plan](visit link)\" for any other. The plan is a markdown link to its visit link, which carries the token of this response. Absent when no plan is listed.", + "type": "string" + } + }, + "required": [ + "answer", + "as_of", + "needs_input", + "results", + "assumptions", + "notes" + ], + "type": "object" + }, + { + "properties": { + "answer": { + "type": "string" + }, + "as_of": { + "type": "string" + }, + "format": { + "enum": [ + "brief" + ] + }, + "needs_input": { + "items": { + "properties": { + "field": { + "type": "string" + }, + "reason": { + "type": "string" + } + }, + "required": [ + "field", + "reason" + ], + "type": "object" + }, + "type": "array" + }, + "resolution": { + "type": "array" + }, + "results": { + "items": { + "properties": { + "conditions": { + "items": { + "properties": { + "condition": { + "type": "string" + }, + "quote": { + "description": "One official source sentence, 200 characters at most.", + "type": "string" + }, + "reason": { + "description": "One line, 120 characters at most.", + "type": "string" + }, + "required": { + "description": "Present only on a preferred (nice-to-have) condition.", + "enum": [ + false + ] + }, + "source": { + "description": "Official page the sentence was found on.", + "type": [ + "string", + "null" + ] + }, + "verdict": { + "enum": [ + "MET", + "UNMET", + "UNKNOWN", + "UNIT_MISMATCH", + "UNIT_UNKNOWN" + ] + } + }, + "required": [ + "condition", + "verdict", + "reason" + ], + "type": "object" + }, + "type": "array" + }, + "match": { + "enum": [ + "FULL_MATCH", + "PARTIAL_MATCH", + "NO_MATCH" + ] + }, + "meets_all": { + "description": "Judged against the required conditions of this call only: true when every one is met, false when one is not met, \"unknown\" when none fails and one is not stated on the official pages.", + "enum": [ + true, + false, + "unknown" + ] + }, + "monthly_cost": { + "description": "status, usd, and low, high or lower_bound when they differ; as in the full result.", + "type": "object" + }, + "offer_id": { + "type": "string" + }, + "offer_name": { + "type": "string" + }, + "plan_page": { + "description": "The link to give the user with this plan, as a markdown link named \"<provider> <plan> โ plan page\" (its pricing and sign-up page). The evidence sources under the conditions are for citing a condition.", + "type": "string" + }, + "provider": { + "type": "string" + } + }, + "required": [ + "offer_id", + "offer_name", + "provider", + "meets_all", + "monthly_cost", + "conditions" + ], + "type": "object" + }, + "type": "array" + }, + "show_text": { + "description": "Ready to show: one line per listed plan, in list order, \"Meets all N: [Provider Plan](visit link)\" for a plan that meets every required condition of the call, \"Closest: [Provider Plan](visit link)\" for any other. The plan is a markdown link to its visit link, which carries the token of this response. Absent when no plan is listed.", + "type": "string" + } + }, + "required": [ + "format", + "answer", + "as_of", + "needs_input", + "results" + ], + "type": "object" + } +]
- Changed
cost_scenarios1 field changed- added
Output schema / properties / plans / items / properties / plan_pageAdded value: +{ + "description": "The link to give the user with this plan, as a markdown link named \"<provider> <plan> โ plan page\" (its pricing and sign-up page). The evidence sources under the conditions are for citing a condition.", + "type": "string" +}
- Changed
get_details1 field changed- added
Output schema / properties / offers / items / properties / plan_pageAdded value: +{ + "description": "The link to give the user with this plan, as a markdown link named \"<provider> <plan> โ plan page\" (its pricing and sign-up page). The evidence sources under the conditions are for citing a condition.", + "type": "string" +}
- Changed
relax_conditions2 fields changed- added
Output schema / properties / changes / items / properties / options / items / properties / admitted / items / properties / plan_pageAdded value: +{ + "description": "The link to give the user with this plan, as a markdown link named \"<provider> <plan> โ plan page\" (its pricing and sign-up page). The evidence sources under the conditions are for citing a condition.", + "type": "string" +} - added
Output schema / properties / confirm_with_provider / properties / plans / items / properties / plan_pageAdded value: +{ + "description": "The link to give the user with this plan, as a markdown link named \"<provider> <plan> โ plan page\" (its pricing and sign-up page). The evidence sources under the conditions are for citing a condition.", + "type": "string" +}
- Changed
search1 field changed- changed
Output schema / anyOfPrevious value: -[ - { - "properties": { - "answer": { - "description": "One sentence that opens the answer: the lowest-cost plan that meets every required condition with its link, or, when none does, the closest plan with what it does not meet or what is unknown, and its link. The plan is written as a markdown link, [Provider Plan](visit link), at the end of the sentence.", - "type": "string" - }, - "as_of": { - "type": "string" - }, - "assumptions": { - "items": { - "type": "string" - }, - "type": "array" - }, - "counts": { - "properties": { - "candidates": { - "type": "integer" - }, - "full": { - "type": "integer" - }, - "no_match": { - "type": "integer" - }, - "partial": { - "type": "integer" - } - }, - "required": [ - "candidates", - "full", - "partial", - "no_match" - ], - "type": "object" - }, - "full_matches": { - "items": { - "properties": { - "assumptions": { - "items": { - "type": "string" - }, - "type": "array" - }, - "at_limit": { - "description": "Present for a plan with no automatic extra usage: what the official page says happens at the limit (kind no_extra_usage or restart_by_hand), with its sentence. With a workload that needs restarts, restarts gives their count, the price of each and the total, the numbers of monthly_cost.explanation.", - "properties": { - "evidence": { - "properties": { - "quote": { - "type": "string" - }, - "source": { - "type": "string" - } - }, - "type": "object" - }, - "kind": { - "enum": [ - "no_extra_usage", - "restart_by_hand" - ] - }, - "restarts": { - "properties": { - "count": { - "properties": { - "high": { - "type": "integer" - }, - "low": { - "type": "integer" - } - }, - "type": "object" - }, - "total_usd": { - "properties": { - "high": { - "type": "number" - }, - "low": { - "type": "number" - } - }, - "type": "object" - }, - "usd_each": { - "type": "number" - } - }, - "type": "object" - }, - "text": { - "type": "string" - } - }, - "required": [ - "kind", - "text", - "evidence" - ], - "type": "object" - }, - "billing": { - "type": "string" - }, - "billing_options": { - "items": { - "type": "string" - }, - "type": "array" - }, - "checked_at": { - "type": [ - "string", - "null" - ] - }, - "conditions": { - "items": { - "properties": { - "condition": { - "type": "string" - }, - "facts": { - "description": "Facts the verdict was judged from. The monthly budget is judged from monthly_cost; its price facts are listed there only.", - "items": { - "properties": { - "also_stated_in": { - "description": "get_details only: other official machine-readable documents of the provider (llms.txt, llms-full.txt, OpenAPI files, MCP tool listings) that contain the same quoted sentences.", - "items": { - "type": "string" - }, - "type": "array" - }, - "applies_to": { - "description": "get_details only: billing options (billing) or search engines (search_engines) the fact is limited to.", - "type": [ - "object", - "null" - ] - }, - "at_limit": { - "description": "Present for a plan with no automatic extra usage: what the official page says happens at the limit (kind no_extra_usage or restart_by_hand), with its sentence. With a workload that needs restarts, restarts gives their count, the price of each and the total, the numbers of monthly_cost.explanation.", - "properties": { - "evidence": { - "properties": { - "quote": { - "type": "string" - }, - "source": { - "type": "string" - } - }, - "type": "object" - }, - "kind": { - "enum": [ - "no_extra_usage", - "restart_by_hand" - ] - }, - "restarts": { - "properties": { - "count": { - "properties": { - "high": { - "type": "integer" - }, - "low": { - "type": "integer" - } - }, - "type": "object" - }, - "total_usd": { - "properties": { - "high": { - "type": "number" - }, - "low": { - "type": "number" - } - }, - "type": "object" - }, - "usd_each": { - "type": "number" - } - }, - "type": "object" - }, - "text": { - "type": "string" - } - }, - "required": [ - "kind", - "text", - "evidence" - ], - "type": "object" - }, - "checked_at": { - "type": [ - "string", - "null" - ] - }, - "concurrency_unit": { - "description": "get_details, concurrency only: the unit the page states the value in (unit, text such as \"100 threads\"). Against concurrent requests: equals_requests (value, text and the official line of the unit rule) when the unit rule counts this unit as requests, else note \"not the same unit as concurrent requests\"; \"unit not stated\" when the page names none.", - "type": "object" - }, - "derived": { - "description": "How the value follows from the quoted sentence when it is not literal.", - "type": "string" - }, - "evidence": { - "items": { - "properties": { - "quote": { - "description": "The sentence as it appears on that page.", - "type": "string" - }, - "retrieved_at": { - "description": "Date the page was read (YYYY-MM-DD). Only with detail=full.", - "type": "string" - }, - "source": { - "description": "Official page the sentence was found on.", - "type": "string" - }, - "source_type": { - "description": "Only with detail=full.", - "enum": [ - "official_pricing", - "official_docs", - "third_party" - ] - } - }, - "required": [ - "source", - "quote" - ], - "type": "object" - }, - "type": "array" - }, - "exceptions": { - "description": "get_details only: plans with a different value.", - "type": "array" - }, - "key": { - "type": "string" - }, - "label": { - "type": "string" - }, - "level": { - "description": "Where the fact is recorded: offer (the plan), product or provider.", - "type": [ - "string", - "null" - ] - }, - "note": { - "type": "string" - }, - "stale": { - "type": "boolean" - }, - "status": { - "description": "TRUE: stated with the value; FALSE / NOT_SUPPORTED: stated as unavailable; UNKNOWN: not stated; CONFLICT: official pages disagree (value lists each version); STALE: past its recheck date; MISSING: not recorded.", - "enum": [ - "TRUE", - "FALSE", - "NOT_SUPPORTED", - "UNKNOWN", - "CONFLICT", - "STALE", - "MISSING" - ] - }, - "value": {}, - "via_exception": { - "description": "Present and true when a plan-specific exception replaced the general value.", - "type": "boolean" - } - }, - "required": [ - "key", - "status", - "value", - "level", - "evidence", - "checked_at" - ], - "type": "object" - }, - "type": "array" - }, - "label": { - "type": "string" - }, - "reason": { - "type": "string" - }, - "required": { - "type": "boolean" - }, - "verdict": { - "enum": [ - "MET", - "UNMET", - "UNKNOWN", - "UNIT_MISMATCH", - "UNIT_UNKNOWN" - ] - } - }, - "required": [ - "condition", - "label", - "required", - "verdict", - "reason", - "facts" - ], - "type": "object" - }, - "type": "array" - }, - "facts_omitted": { - "description": "search only: present and true when the source sentences under the conditions were left out so that the response fits one response; the verdicts, reasons and costs are unchanged. Ask check_conditions with the offer_id or get_details for the sentences.", - "type": "boolean" - }, - "link": { - "properties": { - "affiliate": { - "properties": { - "disclosure": { - "type": [ - "string", - "null" - ] - }, - "program": { - "type": [ - "string", - "null" - ] - }, - "status": { - "type": "string" - } - }, - "required": [ - "status" - ], - "type": "object" - }, - "landing": { - "type": "string" - }, - "link_level": { - "type": "string" - }, - "provider_url": { - "description": "The provider page itself. Only in a page made for a browser, where url is this service's address that forwards to it; MCP and REST results do not carry it.", - "type": "string" - }, - "url": { - "description": "The only address to visit the plan: this service's /go/<offer_id>?r=<token> address, which forwards to the provider page. The token is made for this response and holds nothing about you.", - "type": "string" - } - }, - "required": [ - "url", - "landing", - "link_level", - "affiliate" - ], - "type": "object" - }, - "listed": { - "type": "boolean" - }, - "match": { - "enum": [ - "FULL_MATCH", - "PARTIAL_MATCH", - "NO_MATCH" - ] - }, - "meets_all": { - "description": "Judged against the required conditions of this call only: true when every one is met, false when one is not met, \"unknown\" when none fails and one is not stated on the official pages.", - "enum": [ - true, - false, - "unknown" - ] - }, - "monthly_cost": { - "properties": { - "explanation": { - "type": "string" - }, - "facts": { - "description": "Price facts the cost was computed from.", - "items": { - "properties": { - "also_stated_in": { - "description": "get_details only: other official machine-readable documents of the provider (llms.txt, llms-full.txt, OpenAPI files, MCP tool listings) that contain the same quoted sentences.", - "items": { - "type": "string" - }, - "type": "array" - }, - "applies_to": { - "description": "get_details only: billing options (billing) or search engines (search_engines) the fact is limited to.", - "type": [ - "object", - "null" - ] - }, - "at_limit": { - "description": "Present for a plan with no automatic extra usage: what the official page says happens at the limit (kind no_extra_usage or restart_by_hand), with its sentence. With a workload that needs restarts, restarts gives their count, the price of each and the total, the numbers of monthly_cost.explanation.", - "properties": { - "evidence": { - "properties": { - "quote": { - "type": "string" - }, - "source": { - "type": "string" - } - }, - "type": "object" - }, - "kind": { - "enum": [ - "no_extra_usage", - "restart_by_hand" - ] - }, - "restarts": { - "properties": { - "count": { - "properties": { - "high": { - "type": "integer" - }, - "low": { - "type": "integer" - } - }, - "type": "object" - }, - "total_usd": { - "properties": { - "high": { - "type": "number" - }, - "low": { - "type": "number" - } - }, - "type": "object" - }, - "usd_each": { - "type": "number" - } - }, - "type": "object" - }, - "text": { - "type": "string" - } - }, - "required": [ - "kind", - "text", - "evidence" - ], - "type": "object" - }, - "checked_at": { - "type": [ - "string", - "null" - ] - }, - "concurrency_unit": { - "description": "get_details, concurrency only: the unit the page states the value in (unit, text such as \"100 threads\"). Against concurrent requests: equals_requests (value, text and the official line of the unit rule) when the unit rule counts this unit as requests, else note \"not the same unit as concurrent requests\"; \"unit not stated\" when the page names none.", - "type": "object" - }, - "derived": { - "description": "How the value follows from the quoted sentence when it is not literal.", - "type": "string" - }, - "evidence": { - "items": { - "properties": { - "quote": { - "description": "The sentence as it appears on that page.", - "type": "string" - }, - "retrieved_at": { - "description": "Date the page was read (YYYY-MM-DD). Only with detail=full.", - "type": "string" - }, - "source": { - "description": "Official page the sentence was found on.", - "type": "string" - }, - "source_type": { - "description": "Only with detail=full.", - "enum": [ - "official_pricing", - "official_docs", - "third_party" - ] - } - }, - "required": [ - "source", - "quote" - ], - "type": "object" - }, - "type": "array" - }, - "exceptions": { - "description": "get_details only: plans with a different value.", - "type": "array" - }, - "key": { - "type": "string" - }, - "label": { - "type": "string" - }, - "level": { - "description": "Where the fact is recorded: offer (the plan), product or provider.", - "type": [ - "string", - "null" - ] - }, - "note": { - "type": "string" - }, - "stale": { - "type": "boolean" - }, - "status": { - "description": "TRUE: stated with the value; FALSE / NOT_SUPPORTED: stated as unavailable; UNKNOWN: not stated; CONFLICT: official pages disagree (value lists each version); STALE: past its recheck date; MISSING: not recorded.", - "enum": [ - "TRUE", - "FALSE", - "NOT_SUPPORTED", - "UNKNOWN", - "CONFLICT", - "STALE", - "MISSING" - ] - }, - "value": {}, - "via_exception": { - "description": "Present and true when a plan-specific exception replaced the general value.", - "type": "boolean" - } - }, - "required": [ - "key", - "status", - "value", - "level", - "evidence", - "checked_at" - ], - "type": "object" - }, - "type": "array" - }, - "high": { - "type": [ - "number", - "null" - ] - }, - "low": { - "type": [ - "number", - "null" - ] - }, - "lower_bound": { - "type": [ - "number", - "null" - ] - }, - "status": { - "enum": [ - "exact", - "range", - "lower_bound", - "unknown" - ] - }, - "upfront_usd": { - "type": [ - "number", - "null" - ] - }, - "usd": { - "type": [ - "number", - "null" - ] - } - }, - "required": [ - "status", - "usd", - "explanation" - ], - "type": "object" - }, - "offer_id": { - "type": "string" - }, - "offer_name": { - "type": "string" - }, - "page_url": { - "type": "string" - }, - "preferred_met": { - "type": "integer" - }, - "prices_exclude_tax": { - "type": [ - "boolean", - "null" - ] - }, - "product_id": { - "type": "string" - }, - "product_name": { - "type": "string" - }, - "provider_id": { - "type": "string" - }, - "provider_name": { - "type": "string" - }, - "unknown_conditions": { - "items": { - "type": "string" - }, - "type": "array" - }, - "unmet_conditions": { - "items": { - "type": "string" - }, - "type": "array" - }, - "verdict": { - "description": "One sentence: the conditions met, or the ones not met or not stated, with the reason.", - "type": "string" - } - }, - "required": [ - "offer_id", - "offer_name", - "product_id", - "provider_name", - "match", - "meets_all", - "verdict", - "billing", - "monthly_cost", - "conditions", - "unmet_conditions", - "unknown_conditions", - "link", - "checked_at" - ], - "type": "object" - }, - "type": "array" - }, - "link_notes": { - "additionalProperties": { - "type": "string" - }, - "description": "The note of each link level (link.link_level) of the plans in this result, stated once.", - "type": "object" - }, - "needs_input": { - "items": { - "properties": { - "field": { - "type": "string" - }, - "reason": { - "type": "string" - } - }, - "required": [ - "field", - "reason" - ], - "type": "object" - }, - "type": "array" - }, - "notes": { - "items": { - "type": "string" - }, - "type": "array" - }, - "partial_matches": { - "items": { - "properties": { - "assumptions": { - "items": { - "type": "string" - }, - "type": "array" - }, - "at_limit": { - "description": "Present for a plan with no automatic extra usage: what the official page says happens at the limit (kind no_extra_usage or restart_by_hand), with its sentence. With a workload that needs restarts, restarts gives their count, the price of each and the total, the numbers of monthly_cost.explanation.", - "properties": { - "evidence": { - "properties": { - "quote": { - "type": "string" - }, - "source": { - "type": "string" - } - }, - "type": "object" - }, - "kind": { - "enum": [ - "no_extra_usage", - "restart_by_hand" - ] - }, - "restarts": { - "properties": { - "count": { - "properties": { - "high": { - "type": "integer" - }, - "low": { - "type": "integer" - } - }, - "type": "object" - }, - "total_usd": { - "properties": { - "high": { - "type": "number" - }, - "low": { - "type": "number" - } - }, - "type": "object" - }, - "usd_each": { - "type": "number" - } - }, - "type": "object" - }, - "text": { - "type": "string" - } - }, - "required": [ - "kind", - "text", - "evidence" - ], - "type": "object" - }, - "billing": { - "type": "string" - }, - "billing_options": { - "items": { - "type": "string" - }, - "type": "array" - }, - "checked_at": { - "type": [ - "string", - "null" - ] - }, - "conditions": { - "items": { - "properties": { - "condition": { - "type": "string" - }, - "facts": { - "description": "Facts the verdict was judged from. The monthly budget is judged from monthly_cost; its price facts are listed there only.", - "items": { - "properties": { - "also_stated_in": { - "description": "get_details only: other official machine-readable documents of the provider (llms.txt, llms-full.txt, OpenAPI files, MCP tool listings) that contain the same quoted sentences.", - "items": { - "type": "string" - }, - "type": "array" - }, - "applies_to": { - "description": "get_details only: billing options (billing) or search engines (search_engines) the fact is limited to.", - "type": [ - "object", - "null" - ] - }, - "at_limit": { - "description": "Present for a plan with no automatic extra usage: what the official page says happens at the limit (kind no_extra_usage or restart_by_hand), with its sentence. With a workload that needs restarts, restarts gives their count, the price of each and the total, the numbers of monthly_cost.explanation.", - "properties": { - "evidence": { - "properties": { - "quote": { - "type": "string" - }, - "source": { - "type": "string" - } - }, - "type": "object" - }, - "kind": { - "enum": [ - "no_extra_usage", - "restart_by_hand" - ] - }, - "restarts": { - "properties": { - "count": { - "properties": { - "high": { - "type": "integer" - }, - "low": { - "type": "integer" - } - }, - "type": "object" - }, - "total_usd": { - "properties": { - "high": { - "type": "number" - }, - "low": { - "type": "number" - } - }, - "type": "object" - }, - "usd_each": { - "type": "number" - } - }, - "type": "object" - }, - "text": { - "type": "string" - } - }, - "required": [ - "kind", - "text", - "evidence" - ], - "type": "object" - }, - "checked_at": { - "type": [ - "string", - "null" - ] - }, - "concurrency_unit": { - "description": "get_details, concurrency only: the unit the page states the value in (unit, text such as \"100 threads\"). Against concurrent requests: equals_requests (value, text and the official line of the unit rule) when the unit rule counts this unit as requests, else note \"not the same unit as concurrent requests\"; \"unit not stated\" when the page names none.", - "type": "object" - }, - "derived": { - "description": "How the value follows from the quoted sentence when it is not literal.", - "type": "string" - }, - "evidence": { - "items": { - "properties": { - "quote": { - "description": "The sentence as it appears on that page.", - "type": "string" - }, - "retrieved_at": { - "description": "Date the page was read (YYYY-MM-DD). Only with detail=full.", - "type": "string" - }, - "source": { - "description": "Official page the sentence was found on.", - "type": "string" - }, - "source_type": { - "description": "Only with detail=full.", - "enum": [ - "official_pricing", - "official_docs", - "third_party" - ] - } - }, - "required": [ - "source", - "quote" - ], - "type": "object" - }, - "type": "array" - }, - "exceptions": { - "description": "get_details only: plans with a different value.", - "type": "array" - }, - "key": { - "type": "string" - }, - "label": { - "type": "string" - }, - "level": { - "description": "Where the fact is recorded: offer (the plan), product or provider.", - "type": [ - "string", - "null" - ] - }, - "note": { - "type": "string" - }, - "stale": { - "type": "boolean" - }, - "status": { - "description": "TRUE: stated with the value; FALSE / NOT_SUPPORTED: stated as unavailable; UNKNOWN: not stated; CONFLICT: official pages disagree (value lists each version); STALE: past its recheck date; MISSING: not recorded.", - "enum": [ - "TRUE", - "FALSE", - "NOT_SUPPORTED", - "UNKNOWN", - "CONFLICT", - "STALE", - "MISSING" - ] - }, - "value": {}, - "via_exception": { - "description": "Present and true when a plan-specific exception replaced the general value.", - "type": "boolean" - } - }, - "required": [ - "key", - "status", - "value", - "level", - "evidence", - "checked_at" - ], - "type": "object" - }, - "type": "array" - }, - "label": { - "type": "string" - }, - "reason": { - "type": "string" - }, - "required": { - "type": "boolean" - }, - "verdict": { - "enum": [ - "MET", - "UNMET", - "UNKNOWN", - "UNIT_MISMATCH", - "UNIT_UNKNOWN" - ] - } - }, - "required": [ - "condition", - "label", - "required", - "verdict", - "reason", - "facts" - ], - "type": "object" - }, - "type": "array" - }, - "facts_omitted": { - "description": "search only: present and true when the source sentences under the conditions were left out so that the response fits one response; the verdicts, reasons and costs are unchanged. Ask check_conditions with the offer_id or get_details for the sentences.", - "type": "boolean" - }, - "link": { - "properties": { - "affiliate": { - "properties": { - "disclosure": { - "type": [ - "string", - "null" - ] - }, - "program": { - "type": [ - "string", - "null" - ] - }, - "status": { - "type": "string" - } - }, - "required": [ - "status" - ], - "type": "object" - }, - "landing": { - "type": "string" - }, - "link_level": { - "type": "string" - }, - "provider_url": { - "description": "The provider page itself. Only in a page made for a browser, where url is this service's address that forwards to it; MCP and REST results do not carry it.", - "type": "string" - }, - "url": { - "description": "The only address to visit the plan: this service's /go/<offer_id>?r=<token> address, which forwards to the provider page. The token is made for this response and holds nothing about you.", - "type": "string" - } - }, - "required": [ - "url", - "landing", - "link_level", - "affiliate" - ], - "type": "object" - }, - "listed": { - "type": "boolean" - }, - "match": { - "enum": [ - "FULL_MATCH", - "PARTIAL_MATCH", - "NO_MATCH" - ] - }, - "meets_all": { - "description": "Judged against the required conditions of this call only: true when every one is met, false when one is not met, \"unknown\" when none fails and one is not stated on the official pages.", - "enum": [ - true, - false, - "unknown" - ] - }, - "monthly_cost": { - "properties": { - "explanation": { - "type": "string" - }, - "facts": { - "description": "Price facts the cost was computed from.", - "items": { - "properties": { - "also_stated_in": { - "description": "get_details only: other official machine-readable documents of the provider (llms.txt, llms-full.txt, OpenAPI files, MCP tool listings) that contain the same quoted sentences.", - "items": { - "type": "string" - }, - "type": "array" - }, - "applies_to": { - "description": "get_details only: billing options (billing) or search engines (search_engines) the fact is limited to.", - "type": [ - "object", - "null" - ] - }, - "at_limit": { - "description": "Present for a plan with no automatic extra usage: what the official page says happens at the limit (kind no_extra_usage or restart_by_hand), with its sentence. With a workload that needs restarts, restarts gives their count, the price of each and the total, the numbers of monthly_cost.explanation.", - "properties": { - "evidence": { - "properties": { - "quote": { - "type": "string" - }, - "source": { - "type": "string" - } - }, - "type": "object" - }, - "kind": { - "enum": [ - "no_extra_usage", - "restart_by_hand" - ] - }, - "restarts": { - "properties": { - "count": { - "properties": { - "high": { - "type": "integer" - }, - "low": { - "type": "integer" - } - }, - "type": "object" - }, - "total_usd": { - "properties": { - "high": { - "type": "number" - }, - "low": { - "type": "number" - } - }, - "type": "object" - }, - "usd_each": { - "type": "number" - } - }, - "type": "object" - }, - "text": { - "type": "string" - } - }, - "required": [ - "kind", - "text", - "evidence" - ], - "type": "object" - }, - "checked_at": { - "type": [ - "string", - "null" - ] - }, - "concurrency_unit": { - "description": "get_details, concurrency only: the unit the page states the value in (unit, text such as \"100 threads\"). Against concurrent requests: equals_requests (value, text and the official line of the unit rule) when the unit rule counts this unit as requests, else note \"not the same unit as concurrent requests\"; \"unit not stated\" when the page names none.", - "type": "object" - }, - "derived": { - "description": "How the value follows from the quoted sentence when it is not literal.", - "type": "string" - }, - "evidence": { - "items": { - "properties": { - "quote": { - "description": "The sentence as it appears on that page.", - "type": "string" - }, - "retrieved_at": { - "description": "Date the page was read (YYYY-MM-DD). Only with detail=full.", - "type": "string" - }, - "source": { - "description": "Official page the sentence was found on.", - "type": "string" - }, - "source_type": { - "description": "Only with detail=full.", - "enum": [ - "official_pricing", - "official_docs", - "third_party" - ] - } - }, - "required": [ - "source", - "quote" - ], - "type": "object" - }, - "type": "array" - }, - "exceptions": { - "description": "get_details only: plans with a different value.", - "type": "array" - }, - "key": { - "type": "string" - }, - "label": { - "type": "string" - }, - "level": { - "description": "Where the fact is recorded: offer (the plan), product or provider.", - "type": [ - "string", - "null" - ] - }, - "note": { - "type": "string" - }, - "stale": { - "type": "boolean" - }, - "status": { - "description": "TRUE: stated with the value; FALSE / NOT_SUPPORTED: stated as unavailable; UNKNOWN: not stated; CONFLICT: official pages disagree (value lists each version); STALE: past its recheck date; MISSING: not recorded.", - "enum": [ - "TRUE", - "FALSE", - "NOT_SUPPORTED", - "UNKNOWN", - "CONFLICT", - "STALE", - "MISSING" - ] - }, - "value": {}, - "via_exception": { - "description": "Present and true when a plan-specific exception replaced the general value.", - "type": "boolean" - } - }, - "required": [ - "key", - "status", - "value", - "level", - "evidence", - "checked_at" - ], - "type": "object" - }, - "type": "array" - }, - "high": { - "type": [ - "number", - "null" - ] - }, - "low": { - "type": [ - "number", - "null" - ] - }, - "lower_bound": { - "type": [ - "number", - "null" - ] - }, - "status": { - "enum": [ - "exact", - "range", - "lower_bound", - "unknown" - ] - }, - "upfront_usd": { - "type": [ - "number", - "null" - ] - }, - "usd": { - "type": [ - "number", - "null" - ] - } - }, - "required": [ - "status", - "usd", - "explanation" - ], - "type": "object" - }, - "offer_id": { - "type": "string" - }, - "offer_name": { - "type": "string" - }, - "page_url": { - "type": "string" - }, - "preferred_met": { - "type": "integer" - }, - "prices_exclude_tax": { - "type": [ - "boolean", - "null" - ] - }, - "product_id": { - "type": "string" - }, - "product_name": { - "type": "string" - }, - "provider_id": { - "type": "string" - }, - "provider_name": { - "type": "string" - }, - "unknown_conditions": { - "items": { - "type": "string" - }, - "type": "array" - }, - "unmet_conditions": { - "items": { - "type": "string" - }, - "type": "array" - }, - "verdict": { - "description": "One sentence: the conditions met, or the ones not met or not stated, with the reason.", - "type": "string" - } - }, - "required": [ - "offer_id", - "offer_name", - "product_id", - "provider_name", - "match", - "meets_all", - "verdict", - "billing", - "monthly_cost", - "conditions", - "unmet_conditions", - "unknown_conditions", - "link", - "checked_at" - ], - "type": "object" - }, - "type": "array" - }, - "request": { - "type": "object" - }, - "show_text": { - "description": "Ready to show: one line per listed plan, in list order, \"Meets all N: [Provider Plan](visit link)\" for a plan that meets every required condition of the call, \"Closest: [Provider Plan](visit link)\" for any other. The plan is a markdown link to its visit link, which carries the token of this response. Absent when no plan is listed.", - "type": "string" - }, - "unknown_providers": { - "description": "Only when providers was given: the names that are not a provider id or name in this catalog.", - "items": { - "type": "string" - }, - "type": "array" - }, - "zero_result": { - "properties": { - "conditions": { - "items": { - "properties": { - "closest": { - "description": "The cheapest plan that meets every other required condition but not this one. It does not meet the request (meets_all false or \"unknown\").", - "properties": { - "billing": { - "type": "string" - }, - "fails": { - "type": "string" - }, - "meets_all": { - "description": "Judged against the required conditions of this call only: true when every one is met, false when one is not met, \"unknown\" when none fails and one is not stated on the official pages.", - "enum": [ - true, - false, - "unknown" - ] - }, - "monthly_cost": { - "type": "object" - }, - "offer_id": { - "type": "string" - }, - "offer_name": { - "type": "string" - }, - "page_url": { - "type": "string" - }, - "provider_name": { - "type": "string" - } - }, - "required": [ - "offer_id", - "offer_name", - "provider_name", - "billing", - "monthly_cost", - "meets_all", - "fails" - ], - "type": [ - "object", - "null" - ] - }, - "condition": { - "type": "string" - }, - "excluded": { - "type": "integer" - }, - "label": { - "type": "string" - }, - "unknown": { - "type": "integer" - }, - "would_match_if_relaxed": { - "type": "integer" - } - }, - "required": [ - "condition", - "label", - "excluded", - "would_match_if_relaxed", - "closest" - ], - "type": "object" - }, - "type": "array" - }, - "note": { - "type": "string" - } - }, - "type": [ - "object", - "null" - ] - } - }, - "required": [ - "answer", - "as_of", - "needs_input", - "counts", - "full_matches", - "partial_matches", - "zero_result", - "assumptions", - "notes" - ], - "type": "object" - }, - { - "properties": { - "answer": { - "type": "string" - }, - "as_of": { - "type": "string" - }, - "counts": { - "properties": { - "candidates": { - "type": "integer" - }, - "full": { - "type": "integer" - }, - "no_match": { - "type": "integer" - }, - "partial": { - "type": "integer" - } - }, - "required": [ - "candidates", - "full", - "partial", - "no_match" - ], - "type": "object" - }, - "format": { - "enum": [ - "brief" - ] - }, - "full_matches": { - "items": { - "properties": { - "conditions": { - "items": { - "properties": { - "condition": { - "type": "string" - }, - "quote": { - "description": "One official source sentence, 200 characters at most.", - "type": "string" - }, - "reason": { - "description": "One line, 120 characters at most.", - "type": "string" - }, - "required": { - "description": "Present only on a preferred (nice-to-have) condition.", - "enum": [ - false - ] - }, - "source": { - "description": "Official page the sentence was found on.", - "type": [ - "string", - "null" - ] - }, - "verdict": { - "enum": [ - "MET", - "UNMET", - "UNKNOWN", - "UNIT_MISMATCH", - "UNIT_UNKNOWN" - ] - } - }, - "required": [ - "condition", - "verdict", - "reason" - ], - "type": "object" - }, - "type": "array" - }, - "match": { - "enum": [ - "FULL_MATCH", - "PARTIAL_MATCH", - "NO_MATCH" - ] - }, - "meets_all": { - "description": "Judged against the required conditions of this call only: true when every one is met, false when one is not met, \"unknown\" when none fails and one is not stated on the official pages.", - "enum": [ - true, - false, - "unknown" - ] - }, - "monthly_cost": { - "description": "status, usd, and low, high or lower_bound when they differ; as in the full result.", - "type": "object" - }, - "offer_id": { - "type": "string" - }, - "offer_name": { - "type": "string" - }, - "provider": { - "type": "string" - } - }, - "required": [ - "offer_id", - "offer_name", - "provider", - "meets_all", - "monthly_cost", - "conditions" - ], - "type": "object" - }, - "type": "array" - }, - "more_note": { - "type": "string" - }, - "more_plans": { - "description": "Matching plans left out of the short list: limit is the number of plans in all, fully matching first.", - "type": "integer" - }, - "needs_input": { - "items": { - "properties": { - "field": { - "type": "string" - }, - "reason": { - "type": "string" - } - }, - "required": [ - "field", - "reason" - ], - "type": "object" - }, - "type": "array" - }, - "partial_matches": { - "items": { - "properties": { - "conditions": { - "items": { - "properties": { - "condition": { - "type": "string" - }, - "quote": { - "description": "One official source sentence, 200 characters at most.", - "type": "string" - }, - "reason": { - "description": "One line, 120 characters at most.", - "type": "string" - }, - "required": { - "description": "Present only on a preferred (nice-to-have) condition.", - "enum": [ - false - ] - }, - "source": { - "description": "Official page the sentence was found on.", - "type": [ - "string", - "null" - ] - }, - "verdict": { - "enum": [ - "MET", - "UNMET", - "UNKNOWN", - "UNIT_MISMATCH", - "UNIT_UNKNOWN" - ] - } - }, - "required": [ - "condition", - "verdict", - "reason" - ], - "type": "object" - }, - "type": "array" - }, - "match": { - "enum": [ - "FULL_MATCH", - "PARTIAL_MATCH", - "NO_MATCH" - ] - }, - "meets_all": { - "description": "Judged against the required conditions of this call only: true when every one is met, false when one is not met, \"unknown\" when none fails and one is not stated on the official pages.", - "enum": [ - true, - false, - "unknown" - ] - }, - "monthly_cost": { - "description": "status, usd, and low, high or lower_bound when they differ; as in the full result.", - "type": "object" - }, - "offer_id": { - "type": "string" - }, - "offer_name": { - "type": "string" - }, - "provider": { - "type": "string" - } - }, - "required": [ - "offer_id", - "offer_name", - "provider", - "meets_all", - "monthly_cost", - "conditions" - ], - "type": "object" - }, - "type": "array" - }, - "show_text": { - "description": "Ready to show: one line per listed plan, in list order, \"Meets all N: [Provider Plan](visit link)\" for a plan that meets every required condition of the call, \"Closest: [Provider Plan](visit link)\" for any other. The plan is a markdown link to its visit link, which carries the token of this response. Absent when no plan is listed.", - "type": "string" - }, - "unknown_providers": { - "items": { - "type": "string" - }, - "type": "array" - }, - "zero_result": { - "properties": { - "conditions": { - "items": { - "properties": { - "closest": { - "description": "The cheapest plan that meets every other required condition but not this one. It does not meet the request (meets_all false or \"unknown\").", - "properties": { - "billing": { - "type": "string" - }, - "fails": { - "type": "string" - }, - "meets_all": { - "description": "Judged against the required conditions of this call only: true when every one is met, false when one is not met, \"unknown\" when none fails and one is not stated on the official pages.", - "enum": [ - true, - false, - "unknown" - ] - }, - "monthly_cost": { - "type": "object" - }, - "offer_id": { - "type": "string" - }, - "offer_name": { - "type": "string" - }, - "page_url": { - "type": "string" - }, - "provider_name": { - "type": "string" - } - }, - "required": [ - "offer_id", - "offer_name", - "provider_name", - "billing", - "monthly_cost", - "meets_all", - "fails" - ], - "type": [ - "object", - "null" - ] - }, - "condition": { - "type": "string" - }, - "excluded": { - "type": "integer" - }, - "label": { - "type": "string" - }, - "unknown": { - "type": "integer" - }, - "would_match_if_relaxed": { - "type": "integer" - } - }, - "required": [ - "condition", - "label", - "excluded", - "would_match_if_relaxed", - "closest" - ], - "type": "object" - }, - "type": "array" - }, - "note": { - "type": "string" - } - }, - "type": [ - "object", - "null" - ] - } - }, - "required": [ - "format", - "answer", - "as_of", - "needs_input", - "counts", - "full_matches", - "partial_matches" - ], - "type": "object" - } -]New value: +[ + { + "properties": { + "answer": { + "description": "One sentence that opens the answer: the lowest-cost plan that meets every required condition with its link, or, when none does, the closest plan with what it does not meet or what is unknown, and its link. The plan is written as a markdown link, [Provider Plan](visit link), at the end of the sentence.", + "type": "string" + }, + "as_of": { + "type": "string" + }, + "assumptions": { + "items": { + "type": "string" + }, + "type": "array" + }, + "counts": { + "properties": { + "candidates": { + "type": "integer" + }, + "full": { + "type": "integer" + }, + "no_match": { + "type": "integer" + }, + "partial": { + "type": "integer" + } + }, + "required": [ + "candidates", + "full", + "partial", + "no_match" + ], + "type": "object" + }, + "full_matches": { + "items": { + "properties": { + "assumptions": { + "items": { + "type": "string" + }, + "type": "array" + }, + "at_limit": { + "description": "Present for a plan with no automatic extra usage: what the official page says happens at the limit (kind no_extra_usage or restart_by_hand), with its sentence. With a workload that needs restarts, restarts gives their count, the price of each and the total, the numbers of monthly_cost.explanation.", + "properties": { + "evidence": { + "properties": { + "quote": { + "type": "string" + }, + "source": { + "type": "string" + } + }, + "type": "object" + }, + "kind": { + "enum": [ + "no_extra_usage", + "restart_by_hand" + ] + }, + "restarts": { + "properties": { + "count": { + "properties": { + "high": { + "type": "integer" + }, + "low": { + "type": "integer" + } + }, + "type": "object" + }, + "total_usd": { + "properties": { + "high": { + "type": "number" + }, + "low": { + "type": "number" + } + }, + "type": "object" + }, + "usd_each": { + "type": "number" + } + }, + "type": "object" + }, + "text": { + "type": "string" + } + }, + "required": [ + "kind", + "text", + "evidence" + ], + "type": "object" + }, + "billing": { + "type": "string" + }, + "billing_options": { + "items": { + "type": "string" + }, + "type": "array" + }, + "checked_at": { + "type": [ + "string", + "null" + ] + }, + "conditions": { + "items": { + "properties": { + "condition": { + "type": "string" + }, + "facts": { + "description": "Facts the verdict was judged from. The monthly budget is judged from monthly_cost; its price facts are listed there only.", + "items": { + "properties": { + "also_stated_in": { + "description": "get_details only: other official machine-readable documents of the provider (llms.txt, llms-full.txt, OpenAPI files, MCP tool listings) that contain the same quoted sentences.", + "items": { + "type": "string" + }, + "type": "array" + }, + "applies_to": { + "description": "get_details only: billing options (billing) or search engines (search_engines) the fact is limited to.", + "type": [ + "object", + "null" + ] + }, + "at_limit": { + "description": "Present for a plan with no automatic extra usage: what the official page says happens at the limit (kind no_extra_usage or restart_by_hand), with its sentence. With a workload that needs restarts, restarts gives their count, the price of each and the total, the numbers of monthly_cost.explanation.", + "properties": { + "evidence": { + "properties": { + "quote": { + "type": "string" + }, + "source": { + "type": "string" + } + }, + "type": "object" + }, + "kind": { + "enum": [ + "no_extra_usage", + "restart_by_hand" + ] + }, + "restarts": { + "properties": { + "count": { + "properties": { + "high": { + "type": "integer" + }, + "low": { + "type": "integer" + } + }, + "type": "object" + }, + "total_usd": { + "properties": { + "high": { + "type": "number" + }, + "low": { + "type": "number" + } + }, + "type": "object" + }, + "usd_each": { + "type": "number" + } + }, + "type": "object" + }, + "text": { + "type": "string" + } + }, + "required": [ + "kind", + "text", + "evidence" + ], + "type": "object" + }, + "checked_at": { + "type": [ + "string", + "null" + ] + }, + "concurrency_unit": { + "description": "get_details, concurrency only: the unit the page states the value in (unit, text such as \"100 threads\"). Against concurrent requests: equals_requests (value, text and the official line of the unit rule) when the unit rule counts this unit as requests, else note \"not the same unit as concurrent requests\"; \"unit not stated\" when the page names none.", + "type": "object" + }, + "derived": { + "description": "How the value follows from the quoted sentence when it is not literal.", + "type": "string" + }, + "evidence": { + "items": { + "properties": { + "quote": { + "description": "The sentence as it appears on that page.", + "type": "string" + }, + "retrieved_at": { + "description": "Date the page was read (YYYY-MM-DD). Only with detail=full.", + "type": "string" + }, + "source": { + "description": "Official page the sentence was found on.", + "type": "string" + }, + "source_type": { + "description": "Only with detail=full.", + "enum": [ + "official_pricing", + "official_docs", + "third_party" + ] + } + }, + "required": [ + "source", + "quote" + ], + "type": "object" + }, + "type": "array" + }, + "exceptions": { + "description": "get_details only: plans with a different value.", + "type": "array" + }, + "key": { + "type": "string" + }, + "label": { + "type": "string" + }, + "level": { + "description": "Where the fact is recorded: offer (the plan), product or provider.", + "type": [ + "string", + "null" + ] + }, + "note": { + "type": "string" + }, + "stale": { + "type": "boolean" + }, + "status": { + "description": "TRUE: stated with the value; FALSE / NOT_SUPPORTED: stated as unavailable; UNKNOWN: not stated; CONFLICT: official pages disagree (value lists each version); STALE: past its recheck date; MISSING: not recorded.", + "enum": [ + "TRUE", + "FALSE", + "NOT_SUPPORTED", + "UNKNOWN", + "CONFLICT", + "STALE", + "MISSING" + ] + }, + "value": {}, + "via_exception": { + "description": "Present and true when a plan-specific exception replaced the general value.", + "type": "boolean" + } + }, + "required": [ + "key", + "status", + "value", + "level", + "evidence", + "checked_at" + ], + "type": "object" + }, + "type": "array" + }, + "label": { + "type": "string" + }, + "reason": { + "type": "string" + }, + "required": { + "type": "boolean" + }, + "verdict": { + "enum": [ + "MET", + "UNMET", + "UNKNOWN", + "UNIT_MISMATCH", + "UNIT_UNKNOWN" + ] + } + }, + "required": [ + "condition", + "label", + "required", + "verdict", + "reason", + "facts" + ], + "type": "object" + }, + "type": "array" + }, + "facts_omitted": { + "description": "search only: present and true when the source sentences under the conditions were left out so that the response fits one response; the verdicts, reasons and costs are unchanged. Ask check_conditions with the offer_id or get_details for the sentences.", + "type": "boolean" + }, + "link": { + "properties": { + "affiliate": { + "properties": { + "disclosure": { + "type": [ + "string", + "null" + ] + }, + "program": { + "type": [ + "string", + "null" + ] + }, + "status": { + "type": "string" + } + }, + "required": [ + "status" + ], + "type": "object" + }, + "landing": { + "type": "string" + }, + "link_level": { + "type": "string" + }, + "provider_url": { + "description": "The provider page itself. Only in a page made for a browser, where url is this service's address that forwards to it; MCP and REST results do not carry it.", + "type": "string" + }, + "url": { + "description": "The only address to visit the plan: this service's /go/<offer_id>?r=<token> address, which forwards to the provider page. The token is made for this response and holds nothing about you.", + "type": "string" + } + }, + "required": [ + "url", + "landing", + "link_level", + "affiliate" + ], + "type": "object" + }, + "listed": { + "type": "boolean" + }, + "match": { + "enum": [ + "FULL_MATCH", + "PARTIAL_MATCH", + "NO_MATCH" + ] + }, + "meets_all": { + "description": "Judged against the required conditions of this call only: true when every one is met, false when one is not met, \"unknown\" when none fails and one is not stated on the official pages.", + "enum": [ + true, + false, + "unknown" + ] + }, + "monthly_cost": { + "properties": { + "explanation": { + "type": "string" + }, + "facts": { + "description": "Price facts the cost was computed from.", + "items": { + "properties": { + "also_stated_in": { + "description": "get_details only: other official machine-readable documents of the provider (llms.txt, llms-full.txt, OpenAPI files, MCP tool listings) that contain the same quoted sentences.", + "items": { + "type": "string" + }, + "type": "array" + }, + "applies_to": { + "description": "get_details only: billing options (billing) or search engines (search_engines) the fact is limited to.", + "type": [ + "object", + "null" + ] + }, + "at_limit": { + "description": "Present for a plan with no automatic extra usage: what the official page says happens at the limit (kind no_extra_usage or restart_by_hand), with its sentence. With a workload that needs restarts, restarts gives their count, the price of each and the total, the numbers of monthly_cost.explanation.", + "properties": { + "evidence": { + "properties": { + "quote": { + "type": "string" + }, + "source": { + "type": "string" + } + }, + "type": "object" + }, + "kind": { + "enum": [ + "no_extra_usage", + "restart_by_hand" + ] + }, + "restarts": { + "properties": { + "count": { + "properties": { + "high": { + "type": "integer" + }, + "low": { + "type": "integer" + } + }, + "type": "object" + }, + "total_usd": { + "properties": { + "high": { + "type": "number" + }, + "low": { + "type": "number" + } + }, + "type": "object" + }, + "usd_each": { + "type": "number" + } + }, + "type": "object" + }, + "text": { + "type": "string" + } + }, + "required": [ + "kind", + "text", + "evidence" + ], + "type": "object" + }, + "checked_at": { + "type": [ + "string", + "null" + ] + }, + "concurrency_unit": { + "description": "get_details, concurrency only: the unit the page states the value in (unit, text such as \"100 threads\"). Against concurrent requests: equals_requests (value, text and the official line of the unit rule) when the unit rule counts this unit as requests, else note \"not the same unit as concurrent requests\"; \"unit not stated\" when the page names none.", + "type": "object" + }, + "derived": { + "description": "How the value follows from the quoted sentence when it is not literal.", + "type": "string" + }, + "evidence": { + "items": { + "properties": { + "quote": { + "description": "The sentence as it appears on that page.", + "type": "string" + }, + "retrieved_at": { + "description": "Date the page was read (YYYY-MM-DD). Only with detail=full.", + "type": "string" + }, + "source": { + "description": "Official page the sentence was found on.", + "type": "string" + }, + "source_type": { + "description": "Only with detail=full.", + "enum": [ + "official_pricing", + "official_docs", + "third_party" + ] + } + }, + "required": [ + "source", + "quote" + ], + "type": "object" + }, + "type": "array" + }, + "exceptions": { + "description": "get_details only: plans with a different value.", + "type": "array" + }, + "key": { + "type": "string" + }, + "label": { + "type": "string" + }, + "level": { + "description": "Where the fact is recorded: offer (the plan), product or provider.", + "type": [ + "string", + "null" + ] + }, + "note": { + "type": "string" + }, + "stale": { + "type": "boolean" + }, + "status": { + "description": "TRUE: stated with the value; FALSE / NOT_SUPPORTED: stated as unavailable; UNKNOWN: not stated; CONFLICT: official pages disagree (value lists each version); STALE: past its recheck date; MISSING: not recorded.", + "enum": [ + "TRUE", + "FALSE", + "NOT_SUPPORTED", + "UNKNOWN", + "CONFLICT", + "STALE", + "MISSING" + ] + }, + "value": {}, + "via_exception": { + "description": "Present and true when a plan-specific exception replaced the general value.", + "type": "boolean" + } + }, + "required": [ + "key", + "status", + "value", + "level", + "evidence", + "checked_at" + ], + "type": "object" + }, + "type": "array" + }, + "high": { + "type": [ + "number", + "null" + ] + }, + "low": { + "type": [ + "number", + "null" + ] + }, + "lower_bound": { + "type": [ + "number", + "null" + ] + }, + "status": { + "enum": [ + "exact", + "range", + "lower_bound", + "unknown" + ] + }, + "upfront_usd": { + "type": [ + "number", + "null" + ] + }, + "usd": { + "type": [ + "number", + "null" + ] + } + }, + "required": [ + "status", + "usd", + "explanation" + ], + "type": "object" + }, + "offer_id": { + "type": "string" + }, + "offer_name": { + "type": "string" + }, + "page_url": { + "type": "string" + }, + "plan_page": { + "description": "The link to give the user with this plan, as a markdown link named \"<provider> <plan> โ plan page\" (its pricing and sign-up page). The evidence sources under the conditions are for citing a condition.", + "type": "string" + }, + "preferred_met": { + "type": "integer" + }, + "prices_exclude_tax": { + "type": [ + "boolean", + "null" + ] + }, + "product_id": { + "type": "string" + }, + "product_name": { + "type": "string" + }, + "provider_id": { + "type": "string" + }, + "provider_name": { + "type": "string" + }, + "unknown_conditions": { + "items": { + "type": "string" + }, + "type": "array" + }, + "unmet_conditions": { + "items": { + "type": "string" + }, + "type": "array" + }, + "verdict": { + "description": "One sentence: the conditions met, or the ones not met or not stated, with the reason.", + "type": "string" + } + }, + "required": [ + "offer_id", + "offer_name", + "product_id", + "provider_name", + "match", + "meets_all", + "verdict", + "billing", + "monthly_cost", + "conditions", + "unmet_conditions", + "unknown_conditions", + "link", + "checked_at" + ], + "type": "object" + }, + "type": "array" + }, + "link_notes": { + "additionalProperties": { + "type": "string" + }, + "description": "The note of each link level (link.link_level) of the plans in this result, stated once.", + "type": "object" + }, + "needs_input": { + "items": { + "properties": { + "field": { + "type": "string" + }, + "reason": { + "type": "string" + } + }, + "required": [ + "field", + "reason" + ], + "type": "object" + }, + "type": "array" + }, + "notes": { + "items": { + "type": "string" + }, + "type": "array" + }, + "partial_matches": { + "items": { + "properties": { + "assumptions": { + "items": { + "type": "string" + }, + "type": "array" + }, + "at_limit": { + "description": "Present for a plan with no automatic extra usage: what the official page says happens at the limit (kind no_extra_usage or restart_by_hand), with its sentence. With a workload that needs restarts, restarts gives their count, the price of each and the total, the numbers of monthly_cost.explanation.", + "properties": { + "evidence": { + "properties": { + "quote": { + "type": "string" + }, + "source": { + "type": "string" + } + }, + "type": "object" + }, + "kind": { + "enum": [ + "no_extra_usage", + "restart_by_hand" + ] + }, + "restarts": { + "properties": { + "count": { + "properties": { + "high": { + "type": "integer" + }, + "low": { + "type": "integer" + } + }, + "type": "object" + }, + "total_usd": { + "properties": { + "high": { + "type": "number" + }, + "low": { + "type": "number" + } + }, + "type": "object" + }, + "usd_each": { + "type": "number" + } + }, + "type": "object" + }, + "text": { + "type": "string" + } + }, + "required": [ + "kind", + "text", + "evidence" + ], + "type": "object" + }, + "billing": { + "type": "string" + }, + "billing_options": { + "items": { + "type": "string" + }, + "type": "array" + }, + "checked_at": { + "type": [ + "string", + "null" + ] + }, + "conditions": { + "items": { + "properties": { + "condition": { + "type": "string" + }, + "facts": { + "description": "Facts the verdict was judged from. The monthly budget is judged from monthly_cost; its price facts are listed there only.", + "items": { + "properties": { + "also_stated_in": { + "description": "get_details only: other official machine-readable documents of the provider (llms.txt, llms-full.txt, OpenAPI files, MCP tool listings) that contain the same quoted sentences.", + "items": { + "type": "string" + }, + "type": "array" + }, + "applies_to": { + "description": "get_details only: billing options (billing) or search engines (search_engines) the fact is limited to.", + "type": [ + "object", + "null" + ] + }, + "at_limit": { + "description": "Present for a plan with no automatic extra usage: what the official page says happens at the limit (kind no_extra_usage or restart_by_hand), with its sentence. With a workload that needs restarts, restarts gives their count, the price of each and the total, the numbers of monthly_cost.explanation.", + "properties": { + "evidence": { + "properties": { + "quote": { + "type": "string" + }, + "source": { + "type": "string" + } + }, + "type": "object" + }, + "kind": { + "enum": [ + "no_extra_usage", + "restart_by_hand" + ] + }, + "restarts": { + "properties": { + "count": { + "properties": { + "high": { + "type": "integer" + }, + "low": { + "type": "integer" + } + }, + "type": "object" + }, + "total_usd": { + "properties": { + "high": { + "type": "number" + }, + "low": { + "type": "number" + } + }, + "type": "object" + }, + "usd_each": { + "type": "number" + } + }, + "type": "object" + }, + "text": { + "type": "string" + } + }, + "required": [ + "kind", + "text", + "evidence" + ], + "type": "object" + }, + "checked_at": { + "type": [ + "string", + "null" + ] + }, + "concurrency_unit": { + "description": "get_details, concurrency only: the unit the page states the value in (unit, text such as \"100 threads\"). Against concurrent requests: equals_requests (value, text and the official line of the unit rule) when the unit rule counts this unit as requests, else note \"not the same unit as concurrent requests\"; \"unit not stated\" when the page names none.", + "type": "object" + }, + "derived": { + "description": "How the value follows from the quoted sentence when it is not literal.", + "type": "string" + }, + "evidence": { + "items": { + "properties": { + "quote": { + "description": "The sentence as it appears on that page.", + "type": "string" + }, + "retrieved_at": { + "description": "Date the page was read (YYYY-MM-DD). Only with detail=full.", + "type": "string" + }, + "source": { + "description": "Official page the sentence was found on.", + "type": "string" + }, + "source_type": { + "description": "Only with detail=full.", + "enum": [ + "official_pricing", + "official_docs", + "third_party" + ] + } + }, + "required": [ + "source", + "quote" + ], + "type": "object" + }, + "type": "array" + }, + "exceptions": { + "description": "get_details only: plans with a different value.", + "type": "array" + }, + "key": { + "type": "string" + }, + "label": { + "type": "string" + }, + "level": { + "description": "Where the fact is recorded: offer (the plan), product or provider.", + "type": [ + "string", + "null" + ] + }, + "note": { + "type": "string" + }, + "stale": { + "type": "boolean" + }, + "status": { + "description": "TRUE: stated with the value; FALSE / NOT_SUPPORTED: stated as unavailable; UNKNOWN: not stated; CONFLICT: official pages disagree (value lists each version); STALE: past its recheck date; MISSING: not recorded.", + "enum": [ + "TRUE", + "FALSE", + "NOT_SUPPORTED", + "UNKNOWN", + "CONFLICT", + "STALE", + "MISSING" + ] + }, + "value": {}, + "via_exception": { + "description": "Present and true when a plan-specific exception replaced the general value.", + "type": "boolean" + } + }, + "required": [ + "key", + "status", + "value", + "level", + "evidence", + "checked_at" + ], + "type": "object" + }, + "type": "array" + }, + "label": { + "type": "string" + }, + "reason": { + "type": "string" + }, + "required": { + "type": "boolean" + }, + "verdict": { + "enum": [ + "MET", + "UNMET", + "UNKNOWN", + "UNIT_MISMATCH", + "UNIT_UNKNOWN" + ] + } + }, + "required": [ + "condition", + "label", + "required", + "verdict", + "reason", + "facts" + ], + "type": "object" + }, + "type": "array" + }, + "facts_omitted": { + "description": "search only: present and true when the source sentences under the conditions were left out so that the response fits one response; the verdicts, reasons and costs are unchanged. Ask check_conditions with the offer_id or get_details for the sentences.", + "type": "boolean" + }, + "link": { + "properties": { + "affiliate": { + "properties": { + "disclosure": { + "type": [ + "string", + "null" + ] + }, + "program": { + "type": [ + "string", + "null" + ] + }, + "status": { + "type": "string" + } + }, + "required": [ + "status" + ], + "type": "object" + }, + "landing": { + "type": "string" + }, + "link_level": { + "type": "string" + }, + "provider_url": { + "description": "The provider page itself. Only in a page made for a browser, where url is this service's address that forwards to it; MCP and REST results do not carry it.", + "type": "string" + }, + "url": { + "description": "The only address to visit the plan: this service's /go/<offer_id>?r=<token> address, which forwards to the provider page. The token is made for this response and holds nothing about you.", + "type": "string" + } + }, + "required": [ + "url", + "landing", + "link_level", + "affiliate" + ], + "type": "object" + }, + "listed": { + "type": "boolean" + }, + "match": { + "enum": [ + "FULL_MATCH", + "PARTIAL_MATCH", + "NO_MATCH" + ] + }, + "meets_all": { + "description": "Judged against the required conditions of this call only: true when every one is met, false when one is not met, \"unknown\" when none fails and one is not stated on the official pages.", + "enum": [ + true, + false, + "unknown" + ] + }, + "monthly_cost": { + "properties": { + "explanation": { + "type": "string" + }, + "facts": { + "description": "Price facts the cost was computed from.", + "items": { + "properties": { + "also_stated_in": { + "description": "get_details only: other official machine-readable documents of the provider (llms.txt, llms-full.txt, OpenAPI files, MCP tool listings) that contain the same quoted sentences.", + "items": { + "type": "string" + }, + "type": "array" + }, + "applies_to": { + "description": "get_details only: billing options (billing) or search engines (search_engines) the fact is limited to.", + "type": [ + "object", + "null" + ] + }, + "at_limit": { + "description": "Present for a plan with no automatic extra usage: what the official page says happens at the limit (kind no_extra_usage or restart_by_hand), with its sentence. With a workload that needs restarts, restarts gives their count, the price of each and the total, the numbers of monthly_cost.explanation.", + "properties": { + "evidence": { + "properties": { + "quote": { + "type": "string" + }, + "source": { + "type": "string" + } + }, + "type": "object" + }, + "kind": { + "enum": [ + "no_extra_usage", + "restart_by_hand" + ] + }, + "restarts": { + "properties": { + "count": { + "properties": { + "high": { + "type": "integer" + }, + "low": { + "type": "integer" + } + }, + "type": "object" + }, + "total_usd": { + "properties": { + "high": { + "type": "number" + }, + "low": { + "type": "number" + } + }, + "type": "object" + }, + "usd_each": { + "type": "number" + } + }, + "type": "object" + }, + "text": { + "type": "string" + } + }, + "required": [ + "kind", + "text", + "evidence" + ], + "type": "object" + }, + "checked_at": { + "type": [ + "string", + "null" + ] + }, + "concurrency_unit": { + "description": "get_details, concurrency only: the unit the page states the value in (unit, text such as \"100 threads\"). Against concurrent requests: equals_requests (value, text and the official line of the unit rule) when the unit rule counts this unit as requests, else note \"not the same unit as concurrent requests\"; \"unit not stated\" when the page names none.", + "type": "object" + }, + "derived": { + "description": "How the value follows from the quoted sentence when it is not literal.", + "type": "string" + }, + "evidence": { + "items": { + "properties": { + "quote": { + "description": "The sentence as it appears on that page.", + "type": "string" + }, + "retrieved_at": { + "description": "Date the page was read (YYYY-MM-DD). Only with detail=full.", + "type": "string" + }, + "source": { + "description": "Official page the sentence was found on.", + "type": "string" + }, + "source_type": { + "description": "Only with detail=full.", + "enum": [ + "official_pricing", + "official_docs", + "third_party" + ] + } + }, + "required": [ + "source", + "quote" + ], + "type": "object" + }, + "type": "array" + }, + "exceptions": { + "description": "get_details only: plans with a different value.", + "type": "array" + }, + "key": { + "type": "string" + }, + "label": { + "type": "string" + }, + "level": { + "description": "Where the fact is recorded: offer (the plan), product or provider.", + "type": [ + "string", + "null" + ] + }, + "note": { + "type": "string" + }, + "stale": { + "type": "boolean" + }, + "status": { + "description": "TRUE: stated with the value; FALSE / NOT_SUPPORTED: stated as unavailable; UNKNOWN: not stated; CONFLICT: official pages disagree (value lists each version); STALE: past its recheck date; MISSING: not recorded.", + "enum": [ + "TRUE", + "FALSE", + "NOT_SUPPORTED", + "UNKNOWN", + "CONFLICT", + "STALE", + "MISSING" + ] + }, + "value": {}, + "via_exception": { + "description": "Present and true when a plan-specific exception replaced the general value.", + "type": "boolean" + } + }, + "required": [ + "key", + "status", + "value", + "level", + "evidence", + "checked_at" + ], + "type": "object" + }, + "type": "array" + }, + "high": { + "type": [ + "number", + "null" + ] + }, + "low": { + "type": [ + "number", + "null" + ] + }, + "lower_bound": { + "type": [ + "number", + "null" + ] + }, + "status": { + "enum": [ + "exact", + "range", + "lower_bound", + "unknown" + ] + }, + "upfront_usd": { + "type": [ + "number", + "null" + ] + }, + "usd": { + "type": [ + "number", + "null" + ] + } + }, + "required": [ + "status", + "usd", + "explanation" + ], + "type": "object" + }, + "offer_id": { + "type": "string" + }, + "offer_name": { + "type": "string" + }, + "page_url": { + "type": "string" + }, + "plan_page": { + "description": "The link to give the user with this plan, as a markdown link named \"<provider> <plan> โ plan page\" (its pricing and sign-up page). The evidence sources under the conditions are for citing a condition.", + "type": "string" + }, + "preferred_met": { + "type": "integer" + }, + "prices_exclude_tax": { + "type": [ + "boolean", + "null" + ] + }, + "product_id": { + "type": "string" + }, + "product_name": { + "type": "string" + }, + "provider_id": { + "type": "string" + }, + "provider_name": { + "type": "string" + }, + "unknown_conditions": { + "items": { + "type": "string" + }, + "type": "array" + }, + "unmet_conditions": { + "items": { + "type": "string" + }, + "type": "array" + }, + "verdict": { + "description": "One sentence: the conditions met, or the ones not met or not stated, with the reason.", + "type": "string" + } + }, + "required": [ + "offer_id", + "offer_name", + "product_id", + "provider_name", + "match", + "meets_all", + "verdict", + "billing", + "monthly_cost", + "conditions", + "unmet_conditions", + "unknown_conditions", + "link", + "checked_at" + ], + "type": "object" + }, + "type": "array" + }, + "request": { + "type": "object" + }, + "show_text": { + "description": "Ready to show: one line per listed plan, in list order, \"Meets all N: [Provider Plan](visit link)\" for a plan that meets every required condition of the call, \"Closest: [Provider Plan](visit link)\" for any other. The plan is a markdown link to its visit link, which carries the token of this response. Absent when no plan is listed.", + "type": "string" + }, + "unknown_providers": { + "description": "Only when providers was given: the names that are not a provider id or name in this catalog.", + "items": { + "type": "string" + }, + "type": "array" + }, + "zero_result": { + "properties": { + "conditions": { + "items": { + "properties": { + "closest": { + "description": "The cheapest plan that meets every other required condition but not this one. It does not meet the request (meets_all false or \"unknown\").", + "properties": { + "billing": { + "type": "string" + }, + "fails": { + "type": "string" + }, + "meets_all": { + "description": "Judged against the required conditions of this call only: true when every one is met, false when one is not met, \"unknown\" when none fails and one is not stated on the official pages.", + "enum": [ + true, + false, + "unknown" + ] + }, + "monthly_cost": { + "type": "object" + }, + "offer_id": { + "type": "string" + }, + "offer_name": { + "type": "string" + }, + "page_url": { + "type": "string" + }, + "provider_name": { + "type": "string" + } + }, + "required": [ + "offer_id", + "offer_name", + "provider_name", + "billing", + "monthly_cost", + "meets_all", + "fails" + ], + "type": [ + "object", + "null" + ] + }, + "condition": { + "type": "string" + }, + "excluded": { + "type": "integer" + }, + "label": { + "type": "string" + }, + "unknown": { + "type": "integer" + }, + "would_match_if_relaxed": { + "type": "integer" + } + }, + "required": [ + "condition", + "label", + "excluded", + "would_match_if_relaxed", + "closest" + ], + "type": "object" + }, + "type": "array" + }, + "note": { + "type": "string" + } + }, + "type": [ + "object", + "null" + ] + } + }, + "required": [ + "answer", + "as_of", + "needs_input", + "counts", + "full_matches", + "partial_matches", + "zero_result", + "assumptions", + "notes" + ], + "type": "object" + }, + { + "properties": { + "answer": { + "type": "string" + }, + "as_of": { + "type": "string" + }, + "counts": { + "properties": { + "candidates": { + "type": "integer" + }, + "full": { + "type": "integer" + }, + "no_match": { + "type": "integer" + }, + "partial": { + "type": "integer" + } + }, + "required": [ + "candidates", + "full", + "partial", + "no_match" + ], + "type": "object" + }, + "format": { + "enum": [ + "brief" + ] + }, + "full_matches": { + "items": { + "properties": { + "conditions": { + "items": { + "properties": { + "condition": { + "type": "string" + }, + "quote": { + "description": "One official source sentence, 200 characters at most.", + "type": "string" + }, + "reason": { + "description": "One line, 120 characters at most.", + "type": "string" + }, + "required": { + "description": "Present only on a preferred (nice-to-have) condition.", + "enum": [ + false + ] + }, + "source": { + "description": "Official page the sentence was found on.", + "type": [ + "string", + "null" + ] + }, + "verdict": { + "enum": [ + "MET", + "UNMET", + "UNKNOWN", + "UNIT_MISMATCH", + "UNIT_UNKNOWN" + ] + } + }, + "required": [ + "condition", + "verdict", + "reason" + ], + "type": "object" + }, + "type": "array" + }, + "match": { + "enum": [ + "FULL_MATCH", + "PARTIAL_MATCH", + "NO_MATCH" + ] + }, + "meets_all": { + "description": "Judged against the required conditions of this call only: true when every one is met, false when one is not met, \"unknown\" when none fails and one is not stated on the official pages.", + "enum": [ + true, + false, + "unknown" + ] + }, + "monthly_cost": { + "description": "status, usd, and low, high or lower_bound when they differ; as in the full result.", + "type": "object" + }, + "offer_id": { + "type": "string" + }, + "offer_name": { + "type": "string" + }, + "plan_page": { + "description": "The link to give the user with this plan, as a markdown link named \"<provider> <plan> โ plan page\" (its pricing and sign-up page). The evidence sources under the conditions are for citing a condition.", + "type": "string" + }, + "provider": { + "type": "string" + } + }, + "required": [ + "offer_id", + "offer_name", + "provider", + "meets_all", + "monthly_cost", + "conditions" + ], + "type": "object" + }, + "type": "array" + }, + "more_note": { + "type": "string" + }, + "more_plans": { + "description": "Matching plans left out of the short list: limit is the number of plans in all, fully matching first.", + "type": "integer" + }, + "needs_input": { + "items": { + "properties": { + "field": { + "type": "string" + }, + "reason": { + "type": "string" + } + }, + "required": [ + "field", + "reason" + ], + "type": "object" + }, + "type": "array" + }, + "partial_matches": { + "items": { + "properties": { + "conditions": { + "items": { + "properties": { + "condition": { + "type": "string" + }, + "quote": { + "description": "One official source sentence, 200 characters at most.", + "type": "string" + }, + "reason": { + "description": "One line, 120 characters at most.", + "type": "string" + }, + "required": { + "description": "Present only on a preferred (nice-to-have) condition.", + "enum": [ + false + ] + }, + "source": { + "description": "Official page the sentence was found on.", + "type": [ + "string", + "null" + ] + }, + "verdict": { + "enum": [ + "MET", + "UNMET", + "UNKNOWN", + "UNIT_MISMATCH", + "UNIT_UNKNOWN" + ] + } + }, + "required": [ + "condition", + "verdict", + "reason" + ], + "type": "object" + }, + "type": "array" + }, + "match": { + "enum": [ + "FULL_MATCH", + "PARTIAL_MATCH", + "NO_MATCH" + ] + }, + "meets_all": { + "description": "Judged against the required conditions of this call only: true when every one is met, false when one is not met, \"unknown\" when none fails and one is not stated on the official pages.", + "enum": [ + true, + false, + "unknown" + ] + }, + "monthly_cost": { + "description": "status, usd, and low, high or lower_bound when they differ; as in the full result.", + "type": "object" + }, + "offer_id": { + "type": "string" + }, + "offer_name": { + "type": "string" + }, + "plan_page": { + "description": "The link to give the user with this plan, as a markdown link named \"<provider> <plan> โ plan page\" (its pricing and sign-up page). The evidence sources under the conditions are for citing a condition.", + "type": "string" + }, + "provider": { + "type": "string" + } + }, + "required": [ + "offer_id", + "offer_name", + "provider", + "meets_all", + "monthly_cost", + "conditions" + ], + "type": "object" + }, + "type": "array" + }, + "show_text": { + "description": "Ready to show: one line per listed plan, in list order, \"Meets all N: [Provider Plan](visit link)\" for a plan that meets every required condition of the call, \"Closest: [Provider Plan](visit link)\" for any other. The plan is a markdown link to its visit link, which carries the token of this response. Absent when no plan is listed.", + "type": "string" + }, + "unknown_providers": { + "items": { + "type": "string" + }, + "type": "array" + }, + "zero_result": { + "properties": { + "conditions": { + "items": { + "properties": { + "closest": { + "description": "The cheapest plan that meets every other required condition but not this one. It does not meet the request (meets_all false or \"unknown\").", + "properties": { + "billing": { + "type": "string" + }, + "fails": { + "type": "string" + }, + "meets_all": { + "description": "Judged against the required conditions of this call only: true when every one is met, false when one is not met, \"unknown\" when none fails and one is not stated on the official pages.", + "enum": [ + true, + false, + "unknown" + ] + }, + "monthly_cost": { + "type": "object" + }, + "offer_id": { + "type": "string" + }, + "offer_name": { + "type": "string" + }, + "page_url": { + "type": "string" + }, + "provider_name": { + "type": "string" + } + }, + "required": [ + "offer_id", + "offer_name", + "provider_name", + "billing", + "monthly_cost", + "meets_all", + "fails" + ], + "type": [ + "object", + "null" + ] + }, + "condition": { + "type": "string" + }, + "excluded": { + "type": "integer" + }, + "label": { + "type": "string" + }, + "unknown": { + "type": "integer" + }, + "would_match_if_relaxed": { + "type": "integer" + } + }, + "required": [ + "condition", + "label", + "excluded", + "would_match_if_relaxed", + "closest" + ], + "type": "object" + }, + "type": "array" + }, + "note": { + "type": "string" + } + }, + "type": [ + "object", + "null" + ] + } + }, + "required": [ + "format", + "answer", + "as_of", + "needs_input", + "counts", + "full_matches", + "partial_matches" + ], + "type": "object" + } +]
1 tool update
- Added
verify_answer
3 tool updates
- Changed
check_conditions1 field changed- changed
Output schema / anyOfPrevious value: -[ - { - "properties": { - "answer": { - "description": "One sentence that opens the answer: the cheapest checked plan (or plan of the same product) that meets every required condition with its link, or, when none does, the closest checked plan with what it does not meet or what is unknown, and its link.", - "type": "string" - }, - "as_of": { - "type": "string" - }, - "assumptions": { - "items": { - "type": "string" - }, - "type": "array" - }, - "link_notes": { - "additionalProperties": { - "type": "string" - }, - "description": "The note of each link level (link.link_level) of the plans in this result, stated once.", - "type": "object" - }, - "needs_input": { - "items": { - "properties": { - "field": { - "type": "string" - }, - "reason": { - "type": "string" - } - }, - "required": [ - "field", - "reason" - ], - "type": "object" - }, - "type": "array" - }, - "notes": { - "items": { - "type": "string" - }, - "type": "array" - }, - "request": { - "type": "object" - }, - "resolution": { - "description": "How each entry of plans was read.", - "items": { - "properties": { - "candidates": { - "items": { - "properties": { - "listed": { - "type": "boolean" - }, - "offer_id": { - "type": "string" - }, - "offer_name": { - "type": "string" - }, - "product_name": { - "type": "string" - }, - "provider_name": { - "type": "string" - } - }, - "required": [ - "offer_id", - "offer_name", - "provider_name" - ], - "type": "object" - }, - "type": "array" - }, - "candidates_total": { - "type": "integer" - }, - "input": { - "type": "string" - }, - "matched_by": { - "enum": [ - "id", - "name", - "url", - null - ] - }, - "note": { - "type": [ - "string", - "null" - ] - }, - "offer_id": { - "type": [ - "string", - "null" - ] - }, - "status": { - "description": "resolved: one plan, checked in results; ambiguous: several plans fit, listed in candidates and not checked; not_found: no plan in the catalog fits.", - "enum": [ - "resolved", - "ambiguous", - "not_found" - ] - } - }, - "required": [ - "input", - "status", - "offer_id", - "candidates" - ], - "type": "object" - }, - "type": "array" - }, - "results": { - "items": { - "properties": { - "assumptions": { - "items": { - "type": "string" - }, - "type": "array" - }, - "at_limit": { - "description": "Present for a plan with no automatic extra usage: what the official page says happens at the limit (kind no_extra_usage or restart_by_hand), with its sentence. With a workload that needs restarts, restarts gives their count, the price of each and the total, the numbers of monthly_cost.explanation.", - "properties": { - "evidence": { - "properties": { - "quote": { - "type": "string" - }, - "source": { - "type": "string" - } - }, - "type": "object" - }, - "kind": { - "enum": [ - "no_extra_usage", - "restart_by_hand" - ] - }, - "restarts": { - "properties": { - "count": { - "properties": { - "high": { - "type": "integer" - }, - "low": { - "type": "integer" - } - }, - "type": "object" - }, - "total_usd": { - "properties": { - "high": { - "type": "number" - }, - "low": { - "type": "number" - } - }, - "type": "object" - }, - "usd_each": { - "type": "number" - } - }, - "type": "object" - }, - "text": { - "type": "string" - } - }, - "required": [ - "kind", - "text", - "evidence" - ], - "type": "object" - }, - "billing": { - "type": "string" - }, - "billing_options": { - "items": { - "type": "string" - }, - "type": "array" - }, - "cheapest_in_product": { - "description": "The cheapest listed plan of the same product that meets every required condition of this call; is_this_plan is true when that is the checked plan. null when no plan of the product meets them all.", - "properties": { - "billing": { - "type": "string" - }, - "is_this_plan": { - "type": "boolean" - }, - "monthly_cost": { - "type": "object" - }, - "offer_id": { - "type": "string" - }, - "offer_name": { - "type": "string" - }, - "page_url": { - "type": "string" - } - }, - "required": [ - "offer_id", - "offer_name", - "billing", - "monthly_cost", - "is_this_plan" - ], - "type": [ - "object", - "null" - ] - }, - "checked_at": { - "type": [ - "string", - "null" - ] - }, - "conditions": { - "items": { - "properties": { - "condition": { - "type": "string" - }, - "facts": { - "description": "Facts the verdict was judged from. The monthly budget is judged from monthly_cost; its price facts are listed there only.", - "items": { - "properties": { - "also_stated_in": { - "description": "get_details only: other official machine-readable documents of the provider (llms.txt, llms-full.txt, OpenAPI files, MCP tool listings) that contain the same quoted sentences.", - "items": { - "type": "string" - }, - "type": "array" - }, - "applies_to": { - "description": "get_details only: billing options (billing) or search engines (search_engines) the fact is limited to.", - "type": [ - "object", - "null" - ] - }, - "at_limit": { - "description": "Present for a plan with no automatic extra usage: what the official page says happens at the limit (kind no_extra_usage or restart_by_hand), with its sentence. With a workload that needs restarts, restarts gives their count, the price of each and the total, the numbers of monthly_cost.explanation.", - "properties": { - "evidence": { - "properties": { - "quote": { - "type": "string" - }, - "source": { - "type": "string" - } - }, - "type": "object" - }, - "kind": { - "enum": [ - "no_extra_usage", - "restart_by_hand" - ] - }, - "restarts": { - "properties": { - "count": { - "properties": { - "high": { - "type": "integer" - }, - "low": { - "type": "integer" - } - }, - "type": "object" - }, - "total_usd": { - "properties": { - "high": { - "type": "number" - }, - "low": { - "type": "number" - } - }, - "type": "object" - }, - "usd_each": { - "type": "number" - } - }, - "type": "object" - }, - "text": { - "type": "string" - } - }, - "required": [ - "kind", - "text", - "evidence" - ], - "type": "object" - }, - "checked_at": { - "type": [ - "string", - "null" - ] - }, - "concurrency_unit": { - "description": "get_details, concurrency only: the unit the page states the value in (unit, text such as \"100 threads\"). Against concurrent requests: equals_requests (value, text and the official line of the unit rule) when the unit rule counts this unit as requests, else note \"not the same unit as concurrent requests\"; \"unit not stated\" when the page names none.", - "type": "object" - }, - "derived": { - "description": "How the value follows from the quoted sentence when it is not literal.", - "type": "string" - }, - "evidence": { - "items": { - "properties": { - "quote": { - "description": "The sentence as it appears on that page.", - "type": "string" - }, - "retrieved_at": { - "description": "Date the page was read (YYYY-MM-DD). Only with detail=full.", - "type": "string" - }, - "source": { - "description": "Official page the sentence was found on.", - "type": "string" - }, - "source_type": { - "description": "Only with detail=full.", - "enum": [ - "official_pricing", - "official_docs", - "third_party" - ] - } - }, - "required": [ - "source", - "quote" - ], - "type": "object" - }, - "type": "array" - }, - "exceptions": { - "description": "get_details only: plans with a different value.", - "type": "array" - }, - "key": { - "type": "string" - }, - "label": { - "type": "string" - }, - "level": { - "description": "Where the fact is recorded: offer (the plan), product or provider.", - "type": [ - "string", - "null" - ] - }, - "note": { - "type": "string" - }, - "stale": { - "type": "boolean" - }, - "status": { - "description": "TRUE: stated with the value; FALSE / NOT_SUPPORTED: stated as unavailable; UNKNOWN: not stated; CONFLICT: official pages disagree (value lists each version); STALE: past its recheck date; MISSING: not recorded.", - "enum": [ - "TRUE", - "FALSE", - "NOT_SUPPORTED", - "UNKNOWN", - "CONFLICT", - "STALE", - "MISSING" - ] - }, - "value": {}, - "via_exception": { - "description": "Present and true when a plan-specific exception replaced the general value.", - "type": "boolean" - } - }, - "required": [ - "key", - "status", - "value", - "level", - "evidence", - "checked_at" - ], - "type": "object" - }, - "type": "array" - }, - "label": { - "type": "string" - }, - "reason": { - "type": "string" - }, - "required": { - "type": "boolean" - }, - "verdict": { - "enum": [ - "MET", - "UNMET", - "UNKNOWN", - "UNIT_MISMATCH", - "UNIT_UNKNOWN" - ] - } - }, - "required": [ - "condition", - "label", - "required", - "verdict", - "reason", - "facts" - ], - "type": "object" - }, - "type": "array" - }, - "facts_omitted": { - "description": "search only: present and true when the source sentences under the conditions were left out so that the response fits one response; the verdicts, reasons and costs are unchanged. Ask check_conditions with the offer_id or get_details for the sentences.", - "type": "boolean" - }, - "link": { - "properties": { - "affiliate": { - "properties": { - "disclosure": { - "type": [ - "string", - "null" - ] - }, - "program": { - "type": [ - "string", - "null" - ] - }, - "status": { - "type": "string" - } - }, - "required": [ - "status" - ], - "type": "object" - }, - "landing": { - "type": "string" - }, - "link_level": { - "type": "string" - }, - "provider_url": { - "description": "The provider page itself. Only in a page made for a browser, where url is this service's address that forwards to it; MCP and REST results do not carry it.", - "type": "string" - }, - "url": { - "description": "The only address to visit the plan: this service's /go/<offer_id>?r=<token> address, which forwards to the provider page. The token is made for this response and holds nothing about you.", - "type": "string" - } - }, - "required": [ - "url", - "landing", - "link_level", - "affiliate" - ], - "type": "object" - }, - "listed": { - "type": "boolean" - }, - "match": { - "enum": [ - "FULL_MATCH", - "PARTIAL_MATCH", - "NO_MATCH" - ] - }, - "meets_all": { - "description": "Judged against the required conditions of this call only: true when every one is met, false when one is not met, \"unknown\" when none fails and one is not stated on the official pages.", - "enum": [ - true, - false, - "unknown" - ] - }, - "monthly_cost": { - "properties": { - "explanation": { - "type": "string" - }, - "facts": { - "description": "Price facts the cost was computed from.", - "items": { - "properties": { - "also_stated_in": { - "description": "get_details only: other official machine-readable documents of the provider (llms.txt, llms-full.txt, OpenAPI files, MCP tool listings) that contain the same quoted sentences.", - "items": { - "type": "string" - }, - "type": "array" - }, - "applies_to": { - "description": "get_details only: billing options (billing) or search engines (search_engines) the fact is limited to.", - "type": [ - "object", - "null" - ] - }, - "at_limit": { - "description": "Present for a plan with no automatic extra usage: what the official page says happens at the limit (kind no_extra_usage or restart_by_hand), with its sentence. With a workload that needs restarts, restarts gives their count, the price of each and the total, the numbers of monthly_cost.explanation.", - "properties": { - "evidence": { - "properties": { - "quote": { - "type": "string" - }, - "source": { - "type": "string" - } - }, - "type": "object" - }, - "kind": { - "enum": [ - "no_extra_usage", - "restart_by_hand" - ] - }, - "restarts": { - "properties": { - "count": { - "properties": { - "high": { - "type": "integer" - }, - "low": { - "type": "integer" - } - }, - "type": "object" - }, - "total_usd": { - "properties": { - "high": { - "type": "number" - }, - "low": { - "type": "number" - } - }, - "type": "object" - }, - "usd_each": { - "type": "number" - } - }, - "type": "object" - }, - "text": { - "type": "string" - } - }, - "required": [ - "kind", - "text", - "evidence" - ], - "type": "object" - }, - "checked_at": { - "type": [ - "string", - "null" - ] - }, - "concurrency_unit": { - "description": "get_details, concurrency only: the unit the page states the value in (unit, text such as \"100 threads\"). Against concurrent requests: equals_requests (value, text and the official line of the unit rule) when the unit rule counts this unit as requests, else note \"not the same unit as concurrent requests\"; \"unit not stated\" when the page names none.", - "type": "object" - }, - "derived": { - "description": "How the value follows from the quoted sentence when it is not literal.", - "type": "string" - }, - "evidence": { - "items": { - "properties": { - "quote": { - "description": "The sentence as it appears on that page.", - "type": "string" - }, - "retrieved_at": { - "description": "Date the page was read (YYYY-MM-DD). Only with detail=full.", - "type": "string" - }, - "source": { - "description": "Official page the sentence was found on.", - "type": "string" - }, - "source_type": { - "description": "Only with detail=full.", - "enum": [ - "official_pricing", - "official_docs", - "third_party" - ] - } - }, - "required": [ - "source", - "quote" - ], - "type": "object" - }, - "type": "array" - }, - "exceptions": { - "description": "get_details only: plans with a different value.", - "type": "array" - }, - "key": { - "type": "string" - }, - "label": { - "type": "string" - }, - "level": { - "description": "Where the fact is recorded: offer (the plan), product or provider.", - "type": [ - "string", - "null" - ] - }, - "note": { - "type": "string" - }, - "stale": { - "type": "boolean" - }, - "status": { - "description": "TRUE: stated with the value; FALSE / NOT_SUPPORTED: stated as unavailable; UNKNOWN: not stated; CONFLICT: official pages disagree (value lists each version); STALE: past its recheck date; MISSING: not recorded.", - "enum": [ - "TRUE", - "FALSE", - "NOT_SUPPORTED", - "UNKNOWN", - "CONFLICT", - "STALE", - "MISSING" - ] - }, - "value": {}, - "via_exception": { - "description": "Present and true when a plan-specific exception replaced the general value.", - "type": "boolean" - } - }, - "required": [ - "key", - "status", - "value", - "level", - "evidence", - "checked_at" - ], - "type": "object" - }, - "type": "array" - }, - "high": { - "type": [ - "number", - "null" - ] - }, - "low": { - "type": [ - "number", - "null" - ] - }, - "lower_bound": { - "type": [ - "number", - "null" - ] - }, - "status": { - "enum": [ - "exact", - "range", - "lower_bound", - "unknown" - ] - }, - "upfront_usd": { - "type": [ - "number", - "null" - ] - }, - "usd": { - "type": [ - "number", - "null" - ] - } - }, - "required": [ - "status", - "usd", - "explanation" - ], - "type": "object" - }, - "offer_id": { - "type": "string" - }, - "offer_name": { - "type": "string" - }, - "page_url": { - "type": "string" - }, - "preferred_met": { - "type": "integer" - }, - "prices_exclude_tax": { - "type": [ - "boolean", - "null" - ] - }, - "product_id": { - "type": "string" - }, - "product_name": { - "type": "string" - }, - "provider_id": { - "type": "string" - }, - "provider_name": { - "type": "string" - }, - "unknown_conditions": { - "items": { - "type": "string" - }, - "type": "array" - }, - "unmet_conditions": { - "items": { - "type": "string" - }, - "type": "array" - }, - "verdict": { - "description": "One sentence: the conditions met, or the ones not met or not stated, with the reason.", - "type": "string" - } - }, - "required": [ - "offer_id", - "offer_name", - "product_id", - "provider_name", - "match", - "meets_all", - "verdict", - "billing", - "monthly_cost", - "conditions", - "unmet_conditions", - "unknown_conditions", - "link", - "checked_at", - "cheapest_in_product" - ], - "type": "object" - }, - "type": "array" - }, - "show_text": { - "description": "Ready to show: one line per listed plan, in list order, \"Meets all N: Provider Plan โ link\" for a plan that meets every required condition of the call, \"Closest: Provider Plan โ link\" for any other. The link is the visit link of the plan, with the token of this response. Absent when no plan is listed.", - "type": "string" - } - }, - "required": [ - "answer", - "as_of", - "needs_input", - "results", - "assumptions", - "notes" - ], - "type": "object" - }, - { - "properties": { - "answer": { - "type": "string" - }, - "as_of": { - "type": "string" - }, - "format": { - "enum": [ - "brief" - ] - }, - "needs_input": { - "items": { - "properties": { - "field": { - "type": "string" - }, - "reason": { - "type": "string" - } - }, - "required": [ - "field", - "reason" - ], - "type": "object" - }, - "type": "array" - }, - "resolution": { - "type": "array" - }, - "results": { - "items": { - "properties": { - "conditions": { - "items": { - "properties": { - "condition": { - "type": "string" - }, - "quote": { - "description": "One official source sentence, 200 characters at most.", - "type": "string" - }, - "reason": { - "description": "One line, 120 characters at most.", - "type": "string" - }, - "required": { - "description": "Present only on a preferred (nice-to-have) condition.", - "enum": [ - false - ] - }, - "source": { - "description": "Official page the sentence was found on.", - "type": [ - "string", - "null" - ] - }, - "verdict": { - "enum": [ - "MET", - "UNMET", - "UNKNOWN", - "UNIT_MISMATCH", - "UNIT_UNKNOWN" - ] - } - }, - "required": [ - "condition", - "verdict", - "reason" - ], - "type": "object" - }, - "type": "array" - }, - "match": { - "enum": [ - "FULL_MATCH", - "PARTIAL_MATCH", - "NO_MATCH" - ] - }, - "meets_all": { - "description": "Judged against the required conditions of this call only: true when every one is met, false when one is not met, \"unknown\" when none fails and one is not stated on the official pages.", - "enum": [ - true, - false, - "unknown" - ] - }, - "monthly_cost": { - "description": "status, usd, and low, high or lower_bound when they differ; as in the full result.", - "type": "object" - }, - "offer_id": { - "type": "string" - }, - "offer_name": { - "type": "string" - }, - "provider": { - "type": "string" - } - }, - "required": [ - "offer_id", - "offer_name", - "provider", - "meets_all", - "monthly_cost", - "conditions" - ], - "type": "object" - }, - "type": "array" - }, - "show_text": { - "description": "Ready to show: one line per listed plan, in list order, \"Meets all N: Provider Plan โ link\" for a plan that meets every required condition of the call, \"Closest: Provider Plan โ link\" for any other. The link is the visit link of the plan, with the token of this response. Absent when no plan is listed.", - "type": "string" - } - }, - "required": [ - "format", - "answer", - "as_of", - "needs_input", - "results" - ], - "type": "object" - } -]New value: +[ + { + "properties": { + "answer": { + "description": "One sentence that opens the answer: the cheapest checked plan (or plan of the same product) that meets every required condition with its link, or, when none does, the closest checked plan with what it does not meet or what is unknown, and its link. The plan is written as a markdown link, [Provider Plan](visit link), at the end of the sentence.", + "type": "string" + }, + "as_of": { + "type": "string" + }, + "assumptions": { + "items": { + "type": "string" + }, + "type": "array" + }, + "link_notes": { + "additionalProperties": { + "type": "string" + }, + "description": "The note of each link level (link.link_level) of the plans in this result, stated once.", + "type": "object" + }, + "needs_input": { + "items": { + "properties": { + "field": { + "type": "string" + }, + "reason": { + "type": "string" + } + }, + "required": [ + "field", + "reason" + ], + "type": "object" + }, + "type": "array" + }, + "notes": { + "items": { + "type": "string" + }, + "type": "array" + }, + "request": { + "type": "object" + }, + "resolution": { + "description": "How each entry of plans was read.", + "items": { + "properties": { + "candidates": { + "items": { + "properties": { + "listed": { + "type": "boolean" + }, + "offer_id": { + "type": "string" + }, + "offer_name": { + "type": "string" + }, + "product_name": { + "type": "string" + }, + "provider_name": { + "type": "string" + } + }, + "required": [ + "offer_id", + "offer_name", + "provider_name" + ], + "type": "object" + }, + "type": "array" + }, + "candidates_total": { + "type": "integer" + }, + "input": { + "type": "string" + }, + "matched_by": { + "enum": [ + "id", + "name", + "url", + null + ] + }, + "note": { + "type": [ + "string", + "null" + ] + }, + "offer_id": { + "type": [ + "string", + "null" + ] + }, + "status": { + "description": "resolved: one plan, checked in results; ambiguous: several plans fit, listed in candidates and not checked; not_found: no plan in the catalog fits.", + "enum": [ + "resolved", + "ambiguous", + "not_found" + ] + } + }, + "required": [ + "input", + "status", + "offer_id", + "candidates" + ], + "type": "object" + }, + "type": "array" + }, + "results": { + "items": { + "properties": { + "assumptions": { + "items": { + "type": "string" + }, + "type": "array" + }, + "at_limit": { + "description": "Present for a plan with no automatic extra usage: what the official page says happens at the limit (kind no_extra_usage or restart_by_hand), with its sentence. With a workload that needs restarts, restarts gives their count, the price of each and the total, the numbers of monthly_cost.explanation.", + "properties": { + "evidence": { + "properties": { + "quote": { + "type": "string" + }, + "source": { + "type": "string" + } + }, + "type": "object" + }, + "kind": { + "enum": [ + "no_extra_usage", + "restart_by_hand" + ] + }, + "restarts": { + "properties": { + "count": { + "properties": { + "high": { + "type": "integer" + }, + "low": { + "type": "integer" + } + }, + "type": "object" + }, + "total_usd": { + "properties": { + "high": { + "type": "number" + }, + "low": { + "type": "number" + } + }, + "type": "object" + }, + "usd_each": { + "type": "number" + } + }, + "type": "object" + }, + "text": { + "type": "string" + } + }, + "required": [ + "kind", + "text", + "evidence" + ], + "type": "object" + }, + "billing": { + "type": "string" + }, + "billing_options": { + "items": { + "type": "string" + }, + "type": "array" + }, + "cheapest_in_product": { + "description": "The cheapest listed plan of the same product that meets every required condition of this call; is_this_plan is true when that is the checked plan. null when no plan of the product meets them all.", + "properties": { + "billing": { + "type": "string" + }, + "is_this_plan": { + "type": "boolean" + }, + "monthly_cost": { + "type": "object" + }, + "offer_id": { + "type": "string" + }, + "offer_name": { + "type": "string" + }, + "page_url": { + "type": "string" + } + }, + "required": [ + "offer_id", + "offer_name", + "billing", + "monthly_cost", + "is_this_plan" + ], + "type": [ + "object", + "null" + ] + }, + "checked_at": { + "type": [ + "string", + "null" + ] + }, + "conditions": { + "items": { + "properties": { + "condition": { + "type": "string" + }, + "facts": { + "description": "Facts the verdict was judged from. The monthly budget is judged from monthly_cost; its price facts are listed there only.", + "items": { + "properties": { + "also_stated_in": { + "description": "get_details only: other official machine-readable documents of the provider (llms.txt, llms-full.txt, OpenAPI files, MCP tool listings) that contain the same quoted sentences.", + "items": { + "type": "string" + }, + "type": "array" + }, + "applies_to": { + "description": "get_details only: billing options (billing) or search engines (search_engines) the fact is limited to.", + "type": [ + "object", + "null" + ] + }, + "at_limit": { + "description": "Present for a plan with no automatic extra usage: what the official page says happens at the limit (kind no_extra_usage or restart_by_hand), with its sentence. With a workload that needs restarts, restarts gives their count, the price of each and the total, the numbers of monthly_cost.explanation.", + "properties": { + "evidence": { + "properties": { + "quote": { + "type": "string" + }, + "source": { + "type": "string" + } + }, + "type": "object" + }, + "kind": { + "enum": [ + "no_extra_usage", + "restart_by_hand" + ] + }, + "restarts": { + "properties": { + "count": { + "properties": { + "high": { + "type": "integer" + }, + "low": { + "type": "integer" + } + }, + "type": "object" + }, + "total_usd": { + "properties": { + "high": { + "type": "number" + }, + "low": { + "type": "number" + } + }, + "type": "object" + }, + "usd_each": { + "type": "number" + } + }, + "type": "object" + }, + "text": { + "type": "string" + } + }, + "required": [ + "kind", + "text", + "evidence" + ], + "type": "object" + }, + "checked_at": { + "type": [ + "string", + "null" + ] + }, + "concurrency_unit": { + "description": "get_details, concurrency only: the unit the page states the value in (unit, text such as \"100 threads\"). Against concurrent requests: equals_requests (value, text and the official line of the unit rule) when the unit rule counts this unit as requests, else note \"not the same unit as concurrent requests\"; \"unit not stated\" when the page names none.", + "type": "object" + }, + "derived": { + "description": "How the value follows from the quoted sentence when it is not literal.", + "type": "string" + }, + "evidence": { + "items": { + "properties": { + "quote": { + "description": "The sentence as it appears on that page.", + "type": "string" + }, + "retrieved_at": { + "description": "Date the page was read (YYYY-MM-DD). Only with detail=full.", + "type": "string" + }, + "source": { + "description": "Official page the sentence was found on.", + "type": "string" + }, + "source_type": { + "description": "Only with detail=full.", + "enum": [ + "official_pricing", + "official_docs", + "third_party" + ] + } + }, + "required": [ + "source", + "quote" + ], + "type": "object" + }, + "type": "array" + }, + "exceptions": { + "description": "get_details only: plans with a different value.", + "type": "array" + }, + "key": { + "type": "string" + }, + "label": { + "type": "string" + }, + "level": { + "description": "Where the fact is recorded: offer (the plan), product or provider.", + "type": [ + "string", + "null" + ] + }, + "note": { + "type": "string" + }, + "stale": { + "type": "boolean" + }, + "status": { + "description": "TRUE: stated with the value; FALSE / NOT_SUPPORTED: stated as unavailable; UNKNOWN: not stated; CONFLICT: official pages disagree (value lists each version); STALE: past its recheck date; MISSING: not recorded.", + "enum": [ + "TRUE", + "FALSE", + "NOT_SUPPORTED", + "UNKNOWN", + "CONFLICT", + "STALE", + "MISSING" + ] + }, + "value": {}, + "via_exception": { + "description": "Present and true when a plan-specific exception replaced the general value.", + "type": "boolean" + } + }, + "required": [ + "key", + "status", + "value", + "level", + "evidence", + "checked_at" + ], + "type": "object" + }, + "type": "array" + }, + "label": { + "type": "string" + }, + "reason": { + "type": "string" + }, + "required": { + "type": "boolean" + }, + "verdict": { + "enum": [ + "MET", + "UNMET", + "UNKNOWN", + "UNIT_MISMATCH", + "UNIT_UNKNOWN" + ] + } + }, + "required": [ + "condition", + "label", + "required", + "verdict", + "reason", + "facts" + ], + "type": "object" + }, + "type": "array" + }, + "facts_omitted": { + "description": "search only: present and true when the source sentences under the conditions were left out so that the response fits one response; the verdicts, reasons and costs are unchanged. Ask check_conditions with the offer_id or get_details for the sentences.", + "type": "boolean" + }, + "link": { + "properties": { + "affiliate": { + "properties": { + "disclosure": { + "type": [ + "string", + "null" + ] + }, + "program": { + "type": [ + "string", + "null" + ] + }, + "status": { + "type": "string" + } + }, + "required": [ + "status" + ], + "type": "object" + }, + "landing": { + "type": "string" + }, + "link_level": { + "type": "string" + }, + "provider_url": { + "description": "The provider page itself. Only in a page made for a browser, where url is this service's address that forwards to it; MCP and REST results do not carry it.", + "type": "string" + }, + "url": { + "description": "The only address to visit the plan: this service's /go/<offer_id>?r=<token> address, which forwards to the provider page. The token is made for this response and holds nothing about you.", + "type": "string" + } + }, + "required": [ + "url", + "landing", + "link_level", + "affiliate" + ], + "type": "object" + }, + "listed": { + "type": "boolean" + }, + "match": { + "enum": [ + "FULL_MATCH", + "PARTIAL_MATCH", + "NO_MATCH" + ] + }, + "meets_all": { + "description": "Judged against the required conditions of this call only: true when every one is met, false when one is not met, \"unknown\" when none fails and one is not stated on the official pages.", + "enum": [ + true, + false, + "unknown" + ] + }, + "monthly_cost": { + "properties": { + "explanation": { + "type": "string" + }, + "facts": { + "description": "Price facts the cost was computed from.", + "items": { + "properties": { + "also_stated_in": { + "description": "get_details only: other official machine-readable documents of the provider (llms.txt, llms-full.txt, OpenAPI files, MCP tool listings) that contain the same quoted sentences.", + "items": { + "type": "string" + }, + "type": "array" + }, + "applies_to": { + "description": "get_details only: billing options (billing) or search engines (search_engines) the fact is limited to.", + "type": [ + "object", + "null" + ] + }, + "at_limit": { + "description": "Present for a plan with no automatic extra usage: what the official page says happens at the limit (kind no_extra_usage or restart_by_hand), with its sentence. With a workload that needs restarts, restarts gives their count, the price of each and the total, the numbers of monthly_cost.explanation.", + "properties": { + "evidence": { + "properties": { + "quote": { + "type": "string" + }, + "source": { + "type": "string" + } + }, + "type": "object" + }, + "kind": { + "enum": [ + "no_extra_usage", + "restart_by_hand" + ] + }, + "restarts": { + "properties": { + "count": { + "properties": { + "high": { + "type": "integer" + }, + "low": { + "type": "integer" + } + }, + "type": "object" + }, + "total_usd": { + "properties": { + "high": { + "type": "number" + }, + "low": { + "type": "number" + } + }, + "type": "object" + }, + "usd_each": { + "type": "number" + } + }, + "type": "object" + }, + "text": { + "type": "string" + } + }, + "required": [ + "kind", + "text", + "evidence" + ], + "type": "object" + }, + "checked_at": { + "type": [ + "string", + "null" + ] + }, + "concurrency_unit": { + "description": "get_details, concurrency only: the unit the page states the value in (unit, text such as \"100 threads\"). Against concurrent requests: equals_requests (value, text and the official line of the unit rule) when the unit rule counts this unit as requests, else note \"not the same unit as concurrent requests\"; \"unit not stated\" when the page names none.", + "type": "object" + }, + "derived": { + "description": "How the value follows from the quoted sentence when it is not literal.", + "type": "string" + }, + "evidence": { + "items": { + "properties": { + "quote": { + "description": "The sentence as it appears on that page.", + "type": "string" + }, + "retrieved_at": { + "description": "Date the page was read (YYYY-MM-DD). Only with detail=full.", + "type": "string" + }, + "source": { + "description": "Official page the sentence was found on.", + "type": "string" + }, + "source_type": { + "description": "Only with detail=full.", + "enum": [ + "official_pricing", + "official_docs", + "third_party" + ] + } + }, + "required": [ + "source", + "quote" + ], + "type": "object" + }, + "type": "array" + }, + "exceptions": { + "description": "get_details only: plans with a different value.", + "type": "array" + }, + "key": { + "type": "string" + }, + "label": { + "type": "string" + }, + "level": { + "description": "Where the fact is recorded: offer (the plan), product or provider.", + "type": [ + "string", + "null" + ] + }, + "note": { + "type": "string" + }, + "stale": { + "type": "boolean" + }, + "status": { + "description": "TRUE: stated with the value; FALSE / NOT_SUPPORTED: stated as unavailable; UNKNOWN: not stated; CONFLICT: official pages disagree (value lists each version); STALE: past its recheck date; MISSING: not recorded.", + "enum": [ + "TRUE", + "FALSE", + "NOT_SUPPORTED", + "UNKNOWN", + "CONFLICT", + "STALE", + "MISSING" + ] + }, + "value": {}, + "via_exception": { + "description": "Present and true when a plan-specific exception replaced the general value.", + "type": "boolean" + } + }, + "required": [ + "key", + "status", + "value", + "level", + "evidence", + "checked_at" + ], + "type": "object" + }, + "type": "array" + }, + "high": { + "type": [ + "number", + "null" + ] + }, + "low": { + "type": [ + "number", + "null" + ] + }, + "lower_bound": { + "type": [ + "number", + "null" + ] + }, + "status": { + "enum": [ + "exact", + "range", + "lower_bound", + "unknown" + ] + }, + "upfront_usd": { + "type": [ + "number", + "null" + ] + }, + "usd": { + "type": [ + "number", + "null" + ] + } + }, + "required": [ + "status", + "usd", + "explanation" + ], + "type": "object" + }, + "offer_id": { + "type": "string" + }, + "offer_name": { + "type": "string" + }, + "page_url": { + "type": "string" + }, + "preferred_met": { + "type": "integer" + }, + "prices_exclude_tax": { + "type": [ + "boolean", + "null" + ] + }, + "product_id": { + "type": "string" + }, + "product_name": { + "type": "string" + }, + "provider_id": { + "type": "string" + }, + "provider_name": { + "type": "string" + }, + "unknown_conditions": { + "items": { + "type": "string" + }, + "type": "array" + }, + "unmet_conditions": { + "items": { + "type": "string" + }, + "type": "array" + }, + "verdict": { + "description": "One sentence: the conditions met, or the ones not met or not stated, with the reason.", + "type": "string" + } + }, + "required": [ + "offer_id", + "offer_name", + "product_id", + "provider_name", + "match", + "meets_all", + "verdict", + "billing", + "monthly_cost", + "conditions", + "unmet_conditions", + "unknown_conditions", + "link", + "checked_at", + "cheapest_in_product" + ], + "type": "object" + }, + "type": "array" + }, + "show_text": { + "description": "Ready to show: one line per listed plan, in list order, \"Meets all N: [Provider Plan](visit link)\" for a plan that meets every required condition of the call, \"Closest: [Provider Plan](visit link)\" for any other. The plan is a markdown link to its visit link, which carries the token of this response. Absent when no plan is listed.", + "type": "string" + } + }, + "required": [ + "answer", + "as_of", + "needs_input", + "results", + "assumptions", + "notes" + ], + "type": "object" + }, + { + "properties": { + "answer": { + "type": "string" + }, + "as_of": { + "type": "string" + }, + "format": { + "enum": [ + "brief" + ] + }, + "needs_input": { + "items": { + "properties": { + "field": { + "type": "string" + }, + "reason": { + "type": "string" + } + }, + "required": [ + "field", + "reason" + ], + "type": "object" + }, + "type": "array" + }, + "resolution": { + "type": "array" + }, + "results": { + "items": { + "properties": { + "conditions": { + "items": { + "properties": { + "condition": { + "type": "string" + }, + "quote": { + "description": "One official source sentence, 200 characters at most.", + "type": "string" + }, + "reason": { + "description": "One line, 120 characters at most.", + "type": "string" + }, + "required": { + "description": "Present only on a preferred (nice-to-have) condition.", + "enum": [ + false + ] + }, + "source": { + "description": "Official page the sentence was found on.", + "type": [ + "string", + "null" + ] + }, + "verdict": { + "enum": [ + "MET", + "UNMET", + "UNKNOWN", + "UNIT_MISMATCH", + "UNIT_UNKNOWN" + ] + } + }, + "required": [ + "condition", + "verdict", + "reason" + ], + "type": "object" + }, + "type": "array" + }, + "match": { + "enum": [ + "FULL_MATCH", + "PARTIAL_MATCH", + "NO_MATCH" + ] + }, + "meets_all": { + "description": "Judged against the required conditions of this call only: true when every one is met, false when one is not met, \"unknown\" when none fails and one is not stated on the official pages.", + "enum": [ + true, + false, + "unknown" + ] + }, + "monthly_cost": { + "description": "status, usd, and low, high or lower_bound when they differ; as in the full result.", + "type": "object" + }, + "offer_id": { + "type": "string" + }, + "offer_name": { + "type": "string" + }, + "provider": { + "type": "string" + } + }, + "required": [ + "offer_id", + "offer_name", + "provider", + "meets_all", + "monthly_cost", + "conditions" + ], + "type": "object" + }, + "type": "array" + }, + "show_text": { + "description": "Ready to show: one line per listed plan, in list order, \"Meets all N: [Provider Plan](visit link)\" for a plan that meets every required condition of the call, \"Closest: [Provider Plan](visit link)\" for any other. The plan is a markdown link to its visit link, which carries the token of this response. Absent when no plan is listed.", + "type": "string" + } + }, + "required": [ + "format", + "answer", + "as_of", + "needs_input", + "results" + ], + "type": "object" + } +]
- Changed
relax_conditions1 field changed- changed
Output schema / properties / changes / items / properties / ask_user / descriptionPrevious value: -"True when negotiable was not given: ask the user before changing this condition."New value: +"True when negotiable was not given, so it is not known whether the user can change this condition."
- Changed
search1 field changed- changed
Output schema / anyOfPrevious value: -[ - { - "properties": { - "answer": { - "description": "One sentence that opens the answer: the lowest-cost plan that meets every required condition with its link, or, when none does, the closest plan with what it does not meet or what is unknown, and its link.", - "type": "string" - }, - "as_of": { - "type": "string" - }, - "assumptions": { - "items": { - "type": "string" - }, - "type": "array" - }, - "counts": { - "properties": { - "candidates": { - "type": "integer" - }, - "full": { - "type": "integer" - }, - "no_match": { - "type": "integer" - }, - "partial": { - "type": "integer" - } - }, - "required": [ - "candidates", - "full", - "partial", - "no_match" - ], - "type": "object" - }, - "full_matches": { - "items": { - "properties": { - "assumptions": { - "items": { - "type": "string" - }, - "type": "array" - }, - "at_limit": { - "description": "Present for a plan with no automatic extra usage: what the official page says happens at the limit (kind no_extra_usage or restart_by_hand), with its sentence. With a workload that needs restarts, restarts gives their count, the price of each and the total, the numbers of monthly_cost.explanation.", - "properties": { - "evidence": { - "properties": { - "quote": { - "type": "string" - }, - "source": { - "type": "string" - } - }, - "type": "object" - }, - "kind": { - "enum": [ - "no_extra_usage", - "restart_by_hand" - ] - }, - "restarts": { - "properties": { - "count": { - "properties": { - "high": { - "type": "integer" - }, - "low": { - "type": "integer" - } - }, - "type": "object" - }, - "total_usd": { - "properties": { - "high": { - "type": "number" - }, - "low": { - "type": "number" - } - }, - "type": "object" - }, - "usd_each": { - "type": "number" - } - }, - "type": "object" - }, - "text": { - "type": "string" - } - }, - "required": [ - "kind", - "text", - "evidence" - ], - "type": "object" - }, - "billing": { - "type": "string" - }, - "billing_options": { - "items": { - "type": "string" - }, - "type": "array" - }, - "checked_at": { - "type": [ - "string", - "null" - ] - }, - "conditions": { - "items": { - "properties": { - "condition": { - "type": "string" - }, - "facts": { - "description": "Facts the verdict was judged from. The monthly budget is judged from monthly_cost; its price facts are listed there only.", - "items": { - "properties": { - "also_stated_in": { - "description": "get_details only: other official machine-readable documents of the provider (llms.txt, llms-full.txt, OpenAPI files, MCP tool listings) that contain the same quoted sentences.", - "items": { - "type": "string" - }, - "type": "array" - }, - "applies_to": { - "description": "get_details only: billing options (billing) or search engines (search_engines) the fact is limited to.", - "type": [ - "object", - "null" - ] - }, - "at_limit": { - "description": "Present for a plan with no automatic extra usage: what the official page says happens at the limit (kind no_extra_usage or restart_by_hand), with its sentence. With a workload that needs restarts, restarts gives their count, the price of each and the total, the numbers of monthly_cost.explanation.", - "properties": { - "evidence": { - "properties": { - "quote": { - "type": "string" - }, - "source": { - "type": "string" - } - }, - "type": "object" - }, - "kind": { - "enum": [ - "no_extra_usage", - "restart_by_hand" - ] - }, - "restarts": { - "properties": { - "count": { - "properties": { - "high": { - "type": "integer" - }, - "low": { - "type": "integer" - } - }, - "type": "object" - }, - "total_usd": { - "properties": { - "high": { - "type": "number" - }, - "low": { - "type": "number" - } - }, - "type": "object" - }, - "usd_each": { - "type": "number" - } - }, - "type": "object" - }, - "text": { - "type": "string" - } - }, - "required": [ - "kind", - "text", - "evidence" - ], - "type": "object" - }, - "checked_at": { - "type": [ - "string", - "null" - ] - }, - "concurrency_unit": { - "description": "get_details, concurrency only: the unit the page states the value in (unit, text such as \"100 threads\"). Against concurrent requests: equals_requests (value, text and the official line of the unit rule) when the unit rule counts this unit as requests, else note \"not the same unit as concurrent requests\"; \"unit not stated\" when the page names none.", - "type": "object" - }, - "derived": { - "description": "How the value follows from the quoted sentence when it is not literal.", - "type": "string" - }, - "evidence": { - "items": { - "properties": { - "quote": { - "description": "The sentence as it appears on that page.", - "type": "string" - }, - "retrieved_at": { - "description": "Date the page was read (YYYY-MM-DD). Only with detail=full.", - "type": "string" - }, - "source": { - "description": "Official page the sentence was found on.", - "type": "string" - }, - "source_type": { - "description": "Only with detail=full.", - "enum": [ - "official_pricing", - "official_docs", - "third_party" - ] - } - }, - "required": [ - "source", - "quote" - ], - "type": "object" - }, - "type": "array" - }, - "exceptions": { - "description": "get_details only: plans with a different value.", - "type": "array" - }, - "key": { - "type": "string" - }, - "label": { - "type": "string" - }, - "level": { - "description": "Where the fact is recorded: offer (the plan), product or provider.", - "type": [ - "string", - "null" - ] - }, - "note": { - "type": "string" - }, - "stale": { - "type": "boolean" - }, - "status": { - "description": "TRUE: stated with the value; FALSE / NOT_SUPPORTED: stated as unavailable; UNKNOWN: not stated; CONFLICT: official pages disagree (value lists each version); STALE: past its recheck date; MISSING: not recorded.", - "enum": [ - "TRUE", - "FALSE", - "NOT_SUPPORTED", - "UNKNOWN", - "CONFLICT", - "STALE", - "MISSING" - ] - }, - "value": {}, - "via_exception": { - "description": "Present and true when a plan-specific exception replaced the general value.", - "type": "boolean" - } - }, - "required": [ - "key", - "status", - "value", - "level", - "evidence", - "checked_at" - ], - "type": "object" - }, - "type": "array" - }, - "label": { - "type": "string" - }, - "reason": { - "type": "string" - }, - "required": { - "type": "boolean" - }, - "verdict": { - "enum": [ - "MET", - "UNMET", - "UNKNOWN", - "UNIT_MISMATCH", - "UNIT_UNKNOWN" - ] - } - }, - "required": [ - "condition", - "label", - "required", - "verdict", - "reason", - "facts" - ], - "type": "object" - }, - "type": "array" - }, - "facts_omitted": { - "description": "search only: present and true when the source sentences under the conditions were left out so that the response fits one response; the verdicts, reasons and costs are unchanged. Ask check_conditions with the offer_id or get_details for the sentences.", - "type": "boolean" - }, - "link": { - "properties": { - "affiliate": { - "properties": { - "disclosure": { - "type": [ - "string", - "null" - ] - }, - "program": { - "type": [ - "string", - "null" - ] - }, - "status": { - "type": "string" - } - }, - "required": [ - "status" - ], - "type": "object" - }, - "landing": { - "type": "string" - }, - "link_level": { - "type": "string" - }, - "provider_url": { - "description": "The provider page itself. Only in a page made for a browser, where url is this service's address that forwards to it; MCP and REST results do not carry it.", - "type": "string" - }, - "url": { - "description": "The only address to visit the plan: this service's /go/<offer_id>?r=<token> address, which forwards to the provider page. The token is made for this response and holds nothing about you.", - "type": "string" - } - }, - "required": [ - "url", - "landing", - "link_level", - "affiliate" - ], - "type": "object" - }, - "listed": { - "type": "boolean" - }, - "match": { - "enum": [ - "FULL_MATCH", - "PARTIAL_MATCH", - "NO_MATCH" - ] - }, - "meets_all": { - "description": "Judged against the required conditions of this call only: true when every one is met, false when one is not met, \"unknown\" when none fails and one is not stated on the official pages.", - "enum": [ - true, - false, - "unknown" - ] - }, - "monthly_cost": { - "properties": { - "explanation": { - "type": "string" - }, - "facts": { - "description": "Price facts the cost was computed from.", - "items": { - "properties": { - "also_stated_in": { - "description": "get_details only: other official machine-readable documents of the provider (llms.txt, llms-full.txt, OpenAPI files, MCP tool listings) that contain the same quoted sentences.", - "items": { - "type": "string" - }, - "type": "array" - }, - "applies_to": { - "description": "get_details only: billing options (billing) or search engines (search_engines) the fact is limited to.", - "type": [ - "object", - "null" - ] - }, - "at_limit": { - "description": "Present for a plan with no automatic extra usage: what the official page says happens at the limit (kind no_extra_usage or restart_by_hand), with its sentence. With a workload that needs restarts, restarts gives their count, the price of each and the total, the numbers of monthly_cost.explanation.", - "properties": { - "evidence": { - "properties": { - "quote": { - "type": "string" - }, - "source": { - "type": "string" - } - }, - "type": "object" - }, - "kind": { - "enum": [ - "no_extra_usage", - "restart_by_hand" - ] - }, - "restarts": { - "properties": { - "count": { - "properties": { - "high": { - "type": "integer" - }, - "low": { - "type": "integer" - } - }, - "type": "object" - }, - "total_usd": { - "properties": { - "high": { - "type": "number" - }, - "low": { - "type": "number" - } - }, - "type": "object" - }, - "usd_each": { - "type": "number" - } - }, - "type": "object" - }, - "text": { - "type": "string" - } - }, - "required": [ - "kind", - "text", - "evidence" - ], - "type": "object" - }, - "checked_at": { - "type": [ - "string", - "null" - ] - }, - "concurrency_unit": { - "description": "get_details, concurrency only: the unit the page states the value in (unit, text such as \"100 threads\"). Against concurrent requests: equals_requests (value, text and the official line of the unit rule) when the unit rule counts this unit as requests, else note \"not the same unit as concurrent requests\"; \"unit not stated\" when the page names none.", - "type": "object" - }, - "derived": { - "description": "How the value follows from the quoted sentence when it is not literal.", - "type": "string" - }, - "evidence": { - "items": { - "properties": { - "quote": { - "description": "The sentence as it appears on that page.", - "type": "string" - }, - "retrieved_at": { - "description": "Date the page was read (YYYY-MM-DD). Only with detail=full.", - "type": "string" - }, - "source": { - "description": "Official page the sentence was found on.", - "type": "string" - }, - "source_type": { - "description": "Only with detail=full.", - "enum": [ - "official_pricing", - "official_docs", - "third_party" - ] - } - }, - "required": [ - "source", - "quote" - ], - "type": "object" - }, - "type": "array" - }, - "exceptions": { - "description": "get_details only: plans with a different value.", - "type": "array" - }, - "key": { - "type": "string" - }, - "label": { - "type": "string" - }, - "level": { - "description": "Where the fact is recorded: offer (the plan), product or provider.", - "type": [ - "string", - "null" - ] - }, - "note": { - "type": "string" - }, - "stale": { - "type": "boolean" - }, - "status": { - "description": "TRUE: stated with the value; FALSE / NOT_SUPPORTED: stated as unavailable; UNKNOWN: not stated; CONFLICT: official pages disagree (value lists each version); STALE: past its recheck date; MISSING: not recorded.", - "enum": [ - "TRUE", - "FALSE", - "NOT_SUPPORTED", - "UNKNOWN", - "CONFLICT", - "STALE", - "MISSING" - ] - }, - "value": {}, - "via_exception": { - "description": "Present and true when a plan-specific exception replaced the general value.", - "type": "boolean" - } - }, - "required": [ - "key", - "status", - "value", - "level", - "evidence", - "checked_at" - ], - "type": "object" - }, - "type": "array" - }, - "high": { - "type": [ - "number", - "null" - ] - }, - "low": { - "type": [ - "number", - "null" - ] - }, - "lower_bound": { - "type": [ - "number", - "null" - ] - }, - "status": { - "enum": [ - "exact", - "range", - "lower_bound", - "unknown" - ] - }, - "upfront_usd": { - "type": [ - "number", - "null" - ] - }, - "usd": { - "type": [ - "number", - "null" - ] - } - }, - "required": [ - "status", - "usd", - "explanation" - ], - "type": "object" - }, - "offer_id": { - "type": "string" - }, - "offer_name": { - "type": "string" - }, - "page_url": { - "type": "string" - }, - "preferred_met": { - "type": "integer" - }, - "prices_exclude_tax": { - "type": [ - "boolean", - "null" - ] - }, - "product_id": { - "type": "string" - }, - "product_name": { - "type": "string" - }, - "provider_id": { - "type": "string" - }, - "provider_name": { - "type": "string" - }, - "unknown_conditions": { - "items": { - "type": "string" - }, - "type": "array" - }, - "unmet_conditions": { - "items": { - "type": "string" - }, - "type": "array" - }, - "verdict": { - "description": "One sentence: the conditions met, or the ones not met or not stated, with the reason.", - "type": "string" - } - }, - "required": [ - "offer_id", - "offer_name", - "product_id", - "provider_name", - "match", - "meets_all", - "verdict", - "billing", - "monthly_cost", - "conditions", - "unmet_conditions", - "unknown_conditions", - "link", - "checked_at" - ], - "type": "object" - }, - "type": "array" - }, - "link_notes": { - "additionalProperties": { - "type": "string" - }, - "description": "The note of each link level (link.link_level) of the plans in this result, stated once.", - "type": "object" - }, - "needs_input": { - "items": { - "properties": { - "field": { - "type": "string" - }, - "reason": { - "type": "string" - } - }, - "required": [ - "field", - "reason" - ], - "type": "object" - }, - "type": "array" - }, - "notes": { - "items": { - "type": "string" - }, - "type": "array" - }, - "partial_matches": { - "items": { - "properties": { - "assumptions": { - "items": { - "type": "string" - }, - "type": "array" - }, - "at_limit": { - "description": "Present for a plan with no automatic extra usage: what the official page says happens at the limit (kind no_extra_usage or restart_by_hand), with its sentence. With a workload that needs restarts, restarts gives their count, the price of each and the total, the numbers of monthly_cost.explanation.", - "properties": { - "evidence": { - "properties": { - "quote": { - "type": "string" - }, - "source": { - "type": "string" - } - }, - "type": "object" - }, - "kind": { - "enum": [ - "no_extra_usage", - "restart_by_hand" - ] - }, - "restarts": { - "properties": { - "count": { - "properties": { - "high": { - "type": "integer" - }, - "low": { - "type": "integer" - } - }, - "type": "object" - }, - "total_usd": { - "properties": { - "high": { - "type": "number" - }, - "low": { - "type": "number" - } - }, - "type": "object" - }, - "usd_each": { - "type": "number" - } - }, - "type": "object" - }, - "text": { - "type": "string" - } - }, - "required": [ - "kind", - "text", - "evidence" - ], - "type": "object" - }, - "billing": { - "type": "string" - }, - "billing_options": { - "items": { - "type": "string" - }, - "type": "array" - }, - "checked_at": { - "type": [ - "string", - "null" - ] - }, - "conditions": { - "items": { - "properties": { - "condition": { - "type": "string" - }, - "facts": { - "description": "Facts the verdict was judged from. The monthly budget is judged from monthly_cost; its price facts are listed there only.", - "items": { - "properties": { - "also_stated_in": { - "description": "get_details only: other official machine-readable documents of the provider (llms.txt, llms-full.txt, OpenAPI files, MCP tool listings) that contain the same quoted sentences.", - "items": { - "type": "string" - }, - "type": "array" - }, - "applies_to": { - "description": "get_details only: billing options (billing) or search engines (search_engines) the fact is limited to.", - "type": [ - "object", - "null" - ] - }, - "at_limit": { - "description": "Present for a plan with no automatic extra usage: what the official page says happens at the limit (kind no_extra_usage or restart_by_hand), with its sentence. With a workload that needs restarts, restarts gives their count, the price of each and the total, the numbers of monthly_cost.explanation.", - "properties": { - "evidence": { - "properties": { - "quote": { - "type": "string" - }, - "source": { - "type": "string" - } - }, - "type": "object" - }, - "kind": { - "enum": [ - "no_extra_usage", - "restart_by_hand" - ] - }, - "restarts": { - "properties": { - "count": { - "properties": { - "high": { - "type": "integer" - }, - "low": { - "type": "integer" - } - }, - "type": "object" - }, - "total_usd": { - "properties": { - "high": { - "type": "number" - }, - "low": { - "type": "number" - } - }, - "type": "object" - }, - "usd_each": { - "type": "number" - } - }, - "type": "object" - }, - "text": { - "type": "string" - } - }, - "required": [ - "kind", - "text", - "evidence" - ], - "type": "object" - }, - "checked_at": { - "type": [ - "string", - "null" - ] - }, - "concurrency_unit": { - "description": "get_details, concurrency only: the unit the page states the value in (unit, text such as \"100 threads\"). Against concurrent requests: equals_requests (value, text and the official line of the unit rule) when the unit rule counts this unit as requests, else note \"not the same unit as concurrent requests\"; \"unit not stated\" when the page names none.", - "type": "object" - }, - "derived": { - "description": "How the value follows from the quoted sentence when it is not literal.", - "type": "string" - }, - "evidence": { - "items": { - "properties": { - "quote": { - "description": "The sentence as it appears on that page.", - "type": "string" - }, - "retrieved_at": { - "description": "Date the page was read (YYYY-MM-DD). Only with detail=full.", - "type": "string" - }, - "source": { - "description": "Official page the sentence was found on.", - "type": "string" - }, - "source_type": { - "description": "Only with detail=full.", - "enum": [ - "official_pricing", - "official_docs", - "third_party" - ] - } - }, - "required": [ - "source", - "quote" - ], - "type": "object" - }, - "type": "array" - }, - "exceptions": { - "description": "get_details only: plans with a different value.", - "type": "array" - }, - "key": { - "type": "string" - }, - "label": { - "type": "string" - }, - "level": { - "description": "Where the fact is recorded: offer (the plan), product or provider.", - "type": [ - "string", - "null" - ] - }, - "note": { - "type": "string" - }, - "stale": { - "type": "boolean" - }, - "status": { - "description": "TRUE: stated with the value; FALSE / NOT_SUPPORTED: stated as unavailable; UNKNOWN: not stated; CONFLICT: official pages disagree (value lists each version); STALE: past its recheck date; MISSING: not recorded.", - "enum": [ - "TRUE", - "FALSE", - "NOT_SUPPORTED", - "UNKNOWN", - "CONFLICT", - "STALE", - "MISSING" - ] - }, - "value": {}, - "via_exception": { - "description": "Present and true when a plan-specific exception replaced the general value.", - "type": "boolean" - } - }, - "required": [ - "key", - "status", - "value", - "level", - "evidence", - "checked_at" - ], - "type": "object" - }, - "type": "array" - }, - "label": { - "type": "string" - }, - "reason": { - "type": "string" - }, - "required": { - "type": "boolean" - }, - "verdict": { - "enum": [ - "MET", - "UNMET", - "UNKNOWN", - "UNIT_MISMATCH", - "UNIT_UNKNOWN" - ] - } - }, - "required": [ - "condition", - "label", - "required", - "verdict", - "reason", - "facts" - ], - "type": "object" - }, - "type": "array" - }, - "facts_omitted": { - "description": "search only: present and true when the source sentences under the conditions were left out so that the response fits one response; the verdicts, reasons and costs are unchanged. Ask check_conditions with the offer_id or get_details for the sentences.", - "type": "boolean" - }, - "link": { - "properties": { - "affiliate": { - "properties": { - "disclosure": { - "type": [ - "string", - "null" - ] - }, - "program": { - "type": [ - "string", - "null" - ] - }, - "status": { - "type": "string" - } - }, - "required": [ - "status" - ], - "type": "object" - }, - "landing": { - "type": "string" - }, - "link_level": { - "type": "string" - }, - "provider_url": { - "description": "The provider page itself. Only in a page made for a browser, where url is this service's address that forwards to it; MCP and REST results do not carry it.", - "type": "string" - }, - "url": { - "description": "The only address to visit the plan: this service's /go/<offer_id>?r=<token> address, which forwards to the provider page. The token is made for this response and holds nothing about you.", - "type": "string" - } - }, - "required": [ - "url", - "landing", - "link_level", - "affiliate" - ], - "type": "object" - }, - "listed": { - "type": "boolean" - }, - "match": { - "enum": [ - "FULL_MATCH", - "PARTIAL_MATCH", - "NO_MATCH" - ] - }, - "meets_all": { - "description": "Judged against the required conditions of this call only: true when every one is met, false when one is not met, \"unknown\" when none fails and one is not stated on the official pages.", - "enum": [ - true, - false, - "unknown" - ] - }, - "monthly_cost": { - "properties": { - "explanation": { - "type": "string" - }, - "facts": { - "description": "Price facts the cost was computed from.", - "items": { - "properties": { - "also_stated_in": { - "description": "get_details only: other official machine-readable documents of the provider (llms.txt, llms-full.txt, OpenAPI files, MCP tool listings) that contain the same quoted sentences.", - "items": { - "type": "string" - }, - "type": "array" - }, - "applies_to": { - "description": "get_details only: billing options (billing) or search engines (search_engines) the fact is limited to.", - "type": [ - "object", - "null" - ] - }, - "at_limit": { - "description": "Present for a plan with no automatic extra usage: what the official page says happens at the limit (kind no_extra_usage or restart_by_hand), with its sentence. With a workload that needs restarts, restarts gives their count, the price of each and the total, the numbers of monthly_cost.explanation.", - "properties": { - "evidence": { - "properties": { - "quote": { - "type": "string" - }, - "source": { - "type": "string" - } - }, - "type": "object" - }, - "kind": { - "enum": [ - "no_extra_usage", - "restart_by_hand" - ] - }, - "restarts": { - "properties": { - "count": { - "properties": { - "high": { - "type": "integer" - }, - "low": { - "type": "integer" - } - }, - "type": "object" - }, - "total_usd": { - "properties": { - "high": { - "type": "number" - }, - "low": { - "type": "number" - } - }, - "type": "object" - }, - "usd_each": { - "type": "number" - } - }, - "type": "object" - }, - "text": { - "type": "string" - } - }, - "required": [ - "kind", - "text", - "evidence" - ], - "type": "object" - }, - "checked_at": { - "type": [ - "string", - "null" - ] - }, - "concurrency_unit": { - "description": "get_details, concurrency only: the unit the page states the value in (unit, text such as \"100 threads\"). Against concurrent requests: equals_requests (value, text and the official line of the unit rule) when the unit rule counts this unit as requests, else note \"not the same unit as concurrent requests\"; \"unit not stated\" when the page names none.", - "type": "object" - }, - "derived": { - "description": "How the value follows from the quoted sentence when it is not literal.", - "type": "string" - }, - "evidence": { - "items": { - "properties": { - "quote": { - "description": "The sentence as it appears on that page.", - "type": "string" - }, - "retrieved_at": { - "description": "Date the page was read (YYYY-MM-DD). Only with detail=full.", - "type": "string" - }, - "source": { - "description": "Official page the sentence was found on.", - "type": "string" - }, - "source_type": { - "description": "Only with detail=full.", - "enum": [ - "official_pricing", - "official_docs", - "third_party" - ] - } - }, - "required": [ - "source", - "quote" - ], - "type": "object" - }, - "type": "array" - }, - "exceptions": { - "description": "get_details only: plans with a different value.", - "type": "array" - }, - "key": { - "type": "string" - }, - "label": { - "type": "string" - }, - "level": { - "description": "Where the fact is recorded: offer (the plan), product or provider.", - "type": [ - "string", - "null" - ] - }, - "note": { - "type": "string" - }, - "stale": { - "type": "boolean" - }, - "status": { - "description": "TRUE: stated with the value; FALSE / NOT_SUPPORTED: stated as unavailable; UNKNOWN: not stated; CONFLICT: official pages disagree (value lists each version); STALE: past its recheck date; MISSING: not recorded.", - "enum": [ - "TRUE", - "FALSE", - "NOT_SUPPORTED", - "UNKNOWN", - "CONFLICT", - "STALE", - "MISSING" - ] - }, - "value": {}, - "via_exception": { - "description": "Present and true when a plan-specific exception replaced the general value.", - "type": "boolean" - } - }, - "required": [ - "key", - "status", - "value", - "level", - "evidence", - "checked_at" - ], - "type": "object" - }, - "type": "array" - }, - "high": { - "type": [ - "number", - "null" - ] - }, - "low": { - "type": [ - "number", - "null" - ] - }, - "lower_bound": { - "type": [ - "number", - "null" - ] - }, - "status": { - "enum": [ - "exact", - "range", - "lower_bound", - "unknown" - ] - }, - "upfront_usd": { - "type": [ - "number", - "null" - ] - }, - "usd": { - "type": [ - "number", - "null" - ] - } - }, - "required": [ - "status", - "usd", - "explanation" - ], - "type": "object" - }, - "offer_id": { - "type": "string" - }, - "offer_name": { - "type": "string" - }, - "page_url": { - "type": "string" - }, - "preferred_met": { - "type": "integer" - }, - "prices_exclude_tax": { - "type": [ - "boolean", - "null" - ] - }, - "product_id": { - "type": "string" - }, - "product_name": { - "type": "string" - }, - "provider_id": { - "type": "string" - }, - "provider_name": { - "type": "string" - }, - "unknown_conditions": { - "items": { - "type": "string" - }, - "type": "array" - }, - "unmet_conditions": { - "items": { - "type": "string" - }, - "type": "array" - }, - "verdict": { - "description": "One sentence: the conditions met, or the ones not met or not stated, with the reason.", - "type": "string" - } - }, - "required": [ - "offer_id", - "offer_name", - "product_id", - "provider_name", - "match", - "meets_all", - "verdict", - "billing", - "monthly_cost", - "conditions", - "unmet_conditions", - "unknown_conditions", - "link", - "checked_at" - ], - "type": "object" - }, - "type": "array" - }, - "request": { - "type": "object" - }, - "show_text": { - "description": "Ready to show: one line per listed plan, in list order, \"Meets all N: Provider Plan โ link\" for a plan that meets every required condition of the call, \"Closest: Provider Plan โ link\" for any other. The link is the visit link of the plan, with the token of this response. Absent when no plan is listed.", - "type": "string" - }, - "unknown_providers": { - "description": "Only when providers was given: the names that are not a provider id or name in this catalog.", - "items": { - "type": "string" - }, - "type": "array" - }, - "zero_result": { - "properties": { - "conditions": { - "items": { - "properties": { - "closest": { - "description": "The cheapest plan that meets every other required condition but not this one. It does not meet the request (meets_all false or \"unknown\").", - "properties": { - "billing": { - "type": "string" - }, - "fails": { - "type": "string" - }, - "meets_all": { - "description": "Judged against the required conditions of this call only: true when every one is met, false when one is not met, \"unknown\" when none fails and one is not stated on the official pages.", - "enum": [ - true, - false, - "unknown" - ] - }, - "monthly_cost": { - "type": "object" - }, - "offer_id": { - "type": "string" - }, - "offer_name": { - "type": "string" - }, - "page_url": { - "type": "string" - }, - "provider_name": { - "type": "string" - } - }, - "required": [ - "offer_id", - "offer_name", - "provider_name", - "billing", - "monthly_cost", - "meets_all", - "fails" - ], - "type": [ - "object", - "null" - ] - }, - "condition": { - "type": "string" - }, - "excluded": { - "type": "integer" - }, - "label": { - "type": "string" - }, - "unknown": { - "type": "integer" - }, - "would_match_if_relaxed": { - "type": "integer" - } - }, - "required": [ - "condition", - "label", - "excluded", - "would_match_if_relaxed", - "closest" - ], - "type": "object" - }, - "type": "array" - }, - "note": { - "type": "string" - } - }, - "type": [ - "object", - "null" - ] - } - }, - "required": [ - "answer", - "as_of", - "needs_input", - "counts", - "full_matches", - "partial_matches", - "zero_result", - "assumptions", - "notes" - ], - "type": "object" - }, - { - "properties": { - "answer": { - "type": "string" - }, - "as_of": { - "type": "string" - }, - "counts": { - "properties": { - "candidates": { - "type": "integer" - }, - "full": { - "type": "integer" - }, - "no_match": { - "type": "integer" - }, - "partial": { - "type": "integer" - } - }, - "required": [ - "candidates", - "full", - "partial", - "no_match" - ], - "type": "object" - }, - "format": { - "enum": [ - "brief" - ] - }, - "full_matches": { - "items": { - "properties": { - "conditions": { - "items": { - "properties": { - "condition": { - "type": "string" - }, - "quote": { - "description": "One official source sentence, 200 characters at most.", - "type": "string" - }, - "reason": { - "description": "One line, 120 characters at most.", - "type": "string" - }, - "required": { - "description": "Present only on a preferred (nice-to-have) condition.", - "enum": [ - false - ] - }, - "source": { - "description": "Official page the sentence was found on.", - "type": [ - "string", - "null" - ] - }, - "verdict": { - "enum": [ - "MET", - "UNMET", - "UNKNOWN", - "UNIT_MISMATCH", - "UNIT_UNKNOWN" - ] - } - }, - "required": [ - "condition", - "verdict", - "reason" - ], - "type": "object" - }, - "type": "array" - }, - "match": { - "enum": [ - "FULL_MATCH", - "PARTIAL_MATCH", - "NO_MATCH" - ] - }, - "meets_all": { - "description": "Judged against the required conditions of this call only: true when every one is met, false when one is not met, \"unknown\" when none fails and one is not stated on the official pages.", - "enum": [ - true, - false, - "unknown" - ] - }, - "monthly_cost": { - "description": "status, usd, and low, high or lower_bound when they differ; as in the full result.", - "type": "object" - }, - "offer_id": { - "type": "string" - }, - "offer_name": { - "type": "string" - }, - "provider": { - "type": "string" - } - }, - "required": [ - "offer_id", - "offer_name", - "provider", - "meets_all", - "monthly_cost", - "conditions" - ], - "type": "object" - }, - "type": "array" - }, - "more_note": { - "type": "string" - }, - "more_plans": { - "description": "Matching plans left out of the short list: limit is the number of plans in all, fully matching first.", - "type": "integer" - }, - "needs_input": { - "items": { - "properties": { - "field": { - "type": "string" - }, - "reason": { - "type": "string" - } - }, - "required": [ - "field", - "reason" - ], - "type": "object" - }, - "type": "array" - }, - "partial_matches": { - "items": { - "properties": { - "conditions": { - "items": { - "properties": { - "condition": { - "type": "string" - }, - "quote": { - "description": "One official source sentence, 200 characters at most.", - "type": "string" - }, - "reason": { - "description": "One line, 120 characters at most.", - "type": "string" - }, - "required": { - "description": "Present only on a preferred (nice-to-have) condition.", - "enum": [ - false - ] - }, - "source": { - "description": "Official page the sentence was found on.", - "type": [ - "string", - "null" - ] - }, - "verdict": { - "enum": [ - "MET", - "UNMET", - "UNKNOWN", - "UNIT_MISMATCH", - "UNIT_UNKNOWN" - ] - } - }, - "required": [ - "condition", - "verdict", - "reason" - ], - "type": "object" - }, - "type": "array" - }, - "match": { - "enum": [ - "FULL_MATCH", - "PARTIAL_MATCH", - "NO_MATCH" - ] - }, - "meets_all": { - "description": "Judged against the required conditions of this call only: true when every one is met, false when one is not met, \"unknown\" when none fails and one is not stated on the official pages.", - "enum": [ - true, - false, - "unknown" - ] - }, - "monthly_cost": { - "description": "status, usd, and low, high or lower_bound when they differ; as in the full result.", - "type": "object" - }, - "offer_id": { - "type": "string" - }, - "offer_name": { - "type": "string" - }, - "provider": { - "type": "string" - } - }, - "required": [ - "offer_id", - "offer_name", - "provider", - "meets_all", - "monthly_cost", - "conditions" - ], - "type": "object" - }, - "type": "array" - }, - "show_text": { - "description": "Ready to show: one line per listed plan, in list order, \"Meets all N: Provider Plan โ link\" for a plan that meets every required condition of the call, \"Closest: Provider Plan โ link\" for any other. The link is the visit link of the plan, with the token of this response. Absent when no plan is listed.", - "type": "string" - }, - "unknown_providers": { - "items": { - "type": "string" - }, - "type": "array" - }, - "zero_result": { - "properties": { - "conditions": { - "items": { - "properties": { - "closest": { - "description": "The cheapest plan that meets every other required condition but not this one. It does not meet the request (meets_all false or \"unknown\").", - "properties": { - "billing": { - "type": "string" - }, - "fails": { - "type": "string" - }, - "meets_all": { - "description": "Judged against the required conditions of this call only: true when every one is met, false when one is not met, \"unknown\" when none fails and one is not stated on the official pages.", - "enum": [ - true, - false, - "unknown" - ] - }, - "monthly_cost": { - "type": "object" - }, - "offer_id": { - "type": "string" - }, - "offer_name": { - "type": "string" - }, - "page_url": { - "type": "string" - }, - "provider_name": { - "type": "string" - } - }, - "required": [ - "offer_id", - "offer_name", - "provider_name", - "billing", - "monthly_cost", - "meets_all", - "fails" - ], - "type": [ - "object", - "null" - ] - }, - "condition": { - "type": "string" - }, - "excluded": { - "type": "integer" - }, - "label": { - "type": "string" - }, - "unknown": { - "type": "integer" - }, - "would_match_if_relaxed": { - "type": "integer" - } - }, - "required": [ - "condition", - "label", - "excluded", - "would_match_if_relaxed", - "closest" - ], - "type": "object" - }, - "type": "array" - }, - "note": { - "type": "string" - } - }, - "type": [ - "object", - "null" - ] - } - }, - "required": [ - "format", - "answer", - "as_of", - "needs_input", - "counts", - "full_matches", - "partial_matches" - ], - "type": "object" - } -]New value: +[ + { + "properties": { + "answer": { + "description": "One sentence that opens the answer: the lowest-cost plan that meets every required condition with its link, or, when none does, the closest plan with what it does not meet or what is unknown, and its link. The plan is written as a markdown link, [Provider Plan](visit link), at the end of the sentence.", + "type": "string" + }, + "as_of": { + "type": "string" + }, + "assumptions": { + "items": { + "type": "string" + }, + "type": "array" + }, + "counts": { + "properties": { + "candidates": { + "type": "integer" + }, + "full": { + "type": "integer" + }, + "no_match": { + "type": "integer" + }, + "partial": { + "type": "integer" + } + }, + "required": [ + "candidates", + "full", + "partial", + "no_match" + ], + "type": "object" + }, + "full_matches": { + "items": { + "properties": { + "assumptions": { + "items": { + "type": "string" + }, + "type": "array" + }, + "at_limit": { + "description": "Present for a plan with no automatic extra usage: what the official page says happens at the limit (kind no_extra_usage or restart_by_hand), with its sentence. With a workload that needs restarts, restarts gives their count, the price of each and the total, the numbers of monthly_cost.explanation.", + "properties": { + "evidence": { + "properties": { + "quote": { + "type": "string" + }, + "source": { + "type": "string" + } + }, + "type": "object" + }, + "kind": { + "enum": [ + "no_extra_usage", + "restart_by_hand" + ] + }, + "restarts": { + "properties": { + "count": { + "properties": { + "high": { + "type": "integer" + }, + "low": { + "type": "integer" + } + }, + "type": "object" + }, + "total_usd": { + "properties": { + "high": { + "type": "number" + }, + "low": { + "type": "number" + } + }, + "type": "object" + }, + "usd_each": { + "type": "number" + } + }, + "type": "object" + }, + "text": { + "type": "string" + } + }, + "required": [ + "kind", + "text", + "evidence" + ], + "type": "object" + }, + "billing": { + "type": "string" + }, + "billing_options": { + "items": { + "type": "string" + }, + "type": "array" + }, + "checked_at": { + "type": [ + "string", + "null" + ] + }, + "conditions": { + "items": { + "properties": { + "condition": { + "type": "string" + }, + "facts": { + "description": "Facts the verdict was judged from. The monthly budget is judged from monthly_cost; its price facts are listed there only.", + "items": { + "properties": { + "also_stated_in": { + "description": "get_details only: other official machine-readable documents of the provider (llms.txt, llms-full.txt, OpenAPI files, MCP tool listings) that contain the same quoted sentences.", + "items": { + "type": "string" + }, + "type": "array" + }, + "applies_to": { + "description": "get_details only: billing options (billing) or search engines (search_engines) the fact is limited to.", + "type": [ + "object", + "null" + ] + }, + "at_limit": { + "description": "Present for a plan with no automatic extra usage: what the official page says happens at the limit (kind no_extra_usage or restart_by_hand), with its sentence. With a workload that needs restarts, restarts gives their count, the price of each and the total, the numbers of monthly_cost.explanation.", + "properties": { + "evidence": { + "properties": { + "quote": { + "type": "string" + }, + "source": { + "type": "string" + } + }, + "type": "object" + }, + "kind": { + "enum": [ + "no_extra_usage", + "restart_by_hand" + ] + }, + "restarts": { + "properties": { + "count": { + "properties": { + "high": { + "type": "integer" + }, + "low": { + "type": "integer" + } + }, + "type": "object" + }, + "total_usd": { + "properties": { + "high": { + "type": "number" + }, + "low": { + "type": "number" + } + }, + "type": "object" + }, + "usd_each": { + "type": "number" + } + }, + "type": "object" + }, + "text": { + "type": "string" + } + }, + "required": [ + "kind", + "text", + "evidence" + ], + "type": "object" + }, + "checked_at": { + "type": [ + "string", + "null" + ] + }, + "concurrency_unit": { + "description": "get_details, concurrency only: the unit the page states the value in (unit, text such as \"100 threads\"). Against concurrent requests: equals_requests (value, text and the official line of the unit rule) when the unit rule counts this unit as requests, else note \"not the same unit as concurrent requests\"; \"unit not stated\" when the page names none.", + "type": "object" + }, + "derived": { + "description": "How the value follows from the quoted sentence when it is not literal.", + "type": "string" + }, + "evidence": { + "items": { + "properties": { + "quote": { + "description": "The sentence as it appears on that page.", + "type": "string" + }, + "retrieved_at": { + "description": "Date the page was read (YYYY-MM-DD). Only with detail=full.", + "type": "string" + }, + "source": { + "description": "Official page the sentence was found on.", + "type": "string" + }, + "source_type": { + "description": "Only with detail=full.", + "enum": [ + "official_pricing", + "official_docs", + "third_party" + ] + } + }, + "required": [ + "source", + "quote" + ], + "type": "object" + }, + "type": "array" + }, + "exceptions": { + "description": "get_details only: plans with a different value.", + "type": "array" + }, + "key": { + "type": "string" + }, + "label": { + "type": "string" + }, + "level": { + "description": "Where the fact is recorded: offer (the plan), product or provider.", + "type": [ + "string", + "null" + ] + }, + "note": { + "type": "string" + }, + "stale": { + "type": "boolean" + }, + "status": { + "description": "TRUE: stated with the value; FALSE / NOT_SUPPORTED: stated as unavailable; UNKNOWN: not stated; CONFLICT: official pages disagree (value lists each version); STALE: past its recheck date; MISSING: not recorded.", + "enum": [ + "TRUE", + "FALSE", + "NOT_SUPPORTED", + "UNKNOWN", + "CONFLICT", + "STALE", + "MISSING" + ] + }, + "value": {}, + "via_exception": { + "description": "Present and true when a plan-specific exception replaced the general value.", + "type": "boolean" + } + }, + "required": [ + "key", + "status", + "value", + "level", + "evidence", + "checked_at" + ], + "type": "object" + }, + "type": "array" + }, + "label": { + "type": "string" + }, + "reason": { + "type": "string" + }, + "required": { + "type": "boolean" + }, + "verdict": { + "enum": [ + "MET", + "UNMET", + "UNKNOWN", + "UNIT_MISMATCH", + "UNIT_UNKNOWN" + ] + } + }, + "required": [ + "condition", + "label", + "required", + "verdict", + "reason", + "facts" + ], + "type": "object" + }, + "type": "array" + }, + "facts_omitted": { + "description": "search only: present and true when the source sentences under the conditions were left out so that the response fits one response; the verdicts, reasons and costs are unchanged. Ask check_conditions with the offer_id or get_details for the sentences.", + "type": "boolean" + }, + "link": { + "properties": { + "affiliate": { + "properties": { + "disclosure": { + "type": [ + "string", + "null" + ] + }, + "program": { + "type": [ + "string", + "null" + ] + }, + "status": { + "type": "string" + } + }, + "required": [ + "status" + ], + "type": "object" + }, + "landing": { + "type": "string" + }, + "link_level": { + "type": "string" + }, + "provider_url": { + "description": "The provider page itself. Only in a page made for a browser, where url is this service's address that forwards to it; MCP and REST results do not carry it.", + "type": "string" + }, + "url": { + "description": "The only address to visit the plan: this service's /go/<offer_id>?r=<token> address, which forwards to the provider page. The token is made for this response and holds nothing about you.", + "type": "string" + } + }, + "required": [ + "url", + "landing", + "link_level", + "affiliate" + ], + "type": "object" + }, + "listed": { + "type": "boolean" + }, + "match": { + "enum": [ + "FULL_MATCH", + "PARTIAL_MATCH", + "NO_MATCH" + ] + }, + "meets_all": { + "description": "Judged against the required conditions of this call only: true when every one is met, false when one is not met, \"unknown\" when none fails and one is not stated on the official pages.", + "enum": [ + true, + false, + "unknown" + ] + }, + "monthly_cost": { + "properties": { + "explanation": { + "type": "string" + }, + "facts": { + "description": "Price facts the cost was computed from.", + "items": { + "properties": { + "also_stated_in": { + "description": "get_details only: other official machine-readable documents of the provider (llms.txt, llms-full.txt, OpenAPI files, MCP tool listings) that contain the same quoted sentences.", + "items": { + "type": "string" + }, + "type": "array" + }, + "applies_to": { + "description": "get_details only: billing options (billing) or search engines (search_engines) the fact is limited to.", + "type": [ + "object", + "null" + ] + }, + "at_limit": { + "description": "Present for a plan with no automatic extra usage: what the official page says happens at the limit (kind no_extra_usage or restart_by_hand), with its sentence. With a workload that needs restarts, restarts gives their count, the price of each and the total, the numbers of monthly_cost.explanation.", + "properties": { + "evidence": { + "properties": { + "quote": { + "type": "string" + }, + "source": { + "type": "string" + } + }, + "type": "object" + }, + "kind": { + "enum": [ + "no_extra_usage", + "restart_by_hand" + ] + }, + "restarts": { + "properties": { + "count": { + "properties": { + "high": { + "type": "integer" + }, + "low": { + "type": "integer" + } + }, + "type": "object" + }, + "total_usd": { + "properties": { + "high": { + "type": "number" + }, + "low": { + "type": "number" + } + }, + "type": "object" + }, + "usd_each": { + "type": "number" + } + }, + "type": "object" + }, + "text": { + "type": "string" + } + }, + "required": [ + "kind", + "text", + "evidence" + ], + "type": "object" + }, + "checked_at": { + "type": [ + "string", + "null" + ] + }, + "concurrency_unit": { + "description": "get_details, concurrency only: the unit the page states the value in (unit, text such as \"100 threads\"). Against concurrent requests: equals_requests (value, text and the official line of the unit rule) when the unit rule counts this unit as requests, else note \"not the same unit as concurrent requests\"; \"unit not stated\" when the page names none.", + "type": "object" + }, + "derived": { + "description": "How the value follows from the quoted sentence when it is not literal.", + "type": "string" + }, + "evidence": { + "items": { + "properties": { + "quote": { + "description": "The sentence as it appears on that page.", + "type": "string" + }, + "retrieved_at": { + "description": "Date the page was read (YYYY-MM-DD). Only with detail=full.", + "type": "string" + }, + "source": { + "description": "Official page the sentence was found on.", + "type": "string" + }, + "source_type": { + "description": "Only with detail=full.", + "enum": [ + "official_pricing", + "official_docs", + "third_party" + ] + } + }, + "required": [ + "source", + "quote" + ], + "type": "object" + }, + "type": "array" + }, + "exceptions": { + "description": "get_details only: plans with a different value.", + "type": "array" + }, + "key": { + "type": "string" + }, + "label": { + "type": "string" + }, + "level": { + "description": "Where the fact is recorded: offer (the plan), product or provider.", + "type": [ + "string", + "null" + ] + }, + "note": { + "type": "string" + }, + "stale": { + "type": "boolean" + }, + "status": { + "description": "TRUE: stated with the value; FALSE / NOT_SUPPORTED: stated as unavailable; UNKNOWN: not stated; CONFLICT: official pages disagree (value lists each version); STALE: past its recheck date; MISSING: not recorded.", + "enum": [ + "TRUE", + "FALSE", + "NOT_SUPPORTED", + "UNKNOWN", + "CONFLICT", + "STALE", + "MISSING" + ] + }, + "value": {}, + "via_exception": { + "description": "Present and true when a plan-specific exception replaced the general value.", + "type": "boolean" + } + }, + "required": [ + "key", + "status", + "value", + "level", + "evidence", + "checked_at" + ], + "type": "object" + }, + "type": "array" + }, + "high": { + "type": [ + "number", + "null" + ] + }, + "low": { + "type": [ + "number", + "null" + ] + }, + "lower_bound": { + "type": [ + "number", + "null" + ] + }, + "status": { + "enum": [ + "exact", + "range", + "lower_bound", + "unknown" + ] + }, + "upfront_usd": { + "type": [ + "number", + "null" + ] + }, + "usd": { + "type": [ + "number", + "null" + ] + } + }, + "required": [ + "status", + "usd", + "explanation" + ], + "type": "object" + }, + "offer_id": { + "type": "string" + }, + "offer_name": { + "type": "string" + }, + "page_url": { + "type": "string" + }, + "preferred_met": { + "type": "integer" + }, + "prices_exclude_tax": { + "type": [ + "boolean", + "null" + ] + }, + "product_id": { + "type": "string" + }, + "product_name": { + "type": "string" + }, + "provider_id": { + "type": "string" + }, + "provider_name": { + "type": "string" + }, + "unknown_conditions": { + "items": { + "type": "string" + }, + "type": "array" + }, + "unmet_conditions": { + "items": { + "type": "string" + }, + "type": "array" + }, + "verdict": { + "description": "One sentence: the conditions met, or the ones not met or not stated, with the reason.", + "type": "string" + } + }, + "required": [ + "offer_id", + "offer_name", + "product_id", + "provider_name", + "match", + "meets_all", + "verdict", + "billing", + "monthly_cost", + "conditions", + "unmet_conditions", + "unknown_conditions", + "link", + "checked_at" + ], + "type": "object" + }, + "type": "array" + }, + "link_notes": { + "additionalProperties": { + "type": "string" + }, + "description": "The note of each link level (link.link_level) of the plans in this result, stated once.", + "type": "object" + }, + "needs_input": { + "items": { + "properties": { + "field": { + "type": "string" + }, + "reason": { + "type": "string" + } + }, + "required": [ + "field", + "reason" + ], + "type": "object" + }, + "type": "array" + }, + "notes": { + "items": { + "type": "string" + }, + "type": "array" + }, + "partial_matches": { + "items": { + "properties": { + "assumptions": { + "items": { + "type": "string" + }, + "type": "array" + }, + "at_limit": { + "description": "Present for a plan with no automatic extra usage: what the official page says happens at the limit (kind no_extra_usage or restart_by_hand), with its sentence. With a workload that needs restarts, restarts gives their count, the price of each and the total, the numbers of monthly_cost.explanation.", + "properties": { + "evidence": { + "properties": { + "quote": { + "type": "string" + }, + "source": { + "type": "string" + } + }, + "type": "object" + }, + "kind": { + "enum": [ + "no_extra_usage", + "restart_by_hand" + ] + }, + "restarts": { + "properties": { + "count": { + "properties": { + "high": { + "type": "integer" + }, + "low": { + "type": "integer" + } + }, + "type": "object" + }, + "total_usd": { + "properties": { + "high": { + "type": "number" + }, + "low": { + "type": "number" + } + }, + "type": "object" + }, + "usd_each": { + "type": "number" + } + }, + "type": "object" + }, + "text": { + "type": "string" + } + }, + "required": [ + "kind", + "text", + "evidence" + ], + "type": "object" + }, + "billing": { + "type": "string" + }, + "billing_options": { + "items": { + "type": "string" + }, + "type": "array" + }, + "checked_at": { + "type": [ + "string", + "null" + ] + }, + "conditions": { + "items": { + "properties": { + "condition": { + "type": "string" + }, + "facts": { + "description": "Facts the verdict was judged from. The monthly budget is judged from monthly_cost; its price facts are listed there only.", + "items": { + "properties": { + "also_stated_in": { + "description": "get_details only: other official machine-readable documents of the provider (llms.txt, llms-full.txt, OpenAPI files, MCP tool listings) that contain the same quoted sentences.", + "items": { + "type": "string" + }, + "type": "array" + }, + "applies_to": { + "description": "get_details only: billing options (billing) or search engines (search_engines) the fact is limited to.", + "type": [ + "object", + "null" + ] + }, + "at_limit": { + "description": "Present for a plan with no automatic extra usage: what the official page says happens at the limit (kind no_extra_usage or restart_by_hand), with its sentence. With a workload that needs restarts, restarts gives their count, the price of each and the total, the numbers of monthly_cost.explanation.", + "properties": { + "evidence": { + "properties": { + "quote": { + "type": "string" + }, + "source": { + "type": "string" + } + }, + "type": "object" + }, + "kind": { + "enum": [ + "no_extra_usage", + "restart_by_hand" + ] + }, + "restarts": { + "properties": { + "count": { + "properties": { + "high": { + "type": "integer" + }, + "low": { + "type": "integer" + } + }, + "type": "object" + }, + "total_usd": { + "properties": { + "high": { + "type": "number" + }, + "low": { + "type": "number" + } + }, + "type": "object" + }, + "usd_each": { + "type": "number" + } + }, + "type": "object" + }, + "text": { + "type": "string" + } + }, + "required": [ + "kind", + "text", + "evidence" + ], + "type": "object" + }, + "checked_at": { + "type": [ + "string", + "null" + ] + }, + "concurrency_unit": { + "description": "get_details, concurrency only: the unit the page states the value in (unit, text such as \"100 threads\"). Against concurrent requests: equals_requests (value, text and the official line of the unit rule) when the unit rule counts this unit as requests, else note \"not the same unit as concurrent requests\"; \"unit not stated\" when the page names none.", + "type": "object" + }, + "derived": { + "description": "How the value follows from the quoted sentence when it is not literal.", + "type": "string" + }, + "evidence": { + "items": { + "properties": { + "quote": { + "description": "The sentence as it appears on that page.", + "type": "string" + }, + "retrieved_at": { + "description": "Date the page was read (YYYY-MM-DD). Only with detail=full.", + "type": "string" + }, + "source": { + "description": "Official page the sentence was found on.", + "type": "string" + }, + "source_type": { + "description": "Only with detail=full.", + "enum": [ + "official_pricing", + "official_docs", + "third_party" + ] + } + }, + "required": [ + "source", + "quote" + ], + "type": "object" + }, + "type": "array" + }, + "exceptions": { + "description": "get_details only: plans with a different value.", + "type": "array" + }, + "key": { + "type": "string" + }, + "label": { + "type": "string" + }, + "level": { + "description": "Where the fact is recorded: offer (the plan), product or provider.", + "type": [ + "string", + "null" + ] + }, + "note": { + "type": "string" + }, + "stale": { + "type": "boolean" + }, + "status": { + "description": "TRUE: stated with the value; FALSE / NOT_SUPPORTED: stated as unavailable; UNKNOWN: not stated; CONFLICT: official pages disagree (value lists each version); STALE: past its recheck date; MISSING: not recorded.", + "enum": [ + "TRUE", + "FALSE", + "NOT_SUPPORTED", + "UNKNOWN", + "CONFLICT", + "STALE", + "MISSING" + ] + }, + "value": {}, + "via_exception": { + "description": "Present and true when a plan-specific exception replaced the general value.", + "type": "boolean" + } + }, + "required": [ + "key", + "status", + "value", + "level", + "evidence", + "checked_at" + ], + "type": "object" + }, + "type": "array" + }, + "label": { + "type": "string" + }, + "reason": { + "type": "string" + }, + "required": { + "type": "boolean" + }, + "verdict": { + "enum": [ + "MET", + "UNMET", + "UNKNOWN", + "UNIT_MISMATCH", + "UNIT_UNKNOWN" + ] + } + }, + "required": [ + "condition", + "label", + "required", + "verdict", + "reason", + "facts" + ], + "type": "object" + }, + "type": "array" + }, + "facts_omitted": { + "description": "search only: present and true when the source sentences under the conditions were left out so that the response fits one response; the verdicts, reasons and costs are unchanged. Ask check_conditions with the offer_id or get_details for the sentences.", + "type": "boolean" + }, + "link": { + "properties": { + "affiliate": { + "properties": { + "disclosure": { + "type": [ + "string", + "null" + ] + }, + "program": { + "type": [ + "string", + "null" + ] + }, + "status": { + "type": "string" + } + }, + "required": [ + "status" + ], + "type": "object" + }, + "landing": { + "type": "string" + }, + "link_level": { + "type": "string" + }, + "provider_url": { + "description": "The provider page itself. Only in a page made for a browser, where url is this service's address that forwards to it; MCP and REST results do not carry it.", + "type": "string" + }, + "url": { + "description": "The only address to visit the plan: this service's /go/<offer_id>?r=<token> address, which forwards to the provider page. The token is made for this response and holds nothing about you.", + "type": "string" + } + }, + "required": [ + "url", + "landing", + "link_level", + "affiliate" + ], + "type": "object" + }, + "listed": { + "type": "boolean" + }, + "match": { + "enum": [ + "FULL_MATCH", + "PARTIAL_MATCH", + "NO_MATCH" + ] + }, + "meets_all": { + "description": "Judged against the required conditions of this call only: true when every one is met, false when one is not met, \"unknown\" when none fails and one is not stated on the official pages.", + "enum": [ + true, + false, + "unknown" + ] + }, + "monthly_cost": { + "properties": { + "explanation": { + "type": "string" + }, + "facts": { + "description": "Price facts the cost was computed from.", + "items": { + "properties": { + "also_stated_in": { + "description": "get_details only: other official machine-readable documents of the provider (llms.txt, llms-full.txt, OpenAPI files, MCP tool listings) that contain the same quoted sentences.", + "items": { + "type": "string" + }, + "type": "array" + }, + "applies_to": { + "description": "get_details only: billing options (billing) or search engines (search_engines) the fact is limited to.", + "type": [ + "object", + "null" + ] + }, + "at_limit": { + "description": "Present for a plan with no automatic extra usage: what the official page says happens at the limit (kind no_extra_usage or restart_by_hand), with its sentence. With a workload that needs restarts, restarts gives their count, the price of each and the total, the numbers of monthly_cost.explanation.", + "properties": { + "evidence": { + "properties": { + "quote": { + "type": "string" + }, + "source": { + "type": "string" + } + }, + "type": "object" + }, + "kind": { + "enum": [ + "no_extra_usage", + "restart_by_hand" + ] + }, + "restarts": { + "properties": { + "count": { + "properties": { + "high": { + "type": "integer" + }, + "low": { + "type": "integer" + } + }, + "type": "object" + }, + "total_usd": { + "properties": { + "high": { + "type": "number" + }, + "low": { + "type": "number" + } + }, + "type": "object" + }, + "usd_each": { + "type": "number" + } + }, + "type": "object" + }, + "text": { + "type": "string" + } + }, + "required": [ + "kind", + "text", + "evidence" + ], + "type": "object" + }, + "checked_at": { + "type": [ + "string", + "null" + ] + }, + "concurrency_unit": { + "description": "get_details, concurrency only: the unit the page states the value in (unit, text such as \"100 threads\"). Against concurrent requests: equals_requests (value, text and the official line of the unit rule) when the unit rule counts this unit as requests, else note \"not the same unit as concurrent requests\"; \"unit not stated\" when the page names none.", + "type": "object" + }, + "derived": { + "description": "How the value follows from the quoted sentence when it is not literal.", + "type": "string" + }, + "evidence": { + "items": { + "properties": { + "quote": { + "description": "The sentence as it appears on that page.", + "type": "string" + }, + "retrieved_at": { + "description": "Date the page was read (YYYY-MM-DD). Only with detail=full.", + "type": "string" + }, + "source": { + "description": "Official page the sentence was found on.", + "type": "string" + }, + "source_type": { + "description": "Only with detail=full.", + "enum": [ + "official_pricing", + "official_docs", + "third_party" + ] + } + }, + "required": [ + "source", + "quote" + ], + "type": "object" + }, + "type": "array" + }, + "exceptions": { + "description": "get_details only: plans with a different value.", + "type": "array" + }, + "key": { + "type": "string" + }, + "label": { + "type": "string" + }, + "level": { + "description": "Where the fact is recorded: offer (the plan), product or provider.", + "type": [ + "string", + "null" + ] + }, + "note": { + "type": "string" + }, + "stale": { + "type": "boolean" + }, + "status": { + "description": "TRUE: stated with the value; FALSE / NOT_SUPPORTED: stated as unavailable; UNKNOWN: not stated; CONFLICT: official pages disagree (value lists each version); STALE: past its recheck date; MISSING: not recorded.", + "enum": [ + "TRUE", + "FALSE", + "NOT_SUPPORTED", + "UNKNOWN", + "CONFLICT", + "STALE", + "MISSING" + ] + }, + "value": {}, + "via_exception": { + "description": "Present and true when a plan-specific exception replaced the general value.", + "type": "boolean" + } + }, + "required": [ + "key", + "status", + "value", + "level", + "evidence", + "checked_at" + ], + "type": "object" + }, + "type": "array" + }, + "high": { + "type": [ + "number", + "null" + ] + }, + "low": { + "type": [ + "number", + "null" + ] + }, + "lower_bound": { + "type": [ + "number", + "null" + ] + }, + "status": { + "enum": [ + "exact", + "range", + "lower_bound", + "unknown" + ] + }, + "upfront_usd": { + "type": [ + "number", + "null" + ] + }, + "usd": { + "type": [ + "number", + "null" + ] + } + }, + "required": [ + "status", + "usd", + "explanation" + ], + "type": "object" + }, + "offer_id": { + "type": "string" + }, + "offer_name": { + "type": "string" + }, + "page_url": { + "type": "string" + }, + "preferred_met": { + "type": "integer" + }, + "prices_exclude_tax": { + "type": [ + "boolean", + "null" + ] + }, + "product_id": { + "type": "string" + }, + "product_name": { + "type": "string" + }, + "provider_id": { + "type": "string" + }, + "provider_name": { + "type": "string" + }, + "unknown_conditions": { + "items": { + "type": "string" + }, + "type": "array" + }, + "unmet_conditions": { + "items": { + "type": "string" + }, + "type": "array" + }, + "verdict": { + "description": "One sentence: the conditions met, or the ones not met or not stated, with the reason.", + "type": "string" + } + }, + "required": [ + "offer_id", + "offer_name", + "product_id", + "provider_name", + "match", + "meets_all", + "verdict", + "billing", + "monthly_cost", + "conditions", + "unmet_conditions", + "unknown_conditions", + "link", + "checked_at" + ], + "type": "object" + }, + "type": "array" + }, + "request": { + "type": "object" + }, + "show_text": { + "description": "Ready to show: one line per listed plan, in list order, \"Meets all N: [Provider Plan](visit link)\" for a plan that meets every required condition of the call, \"Closest: [Provider Plan](visit link)\" for any other. The plan is a markdown link to its visit link, which carries the token of this response. Absent when no plan is listed.", + "type": "string" + }, + "unknown_providers": { + "description": "Only when providers was given: the names that are not a provider id or name in this catalog.", + "items": { + "type": "string" + }, + "type": "array" + }, + "zero_result": { + "properties": { + "conditions": { + "items": { + "properties": { + "closest": { + "description": "The cheapest plan that meets every other required condition but not this one. It does not meet the request (meets_all false or \"unknown\").", + "properties": { + "billing": { + "type": "string" + }, + "fails": { + "type": "string" + }, + "meets_all": { + "description": "Judged against the required conditions of this call only: true when every one is met, false when one is not met, \"unknown\" when none fails and one is not stated on the official pages.", + "enum": [ + true, + false, + "unknown" + ] + }, + "monthly_cost": { + "type": "object" + }, + "offer_id": { + "type": "string" + }, + "offer_name": { + "type": "string" + }, + "page_url": { + "type": "string" + }, + "provider_name": { + "type": "string" + } + }, + "required": [ + "offer_id", + "offer_name", + "provider_name", + "billing", + "monthly_cost", + "meets_all", + "fails" + ], + "type": [ + "object", + "null" + ] + }, + "condition": { + "type": "string" + }, + "excluded": { + "type": "integer" + }, + "label": { + "type": "string" + }, + "unknown": { + "type": "integer" + }, + "would_match_if_relaxed": { + "type": "integer" + } + }, + "required": [ + "condition", + "label", + "excluded", + "would_match_if_relaxed", + "closest" + ], + "type": "object" + }, + "type": "array" + }, + "note": { + "type": "string" + } + }, + "type": [ + "object", + "null" + ] + } + }, + "required": [ + "answer", + "as_of", + "needs_input", + "counts", + "full_matches", + "partial_matches", + "zero_result", + "assumptions", + "notes" + ], + "type": "object" + }, + { + "properties": { + "answer": { + "type": "string" + }, + "as_of": { + "type": "string" + }, + "counts": { + "properties": { + "candidates": { + "type": "integer" + }, + "full": { + "type": "integer" + }, + "no_match": { + "type": "integer" + }, + "partial": { + "type": "integer" + } + }, + "required": [ + "candidates", + "full", + "partial", + "no_match" + ], + "type": "object" + }, + "format": { + "enum": [ + "brief" + ] + }, + "full_matches": { + "items": { + "properties": { + "conditions": { + "items": { + "properties": { + "condition": { + "type": "string" + }, + "quote": { + "description": "One official source sentence, 200 characters at most.", + "type": "string" + }, + "reason": { + "description": "One line, 120 characters at most.", + "type": "string" + }, + "required": { + "description": "Present only on a preferred (nice-to-have) condition.", + "enum": [ + false + ] + }, + "source": { + "description": "Official page the sentence was found on.", + "type": [ + "string", + "null" + ] + }, + "verdict": { + "enum": [ + "MET", + "UNMET", + "UNKNOWN", + "UNIT_MISMATCH", + "UNIT_UNKNOWN" + ] + } + }, + "required": [ + "condition", + "verdict", + "reason" + ], + "type": "object" + }, + "type": "array" + }, + "match": { + "enum": [ + "FULL_MATCH", + "PARTIAL_MATCH", + "NO_MATCH" + ] + }, + "meets_all": { + "description": "Judged against the required conditions of this call only: true when every one is met, false when one is not met, \"unknown\" when none fails and one is not stated on the official pages.", + "enum": [ + true, + false, + "unknown" + ] + }, + "monthly_cost": { + "description": "status, usd, and low, high or lower_bound when they differ; as in the full result.", + "type": "object" + }, + "offer_id": { + "type": "string" + }, + "offer_name": { + "type": "string" + }, + "provider": { + "type": "string" + } + }, + "required": [ + "offer_id", + "offer_name", + "provider", + "meets_all", + "monthly_cost", + "conditions" + ], + "type": "object" + }, + "type": "array" + }, + "more_note": { + "type": "string" + }, + "more_plans": { + "description": "Matching plans left out of the short list: limit is the number of plans in all, fully matching first.", + "type": "integer" + }, + "needs_input": { + "items": { + "properties": { + "field": { + "type": "string" + }, + "reason": { + "type": "string" + } + }, + "required": [ + "field", + "reason" + ], + "type": "object" + }, + "type": "array" + }, + "partial_matches": { + "items": { + "properties": { + "conditions": { + "items": { + "properties": { + "condition": { + "type": "string" + }, + "quote": { + "description": "One official source sentence, 200 characters at most.", + "type": "string" + }, + "reason": { + "description": "One line, 120 characters at most.", + "type": "string" + }, + "required": { + "description": "Present only on a preferred (nice-to-have) condition.", + "enum": [ + false + ] + }, + "source": { + "description": "Official page the sentence was found on.", + "type": [ + "string", + "null" + ] + }, + "verdict": { + "enum": [ + "MET", + "UNMET", + "UNKNOWN", + "UNIT_MISMATCH", + "UNIT_UNKNOWN" + ] + } + }, + "required": [ + "condition", + "verdict", + "reason" + ], + "type": "object" + }, + "type": "array" + }, + "match": { + "enum": [ + "FULL_MATCH", + "PARTIAL_MATCH", + "NO_MATCH" + ] + }, + "meets_all": { + "description": "Judged against the required conditions of this call only: true when every one is met, false when one is not met, \"unknown\" when none fails and one is not stated on the official pages.", + "enum": [ + true, + false, + "unknown" + ] + }, + "monthly_cost": { + "description": "status, usd, and low, high or lower_bound when they differ; as in the full result.", + "type": "object" + }, + "offer_id": { + "type": "string" + }, + "offer_name": { + "type": "string" + }, + "provider": { + "type": "string" + } + }, + "required": [ + "offer_id", + "offer_name", + "provider", + "meets_all", + "monthly_cost", + "conditions" + ], + "type": "object" + }, + "type": "array" + }, + "show_text": { + "description": "Ready to show: one line per listed plan, in list order, \"Meets all N: [Provider Plan](visit link)\" for a plan that meets every required condition of the call, \"Closest: [Provider Plan](visit link)\" for any other. The plan is a markdown link to its visit link, which carries the token of this response. Absent when no plan is listed.", + "type": "string" + }, + "unknown_providers": { + "items": { + "type": "string" + }, + "type": "array" + }, + "zero_result": { + "properties": { + "conditions": { + "items": { + "properties": { + "closest": { + "description": "The cheapest plan that meets every other required condition but not this one. It does not meet the request (meets_all false or \"unknown\").", + "properties": { + "billing": { + "type": "string" + }, + "fails": { + "type": "string" + }, + "meets_all": { + "description": "Judged against the required conditions of this call only: true when every one is met, false when one is not met, \"unknown\" when none fails and one is not stated on the official pages.", + "enum": [ + true, + false, + "unknown" + ] + }, + "monthly_cost": { + "type": "object" + }, + "offer_id": { + "type": "string" + }, + "offer_name": { + "type": "string" + }, + "page_url": { + "type": "string" + }, + "provider_name": { + "type": "string" + } + }, + "required": [ + "offer_id", + "offer_name", + "provider_name", + "billing", + "monthly_cost", + "meets_all", + "fails" + ], + "type": [ + "object", + "null" + ] + }, + "condition": { + "type": "string" + }, + "excluded": { + "type": "integer" + }, + "label": { + "type": "string" + }, + "unknown": { + "type": "integer" + }, + "would_match_if_relaxed": { + "type": "integer" + } + }, + "required": [ + "condition", + "label", + "excluded", + "would_match_if_relaxed", + "closest" + ], + "type": "object" + }, + "type": "array" + }, + "note": { + "type": "string" + } + }, + "type": [ + "object", + "null" + ] + } + }, + "required": [ + "format", + "answer", + "as_of", + "needs_input", + "counts", + "full_matches", + "partial_matches" + ], + "type": "object" + } +]
5 tool updates
- Changed
check_conditions2 fields changed- changed
Input schema / properties / format / descriptionPrevious value: -"brief returns, per plan, the plan, provider, whether it meets all, the monthly cost and the requested conditions only, each with its verdict, a one-line reason, one source sentence and its url (about a quarter of the full size); the verdicts and costs are those of full. Call it right before choosing or buying a plan."New value: +"brief returns, per plan, the plan, provider, whether it meets all, the monthly cost and the requested conditions only, each with its verdict, a one-line reason, one source sentence and its source (about a quarter of the full size); the verdicts and costs are those of full. Call it right before choosing or buying a plan." - changed
Output schema / anyOfPrevious value: -[ - { - "properties": { - "answer": { - "description": "One sentence that opens the answer: the cheapest checked plan (or plan of the same product) that meets every required condition with its link, or, when none does, the closest checked plan with what it does not meet or what is unknown, and its link.", - "type": "string" - }, - "as_of": { - "type": "string" - }, - "assumptions": { - "items": { - "type": "string" - }, - "type": "array" - }, - "link_notes": { - "additionalProperties": { - "type": "string" - }, - "description": "The note of each link level (link.link_level) of the plans in this result, stated once.", - "type": "object" - }, - "needs_input": { - "items": { - "properties": { - "field": { - "type": "string" - }, - "reason": { - "type": "string" - } - }, - "required": [ - "field", - "reason" - ], - "type": "object" - }, - "type": "array" - }, - "notes": { - "items": { - "type": "string" - }, - "type": "array" - }, - "request": { - "type": "object" - }, - "resolution": { - "description": "How each entry of plans was read.", - "items": { - "properties": { - "candidates": { - "items": { - "properties": { - "listed": { - "type": "boolean" - }, - "offer_id": { - "type": "string" - }, - "offer_name": { - "type": "string" - }, - "product_name": { - "type": "string" - }, - "provider_name": { - "type": "string" - } - }, - "required": [ - "offer_id", - "offer_name", - "provider_name" - ], - "type": "object" - }, - "type": "array" - }, - "candidates_total": { - "type": "integer" - }, - "input": { - "type": "string" - }, - "matched_by": { - "enum": [ - "id", - "name", - "url", - null - ] - }, - "note": { - "type": [ - "string", - "null" - ] - }, - "offer_id": { - "type": [ - "string", - "null" - ] - }, - "status": { - "description": "resolved: one plan, checked in results; ambiguous: several plans fit, listed in candidates and not checked; not_found: no plan in the catalog fits.", - "enum": [ - "resolved", - "ambiguous", - "not_found" - ] - } - }, - "required": [ - "input", - "status", - "offer_id", - "candidates" - ], - "type": "object" - }, - "type": "array" - }, - "results": { - "items": { - "properties": { - "assumptions": { - "items": { - "type": "string" - }, - "type": "array" - }, - "at_limit": { - "description": "Present for a plan with no automatic extra usage: what the official page says happens at the limit (kind no_extra_usage or restart_by_hand), with its sentence. With a workload that needs restarts, restarts gives their count, the price of each and the total, the numbers of monthly_cost.explanation.", - "properties": { - "evidence": { - "properties": { - "quote": { - "type": "string" - }, - "url": { - "type": "string" - } - }, - "type": "object" - }, - "kind": { - "enum": [ - "no_extra_usage", - "restart_by_hand" - ] - }, - "restarts": { - "properties": { - "count": { - "properties": { - "high": { - "type": "integer" - }, - "low": { - "type": "integer" - } - }, - "type": "object" - }, - "total_usd": { - "properties": { - "high": { - "type": "number" - }, - "low": { - "type": "number" - } - }, - "type": "object" - }, - "usd_each": { - "type": "number" - } - }, - "type": "object" - }, - "text": { - "type": "string" - } - }, - "required": [ - "kind", - "text", - "evidence" - ], - "type": "object" - }, - "billing": { - "type": "string" - }, - "billing_options": { - "items": { - "type": "string" - }, - "type": "array" - }, - "cheapest_in_product": { - "description": "The cheapest listed plan of the same product that meets every required condition of this call; is_this_plan is true when that is the checked plan. null when no plan of the product meets them all.", - "properties": { - "billing": { - "type": "string" - }, - "is_this_plan": { - "type": "boolean" - }, - "monthly_cost": { - "type": "object" - }, - "offer_id": { - "type": "string" - }, - "offer_name": { - "type": "string" - }, - "page_url": { - "type": "string" - } - }, - "required": [ - "offer_id", - "offer_name", - "billing", - "monthly_cost", - "is_this_plan" - ], - "type": [ - "object", - "null" - ] - }, - "checked_at": { - "type": [ - "string", - "null" - ] - }, - "conditions": { - "items": { - "properties": { - "condition": { - "type": "string" - }, - "facts": { - "description": "Facts the verdict was judged from. The monthly budget is judged from monthly_cost; its price facts are listed there only.", - "items": { - "properties": { - "also_stated_in": { - "description": "get_details only: other official machine-readable documents of the provider (llms.txt, llms-full.txt, OpenAPI files, MCP tool listings) that contain the same quoted sentences.", - "items": { - "type": "string" - }, - "type": "array" - }, - "applies_to": { - "description": "get_details only: billing options (billing) or search engines (search_engines) the fact is limited to.", - "type": [ - "object", - "null" - ] - }, - "at_limit": { - "description": "Present for a plan with no automatic extra usage: what the official page says happens at the limit (kind no_extra_usage or restart_by_hand), with its sentence. With a workload that needs restarts, restarts gives their count, the price of each and the total, the numbers of monthly_cost.explanation.", - "properties": { - "evidence": { - "properties": { - "quote": { - "type": "string" - }, - "url": { - "type": "string" - } - }, - "type": "object" - }, - "kind": { - "enum": [ - "no_extra_usage", - "restart_by_hand" - ] - }, - "restarts": { - "properties": { - "count": { - "properties": { - "high": { - "type": "integer" - }, - "low": { - "type": "integer" - } - }, - "type": "object" - }, - "total_usd": { - "properties": { - "high": { - "type": "number" - }, - "low": { - "type": "number" - } - }, - "type": "object" - }, - "usd_each": { - "type": "number" - } - }, - "type": "object" - }, - "text": { - "type": "string" - } - }, - "required": [ - "kind", - "text", - "evidence" - ], - "type": "object" - }, - "checked_at": { - "type": [ - "string", - "null" - ] - }, - "concurrency_unit": { - "description": "get_details, concurrency only: the unit the page states the value in (unit, text such as \"100 threads\"). Against concurrent requests: equals_requests (value, text and the official line of the unit rule) when the unit rule counts this unit as requests, else note \"not the same unit as concurrent requests\"; \"unit not stated\" when the page names none.", - "type": "object" - }, - "derived": { - "description": "How the value follows from the quoted sentence when it is not literal.", - "type": "string" - }, - "evidence": { - "items": { - "properties": { - "quote": { - "description": "The sentence as it appears on that page.", - "type": "string" - }, - "retrieved_at": { - "description": "Date the page was read (YYYY-MM-DD). Only with detail=full.", - "type": "string" - }, - "source_type": { - "description": "Only with detail=full.", - "enum": [ - "official_pricing", - "official_docs", - "third_party" - ] - }, - "url": { - "description": "Official page the sentence was found on.", - "type": "string" - } - }, - "required": [ - "url", - "quote" - ], - "type": "object" - }, - "type": "array" - }, - "exceptions": { - "description": "get_details only: plans with a different value.", - "type": "array" - }, - "key": { - "type": "string" - }, - "label": { - "type": "string" - }, - "level": { - "description": "Where the fact is recorded: offer (the plan), product or provider.", - "type": [ - "string", - "null" - ] - }, - "note": { - "type": "string" - }, - "stale": { - "type": "boolean" - }, - "status": { - "description": "TRUE: stated with the value; FALSE / NOT_SUPPORTED: stated as unavailable; UNKNOWN: not stated; CONFLICT: official pages disagree (value lists each version); STALE: past its recheck date; MISSING: not recorded.", - "enum": [ - "TRUE", - "FALSE", - "NOT_SUPPORTED", - "UNKNOWN", - "CONFLICT", - "STALE", - "MISSING" - ] - }, - "value": {}, - "via_exception": { - "description": "Present and true when a plan-specific exception replaced the general value.", - "type": "boolean" - } - }, - "required": [ - "key", - "status", - "value", - "level", - "evidence", - "checked_at" - ], - "type": "object" - }, - "type": "array" - }, - "label": { - "type": "string" - }, - "reason": { - "type": "string" - }, - "required": { - "type": "boolean" - }, - "verdict": { - "enum": [ - "MET", - "UNMET", - "UNKNOWN", - "UNIT_MISMATCH", - "UNIT_UNKNOWN" - ] - } - }, - "required": [ - "condition", - "label", - "required", - "verdict", - "reason", - "facts" - ], - "type": "object" - }, - "type": "array" - }, - "facts_omitted": { - "description": "search only: present and true when the source sentences under the conditions were left out so that the response fits one response; the verdicts, reasons and costs are unchanged. Ask check_conditions with the offer_id or get_details for the sentences.", - "type": "boolean" - }, - "link": { - "properties": { - "affiliate": { - "properties": { - "disclosure": { - "type": [ - "string", - "null" - ] - }, - "program": { - "type": [ - "string", - "null" - ] - }, - "status": { - "type": "string" - } - }, - "required": [ - "status" - ], - "type": "object" - }, - "landing": { - "type": "string" - }, - "link_level": { - "type": "string" - }, - "provider_url": { - "description": "The provider page itself, when url is this service's address that forwards to it.", - "type": "string" - }, - "url": { - "type": "string" - } - }, - "required": [ - "url", - "landing", - "link_level", - "affiliate" - ], - "type": "object" - }, - "listed": { - "type": "boolean" - }, - "match": { - "enum": [ - "FULL_MATCH", - "PARTIAL_MATCH", - "NO_MATCH" - ] - }, - "meets_all": { - "description": "Judged against the required conditions of this call only: true when every one is met, false when one is not met, \"unknown\" when none fails and one is not stated on the official pages.", - "enum": [ - true, - false, - "unknown" - ] - }, - "monthly_cost": { - "properties": { - "explanation": { - "type": "string" - }, - "facts": { - "description": "Price facts the cost was computed from.", - "items": { - "properties": { - "also_stated_in": { - "description": "get_details only: other official machine-readable documents of the provider (llms.txt, llms-full.txt, OpenAPI files, MCP tool listings) that contain the same quoted sentences.", - "items": { - "type": "string" - }, - "type": "array" - }, - "applies_to": { - "description": "get_details only: billing options (billing) or search engines (search_engines) the fact is limited to.", - "type": [ - "object", - "null" - ] - }, - "at_limit": { - "description": "Present for a plan with no automatic extra usage: what the official page says happens at the limit (kind no_extra_usage or restart_by_hand), with its sentence. With a workload that needs restarts, restarts gives their count, the price of each and the total, the numbers of monthly_cost.explanation.", - "properties": { - "evidence": { - "properties": { - "quote": { - "type": "string" - }, - "url": { - "type": "string" - } - }, - "type": "object" - }, - "kind": { - "enum": [ - "no_extra_usage", - "restart_by_hand" - ] - }, - "restarts": { - "properties": { - "count": { - "properties": { - "high": { - "type": "integer" - }, - "low": { - "type": "integer" - } - }, - "type": "object" - }, - "total_usd": { - "properties": { - "high": { - "type": "number" - }, - "low": { - "type": "number" - } - }, - "type": "object" - }, - "usd_each": { - "type": "number" - } - }, - "type": "object" - }, - "text": { - "type": "string" - } - }, - "required": [ - "kind", - "text", - "evidence" - ], - "type": "object" - }, - "checked_at": { - "type": [ - "string", - "null" - ] - }, - "concurrency_unit": { - "description": "get_details, concurrency only: the unit the page states the value in (unit, text such as \"100 threads\"). Against concurrent requests: equals_requests (value, text and the official line of the unit rule) when the unit rule counts this unit as requests, else note \"not the same unit as concurrent requests\"; \"unit not stated\" when the page names none.", - "type": "object" - }, - "derived": { - "description": "How the value follows from the quoted sentence when it is not literal.", - "type": "string" - }, - "evidence": { - "items": { - "properties": { - "quote": { - "description": "The sentence as it appears on that page.", - "type": "string" - }, - "retrieved_at": { - "description": "Date the page was read (YYYY-MM-DD). Only with detail=full.", - "type": "string" - }, - "source_type": { - "description": "Only with detail=full.", - "enum": [ - "official_pricing", - "official_docs", - "third_party" - ] - }, - "url": { - "description": "Official page the sentence was found on.", - "type": "string" - } - }, - "required": [ - "url", - "quote" - ], - "type": "object" - }, - "type": "array" - }, - "exceptions": { - "description": "get_details only: plans with a different value.", - "type": "array" - }, - "key": { - "type": "string" - }, - "label": { - "type": "string" - }, - "level": { - "description": "Where the fact is recorded: offer (the plan), product or provider.", - "type": [ - "string", - "null" - ] - }, - "note": { - "type": "string" - }, - "stale": { - "type": "boolean" - }, - "status": { - "description": "TRUE: stated with the value; FALSE / NOT_SUPPORTED: stated as unavailable; UNKNOWN: not stated; CONFLICT: official pages disagree (value lists each version); STALE: past its recheck date; MISSING: not recorded.", - "enum": [ - "TRUE", - "FALSE", - "NOT_SUPPORTED", - "UNKNOWN", - "CONFLICT", - "STALE", - "MISSING" - ] - }, - "value": {}, - "via_exception": { - "description": "Present and true when a plan-specific exception replaced the general value.", - "type": "boolean" - } - }, - "required": [ - "key", - "status", - "value", - "level", - "evidence", - "checked_at" - ], - "type": "object" - }, - "type": "array" - }, - "high": { - "type": [ - "number", - "null" - ] - }, - "low": { - "type": [ - "number", - "null" - ] - }, - "lower_bound": { - "type": [ - "number", - "null" - ] - }, - "status": { - "enum": [ - "exact", - "range", - "lower_bound", - "unknown" - ] - }, - "upfront_usd": { - "type": [ - "number", - "null" - ] - }, - "usd": { - "type": [ - "number", - "null" - ] - } - }, - "required": [ - "status", - "usd", - "explanation" - ], - "type": "object" - }, - "offer_id": { - "type": "string" - }, - "offer_name": { - "type": "string" - }, - "page_url": { - "type": "string" - }, - "preferred_met": { - "type": "integer" - }, - "prices_exclude_tax": { - "type": [ - "boolean", - "null" - ] - }, - "product_id": { - "type": "string" - }, - "product_name": { - "type": "string" - }, - "provider_id": { - "type": "string" - }, - "provider_name": { - "type": "string" - }, - "unknown_conditions": { - "items": { - "type": "string" - }, - "type": "array" - }, - "unmet_conditions": { - "items": { - "type": "string" - }, - "type": "array" - }, - "verdict": { - "description": "One sentence: the conditions met, or the ones not met or not stated, with the reason.", - "type": "string" - } - }, - "required": [ - "offer_id", - "offer_name", - "product_id", - "provider_name", - "match", - "meets_all", - "verdict", - "billing", - "monthly_cost", - "conditions", - "unmet_conditions", - "unknown_conditions", - "link", - "checked_at", - "cheapest_in_product" - ], - "type": "object" - }, - "type": "array" - } - }, - "required": [ - "answer", - "as_of", - "needs_input", - "results", - "assumptions", - "notes" - ], - "type": "object" - }, - { - "properties": { - "answer": { - "type": "string" - }, - "as_of": { - "type": "string" - }, - "format": { - "enum": [ - "brief" - ] - }, - "needs_input": { - "items": { - "properties": { - "field": { - "type": "string" - }, - "reason": { - "type": "string" - } - }, - "required": [ - "field", - "reason" - ], - "type": "object" - }, - "type": "array" - }, - "resolution": { - "type": "array" - }, - "results": { - "items": { - "properties": { - "conditions": { - "items": { - "properties": { - "condition": { - "type": "string" - }, - "quote": { - "description": "One official source sentence, 200 characters at most.", - "type": "string" - }, - "reason": { - "description": "One line, 120 characters at most.", - "type": "string" - }, - "required": { - "description": "Present only on a preferred (nice-to-have) condition.", - "enum": [ - false - ] - }, - "url": { - "type": [ - "string", - "null" - ] - }, - "verdict": { - "enum": [ - "MET", - "UNMET", - "UNKNOWN", - "UNIT_MISMATCH", - "UNIT_UNKNOWN" - ] - } - }, - "required": [ - "condition", - "verdict", - "reason" - ], - "type": "object" - }, - "type": "array" - }, - "match": { - "enum": [ - "FULL_MATCH", - "PARTIAL_MATCH", - "NO_MATCH" - ] - }, - "meets_all": { - "description": "Judged against the required conditions of this call only: true when every one is met, false when one is not met, \"unknown\" when none fails and one is not stated on the official pages.", - "enum": [ - true, - false, - "unknown" - ] - }, - "monthly_cost": { - "description": "status, usd, and low, high or lower_bound when they differ; as in the full result.", - "type": "object" - }, - "offer_id": { - "type": "string" - }, - "offer_name": { - "type": "string" - }, - "provider": { - "type": "string" - } - }, - "required": [ - "offer_id", - "offer_name", - "provider", - "meets_all", - "monthly_cost", - "conditions" - ], - "type": "object" - }, - "type": "array" - } - }, - "required": [ - "format", - "answer", - "as_of", - "needs_input", - "results" - ], - "type": "object" - } -]New value: +[ + { + "properties": { + "answer": { + "description": "One sentence that opens the answer: the cheapest checked plan (or plan of the same product) that meets every required condition with its link, or, when none does, the closest checked plan with what it does not meet or what is unknown, and its link.", + "type": "string" + }, + "as_of": { + "type": "string" + }, + "assumptions": { + "items": { + "type": "string" + }, + "type": "array" + }, + "link_notes": { + "additionalProperties": { + "type": "string" + }, + "description": "The note of each link level (link.link_level) of the plans in this result, stated once.", + "type": "object" + }, + "needs_input": { + "items": { + "properties": { + "field": { + "type": "string" + }, + "reason": { + "type": "string" + } + }, + "required": [ + "field", + "reason" + ], + "type": "object" + }, + "type": "array" + }, + "notes": { + "items": { + "type": "string" + }, + "type": "array" + }, + "request": { + "type": "object" + }, + "resolution": { + "description": "How each entry of plans was read.", + "items": { + "properties": { + "candidates": { + "items": { + "properties": { + "listed": { + "type": "boolean" + }, + "offer_id": { + "type": "string" + }, + "offer_name": { + "type": "string" + }, + "product_name": { + "type": "string" + }, + "provider_name": { + "type": "string" + } + }, + "required": [ + "offer_id", + "offer_name", + "provider_name" + ], + "type": "object" + }, + "type": "array" + }, + "candidates_total": { + "type": "integer" + }, + "input": { + "type": "string" + }, + "matched_by": { + "enum": [ + "id", + "name", + "url", + null + ] + }, + "note": { + "type": [ + "string", + "null" + ] + }, + "offer_id": { + "type": [ + "string", + "null" + ] + }, + "status": { + "description": "resolved: one plan, checked in results; ambiguous: several plans fit, listed in candidates and not checked; not_found: no plan in the catalog fits.", + "enum": [ + "resolved", + "ambiguous", + "not_found" + ] + } + }, + "required": [ + "input", + "status", + "offer_id", + "candidates" + ], + "type": "object" + }, + "type": "array" + }, + "results": { + "items": { + "properties": { + "assumptions": { + "items": { + "type": "string" + }, + "type": "array" + }, + "at_limit": { + "description": "Present for a plan with no automatic extra usage: what the official page says happens at the limit (kind no_extra_usage or restart_by_hand), with its sentence. With a workload that needs restarts, restarts gives their count, the price of each and the total, the numbers of monthly_cost.explanation.", + "properties": { + "evidence": { + "properties": { + "quote": { + "type": "string" + }, + "source": { + "type": "string" + } + }, + "type": "object" + }, + "kind": { + "enum": [ + "no_extra_usage", + "restart_by_hand" + ] + }, + "restarts": { + "properties": { + "count": { + "properties": { + "high": { + "type": "integer" + }, + "low": { + "type": "integer" + } + }, + "type": "object" + }, + "total_usd": { + "properties": { + "high": { + "type": "number" + }, + "low": { + "type": "number" + } + }, + "type": "object" + }, + "usd_each": { + "type": "number" + } + }, + "type": "object" + }, + "text": { + "type": "string" + } + }, + "required": [ + "kind", + "text", + "evidence" + ], + "type": "object" + }, + "billing": { + "type": "string" + }, + "billing_options": { + "items": { + "type": "string" + }, + "type": "array" + }, + "cheapest_in_product": { + "description": "The cheapest listed plan of the same product that meets every required condition of this call; is_this_plan is true when that is the checked plan. null when no plan of the product meets them all.", + "properties": { + "billing": { + "type": "string" + }, + "is_this_plan": { + "type": "boolean" + }, + "monthly_cost": { + "type": "object" + }, + "offer_id": { + "type": "string" + }, + "offer_name": { + "type": "string" + }, + "page_url": { + "type": "string" + } + }, + "required": [ + "offer_id", + "offer_name", + "billing", + "monthly_cost", + "is_this_plan" + ], + "type": [ + "object", + "null" + ] + }, + "checked_at": { + "type": [ + "string", + "null" + ] + }, + "conditions": { + "items": { + "properties": { + "condition": { + "type": "string" + }, + "facts": { + "description": "Facts the verdict was judged from. The monthly budget is judged from monthly_cost; its price facts are listed there only.", + "items": { + "properties": { + "also_stated_in": { + "description": "get_details only: other official machine-readable documents of the provider (llms.txt, llms-full.txt, OpenAPI files, MCP tool listings) that contain the same quoted sentences.", + "items": { + "type": "string" + }, + "type": "array" + }, + "applies_to": { + "description": "get_details only: billing options (billing) or search engines (search_engines) the fact is limited to.", + "type": [ + "object", + "null" + ] + }, + "at_limit": { + "description": "Present for a plan with no automatic extra usage: what the official page says happens at the limit (kind no_extra_usage or restart_by_hand), with its sentence. With a workload that needs restarts, restarts gives their count, the price of each and the total, the numbers of monthly_cost.explanation.", + "properties": { + "evidence": { + "properties": { + "quote": { + "type": "string" + }, + "source": { + "type": "string" + } + }, + "type": "object" + }, + "kind": { + "enum": [ + "no_extra_usage", + "restart_by_hand" + ] + }, + "restarts": { + "properties": { + "count": { + "properties": { + "high": { + "type": "integer" + }, + "low": { + "type": "integer" + } + }, + "type": "object" + }, + "total_usd": { + "properties": { + "high": { + "type": "number" + }, + "low": { + "type": "number" + } + }, + "type": "object" + }, + "usd_each": { + "type": "number" + } + }, + "type": "object" + }, + "text": { + "type": "string" + } + }, + "required": [ + "kind", + "text", + "evidence" + ], + "type": "object" + }, + "checked_at": { + "type": [ + "string", + "null" + ] + }, + "concurrency_unit": { + "description": "get_details, concurrency only: the unit the page states the value in (unit, text such as \"100 threads\"). Against concurrent requests: equals_requests (value, text and the official line of the unit rule) when the unit rule counts this unit as requests, else note \"not the same unit as concurrent requests\"; \"unit not stated\" when the page names none.", + "type": "object" + }, + "derived": { + "description": "How the value follows from the quoted sentence when it is not literal.", + "type": "string" + }, + "evidence": { + "items": { + "properties": { + "quote": { + "description": "The sentence as it appears on that page.", + "type": "string" + }, + "retrieved_at": { + "description": "Date the page was read (YYYY-MM-DD). Only with detail=full.", + "type": "string" + }, + "source": { + "description": "Official page the sentence was found on.", + "type": "string" + }, + "source_type": { + "description": "Only with detail=full.", + "enum": [ + "official_pricing", + "official_docs", + "third_party" + ] + } + }, + "required": [ + "source", + "quote" + ], + "type": "object" + }, + "type": "array" + }, + "exceptions": { + "description": "get_details only: plans with a different value.", + "type": "array" + }, + "key": { + "type": "string" + }, + "label": { + "type": "string" + }, + "level": { + "description": "Where the fact is recorded: offer (the plan), product or provider.", + "type": [ + "string", + "null" + ] + }, + "note": { + "type": "string" + }, + "stale": { + "type": "boolean" + }, + "status": { + "description": "TRUE: stated with the value; FALSE / NOT_SUPPORTED: stated as unavailable; UNKNOWN: not stated; CONFLICT: official pages disagree (value lists each version); STALE: past its recheck date; MISSING: not recorded.", + "enum": [ + "TRUE", + "FALSE", + "NOT_SUPPORTED", + "UNKNOWN", + "CONFLICT", + "STALE", + "MISSING" + ] + }, + "value": {}, + "via_exception": { + "description": "Present and true when a plan-specific exception replaced the general value.", + "type": "boolean" + } + }, + "required": [ + "key", + "status", + "value", + "level", + "evidence", + "checked_at" + ], + "type": "object" + }, + "type": "array" + }, + "label": { + "type": "string" + }, + "reason": { + "type": "string" + }, + "required": { + "type": "boolean" + }, + "verdict": { + "enum": [ + "MET", + "UNMET", + "UNKNOWN", + "UNIT_MISMATCH", + "UNIT_UNKNOWN" + ] + } + }, + "required": [ + "condition", + "label", + "required", + "verdict", + "reason", + "facts" + ], + "type": "object" + }, + "type": "array" + }, + "facts_omitted": { + "description": "search only: present and true when the source sentences under the conditions were left out so that the response fits one response; the verdicts, reasons and costs are unchanged. Ask check_conditions with the offer_id or get_details for the sentences.", + "type": "boolean" + }, + "link": { + "properties": { + "affiliate": { + "properties": { + "disclosure": { + "type": [ + "string", + "null" + ] + }, + "program": { + "type": [ + "string", + "null" + ] + }, + "status": { + "type": "string" + } + }, + "required": [ + "status" + ], + "type": "object" + }, + "landing": { + "type": "string" + }, + "link_level": { + "type": "string" + }, + "provider_url": { + "description": "The provider page itself. Only in a page made for a browser, where url is this service's address that forwards to it; MCP and REST results do not carry it.", + "type": "string" + }, + "url": { + "description": "The only address to visit the plan: this service's /go/<offer_id>?r=<token> address, which forwards to the provider page. The token is made for this response and holds nothing about you.", + "type": "string" + } + }, + "required": [ + "url", + "landing", + "link_level", + "affiliate" + ], + "type": "object" + }, + "listed": { + "type": "boolean" + }, + "match": { + "enum": [ + "FULL_MATCH", + "PARTIAL_MATCH", + "NO_MATCH" + ] + }, + "meets_all": { + "description": "Judged against the required conditions of this call only: true when every one is met, false when one is not met, \"unknown\" when none fails and one is not stated on the official pages.", + "enum": [ + true, + false, + "unknown" + ] + }, + "monthly_cost": { + "properties": { + "explanation": { + "type": "string" + }, + "facts": { + "description": "Price facts the cost was computed from.", + "items": { + "properties": { + "also_stated_in": { + "description": "get_details only: other official machine-readable documents of the provider (llms.txt, llms-full.txt, OpenAPI files, MCP tool listings) that contain the same quoted sentences.", + "items": { + "type": "string" + }, + "type": "array" + }, + "applies_to": { + "description": "get_details only: billing options (billing) or search engines (search_engines) the fact is limited to.", + "type": [ + "object", + "null" + ] + }, + "at_limit": { + "description": "Present for a plan with no automatic extra usage: what the official page says happens at the limit (kind no_extra_usage or restart_by_hand), with its sentence. With a workload that needs restarts, restarts gives their count, the price of each and the total, the numbers of monthly_cost.explanation.", + "properties": { + "evidence": { + "properties": { + "quote": { + "type": "string" + }, + "source": { + "type": "string" + } + }, + "type": "object" + }, + "kind": { + "enum": [ + "no_extra_usage", + "restart_by_hand" + ] + }, + "restarts": { + "properties": { + "count": { + "properties": { + "high": { + "type": "integer" + }, + "low": { + "type": "integer" + } + }, + "type": "object" + }, + "total_usd": { + "properties": { + "high": { + "type": "number" + }, + "low": { + "type": "number" + } + }, + "type": "object" + }, + "usd_each": { + "type": "number" + } + }, + "type": "object" + }, + "text": { + "type": "string" + } + }, + "required": [ + "kind", + "text", + "evidence" + ], + "type": "object" + }, + "checked_at": { + "type": [ + "string", + "null" + ] + }, + "concurrency_unit": { + "description": "get_details, concurrency only: the unit the page states the value in (unit, text such as \"100 threads\"). Against concurrent requests: equals_requests (value, text and the official line of the unit rule) when the unit rule counts this unit as requests, else note \"not the same unit as concurrent requests\"; \"unit not stated\" when the page names none.", + "type": "object" + }, + "derived": { + "description": "How the value follows from the quoted sentence when it is not literal.", + "type": "string" + }, + "evidence": { + "items": { + "properties": { + "quote": { + "description": "The sentence as it appears on that page.", + "type": "string" + }, + "retrieved_at": { + "description": "Date the page was read (YYYY-MM-DD). Only with detail=full.", + "type": "string" + }, + "source": { + "description": "Official page the sentence was found on.", + "type": "string" + }, + "source_type": { + "description": "Only with detail=full.", + "enum": [ + "official_pricing", + "official_docs", + "third_party" + ] + } + }, + "required": [ + "source", + "quote" + ], + "type": "object" + }, + "type": "array" + }, + "exceptions": { + "description": "get_details only: plans with a different value.", + "type": "array" + }, + "key": { + "type": "string" + }, + "label": { + "type": "string" + }, + "level": { + "description": "Where the fact is recorded: offer (the plan), product or provider.", + "type": [ + "string", + "null" + ] + }, + "note": { + "type": "string" + }, + "stale": { + "type": "boolean" + }, + "status": { + "description": "TRUE: stated with the value; FALSE / NOT_SUPPORTED: stated as unavailable; UNKNOWN: not stated; CONFLICT: official pages disagree (value lists each version); STALE: past its recheck date; MISSING: not recorded.", + "enum": [ + "TRUE", + "FALSE", + "NOT_SUPPORTED", + "UNKNOWN", + "CONFLICT", + "STALE", + "MISSING" + ] + }, + "value": {}, + "via_exception": { + "description": "Present and true when a plan-specific exception replaced the general value.", + "type": "boolean" + } + }, + "required": [ + "key", + "status", + "value", + "level", + "evidence", + "checked_at" + ], + "type": "object" + }, + "type": "array" + }, + "high": { + "type": [ + "number", + "null" + ] + }, + "low": { + "type": [ + "number", + "null" + ] + }, + "lower_bound": { + "type": [ + "number", + "null" + ] + }, + "status": { + "enum": [ + "exact", + "range", + "lower_bound", + "unknown" + ] + }, + "upfront_usd": { + "type": [ + "number", + "null" + ] + }, + "usd": { + "type": [ + "number", + "null" + ] + } + }, + "required": [ + "status", + "usd", + "explanation" + ], + "type": "object" + }, + "offer_id": { + "type": "string" + }, + "offer_name": { + "type": "string" + }, + "page_url": { + "type": "string" + }, + "preferred_met": { + "type": "integer" + }, + "prices_exclude_tax": { + "type": [ + "boolean", + "null" + ] + }, + "product_id": { + "type": "string" + }, + "product_name": { + "type": "string" + }, + "provider_id": { + "type": "string" + }, + "provider_name": { + "type": "string" + }, + "unknown_conditions": { + "items": { + "type": "string" + }, + "type": "array" + }, + "unmet_conditions": { + "items": { + "type": "string" + }, + "type": "array" + }, + "verdict": { + "description": "One sentence: the conditions met, or the ones not met or not stated, with the reason.", + "type": "string" + } + }, + "required": [ + "offer_id", + "offer_name", + "product_id", + "provider_name", + "match", + "meets_all", + "verdict", + "billing", + "monthly_cost", + "conditions", + "unmet_conditions", + "unknown_conditions", + "link", + "checked_at", + "cheapest_in_product" + ], + "type": "object" + }, + "type": "array" + }, + "show_text": { + "description": "Ready to show: one line per listed plan, in list order, \"Meets all N: Provider Plan โ link\" for a plan that meets every required condition of the call, \"Closest: Provider Plan โ link\" for any other. The link is the visit link of the plan, with the token of this response. Absent when no plan is listed.", + "type": "string" + } + }, + "required": [ + "answer", + "as_of", + "needs_input", + "results", + "assumptions", + "notes" + ], + "type": "object" + }, + { + "properties": { + "answer": { + "type": "string" + }, + "as_of": { + "type": "string" + }, + "format": { + "enum": [ + "brief" + ] + }, + "needs_input": { + "items": { + "properties": { + "field": { + "type": "string" + }, + "reason": { + "type": "string" + } + }, + "required": [ + "field", + "reason" + ], + "type": "object" + }, + "type": "array" + }, + "resolution": { + "type": "array" + }, + "results": { + "items": { + "properties": { + "conditions": { + "items": { + "properties": { + "condition": { + "type": "string" + }, + "quote": { + "description": "One official source sentence, 200 characters at most.", + "type": "string" + }, + "reason": { + "description": "One line, 120 characters at most.", + "type": "string" + }, + "required": { + "description": "Present only on a preferred (nice-to-have) condition.", + "enum": [ + false + ] + }, + "source": { + "description": "Official page the sentence was found on.", + "type": [ + "string", + "null" + ] + }, + "verdict": { + "enum": [ + "MET", + "UNMET", + "UNKNOWN", + "UNIT_MISMATCH", + "UNIT_UNKNOWN" + ] + } + }, + "required": [ + "condition", + "verdict", + "reason" + ], + "type": "object" + }, + "type": "array" + }, + "match": { + "enum": [ + "FULL_MATCH", + "PARTIAL_MATCH", + "NO_MATCH" + ] + }, + "meets_all": { + "description": "Judged against the required conditions of this call only: true when every one is met, false when one is not met, \"unknown\" when none fails and one is not stated on the official pages.", + "enum": [ + true, + false, + "unknown" + ] + }, + "monthly_cost": { + "description": "status, usd, and low, high or lower_bound when they differ; as in the full result.", + "type": "object" + }, + "offer_id": { + "type": "string" + }, + "offer_name": { + "type": "string" + }, + "provider": { + "type": "string" + } + }, + "required": [ + "offer_id", + "offer_name", + "provider", + "meets_all", + "monthly_cost", + "conditions" + ], + "type": "object" + }, + "type": "array" + }, + "show_text": { + "description": "Ready to show: one line per listed plan, in list order, \"Meets all N: Provider Plan โ link\" for a plan that meets every required condition of the call, \"Closest: Provider Plan โ link\" for any other. The link is the visit link of the plan, with the token of this response. Absent when no plan is listed.", + "type": "string" + } + }, + "required": [ + "format", + "answer", + "as_of", + "needs_input", + "results" + ], + "type": "object" + } +]
- Changed
cost_scenarios57 fields changed- added
Output schema / properties / at_end / items / properties / monthly_cost / properties / facts / items / properties / at_limit / properties / evidence / properties / sourceAdded value: +{ + "type": "string" +} - removed
Output schema / properties / at_end / items / properties / monthly_cost / properties / facts / items / properties / at_limit / properties / evidence / properties / urlRemoved value: -{ - "type": "string" -} - added
Output schema / properties / at_end / items / properties / monthly_cost / properties / facts / items / properties / evidence / items / properties / sourceAdded value: +{ + "description": "Official page the sentence was found on.", + "type": "string" +} - removed
Output schema / properties / at_end / items / properties / monthly_cost / properties / facts / items / properties / evidence / items / properties / urlRemoved value: -{ - "description": "Official page the sentence was found on.", - "type": "string" -} - changed
Output schema / properties / at_end / items / properties / monthly_cost / properties / facts / items / properties / evidence / items / requiredPrevious value: -[ - "url", - "quote" -]New value: +[ + "source", + "quote" +] - added
Output schema / properties / at_start / items / properties / monthly_cost / properties / facts / items / properties / at_limit / properties / evidence / properties / sourceAdded value: +{ + "type": "string" +} - removed
Output schema / properties / at_start / items / properties / monthly_cost / properties / facts / items / properties / at_limit / properties / evidence / properties / urlRemoved value: -{ - "type": "string" -} - added
Output schema / properties / at_start / items / properties / monthly_cost / properties / facts / items / properties / evidence / items / properties / sourceAdded value: +{ + "description": "Official page the sentence was found on.", + "type": "string" +} - removed
Output schema / properties / at_start / items / properties / monthly_cost / properties / facts / items / properties / evidence / items / properties / urlRemoved value: -{ - "description": "Official page the sentence was found on.", - "type": "string" -} - changed
Output schema / properties / at_start / items / properties / monthly_cost / properties / facts / items / properties / evidence / items / requiredPrevious value: -[ - "url", - "quote" -]New value: +[ + "source", + "quote" +] - added
Output schema / properties / plans / items / properties / facts / items / properties / at_limit / properties / evidence / properties / sourceAdded value: +{ + "type": "string" +} - removed
Output schema / properties / plans / items / properties / facts / items / properties / at_limit / properties / evidence / properties / urlRemoved value: -{ - "type": "string" -} - added
Output schema / properties / plans / items / properties / facts / items / properties / evidence / items / properties / sourceAdded value: +{ + "description": "Official page the sentence was found on.", + "type": "string" +} - removed
Output schema / properties / plans / items / properties / facts / items / properties / evidence / items / properties / urlRemoved value: -{ - "description": "Official page the sentence was found on.", - "type": "string" -} - changed
Output schema / properties / plans / items / properties / facts / items / properties / evidence / items / requiredPrevious value: -[ - "url", - "quote" -]New value: +[ + "source", + "quote" +] - changed
Output schema / properties / plans / items / properties / link / properties / provider_url / descriptionPrevious value: -"The provider page itself, when url is this service's address that forwards to it."New value: +"The provider page itself. Only in a page made for a browser, where url is this service's address that forwards to it; MCP and REST results do not carry it." - added
Output schema / properties / plans / items / properties / link / properties / url / descriptionAdded value: +"The only address to visit the plan: this service's /go/<offer_id>?r=<token> address, which forwards to the provider page. The token is made for this response and holds nothing about you." - added
Output schema / properties / switches / items / properties / from / properties / monthly_cost / properties / facts / items / properties / at_limit / properties / evidence / properties / sourceAdded value: +{ + "type": "string" +} - removed
Output schema / properties / switches / items / properties / from / properties / monthly_cost / properties / facts / items / properties / at_limit / properties / evidence / properties / urlRemoved value: -{ - "type": "string" -} - added
Output schema / properties / switches / items / properties / from / properties / monthly_cost / properties / facts / items / properties / evidence / items / properties / sourceAdded value: +{ + "description": "Official page the sentence was found on.", + "type": "string" +} - removed
Output schema / properties / switches / items / properties / from / properties / monthly_cost / properties / facts / items / properties / evidence / items / properties / urlRemoved value: -{ - "description": "Official page the sentence was found on.", - "type": "string" -} - changed
Output schema / properties / switches / items / properties / from / properties / monthly_cost / properties / facts / items / properties / evidence / items / requiredPrevious value: -[ - "url", - "quote" -]New value: +[ + "source", + "quote" +] - added
Output schema / properties / switches / items / properties / to / properties / monthly_cost / properties / facts / items / properties / at_limit / properties / evidence / properties / sourceAdded value: +{ + "type": "string" +} - removed
Output schema / properties / switches / items / properties / to / properties / monthly_cost / properties / facts / items / properties / at_limit / properties / evidence / properties / urlRemoved value: -{ - "type": "string" -} - added
Output schema / properties / switches / items / properties / to / properties / monthly_cost / properties / facts / items / properties / evidence / items / properties / sourceAdded value: +{ + "description": "Official page the sentence was found on.", + "type": "string" +} - removed
Output schema / properties / switches / items / properties / to / properties / monthly_cost / properties / facts / items / properties / evidence / items / properties / urlRemoved value: -{ - "description": "Official page the sentence was found on.", - "type": "string" -} - changed
Output schema / properties / switches / items / properties / to / properties / monthly_cost / properties / facts / items / properties / evidence / items / requiredPrevious value: -[ - "url", - "quote" -]New value: +[ + "source", + "quote" +] - added
Output schema / properties / tracked / items / properties / at_end / properties / monthly_cost / properties / facts / items / properties / at_limit / properties / evidence / properties / sourceAdded value: +{ + "type": "string" +} - removed
Output schema / properties / tracked / items / properties / at_end / properties / monthly_cost / properties / facts / items / properties / at_limit / properties / evidence / properties / urlRemoved value: -{ - "type": "string" -} - added
Output schema / properties / tracked / items / properties / at_end / properties / monthly_cost / properties / facts / items / properties / evidence / items / properties / sourceAdded value: +{ + "description": "Official page the sentence was found on.", + "type": "string" +} - removed
Output schema / properties / tracked / items / properties / at_end / properties / monthly_cost / properties / facts / items / properties / evidence / items / properties / urlRemoved value: -{ - "description": "Official page the sentence was found on.", - "type": "string" -} - changed
Output schema / properties / tracked / items / properties / at_end / properties / monthly_cost / properties / facts / items / properties / evidence / items / requiredPrevious value: -[ - "url", - "quote" -]New value: +[ + "source", + "quote" +] - added
Output schema / properties / tracked / items / properties / at_start / properties / monthly_cost / properties / facts / items / properties / at_limit / properties / evidence / properties / sourceAdded value: +{ + "type": "string" +} - removed
Output schema / properties / tracked / items / properties / at_start / properties / monthly_cost / properties / facts / items / properties / at_limit / properties / evidence / properties / urlRemoved value: -{ - "type": "string" -} - added
Output schema / properties / tracked / items / properties / at_start / properties / monthly_cost / properties / facts / items / properties / evidence / items / properties / sourceAdded value: +{ + "description": "Official page the sentence was found on.", + "type": "string" +} - removed
Output schema / properties / tracked / items / properties / at_start / properties / monthly_cost / properties / facts / items / properties / evidence / items / properties / urlRemoved value: -{ - "description": "Official page the sentence was found on.", - "type": "string" -} - changed
Output schema / properties / tracked / items / properties / at_start / properties / monthly_cost / properties / facts / items / properties / evidence / items / requiredPrevious value: -[ - "url", - "quote" -]New value: +[ + "source", + "quote" +] - added
Output schema / properties / tracked / items / properties / budget_exceeded / properties / monthly_cost / properties / facts / items / properties / at_limit / properties / evidence / properties / sourceAdded value: +{ + "type": "string" +} - removed
Output schema / properties / tracked / items / properties / budget_exceeded / properties / monthly_cost / properties / facts / items / properties / at_limit / properties / evidence / properties / urlRemoved value: -{ - "type": "string" -} - added
Output schema / properties / tracked / items / properties / budget_exceeded / properties / monthly_cost / properties / facts / items / properties / evidence / items / properties / sourceAdded value: +{ + "description": "Official page the sentence was found on.", + "type": "string" +} - removed
Output schema / properties / tracked / items / properties / budget_exceeded / properties / monthly_cost / properties / facts / items / properties / evidence / items / properties / urlRemoved value: -{ - "description": "Official page the sentence was found on.", - "type": "string" -} - changed
Output schema / properties / tracked / items / properties / budget_exceeded / properties / monthly_cost / properties / facts / items / properties / evidence / items / requiredPrevious value: -[ - "url", - "quote" -]New value: +[ + "source", + "quote" +] - added
Output schema / properties / tracked / items / properties / cost_change / properties / monthly_cost / properties / facts / items / properties / at_limit / properties / evidence / properties / sourceAdded value: +{ + "type": "string" +} - removed
Output schema / properties / tracked / items / properties / cost_change / properties / monthly_cost / properties / facts / items / properties / at_limit / properties / evidence / properties / urlRemoved value: -{ - "type": "string" -} - added
Output schema / properties / tracked / items / properties / cost_change / properties / monthly_cost / properties / facts / items / properties / evidence / items / properties / sourceAdded value: +{ + "description": "Official page the sentence was found on.", + "type": "string" +} - removed
Output schema / properties / tracked / items / properties / cost_change / properties / monthly_cost / properties / facts / items / properties / evidence / items / properties / urlRemoved value: -{ - "description": "Official page the sentence was found on.", - "type": "string" -} - changed
Output schema / properties / tracked / items / properties / cost_change / properties / monthly_cost / properties / facts / items / properties / evidence / items / requiredPrevious value: -[ - "url", - "quote" -]New value: +[ + "source", + "quote" +] - added
Output schema / properties / tracked / items / properties / stops_matching / properties / monthly_cost / properties / facts / items / properties / at_limit / properties / evidence / properties / sourceAdded value: +{ + "type": "string" +} - removed
Output schema / properties / tracked / items / properties / stops_matching / properties / monthly_cost / properties / facts / items / properties / at_limit / properties / evidence / properties / urlRemoved value: -{ - "type": "string" -} - added
Output schema / properties / tracked / items / properties / stops_matching / properties / monthly_cost / properties / facts / items / properties / evidence / items / properties / sourceAdded value: +{ + "description": "Official page the sentence was found on.", + "type": "string" +} - removed
Output schema / properties / tracked / items / properties / stops_matching / properties / monthly_cost / properties / facts / items / properties / evidence / items / properties / urlRemoved value: -{ - "description": "Official page the sentence was found on.", - "type": "string" -} - changed
Output schema / properties / tracked / items / properties / stops_matching / properties / monthly_cost / properties / facts / items / properties / evidence / items / requiredPrevious value: -[ - "url", - "quote" -]New value: +[ + "source", + "quote" +] - added
Output schema / properties / tracked / items / properties / volume_limit / properties / monthly_cost / properties / facts / items / properties / at_limit / properties / evidence / properties / sourceAdded value: +{ + "type": "string" +} - removed
Output schema / properties / tracked / items / properties / volume_limit / properties / monthly_cost / properties / facts / items / properties / at_limit / properties / evidence / properties / urlRemoved value: -{ - "type": "string" -} - added
Output schema / properties / tracked / items / properties / volume_limit / properties / monthly_cost / properties / facts / items / properties / evidence / items / properties / sourceAdded value: +{ + "description": "Official page the sentence was found on.", + "type": "string" +} - removed
Output schema / properties / tracked / items / properties / volume_limit / properties / monthly_cost / properties / facts / items / properties / evidence / items / properties / urlRemoved value: -{ - "description": "Official page the sentence was found on.", - "type": "string" -} - changed
Output schema / properties / tracked / items / properties / volume_limit / properties / monthly_cost / properties / facts / items / properties / evidence / items / requiredPrevious value: -[ - "url", - "quote" -]New value: +[ + "source", + "quote" +]
- Changed
get_details12 fields changed- added
Output schema / properties / offers / items / properties / facts / items / properties / at_limit / properties / evidence / properties / sourceAdded value: +{ + "type": "string" +} - removed
Output schema / properties / offers / items / properties / facts / items / properties / at_limit / properties / evidence / properties / urlRemoved value: -{ - "type": "string" -} - added
Output schema / properties / offers / items / properties / facts / items / properties / evidence / items / properties / sourceAdded value: +{ + "description": "Official page the sentence was found on.", + "type": "string" +} - removed
Output schema / properties / offers / items / properties / facts / items / properties / evidence / items / properties / urlRemoved value: -{ - "description": "Official page the sentence was found on.", - "type": "string" -} - changed
Output schema / properties / offers / items / properties / facts / items / properties / evidence / items / requiredPrevious value: -[ - "url", - "quote" -]New value: +[ + "source", + "quote" +] - changed
Output schema / properties / offers / items / properties / link / properties / provider_url / descriptionPrevious value: -"The provider page itself, when url is this service's address that forwards to it."New value: +"The provider page itself. Only in a page made for a browser, where url is this service's address that forwards to it; MCP and REST results do not carry it." - added
Output schema / properties / offers / items / properties / link / properties / url / descriptionAdded value: +"The only address to visit the plan: this service's /go/<offer_id>?r=<token> address, which forwards to the provider page. The token is made for this response and holds nothing about you." - added
Output schema / properties / product / properties / facts / items / properties / at_limit / properties / evidence / properties / sourceAdded value: +{ + "type": "string" +} - removed
Output schema / properties / product / properties / facts / items / properties / at_limit / properties / evidence / properties / urlRemoved value: -{ - "type": "string" -} - added
Output schema / properties / product / properties / facts / items / properties / evidence / items / properties / sourceAdded value: +{ + "description": "Official page the sentence was found on.", + "type": "string" +} - removed
Output schema / properties / product / properties / facts / items / properties / evidence / items / properties / urlRemoved value: -{ - "description": "Official page the sentence was found on.", - "type": "string" -} - changed
Output schema / properties / product / properties / facts / items / properties / evidence / items / requiredPrevious value: -[ - "url", - "quote" -]New value: +[ + "source", + "quote" +]
- Changed
relax_conditions19 fields changed- added
Output schema / properties / changes / items / properties / options / items / properties / admitted / items / properties / facts / items / properties / at_limit / properties / evidence / properties / sourceAdded value: +{ + "type": "string" +} - removed
Output schema / properties / changes / items / properties / options / items / properties / admitted / items / properties / facts / items / properties / at_limit / properties / evidence / properties / urlRemoved value: -{ - "type": "string" -} - added
Output schema / properties / changes / items / properties / options / items / properties / admitted / items / properties / facts / items / properties / evidence / items / properties / sourceAdded value: +{ + "description": "Official page the sentence was found on.", + "type": "string" +} - removed
Output schema / properties / changes / items / properties / options / items / properties / admitted / items / properties / facts / items / properties / evidence / items / properties / urlRemoved value: -{ - "description": "Official page the sentence was found on.", - "type": "string" -} - changed
Output schema / properties / changes / items / properties / options / items / properties / admitted / items / properties / facts / items / properties / evidence / items / requiredPrevious value: -[ - "url", - "quote" -]New value: +[ + "source", + "quote" +] - changed
Output schema / properties / changes / items / properties / options / items / properties / admitted / items / properties / link / properties / provider_url / descriptionPrevious value: -"The provider page itself, when url is this service's address that forwards to it."New value: +"The provider page itself. Only in a page made for a browser, where url is this service's address that forwards to it; MCP and REST results do not carry it." - added
Output schema / properties / changes / items / properties / options / items / properties / admitted / items / properties / link / properties / url / descriptionAdded value: +"The only address to visit the plan: this service's /go/<offer_id>?r=<token> address, which forwards to the provider page. The token is made for this response and holds nothing about you." - added
Output schema / properties / changes / items / properties / options / items / properties / admitted / items / properties / monthly_cost / properties / facts / items / properties / at_limit / properties / evidence / properties / sourceAdded value: +{ + "type": "string" +} - removed
Output schema / properties / changes / items / properties / options / items / properties / admitted / items / properties / monthly_cost / properties / facts / items / properties / at_limit / properties / evidence / properties / urlRemoved value: -{ - "type": "string" -} - added
Output schema / properties / changes / items / properties / options / items / properties / admitted / items / properties / monthly_cost / properties / facts / items / properties / evidence / items / properties / sourceAdded value: +{ + "description": "Official page the sentence was found on.", + "type": "string" +} - removed
Output schema / properties / changes / items / properties / options / items / properties / admitted / items / properties / monthly_cost / properties / facts / items / properties / evidence / items / properties / urlRemoved value: -{ - "description": "Official page the sentence was found on.", - "type": "string" -} - changed
Output schema / properties / changes / items / properties / options / items / properties / admitted / items / properties / monthly_cost / properties / facts / items / properties / evidence / items / requiredPrevious value: -[ - "url", - "quote" -]New value: +[ + "source", + "quote" +] - changed
Output schema / properties / confirm_with_provider / properties / plans / items / properties / link / properties / provider_url / descriptionPrevious value: -"The provider page itself, when url is this service's address that forwards to it."New value: +"The provider page itself. Only in a page made for a browser, where url is this service's address that forwards to it; MCP and REST results do not carry it." - added
Output schema / properties / confirm_with_provider / properties / plans / items / properties / link / properties / url / descriptionAdded value: +"The only address to visit the plan: this service's /go/<offer_id>?r=<token> address, which forwards to the provider page. The token is made for this response and holds nothing about you." - added
Output schema / properties / confirm_with_provider / properties / plans / items / properties / monthly_cost / properties / facts / items / properties / at_limit / properties / evidence / properties / sourceAdded value: +{ + "type": "string" +} - removed
Output schema / properties / confirm_with_provider / properties / plans / items / properties / monthly_cost / properties / facts / items / properties / at_limit / properties / evidence / properties / urlRemoved value: -{ - "type": "string" -} - added
Output schema / properties / confirm_with_provider / properties / plans / items / properties / monthly_cost / properties / facts / items / properties / evidence / items / properties / sourceAdded value: +{ + "description": "Official page the sentence was found on.", + "type": "string" +} - removed
Output schema / properties / confirm_with_provider / properties / plans / items / properties / monthly_cost / properties / facts / items / properties / evidence / items / properties / urlRemoved value: -{ - "description": "Official page the sentence was found on.", - "type": "string" -} - changed
Output schema / properties / confirm_with_provider / properties / plans / items / properties / monthly_cost / properties / facts / items / properties / evidence / items / requiredPrevious value: -[ - "url", - "quote" -]New value: +[ + "source", + "quote" +]
- Changed
search3 fields changed- changed
Input schema / properties / format / descriptionPrevious value: -"brief returns, per plan, the plan, provider, whether it meets all, the monthly cost and the requested conditions only, each with its verdict, a one-line reason, one source sentence and its url (about a quarter of the full size); the verdicts and costs are those of full. Call it right before choosing or buying a plan."New value: +"brief returns, per plan, the plan, provider, whether it meets all, the monthly cost and the requested conditions only, each with its verdict, a one-line reason, one source sentence and its source (about a quarter of the full size); the verdicts and costs are those of full. Call it right before choosing or buying a plan." - added
Input schema / properties / providersAdded value: +{ + "description": "Judge only the plans of these providers (candidates you already have, for example from a web search). Give provider ids or names as listed, such as \"tavily\", \"Brave Search API\" or \"You.com\"; case does not matter. Names that are not providers here are listed under unknown_providers in the result.", + "items": { + "maxLength": 80, + "minLength": 1, + "type": "string" + }, + "maxItems": 30, + "minItems": 1, + "type": "array" +} - changed
Output schema / anyOfPrevious value: -[ - { - "properties": { - "answer": { - "description": "One sentence that opens the answer: the lowest-cost plan that meets every required condition with its link, or, when none does, the closest plan with what it does not meet or what is unknown, and its link.", - "type": "string" - }, - "as_of": { - "type": "string" - }, - "assumptions": { - "items": { - "type": "string" - }, - "type": "array" - }, - "counts": { - "properties": { - "candidates": { - "type": "integer" - }, - "full": { - "type": "integer" - }, - "no_match": { - "type": "integer" - }, - "partial": { - "type": "integer" - } - }, - "required": [ - "candidates", - "full", - "partial", - "no_match" - ], - "type": "object" - }, - "full_matches": { - "items": { - "properties": { - "assumptions": { - "items": { - "type": "string" - }, - "type": "array" - }, - "at_limit": { - "description": "Present for a plan with no automatic extra usage: what the official page says happens at the limit (kind no_extra_usage or restart_by_hand), with its sentence. With a workload that needs restarts, restarts gives their count, the price of each and the total, the numbers of monthly_cost.explanation.", - "properties": { - "evidence": { - "properties": { - "quote": { - "type": "string" - }, - "url": { - "type": "string" - } - }, - "type": "object" - }, - "kind": { - "enum": [ - "no_extra_usage", - "restart_by_hand" - ] - }, - "restarts": { - "properties": { - "count": { - "properties": { - "high": { - "type": "integer" - }, - "low": { - "type": "integer" - } - }, - "type": "object" - }, - "total_usd": { - "properties": { - "high": { - "type": "number" - }, - "low": { - "type": "number" - } - }, - "type": "object" - }, - "usd_each": { - "type": "number" - } - }, - "type": "object" - }, - "text": { - "type": "string" - } - }, - "required": [ - "kind", - "text", - "evidence" - ], - "type": "object" - }, - "billing": { - "type": "string" - }, - "billing_options": { - "items": { - "type": "string" - }, - "type": "array" - }, - "checked_at": { - "type": [ - "string", - "null" - ] - }, - "conditions": { - "items": { - "properties": { - "condition": { - "type": "string" - }, - "facts": { - "description": "Facts the verdict was judged from. The monthly budget is judged from monthly_cost; its price facts are listed there only.", - "items": { - "properties": { - "also_stated_in": { - "description": "get_details only: other official machine-readable documents of the provider (llms.txt, llms-full.txt, OpenAPI files, MCP tool listings) that contain the same quoted sentences.", - "items": { - "type": "string" - }, - "type": "array" - }, - "applies_to": { - "description": "get_details only: billing options (billing) or search engines (search_engines) the fact is limited to.", - "type": [ - "object", - "null" - ] - }, - "at_limit": { - "description": "Present for a plan with no automatic extra usage: what the official page says happens at the limit (kind no_extra_usage or restart_by_hand), with its sentence. With a workload that needs restarts, restarts gives their count, the price of each and the total, the numbers of monthly_cost.explanation.", - "properties": { - "evidence": { - "properties": { - "quote": { - "type": "string" - }, - "url": { - "type": "string" - } - }, - "type": "object" - }, - "kind": { - "enum": [ - "no_extra_usage", - "restart_by_hand" - ] - }, - "restarts": { - "properties": { - "count": { - "properties": { - "high": { - "type": "integer" - }, - "low": { - "type": "integer" - } - }, - "type": "object" - }, - "total_usd": { - "properties": { - "high": { - "type": "number" - }, - "low": { - "type": "number" - } - }, - "type": "object" - }, - "usd_each": { - "type": "number" - } - }, - "type": "object" - }, - "text": { - "type": "string" - } - }, - "required": [ - "kind", - "text", - "evidence" - ], - "type": "object" - }, - "checked_at": { - "type": [ - "string", - "null" - ] - }, - "concurrency_unit": { - "description": "get_details, concurrency only: the unit the page states the value in (unit, text such as \"100 threads\"). Against concurrent requests: equals_requests (value, text and the official line of the unit rule) when the unit rule counts this unit as requests, else note \"not the same unit as concurrent requests\"; \"unit not stated\" when the page names none.", - "type": "object" - }, - "derived": { - "description": "How the value follows from the quoted sentence when it is not literal.", - "type": "string" - }, - "evidence": { - "items": { - "properties": { - "quote": { - "description": "The sentence as it appears on that page.", - "type": "string" - }, - "retrieved_at": { - "description": "Date the page was read (YYYY-MM-DD). Only with detail=full.", - "type": "string" - }, - "source_type": { - "description": "Only with detail=full.", - "enum": [ - "official_pricing", - "official_docs", - "third_party" - ] - }, - "url": { - "description": "Official page the sentence was found on.", - "type": "string" - } - }, - "required": [ - "url", - "quote" - ], - "type": "object" - }, - "type": "array" - }, - "exceptions": { - "description": "get_details only: plans with a different value.", - "type": "array" - }, - "key": { - "type": "string" - }, - "label": { - "type": "string" - }, - "level": { - "description": "Where the fact is recorded: offer (the plan), product or provider.", - "type": [ - "string", - "null" - ] - }, - "note": { - "type": "string" - }, - "stale": { - "type": "boolean" - }, - "status": { - "description": "TRUE: stated with the value; FALSE / NOT_SUPPORTED: stated as unavailable; UNKNOWN: not stated; CONFLICT: official pages disagree (value lists each version); STALE: past its recheck date; MISSING: not recorded.", - "enum": [ - "TRUE", - "FALSE", - "NOT_SUPPORTED", - "UNKNOWN", - "CONFLICT", - "STALE", - "MISSING" - ] - }, - "value": {}, - "via_exception": { - "description": "Present and true when a plan-specific exception replaced the general value.", - "type": "boolean" - } - }, - "required": [ - "key", - "status", - "value", - "level", - "evidence", - "checked_at" - ], - "type": "object" - }, - "type": "array" - }, - "label": { - "type": "string" - }, - "reason": { - "type": "string" - }, - "required": { - "type": "boolean" - }, - "verdict": { - "enum": [ - "MET", - "UNMET", - "UNKNOWN", - "UNIT_MISMATCH", - "UNIT_UNKNOWN" - ] - } - }, - "required": [ - "condition", - "label", - "required", - "verdict", - "reason", - "facts" - ], - "type": "object" - }, - "type": "array" - }, - "facts_omitted": { - "description": "search only: present and true when the source sentences under the conditions were left out so that the response fits one response; the verdicts, reasons and costs are unchanged. Ask check_conditions with the offer_id or get_details for the sentences.", - "type": "boolean" - }, - "link": { - "properties": { - "affiliate": { - "properties": { - "disclosure": { - "type": [ - "string", - "null" - ] - }, - "program": { - "type": [ - "string", - "null" - ] - }, - "status": { - "type": "string" - } - }, - "required": [ - "status" - ], - "type": "object" - }, - "landing": { - "type": "string" - }, - "link_level": { - "type": "string" - }, - "provider_url": { - "description": "The provider page itself, when url is this service's address that forwards to it.", - "type": "string" - }, - "url": { - "type": "string" - } - }, - "required": [ - "url", - "landing", - "link_level", - "affiliate" - ], - "type": "object" - }, - "listed": { - "type": "boolean" - }, - "match": { - "enum": [ - "FULL_MATCH", - "PARTIAL_MATCH", - "NO_MATCH" - ] - }, - "meets_all": { - "description": "Judged against the required conditions of this call only: true when every one is met, false when one is not met, \"unknown\" when none fails and one is not stated on the official pages.", - "enum": [ - true, - false, - "unknown" - ] - }, - "monthly_cost": { - "properties": { - "explanation": { - "type": "string" - }, - "facts": { - "description": "Price facts the cost was computed from.", - "items": { - "properties": { - "also_stated_in": { - "description": "get_details only: other official machine-readable documents of the provider (llms.txt, llms-full.txt, OpenAPI files, MCP tool listings) that contain the same quoted sentences.", - "items": { - "type": "string" - }, - "type": "array" - }, - "applies_to": { - "description": "get_details only: billing options (billing) or search engines (search_engines) the fact is limited to.", - "type": [ - "object", - "null" - ] - }, - "at_limit": { - "description": "Present for a plan with no automatic extra usage: what the official page says happens at the limit (kind no_extra_usage or restart_by_hand), with its sentence. With a workload that needs restarts, restarts gives their count, the price of each and the total, the numbers of monthly_cost.explanation.", - "properties": { - "evidence": { - "properties": { - "quote": { - "type": "string" - }, - "url": { - "type": "string" - } - }, - "type": "object" - }, - "kind": { - "enum": [ - "no_extra_usage", - "restart_by_hand" - ] - }, - "restarts": { - "properties": { - "count": { - "properties": { - "high": { - "type": "integer" - }, - "low": { - "type": "integer" - } - }, - "type": "object" - }, - "total_usd": { - "properties": { - "high": { - "type": "number" - }, - "low": { - "type": "number" - } - }, - "type": "object" - }, - "usd_each": { - "type": "number" - } - }, - "type": "object" - }, - "text": { - "type": "string" - } - }, - "required": [ - "kind", - "text", - "evidence" - ], - "type": "object" - }, - "checked_at": { - "type": [ - "string", - "null" - ] - }, - "concurrency_unit": { - "description": "get_details, concurrency only: the unit the page states the value in (unit, text such as \"100 threads\"). Against concurrent requests: equals_requests (value, text and the official line of the unit rule) when the unit rule counts this unit as requests, else note \"not the same unit as concurrent requests\"; \"unit not stated\" when the page names none.", - "type": "object" - }, - "derived": { - "description": "How the value follows from the quoted sentence when it is not literal.", - "type": "string" - }, - "evidence": { - "items": { - "properties": { - "quote": { - "description": "The sentence as it appears on that page.", - "type": "string" - }, - "retrieved_at": { - "description": "Date the page was read (YYYY-MM-DD). Only with detail=full.", - "type": "string" - }, - "source_type": { - "description": "Only with detail=full.", - "enum": [ - "official_pricing", - "official_docs", - "third_party" - ] - }, - "url": { - "description": "Official page the sentence was found on.", - "type": "string" - } - }, - "required": [ - "url", - "quote" - ], - "type": "object" - }, - "type": "array" - }, - "exceptions": { - "description": "get_details only: plans with a different value.", - "type": "array" - }, - "key": { - "type": "string" - }, - "label": { - "type": "string" - }, - "level": { - "description": "Where the fact is recorded: offer (the plan), product or provider.", - "type": [ - "string", - "null" - ] - }, - "note": { - "type": "string" - }, - "stale": { - "type": "boolean" - }, - "status": { - "description": "TRUE: stated with the value; FALSE / NOT_SUPPORTED: stated as unavailable; UNKNOWN: not stated; CONFLICT: official pages disagree (value lists each version); STALE: past its recheck date; MISSING: not recorded.", - "enum": [ - "TRUE", - "FALSE", - "NOT_SUPPORTED", - "UNKNOWN", - "CONFLICT", - "STALE", - "MISSING" - ] - }, - "value": {}, - "via_exception": { - "description": "Present and true when a plan-specific exception replaced the general value.", - "type": "boolean" - } - }, - "required": [ - "key", - "status", - "value", - "level", - "evidence", - "checked_at" - ], - "type": "object" - }, - "type": "array" - }, - "high": { - "type": [ - "number", - "null" - ] - }, - "low": { - "type": [ - "number", - "null" - ] - }, - "lower_bound": { - "type": [ - "number", - "null" - ] - }, - "status": { - "enum": [ - "exact", - "range", - "lower_bound", - "unknown" - ] - }, - "upfront_usd": { - "type": [ - "number", - "null" - ] - }, - "usd": { - "type": [ - "number", - "null" - ] - } - }, - "required": [ - "status", - "usd", - "explanation" - ], - "type": "object" - }, - "offer_id": { - "type": "string" - }, - "offer_name": { - "type": "string" - }, - "page_url": { - "type": "string" - }, - "preferred_met": { - "type": "integer" - }, - "prices_exclude_tax": { - "type": [ - "boolean", - "null" - ] - }, - "product_id": { - "type": "string" - }, - "product_name": { - "type": "string" - }, - "provider_id": { - "type": "string" - }, - "provider_name": { - "type": "string" - }, - "unknown_conditions": { - "items": { - "type": "string" - }, - "type": "array" - }, - "unmet_conditions": { - "items": { - "type": "string" - }, - "type": "array" - }, - "verdict": { - "description": "One sentence: the conditions met, or the ones not met or not stated, with the reason.", - "type": "string" - } - }, - "required": [ - "offer_id", - "offer_name", - "product_id", - "provider_name", - "match", - "meets_all", - "verdict", - "billing", - "monthly_cost", - "conditions", - "unmet_conditions", - "unknown_conditions", - "link", - "checked_at" - ], - "type": "object" - }, - "type": "array" - }, - "link_notes": { - "additionalProperties": { - "type": "string" - }, - "description": "The note of each link level (link.link_level) of the plans in this result, stated once.", - "type": "object" - }, - "needs_input": { - "items": { - "properties": { - "field": { - "type": "string" - }, - "reason": { - "type": "string" - } - }, - "required": [ - "field", - "reason" - ], - "type": "object" - }, - "type": "array" - }, - "notes": { - "items": { - "type": "string" - }, - "type": "array" - }, - "partial_matches": { - "items": { - "properties": { - "assumptions": { - "items": { - "type": "string" - }, - "type": "array" - }, - "at_limit": { - "description": "Present for a plan with no automatic extra usage: what the official page says happens at the limit (kind no_extra_usage or restart_by_hand), with its sentence. With a workload that needs restarts, restarts gives their count, the price of each and the total, the numbers of monthly_cost.explanation.", - "properties": { - "evidence": { - "properties": { - "quote": { - "type": "string" - }, - "url": { - "type": "string" - } - }, - "type": "object" - }, - "kind": { - "enum": [ - "no_extra_usage", - "restart_by_hand" - ] - }, - "restarts": { - "properties": { - "count": { - "properties": { - "high": { - "type": "integer" - }, - "low": { - "type": "integer" - } - }, - "type": "object" - }, - "total_usd": { - "properties": { - "high": { - "type": "number" - }, - "low": { - "type": "number" - } - }, - "type": "object" - }, - "usd_each": { - "type": "number" - } - }, - "type": "object" - }, - "text": { - "type": "string" - } - }, - "required": [ - "kind", - "text", - "evidence" - ], - "type": "object" - }, - "billing": { - "type": "string" - }, - "billing_options": { - "items": { - "type": "string" - }, - "type": "array" - }, - "checked_at": { - "type": [ - "string", - "null" - ] - }, - "conditions": { - "items": { - "properties": { - "condition": { - "type": "string" - }, - "facts": { - "description": "Facts the verdict was judged from. The monthly budget is judged from monthly_cost; its price facts are listed there only.", - "items": { - "properties": { - "also_stated_in": { - "description": "get_details only: other official machine-readable documents of the provider (llms.txt, llms-full.txt, OpenAPI files, MCP tool listings) that contain the same quoted sentences.", - "items": { - "type": "string" - }, - "type": "array" - }, - "applies_to": { - "description": "get_details only: billing options (billing) or search engines (search_engines) the fact is limited to.", - "type": [ - "object", - "null" - ] - }, - "at_limit": { - "description": "Present for a plan with no automatic extra usage: what the official page says happens at the limit (kind no_extra_usage or restart_by_hand), with its sentence. With a workload that needs restarts, restarts gives their count, the price of each and the total, the numbers of monthly_cost.explanation.", - "properties": { - "evidence": { - "properties": { - "quote": { - "type": "string" - }, - "url": { - "type": "string" - } - }, - "type": "object" - }, - "kind": { - "enum": [ - "no_extra_usage", - "restart_by_hand" - ] - }, - "restarts": { - "properties": { - "count": { - "properties": { - "high": { - "type": "integer" - }, - "low": { - "type": "integer" - } - }, - "type": "object" - }, - "total_usd": { - "properties": { - "high": { - "type": "number" - }, - "low": { - "type": "number" - } - }, - "type": "object" - }, - "usd_each": { - "type": "number" - } - }, - "type": "object" - }, - "text": { - "type": "string" - } - }, - "required": [ - "kind", - "text", - "evidence" - ], - "type": "object" - }, - "checked_at": { - "type": [ - "string", - "null" - ] - }, - "concurrency_unit": { - "description": "get_details, concurrency only: the unit the page states the value in (unit, text such as \"100 threads\"). Against concurrent requests: equals_requests (value, text and the official line of the unit rule) when the unit rule counts this unit as requests, else note \"not the same unit as concurrent requests\"; \"unit not stated\" when the page names none.", - "type": "object" - }, - "derived": { - "description": "How the value follows from the quoted sentence when it is not literal.", - "type": "string" - }, - "evidence": { - "items": { - "properties": { - "quote": { - "description": "The sentence as it appears on that page.", - "type": "string" - }, - "retrieved_at": { - "description": "Date the page was read (YYYY-MM-DD). Only with detail=full.", - "type": "string" - }, - "source_type": { - "description": "Only with detail=full.", - "enum": [ - "official_pricing", - "official_docs", - "third_party" - ] - }, - "url": { - "description": "Official page the sentence was found on.", - "type": "string" - } - }, - "required": [ - "url", - "quote" - ], - "type": "object" - }, - "type": "array" - }, - "exceptions": { - "description": "get_details only: plans with a different value.", - "type": "array" - }, - "key": { - "type": "string" - }, - "label": { - "type": "string" - }, - "level": { - "description": "Where the fact is recorded: offer (the plan), product or provider.", - "type": [ - "string", - "null" - ] - }, - "note": { - "type": "string" - }, - "stale": { - "type": "boolean" - }, - "status": { - "description": "TRUE: stated with the value; FALSE / NOT_SUPPORTED: stated as unavailable; UNKNOWN: not stated; CONFLICT: official pages disagree (value lists each version); STALE: past its recheck date; MISSING: not recorded.", - "enum": [ - "TRUE", - "FALSE", - "NOT_SUPPORTED", - "UNKNOWN", - "CONFLICT", - "STALE", - "MISSING" - ] - }, - "value": {}, - "via_exception": { - "description": "Present and true when a plan-specific exception replaced the general value.", - "type": "boolean" - } - }, - "required": [ - "key", - "status", - "value", - "level", - "evidence", - "checked_at" - ], - "type": "object" - }, - "type": "array" - }, - "label": { - "type": "string" - }, - "reason": { - "type": "string" - }, - "required": { - "type": "boolean" - }, - "verdict": { - "enum": [ - "MET", - "UNMET", - "UNKNOWN", - "UNIT_MISMATCH", - "UNIT_UNKNOWN" - ] - } - }, - "required": [ - "condition", - "label", - "required", - "verdict", - "reason", - "facts" - ], - "type": "object" - }, - "type": "array" - }, - "facts_omitted": { - "description": "search only: present and true when the source sentences under the conditions were left out so that the response fits one response; the verdicts, reasons and costs are unchanged. Ask check_conditions with the offer_id or get_details for the sentences.", - "type": "boolean" - }, - "link": { - "properties": { - "affiliate": { - "properties": { - "disclosure": { - "type": [ - "string", - "null" - ] - }, - "program": { - "type": [ - "string", - "null" - ] - }, - "status": { - "type": "string" - } - }, - "required": [ - "status" - ], - "type": "object" - }, - "landing": { - "type": "string" - }, - "link_level": { - "type": "string" - }, - "provider_url": { - "description": "The provider page itself, when url is this service's address that forwards to it.", - "type": "string" - }, - "url": { - "type": "string" - } - }, - "required": [ - "url", - "landing", - "link_level", - "affiliate" - ], - "type": "object" - }, - "listed": { - "type": "boolean" - }, - "match": { - "enum": [ - "FULL_MATCH", - "PARTIAL_MATCH", - "NO_MATCH" - ] - }, - "meets_all": { - "description": "Judged against the required conditions of this call only: true when every one is met, false when one is not met, \"unknown\" when none fails and one is not stated on the official pages.", - "enum": [ - true, - false, - "unknown" - ] - }, - "monthly_cost": { - "properties": { - "explanation": { - "type": "string" - }, - "facts": { - "description": "Price facts the cost was computed from.", - "items": { - "properties": { - "also_stated_in": { - "description": "get_details only: other official machine-readable documents of the provider (llms.txt, llms-full.txt, OpenAPI files, MCP tool listings) that contain the same quoted sentences.", - "items": { - "type": "string" - }, - "type": "array" - }, - "applies_to": { - "description": "get_details only: billing options (billing) or search engines (search_engines) the fact is limited to.", - "type": [ - "object", - "null" - ] - }, - "at_limit": { - "description": "Present for a plan with no automatic extra usage: what the official page says happens at the limit (kind no_extra_usage or restart_by_hand), with its sentence. With a workload that needs restarts, restarts gives their count, the price of each and the total, the numbers of monthly_cost.explanation.", - "properties": { - "evidence": { - "properties": { - "quote": { - "type": "string" - }, - "url": { - "type": "string" - } - }, - "type": "object" - }, - "kind": { - "enum": [ - "no_extra_usage", - "restart_by_hand" - ] - }, - "restarts": { - "properties": { - "count": { - "properties": { - "high": { - "type": "integer" - }, - "low": { - "type": "integer" - } - }, - "type": "object" - }, - "total_usd": { - "properties": { - "high": { - "type": "number" - }, - "low": { - "type": "number" - } - }, - "type": "object" - }, - "usd_each": { - "type": "number" - } - }, - "type": "object" - }, - "text": { - "type": "string" - } - }, - "required": [ - "kind", - "text", - "evidence" - ], - "type": "object" - }, - "checked_at": { - "type": [ - "string", - "null" - ] - }, - "concurrency_unit": { - "description": "get_details, concurrency only: the unit the page states the value in (unit, text such as \"100 threads\"). Against concurrent requests: equals_requests (value, text and the official line of the unit rule) when the unit rule counts this unit as requests, else note \"not the same unit as concurrent requests\"; \"unit not stated\" when the page names none.", - "type": "object" - }, - "derived": { - "description": "How the value follows from the quoted sentence when it is not literal.", - "type": "string" - }, - "evidence": { - "items": { - "properties": { - "quote": { - "description": "The sentence as it appears on that page.", - "type": "string" - }, - "retrieved_at": { - "description": "Date the page was read (YYYY-MM-DD). Only with detail=full.", - "type": "string" - }, - "source_type": { - "description": "Only with detail=full.", - "enum": [ - "official_pricing", - "official_docs", - "third_party" - ] - }, - "url": { - "description": "Official page the sentence was found on.", - "type": "string" - } - }, - "required": [ - "url", - "quote" - ], - "type": "object" - }, - "type": "array" - }, - "exceptions": { - "description": "get_details only: plans with a different value.", - "type": "array" - }, - "key": { - "type": "string" - }, - "label": { - "type": "string" - }, - "level": { - "description": "Where the fact is recorded: offer (the plan), product or provider.", - "type": [ - "string", - "null" - ] - }, - "note": { - "type": "string" - }, - "stale": { - "type": "boolean" - }, - "status": { - "description": "TRUE: stated with the value; FALSE / NOT_SUPPORTED: stated as unavailable; UNKNOWN: not stated; CONFLICT: official pages disagree (value lists each version); STALE: past its recheck date; MISSING: not recorded.", - "enum": [ - "TRUE", - "FALSE", - "NOT_SUPPORTED", - "UNKNOWN", - "CONFLICT", - "STALE", - "MISSING" - ] - }, - "value": {}, - "via_exception": { - "description": "Present and true when a plan-specific exception replaced the general value.", - "type": "boolean" - } - }, - "required": [ - "key", - "status", - "value", - "level", - "evidence", - "checked_at" - ], - "type": "object" - }, - "type": "array" - }, - "high": { - "type": [ - "number", - "null" - ] - }, - "low": { - "type": [ - "number", - "null" - ] - }, - "lower_bound": { - "type": [ - "number", - "null" - ] - }, - "status": { - "enum": [ - "exact", - "range", - "lower_bound", - "unknown" - ] - }, - "upfront_usd": { - "type": [ - "number", - "null" - ] - }, - "usd": { - "type": [ - "number", - "null" - ] - } - }, - "required": [ - "status", - "usd", - "explanation" - ], - "type": "object" - }, - "offer_id": { - "type": "string" - }, - "offer_name": { - "type": "string" - }, - "page_url": { - "type": "string" - }, - "preferred_met": { - "type": "integer" - }, - "prices_exclude_tax": { - "type": [ - "boolean", - "null" - ] - }, - "product_id": { - "type": "string" - }, - "product_name": { - "type": "string" - }, - "provider_id": { - "type": "string" - }, - "provider_name": { - "type": "string" - }, - "unknown_conditions": { - "items": { - "type": "string" - }, - "type": "array" - }, - "unmet_conditions": { - "items": { - "type": "string" - }, - "type": "array" - }, - "verdict": { - "description": "One sentence: the conditions met, or the ones not met or not stated, with the reason.", - "type": "string" - } - }, - "required": [ - "offer_id", - "offer_name", - "product_id", - "provider_name", - "match", - "meets_all", - "verdict", - "billing", - "monthly_cost", - "conditions", - "unmet_conditions", - "unknown_conditions", - "link", - "checked_at" - ], - "type": "object" - }, - "type": "array" - }, - "request": { - "type": "object" - }, - "zero_result": { - "properties": { - "conditions": { - "items": { - "properties": { - "closest": { - "description": "The cheapest plan that meets every other required condition but not this one. It does not meet the request (meets_all false or \"unknown\").", - "properties": { - "billing": { - "type": "string" - }, - "fails": { - "type": "string" - }, - "meets_all": { - "description": "Judged against the required conditions of this call only: true when every one is met, false when one is not met, \"unknown\" when none fails and one is not stated on the official pages.", - "enum": [ - true, - false, - "unknown" - ] - }, - "monthly_cost": { - "type": "object" - }, - "offer_id": { - "type": "string" - }, - "offer_name": { - "type": "string" - }, - "page_url": { - "type": "string" - }, - "provider_name": { - "type": "string" - } - }, - "required": [ - "offer_id", - "offer_name", - "provider_name", - "billing", - "monthly_cost", - "meets_all", - "fails" - ], - "type": [ - "object", - "null" - ] - }, - "condition": { - "type": "string" - }, - "excluded": { - "type": "integer" - }, - "label": { - "type": "string" - }, - "unknown": { - "type": "integer" - }, - "would_match_if_relaxed": { - "type": "integer" - } - }, - "required": [ - "condition", - "label", - "excluded", - "would_match_if_relaxed", - "closest" - ], - "type": "object" - }, - "type": "array" - }, - "note": { - "type": "string" - } - }, - "type": [ - "object", - "null" - ] - } - }, - "required": [ - "answer", - "as_of", - "needs_input", - "counts", - "full_matches", - "partial_matches", - "zero_result", - "assumptions", - "notes" - ], - "type": "object" - }, - { - "properties": { - "answer": { - "type": "string" - }, - "as_of": { - "type": "string" - }, - "counts": { - "properties": { - "candidates": { - "type": "integer" - }, - "full": { - "type": "integer" - }, - "no_match": { - "type": "integer" - }, - "partial": { - "type": "integer" - } - }, - "required": [ - "candidates", - "full", - "partial", - "no_match" - ], - "type": "object" - }, - "format": { - "enum": [ - "brief" - ] - }, - "full_matches": { - "items": { - "properties": { - "conditions": { - "items": { - "properties": { - "condition": { - "type": "string" - }, - "quote": { - "description": "One official source sentence, 200 characters at most.", - "type": "string" - }, - "reason": { - "description": "One line, 120 characters at most.", - "type": "string" - }, - "required": { - "description": "Present only on a preferred (nice-to-have) condition.", - "enum": [ - false - ] - }, - "url": { - "type": [ - "string", - "null" - ] - }, - "verdict": { - "enum": [ - "MET", - "UNMET", - "UNKNOWN", - "UNIT_MISMATCH", - "UNIT_UNKNOWN" - ] - } - }, - "required": [ - "condition", - "verdict", - "reason" - ], - "type": "object" - }, - "type": "array" - }, - "match": { - "enum": [ - "FULL_MATCH", - "PARTIAL_MATCH", - "NO_MATCH" - ] - }, - "meets_all": { - "description": "Judged against the required conditions of this call only: true when every one is met, false when one is not met, \"unknown\" when none fails and one is not stated on the official pages.", - "enum": [ - true, - false, - "unknown" - ] - }, - "monthly_cost": { - "description": "status, usd, and low, high or lower_bound when they differ; as in the full result.", - "type": "object" - }, - "offer_id": { - "type": "string" - }, - "offer_name": { - "type": "string" - }, - "provider": { - "type": "string" - } - }, - "required": [ - "offer_id", - "offer_name", - "provider", - "meets_all", - "monthly_cost", - "conditions" - ], - "type": "object" - }, - "type": "array" - }, - "more_note": { - "type": "string" - }, - "more_plans": { - "description": "Matching plans left out of the short list: limit is the number of plans in all, fully matching first.", - "type": "integer" - }, - "needs_input": { - "items": { - "properties": { - "field": { - "type": "string" - }, - "reason": { - "type": "string" - } - }, - "required": [ - "field", - "reason" - ], - "type": "object" - }, - "type": "array" - }, - "partial_matches": { - "items": { - "properties": { - "conditions": { - "items": { - "properties": { - "condition": { - "type": "string" - }, - "quote": { - "description": "One official source sentence, 200 characters at most.", - "type": "string" - }, - "reason": { - "description": "One line, 120 characters at most.", - "type": "string" - }, - "required": { - "description": "Present only on a preferred (nice-to-have) condition.", - "enum": [ - false - ] - }, - "url": { - "type": [ - "string", - "null" - ] - }, - "verdict": { - "enum": [ - "MET", - "UNMET", - "UNKNOWN", - "UNIT_MISMATCH", - "UNIT_UNKNOWN" - ] - } - }, - "required": [ - "condition", - "verdict", - "reason" - ], - "type": "object" - }, - "type": "array" - }, - "match": { - "enum": [ - "FULL_MATCH", - "PARTIAL_MATCH", - "NO_MATCH" - ] - }, - "meets_all": { - "description": "Judged against the required conditions of this call only: true when every one is met, false when one is not met, \"unknown\" when none fails and one is not stated on the official pages.", - "enum": [ - true, - false, - "unknown" - ] - }, - "monthly_cost": { - "description": "status, usd, and low, high or lower_bound when they differ; as in the full result.", - "type": "object" - }, - "offer_id": { - "type": "string" - }, - "offer_name": { - "type": "string" - }, - "provider": { - "type": "string" - } - }, - "required": [ - "offer_id", - "offer_name", - "provider", - "meets_all", - "monthly_cost", - "conditions" - ], - "type": "object" - }, - "type": "array" - }, - "zero_result": { - "properties": { - "conditions": { - "items": { - "properties": { - "closest": { - "description": "The cheapest plan that meets every other required condition but not this one. It does not meet the request (meets_all false or \"unknown\").", - "properties": { - "billing": { - "type": "string" - }, - "fails": { - "type": "string" - }, - "meets_all": { - "description": "Judged against the required conditions of this call only: true when every one is met, false when one is not met, \"unknown\" when none fails and one is not stated on the official pages.", - "enum": [ - true, - false, - "unknown" - ] - }, - "monthly_cost": { - "type": "object" - }, - "offer_id": { - "type": "string" - }, - "offer_name": { - "type": "string" - }, - "page_url": { - "type": "string" - }, - "provider_name": { - "type": "string" - } - }, - "required": [ - "offer_id", - "offer_name", - "provider_name", - "billing", - "monthly_cost", - "meets_all", - "fails" - ], - "type": [ - "object", - "null" - ] - }, - "condition": { - "type": "string" - }, - "excluded": { - "type": "integer" - }, - "label": { - "type": "string" - }, - "unknown": { - "type": "integer" - }, - "would_match_if_relaxed": { - "type": "integer" - } - }, - "required": [ - "condition", - "label", - "excluded", - "would_match_if_relaxed", - "closest" - ], - "type": "object" - }, - "type": "array" - }, - "note": { - "type": "string" - } - }, - "type": [ - "object", - "null" - ] - } - }, - "required": [ - "format", - "answer", - "as_of", - "needs_input", - "counts", - "full_matches", - "partial_matches" - ], - "type": "object" - } -]New value: +[ + { + "properties": { + "answer": { + "description": "One sentence that opens the answer: the lowest-cost plan that meets every required condition with its link, or, when none does, the closest plan with what it does not meet or what is unknown, and its link.", + "type": "string" + }, + "as_of": { + "type": "string" + }, + "assumptions": { + "items": { + "type": "string" + }, + "type": "array" + }, + "counts": { + "properties": { + "candidates": { + "type": "integer" + }, + "full": { + "type": "integer" + }, + "no_match": { + "type": "integer" + }, + "partial": { + "type": "integer" + } + }, + "required": [ + "candidates", + "full", + "partial", + "no_match" + ], + "type": "object" + }, + "full_matches": { + "items": { + "properties": { + "assumptions": { + "items": { + "type": "string" + }, + "type": "array" + }, + "at_limit": { + "description": "Present for a plan with no automatic extra usage: what the official page says happens at the limit (kind no_extra_usage or restart_by_hand), with its sentence. With a workload that needs restarts, restarts gives their count, the price of each and the total, the numbers of monthly_cost.explanation.", + "properties": { + "evidence": { + "properties": { + "quote": { + "type": "string" + }, + "source": { + "type": "string" + } + }, + "type": "object" + }, + "kind": { + "enum": [ + "no_extra_usage", + "restart_by_hand" + ] + }, + "restarts": { + "properties": { + "count": { + "properties": { + "high": { + "type": "integer" + }, + "low": { + "type": "integer" + } + }, + "type": "object" + }, + "total_usd": { + "properties": { + "high": { + "type": "number" + }, + "low": { + "type": "number" + } + }, + "type": "object" + }, + "usd_each": { + "type": "number" + } + }, + "type": "object" + }, + "text": { + "type": "string" + } + }, + "required": [ + "kind", + "text", + "evidence" + ], + "type": "object" + }, + "billing": { + "type": "string" + }, + "billing_options": { + "items": { + "type": "string" + }, + "type": "array" + }, + "checked_at": { + "type": [ + "string", + "null" + ] + }, + "conditions": { + "items": { + "properties": { + "condition": { + "type": "string" + }, + "facts": { + "description": "Facts the verdict was judged from. The monthly budget is judged from monthly_cost; its price facts are listed there only.", + "items": { + "properties": { + "also_stated_in": { + "description": "get_details only: other official machine-readable documents of the provider (llms.txt, llms-full.txt, OpenAPI files, MCP tool listings) that contain the same quoted sentences.", + "items": { + "type": "string" + }, + "type": "array" + }, + "applies_to": { + "description": "get_details only: billing options (billing) or search engines (search_engines) the fact is limited to.", + "type": [ + "object", + "null" + ] + }, + "at_limit": { + "description": "Present for a plan with no automatic extra usage: what the official page says happens at the limit (kind no_extra_usage or restart_by_hand), with its sentence. With a workload that needs restarts, restarts gives their count, the price of each and the total, the numbers of monthly_cost.explanation.", + "properties": { + "evidence": { + "properties": { + "quote": { + "type": "string" + }, + "source": { + "type": "string" + } + }, + "type": "object" + }, + "kind": { + "enum": [ + "no_extra_usage", + "restart_by_hand" + ] + }, + "restarts": { + "properties": { + "count": { + "properties": { + "high": { + "type": "integer" + }, + "low": { + "type": "integer" + } + }, + "type": "object" + }, + "total_usd": { + "properties": { + "high": { + "type": "number" + }, + "low": { + "type": "number" + } + }, + "type": "object" + }, + "usd_each": { + "type": "number" + } + }, + "type": "object" + }, + "text": { + "type": "string" + } + }, + "required": [ + "kind", + "text", + "evidence" + ], + "type": "object" + }, + "checked_at": { + "type": [ + "string", + "null" + ] + }, + "concurrency_unit": { + "description": "get_details, concurrency only: the unit the page states the value in (unit, text such as \"100 threads\"). Against concurrent requests: equals_requests (value, text and the official line of the unit rule) when the unit rule counts this unit as requests, else note \"not the same unit as concurrent requests\"; \"unit not stated\" when the page names none.", + "type": "object" + }, + "derived": { + "description": "How the value follows from the quoted sentence when it is not literal.", + "type": "string" + }, + "evidence": { + "items": { + "properties": { + "quote": { + "description": "The sentence as it appears on that page.", + "type": "string" + }, + "retrieved_at": { + "description": "Date the page was read (YYYY-MM-DD). Only with detail=full.", + "type": "string" + }, + "source": { + "description": "Official page the sentence was found on.", + "type": "string" + }, + "source_type": { + "description": "Only with detail=full.", + "enum": [ + "official_pricing", + "official_docs", + "third_party" + ] + } + }, + "required": [ + "source", + "quote" + ], + "type": "object" + }, + "type": "array" + }, + "exceptions": { + "description": "get_details only: plans with a different value.", + "type": "array" + }, + "key": { + "type": "string" + }, + "label": { + "type": "string" + }, + "level": { + "description": "Where the fact is recorded: offer (the plan), product or provider.", + "type": [ + "string", + "null" + ] + }, + "note": { + "type": "string" + }, + "stale": { + "type": "boolean" + }, + "status": { + "description": "TRUE: stated with the value; FALSE / NOT_SUPPORTED: stated as unavailable; UNKNOWN: not stated; CONFLICT: official pages disagree (value lists each version); STALE: past its recheck date; MISSING: not recorded.", + "enum": [ + "TRUE", + "FALSE", + "NOT_SUPPORTED", + "UNKNOWN", + "CONFLICT", + "STALE", + "MISSING" + ] + }, + "value": {}, + "via_exception": { + "description": "Present and true when a plan-specific exception replaced the general value.", + "type": "boolean" + } + }, + "required": [ + "key", + "status", + "value", + "level", + "evidence", + "checked_at" + ], + "type": "object" + }, + "type": "array" + }, + "label": { + "type": "string" + }, + "reason": { + "type": "string" + }, + "required": { + "type": "boolean" + }, + "verdict": { + "enum": [ + "MET", + "UNMET", + "UNKNOWN", + "UNIT_MISMATCH", + "UNIT_UNKNOWN" + ] + } + }, + "required": [ + "condition", + "label", + "required", + "verdict", + "reason", + "facts" + ], + "type": "object" + }, + "type": "array" + }, + "facts_omitted": { + "description": "search only: present and true when the source sentences under the conditions were left out so that the response fits one response; the verdicts, reasons and costs are unchanged. Ask check_conditions with the offer_id or get_details for the sentences.", + "type": "boolean" + }, + "link": { + "properties": { + "affiliate": { + "properties": { + "disclosure": { + "type": [ + "string", + "null" + ] + }, + "program": { + "type": [ + "string", + "null" + ] + }, + "status": { + "type": "string" + } + }, + "required": [ + "status" + ], + "type": "object" + }, + "landing": { + "type": "string" + }, + "link_level": { + "type": "string" + }, + "provider_url": { + "description": "The provider page itself. Only in a page made for a browser, where url is this service's address that forwards to it; MCP and REST results do not carry it.", + "type": "string" + }, + "url": { + "description": "The only address to visit the plan: this service's /go/<offer_id>?r=<token> address, which forwards to the provider page. The token is made for this response and holds nothing about you.", + "type": "string" + } + }, + "required": [ + "url", + "landing", + "link_level", + "affiliate" + ], + "type": "object" + }, + "listed": { + "type": "boolean" + }, + "match": { + "enum": [ + "FULL_MATCH", + "PARTIAL_MATCH", + "NO_MATCH" + ] + }, + "meets_all": { + "description": "Judged against the required conditions of this call only: true when every one is met, false when one is not met, \"unknown\" when none fails and one is not stated on the official pages.", + "enum": [ + true, + false, + "unknown" + ] + }, + "monthly_cost": { + "properties": { + "explanation": { + "type": "string" + }, + "facts": { + "description": "Price facts the cost was computed from.", + "items": { + "properties": { + "also_stated_in": { + "description": "get_details only: other official machine-readable documents of the provider (llms.txt, llms-full.txt, OpenAPI files, MCP tool listings) that contain the same quoted sentences.", + "items": { + "type": "string" + }, + "type": "array" + }, + "applies_to": { + "description": "get_details only: billing options (billing) or search engines (search_engines) the fact is limited to.", + "type": [ + "object", + "null" + ] + }, + "at_limit": { + "description": "Present for a plan with no automatic extra usage: what the official page says happens at the limit (kind no_extra_usage or restart_by_hand), with its sentence. With a workload that needs restarts, restarts gives their count, the price of each and the total, the numbers of monthly_cost.explanation.", + "properties": { + "evidence": { + "properties": { + "quote": { + "type": "string" + }, + "source": { + "type": "string" + } + }, + "type": "object" + }, + "kind": { + "enum": [ + "no_extra_usage", + "restart_by_hand" + ] + }, + "restarts": { + "properties": { + "count": { + "properties": { + "high": { + "type": "integer" + }, + "low": { + "type": "integer" + } + }, + "type": "object" + }, + "total_usd": { + "properties": { + "high": { + "type": "number" + }, + "low": { + "type": "number" + } + }, + "type": "object" + }, + "usd_each": { + "type": "number" + } + }, + "type": "object" + }, + "text": { + "type": "string" + } + }, + "required": [ + "kind", + "text", + "evidence" + ], + "type": "object" + }, + "checked_at": { + "type": [ + "string", + "null" + ] + }, + "concurrency_unit": { + "description": "get_details, concurrency only: the unit the page states the value in (unit, text such as \"100 threads\"). Against concurrent requests: equals_requests (value, text and the official line of the unit rule) when the unit rule counts this unit as requests, else note \"not the same unit as concurrent requests\"; \"unit not stated\" when the page names none.", + "type": "object" + }, + "derived": { + "description": "How the value follows from the quoted sentence when it is not literal.", + "type": "string" + }, + "evidence": { + "items": { + "properties": { + "quote": { + "description": "The sentence as it appears on that page.", + "type": "string" + }, + "retrieved_at": { + "description": "Date the page was read (YYYY-MM-DD). Only with detail=full.", + "type": "string" + }, + "source": { + "description": "Official page the sentence was found on.", + "type": "string" + }, + "source_type": { + "description": "Only with detail=full.", + "enum": [ + "official_pricing", + "official_docs", + "third_party" + ] + } + }, + "required": [ + "source", + "quote" + ], + "type": "object" + }, + "type": "array" + }, + "exceptions": { + "description": "get_details only: plans with a different value.", + "type": "array" + }, + "key": { + "type": "string" + }, + "label": { + "type": "string" + }, + "level": { + "description": "Where the fact is recorded: offer (the plan), product or provider.", + "type": [ + "string", + "null" + ] + }, + "note": { + "type": "string" + }, + "stale": { + "type": "boolean" + }, + "status": { + "description": "TRUE: stated with the value; FALSE / NOT_SUPPORTED: stated as unavailable; UNKNOWN: not stated; CONFLICT: official pages disagree (value lists each version); STALE: past its recheck date; MISSING: not recorded.", + "enum": [ + "TRUE", + "FALSE", + "NOT_SUPPORTED", + "UNKNOWN", + "CONFLICT", + "STALE", + "MISSING" + ] + }, + "value": {}, + "via_exception": { + "description": "Present and true when a plan-specific exception replaced the general value.", + "type": "boolean" + } + }, + "required": [ + "key", + "status", + "value", + "level", + "evidence", + "checked_at" + ], + "type": "object" + }, + "type": "array" + }, + "high": { + "type": [ + "number", + "null" + ] + }, + "low": { + "type": [ + "number", + "null" + ] + }, + "lower_bound": { + "type": [ + "number", + "null" + ] + }, + "status": { + "enum": [ + "exact", + "range", + "lower_bound", + "unknown" + ] + }, + "upfront_usd": { + "type": [ + "number", + "null" + ] + }, + "usd": { + "type": [ + "number", + "null" + ] + } + }, + "required": [ + "status", + "usd", + "explanation" + ], + "type": "object" + }, + "offer_id": { + "type": "string" + }, + "offer_name": { + "type": "string" + }, + "page_url": { + "type": "string" + }, + "preferred_met": { + "type": "integer" + }, + "prices_exclude_tax": { + "type": [ + "boolean", + "null" + ] + }, + "product_id": { + "type": "string" + }, + "product_name": { + "type": "string" + }, + "provider_id": { + "type": "string" + }, + "provider_name": { + "type": "string" + }, + "unknown_conditions": { + "items": { + "type": "string" + }, + "type": "array" + }, + "unmet_conditions": { + "items": { + "type": "string" + }, + "type": "array" + }, + "verdict": { + "description": "One sentence: the conditions met, or the ones not met or not stated, with the reason.", + "type": "string" + } + }, + "required": [ + "offer_id", + "offer_name", + "product_id", + "provider_name", + "match", + "meets_all", + "verdict", + "billing", + "monthly_cost", + "conditions", + "unmet_conditions", + "unknown_conditions", + "link", + "checked_at" + ], + "type": "object" + }, + "type": "array" + }, + "link_notes": { + "additionalProperties": { + "type": "string" + }, + "description": "The note of each link level (link.link_level) of the plans in this result, stated once.", + "type": "object" + }, + "needs_input": { + "items": { + "properties": { + "field": { + "type": "string" + }, + "reason": { + "type": "string" + } + }, + "required": [ + "field", + "reason" + ], + "type": "object" + }, + "type": "array" + }, + "notes": { + "items": { + "type": "string" + }, + "type": "array" + }, + "partial_matches": { + "items": { + "properties": { + "assumptions": { + "items": { + "type": "string" + }, + "type": "array" + }, + "at_limit": { + "description": "Present for a plan with no automatic extra usage: what the official page says happens at the limit (kind no_extra_usage or restart_by_hand), with its sentence. With a workload that needs restarts, restarts gives their count, the price of each and the total, the numbers of monthly_cost.explanation.", + "properties": { + "evidence": { + "properties": { + "quote": { + "type": "string" + }, + "source": { + "type": "string" + } + }, + "type": "object" + }, + "kind": { + "enum": [ + "no_extra_usage", + "restart_by_hand" + ] + }, + "restarts": { + "properties": { + "count": { + "properties": { + "high": { + "type": "integer" + }, + "low": { + "type": "integer" + } + }, + "type": "object" + }, + "total_usd": { + "properties": { + "high": { + "type": "number" + }, + "low": { + "type": "number" + } + }, + "type": "object" + }, + "usd_each": { + "type": "number" + } + }, + "type": "object" + }, + "text": { + "type": "string" + } + }, + "required": [ + "kind", + "text", + "evidence" + ], + "type": "object" + }, + "billing": { + "type": "string" + }, + "billing_options": { + "items": { + "type": "string" + }, + "type": "array" + }, + "checked_at": { + "type": [ + "string", + "null" + ] + }, + "conditions": { + "items": { + "properties": { + "condition": { + "type": "string" + }, + "facts": { + "description": "Facts the verdict was judged from. The monthly budget is judged from monthly_cost; its price facts are listed there only.", + "items": { + "properties": { + "also_stated_in": { + "description": "get_details only: other official machine-readable documents of the provider (llms.txt, llms-full.txt, OpenAPI files, MCP tool listings) that contain the same quoted sentences.", + "items": { + "type": "string" + }, + "type": "array" + }, + "applies_to": { + "description": "get_details only: billing options (billing) or search engines (search_engines) the fact is limited to.", + "type": [ + "object", + "null" + ] + }, + "at_limit": { + "description": "Present for a plan with no automatic extra usage: what the official page says happens at the limit (kind no_extra_usage or restart_by_hand), with its sentence. With a workload that needs restarts, restarts gives their count, the price of each and the total, the numbers of monthly_cost.explanation.", + "properties": { + "evidence": { + "properties": { + "quote": { + "type": "string" + }, + "source": { + "type": "string" + } + }, + "type": "object" + }, + "kind": { + "enum": [ + "no_extra_usage", + "restart_by_hand" + ] + }, + "restarts": { + "properties": { + "count": { + "properties": { + "high": { + "type": "integer" + }, + "low": { + "type": "integer" + } + }, + "type": "object" + }, + "total_usd": { + "properties": { + "high": { + "type": "number" + }, + "low": { + "type": "number" + } + }, + "type": "object" + }, + "usd_each": { + "type": "number" + } + }, + "type": "object" + }, + "text": { + "type": "string" + } + }, + "required": [ + "kind", + "text", + "evidence" + ], + "type": "object" + }, + "checked_at": { + "type": [ + "string", + "null" + ] + }, + "concurrency_unit": { + "description": "get_details, concurrency only: the unit the page states the value in (unit, text such as \"100 threads\"). Against concurrent requests: equals_requests (value, text and the official line of the unit rule) when the unit rule counts this unit as requests, else note \"not the same unit as concurrent requests\"; \"unit not stated\" when the page names none.", + "type": "object" + }, + "derived": { + "description": "How the value follows from the quoted sentence when it is not literal.", + "type": "string" + }, + "evidence": { + "items": { + "properties": { + "quote": { + "description": "The sentence as it appears on that page.", + "type": "string" + }, + "retrieved_at": { + "description": "Date the page was read (YYYY-MM-DD). Only with detail=full.", + "type": "string" + }, + "source": { + "description": "Official page the sentence was found on.", + "type": "string" + }, + "source_type": { + "description": "Only with detail=full.", + "enum": [ + "official_pricing", + "official_docs", + "third_party" + ] + } + }, + "required": [ + "source", + "quote" + ], + "type": "object" + }, + "type": "array" + }, + "exceptions": { + "description": "get_details only: plans with a different value.", + "type": "array" + }, + "key": { + "type": "string" + }, + "label": { + "type": "string" + }, + "level": { + "description": "Where the fact is recorded: offer (the plan), product or provider.", + "type": [ + "string", + "null" + ] + }, + "note": { + "type": "string" + }, + "stale": { + "type": "boolean" + }, + "status": { + "description": "TRUE: stated with the value; FALSE / NOT_SUPPORTED: stated as unavailable; UNKNOWN: not stated; CONFLICT: official pages disagree (value lists each version); STALE: past its recheck date; MISSING: not recorded.", + "enum": [ + "TRUE", + "FALSE", + "NOT_SUPPORTED", + "UNKNOWN", + "CONFLICT", + "STALE", + "MISSING" + ] + }, + "value": {}, + "via_exception": { + "description": "Present and true when a plan-specific exception replaced the general value.", + "type": "boolean" + } + }, + "required": [ + "key", + "status", + "value", + "level", + "evidence", + "checked_at" + ], + "type": "object" + }, + "type": "array" + }, + "label": { + "type": "string" + }, + "reason": { + "type": "string" + }, + "required": { + "type": "boolean" + }, + "verdict": { + "enum": [ + "MET", + "UNMET", + "UNKNOWN", + "UNIT_MISMATCH", + "UNIT_UNKNOWN" + ] + } + }, + "required": [ + "condition", + "label", + "required", + "verdict", + "reason", + "facts" + ], + "type": "object" + }, + "type": "array" + }, + "facts_omitted": { + "description": "search only: present and true when the source sentences under the conditions were left out so that the response fits one response; the verdicts, reasons and costs are unchanged. Ask check_conditions with the offer_id or get_details for the sentences.", + "type": "boolean" + }, + "link": { + "properties": { + "affiliate": { + "properties": { + "disclosure": { + "type": [ + "string", + "null" + ] + }, + "program": { + "type": [ + "string", + "null" + ] + }, + "status": { + "type": "string" + } + }, + "required": [ + "status" + ], + "type": "object" + }, + "landing": { + "type": "string" + }, + "link_level": { + "type": "string" + }, + "provider_url": { + "description": "The provider page itself. Only in a page made for a browser, where url is this service's address that forwards to it; MCP and REST results do not carry it.", + "type": "string" + }, + "url": { + "description": "The only address to visit the plan: this service's /go/<offer_id>?r=<token> address, which forwards to the provider page. The token is made for this response and holds nothing about you.", + "type": "string" + } + }, + "required": [ + "url", + "landing", + "link_level", + "affiliate" + ], + "type": "object" + }, + "listed": { + "type": "boolean" + }, + "match": { + "enum": [ + "FULL_MATCH", + "PARTIAL_MATCH", + "NO_MATCH" + ] + }, + "meets_all": { + "description": "Judged against the required conditions of this call only: true when every one is met, false when one is not met, \"unknown\" when none fails and one is not stated on the official pages.", + "enum": [ + true, + false, + "unknown" + ] + }, + "monthly_cost": { + "properties": { + "explanation": { + "type": "string" + }, + "facts": { + "description": "Price facts the cost was computed from.", + "items": { + "properties": { + "also_stated_in": { + "description": "get_details only: other official machine-readable documents of the provider (llms.txt, llms-full.txt, OpenAPI files, MCP tool listings) that contain the same quoted sentences.", + "items": { + "type": "string" + }, + "type": "array" + }, + "applies_to": { + "description": "get_details only: billing options (billing) or search engines (search_engines) the fact is limited to.", + "type": [ + "object", + "null" + ] + }, + "at_limit": { + "description": "Present for a plan with no automatic extra usage: what the official page says happens at the limit (kind no_extra_usage or restart_by_hand), with its sentence. With a workload that needs restarts, restarts gives their count, the price of each and the total, the numbers of monthly_cost.explanation.", + "properties": { + "evidence": { + "properties": { + "quote": { + "type": "string" + }, + "source": { + "type": "string" + } + }, + "type": "object" + }, + "kind": { + "enum": [ + "no_extra_usage", + "restart_by_hand" + ] + }, + "restarts": { + "properties": { + "count": { + "properties": { + "high": { + "type": "integer" + }, + "low": { + "type": "integer" + } + }, + "type": "object" + }, + "total_usd": { + "properties": { + "high": { + "type": "number" + }, + "low": { + "type": "number" + } + }, + "type": "object" + }, + "usd_each": { + "type": "number" + } + }, + "type": "object" + }, + "text": { + "type": "string" + } + }, + "required": [ + "kind", + "text", + "evidence" + ], + "type": "object" + }, + "checked_at": { + "type": [ + "string", + "null" + ] + }, + "concurrency_unit": { + "description": "get_details, concurrency only: the unit the page states the value in (unit, text such as \"100 threads\"). Against concurrent requests: equals_requests (value, text and the official line of the unit rule) when the unit rule counts this unit as requests, else note \"not the same unit as concurrent requests\"; \"unit not stated\" when the page names none.", + "type": "object" + }, + "derived": { + "description": "How the value follows from the quoted sentence when it is not literal.", + "type": "string" + }, + "evidence": { + "items": { + "properties": { + "quote": { + "description": "The sentence as it appears on that page.", + "type": "string" + }, + "retrieved_at": { + "description": "Date the page was read (YYYY-MM-DD). Only with detail=full.", + "type": "string" + }, + "source": { + "description": "Official page the sentence was found on.", + "type": "string" + }, + "source_type": { + "description": "Only with detail=full.", + "enum": [ + "official_pricing", + "official_docs", + "third_party" + ] + } + }, + "required": [ + "source", + "quote" + ], + "type": "object" + }, + "type": "array" + }, + "exceptions": { + "description": "get_details only: plans with a different value.", + "type": "array" + }, + "key": { + "type": "string" + }, + "label": { + "type": "string" + }, + "level": { + "description": "Where the fact is recorded: offer (the plan), product or provider.", + "type": [ + "string", + "null" + ] + }, + "note": { + "type": "string" + }, + "stale": { + "type": "boolean" + }, + "status": { + "description": "TRUE: stated with the value; FALSE / NOT_SUPPORTED: stated as unavailable; UNKNOWN: not stated; CONFLICT: official pages disagree (value lists each version); STALE: past its recheck date; MISSING: not recorded.", + "enum": [ + "TRUE", + "FALSE", + "NOT_SUPPORTED", + "UNKNOWN", + "CONFLICT", + "STALE", + "MISSING" + ] + }, + "value": {}, + "via_exception": { + "description": "Present and true when a plan-specific exception replaced the general value.", + "type": "boolean" + } + }, + "required": [ + "key", + "status", + "value", + "level", + "evidence", + "checked_at" + ], + "type": "object" + }, + "type": "array" + }, + "high": { + "type": [ + "number", + "null" + ] + }, + "low": { + "type": [ + "number", + "null" + ] + }, + "lower_bound": { + "type": [ + "number", + "null" + ] + }, + "status": { + "enum": [ + "exact", + "range", + "lower_bound", + "unknown" + ] + }, + "upfront_usd": { + "type": [ + "number", + "null" + ] + }, + "usd": { + "type": [ + "number", + "null" + ] + } + }, + "required": [ + "status", + "usd", + "explanation" + ], + "type": "object" + }, + "offer_id": { + "type": "string" + }, + "offer_name": { + "type": "string" + }, + "page_url": { + "type": "string" + }, + "preferred_met": { + "type": "integer" + }, + "prices_exclude_tax": { + "type": [ + "boolean", + "null" + ] + }, + "product_id": { + "type": "string" + }, + "product_name": { + "type": "string" + }, + "provider_id": { + "type": "string" + }, + "provider_name": { + "type": "string" + }, + "unknown_conditions": { + "items": { + "type": "string" + }, + "type": "array" + }, + "unmet_conditions": { + "items": { + "type": "string" + }, + "type": "array" + }, + "verdict": { + "description": "One sentence: the conditions met, or the ones not met or not stated, with the reason.", + "type": "string" + } + }, + "required": [ + "offer_id", + "offer_name", + "product_id", + "provider_name", + "match", + "meets_all", + "verdict", + "billing", + "monthly_cost", + "conditions", + "unmet_conditions", + "unknown_conditions", + "link", + "checked_at" + ], + "type": "object" + }, + "type": "array" + }, + "request": { + "type": "object" + }, + "show_text": { + "description": "Ready to show: one line per listed plan, in list order, \"Meets all N: Provider Plan โ link\" for a plan that meets every required condition of the call, \"Closest: Provider Plan โ link\" for any other. The link is the visit link of the plan, with the token of this response. Absent when no plan is listed.", + "type": "string" + }, + "unknown_providers": { + "description": "Only when providers was given: the names that are not a provider id or name in this catalog.", + "items": { + "type": "string" + }, + "type": "array" + }, + "zero_result": { + "properties": { + "conditions": { + "items": { + "properties": { + "closest": { + "description": "The cheapest plan that meets every other required condition but not this one. It does not meet the request (meets_all false or \"unknown\").", + "properties": { + "billing": { + "type": "string" + }, + "fails": { + "type": "string" + }, + "meets_all": { + "description": "Judged against the required conditions of this call only: true when every one is met, false when one is not met, \"unknown\" when none fails and one is not stated on the official pages.", + "enum": [ + true, + false, + "unknown" + ] + }, + "monthly_cost": { + "type": "object" + }, + "offer_id": { + "type": "string" + }, + "offer_name": { + "type": "string" + }, + "page_url": { + "type": "string" + }, + "provider_name": { + "type": "string" + } + }, + "required": [ + "offer_id", + "offer_name", + "provider_name", + "billing", + "monthly_cost", + "meets_all", + "fails" + ], + "type": [ + "object", + "null" + ] + }, + "condition": { + "type": "string" + }, + "excluded": { + "type": "integer" + }, + "label": { + "type": "string" + }, + "unknown": { + "type": "integer" + }, + "would_match_if_relaxed": { + "type": "integer" + } + }, + "required": [ + "condition", + "label", + "excluded", + "would_match_if_relaxed", + "closest" + ], + "type": "object" + }, + "type": "array" + }, + "note": { + "type": "string" + } + }, + "type": [ + "object", + "null" + ] + } + }, + "required": [ + "answer", + "as_of", + "needs_input", + "counts", + "full_matches", + "partial_matches", + "zero_result", + "assumptions", + "notes" + ], + "type": "object" + }, + { + "properties": { + "answer": { + "type": "string" + }, + "as_of": { + "type": "string" + }, + "counts": { + "properties": { + "candidates": { + "type": "integer" + }, + "full": { + "type": "integer" + }, + "no_match": { + "type": "integer" + }, + "partial": { + "type": "integer" + } + }, + "required": [ + "candidates", + "full", + "partial", + "no_match" + ], + "type": "object" + }, + "format": { + "enum": [ + "brief" + ] + }, + "full_matches": { + "items": { + "properties": { + "conditions": { + "items": { + "properties": { + "condition": { + "type": "string" + }, + "quote": { + "description": "One official source sentence, 200 characters at most.", + "type": "string" + }, + "reason": { + "description": "One line, 120 characters at most.", + "type": "string" + }, + "required": { + "description": "Present only on a preferred (nice-to-have) condition.", + "enum": [ + false + ] + }, + "source": { + "description": "Official page the sentence was found on.", + "type": [ + "string", + "null" + ] + }, + "verdict": { + "enum": [ + "MET", + "UNMET", + "UNKNOWN", + "UNIT_MISMATCH", + "UNIT_UNKNOWN" + ] + } + }, + "required": [ + "condition", + "verdict", + "reason" + ], + "type": "object" + }, + "type": "array" + }, + "match": { + "enum": [ + "FULL_MATCH", + "PARTIAL_MATCH", + "NO_MATCH" + ] + }, + "meets_all": { + "description": "Judged against the required conditions of this call only: true when every one is met, false when one is not met, \"unknown\" when none fails and one is not stated on the official pages.", + "enum": [ + true, + false, + "unknown" + ] + }, + "monthly_cost": { + "description": "status, usd, and low, high or lower_bound when they differ; as in the full result.", + "type": "object" + }, + "offer_id": { + "type": "string" + }, + "offer_name": { + "type": "string" + }, + "provider": { + "type": "string" + } + }, + "required": [ + "offer_id", + "offer_name", + "provider", + "meets_all", + "monthly_cost", + "conditions" + ], + "type": "object" + }, + "type": "array" + }, + "more_note": { + "type": "string" + }, + "more_plans": { + "description": "Matching plans left out of the short list: limit is the number of plans in all, fully matching first.", + "type": "integer" + }, + "needs_input": { + "items": { + "properties": { + "field": { + "type": "string" + }, + "reason": { + "type": "string" + } + }, + "required": [ + "field", + "reason" + ], + "type": "object" + }, + "type": "array" + }, + "partial_matches": { + "items": { + "properties": { + "conditions": { + "items": { + "properties": { + "condition": { + "type": "string" + }, + "quote": { + "description": "One official source sentence, 200 characters at most.", + "type": "string" + }, + "reason": { + "description": "One line, 120 characters at most.", + "type": "string" + }, + "required": { + "description": "Present only on a preferred (nice-to-have) condition.", + "enum": [ + false + ] + }, + "source": { + "description": "Official page the sentence was found on.", + "type": [ + "string", + "null" + ] + }, + "verdict": { + "enum": [ + "MET", + "UNMET", + "UNKNOWN", + "UNIT_MISMATCH", + "UNIT_UNKNOWN" + ] + } + }, + "required": [ + "condition", + "verdict", + "reason" + ], + "type": "object" + }, + "type": "array" + }, + "match": { + "enum": [ + "FULL_MATCH", + "PARTIAL_MATCH", + "NO_MATCH" + ] + }, + "meets_all": { + "description": "Judged against the required conditions of this call only: true when every one is met, false when one is not met, \"unknown\" when none fails and one is not stated on the official pages.", + "enum": [ + true, + false, + "unknown" + ] + }, + "monthly_cost": { + "description": "status, usd, and low, high or lower_bound when they differ; as in the full result.", + "type": "object" + }, + "offer_id": { + "type": "string" + }, + "offer_name": { + "type": "string" + }, + "provider": { + "type": "string" + } + }, + "required": [ + "offer_id", + "offer_name", + "provider", + "meets_all", + "monthly_cost", + "conditions" + ], + "type": "object" + }, + "type": "array" + }, + "show_text": { + "description": "Ready to show: one line per listed plan, in list order, \"Meets all N: Provider Plan โ link\" for a plan that meets every required condition of the call, \"Closest: Provider Plan โ link\" for any other. The link is the visit link of the plan, with the token of this response. Absent when no plan is listed.", + "type": "string" + }, + "unknown_providers": { + "items": { + "type": "string" + }, + "type": "array" + }, + "zero_result": { + "properties": { + "conditions": { + "items": { + "properties": { + "closest": { + "description": "The cheapest plan that meets every other required condition but not this one. It does not meet the request (meets_all false or \"unknown\").", + "properties": { + "billing": { + "type": "string" + }, + "fails": { + "type": "string" + }, + "meets_all": { + "description": "Judged against the required conditions of this call only: true when every one is met, false when one is not met, \"unknown\" when none fails and one is not stated on the official pages.", + "enum": [ + true, + false, + "unknown" + ] + }, + "monthly_cost": { + "type": "object" + }, + "offer_id": { + "type": "string" + }, + "offer_name": { + "type": "string" + }, + "page_url": { + "type": "string" + }, + "provider_name": { + "type": "string" + } + }, + "required": [ + "offer_id", + "offer_name", + "provider_name", + "billing", + "monthly_cost", + "meets_all", + "fails" + ], + "type": [ + "object", + "null" + ] + }, + "condition": { + "type": "string" + }, + "excluded": { + "type": "integer" + }, + "label": { + "type": "string" + }, + "unknown": { + "type": "integer" + }, + "would_match_if_relaxed": { + "type": "integer" + } + }, + "required": [ + "condition", + "label", + "excluded", + "would_match_if_relaxed", + "closest" + ], + "type": "object" + }, + "type": "array" + }, + "note": { + "type": "string" + } + }, + "type": [ + "object", + "null" + ] + } + }, + "required": [ + "format", + "answer", + "as_of", + "needs_input", + "counts", + "full_matches", + "partial_matches" + ], + "type": "object" + } +]
4 tool updates
- Changed
check_conditions2 fields changed- changed
Input schema / properties / billing_types / descriptionPrevious value: -"Acceptable billing: monthly_subscription (A plan with a fixed fee (or minimum commitment) billed every month.) annual_subscription (A plan paid for a year at a time.) pay_as_you_go (No plan fee; a price per unit of use, billed after use or drawn from a balance topped up with any amount.) prepaid_credits (A fixed-size credit pack bought before use, usually with an expiry.) Free plans always qualify."New value: +"Acceptable billing: monthly_subscription (A plan with a fixed fee (or minimum commitment) billed every month.) annual_subscription (A plan paid for a year at a time.) pay_as_you_go (No plan fee; a price per unit of use, billed after use or drawn from a balance topped up with any amount.) prepaid_credits (Money paid before use: a credit pack, a balance topped up first, or a plan amount charged in advance for the period.) Free plans always qualify." - changed
Input schema / properties / preferred / properties / billing_types / descriptionPrevious value: -"Acceptable billing: monthly_subscription (A plan with a fixed fee (or minimum commitment) billed every month.) annual_subscription (A plan paid for a year at a time.) pay_as_you_go (No plan fee; a price per unit of use, billed after use or drawn from a balance topped up with any amount.) prepaid_credits (A fixed-size credit pack bought before use, usually with an expiry.) Free plans always qualify."New value: +"Acceptable billing: monthly_subscription (A plan with a fixed fee (or minimum commitment) billed every month.) annual_subscription (A plan paid for a year at a time.) pay_as_you_go (No plan fee; a price per unit of use, billed after use or drawn from a balance topped up with any amount.) prepaid_credits (Money paid before use: a credit pack, a balance topped up first, or a plan amount charged in advance for the period.) Free plans always qualify."
- Changed
cost_scenarios2 fields changed- changed
Input schema / properties / billing_types / descriptionPrevious value: -"Acceptable billing: monthly_subscription (A plan with a fixed fee (or minimum commitment) billed every month.) annual_subscription (A plan paid for a year at a time.) pay_as_you_go (No plan fee; a price per unit of use, billed after use or drawn from a balance topped up with any amount.) prepaid_credits (A fixed-size credit pack bought before use, usually with an expiry.) Free plans always qualify."New value: +"Acceptable billing: monthly_subscription (A plan with a fixed fee (or minimum commitment) billed every month.) annual_subscription (A plan paid for a year at a time.) pay_as_you_go (No plan fee; a price per unit of use, billed after use or drawn from a balance topped up with any amount.) prepaid_credits (Money paid before use: a credit pack, a balance topped up first, or a plan amount charged in advance for the period.) Free plans always qualify." - changed
Input schema / properties / preferred / properties / billing_types / descriptionPrevious value: -"Acceptable billing: monthly_subscription (A plan with a fixed fee (or minimum commitment) billed every month.) annual_subscription (A plan paid for a year at a time.) pay_as_you_go (No plan fee; a price per unit of use, billed after use or drawn from a balance topped up with any amount.) prepaid_credits (A fixed-size credit pack bought before use, usually with an expiry.) Free plans always qualify."New value: +"Acceptable billing: monthly_subscription (A plan with a fixed fee (or minimum commitment) billed every month.) annual_subscription (A plan paid for a year at a time.) pay_as_you_go (No plan fee; a price per unit of use, billed after use or drawn from a balance topped up with any amount.) prepaid_credits (Money paid before use: a credit pack, a balance topped up first, or a plan amount charged in advance for the period.) Free plans always qualify."
- Changed
relax_conditions2 fields changed- changed
Input schema / properties / billing_types / descriptionPrevious value: -"Acceptable billing: monthly_subscription (A plan with a fixed fee (or minimum commitment) billed every month.) annual_subscription (A plan paid for a year at a time.) pay_as_you_go (No plan fee; a price per unit of use, billed after use or drawn from a balance topped up with any amount.) prepaid_credits (A fixed-size credit pack bought before use, usually with an expiry.) Free plans always qualify."New value: +"Acceptable billing: monthly_subscription (A plan with a fixed fee (or minimum commitment) billed every month.) annual_subscription (A plan paid for a year at a time.) pay_as_you_go (No plan fee; a price per unit of use, billed after use or drawn from a balance topped up with any amount.) prepaid_credits (Money paid before use: a credit pack, a balance topped up first, or a plan amount charged in advance for the period.) Free plans always qualify." - changed
Input schema / properties / preferred / properties / billing_types / descriptionPrevious value: -"Acceptable billing: monthly_subscription (A plan with a fixed fee (or minimum commitment) billed every month.) annual_subscription (A plan paid for a year at a time.) pay_as_you_go (No plan fee; a price per unit of use, billed after use or drawn from a balance topped up with any amount.) prepaid_credits (A fixed-size credit pack bought before use, usually with an expiry.) Free plans always qualify."New value: +"Acceptable billing: monthly_subscription (A plan with a fixed fee (or minimum commitment) billed every month.) annual_subscription (A plan paid for a year at a time.) pay_as_you_go (No plan fee; a price per unit of use, billed after use or drawn from a balance topped up with any amount.) prepaid_credits (Money paid before use: a credit pack, a balance topped up first, or a plan amount charged in advance for the period.) Free plans always qualify."
- Changed
search3 fields changed- changed
Input schema / properties / billing_types / descriptionPrevious value: -"Acceptable billing: monthly_subscription (A plan with a fixed fee (or minimum commitment) billed every month.) annual_subscription (A plan paid for a year at a time.) pay_as_you_go (No plan fee; a price per unit of use, billed after use or drawn from a balance topped up with any amount.) prepaid_credits (A fixed-size credit pack bought before use, usually with an expiry.) Free plans always qualify."New value: +"Acceptable billing: monthly_subscription (A plan with a fixed fee (or minimum commitment) billed every month.) annual_subscription (A plan paid for a year at a time.) pay_as_you_go (No plan fee; a price per unit of use, billed after use or drawn from a balance topped up with any amount.) prepaid_credits (Money paid before use: a credit pack, a balance topped up first, or a plan amount charged in advance for the period.) Free plans always qualify." - changed
Input schema / properties / preferred / properties / billing_types / descriptionPrevious value: -"Acceptable billing: monthly_subscription (A plan with a fixed fee (or minimum commitment) billed every month.) annual_subscription (A plan paid for a year at a time.) pay_as_you_go (No plan fee; a price per unit of use, billed after use or drawn from a balance topped up with any amount.) prepaid_credits (A fixed-size credit pack bought before use, usually with an expiry.) Free plans always qualify."New value: +"Acceptable billing: monthly_subscription (A plan with a fixed fee (or minimum commitment) billed every month.) annual_subscription (A plan paid for a year at a time.) pay_as_you_go (No plan fee; a price per unit of use, billed after use or drawn from a balance topped up with any amount.) prepaid_credits (Money paid before use: a credit pack, a balance topped up first, or a plan amount charged in advance for the period.) Free plans always qualify." - changed
Output schema / anyOfPrevious value: -[ - { - "properties": { - "answer": { - "description": "One sentence that opens the answer: the lowest-cost plan that meets every required condition with its link, or, when none does, the closest plan with what it does not meet or what is unknown, and its link.", - "type": "string" - }, - "as_of": { - "type": "string" - }, - "assumptions": { - "items": { - "type": "string" - }, - "type": "array" - }, - "counts": { - "properties": { - "candidates": { - "type": "integer" - }, - "full": { - "type": "integer" - }, - "no_match": { - "type": "integer" - }, - "partial": { - "type": "integer" - } - }, - "required": [ - "candidates", - "full", - "partial", - "no_match" - ], - "type": "object" - }, - "full_matches": { - "items": { - "properties": { - "assumptions": { - "items": { - "type": "string" - }, - "type": "array" - }, - "at_limit": { - "description": "Present for a plan with no automatic extra usage: what the official page says happens at the limit (kind no_extra_usage or restart_by_hand), with its sentence. With a workload that needs restarts, restarts gives their count, the price of each and the total, the numbers of monthly_cost.explanation.", - "properties": { - "evidence": { - "properties": { - "quote": { - "type": "string" - }, - "url": { - "type": "string" - } - }, - "type": "object" - }, - "kind": { - "enum": [ - "no_extra_usage", - "restart_by_hand" - ] - }, - "restarts": { - "properties": { - "count": { - "properties": { - "high": { - "type": "integer" - }, - "low": { - "type": "integer" - } - }, - "type": "object" - }, - "total_usd": { - "properties": { - "high": { - "type": "number" - }, - "low": { - "type": "number" - } - }, - "type": "object" - }, - "usd_each": { - "type": "number" - } - }, - "type": "object" - }, - "text": { - "type": "string" - } - }, - "required": [ - "kind", - "text", - "evidence" - ], - "type": "object" - }, - "billing": { - "type": "string" - }, - "billing_options": { - "items": { - "type": "string" - }, - "type": "array" - }, - "checked_at": { - "type": [ - "string", - "null" - ] - }, - "conditions": { - "items": { - "properties": { - "condition": { - "type": "string" - }, - "facts": { - "description": "Facts the verdict was judged from. The monthly budget is judged from monthly_cost; its price facts are listed there only.", - "items": { - "properties": { - "also_stated_in": { - "description": "get_details only: other official machine-readable documents of the provider (llms.txt, llms-full.txt, OpenAPI files, MCP tool listings) that contain the same quoted sentences.", - "items": { - "type": "string" - }, - "type": "array" - }, - "applies_to": { - "description": "get_details only: billing options (billing) or search engines (search_engines) the fact is limited to.", - "type": [ - "object", - "null" - ] - }, - "at_limit": { - "description": "Present for a plan with no automatic extra usage: what the official page says happens at the limit (kind no_extra_usage or restart_by_hand), with its sentence. With a workload that needs restarts, restarts gives their count, the price of each and the total, the numbers of monthly_cost.explanation.", - "properties": { - "evidence": { - "properties": { - "quote": { - "type": "string" - }, - "url": { - "type": "string" - } - }, - "type": "object" - }, - "kind": { - "enum": [ - "no_extra_usage", - "restart_by_hand" - ] - }, - "restarts": { - "properties": { - "count": { - "properties": { - "high": { - "type": "integer" - }, - "low": { - "type": "integer" - } - }, - "type": "object" - }, - "total_usd": { - "properties": { - "high": { - "type": "number" - }, - "low": { - "type": "number" - } - }, - "type": "object" - }, - "usd_each": { - "type": "number" - } - }, - "type": "object" - }, - "text": { - "type": "string" - } - }, - "required": [ - "kind", - "text", - "evidence" - ], - "type": "object" - }, - "checked_at": { - "type": [ - "string", - "null" - ] - }, - "concurrency_unit": { - "description": "get_details, concurrency only: the unit the page states the value in (unit, text such as \"100 threads\"). Against concurrent requests: equals_requests (value, text and the official line of the unit rule) when the unit rule counts this unit as requests, else note \"not the same unit as concurrent requests\"; \"unit not stated\" when the page names none.", - "type": "object" - }, - "derived": { - "description": "How the value follows from the quoted sentence when it is not literal.", - "type": "string" - }, - "evidence": { - "items": { - "properties": { - "quote": { - "description": "The sentence as it appears on that page.", - "type": "string" - }, - "retrieved_at": { - "description": "Date the page was read (YYYY-MM-DD). Only with detail=full.", - "type": "string" - }, - "source_type": { - "description": "Only with detail=full.", - "enum": [ - "official_pricing", - "official_docs", - "third_party" - ] - }, - "url": { - "description": "Official page the sentence was found on.", - "type": "string" - } - }, - "required": [ - "url", - "quote" - ], - "type": "object" - }, - "type": "array" - }, - "exceptions": { - "description": "get_details only: plans with a different value.", - "type": "array" - }, - "key": { - "type": "string" - }, - "label": { - "type": "string" - }, - "level": { - "description": "Where the fact is recorded: offer (the plan), product or provider.", - "type": [ - "string", - "null" - ] - }, - "note": { - "type": "string" - }, - "stale": { - "type": "boolean" - }, - "status": { - "description": "TRUE: stated with the value; FALSE / NOT_SUPPORTED: stated as unavailable; UNKNOWN: not stated; CONFLICT: official pages disagree (value lists each version); STALE: past its recheck date; MISSING: not recorded.", - "enum": [ - "TRUE", - "FALSE", - "NOT_SUPPORTED", - "UNKNOWN", - "CONFLICT", - "STALE", - "MISSING" - ] - }, - "value": {}, - "via_exception": { - "description": "Present and true when a plan-specific exception replaced the general value.", - "type": "boolean" - } - }, - "required": [ - "key", - "status", - "value", - "level", - "evidence", - "checked_at" - ], - "type": "object" - }, - "type": "array" - }, - "label": { - "type": "string" - }, - "reason": { - "type": "string" - }, - "required": { - "type": "boolean" - }, - "verdict": { - "enum": [ - "MET", - "UNMET", - "UNKNOWN", - "UNIT_MISMATCH", - "UNIT_UNKNOWN" - ] - } - }, - "required": [ - "condition", - "label", - "required", - "verdict", - "reason", - "facts" - ], - "type": "object" - }, - "type": "array" - }, - "facts_omitted": { - "description": "search only: present and true when the source sentences under the conditions were left out so that the response fits one response; the verdicts, reasons and costs are unchanged. Ask check_conditions with the offer_id or get_details for the sentences.", - "type": "boolean" - }, - "link": { - "properties": { - "affiliate": { - "properties": { - "disclosure": { - "type": [ - "string", - "null" - ] - }, - "program": { - "type": [ - "string", - "null" - ] - }, - "status": { - "type": "string" - } - }, - "required": [ - "status" - ], - "type": "object" - }, - "landing": { - "type": "string" - }, - "link_level": { - "type": "string" - }, - "provider_url": { - "description": "The provider page itself, when url is this service's address that forwards to it.", - "type": "string" - }, - "url": { - "type": "string" - } - }, - "required": [ - "url", - "landing", - "link_level", - "affiliate" - ], - "type": "object" - }, - "listed": { - "type": "boolean" - }, - "match": { - "enum": [ - "FULL_MATCH", - "PARTIAL_MATCH", - "NO_MATCH" - ] - }, - "meets_all": { - "description": "Judged against the required conditions of this call only: true when every one is met, false when one is not met, \"unknown\" when none fails and one is not stated on the official pages.", - "enum": [ - true, - false, - "unknown" - ] - }, - "monthly_cost": { - "properties": { - "explanation": { - "type": "string" - }, - "facts": { - "description": "Price facts the cost was computed from.", - "items": { - "properties": { - "also_stated_in": { - "description": "get_details only: other official machine-readable documents of the provider (llms.txt, llms-full.txt, OpenAPI files, MCP tool listings) that contain the same quoted sentences.", - "items": { - "type": "string" - }, - "type": "array" - }, - "applies_to": { - "description": "get_details only: billing options (billing) or search engines (search_engines) the fact is limited to.", - "type": [ - "object", - "null" - ] - }, - "at_limit": { - "description": "Present for a plan with no automatic extra usage: what the official page says happens at the limit (kind no_extra_usage or restart_by_hand), with its sentence. With a workload that needs restarts, restarts gives their count, the price of each and the total, the numbers of monthly_cost.explanation.", - "properties": { - "evidence": { - "properties": { - "quote": { - "type": "string" - }, - "url": { - "type": "string" - } - }, - "type": "object" - }, - "kind": { - "enum": [ - "no_extra_usage", - "restart_by_hand" - ] - }, - "restarts": { - "properties": { - "count": { - "properties": { - "high": { - "type": "integer" - }, - "low": { - "type": "integer" - } - }, - "type": "object" - }, - "total_usd": { - "properties": { - "high": { - "type": "number" - }, - "low": { - "type": "number" - } - }, - "type": "object" - }, - "usd_each": { - "type": "number" - } - }, - "type": "object" - }, - "text": { - "type": "string" - } - }, - "required": [ - "kind", - "text", - "evidence" - ], - "type": "object" - }, - "checked_at": { - "type": [ - "string", - "null" - ] - }, - "concurrency_unit": { - "description": "get_details, concurrency only: the unit the page states the value in (unit, text such as \"100 threads\"). Against concurrent requests: equals_requests (value, text and the official line of the unit rule) when the unit rule counts this unit as requests, else note \"not the same unit as concurrent requests\"; \"unit not stated\" when the page names none.", - "type": "object" - }, - "derived": { - "description": "How the value follows from the quoted sentence when it is not literal.", - "type": "string" - }, - "evidence": { - "items": { - "properties": { - "quote": { - "description": "The sentence as it appears on that page.", - "type": "string" - }, - "retrieved_at": { - "description": "Date the page was read (YYYY-MM-DD). Only with detail=full.", - "type": "string" - }, - "source_type": { - "description": "Only with detail=full.", - "enum": [ - "official_pricing", - "official_docs", - "third_party" - ] - }, - "url": { - "description": "Official page the sentence was found on.", - "type": "string" - } - }, - "required": [ - "url", - "quote" - ], - "type": "object" - }, - "type": "array" - }, - "exceptions": { - "description": "get_details only: plans with a different value.", - "type": "array" - }, - "key": { - "type": "string" - }, - "label": { - "type": "string" - }, - "level": { - "description": "Where the fact is recorded: offer (the plan), product or provider.", - "type": [ - "string", - "null" - ] - }, - "note": { - "type": "string" - }, - "stale": { - "type": "boolean" - }, - "status": { - "description": "TRUE: stated with the value; FALSE / NOT_SUPPORTED: stated as unavailable; UNKNOWN: not stated; CONFLICT: official pages disagree (value lists each version); STALE: past its recheck date; MISSING: not recorded.", - "enum": [ - "TRUE", - "FALSE", - "NOT_SUPPORTED", - "UNKNOWN", - "CONFLICT", - "STALE", - "MISSING" - ] - }, - "value": {}, - "via_exception": { - "description": "Present and true when a plan-specific exception replaced the general value.", - "type": "boolean" - } - }, - "required": [ - "key", - "status", - "value", - "level", - "evidence", - "checked_at" - ], - "type": "object" - }, - "type": "array" - }, - "high": { - "type": [ - "number", - "null" - ] - }, - "low": { - "type": [ - "number", - "null" - ] - }, - "lower_bound": { - "type": [ - "number", - "null" - ] - }, - "status": { - "enum": [ - "exact", - "range", - "lower_bound", - "unknown" - ] - }, - "upfront_usd": { - "type": [ - "number", - "null" - ] - }, - "usd": { - "type": [ - "number", - "null" - ] - } - }, - "required": [ - "status", - "usd", - "explanation" - ], - "type": "object" - }, - "offer_id": { - "type": "string" - }, - "offer_name": { - "type": "string" - }, - "page_url": { - "type": "string" - }, - "preferred_met": { - "type": "integer" - }, - "prices_exclude_tax": { - "type": [ - "boolean", - "null" - ] - }, - "product_id": { - "type": "string" - }, - "product_name": { - "type": "string" - }, - "provider_id": { - "type": "string" - }, - "provider_name": { - "type": "string" - }, - "unknown_conditions": { - "items": { - "type": "string" - }, - "type": "array" - }, - "unmet_conditions": { - "items": { - "type": "string" - }, - "type": "array" - }, - "verdict": { - "description": "One sentence: the conditions met, or the ones not met or not stated, with the reason.", - "type": "string" - } - }, - "required": [ - "offer_id", - "offer_name", - "product_id", - "provider_name", - "match", - "meets_all", - "verdict", - "billing", - "monthly_cost", - "conditions", - "unmet_conditions", - "unknown_conditions", - "link", - "checked_at" - ], - "type": "object" - }, - "type": "array" - }, - "link_notes": { - "additionalProperties": { - "type": "string" - }, - "description": "The note of each link level (link.link_level) of the plans in this result, stated once.", - "type": "object" - }, - "needs_input": { - "items": { - "properties": { - "field": { - "type": "string" - }, - "reason": { - "type": "string" - } - }, - "required": [ - "field", - "reason" - ], - "type": "object" - }, - "type": "array" - }, - "notes": { - "items": { - "type": "string" - }, - "type": "array" - }, - "partial_matches": { - "items": { - "properties": { - "assumptions": { - "items": { - "type": "string" - }, - "type": "array" - }, - "at_limit": { - "description": "Present for a plan with no automatic extra usage: what the official page says happens at the limit (kind no_extra_usage or restart_by_hand), with its sentence. With a workload that needs restarts, restarts gives their count, the price of each and the total, the numbers of monthly_cost.explanation.", - "properties": { - "evidence": { - "properties": { - "quote": { - "type": "string" - }, - "url": { - "type": "string" - } - }, - "type": "object" - }, - "kind": { - "enum": [ - "no_extra_usage", - "restart_by_hand" - ] - }, - "restarts": { - "properties": { - "count": { - "properties": { - "high": { - "type": "integer" - }, - "low": { - "type": "integer" - } - }, - "type": "object" - }, - "total_usd": { - "properties": { - "high": { - "type": "number" - }, - "low": { - "type": "number" - } - }, - "type": "object" - }, - "usd_each": { - "type": "number" - } - }, - "type": "object" - }, - "text": { - "type": "string" - } - }, - "required": [ - "kind", - "text", - "evidence" - ], - "type": "object" - }, - "billing": { - "type": "string" - }, - "billing_options": { - "items": { - "type": "string" - }, - "type": "array" - }, - "checked_at": { - "type": [ - "string", - "null" - ] - }, - "conditions": { - "items": { - "properties": { - "condition": { - "type": "string" - }, - "facts": { - "description": "Facts the verdict was judged from. The monthly budget is judged from monthly_cost; its price facts are listed there only.", - "items": { - "properties": { - "also_stated_in": { - "description": "get_details only: other official machine-readable documents of the provider (llms.txt, llms-full.txt, OpenAPI files, MCP tool listings) that contain the same quoted sentences.", - "items": { - "type": "string" - }, - "type": "array" - }, - "applies_to": { - "description": "get_details only: billing options (billing) or search engines (search_engines) the fact is limited to.", - "type": [ - "object", - "null" - ] - }, - "at_limit": { - "description": "Present for a plan with no automatic extra usage: what the official page says happens at the limit (kind no_extra_usage or restart_by_hand), with its sentence. With a workload that needs restarts, restarts gives their count, the price of each and the total, the numbers of monthly_cost.explanation.", - "properties": { - "evidence": { - "properties": { - "quote": { - "type": "string" - }, - "url": { - "type": "string" - } - }, - "type": "object" - }, - "kind": { - "enum": [ - "no_extra_usage", - "restart_by_hand" - ] - }, - "restarts": { - "properties": { - "count": { - "properties": { - "high": { - "type": "integer" - }, - "low": { - "type": "integer" - } - }, - "type": "object" - }, - "total_usd": { - "properties": { - "high": { - "type": "number" - }, - "low": { - "type": "number" - } - }, - "type": "object" - }, - "usd_each": { - "type": "number" - } - }, - "type": "object" - }, - "text": { - "type": "string" - } - }, - "required": [ - "kind", - "text", - "evidence" - ], - "type": "object" - }, - "checked_at": { - "type": [ - "string", - "null" - ] - }, - "concurrency_unit": { - "description": "get_details, concurrency only: the unit the page states the value in (unit, text such as \"100 threads\"). Against concurrent requests: equals_requests (value, text and the official line of the unit rule) when the unit rule counts this unit as requests, else note \"not the same unit as concurrent requests\"; \"unit not stated\" when the page names none.", - "type": "object" - }, - "derived": { - "description": "How the value follows from the quoted sentence when it is not literal.", - "type": "string" - }, - "evidence": { - "items": { - "properties": { - "quote": { - "description": "The sentence as it appears on that page.", - "type": "string" - }, - "retrieved_at": { - "description": "Date the page was read (YYYY-MM-DD). Only with detail=full.", - "type": "string" - }, - "source_type": { - "description": "Only with detail=full.", - "enum": [ - "official_pricing", - "official_docs", - "third_party" - ] - }, - "url": { - "description": "Official page the sentence was found on.", - "type": "string" - } - }, - "required": [ - "url", - "quote" - ], - "type": "object" - }, - "type": "array" - }, - "exceptions": { - "description": "get_details only: plans with a different value.", - "type": "array" - }, - "key": { - "type": "string" - }, - "label": { - "type": "string" - }, - "level": { - "description": "Where the fact is recorded: offer (the plan), product or provider.", - "type": [ - "string", - "null" - ] - }, - "note": { - "type": "string" - }, - "stale": { - "type": "boolean" - }, - "status": { - "description": "TRUE: stated with the value; FALSE / NOT_SUPPORTED: stated as unavailable; UNKNOWN: not stated; CONFLICT: official pages disagree (value lists each version); STALE: past its recheck date; MISSING: not recorded.", - "enum": [ - "TRUE", - "FALSE", - "NOT_SUPPORTED", - "UNKNOWN", - "CONFLICT", - "STALE", - "MISSING" - ] - }, - "value": {}, - "via_exception": { - "description": "Present and true when a plan-specific exception replaced the general value.", - "type": "boolean" - } - }, - "required": [ - "key", - "status", - "value", - "level", - "evidence", - "checked_at" - ], - "type": "object" - }, - "type": "array" - }, - "label": { - "type": "string" - }, - "reason": { - "type": "string" - }, - "required": { - "type": "boolean" - }, - "verdict": { - "enum": [ - "MET", - "UNMET", - "UNKNOWN", - "UNIT_MISMATCH", - "UNIT_UNKNOWN" - ] - } - }, - "required": [ - "condition", - "label", - "required", - "verdict", - "reason", - "facts" - ], - "type": "object" - }, - "type": "array" - }, - "facts_omitted": { - "description": "search only: present and true when the source sentences under the conditions were left out so that the response fits one response; the verdicts, reasons and costs are unchanged. Ask check_conditions with the offer_id or get_details for the sentences.", - "type": "boolean" - }, - "link": { - "properties": { - "affiliate": { - "properties": { - "disclosure": { - "type": [ - "string", - "null" - ] - }, - "program": { - "type": [ - "string", - "null" - ] - }, - "status": { - "type": "string" - } - }, - "required": [ - "status" - ], - "type": "object" - }, - "landing": { - "type": "string" - }, - "link_level": { - "type": "string" - }, - "provider_url": { - "description": "The provider page itself, when url is this service's address that forwards to it.", - "type": "string" - }, - "url": { - "type": "string" - } - }, - "required": [ - "url", - "landing", - "link_level", - "affiliate" - ], - "type": "object" - }, - "listed": { - "type": "boolean" - }, - "match": { - "enum": [ - "FULL_MATCH", - "PARTIAL_MATCH", - "NO_MATCH" - ] - }, - "meets_all": { - "description": "Judged against the required conditions of this call only: true when every one is met, false when one is not met, \"unknown\" when none fails and one is not stated on the official pages.", - "enum": [ - true, - false, - "unknown" - ] - }, - "monthly_cost": { - "properties": { - "explanation": { - "type": "string" - }, - "facts": { - "description": "Price facts the cost was computed from.", - "items": { - "properties": { - "also_stated_in": { - "description": "get_details only: other official machine-readable documents of the provider (llms.txt, llms-full.txt, OpenAPI files, MCP tool listings) that contain the same quoted sentences.", - "items": { - "type": "string" - }, - "type": "array" - }, - "applies_to": { - "description": "get_details only: billing options (billing) or search engines (search_engines) the fact is limited to.", - "type": [ - "object", - "null" - ] - }, - "at_limit": { - "description": "Present for a plan with no automatic extra usage: what the official page says happens at the limit (kind no_extra_usage or restart_by_hand), with its sentence. With a workload that needs restarts, restarts gives their count, the price of each and the total, the numbers of monthly_cost.explanation.", - "properties": { - "evidence": { - "properties": { - "quote": { - "type": "string" - }, - "url": { - "type": "string" - } - }, - "type": "object" - }, - "kind": { - "enum": [ - "no_extra_usage", - "restart_by_hand" - ] - }, - "restarts": { - "properties": { - "count": { - "properties": { - "high": { - "type": "integer" - }, - "low": { - "type": "integer" - } - }, - "type": "object" - }, - "total_usd": { - "properties": { - "high": { - "type": "number" - }, - "low": { - "type": "number" - } - }, - "type": "object" - }, - "usd_each": { - "type": "number" - } - }, - "type": "object" - }, - "text": { - "type": "string" - } - }, - "required": [ - "kind", - "text", - "evidence" - ], - "type": "object" - }, - "checked_at": { - "type": [ - "string", - "null" - ] - }, - "concurrency_unit": { - "description": "get_details, concurrency only: the unit the page states the value in (unit, text such as \"100 threads\"). Against concurrent requests: equals_requests (value, text and the official line of the unit rule) when the unit rule counts this unit as requests, else note \"not the same unit as concurrent requests\"; \"unit not stated\" when the page names none.", - "type": "object" - }, - "derived": { - "description": "How the value follows from the quoted sentence when it is not literal.", - "type": "string" - }, - "evidence": { - "items": { - "properties": { - "quote": { - "description": "The sentence as it appears on that page.", - "type": "string" - }, - "retrieved_at": { - "description": "Date the page was read (YYYY-MM-DD). Only with detail=full.", - "type": "string" - }, - "source_type": { - "description": "Only with detail=full.", - "enum": [ - "official_pricing", - "official_docs", - "third_party" - ] - }, - "url": { - "description": "Official page the sentence was found on.", - "type": "string" - } - }, - "required": [ - "url", - "quote" - ], - "type": "object" - }, - "type": "array" - }, - "exceptions": { - "description": "get_details only: plans with a different value.", - "type": "array" - }, - "key": { - "type": "string" - }, - "label": { - "type": "string" - }, - "level": { - "description": "Where the fact is recorded: offer (the plan), product or provider.", - "type": [ - "string", - "null" - ] - }, - "note": { - "type": "string" - }, - "stale": { - "type": "boolean" - }, - "status": { - "description": "TRUE: stated with the value; FALSE / NOT_SUPPORTED: stated as unavailable; UNKNOWN: not stated; CONFLICT: official pages disagree (value lists each version); STALE: past its recheck date; MISSING: not recorded.", - "enum": [ - "TRUE", - "FALSE", - "NOT_SUPPORTED", - "UNKNOWN", - "CONFLICT", - "STALE", - "MISSING" - ] - }, - "value": {}, - "via_exception": { - "description": "Present and true when a plan-specific exception replaced the general value.", - "type": "boolean" - } - }, - "required": [ - "key", - "status", - "value", - "level", - "evidence", - "checked_at" - ], - "type": "object" - }, - "type": "array" - }, - "high": { - "type": [ - "number", - "null" - ] - }, - "low": { - "type": [ - "number", - "null" - ] - }, - "lower_bound": { - "type": [ - "number", - "null" - ] - }, - "status": { - "enum": [ - "exact", - "range", - "lower_bound", - "unknown" - ] - }, - "upfront_usd": { - "type": [ - "number", - "null" - ] - }, - "usd": { - "type": [ - "number", - "null" - ] - } - }, - "required": [ - "status", - "usd", - "explanation" - ], - "type": "object" - }, - "offer_id": { - "type": "string" - }, - "offer_name": { - "type": "string" - }, - "page_url": { - "type": "string" - }, - "preferred_met": { - "type": "integer" - }, - "prices_exclude_tax": { - "type": [ - "boolean", - "null" - ] - }, - "product_id": { - "type": "string" - }, - "product_name": { - "type": "string" - }, - "provider_id": { - "type": "string" - }, - "provider_name": { - "type": "string" - }, - "unknown_conditions": { - "items": { - "type": "string" - }, - "type": "array" - }, - "unmet_conditions": { - "items": { - "type": "string" - }, - "type": "array" - }, - "verdict": { - "description": "One sentence: the conditions met, or the ones not met or not stated, with the reason.", - "type": "string" - } - }, - "required": [ - "offer_id", - "offer_name", - "product_id", - "provider_name", - "match", - "meets_all", - "verdict", - "billing", - "monthly_cost", - "conditions", - "unmet_conditions", - "unknown_conditions", - "link", - "checked_at" - ], - "type": "object" - }, - "type": "array" - }, - "request": { - "type": "object" - }, - "zero_result": { - "properties": { - "conditions": { - "items": { - "properties": { - "closest": { - "description": "The cheapest plan that meets every other required condition but not this one. It does not meet the request (meets_all false or \"unknown\").", - "properties": { - "billing": { - "type": "string" - }, - "fails": { - "type": "string" - }, - "meets_all": { - "description": "Judged against the required conditions of this call only: true when every one is met, false when one is not met, \"unknown\" when none fails and one is not stated on the official pages.", - "enum": [ - true, - false, - "unknown" - ] - }, - "monthly_cost": { - "type": "object" - }, - "offer_id": { - "type": "string" - }, - "offer_name": { - "type": "string" - }, - "page_url": { - "type": "string" - }, - "provider_name": { - "type": "string" - } - }, - "required": [ - "offer_id", - "offer_name", - "provider_name", - "billing", - "monthly_cost", - "meets_all", - "fails" - ], - "type": [ - "object", - "null" - ] - }, - "condition": { - "type": "string" - }, - "excluded": { - "type": "integer" - }, - "label": { - "type": "string" - }, - "unknown": { - "type": "integer" - }, - "would_match_if_relaxed": { - "type": "integer" - } - }, - "required": [ - "condition", - "label", - "excluded", - "would_match_if_relaxed", - "closest" - ], - "type": "object" - }, - "type": "array" - }, - "note": { - "type": "string" - } - }, - "type": [ - "object", - "null" - ] - } - }, - "required": [ - "answer", - "as_of", - "needs_input", - "counts", - "full_matches", - "partial_matches", - "zero_result", - "assumptions", - "notes" - ], - "type": "object" - }, - { - "properties": { - "answer": { - "type": "string" - }, - "as_of": { - "type": "string" - }, - "counts": { - "properties": { - "candidates": { - "type": "integer" - }, - "full": { - "type": "integer" - }, - "no_match": { - "type": "integer" - }, - "partial": { - "type": "integer" - } - }, - "required": [ - "candidates", - "full", - "partial", - "no_match" - ], - "type": "object" - }, - "format": { - "enum": [ - "brief" - ] - }, - "full_matches": { - "items": { - "properties": { - "conditions": { - "items": { - "properties": { - "condition": { - "type": "string" - }, - "quote": { - "description": "One official source sentence, 200 characters at most.", - "type": "string" - }, - "reason": { - "description": "One line, 120 characters at most.", - "type": "string" - }, - "required": { - "description": "Present only on a preferred (nice-to-have) condition.", - "enum": [ - false - ] - }, - "url": { - "type": [ - "string", - "null" - ] - }, - "verdict": { - "enum": [ - "MET", - "UNMET", - "UNKNOWN", - "UNIT_MISMATCH", - "UNIT_UNKNOWN" - ] - } - }, - "required": [ - "condition", - "verdict", - "reason" - ], - "type": "object" - }, - "type": "array" - }, - "match": { - "enum": [ - "FULL_MATCH", - "PARTIAL_MATCH", - "NO_MATCH" - ] - }, - "meets_all": { - "description": "Judged against the required conditions of this call only: true when every one is met, false when one is not met, \"unknown\" when none fails and one is not stated on the official pages.", - "enum": [ - true, - false, - "unknown" - ] - }, - "monthly_cost": { - "description": "status, usd, and low, high or lower_bound when they differ; as in the full result.", - "type": "object" - }, - "offer_id": { - "type": "string" - }, - "offer_name": { - "type": "string" - }, - "provider": { - "type": "string" - } - }, - "required": [ - "offer_id", - "offer_name", - "provider", - "meets_all", - "monthly_cost", - "conditions" - ], - "type": "object" - }, - "type": "array" - }, - "needs_input": { - "items": { - "properties": { - "field": { - "type": "string" - }, - "reason": { - "type": "string" - } - }, - "required": [ - "field", - "reason" - ], - "type": "object" - }, - "type": "array" - }, - "partial_matches": { - "items": { - "properties": { - "conditions": { - "items": { - "properties": { - "condition": { - "type": "string" - }, - "quote": { - "description": "One official source sentence, 200 characters at most.", - "type": "string" - }, - "reason": { - "description": "One line, 120 characters at most.", - "type": "string" - }, - "required": { - "description": "Present only on a preferred (nice-to-have) condition.", - "enum": [ - false - ] - }, - "url": { - "type": [ - "string", - "null" - ] - }, - "verdict": { - "enum": [ - "MET", - "UNMET", - "UNKNOWN", - "UNIT_MISMATCH", - "UNIT_UNKNOWN" - ] - } - }, - "required": [ - "condition", - "verdict", - "reason" - ], - "type": "object" - }, - "type": "array" - }, - "match": { - "enum": [ - "FULL_MATCH", - "PARTIAL_MATCH", - "NO_MATCH" - ] - }, - "meets_all": { - "description": "Judged against the required conditions of this call only: true when every one is met, false when one is not met, \"unknown\" when none fails and one is not stated on the official pages.", - "enum": [ - true, - false, - "unknown" - ] - }, - "monthly_cost": { - "description": "status, usd, and low, high or lower_bound when they differ; as in the full result.", - "type": "object" - }, - "offer_id": { - "type": "string" - }, - "offer_name": { - "type": "string" - }, - "provider": { - "type": "string" - } - }, - "required": [ - "offer_id", - "offer_name", - "provider", - "meets_all", - "monthly_cost", - "conditions" - ], - "type": "object" - }, - "type": "array" - }, - "zero_result": { - "properties": { - "conditions": { - "items": { - "properties": { - "closest": { - "description": "The cheapest plan that meets every other required condition but not this one. It does not meet the request (meets_all false or \"unknown\").", - "properties": { - "billing": { - "type": "string" - }, - "fails": { - "type": "string" - }, - "meets_all": { - "description": "Judged against the required conditions of this call only: true when every one is met, false when one is not met, \"unknown\" when none fails and one is not stated on the official pages.", - "enum": [ - true, - false, - "unknown" - ] - }, - "monthly_cost": { - "type": "object" - }, - "offer_id": { - "type": "string" - }, - "offer_name": { - "type": "string" - }, - "page_url": { - "type": "string" - }, - "provider_name": { - "type": "string" - } - }, - "required": [ - "offer_id", - "offer_name", - "provider_name", - "billing", - "monthly_cost", - "meets_all", - "fails" - ], - "type": [ - "object", - "null" - ] - }, - "condition": { - "type": "string" - }, - "excluded": { - "type": "integer" - }, - "label": { - "type": "string" - }, - "unknown": { - "type": "integer" - }, - "would_match_if_relaxed": { - "type": "integer" - } - }, - "required": [ - "condition", - "label", - "excluded", - "would_match_if_relaxed", - "closest" - ], - "type": "object" - }, - "type": "array" - }, - "note": { - "type": "string" - } - }, - "type": [ - "object", - "null" - ] - } - }, - "required": [ - "format", - "answer", - "as_of", - "needs_input", - "counts", - "full_matches", - "partial_matches" - ], - "type": "object" - } -]New value: +[ + { + "properties": { + "answer": { + "description": "One sentence that opens the answer: the lowest-cost plan that meets every required condition with its link, or, when none does, the closest plan with what it does not meet or what is unknown, and its link.", + "type": "string" + }, + "as_of": { + "type": "string" + }, + "assumptions": { + "items": { + "type": "string" + }, + "type": "array" + }, + "counts": { + "properties": { + "candidates": { + "type": "integer" + }, + "full": { + "type": "integer" + }, + "no_match": { + "type": "integer" + }, + "partial": { + "type": "integer" + } + }, + "required": [ + "candidates", + "full", + "partial", + "no_match" + ], + "type": "object" + }, + "full_matches": { + "items": { + "properties": { + "assumptions": { + "items": { + "type": "string" + }, + "type": "array" + }, + "at_limit": { + "description": "Present for a plan with no automatic extra usage: what the official page says happens at the limit (kind no_extra_usage or restart_by_hand), with its sentence. With a workload that needs restarts, restarts gives their count, the price of each and the total, the numbers of monthly_cost.explanation.", + "properties": { + "evidence": { + "properties": { + "quote": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "type": "object" + }, + "kind": { + "enum": [ + "no_extra_usage", + "restart_by_hand" + ] + }, + "restarts": { + "properties": { + "count": { + "properties": { + "high": { + "type": "integer" + }, + "low": { + "type": "integer" + } + }, + "type": "object" + }, + "total_usd": { + "properties": { + "high": { + "type": "number" + }, + "low": { + "type": "number" + } + }, + "type": "object" + }, + "usd_each": { + "type": "number" + } + }, + "type": "object" + }, + "text": { + "type": "string" + } + }, + "required": [ + "kind", + "text", + "evidence" + ], + "type": "object" + }, + "billing": { + "type": "string" + }, + "billing_options": { + "items": { + "type": "string" + }, + "type": "array" + }, + "checked_at": { + "type": [ + "string", + "null" + ] + }, + "conditions": { + "items": { + "properties": { + "condition": { + "type": "string" + }, + "facts": { + "description": "Facts the verdict was judged from. The monthly budget is judged from monthly_cost; its price facts are listed there only.", + "items": { + "properties": { + "also_stated_in": { + "description": "get_details only: other official machine-readable documents of the provider (llms.txt, llms-full.txt, OpenAPI files, MCP tool listings) that contain the same quoted sentences.", + "items": { + "type": "string" + }, + "type": "array" + }, + "applies_to": { + "description": "get_details only: billing options (billing) or search engines (search_engines) the fact is limited to.", + "type": [ + "object", + "null" + ] + }, + "at_limit": { + "description": "Present for a plan with no automatic extra usage: what the official page says happens at the limit (kind no_extra_usage or restart_by_hand), with its sentence. With a workload that needs restarts, restarts gives their count, the price of each and the total, the numbers of monthly_cost.explanation.", + "properties": { + "evidence": { + "properties": { + "quote": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "type": "object" + }, + "kind": { + "enum": [ + "no_extra_usage", + "restart_by_hand" + ] + }, + "restarts": { + "properties": { + "count": { + "properties": { + "high": { + "type": "integer" + }, + "low": { + "type": "integer" + } + }, + "type": "object" + }, + "total_usd": { + "properties": { + "high": { + "type": "number" + }, + "low": { + "type": "number" + } + }, + "type": "object" + }, + "usd_each": { + "type": "number" + } + }, + "type": "object" + }, + "text": { + "type": "string" + } + }, + "required": [ + "kind", + "text", + "evidence" + ], + "type": "object" + }, + "checked_at": { + "type": [ + "string", + "null" + ] + }, + "concurrency_unit": { + "description": "get_details, concurrency only: the unit the page states the value in (unit, text such as \"100 threads\"). Against concurrent requests: equals_requests (value, text and the official line of the unit rule) when the unit rule counts this unit as requests, else note \"not the same unit as concurrent requests\"; \"unit not stated\" when the page names none.", + "type": "object" + }, + "derived": { + "description": "How the value follows from the quoted sentence when it is not literal.", + "type": "string" + }, + "evidence": { + "items": { + "properties": { + "quote": { + "description": "The sentence as it appears on that page.", + "type": "string" + }, + "retrieved_at": { + "description": "Date the page was read (YYYY-MM-DD). Only with detail=full.", + "type": "string" + }, + "source_type": { + "description": "Only with detail=full.", + "enum": [ + "official_pricing", + "official_docs", + "third_party" + ] + }, + "url": { + "description": "Official page the sentence was found on.", + "type": "string" + } + }, + "required": [ + "url", + "quote" + ], + "type": "object" + }, + "type": "array" + }, + "exceptions": { + "description": "get_details only: plans with a different value.", + "type": "array" + }, + "key": { + "type": "string" + }, + "label": { + "type": "string" + }, + "level": { + "description": "Where the fact is recorded: offer (the plan), product or provider.", + "type": [ + "string", + "null" + ] + }, + "note": { + "type": "string" + }, + "stale": { + "type": "boolean" + }, + "status": { + "description": "TRUE: stated with the value; FALSE / NOT_SUPPORTED: stated as unavailable; UNKNOWN: not stated; CONFLICT: official pages disagree (value lists each version); STALE: past its recheck date; MISSING: not recorded.", + "enum": [ + "TRUE", + "FALSE", + "NOT_SUPPORTED", + "UNKNOWN", + "CONFLICT", + "STALE", + "MISSING" + ] + }, + "value": {}, + "via_exception": { + "description": "Present and true when a plan-specific exception replaced the general value.", + "type": "boolean" + } + }, + "required": [ + "key", + "status", + "value", + "level", + "evidence", + "checked_at" + ], + "type": "object" + }, + "type": "array" + }, + "label": { + "type": "string" + }, + "reason": { + "type": "string" + }, + "required": { + "type": "boolean" + }, + "verdict": { + "enum": [ + "MET", + "UNMET", + "UNKNOWN", + "UNIT_MISMATCH", + "UNIT_UNKNOWN" + ] + } + }, + "required": [ + "condition", + "label", + "required", + "verdict", + "reason", + "facts" + ], + "type": "object" + }, + "type": "array" + }, + "facts_omitted": { + "description": "search only: present and true when the source sentences under the conditions were left out so that the response fits one response; the verdicts, reasons and costs are unchanged. Ask check_conditions with the offer_id or get_details for the sentences.", + "type": "boolean" + }, + "link": { + "properties": { + "affiliate": { + "properties": { + "disclosure": { + "type": [ + "string", + "null" + ] + }, + "program": { + "type": [ + "string", + "null" + ] + }, + "status": { + "type": "string" + } + }, + "required": [ + "status" + ], + "type": "object" + }, + "landing": { + "type": "string" + }, + "link_level": { + "type": "string" + }, + "provider_url": { + "description": "The provider page itself, when url is this service's address that forwards to it.", + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "url", + "landing", + "link_level", + "affiliate" + ], + "type": "object" + }, + "listed": { + "type": "boolean" + }, + "match": { + "enum": [ + "FULL_MATCH", + "PARTIAL_MATCH", + "NO_MATCH" + ] + }, + "meets_all": { + "description": "Judged against the required conditions of this call only: true when every one is met, false when one is not met, \"unknown\" when none fails and one is not stated on the official pages.", + "enum": [ + true, + false, + "unknown" + ] + }, + "monthly_cost": { + "properties": { + "explanation": { + "type": "string" + }, + "facts": { + "description": "Price facts the cost was computed from.", + "items": { + "properties": { + "also_stated_in": { + "description": "get_details only: other official machine-readable documents of the provider (llms.txt, llms-full.txt, OpenAPI files, MCP tool listings) that contain the same quoted sentences.", + "items": { + "type": "string" + }, + "type": "array" + }, + "applies_to": { + "description": "get_details only: billing options (billing) or search engines (search_engines) the fact is limited to.", + "type": [ + "object", + "null" + ] + }, + "at_limit": { + "description": "Present for a plan with no automatic extra usage: what the official page says happens at the limit (kind no_extra_usage or restart_by_hand), with its sentence. With a workload that needs restarts, restarts gives their count, the price of each and the total, the numbers of monthly_cost.explanation.", + "properties": { + "evidence": { + "properties": { + "quote": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "type": "object" + }, + "kind": { + "enum": [ + "no_extra_usage", + "restart_by_hand" + ] + }, + "restarts": { + "properties": { + "count": { + "properties": { + "high": { + "type": "integer" + }, + "low": { + "type": "integer" + } + }, + "type": "object" + }, + "total_usd": { + "properties": { + "high": { + "type": "number" + }, + "low": { + "type": "number" + } + }, + "type": "object" + }, + "usd_each": { + "type": "number" + } + }, + "type": "object" + }, + "text": { + "type": "string" + } + }, + "required": [ + "kind", + "text", + "evidence" + ], + "type": "object" + }, + "checked_at": { + "type": [ + "string", + "null" + ] + }, + "concurrency_unit": { + "description": "get_details, concurrency only: the unit the page states the value in (unit, text such as \"100 threads\"). Against concurrent requests: equals_requests (value, text and the official line of the unit rule) when the unit rule counts this unit as requests, else note \"not the same unit as concurrent requests\"; \"unit not stated\" when the page names none.", + "type": "object" + }, + "derived": { + "description": "How the value follows from the quoted sentence when it is not literal.", + "type": "string" + }, + "evidence": { + "items": { + "properties": { + "quote": { + "description": "The sentence as it appears on that page.", + "type": "string" + }, + "retrieved_at": { + "description": "Date the page was read (YYYY-MM-DD). Only with detail=full.", + "type": "string" + }, + "source_type": { + "description": "Only with detail=full.", + "enum": [ + "official_pricing", + "official_docs", + "third_party" + ] + }, + "url": { + "description": "Official page the sentence was found on.", + "type": "string" + } + }, + "required": [ + "url", + "quote" + ], + "type": "object" + }, + "type": "array" + }, + "exceptions": { + "description": "get_details only: plans with a different value.", + "type": "array" + }, + "key": { + "type": "string" + }, + "label": { + "type": "string" + }, + "level": { + "description": "Where the fact is recorded: offer (the plan), product or provider.", + "type": [ + "string", + "null" + ] + }, + "note": { + "type": "string" + }, + "stale": { + "type": "boolean" + }, + "status": { + "description": "TRUE: stated with the value; FALSE / NOT_SUPPORTED: stated as unavailable; UNKNOWN: not stated; CONFLICT: official pages disagree (value lists each version); STALE: past its recheck date; MISSING: not recorded.", + "enum": [ + "TRUE", + "FALSE", + "NOT_SUPPORTED", + "UNKNOWN", + "CONFLICT", + "STALE", + "MISSING" + ] + }, + "value": {}, + "via_exception": { + "description": "Present and true when a plan-specific exception replaced the general value.", + "type": "boolean" + } + }, + "required": [ + "key", + "status", + "value", + "level", + "evidence", + "checked_at" + ], + "type": "object" + }, + "type": "array" + }, + "high": { + "type": [ + "number", + "null" + ] + }, + "low": { + "type": [ + "number", + "null" + ] + }, + "lower_bound": { + "type": [ + "number", + "null" + ] + }, + "status": { + "enum": [ + "exact", + "range", + "lower_bound", + "unknown" + ] + }, + "upfront_usd": { + "type": [ + "number", + "null" + ] + }, + "usd": { + "type": [ + "number", + "null" + ] + } + }, + "required": [ + "status", + "usd", + "explanation" + ], + "type": "object" + }, + "offer_id": { + "type": "string" + }, + "offer_name": { + "type": "string" + }, + "page_url": { + "type": "string" + }, + "preferred_met": { + "type": "integer" + }, + "prices_exclude_tax": { + "type": [ + "boolean", + "null" + ] + }, + "product_id": { + "type": "string" + }, + "product_name": { + "type": "string" + }, + "provider_id": { + "type": "string" + }, + "provider_name": { + "type": "string" + }, + "unknown_conditions": { + "items": { + "type": "string" + }, + "type": "array" + }, + "unmet_conditions": { + "items": { + "type": "string" + }, + "type": "array" + }, + "verdict": { + "description": "One sentence: the conditions met, or the ones not met or not stated, with the reason.", + "type": "string" + } + }, + "required": [ + "offer_id", + "offer_name", + "product_id", + "provider_name", + "match", + "meets_all", + "verdict", + "billing", + "monthly_cost", + "conditions", + "unmet_conditions", + "unknown_conditions", + "link", + "checked_at" + ], + "type": "object" + }, + "type": "array" + }, + "link_notes": { + "additionalProperties": { + "type": "string" + }, + "description": "The note of each link level (link.link_level) of the plans in this result, stated once.", + "type": "object" + }, + "needs_input": { + "items": { + "properties": { + "field": { + "type": "string" + }, + "reason": { + "type": "string" + } + }, + "required": [ + "field", + "reason" + ], + "type": "object" + }, + "type": "array" + }, + "notes": { + "items": { + "type": "string" + }, + "type": "array" + }, + "partial_matches": { + "items": { + "properties": { + "assumptions": { + "items": { + "type": "string" + }, + "type": "array" + }, + "at_limit": { + "description": "Present for a plan with no automatic extra usage: what the official page says happens at the limit (kind no_extra_usage or restart_by_hand), with its sentence. With a workload that needs restarts, restarts gives their count, the price of each and the total, the numbers of monthly_cost.explanation.", + "properties": { + "evidence": { + "properties": { + "quote": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "type": "object" + }, + "kind": { + "enum": [ + "no_extra_usage", + "restart_by_hand" + ] + }, + "restarts": { + "properties": { + "count": { + "properties": { + "high": { + "type": "integer" + }, + "low": { + "type": "integer" + } + }, + "type": "object" + }, + "total_usd": { + "properties": { + "high": { + "type": "number" + }, + "low": { + "type": "number" + } + }, + "type": "object" + }, + "usd_each": { + "type": "number" + } + }, + "type": "object" + }, + "text": { + "type": "string" + } + }, + "required": [ + "kind", + "text", + "evidence" + ], + "type": "object" + }, + "billing": { + "type": "string" + }, + "billing_options": { + "items": { + "type": "string" + }, + "type": "array" + }, + "checked_at": { + "type": [ + "string", + "null" + ] + }, + "conditions": { + "items": { + "properties": { + "condition": { + "type": "string" + }, + "facts": { + "description": "Facts the verdict was judged from. The monthly budget is judged from monthly_cost; its price facts are listed there only.", + "items": { + "properties": { + "also_stated_in": { + "description": "get_details only: other official machine-readable documents of the provider (llms.txt, llms-full.txt, OpenAPI files, MCP tool listings) that contain the same quoted sentences.", + "items": { + "type": "string" + }, + "type": "array" + }, + "applies_to": { + "description": "get_details only: billing options (billing) or search engines (search_engines) the fact is limited to.", + "type": [ + "object", + "null" + ] + }, + "at_limit": { + "description": "Present for a plan with no automatic extra usage: what the official page says happens at the limit (kind no_extra_usage or restart_by_hand), with its sentence. With a workload that needs restarts, restarts gives their count, the price of each and the total, the numbers of monthly_cost.explanation.", + "properties": { + "evidence": { + "properties": { + "quote": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "type": "object" + }, + "kind": { + "enum": [ + "no_extra_usage", + "restart_by_hand" + ] + }, + "restarts": { + "properties": { + "count": { + "properties": { + "high": { + "type": "integer" + }, + "low": { + "type": "integer" + } + }, + "type": "object" + }, + "total_usd": { + "properties": { + "high": { + "type": "number" + }, + "low": { + "type": "number" + } + }, + "type": "object" + }, + "usd_each": { + "type": "number" + } + }, + "type": "object" + }, + "text": { + "type": "string" + } + }, + "required": [ + "kind", + "text", + "evidence" + ], + "type": "object" + }, + "checked_at": { + "type": [ + "string", + "null" + ] + }, + "concurrency_unit": { + "description": "get_details, concurrency only: the unit the page states the value in (unit, text such as \"100 threads\"). Against concurrent requests: equals_requests (value, text and the official line of the unit rule) when the unit rule counts this unit as requests, else note \"not the same unit as concurrent requests\"; \"unit not stated\" when the page names none.", + "type": "object" + }, + "derived": { + "description": "How the value follows from the quoted sentence when it is not literal.", + "type": "string" + }, + "evidence": { + "items": { + "properties": { + "quote": { + "description": "The sentence as it appears on that page.", + "type": "string" + }, + "retrieved_at": { + "description": "Date the page was read (YYYY-MM-DD). Only with detail=full.", + "type": "string" + }, + "source_type": { + "description": "Only with detail=full.", + "enum": [ + "official_pricing", + "official_docs", + "third_party" + ] + }, + "url": { + "description": "Official page the sentence was found on.", + "type": "string" + } + }, + "required": [ + "url", + "quote" + ], + "type": "object" + }, + "type": "array" + }, + "exceptions": { + "description": "get_details only: plans with a different value.", + "type": "array" + }, + "key": { + "type": "string" + }, + "label": { + "type": "string" + }, + "level": { + "description": "Where the fact is recorded: offer (the plan), product or provider.", + "type": [ + "string", + "null" + ] + }, + "note": { + "type": "string" + }, + "stale": { + "type": "boolean" + }, + "status": { + "description": "TRUE: stated with the value; FALSE / NOT_SUPPORTED: stated as unavailable; UNKNOWN: not stated; CONFLICT: official pages disagree (value lists each version); STALE: past its recheck date; MISSING: not recorded.", + "enum": [ + "TRUE", + "FALSE", + "NOT_SUPPORTED", + "UNKNOWN", + "CONFLICT", + "STALE", + "MISSING" + ] + }, + "value": {}, + "via_exception": { + "description": "Present and true when a plan-specific exception replaced the general value.", + "type": "boolean" + } + }, + "required": [ + "key", + "status", + "value", + "level", + "evidence", + "checked_at" + ], + "type": "object" + }, + "type": "array" + }, + "label": { + "type": "string" + }, + "reason": { + "type": "string" + }, + "required": { + "type": "boolean" + }, + "verdict": { + "enum": [ + "MET", + "UNMET", + "UNKNOWN", + "UNIT_MISMATCH", + "UNIT_UNKNOWN" + ] + } + }, + "required": [ + "condition", + "label", + "required", + "verdict", + "reason", + "facts" + ], + "type": "object" + }, + "type": "array" + }, + "facts_omitted": { + "description": "search only: present and true when the source sentences under the conditions were left out so that the response fits one response; the verdicts, reasons and costs are unchanged. Ask check_conditions with the offer_id or get_details for the sentences.", + "type": "boolean" + }, + "link": { + "properties": { + "affiliate": { + "properties": { + "disclosure": { + "type": [ + "string", + "null" + ] + }, + "program": { + "type": [ + "string", + "null" + ] + }, + "status": { + "type": "string" + } + }, + "required": [ + "status" + ], + "type": "object" + }, + "landing": { + "type": "string" + }, + "link_level": { + "type": "string" + }, + "provider_url": { + "description": "The provider page itself, when url is this service's address that forwards to it.", + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "url", + "landing", + "link_level", + "affiliate" + ], + "type": "object" + }, + "listed": { + "type": "boolean" + }, + "match": { + "enum": [ + "FULL_MATCH", + "PARTIAL_MATCH", + "NO_MATCH" + ] + }, + "meets_all": { + "description": "Judged against the required conditions of this call only: true when every one is met, false when one is not met, \"unknown\" when none fails and one is not stated on the official pages.", + "enum": [ + true, + false, + "unknown" + ] + }, + "monthly_cost": { + "properties": { + "explanation": { + "type": "string" + }, + "facts": { + "description": "Price facts the cost was computed from.", + "items": { + "properties": { + "also_stated_in": { + "description": "get_details only: other official machine-readable documents of the provider (llms.txt, llms-full.txt, OpenAPI files, MCP tool listings) that contain the same quoted sentences.", + "items": { + "type": "string" + }, + "type": "array" + }, + "applies_to": { + "description": "get_details only: billing options (billing) or search engines (search_engines) the fact is limited to.", + "type": [ + "object", + "null" + ] + }, + "at_limit": { + "description": "Present for a plan with no automatic extra usage: what the official page says happens at the limit (kind no_extra_usage or restart_by_hand), with its sentence. With a workload that needs restarts, restarts gives their count, the price of each and the total, the numbers of monthly_cost.explanation.", + "properties": { + "evidence": { + "properties": { + "quote": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "type": "object" + }, + "kind": { + "enum": [ + "no_extra_usage", + "restart_by_hand" + ] + }, + "restarts": { + "properties": { + "count": { + "properties": { + "high": { + "type": "integer" + }, + "low": { + "type": "integer" + } + }, + "type": "object" + }, + "total_usd": { + "properties": { + "high": { + "type": "number" + }, + "low": { + "type": "number" + } + }, + "type": "object" + }, + "usd_each": { + "type": "number" + } + }, + "type": "object" + }, + "text": { + "type": "string" + } + }, + "required": [ + "kind", + "text", + "evidence" + ], + "type": "object" + }, + "checked_at": { + "type": [ + "string", + "null" + ] + }, + "concurrency_unit": { + "description": "get_details, concurrency only: the unit the page states the value in (unit, text such as \"100 threads\"). Against concurrent requests: equals_requests (value, text and the official line of the unit rule) when the unit rule counts this unit as requests, else note \"not the same unit as concurrent requests\"; \"unit not stated\" when the page names none.", + "type": "object" + }, + "derived": { + "description": "How the value follows from the quoted sentence when it is not literal.", + "type": "string" + }, + "evidence": { + "items": { + "properties": { + "quote": { + "description": "The sentence as it appears on that page.", + "type": "string" + }, + "retrieved_at": { + "description": "Date the page was read (YYYY-MM-DD). Only with detail=full.", + "type": "string" + }, + "source_type": { + "description": "Only with detail=full.", + "enum": [ + "official_pricing", + "official_docs", + "third_party" + ] + }, + "url": { + "description": "Official page the sentence was found on.", + "type": "string" + } + }, + "required": [ + "url", + "quote" + ], + "type": "object" + }, + "type": "array" + }, + "exceptions": { + "description": "get_details only: plans with a different value.", + "type": "array" + }, + "key": { + "type": "string" + }, + "label": { + "type": "string" + }, + "level": { + "description": "Where the fact is recorded: offer (the plan), product or provider.", + "type": [ + "string", + "null" + ] + }, + "note": { + "type": "string" + }, + "stale": { + "type": "boolean" + }, + "status": { + "description": "TRUE: stated with the value; FALSE / NOT_SUPPORTED: stated as unavailable; UNKNOWN: not stated; CONFLICT: official pages disagree (value lists each version); STALE: past its recheck date; MISSING: not recorded.", + "enum": [ + "TRUE", + "FALSE", + "NOT_SUPPORTED", + "UNKNOWN", + "CONFLICT", + "STALE", + "MISSING" + ] + }, + "value": {}, + "via_exception": { + "description": "Present and true when a plan-specific exception replaced the general value.", + "type": "boolean" + } + }, + "required": [ + "key", + "status", + "value", + "level", + "evidence", + "checked_at" + ], + "type": "object" + }, + "type": "array" + }, + "high": { + "type": [ + "number", + "null" + ] + }, + "low": { + "type": [ + "number", + "null" + ] + }, + "lower_bound": { + "type": [ + "number", + "null" + ] + }, + "status": { + "enum": [ + "exact", + "range", + "lower_bound", + "unknown" + ] + }, + "upfront_usd": { + "type": [ + "number", + "null" + ] + }, + "usd": { + "type": [ + "number", + "null" + ] + } + }, + "required": [ + "status", + "usd", + "explanation" + ], + "type": "object" + }, + "offer_id": { + "type": "string" + }, + "offer_name": { + "type": "string" + }, + "page_url": { + "type": "string" + }, + "preferred_met": { + "type": "integer" + }, + "prices_exclude_tax": { + "type": [ + "boolean", + "null" + ] + }, + "product_id": { + "type": "string" + }, + "product_name": { + "type": "string" + }, + "provider_id": { + "type": "string" + }, + "provider_name": { + "type": "string" + }, + "unknown_conditions": { + "items": { + "type": "string" + }, + "type": "array" + }, + "unmet_conditions": { + "items": { + "type": "string" + }, + "type": "array" + }, + "verdict": { + "description": "One sentence: the conditions met, or the ones not met or not stated, with the reason.", + "type": "string" + } + }, + "required": [ + "offer_id", + "offer_name", + "product_id", + "provider_name", + "match", + "meets_all", + "verdict", + "billing", + "monthly_cost", + "conditions", + "unmet_conditions", + "unknown_conditions", + "link", + "checked_at" + ], + "type": "object" + }, + "type": "array" + }, + "request": { + "type": "object" + }, + "zero_result": { + "properties": { + "conditions": { + "items": { + "properties": { + "closest": { + "description": "The cheapest plan that meets every other required condition but not this one. It does not meet the request (meets_all false or \"unknown\").", + "properties": { + "billing": { + "type": "string" + }, + "fails": { + "type": "string" + }, + "meets_all": { + "description": "Judged against the required conditions of this call only: true when every one is met, false when one is not met, \"unknown\" when none fails and one is not stated on the official pages.", + "enum": [ + true, + false, + "unknown" + ] + }, + "monthly_cost": { + "type": "object" + }, + "offer_id": { + "type": "string" + }, + "offer_name": { + "type": "string" + }, + "page_url": { + "type": "string" + }, + "provider_name": { + "type": "string" + } + }, + "required": [ + "offer_id", + "offer_name", + "provider_name", + "billing", + "monthly_cost", + "meets_all", + "fails" + ], + "type": [ + "object", + "null" + ] + }, + "condition": { + "type": "string" + }, + "excluded": { + "type": "integer" + }, + "label": { + "type": "string" + }, + "unknown": { + "type": "integer" + }, + "would_match_if_relaxed": { + "type": "integer" + } + }, + "required": [ + "condition", + "label", + "excluded", + "would_match_if_relaxed", + "closest" + ], + "type": "object" + }, + "type": "array" + }, + "note": { + "type": "string" + } + }, + "type": [ + "object", + "null" + ] + } + }, + "required": [ + "answer", + "as_of", + "needs_input", + "counts", + "full_matches", + "partial_matches", + "zero_result", + "assumptions", + "notes" + ], + "type": "object" + }, + { + "properties": { + "answer": { + "type": "string" + }, + "as_of": { + "type": "string" + }, + "counts": { + "properties": { + "candidates": { + "type": "integer" + }, + "full": { + "type": "integer" + }, + "no_match": { + "type": "integer" + }, + "partial": { + "type": "integer" + } + }, + "required": [ + "candidates", + "full", + "partial", + "no_match" + ], + "type": "object" + }, + "format": { + "enum": [ + "brief" + ] + }, + "full_matches": { + "items": { + "properties": { + "conditions": { + "items": { + "properties": { + "condition": { + "type": "string" + }, + "quote": { + "description": "One official source sentence, 200 characters at most.", + "type": "string" + }, + "reason": { + "description": "One line, 120 characters at most.", + "type": "string" + }, + "required": { + "description": "Present only on a preferred (nice-to-have) condition.", + "enum": [ + false + ] + }, + "url": { + "type": [ + "string", + "null" + ] + }, + "verdict": { + "enum": [ + "MET", + "UNMET", + "UNKNOWN", + "UNIT_MISMATCH", + "UNIT_UNKNOWN" + ] + } + }, + "required": [ + "condition", + "verdict", + "reason" + ], + "type": "object" + }, + "type": "array" + }, + "match": { + "enum": [ + "FULL_MATCH", + "PARTIAL_MATCH", + "NO_MATCH" + ] + }, + "meets_all": { + "description": "Judged against the required conditions of this call only: true when every one is met, false when one is not met, \"unknown\" when none fails and one is not stated on the official pages.", + "enum": [ + true, + false, + "unknown" + ] + }, + "monthly_cost": { + "description": "status, usd, and low, high or lower_bound when they differ; as in the full result.", + "type": "object" + }, + "offer_id": { + "type": "string" + }, + "offer_name": { + "type": "string" + }, + "provider": { + "type": "string" + } + }, + "required": [ + "offer_id", + "offer_name", + "provider", + "meets_all", + "monthly_cost", + "conditions" + ], + "type": "object" + }, + "type": "array" + }, + "more_note": { + "type": "string" + }, + "more_plans": { + "description": "Matching plans left out of the short list: limit is the number of plans in all, fully matching first.", + "type": "integer" + }, + "needs_input": { + "items": { + "properties": { + "field": { + "type": "string" + }, + "reason": { + "type": "string" + } + }, + "required": [ + "field", + "reason" + ], + "type": "object" + }, + "type": "array" + }, + "partial_matches": { + "items": { + "properties": { + "conditions": { + "items": { + "properties": { + "condition": { + "type": "string" + }, + "quote": { + "description": "One official source sentence, 200 characters at most.", + "type": "string" + }, + "reason": { + "description": "One line, 120 characters at most.", + "type": "string" + }, + "required": { + "description": "Present only on a preferred (nice-to-have) condition.", + "enum": [ + false + ] + }, + "url": { + "type": [ + "string", + "null" + ] + }, + "verdict": { + "enum": [ + "MET", + "UNMET", + "UNKNOWN", + "UNIT_MISMATCH", + "UNIT_UNKNOWN" + ] + } + }, + "required": [ + "condition", + "verdict", + "reason" + ], + "type": "object" + }, + "type": "array" + }, + "match": { + "enum": [ + "FULL_MATCH", + "PARTIAL_MATCH", + "NO_MATCH" + ] + }, + "meets_all": { + "description": "Judged against the required conditions of this call only: true when every one is met, false when one is not met, \"unknown\" when none fails and one is not stated on the official pages.", + "enum": [ + true, + false, + "unknown" + ] + }, + "monthly_cost": { + "description": "status, usd, and low, high or lower_bound when they differ; as in the full result.", + "type": "object" + }, + "offer_id": { + "type": "string" + }, + "offer_name": { + "type": "string" + }, + "provider": { + "type": "string" + } + }, + "required": [ + "offer_id", + "offer_name", + "provider", + "meets_all", + "monthly_cost", + "conditions" + ], + "type": "object" + }, + "type": "array" + }, + "zero_result": { + "properties": { + "conditions": { + "items": { + "properties": { + "closest": { + "description": "The cheapest plan that meets every other required condition but not this one. It does not meet the request (meets_all false or \"unknown\").", + "properties": { + "billing": { + "type": "string" + }, + "fails": { + "type": "string" + }, + "meets_all": { + "description": "Judged against the required conditions of this call only: true when every one is met, false when one is not met, \"unknown\" when none fails and one is not stated on the official pages.", + "enum": [ + true, + false, + "unknown" + ] + }, + "monthly_cost": { + "type": "object" + }, + "offer_id": { + "type": "string" + }, + "offer_name": { + "type": "string" + }, + "page_url": { + "type": "string" + }, + "provider_name": { + "type": "string" + } + }, + "required": [ + "offer_id", + "offer_name", + "provider_name", + "billing", + "monthly_cost", + "meets_all", + "fails" + ], + "type": [ + "object", + "null" + ] + }, + "condition": { + "type": "string" + }, + "excluded": { + "type": "integer" + }, + "label": { + "type": "string" + }, + "unknown": { + "type": "integer" + }, + "would_match_if_relaxed": { + "type": "integer" + } + }, + "required": [ + "condition", + "label", + "excluded", + "would_match_if_relaxed", + "closest" + ], + "type": "object" + }, + "type": "array" + }, + "note": { + "type": "string" + } + }, + "type": [ + "object", + "null" + ] + } + }, + "required": [ + "format", + "answer", + "as_of", + "needs_input", + "counts", + "full_matches", + "partial_matches" + ], + "type": "object" + } +]
Related MCP Connectors
LLM API prices across 70+ providers: cheapest offer, comparisons, history and cost estimates.
Discover, compare, and monitor 1,400+ APIs directly from your AI coding agent.
Verified, dated prices for 293 AI APIs in 45 markets: LLMs, GPUs, speech, video and more.
AI agent tools: web search, browser, 400+ LLMs, image gen, TTS, phone verify. Pay-per-use.
Related MCP Servers
- AlicenseNot gradedqualityBmaintenanceEnables agents to rank model variants and hunt down API offers for a specific task, estimate real billed cost, audit n8n/Make automations for overpay, missing fallbacks and deprecated models, and plan or run evaluation and canary suites on the user's own examples. It also supports price comparison, custom reseller channels with measured per-call cost, and non-LLM capabilities such as web search and speech-to-text.AGPL 3.0
- AlicenseNot gradedqualityDmaintenanceEnables AI assistants to compare published prices and licence terms for email verification credits, sound effect packs, and font licences against a given usage, returning ranked options with source links and the date each price was checked. It is read-only and requires no account, API key, or sign-in.MIT
- AlicenseNot gradedqualityBmaintenanceEnables AI agents to calculate, compare, and recommend AI API costs from multiple providers, with support for currency conversion and platform fee analysis.19 PyPI1MIT
- FlicenseAqualityDmaintenanceEnables AI agents to compare AI model pricing plans, run cost scenarios, find break-even points, and get plan recommendations using TokenLens data.4-
Glama MCP Gateway
Add one secure layer between your agents and this server.