{"openapi":"3.1.0","info":{"title":"Web Data API Plan Finder API","version":"0.1.0","description":"Plans of web data APIs checked against conditions. Every fact carries the official source sentence and its check date. No authentication in v1. Response bodies are identical to the structuredContent of the MCP tools with the same names. A result longer than 45000 characters of JSON is not returned: the 400 error result_too_large names the field to reduce."},"servers":[{"url":"/"}],"paths":{"/api/v1/search":{"post":{"operationId":"search","summary":"Find web data API plans by conditions","description":"Use this when: the user wants to know which web data API plans (web scraping, crawling, SERP search result APIs) 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 or search the web itself (this tool reads no pages), needs proxies only, or asks about other kinds of software. Find web data API plans (scraping, crawling, SERP search) 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. 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.","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"product_types":{"type":"array","uniqueItems":true,"minItems":1,"items":{"type":"string","enum":["scraping_api","serp_api","headless_browser","platform"]},"description":"Limit to these product types. Default: every type that can serve the workload."},"monthly_pages":{"type":"object","additionalProperties":false,"minProperties":1,"properties":{"plain_html":{"type":"integer","minimum":0},"javascript":{"type":"integer","minimum":0},"premium_proxy":{"type":"integer","minimum":0},"javascript_premium_proxy":{"type":"integer","minimum":0}},"description":"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)."},"monthly_pages_total":{"type":"integer","minimum":0,"description":"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."},"monthly_searches":{"type":"integer","minimum":0,"description":"Search requests per month (one results page each)."},"structured_extraction_pages":{"type":"integer","minimum":0,"description":"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."},"ai_extraction_pages":{"type":"integer","minimum":0,"description":"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."},"browser_seconds_per_page":{"type":"number","exclusiveMinimum":0,"description":"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."},"min_concurrency":{"type":"integer","minimum":1,"description":"Minimum number of concurrent requests (or browsers) the plan must allow."},"min_requests_per_minute":{"type":"number","exclusiveMinimum":0,"description":"Minimum request rate the plan must allow, per minute."},"max_monthly_cost_usd":{"type":"number","minimum":0,"description":"Monthly budget in USD before tax. Compared with listed prices; annual plans use their per-month equivalent."},"billing_types":{"type":"array","minItems":1,"uniqueItems":true,"items":{"type":"string","enum":["monthly_subscription","annual_subscription","pay_as_you_go","prepaid_credits"]},"description":"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."},"needs_recurring_free_tier":{"type":"boolean","description":"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":{"type":"boolean","description":"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."},"only_successful_requests_billed":{"type":"boolean","description":"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."},"target_errors_not_billed":{"type":"boolean","description":"Error responses from the target site (e.g. 404) must not be billed."},"exit_ip_countries":{"type":"array","minItems":1,"uniqueItems":true,"items":{"type":"string","pattern":"^[A-Z]{2}$"},"description":"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."},"data_regions":{"type":"array","minItems":1,"uniqueItems":true,"items":{"type":"string","minLength":2,"maxLength":20},"description":"Regions where data must be stored or processed, e.g. [\"EU\"]. Different from exit-IP countries."},"realtime_search_required":{"type":"boolean","description":"Search results must be returned in real time (not through a queue)."},"search_countries":{"type":"array","minItems":1,"uniqueItems":true,"items":{"type":"string","pattern":"^[A-Z]{2}$"},"description":"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."},"search_result_types":{"type":"array","minItems":1,"uniqueItems":true,"items":{"type":"string","enum":["organic","ads","local_pack","knowledge_graph","people_also_ask","related_searches","shopping","news","images","videos","ai_overview"]},"description":"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."},"search_engines":{"type":"array","minItems":1,"uniqueItems":true,"items":{"type":"string","enum":["google","bing","yahoo","yandex","baidu","duckduckgo","naver","brave"]},"description":"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."},"min_pages_per_crawl":{"type":"integer","minimum":1,"description":"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."},"preferred":{"type":"object","additionalProperties":false,"properties":{"min_concurrency":{"type":"integer","minimum":1,"description":"Minimum number of concurrent requests (or browsers) the plan must allow."},"min_requests_per_minute":{"type":"number","exclusiveMinimum":0,"description":"Minimum request rate the plan must allow, per minute."},"max_monthly_cost_usd":{"type":"number","minimum":0,"description":"Monthly budget in USD before tax. Compared with listed prices; annual plans use their per-month equivalent."},"billing_types":{"type":"array","minItems":1,"uniqueItems":true,"items":{"type":"string","enum":["monthly_subscription","annual_subscription","pay_as_you_go","prepaid_credits"]},"description":"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."},"needs_recurring_free_tier":{"type":"boolean","description":"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":{"type":"boolean","description":"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."},"only_successful_requests_billed":{"type":"boolean","description":"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."},"target_errors_not_billed":{"type":"boolean","description":"Error responses from the target site (e.g. 404) must not be billed."},"exit_ip_countries":{"type":"array","minItems":1,"uniqueItems":true,"items":{"type":"string","pattern":"^[A-Z]{2}$"},"description":"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."},"data_regions":{"type":"array","minItems":1,"uniqueItems":true,"items":{"type":"string","minLength":2,"maxLength":20},"description":"Regions where data must be stored or processed, e.g. [\"EU\"]. Different from exit-IP countries."},"realtime_search_required":{"type":"boolean","description":"Search results must be returned in real time (not through a queue)."},"search_countries":{"type":"array","minItems":1,"uniqueItems":true,"items":{"type":"string","pattern":"^[A-Z]{2}$"},"description":"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."},"search_result_types":{"type":"array","minItems":1,"uniqueItems":true,"items":{"type":"string","enum":["organic","ads","local_pack","knowledge_graph","people_also_ask","related_searches","shopping","news","images","videos","ai_overview"]},"description":"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."},"search_engines":{"type":"array","minItems":1,"uniqueItems":true,"items":{"type":"string","enum":["google","bing","yahoo","yandex","baidu","duckduckgo","naver","brave"]},"description":"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."},"min_pages_per_crawl":{"type":"integer","minimum":1,"description":"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."}},"description":"Nice-to-have conditions; they do not filter, they break ties."},"limit":{"type":"integer","minimum":1,"maximum":5,"default":5,"description":"Maximum plans returned in each list (default and maximum 5)."},"detail":{"type":"string","enum":["summary","full"],"default":"summary","description":"summary returns one source sentence per fact; full returns every recorded fact and sentence."}}}}}},"responses":{"200":{"description":"Full and partial matches, or zero_result with the number of plans each condition excluded.","content":{"application/json":{"schema":{"type":"object","required":["as_of","needs_input","counts","full_matches","partial_matches","zero_result","assumptions","notes"],"properties":{"as_of":{"type":"string"},"request":{"type":"object"},"needs_input":{"type":"array","items":{"type":"object","required":["field","reason"],"properties":{"field":{"type":"string"},"reason":{"type":"string"}}}},"counts":{"type":"object","required":["candidates","full","partial","no_match"],"properties":{"candidates":{"type":"integer"},"full":{"type":"integer"},"partial":{"type":"integer"},"no_match":{"type":"integer"}}},"full_matches":{"type":"array","items":{"type":"object","required":["offer_id","offer_name","product_id","provider_name","match","meets_all","verdict","billing","monthly_cost","conditions","unmet_conditions","unknown_conditions","link","checked_at"],"properties":{"offer_id":{"type":"string"},"offer_name":{"type":"string"},"product_id":{"type":"string"},"product_name":{"type":"string"},"provider_id":{"type":"string"},"provider_name":{"type":"string"},"listed":{"type":"boolean"},"match":{"enum":["FULL_MATCH","PARTIAL_MATCH","NO_MATCH"]},"meets_all":{"enum":[true,false,"unknown"],"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."},"verdict":{"type":"string","description":"One sentence: the conditions met, or the ones not met or not stated, with the reason."},"billing":{"type":"string"},"billing_options":{"type":"array","items":{"type":"string"}},"monthly_cost":{"type":"object","required":["status","usd","explanation"],"properties":{"status":{"enum":["exact","range","lower_bound","unknown"]},"usd":{"type":["number","null"]},"low":{"type":["number","null"]},"high":{"type":["number","null"]},"lower_bound":{"type":["number","null"]},"upfront_usd":{"type":["number","null"]},"explanation":{"type":"string"},"facts":{"type":"array","items":{"type":"object","required":["key","status","value","level","evidence","checked_at"],"properties":{"key":{"type":"string"},"label":{"type":"string"},"status":{"enum":["TRUE","FALSE","NOT_SUPPORTED","UNKNOWN","CONFLICT","STALE","MISSING"],"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."},"value":{},"level":{"type":["string","null"],"description":"Where the fact is recorded: offer (the plan), product or provider."},"via_exception":{"type":"boolean","description":"Present and true when a plan-specific exception replaced the general value."},"note":{"type":"string"},"derived":{"type":"string","description":"How the value follows from the quoted sentence when it is not literal."},"evidence":{"type":"array","items":{"type":"object","required":["url","quote"],"properties":{"url":{"type":"string","description":"Official page the sentence was found on."},"quote":{"type":"string","description":"The sentence as it appears on that page."},"source_type":{"enum":["official_pricing","official_docs","third_party"],"description":"Only with detail=full."},"retrieved_at":{"type":"string","description":"Date the page was read (YYYY-MM-DD). Only with detail=full."}}}},"checked_at":{"type":["string","null"]},"stale":{"type":"boolean"},"applies_to":{"type":["object","null"],"description":"get_details only: billing options the fact is limited to."},"exceptions":{"type":"array","description":"get_details only: plans with a different value."},"also_stated_in":{"type":"array","items":{"type":"string"},"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."}}},"description":"Price facts the cost was computed from."}}},"conditions":{"type":"array","items":{"type":"object","required":["condition","label","required","verdict","reason","facts"],"properties":{"condition":{"type":"string"},"label":{"type":"string"},"required":{"type":"boolean"},"verdict":{"enum":["MET","UNMET","UNKNOWN"]},"reason":{"type":"string"},"facts":{"type":"array","items":{"type":"object","required":["key","status","value","level","evidence","checked_at"],"properties":{"key":{"type":"string"},"label":{"type":"string"},"status":{"enum":["TRUE","FALSE","NOT_SUPPORTED","UNKNOWN","CONFLICT","STALE","MISSING"],"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."},"value":{},"level":{"type":["string","null"],"description":"Where the fact is recorded: offer (the plan), product or provider."},"via_exception":{"type":"boolean","description":"Present and true when a plan-specific exception replaced the general value."},"note":{"type":"string"},"derived":{"type":"string","description":"How the value follows from the quoted sentence when it is not literal."},"evidence":{"type":"array","items":{"type":"object","required":["url","quote"],"properties":{"url":{"type":"string","description":"Official page the sentence was found on."},"quote":{"type":"string","description":"The sentence as it appears on that page."},"source_type":{"enum":["official_pricing","official_docs","third_party"],"description":"Only with detail=full."},"retrieved_at":{"type":"string","description":"Date the page was read (YYYY-MM-DD). Only with detail=full."}}}},"checked_at":{"type":["string","null"]},"stale":{"type":"boolean"},"applies_to":{"type":["object","null"],"description":"get_details only: billing options the fact is limited to."},"exceptions":{"type":"array","description":"get_details only: plans with a different value."},"also_stated_in":{"type":"array","items":{"type":"string"},"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."}}},"description":"Facts the verdict was judged from. The monthly budget is judged from monthly_cost; its price facts are listed there only."}}}},"unmet_conditions":{"type":"array","items":{"type":"string"}},"unknown_conditions":{"type":"array","items":{"type":"string"}},"preferred_met":{"type":"integer"},"assumptions":{"type":"array","items":{"type":"string"}},"prices_exclude_tax":{"type":["boolean","null"]},"link":{"type":"object","required":["url","landing","link_level","affiliate"],"properties":{"url":{"type":"string"},"landing":{"type":"string"},"link_level":{"type":"string"},"note":{"type":["string","null"]},"affiliate":{"type":"object","required":["status"],"properties":{"program":{"type":["string","null"]},"status":{"type":"string"},"disclosure":{"type":["string","null"]}}}}},"page_url":{"type":"string"},"checked_at":{"type":["string","null"]}}}},"partial_matches":{"type":"array","items":{"type":"object","required":["offer_id","offer_name","product_id","provider_name","match","meets_all","verdict","billing","monthly_cost","conditions","unmet_conditions","unknown_conditions","link","checked_at"],"properties":{"offer_id":{"type":"string"},"offer_name":{"type":"string"},"product_id":{"type":"string"},"product_name":{"type":"string"},"provider_id":{"type":"string"},"provider_name":{"type":"string"},"listed":{"type":"boolean"},"match":{"enum":["FULL_MATCH","PARTIAL_MATCH","NO_MATCH"]},"meets_all":{"enum":[true,false,"unknown"],"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."},"verdict":{"type":"string","description":"One sentence: the conditions met, or the ones not met or not stated, with the reason."},"billing":{"type":"string"},"billing_options":{"type":"array","items":{"type":"string"}},"monthly_cost":{"type":"object","required":["status","usd","explanation"],"properties":{"status":{"enum":["exact","range","lower_bound","unknown"]},"usd":{"type":["number","null"]},"low":{"type":["number","null"]},"high":{"type":["number","null"]},"lower_bound":{"type":["number","null"]},"upfront_usd":{"type":["number","null"]},"explanation":{"type":"string"},"facts":{"type":"array","items":{"type":"object","required":["key","status","value","level","evidence","checked_at"],"properties":{"key":{"type":"string"},"label":{"type":"string"},"status":{"enum":["TRUE","FALSE","NOT_SUPPORTED","UNKNOWN","CONFLICT","STALE","MISSING"],"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."},"value":{},"level":{"type":["string","null"],"description":"Where the fact is recorded: offer (the plan), product or provider."},"via_exception":{"type":"boolean","description":"Present and true when a plan-specific exception replaced the general value."},"note":{"type":"string"},"derived":{"type":"string","description":"How the value follows from the quoted sentence when it is not literal."},"evidence":{"type":"array","items":{"type":"object","required":["url","quote"],"properties":{"url":{"type":"string","description":"Official page the sentence was found on."},"quote":{"type":"string","description":"The sentence as it appears on that page."},"source_type":{"enum":["official_pricing","official_docs","third_party"],"description":"Only with detail=full."},"retrieved_at":{"type":"string","description":"Date the page was read (YYYY-MM-DD). Only with detail=full."}}}},"checked_at":{"type":["string","null"]},"stale":{"type":"boolean"},"applies_to":{"type":["object","null"],"description":"get_details only: billing options the fact is limited to."},"exceptions":{"type":"array","description":"get_details only: plans with a different value."},"also_stated_in":{"type":"array","items":{"type":"string"},"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."}}},"description":"Price facts the cost was computed from."}}},"conditions":{"type":"array","items":{"type":"object","required":["condition","label","required","verdict","reason","facts"],"properties":{"condition":{"type":"string"},"label":{"type":"string"},"required":{"type":"boolean"},"verdict":{"enum":["MET","UNMET","UNKNOWN"]},"reason":{"type":"string"},"facts":{"type":"array","items":{"type":"object","required":["key","status","value","level","evidence","checked_at"],"properties":{"key":{"type":"string"},"label":{"type":"string"},"status":{"enum":["TRUE","FALSE","NOT_SUPPORTED","UNKNOWN","CONFLICT","STALE","MISSING"],"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."},"value":{},"level":{"type":["string","null"],"description":"Where the fact is recorded: offer (the plan), product or provider."},"via_exception":{"type":"boolean","description":"Present and true when a plan-specific exception replaced the general value."},"note":{"type":"string"},"derived":{"type":"string","description":"How the value follows from the quoted sentence when it is not literal."},"evidence":{"type":"array","items":{"type":"object","required":["url","quote"],"properties":{"url":{"type":"string","description":"Official page the sentence was found on."},"quote":{"type":"string","description":"The sentence as it appears on that page."},"source_type":{"enum":["official_pricing","official_docs","third_party"],"description":"Only with detail=full."},"retrieved_at":{"type":"string","description":"Date the page was read (YYYY-MM-DD). Only with detail=full."}}}},"checked_at":{"type":["string","null"]},"stale":{"type":"boolean"},"applies_to":{"type":["object","null"],"description":"get_details only: billing options the fact is limited to."},"exceptions":{"type":"array","description":"get_details only: plans with a different value."},"also_stated_in":{"type":"array","items":{"type":"string"},"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."}}},"description":"Facts the verdict was judged from. The monthly budget is judged from monthly_cost; its price facts are listed there only."}}}},"unmet_conditions":{"type":"array","items":{"type":"string"}},"unknown_conditions":{"type":"array","items":{"type":"string"}},"preferred_met":{"type":"integer"},"assumptions":{"type":"array","items":{"type":"string"}},"prices_exclude_tax":{"type":["boolean","null"]},"link":{"type":"object","required":["url","landing","link_level","affiliate"],"properties":{"url":{"type":"string"},"landing":{"type":"string"},"link_level":{"type":"string"},"note":{"type":["string","null"]},"affiliate":{"type":"object","required":["status"],"properties":{"program":{"type":["string","null"]},"status":{"type":"string"},"disclosure":{"type":["string","null"]}}}}},"page_url":{"type":"string"},"checked_at":{"type":["string","null"]}}}},"zero_result":{"type":["object","null"],"properties":{"note":{"type":"string"},"conditions":{"type":"array","items":{"type":"object","required":["condition","label","excluded","would_match_if_relaxed","closest"],"properties":{"condition":{"type":"string"},"label":{"type":"string"},"excluded":{"type":"integer"},"unknown":{"type":"integer"},"would_match_if_relaxed":{"type":"integer"},"closest":{"type":["object","null"],"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\").","required":["offer_id","offer_name","provider_name","billing","monthly_cost","meets_all","fails"],"properties":{"offer_id":{"type":"string"},"offer_name":{"type":"string"},"provider_name":{"type":"string"},"billing":{"type":"string"},"monthly_cost":{"type":"object"},"meets_all":{"enum":[true,false,"unknown"],"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."},"fails":{"type":"string"},"page_url":{"type":"string"}}}}}}}},"assumptions":{"type":"array","items":{"type":"string"}},"notes":{"type":"array","items":{"type":"string"}}}}}}},"400":{"description":"A field is invalid; errors lists each field and the reason.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/check":{"post":{"operationId":"check_conditions","summary":"Check plans against conditions","description":"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). 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.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"offer_ids":{"type":"array","minItems":1,"maxItems":20,"uniqueItems":true,"items":{"type":"string","minLength":1,"maxLength":80},"description":"Plan ids to check (from search or get_details)."},"plans":{"type":"array","minItems":1,"maxItems":20,"uniqueItems":true,"items":{"type":"string","minLength":2,"maxLength":300},"description":"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."},"monthly_pages":{"type":"object","additionalProperties":false,"minProperties":1,"properties":{"plain_html":{"type":"integer","minimum":0},"javascript":{"type":"integer","minimum":0},"premium_proxy":{"type":"integer","minimum":0},"javascript_premium_proxy":{"type":"integer","minimum":0}},"description":"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)."},"monthly_pages_total":{"type":"integer","minimum":0,"description":"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."},"monthly_searches":{"type":"integer","minimum":0,"description":"Search requests per month (one results page each)."},"structured_extraction_pages":{"type":"integer","minimum":0,"description":"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."},"ai_extraction_pages":{"type":"integer","minimum":0,"description":"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."},"browser_seconds_per_page":{"type":"number","exclusiveMinimum":0,"description":"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."},"min_concurrency":{"type":"integer","minimum":1,"description":"Minimum number of concurrent requests (or browsers) the plan must allow."},"min_requests_per_minute":{"type":"number","exclusiveMinimum":0,"description":"Minimum request rate the plan must allow, per minute."},"max_monthly_cost_usd":{"type":"number","minimum":0,"description":"Monthly budget in USD before tax. Compared with listed prices; annual plans use their per-month equivalent."},"billing_types":{"type":"array","minItems":1,"uniqueItems":true,"items":{"type":"string","enum":["monthly_subscription","annual_subscription","pay_as_you_go","prepaid_credits"]},"description":"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."},"needs_recurring_free_tier":{"type":"boolean","description":"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":{"type":"boolean","description":"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."},"only_successful_requests_billed":{"type":"boolean","description":"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."},"target_errors_not_billed":{"type":"boolean","description":"Error responses from the target site (e.g. 404) must not be billed."},"exit_ip_countries":{"type":"array","minItems":1,"uniqueItems":true,"items":{"type":"string","pattern":"^[A-Z]{2}$"},"description":"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."},"data_regions":{"type":"array","minItems":1,"uniqueItems":true,"items":{"type":"string","minLength":2,"maxLength":20},"description":"Regions where data must be stored or processed, e.g. [\"EU\"]. Different from exit-IP countries."},"realtime_search_required":{"type":"boolean","description":"Search results must be returned in real time (not through a queue)."},"search_countries":{"type":"array","minItems":1,"uniqueItems":true,"items":{"type":"string","pattern":"^[A-Z]{2}$"},"description":"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."},"search_result_types":{"type":"array","minItems":1,"uniqueItems":true,"items":{"type":"string","enum":["organic","ads","local_pack","knowledge_graph","people_also_ask","related_searches","shopping","news","images","videos","ai_overview"]},"description":"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."},"search_engines":{"type":"array","minItems":1,"uniqueItems":true,"items":{"type":"string","enum":["google","bing","yahoo","yandex","baidu","duckduckgo","naver","brave"]},"description":"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."},"min_pages_per_crawl":{"type":"integer","minimum":1,"description":"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."},"preferred":{"type":"object","additionalProperties":false,"properties":{"min_concurrency":{"type":"integer","minimum":1,"description":"Minimum number of concurrent requests (or browsers) the plan must allow."},"min_requests_per_minute":{"type":"number","exclusiveMinimum":0,"description":"Minimum request rate the plan must allow, per minute."},"max_monthly_cost_usd":{"type":"number","minimum":0,"description":"Monthly budget in USD before tax. Compared with listed prices; annual plans use their per-month equivalent."},"billing_types":{"type":"array","minItems":1,"uniqueItems":true,"items":{"type":"string","enum":["monthly_subscription","annual_subscription","pay_as_you_go","prepaid_credits"]},"description":"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."},"needs_recurring_free_tier":{"type":"boolean","description":"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":{"type":"boolean","description":"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."},"only_successful_requests_billed":{"type":"boolean","description":"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."},"target_errors_not_billed":{"type":"boolean","description":"Error responses from the target site (e.g. 404) must not be billed."},"exit_ip_countries":{"type":"array","minItems":1,"uniqueItems":true,"items":{"type":"string","pattern":"^[A-Z]{2}$"},"description":"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."},"data_regions":{"type":"array","minItems":1,"uniqueItems":true,"items":{"type":"string","minLength":2,"maxLength":20},"description":"Regions where data must be stored or processed, e.g. [\"EU\"]. Different from exit-IP countries."},"realtime_search_required":{"type":"boolean","description":"Search results must be returned in real time (not through a queue)."},"search_countries":{"type":"array","minItems":1,"uniqueItems":true,"items":{"type":"string","pattern":"^[A-Z]{2}$"},"description":"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."},"search_result_types":{"type":"array","minItems":1,"uniqueItems":true,"items":{"type":"string","enum":["organic","ads","local_pack","knowledge_graph","people_also_ask","related_searches","shopping","news","images","videos","ai_overview"]},"description":"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."},"search_engines":{"type":"array","minItems":1,"uniqueItems":true,"items":{"type":"string","enum":["google","bing","yahoo","yandex","baidu","duckduckgo","naver","brave"]},"description":"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."},"min_pages_per_crawl":{"type":"integer","minimum":1,"description":"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."}},"description":"Nice-to-have conditions; they do not filter, they break ties."},"detail":{"type":"string","enum":["summary","full"],"default":"summary","description":"summary returns one source sentence per fact; full returns every recorded fact and sentence."}},"description":"Give offer_ids, plans or both; 20 plans at most in total."}}}},"responses":{"200":{"description":"One result per plan id and per resolved plan name or URL, in request order; resolution shows how each name or URL was read.","content":{"application/json":{"schema":{"type":"object","required":["as_of","needs_input","results","assumptions","notes"],"properties":{"as_of":{"type":"string"},"request":{"type":"object"},"needs_input":{"type":"array","items":{"type":"object","required":["field","reason"],"properties":{"field":{"type":"string"},"reason":{"type":"string"}}}},"resolution":{"type":"array","description":"How each entry of plans was read.","items":{"type":"object","required":["input","status","offer_id","candidates"],"properties":{"input":{"type":"string"},"status":{"enum":["resolved","ambiguous","not_found"],"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."},"matched_by":{"enum":["id","name","url",null]},"offer_id":{"type":["string","null"]},"candidates":{"type":"array","items":{"type":"object","required":["offer_id","offer_name","provider_name"],"properties":{"offer_id":{"type":"string"},"offer_name":{"type":"string"},"product_name":{"type":"string"},"provider_name":{"type":"string"},"listed":{"type":"boolean"}}}},"candidates_total":{"type":"integer"},"note":{"type":["string","null"]}}}},"results":{"type":"array","items":{"type":"object","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"],"properties":{"offer_id":{"type":"string"},"offer_name":{"type":"string"},"product_id":{"type":"string"},"product_name":{"type":"string"},"provider_id":{"type":"string"},"provider_name":{"type":"string"},"listed":{"type":"boolean"},"match":{"enum":["FULL_MATCH","PARTIAL_MATCH","NO_MATCH"]},"meets_all":{"enum":[true,false,"unknown"],"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."},"verdict":{"type":"string","description":"One sentence: the conditions met, or the ones not met or not stated, with the reason."},"billing":{"type":"string"},"billing_options":{"type":"array","items":{"type":"string"}},"monthly_cost":{"type":"object","required":["status","usd","explanation"],"properties":{"status":{"enum":["exact","range","lower_bound","unknown"]},"usd":{"type":["number","null"]},"low":{"type":["number","null"]},"high":{"type":["number","null"]},"lower_bound":{"type":["number","null"]},"upfront_usd":{"type":["number","null"]},"explanation":{"type":"string"},"facts":{"type":"array","items":{"type":"object","required":["key","status","value","level","evidence","checked_at"],"properties":{"key":{"type":"string"},"label":{"type":"string"},"status":{"enum":["TRUE","FALSE","NOT_SUPPORTED","UNKNOWN","CONFLICT","STALE","MISSING"],"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."},"value":{},"level":{"type":["string","null"],"description":"Where the fact is recorded: offer (the plan), product or provider."},"via_exception":{"type":"boolean","description":"Present and true when a plan-specific exception replaced the general value."},"note":{"type":"string"},"derived":{"type":"string","description":"How the value follows from the quoted sentence when it is not literal."},"evidence":{"type":"array","items":{"type":"object","required":["url","quote"],"properties":{"url":{"type":"string","description":"Official page the sentence was found on."},"quote":{"type":"string","description":"The sentence as it appears on that page."},"source_type":{"enum":["official_pricing","official_docs","third_party"],"description":"Only with detail=full."},"retrieved_at":{"type":"string","description":"Date the page was read (YYYY-MM-DD). Only with detail=full."}}}},"checked_at":{"type":["string","null"]},"stale":{"type":"boolean"},"applies_to":{"type":["object","null"],"description":"get_details only: billing options the fact is limited to."},"exceptions":{"type":"array","description":"get_details only: plans with a different value."},"also_stated_in":{"type":"array","items":{"type":"string"},"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."}}},"description":"Price facts the cost was computed from."}}},"conditions":{"type":"array","items":{"type":"object","required":["condition","label","required","verdict","reason","facts"],"properties":{"condition":{"type":"string"},"label":{"type":"string"},"required":{"type":"boolean"},"verdict":{"enum":["MET","UNMET","UNKNOWN"]},"reason":{"type":"string"},"facts":{"type":"array","items":{"type":"object","required":["key","status","value","level","evidence","checked_at"],"properties":{"key":{"type":"string"},"label":{"type":"string"},"status":{"enum":["TRUE","FALSE","NOT_SUPPORTED","UNKNOWN","CONFLICT","STALE","MISSING"],"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."},"value":{},"level":{"type":["string","null"],"description":"Where the fact is recorded: offer (the plan), product or provider."},"via_exception":{"type":"boolean","description":"Present and true when a plan-specific exception replaced the general value."},"note":{"type":"string"},"derived":{"type":"string","description":"How the value follows from the quoted sentence when it is not literal."},"evidence":{"type":"array","items":{"type":"object","required":["url","quote"],"properties":{"url":{"type":"string","description":"Official page the sentence was found on."},"quote":{"type":"string","description":"The sentence as it appears on that page."},"source_type":{"enum":["official_pricing","official_docs","third_party"],"description":"Only with detail=full."},"retrieved_at":{"type":"string","description":"Date the page was read (YYYY-MM-DD). Only with detail=full."}}}},"checked_at":{"type":["string","null"]},"stale":{"type":"boolean"},"applies_to":{"type":["object","null"],"description":"get_details only: billing options the fact is limited to."},"exceptions":{"type":"array","description":"get_details only: plans with a different value."},"also_stated_in":{"type":"array","items":{"type":"string"},"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."}}},"description":"Facts the verdict was judged from. The monthly budget is judged from monthly_cost; its price facts are listed there only."}}}},"unmet_conditions":{"type":"array","items":{"type":"string"}},"unknown_conditions":{"type":"array","items":{"type":"string"}},"preferred_met":{"type":"integer"},"assumptions":{"type":"array","items":{"type":"string"}},"prices_exclude_tax":{"type":["boolean","null"]},"link":{"type":"object","required":["url","landing","link_level","affiliate"],"properties":{"url":{"type":"string"},"landing":{"type":"string"},"link_level":{"type":"string"},"note":{"type":["string","null"]},"affiliate":{"type":"object","required":["status"],"properties":{"program":{"type":["string","null"]},"status":{"type":"string"},"disclosure":{"type":["string","null"]}}}}},"page_url":{"type":"string"},"checked_at":{"type":["string","null"]},"cheapest_in_product":{"type":["object","null"],"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.","required":["offer_id","offer_name","billing","monthly_cost","is_this_plan"],"properties":{"offer_id":{"type":"string"},"offer_name":{"type":"string"},"billing":{"type":"string"},"monthly_cost":{"type":"object"},"page_url":{"type":"string"},"is_this_plan":{"type":"boolean"}}}}}},"assumptions":{"type":"array","items":{"type":"string"}},"notes":{"type":"array","items":{"type":"string"}}}}}}},"400":{"description":"A field is invalid or a plan id is unknown.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/scenarios":{"post":{"operationId":"cost_scenarios","summary":"Plan costs as the workload changes","description":"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 web data 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.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"product_types":{"type":"array","uniqueItems":true,"minItems":1,"items":{"type":"string","enum":["scraping_api","serp_api","headless_browser","platform"]},"description":"Limit to these product types. Default: every type that can serve the workload."},"monthly_pages":{"type":"object","additionalProperties":false,"minProperties":1,"properties":{"plain_html":{"type":"integer","minimum":0},"javascript":{"type":"integer","minimum":0},"premium_proxy":{"type":"integer","minimum":0},"javascript_premium_proxy":{"type":"integer","minimum":0}},"description":"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)."},"monthly_pages_total":{"type":"integer","minimum":0,"description":"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."},"monthly_searches":{"type":"integer","minimum":0,"description":"Search requests per month (one results page each)."},"structured_extraction_pages":{"type":"integer","minimum":0,"description":"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."},"ai_extraction_pages":{"type":"integer","minimum":0,"description":"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."},"browser_seconds_per_page":{"type":"number","exclusiveMinimum":0,"description":"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."},"min_concurrency":{"type":"integer","minimum":1,"description":"Minimum number of concurrent requests (or browsers) the plan must allow."},"min_requests_per_minute":{"type":"number","exclusiveMinimum":0,"description":"Minimum request rate the plan must allow, per minute."},"max_monthly_cost_usd":{"type":"number","minimum":0,"description":"Monthly budget in USD before tax. Compared with listed prices; annual plans use their per-month equivalent."},"billing_types":{"type":"array","minItems":1,"uniqueItems":true,"items":{"type":"string","enum":["monthly_subscription","annual_subscription","pay_as_you_go","prepaid_credits"]},"description":"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."},"needs_recurring_free_tier":{"type":"boolean","description":"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":{"type":"boolean","description":"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."},"only_successful_requests_billed":{"type":"boolean","description":"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."},"target_errors_not_billed":{"type":"boolean","description":"Error responses from the target site (e.g. 404) must not be billed."},"exit_ip_countries":{"type":"array","minItems":1,"uniqueItems":true,"items":{"type":"string","pattern":"^[A-Z]{2}$"},"description":"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."},"data_regions":{"type":"array","minItems":1,"uniqueItems":true,"items":{"type":"string","minLength":2,"maxLength":20},"description":"Regions where data must be stored or processed, e.g. [\"EU\"]. Different from exit-IP countries."},"realtime_search_required":{"type":"boolean","description":"Search results must be returned in real time (not through a queue)."},"search_countries":{"type":"array","minItems":1,"uniqueItems":true,"items":{"type":"string","pattern":"^[A-Z]{2}$"},"description":"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."},"search_result_types":{"type":"array","minItems":1,"uniqueItems":true,"items":{"type":"string","enum":["organic","ads","local_pack","knowledge_graph","people_also_ask","related_searches","shopping","news","images","videos","ai_overview"]},"description":"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."},"search_engines":{"type":"array","minItems":1,"uniqueItems":true,"items":{"type":"string","enum":["google","bing","yahoo","yandex","baidu","duckduckgo","naver","brave"]},"description":"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."},"min_pages_per_crawl":{"type":"integer","minimum":1,"description":"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."},"preferred":{"type":"object","additionalProperties":false,"properties":{"min_concurrency":{"type":"integer","minimum":1,"description":"Minimum number of concurrent requests (or browsers) the plan must allow."},"min_requests_per_minute":{"type":"number","exclusiveMinimum":0,"description":"Minimum request rate the plan must allow, per minute."},"max_monthly_cost_usd":{"type":"number","minimum":0,"description":"Monthly budget in USD before tax. Compared with listed prices; annual plans use their per-month equivalent."},"billing_types":{"type":"array","minItems":1,"uniqueItems":true,"items":{"type":"string","enum":["monthly_subscription","annual_subscription","pay_as_you_go","prepaid_credits"]},"description":"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."},"needs_recurring_free_tier":{"type":"boolean","description":"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":{"type":"boolean","description":"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."},"only_successful_requests_billed":{"type":"boolean","description":"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."},"target_errors_not_billed":{"type":"boolean","description":"Error responses from the target site (e.g. 404) must not be billed."},"exit_ip_countries":{"type":"array","minItems":1,"uniqueItems":true,"items":{"type":"string","pattern":"^[A-Z]{2}$"},"description":"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."},"data_regions":{"type":"array","minItems":1,"uniqueItems":true,"items":{"type":"string","minLength":2,"maxLength":20},"description":"Regions where data must be stored or processed, e.g. [\"EU\"]. Different from exit-IP countries."},"realtime_search_required":{"type":"boolean","description":"Search results must be returned in real time (not through a queue)."},"search_countries":{"type":"array","minItems":1,"uniqueItems":true,"items":{"type":"string","pattern":"^[A-Z]{2}$"},"description":"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."},"search_result_types":{"type":"array","minItems":1,"uniqueItems":true,"items":{"type":"string","enum":["organic","ads","local_pack","knowledge_graph","people_also_ask","related_searches","shopping","news","images","videos","ai_overview"]},"description":"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."},"search_engines":{"type":"array","minItems":1,"uniqueItems":true,"items":{"type":"string","enum":["google","bing","yahoo","yandex","baidu","duckduckgo","naver","brave"]},"description":"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."},"min_pages_per_crawl":{"type":"integer","minimum":1,"description":"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."}},"description":"Nice-to-have conditions; they do not filter, they break ties."},"target":{"type":"object","additionalProperties":false,"minProperties":1,"properties":{"monthly_pages":{"type":"object","additionalProperties":false,"minProperties":1,"properties":{"plain_html":{"type":"integer","minimum":0},"javascript":{"type":"integer","minimum":0},"premium_proxy":{"type":"integer","minimum":0},"javascript_premium_proxy":{"type":"integer","minimum":0}},"description":"Pages per month by type at the end of the path. Types not listed keep their current count; give 0 to drop a type."},"monthly_searches":{"type":"integer","minimum":0,"description":"Searches per month at the end of the path."},"structured_extraction_pages":{"type":"integer","minimum":0,"description":"Structured-extraction pages per month at the end of the path."},"ai_extraction_pages":{"type":"integer","minimum":0,"description":"AI-extraction pages per month at the end of the path."}},"description":"Workload at the end of the path; fields not given keep their current value. Give target or scale."},"scale":{"type":"number","exclusiveMinimum":0,"maximum":1000,"description":"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."},"offer_ids":{"type":"array","minItems":1,"maxItems":10,"uniqueItems":true,"items":{"type":"string","minLength":1,"maxLength":80},"description":"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."},"detail":{"type":"string","enum":["summary","full"],"default":"summary","description":"summary returns one source sentence per fact; full returns every recorded fact and sentence."}}}}}},"responses":{"200":{"description":"Cheapest full matches at both ends of the path, the workloads where the cheapest plan changes, and events of the tracked plans.","content":{"application/json":{"schema":{"type":"object","required":["as_of","needs_input","compared","path","counts","at_start","at_end","switches","tracked","plans","assumptions","notes"],"properties":{"as_of":{"type":"string"},"request":{"type":"object"},"needs_input":{"type":"array","items":{"type":"object","required":["field","reason"],"properties":{"field":{"type":"string"},"reason":{"type":"string"}}}},"compared":{"enum":["all_plans","given_plans"]},"path":{"type":["object","null"],"required":["start","end","steps","resolution"],"properties":{"start":{"type":"object","description":"A monthly workload in the request format.","properties":{"monthly_pages":{"type":"object"},"monthly_searches":{"type":"integer"},"structured_extraction_pages":{"type":"integer"},"ai_extraction_pages":{"type":"integer"}}},"end":{"type":"object","description":"A monthly workload in the request format.","properties":{"monthly_pages":{"type":"object"},"monthly_searches":{"type":"integer"},"structured_extraction_pages":{"type":"integer"},"ai_extraction_pages":{"type":"integer"}}},"steps":{"type":"integer"},"resolution":{"type":"string"}}},"counts":{"type":["object","null"],"required":["start","end"],"properties":{"start":{"type":"object","required":["candidates","full","partial","no_match"],"properties":{"candidates":{"type":"integer"},"full":{"type":"integer"},"partial":{"type":"integer"},"no_match":{"type":"integer"}}},"end":{"type":"object","required":["candidates","full","partial","no_match"],"properties":{"candidates":{"type":"integer"},"full":{"type":"integer"},"partial":{"type":"integer"},"no_match":{"type":"integer"}}}}},"at_start":{"type":"array","items":{"type":"object","required":["offer_id","offer_name","provider_name","billing","match","monthly_cost"],"properties":{"offer_id":{"type":"string"},"offer_name":{"type":"string"},"provider_name":{"type":"string"},"billing":{"type":"string"},"match":{"enum":["FULL_MATCH","PARTIAL_MATCH","NO_MATCH"]},"monthly_cost":{"type":"object","required":["status","usd","explanation"],"properties":{"status":{"enum":["exact","range","lower_bound","unknown"]},"usd":{"type":["number","null"]},"low":{"type":["number","null"]},"high":{"type":["number","null"]},"lower_bound":{"type":["number","null"]},"upfront_usd":{"type":["number","null"]},"explanation":{"type":"string"},"facts":{"type":"array","items":{"type":"object","required":["key","status","value","level","evidence","checked_at"],"properties":{"key":{"type":"string"},"label":{"type":"string"},"status":{"enum":["TRUE","FALSE","NOT_SUPPORTED","UNKNOWN","CONFLICT","STALE","MISSING"],"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."},"value":{},"level":{"type":["string","null"],"description":"Where the fact is recorded: offer (the plan), product or provider."},"via_exception":{"type":"boolean","description":"Present and true when a plan-specific exception replaced the general value."},"note":{"type":"string"},"derived":{"type":"string","description":"How the value follows from the quoted sentence when it is not literal."},"evidence":{"type":"array","items":{"type":"object","required":["url","quote"],"properties":{"url":{"type":"string","description":"Official page the sentence was found on."},"quote":{"type":"string","description":"The sentence as it appears on that page."},"source_type":{"enum":["official_pricing","official_docs","third_party"],"description":"Only with detail=full."},"retrieved_at":{"type":"string","description":"Date the page was read (YYYY-MM-DD). Only with detail=full."}}}},"checked_at":{"type":["string","null"]},"stale":{"type":"boolean"},"applies_to":{"type":["object","null"],"description":"get_details only: billing options the fact is limited to."},"exceptions":{"type":"array","description":"get_details only: plans with a different value."},"also_stated_in":{"type":"array","items":{"type":"string"},"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."}}},"description":"Price facts the cost was computed from."}}}}},"description":"Up to three cheapest full matches at the current workload."},"at_end":{"type":"array","items":{"type":"object","required":["offer_id","offer_name","provider_name","billing","match","monthly_cost"],"properties":{"offer_id":{"type":"string"},"offer_name":{"type":"string"},"provider_name":{"type":"string"},"billing":{"type":"string"},"match":{"enum":["FULL_MATCH","PARTIAL_MATCH","NO_MATCH"]},"monthly_cost":{"type":"object","required":["status","usd","explanation"],"properties":{"status":{"enum":["exact","range","lower_bound","unknown"]},"usd":{"type":["number","null"]},"low":{"type":["number","null"]},"high":{"type":["number","null"]},"lower_bound":{"type":["number","null"]},"upfront_usd":{"type":["number","null"]},"explanation":{"type":"string"},"facts":{"type":"array","items":{"type":"object","required":["key","status","value","level","evidence","checked_at"],"properties":{"key":{"type":"string"},"label":{"type":"string"},"status":{"enum":["TRUE","FALSE","NOT_SUPPORTED","UNKNOWN","CONFLICT","STALE","MISSING"],"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."},"value":{},"level":{"type":["string","null"],"description":"Where the fact is recorded: offer (the plan), product or provider."},"via_exception":{"type":"boolean","description":"Present and true when a plan-specific exception replaced the general value."},"note":{"type":"string"},"derived":{"type":"string","description":"How the value follows from the quoted sentence when it is not literal."},"evidence":{"type":"array","items":{"type":"object","required":["url","quote"],"properties":{"url":{"type":"string","description":"Official page the sentence was found on."},"quote":{"type":"string","description":"The sentence as it appears on that page."},"source_type":{"enum":["official_pricing","official_docs","third_party"],"description":"Only with detail=full."},"retrieved_at":{"type":"string","description":"Date the page was read (YYYY-MM-DD). Only with detail=full."}}}},"checked_at":{"type":["string","null"]},"stale":{"type":"boolean"},"applies_to":{"type":["object","null"],"description":"get_details only: billing options the fact is limited to."},"exceptions":{"type":"array","description":"get_details only: plans with a different value."},"also_stated_in":{"type":"array","items":{"type":"string"},"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."}}},"description":"Price facts the cost was computed from."}}}}},"description":"Up to three cheapest full matches at the target workload."},"switches":{"type":"array","description":"Each workload on the path where the cheapest full match changes.","items":{"type":"object","required":["workload","from","to","reason"],"properties":{"workload":{"type":"object","description":"A monthly workload in the request format.","properties":{"monthly_pages":{"type":"object"},"monthly_searches":{"type":"integer"},"structured_extraction_pages":{"type":"integer"},"ai_extraction_pages":{"type":"integer"}}},"from":{"type":["object","null"],"required":["offer_id","offer_name","provider_name","billing","match","monthly_cost"],"properties":{"offer_id":{"type":"string"},"offer_name":{"type":"string"},"provider_name":{"type":"string"},"billing":{"type":"string"},"match":{"enum":["FULL_MATCH","PARTIAL_MATCH","NO_MATCH"]},"monthly_cost":{"type":"object","required":["status","usd","explanation"],"properties":{"status":{"enum":["exact","range","lower_bound","unknown"]},"usd":{"type":["number","null"]},"low":{"type":["number","null"]},"high":{"type":["number","null"]},"lower_bound":{"type":["number","null"]},"upfront_usd":{"type":["number","null"]},"explanation":{"type":"string"},"facts":{"type":"array","items":{"type":"object","required":["key","status","value","level","evidence","checked_at"],"properties":{"key":{"type":"string"},"label":{"type":"string"},"status":{"enum":["TRUE","FALSE","NOT_SUPPORTED","UNKNOWN","CONFLICT","STALE","MISSING"],"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."},"value":{},"level":{"type":["string","null"],"description":"Where the fact is recorded: offer (the plan), product or provider."},"via_exception":{"type":"boolean","description":"Present and true when a plan-specific exception replaced the general value."},"note":{"type":"string"},"derived":{"type":"string","description":"How the value follows from the quoted sentence when it is not literal."},"evidence":{"type":"array","items":{"type":"object","required":["url","quote"],"properties":{"url":{"type":"string","description":"Official page the sentence was found on."},"quote":{"type":"string","description":"The sentence as it appears on that page."},"source_type":{"enum":["official_pricing","official_docs","third_party"],"description":"Only with detail=full."},"retrieved_at":{"type":"string","description":"Date the page was read (YYYY-MM-DD). Only with detail=full."}}}},"checked_at":{"type":["string","null"]},"stale":{"type":"boolean"},"applies_to":{"type":["object","null"],"description":"get_details only: billing options the fact is limited to."},"exceptions":{"type":"array","description":"get_details only: plans with a different value."},"also_stated_in":{"type":"array","items":{"type":"string"},"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."}}},"description":"Price facts the cost was computed from."}}}}},"to":{"type":["object","null"],"required":["offer_id","offer_name","provider_name","billing","match","monthly_cost"],"properties":{"offer_id":{"type":"string"},"offer_name":{"type":"string"},"provider_name":{"type":"string"},"billing":{"type":"string"},"match":{"enum":["FULL_MATCH","PARTIAL_MATCH","NO_MATCH"]},"monthly_cost":{"type":"object","required":["status","usd","explanation"],"properties":{"status":{"enum":["exact","range","lower_bound","unknown"]},"usd":{"type":["number","null"]},"low":{"type":["number","null"]},"high":{"type":["number","null"]},"lower_bound":{"type":["number","null"]},"upfront_usd":{"type":["number","null"]},"explanation":{"type":"string"},"facts":{"type":"array","items":{"type":"object","required":["key","status","value","level","evidence","checked_at"],"properties":{"key":{"type":"string"},"label":{"type":"string"},"status":{"enum":["TRUE","FALSE","NOT_SUPPORTED","UNKNOWN","CONFLICT","STALE","MISSING"],"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."},"value":{},"level":{"type":["string","null"],"description":"Where the fact is recorded: offer (the plan), product or provider."},"via_exception":{"type":"boolean","description":"Present and true when a plan-specific exception replaced the general value."},"note":{"type":"string"},"derived":{"type":"string","description":"How the value follows from the quoted sentence when it is not literal."},"evidence":{"type":"array","items":{"type":"object","required":["url","quote"],"properties":{"url":{"type":"string","description":"Official page the sentence was found on."},"quote":{"type":"string","description":"The sentence as it appears on that page."},"source_type":{"enum":["official_pricing","official_docs","third_party"],"description":"Only with detail=full."},"retrieved_at":{"type":"string","description":"Date the page was read (YYYY-MM-DD). Only with detail=full."}}}},"checked_at":{"type":["string","null"]},"stale":{"type":"boolean"},"applies_to":{"type":["object","null"],"description":"get_details only: billing options the fact is limited to."},"exceptions":{"type":"array","description":"get_details only: plans with a different value."},"also_stated_in":{"type":"array","items":{"type":"string"},"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."}}},"description":"Price facts the cost was computed from."}}}}},"reason":{"type":"string"}}}},"tracked":{"type":"array","items":{"type":"object","required":["offer_id","at_start","at_end","cost_change","volume_limit","budget_exceeded","stops_matching"],"properties":{"offer_id":{"type":"string"},"offer_name":{"type":"string"},"provider_name":{"type":"string"},"at_start":{"type":"object","required":["offer_id","offer_name","provider_name","billing","match","monthly_cost"],"properties":{"offer_id":{"type":"string"},"offer_name":{"type":"string"},"provider_name":{"type":"string"},"billing":{"type":"string"},"match":{"enum":["FULL_MATCH","PARTIAL_MATCH","NO_MATCH"]},"monthly_cost":{"type":"object","required":["status","usd","explanation"],"properties":{"status":{"enum":["exact","range","lower_bound","unknown"]},"usd":{"type":["number","null"]},"low":{"type":["number","null"]},"high":{"type":["number","null"]},"lower_bound":{"type":["number","null"]},"upfront_usd":{"type":["number","null"]},"explanation":{"type":"string"},"facts":{"type":"array","items":{"type":"object","required":["key","status","value","level","evidence","checked_at"],"properties":{"key":{"type":"string"},"label":{"type":"string"},"status":{"enum":["TRUE","FALSE","NOT_SUPPORTED","UNKNOWN","CONFLICT","STALE","MISSING"],"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."},"value":{},"level":{"type":["string","null"],"description":"Where the fact is recorded: offer (the plan), product or provider."},"via_exception":{"type":"boolean","description":"Present and true when a plan-specific exception replaced the general value."},"note":{"type":"string"},"derived":{"type":"string","description":"How the value follows from the quoted sentence when it is not literal."},"evidence":{"type":"array","items":{"type":"object","required":["url","quote"],"properties":{"url":{"type":"string","description":"Official page the sentence was found on."},"quote":{"type":"string","description":"The sentence as it appears on that page."},"source_type":{"enum":["official_pricing","official_docs","third_party"],"description":"Only with detail=full."},"retrieved_at":{"type":"string","description":"Date the page was read (YYYY-MM-DD). Only with detail=full."}}}},"checked_at":{"type":["string","null"]},"stale":{"type":"boolean"},"applies_to":{"type":["object","null"],"description":"get_details only: billing options the fact is limited to."},"exceptions":{"type":"array","description":"get_details only: plans with a different value."},"also_stated_in":{"type":"array","items":{"type":"string"},"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."}}},"description":"Price facts the cost was computed from."}}}}},"at_end":{"type":"object","required":["offer_id","offer_name","provider_name","billing","match","monthly_cost"],"properties":{"offer_id":{"type":"string"},"offer_name":{"type":"string"},"provider_name":{"type":"string"},"billing":{"type":"string"},"match":{"enum":["FULL_MATCH","PARTIAL_MATCH","NO_MATCH"]},"monthly_cost":{"type":"object","required":["status","usd","explanation"],"properties":{"status":{"enum":["exact","range","lower_bound","unknown"]},"usd":{"type":["number","null"]},"low":{"type":["number","null"]},"high":{"type":["number","null"]},"lower_bound":{"type":["number","null"]},"upfront_usd":{"type":["number","null"]},"explanation":{"type":"string"},"facts":{"type":"array","items":{"type":"object","required":["key","status","value","level","evidence","checked_at"],"properties":{"key":{"type":"string"},"label":{"type":"string"},"status":{"enum":["TRUE","FALSE","NOT_SUPPORTED","UNKNOWN","CONFLICT","STALE","MISSING"],"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."},"value":{},"level":{"type":["string","null"],"description":"Where the fact is recorded: offer (the plan), product or provider."},"via_exception":{"type":"boolean","description":"Present and true when a plan-specific exception replaced the general value."},"note":{"type":"string"},"derived":{"type":"string","description":"How the value follows from the quoted sentence when it is not literal."},"evidence":{"type":"array","items":{"type":"object","required":["url","quote"],"properties":{"url":{"type":"string","description":"Official page the sentence was found on."},"quote":{"type":"string","description":"The sentence as it appears on that page."},"source_type":{"enum":["official_pricing","official_docs","third_party"],"description":"Only with detail=full."},"retrieved_at":{"type":"string","description":"Date the page was read (YYYY-MM-DD). Only with detail=full."}}}},"checked_at":{"type":["string","null"]},"stale":{"type":"boolean"},"applies_to":{"type":["object","null"],"description":"get_details only: billing options the fact is limited to."},"exceptions":{"type":"array","description":"get_details only: plans with a different value."},"also_stated_in":{"type":"array","items":{"type":"string"},"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."}}},"description":"Price facts the cost was computed from."}}}}},"cost_change":{"type":["object","null"],"required":["workload"],"properties":{"workload":{"type":"object","description":"A monthly workload in the request format.","properties":{"monthly_pages":{"type":"object"},"monthly_searches":{"type":"integer"},"structured_extraction_pages":{"type":"integer"},"ai_extraction_pages":{"type":"integer"}}},"billing":{"type":"string"},"monthly_cost":{"type":"object","required":["status","usd","explanation"],"properties":{"status":{"enum":["exact","range","lower_bound","unknown"]},"usd":{"type":["number","null"]},"low":{"type":["number","null"]},"high":{"type":["number","null"]},"lower_bound":{"type":["number","null"]},"upfront_usd":{"type":["number","null"]},"explanation":{"type":"string"},"facts":{"type":"array","items":{"type":"object","required":["key","status","value","level","evidence","checked_at"],"properties":{"key":{"type":"string"},"label":{"type":"string"},"status":{"enum":["TRUE","FALSE","NOT_SUPPORTED","UNKNOWN","CONFLICT","STALE","MISSING"],"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."},"value":{},"level":{"type":["string","null"],"description":"Where the fact is recorded: offer (the plan), product or provider."},"via_exception":{"type":"boolean","description":"Present and true when a plan-specific exception replaced the general value."},"note":{"type":"string"},"derived":{"type":"string","description":"How the value follows from the quoted sentence when it is not literal."},"evidence":{"type":"array","items":{"type":"object","required":["url","quote"],"properties":{"url":{"type":"string","description":"Official page the sentence was found on."},"quote":{"type":"string","description":"The sentence as it appears on that page."},"source_type":{"enum":["official_pricing","official_docs","third_party"],"description":"Only with detail=full."},"retrieved_at":{"type":"string","description":"Date the page was read (YYYY-MM-DD). Only with detail=full."}}}},"checked_at":{"type":["string","null"]},"stale":{"type":"boolean"},"applies_to":{"type":["object","null"],"description":"get_details only: billing options the fact is limited to."},"exceptions":{"type":"array","description":"get_details only: plans with a different value."},"also_stated_in":{"type":"array","items":{"type":"string"},"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."}}},"description":"Price facts the cost was computed from."}}},"verdict":{"enum":["MET","UNMET","UNKNOWN"]},"reason":{"type":"string"},"match":{"enum":["FULL_MATCH","PARTIAL_MATCH","NO_MATCH"]},"conditions":{"type":"array","items":{"type":"object","required":["condition","verdict","reason"],"properties":{"condition":{"type":"string"},"verdict":{"enum":["MET","UNMET","UNKNOWN"]},"reason":{"type":"string"}}}}},"description":"First workload where the monthly cost differs from the start."},"volume_limit":{"type":["object","null"],"required":["workload"],"properties":{"workload":{"type":"object","description":"A monthly workload in the request format.","properties":{"monthly_pages":{"type":"object"},"monthly_searches":{"type":"integer"},"structured_extraction_pages":{"type":"integer"},"ai_extraction_pages":{"type":"integer"}}},"billing":{"type":"string"},"monthly_cost":{"type":"object","required":["status","usd","explanation"],"properties":{"status":{"enum":["exact","range","lower_bound","unknown"]},"usd":{"type":["number","null"]},"low":{"type":["number","null"]},"high":{"type":["number","null"]},"lower_bound":{"type":["number","null"]},"upfront_usd":{"type":["number","null"]},"explanation":{"type":"string"},"facts":{"type":"array","items":{"type":"object","required":["key","status","value","level","evidence","checked_at"],"properties":{"key":{"type":"string"},"label":{"type":"string"},"status":{"enum":["TRUE","FALSE","NOT_SUPPORTED","UNKNOWN","CONFLICT","STALE","MISSING"],"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."},"value":{},"level":{"type":["string","null"],"description":"Where the fact is recorded: offer (the plan), product or provider."},"via_exception":{"type":"boolean","description":"Present and true when a plan-specific exception replaced the general value."},"note":{"type":"string"},"derived":{"type":"string","description":"How the value follows from the quoted sentence when it is not literal."},"evidence":{"type":"array","items":{"type":"object","required":["url","quote"],"properties":{"url":{"type":"string","description":"Official page the sentence was found on."},"quote":{"type":"string","description":"The sentence as it appears on that page."},"source_type":{"enum":["official_pricing","official_docs","third_party"],"description":"Only with detail=full."},"retrieved_at":{"type":"string","description":"Date the page was read (YYYY-MM-DD). Only with detail=full."}}}},"checked_at":{"type":["string","null"]},"stale":{"type":"boolean"},"applies_to":{"type":["object","null"],"description":"get_details only: billing options the fact is limited to."},"exceptions":{"type":"array","description":"get_details only: plans with a different value."},"also_stated_in":{"type":"array","items":{"type":"string"},"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."}}},"description":"Price facts the cost was computed from."}}},"verdict":{"enum":["MET","UNMET","UNKNOWN"]},"reason":{"type":"string"},"match":{"enum":["FULL_MATCH","PARTIAL_MATCH","NO_MATCH"]},"conditions":{"type":"array","items":{"type":"object","required":["condition","verdict","reason"],"properties":{"condition":{"type":"string"},"verdict":{"enum":["MET","UNMET","UNKNOWN"]},"reason":{"type":"string"}}}}},"description":"First workload the plan does not cover."},"budget_exceeded":{"type":["object","null"],"required":["workload"],"properties":{"workload":{"type":"object","description":"A monthly workload in the request format.","properties":{"monthly_pages":{"type":"object"},"monthly_searches":{"type":"integer"},"structured_extraction_pages":{"type":"integer"},"ai_extraction_pages":{"type":"integer"}}},"billing":{"type":"string"},"monthly_cost":{"type":"object","required":["status","usd","explanation"],"properties":{"status":{"enum":["exact","range","lower_bound","unknown"]},"usd":{"type":["number","null"]},"low":{"type":["number","null"]},"high":{"type":["number","null"]},"lower_bound":{"type":["number","null"]},"upfront_usd":{"type":["number","null"]},"explanation":{"type":"string"},"facts":{"type":"array","items":{"type":"object","required":["key","status","value","level","evidence","checked_at"],"properties":{"key":{"type":"string"},"label":{"type":"string"},"status":{"enum":["TRUE","FALSE","NOT_SUPPORTED","UNKNOWN","CONFLICT","STALE","MISSING"],"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."},"value":{},"level":{"type":["string","null"],"description":"Where the fact is recorded: offer (the plan), product or provider."},"via_exception":{"type":"boolean","description":"Present and true when a plan-specific exception replaced the general value."},"note":{"type":"string"},"derived":{"type":"string","description":"How the value follows from the quoted sentence when it is not literal."},"evidence":{"type":"array","items":{"type":"object","required":["url","quote"],"properties":{"url":{"type":"string","description":"Official page the sentence was found on."},"quote":{"type":"string","description":"The sentence as it appears on that page."},"source_type":{"enum":["official_pricing","official_docs","third_party"],"description":"Only with detail=full."},"retrieved_at":{"type":"string","description":"Date the page was read (YYYY-MM-DD). Only with detail=full."}}}},"checked_at":{"type":["string","null"]},"stale":{"type":"boolean"},"applies_to":{"type":["object","null"],"description":"get_details only: billing options the fact is limited to."},"exceptions":{"type":"array","description":"get_details only: plans with a different value."},"also_stated_in":{"type":"array","items":{"type":"string"},"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."}}},"description":"Price facts the cost was computed from."}}},"verdict":{"enum":["MET","UNMET","UNKNOWN"]},"reason":{"type":"string"},"match":{"enum":["FULL_MATCH","PARTIAL_MATCH","NO_MATCH"]},"conditions":{"type":"array","items":{"type":"object","required":["condition","verdict","reason"],"properties":{"condition":{"type":"string"},"verdict":{"enum":["MET","UNMET","UNKNOWN"]},"reason":{"type":"string"}}}}},"description":"First workload where the monthly cost is known to exceed the budget; null without a budget or when it never does."},"stops_matching":{"type":["object","null"],"required":["workload"],"properties":{"workload":{"type":"object","description":"A monthly workload in the request format.","properties":{"monthly_pages":{"type":"object"},"monthly_searches":{"type":"integer"},"structured_extraction_pages":{"type":"integer"},"ai_extraction_pages":{"type":"integer"}}},"billing":{"type":"string"},"monthly_cost":{"type":"object","required":["status","usd","explanation"],"properties":{"status":{"enum":["exact","range","lower_bound","unknown"]},"usd":{"type":["number","null"]},"low":{"type":["number","null"]},"high":{"type":["number","null"]},"lower_bound":{"type":["number","null"]},"upfront_usd":{"type":["number","null"]},"explanation":{"type":"string"},"facts":{"type":"array","items":{"type":"object","required":["key","status","value","level","evidence","checked_at"],"properties":{"key":{"type":"string"},"label":{"type":"string"},"status":{"enum":["TRUE","FALSE","NOT_SUPPORTED","UNKNOWN","CONFLICT","STALE","MISSING"],"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."},"value":{},"level":{"type":["string","null"],"description":"Where the fact is recorded: offer (the plan), product or provider."},"via_exception":{"type":"boolean","description":"Present and true when a plan-specific exception replaced the general value."},"note":{"type":"string"},"derived":{"type":"string","description":"How the value follows from the quoted sentence when it is not literal."},"evidence":{"type":"array","items":{"type":"object","required":["url","quote"],"properties":{"url":{"type":"string","description":"Official page the sentence was found on."},"quote":{"type":"string","description":"The sentence as it appears on that page."},"source_type":{"enum":["official_pricing","official_docs","third_party"],"description":"Only with detail=full."},"retrieved_at":{"type":"string","description":"Date the page was read (YYYY-MM-DD). Only with detail=full."}}}},"checked_at":{"type":["string","null"]},"stale":{"type":"boolean"},"applies_to":{"type":["object","null"],"description":"get_details only: billing options the fact is limited to."},"exceptions":{"type":"array","description":"get_details only: plans with a different value."},"also_stated_in":{"type":"array","items":{"type":"string"},"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."}}},"description":"Price facts the cost was computed from."}}},"verdict":{"enum":["MET","UNMET","UNKNOWN"]},"reason":{"type":"string"},"match":{"enum":["FULL_MATCH","PARTIAL_MATCH","NO_MATCH"]},"conditions":{"type":"array","items":{"type":"object","required":["condition","verdict","reason"],"properties":{"condition":{"type":"string"},"verdict":{"enum":["MET","UNMET","UNKNOWN"]},"reason":{"type":"string"}}}}},"description":"First workload where the plan is no longer a full match."}}}},"plans":{"type":"array","description":"Every plan named above, with the official facts its costs were computed from.","items":{"type":"object","required":["offer_id","offer_name","provider_name","link","facts"],"properties":{"offer_id":{"type":"string"},"offer_name":{"type":"string"},"product_name":{"type":"string"},"provider_name":{"type":"string"},"listed":{"type":"boolean"},"link":{"type":"object","required":["url","landing","link_level","affiliate"],"properties":{"url":{"type":"string"},"landing":{"type":"string"},"link_level":{"type":"string"},"note":{"type":["string","null"]},"affiliate":{"type":"object","required":["status"],"properties":{"program":{"type":["string","null"]},"status":{"type":"string"},"disclosure":{"type":["string","null"]}}}}},"page_url":{"type":"string"},"facts":{"type":"array","items":{"type":"object","required":["key","status","value","level","evidence","checked_at"],"properties":{"key":{"type":"string"},"label":{"type":"string"},"status":{"enum":["TRUE","FALSE","NOT_SUPPORTED","UNKNOWN","CONFLICT","STALE","MISSING"],"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."},"value":{},"level":{"type":["string","null"],"description":"Where the fact is recorded: offer (the plan), product or provider."},"via_exception":{"type":"boolean","description":"Present and true when a plan-specific exception replaced the general value."},"note":{"type":"string"},"derived":{"type":"string","description":"How the value follows from the quoted sentence when it is not literal."},"evidence":{"type":"array","items":{"type":"object","required":["url","quote"],"properties":{"url":{"type":"string","description":"Official page the sentence was found on."},"quote":{"type":"string","description":"The sentence as it appears on that page."},"source_type":{"enum":["official_pricing","official_docs","third_party"],"description":"Only with detail=full."},"retrieved_at":{"type":"string","description":"Date the page was read (YYYY-MM-DD). Only with detail=full."}}}},"checked_at":{"type":["string","null"]},"stale":{"type":"boolean"},"applies_to":{"type":["object","null"],"description":"get_details only: billing options the fact is limited to."},"exceptions":{"type":"array","description":"get_details only: plans with a different value."},"also_stated_in":{"type":"array","items":{"type":"string"},"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."}}}}}}},"assumptions":{"type":"array","items":{"type":"string"}},"notes":{"type":"array","items":{"type":"string"}}}}}}},"400":{"description":"A field is invalid, target and scale are both given or both missing, or a plan id is unknown.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/relax":{"post":{"operationId":"relax_conditions","summary":"Smallest condition changes that admit plans","description":"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 plan, or too few 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.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"product_types":{"type":"array","uniqueItems":true,"minItems":1,"items":{"type":"string","enum":["scraping_api","serp_api","headless_browser","platform"]},"description":"Limit to these product types. Default: every type that can serve the workload."},"monthly_pages":{"type":"object","additionalProperties":false,"minProperties":1,"properties":{"plain_html":{"type":"integer","minimum":0},"javascript":{"type":"integer","minimum":0},"premium_proxy":{"type":"integer","minimum":0},"javascript_premium_proxy":{"type":"integer","minimum":0}},"description":"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)."},"monthly_pages_total":{"type":"integer","minimum":0,"description":"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."},"monthly_searches":{"type":"integer","minimum":0,"description":"Search requests per month (one results page each)."},"structured_extraction_pages":{"type":"integer","minimum":0,"description":"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."},"ai_extraction_pages":{"type":"integer","minimum":0,"description":"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."},"browser_seconds_per_page":{"type":"number","exclusiveMinimum":0,"description":"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."},"min_concurrency":{"type":"integer","minimum":1,"description":"Minimum number of concurrent requests (or browsers) the plan must allow."},"min_requests_per_minute":{"type":"number","exclusiveMinimum":0,"description":"Minimum request rate the plan must allow, per minute."},"max_monthly_cost_usd":{"type":"number","minimum":0,"description":"Monthly budget in USD before tax. Compared with listed prices; annual plans use their per-month equivalent."},"billing_types":{"type":"array","minItems":1,"uniqueItems":true,"items":{"type":"string","enum":["monthly_subscription","annual_subscription","pay_as_you_go","prepaid_credits"]},"description":"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."},"needs_recurring_free_tier":{"type":"boolean","description":"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":{"type":"boolean","description":"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."},"only_successful_requests_billed":{"type":"boolean","description":"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."},"target_errors_not_billed":{"type":"boolean","description":"Error responses from the target site (e.g. 404) must not be billed."},"exit_ip_countries":{"type":"array","minItems":1,"uniqueItems":true,"items":{"type":"string","pattern":"^[A-Z]{2}$"},"description":"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."},"data_regions":{"type":"array","minItems":1,"uniqueItems":true,"items":{"type":"string","minLength":2,"maxLength":20},"description":"Regions where data must be stored or processed, e.g. [\"EU\"]. Different from exit-IP countries."},"realtime_search_required":{"type":"boolean","description":"Search results must be returned in real time (not through a queue)."},"search_countries":{"type":"array","minItems":1,"uniqueItems":true,"items":{"type":"string","pattern":"^[A-Z]{2}$"},"description":"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."},"search_result_types":{"type":"array","minItems":1,"uniqueItems":true,"items":{"type":"string","enum":["organic","ads","local_pack","knowledge_graph","people_also_ask","related_searches","shopping","news","images","videos","ai_overview"]},"description":"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."},"search_engines":{"type":"array","minItems":1,"uniqueItems":true,"items":{"type":"string","enum":["google","bing","yahoo","yandex","baidu","duckduckgo","naver","brave"]},"description":"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."},"min_pages_per_crawl":{"type":"integer","minimum":1,"description":"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."},"preferred":{"type":"object","additionalProperties":false,"properties":{"min_concurrency":{"type":"integer","minimum":1,"description":"Minimum number of concurrent requests (or browsers) the plan must allow."},"min_requests_per_minute":{"type":"number","exclusiveMinimum":0,"description":"Minimum request rate the plan must allow, per minute."},"max_monthly_cost_usd":{"type":"number","minimum":0,"description":"Monthly budget in USD before tax. Compared with listed prices; annual plans use their per-month equivalent."},"billing_types":{"type":"array","minItems":1,"uniqueItems":true,"items":{"type":"string","enum":["monthly_subscription","annual_subscription","pay_as_you_go","prepaid_credits"]},"description":"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."},"needs_recurring_free_tier":{"type":"boolean","description":"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":{"type":"boolean","description":"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."},"only_successful_requests_billed":{"type":"boolean","description":"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."},"target_errors_not_billed":{"type":"boolean","description":"Error responses from the target site (e.g. 404) must not be billed."},"exit_ip_countries":{"type":"array","minItems":1,"uniqueItems":true,"items":{"type":"string","pattern":"^[A-Z]{2}$"},"description":"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."},"data_regions":{"type":"array","minItems":1,"uniqueItems":true,"items":{"type":"string","minLength":2,"maxLength":20},"description":"Regions where data must be stored or processed, e.g. [\"EU\"]. Different from exit-IP countries."},"realtime_search_required":{"type":"boolean","description":"Search results must be returned in real time (not through a queue)."},"search_countries":{"type":"array","minItems":1,"uniqueItems":true,"items":{"type":"string","pattern":"^[A-Z]{2}$"},"description":"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."},"search_result_types":{"type":"array","minItems":1,"uniqueItems":true,"items":{"type":"string","enum":["organic","ads","local_pack","knowledge_graph","people_also_ask","related_searches","shopping","news","images","videos","ai_overview"]},"description":"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."},"search_engines":{"type":"array","minItems":1,"uniqueItems":true,"items":{"type":"string","enum":["google","bing","yahoo","yandex","baidu","duckduckgo","naver","brave"]},"description":"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."},"min_pages_per_crawl":{"type":"integer","minimum":1,"description":"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."}},"description":"Nice-to-have conditions; they do not filter, they break ties."},"negotiable":{"type":"array","minItems":1,"uniqueItems":true,"items":{"type":"string","enum":["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"]},"description":"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. Default: every required condition, each marked ask_user because the user has not said it can change."},"limit":{"type":"integer","minimum":1,"maximum":20,"default":3,"description":"Maximum plans listed for each change and under confirm_with_provider (default 3)."},"detail":{"type":"string","enum":["summary","full"],"default":"summary","description":"summary returns one source sentence per fact; full returns every recorded fact and sentence."}}}}}},"responses":{"200":{"description":"For each condition, the smallest single change and the plans it admits; plans that fail only on conditions the official pages do not state.","content":{"application/json":{"schema":{"type":"object","required":["as_of","needs_input","counts","changes","confirm_with_provider","assumptions","notes"],"properties":{"as_of":{"type":"string"},"request":{"type":"object"},"needs_input":{"type":"array","items":{"type":"object","required":["field","reason"],"properties":{"field":{"type":"string"},"reason":{"type":"string"}}}},"counts":{"type":"object","required":["candidates","full","partial","no_match"],"properties":{"candidates":{"type":"integer"},"full":{"type":"integer"},"partial":{"type":"integer"},"no_match":{"type":"integer"}}},"changes":{"type":"array","items":{"type":"object","required":["condition","label","field","current","ask_user","options","blocked_by","note"],"properties":{"condition":{"type":"string"},"label":{"type":"string"},"field":{"type":["string","null"],"description":"Request field of the condition; null for monthly_volume, which changes the workload fields."},"current":{},"ask_user":{"type":"boolean","description":"True when negotiable was not given: ask the user before changing this condition."},"options":{"type":"array","items":{"type":"object","required":["change","summary","admitted_total","admitted"],"properties":{"change":{"type":"object","description":"Request fields to set; null removes the field."},"summary":{"type":"string"},"admitted_total":{"type":"integer"},"admitted":{"type":"array","items":{"type":"object","required":["offer_id","offer_name","provider_name","billing","monthly_cost","meets_all","was","facts","link"],"properties":{"offer_id":{"type":"string"},"offer_name":{"type":"string"},"product_name":{"type":"string"},"provider_name":{"type":"string"},"listed":{"type":"boolean"},"billing":{"type":"string"},"monthly_cost":{"type":"object","required":["status","usd","explanation"],"properties":{"status":{"enum":["exact","range","lower_bound","unknown"]},"usd":{"type":["number","null"]},"low":{"type":["number","null"]},"high":{"type":["number","null"]},"lower_bound":{"type":["number","null"]},"upfront_usd":{"type":["number","null"]},"explanation":{"type":"string"},"facts":{"type":"array","items":{"type":"object","required":["key","status","value","level","evidence","checked_at"],"properties":{"key":{"type":"string"},"label":{"type":"string"},"status":{"enum":["TRUE","FALSE","NOT_SUPPORTED","UNKNOWN","CONFLICT","STALE","MISSING"],"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."},"value":{},"level":{"type":["string","null"],"description":"Where the fact is recorded: offer (the plan), product or provider."},"via_exception":{"type":"boolean","description":"Present and true when a plan-specific exception replaced the general value."},"note":{"type":"string"},"derived":{"type":"string","description":"How the value follows from the quoted sentence when it is not literal."},"evidence":{"type":"array","items":{"type":"object","required":["url","quote"],"properties":{"url":{"type":"string","description":"Official page the sentence was found on."},"quote":{"type":"string","description":"The sentence as it appears on that page."},"source_type":{"enum":["official_pricing","official_docs","third_party"],"description":"Only with detail=full."},"retrieved_at":{"type":"string","description":"Date the page was read (YYYY-MM-DD). Only with detail=full."}}}},"checked_at":{"type":["string","null"]},"stale":{"type":"boolean"},"applies_to":{"type":["object","null"],"description":"get_details only: billing options the fact is limited to."},"exceptions":{"type":"array","description":"get_details only: plans with a different value."},"also_stated_in":{"type":"array","items":{"type":"string"},"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."}}},"description":"Price facts the cost was computed from."}}},"meets_all":{"enum":[true,false,"unknown"],"description":"Against the request as given, before the change: false or \"unknown\"."},"was":{"type":"array","items":{"type":"object","required":["condition","verdict","reason"],"properties":{"condition":{"type":"string"},"verdict":{"enum":["MET","UNMET","UNKNOWN"]},"reason":{"type":"string"}}},"description":"Required conditions this plan did not meet before the change."},"facts":{"type":"array","items":{"type":"object","required":["key","status","value","level","evidence","checked_at"],"properties":{"key":{"type":"string"},"label":{"type":"string"},"status":{"enum":["TRUE","FALSE","NOT_SUPPORTED","UNKNOWN","CONFLICT","STALE","MISSING"],"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."},"value":{},"level":{"type":["string","null"],"description":"Where the fact is recorded: offer (the plan), product or provider."},"via_exception":{"type":"boolean","description":"Present and true when a plan-specific exception replaced the general value."},"note":{"type":"string"},"derived":{"type":"string","description":"How the value follows from the quoted sentence when it is not literal."},"evidence":{"type":"array","items":{"type":"object","required":["url","quote"],"properties":{"url":{"type":"string","description":"Official page the sentence was found on."},"quote":{"type":"string","description":"The sentence as it appears on that page."},"source_type":{"enum":["official_pricing","official_docs","third_party"],"description":"Only with detail=full."},"retrieved_at":{"type":"string","description":"Date the page was read (YYYY-MM-DD). Only with detail=full."}}}},"checked_at":{"type":["string","null"]},"stale":{"type":"boolean"},"applies_to":{"type":["object","null"],"description":"get_details only: billing options the fact is limited to."},"exceptions":{"type":"array","description":"get_details only: plans with a different value."},"also_stated_in":{"type":"array","items":{"type":"string"},"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."}}},"description":"Official facts behind those verdicts (price facts are under monthly_cost)."},"link":{"type":"object","required":["url","landing","link_level","affiliate"],"properties":{"url":{"type":"string"},"landing":{"type":"string"},"link_level":{"type":"string"},"note":{"type":["string","null"]},"affiliate":{"type":"object","required":["status"],"properties":{"program":{"type":["string","null"]},"status":{"type":"string"},"disclosure":{"type":["string","null"]}}}}},"page_url":{"type":"string"}}}}}}},"blocked_by":{"type":"array","description":"When no change of this condition alone is enough: other conditions not met by the plans that fail this one.","items":{"type":"object","required":["condition","plans"],"properties":{"condition":{"type":"string"},"label":{"type":"string"},"plans":{"type":"integer"}}}},"note":{"type":["string","null"]}}}},"confirm_with_provider":{"type":"object","required":["total","plans"],"properties":{"total":{"type":"integer"},"plans":{"type":"array","items":{"type":"object","required":["offer_id","offer_name","provider_name","monthly_cost","meets_all","unknown","pages_checked","link"],"properties":{"offer_id":{"type":"string"},"offer_name":{"type":"string"},"product_name":{"type":"string"},"provider_name":{"type":"string"},"listed":{"type":"boolean"},"billing":{"type":"string"},"monthly_cost":{"type":"object","required":["status","usd","explanation"],"properties":{"status":{"enum":["exact","range","lower_bound","unknown"]},"usd":{"type":["number","null"]},"low":{"type":["number","null"]},"high":{"type":["number","null"]},"lower_bound":{"type":["number","null"]},"upfront_usd":{"type":["number","null"]},"explanation":{"type":"string"},"facts":{"type":"array","items":{"type":"object","required":["key","status","value","level","evidence","checked_at"],"properties":{"key":{"type":"string"},"label":{"type":"string"},"status":{"enum":["TRUE","FALSE","NOT_SUPPORTED","UNKNOWN","CONFLICT","STALE","MISSING"],"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."},"value":{},"level":{"type":["string","null"],"description":"Where the fact is recorded: offer (the plan), product or provider."},"via_exception":{"type":"boolean","description":"Present and true when a plan-specific exception replaced the general value."},"note":{"type":"string"},"derived":{"type":"string","description":"How the value follows from the quoted sentence when it is not literal."},"evidence":{"type":"array","items":{"type":"object","required":["url","quote"],"properties":{"url":{"type":"string","description":"Official page the sentence was found on."},"quote":{"type":"string","description":"The sentence as it appears on that page."},"source_type":{"enum":["official_pricing","official_docs","third_party"],"description":"Only with detail=full."},"retrieved_at":{"type":"string","description":"Date the page was read (YYYY-MM-DD). Only with detail=full."}}}},"checked_at":{"type":["string","null"]},"stale":{"type":"boolean"},"applies_to":{"type":["object","null"],"description":"get_details only: billing options the fact is limited to."},"exceptions":{"type":"array","description":"get_details only: plans with a different value."},"also_stated_in":{"type":"array","items":{"type":"string"},"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."}}},"description":"Price facts the cost was computed from."}}},"meets_all":{"enum":[true,false,"unknown"],"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."},"unknown":{"type":"array","items":{"type":"object","required":["condition","reason","checked_at"],"properties":{"condition":{"type":"string"},"label":{"type":"string"},"reason":{"type":"string"},"checked_at":{"type":"string"}}}},"pages_checked":{"type":"array","items":{"type":"string"},"description":"Official pages read for this provider."},"link":{"type":"object","required":["url","landing","link_level","affiliate"],"properties":{"url":{"type":"string"},"landing":{"type":"string"},"link_level":{"type":"string"},"note":{"type":["string","null"]},"affiliate":{"type":"object","required":["status"],"properties":{"program":{"type":["string","null"]},"status":{"type":"string"},"disclosure":{"type":["string","null"]}}}}},"page_url":{"type":"string"}}}}}},"assumptions":{"type":"array","items":{"type":"string"}},"notes":{"type":"array","items":{"type":"string"}}}}}}},"400":{"description":"A field is invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/offers/{offer_id}":{"get":{"operationId":"get_offer","summary":"Get recorded conditions of a plan","description":"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 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.","parameters":[{"name":"offer_id","in":"path","required":true,"schema":{"type":"string"},"example":"firecrawl-standard"}],"responses":{"200":{"description":"The plan with every condition resolved for it.","content":{"application/json":{"schema":{"type":"object","required":["as_of","provider","product","offers"],"properties":{"as_of":{"type":"string"},"provider":{"type":"object","required":["id","name"],"properties":{"id":{"type":"string"},"name":{"type":"string"},"data_use_scope":{"type":"object","description":"Pages read, robots.txt results, the terms-of-use record and rights: the provider's rights state and whether this service serves it, and the rights of each source page."},"agent_access":{"type":["object","null"],"description":"The provider's machine channels as last checked: its official MCP server (whether it answered without credentials, how it asks for them, tool names), llms.txt and OpenAPI files. Only listing requests were made. null when not checked."}}},"product":{"type":"object","required":["id","name","kinds","facts"],"properties":{"id":{"type":"string"},"name":{"type":"string"},"kinds":{"type":"array"},"facts":{"type":"array","items":{"type":"object","required":["key","status","value","level","evidence","checked_at"],"properties":{"key":{"type":"string"},"label":{"type":"string"},"status":{"enum":["TRUE","FALSE","NOT_SUPPORTED","UNKNOWN","CONFLICT","STALE","MISSING"],"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."},"value":{},"level":{"type":["string","null"],"description":"Where the fact is recorded: offer (the plan), product or provider."},"via_exception":{"type":"boolean","description":"Present and true when a plan-specific exception replaced the general value."},"note":{"type":"string"},"derived":{"type":"string","description":"How the value follows from the quoted sentence when it is not literal."},"evidence":{"type":"array","items":{"type":"object","required":["url","quote"],"properties":{"url":{"type":"string","description":"Official page the sentence was found on."},"quote":{"type":"string","description":"The sentence as it appears on that page."},"source_type":{"enum":["official_pricing","official_docs","third_party"],"description":"Only with detail=full."},"retrieved_at":{"type":"string","description":"Date the page was read (YYYY-MM-DD). Only with detail=full."}}}},"checked_at":{"type":["string","null"]},"stale":{"type":"boolean"},"applies_to":{"type":["object","null"],"description":"get_details only: billing options the fact is limited to."},"exceptions":{"type":"array","description":"get_details only: plans with a different value."},"also_stated_in":{"type":"array","items":{"type":"string"},"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."}}}}}},"offers":{"type":"array","items":{"type":"object","required":["id","name","type","listed","facts","link"],"properties":{"id":{"type":"string"},"name":{"type":"string"},"type":{"type":"string"},"listed":{"type":"boolean"},"facts":{"type":"array","items":{"type":"object","required":["key","status","value","level","evidence","checked_at"],"properties":{"key":{"type":"string"},"label":{"type":"string"},"status":{"enum":["TRUE","FALSE","NOT_SUPPORTED","UNKNOWN","CONFLICT","STALE","MISSING"],"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."},"value":{},"level":{"type":["string","null"],"description":"Where the fact is recorded: offer (the plan), product or provider."},"via_exception":{"type":"boolean","description":"Present and true when a plan-specific exception replaced the general value."},"note":{"type":"string"},"derived":{"type":"string","description":"How the value follows from the quoted sentence when it is not literal."},"evidence":{"type":"array","items":{"type":"object","required":["url","quote"],"properties":{"url":{"type":"string","description":"Official page the sentence was found on."},"quote":{"type":"string","description":"The sentence as it appears on that page."},"source_type":{"enum":["official_pricing","official_docs","third_party"],"description":"Only with detail=full."},"retrieved_at":{"type":"string","description":"Date the page was read (YYYY-MM-DD). Only with detail=full."}}}},"checked_at":{"type":["string","null"]},"stale":{"type":"boolean"},"applies_to":{"type":["object","null"],"description":"get_details only: billing options the fact is limited to."},"exceptions":{"type":"array","description":"get_details only: plans with a different value."},"also_stated_in":{"type":"array","items":{"type":"string"},"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."}}}},"link":{"type":"object","required":["url","landing","link_level","affiliate"],"properties":{"url":{"type":"string"},"landing":{"type":"string"},"link_level":{"type":"string"},"note":{"type":["string","null"]},"affiliate":{"type":"object","required":["status"],"properties":{"program":{"type":["string","null"]},"status":{"type":"string"},"disclosure":{"type":["string","null"]}}}}}}}},"evidence_detail":{"enum":["summary"],"description":"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."}}}}}},"404":{"description":"No plan with this id.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/products/{product_id}":{"get":{"operationId":"get_product","summary":"Get recorded conditions of a product and its plans","description":"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 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.","parameters":[{"name":"product_id","in":"path","required":true,"schema":{"type":"string"},"example":"firecrawl-api"}],"responses":{"200":{"description":"The product, its provider and all of its plans.","content":{"application/json":{"schema":{"type":"object","required":["as_of","provider","product","offers"],"properties":{"as_of":{"type":"string"},"provider":{"type":"object","required":["id","name"],"properties":{"id":{"type":"string"},"name":{"type":"string"},"data_use_scope":{"type":"object","description":"Pages read, robots.txt results, the terms-of-use record and rights: the provider's rights state and whether this service serves it, and the rights of each source page."},"agent_access":{"type":["object","null"],"description":"The provider's machine channels as last checked: its official MCP server (whether it answered without credentials, how it asks for them, tool names), llms.txt and OpenAPI files. Only listing requests were made. null when not checked."}}},"product":{"type":"object","required":["id","name","kinds","facts"],"properties":{"id":{"type":"string"},"name":{"type":"string"},"kinds":{"type":"array"},"facts":{"type":"array","items":{"type":"object","required":["key","status","value","level","evidence","checked_at"],"properties":{"key":{"type":"string"},"label":{"type":"string"},"status":{"enum":["TRUE","FALSE","NOT_SUPPORTED","UNKNOWN","CONFLICT","STALE","MISSING"],"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."},"value":{},"level":{"type":["string","null"],"description":"Where the fact is recorded: offer (the plan), product or provider."},"via_exception":{"type":"boolean","description":"Present and true when a plan-specific exception replaced the general value."},"note":{"type":"string"},"derived":{"type":"string","description":"How the value follows from the quoted sentence when it is not literal."},"evidence":{"type":"array","items":{"type":"object","required":["url","quote"],"properties":{"url":{"type":"string","description":"Official page the sentence was found on."},"quote":{"type":"string","description":"The sentence as it appears on that page."},"source_type":{"enum":["official_pricing","official_docs","third_party"],"description":"Only with detail=full."},"retrieved_at":{"type":"string","description":"Date the page was read (YYYY-MM-DD). Only with detail=full."}}}},"checked_at":{"type":["string","null"]},"stale":{"type":"boolean"},"applies_to":{"type":["object","null"],"description":"get_details only: billing options the fact is limited to."},"exceptions":{"type":"array","description":"get_details only: plans with a different value."},"also_stated_in":{"type":"array","items":{"type":"string"},"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."}}}}}},"offers":{"type":"array","items":{"type":"object","required":["id","name","type","listed","facts","link"],"properties":{"id":{"type":"string"},"name":{"type":"string"},"type":{"type":"string"},"listed":{"type":"boolean"},"facts":{"type":"array","items":{"type":"object","required":["key","status","value","level","evidence","checked_at"],"properties":{"key":{"type":"string"},"label":{"type":"string"},"status":{"enum":["TRUE","FALSE","NOT_SUPPORTED","UNKNOWN","CONFLICT","STALE","MISSING"],"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."},"value":{},"level":{"type":["string","null"],"description":"Where the fact is recorded: offer (the plan), product or provider."},"via_exception":{"type":"boolean","description":"Present and true when a plan-specific exception replaced the general value."},"note":{"type":"string"},"derived":{"type":"string","description":"How the value follows from the quoted sentence when it is not literal."},"evidence":{"type":"array","items":{"type":"object","required":["url","quote"],"properties":{"url":{"type":"string","description":"Official page the sentence was found on."},"quote":{"type":"string","description":"The sentence as it appears on that page."},"source_type":{"enum":["official_pricing","official_docs","third_party"],"description":"Only with detail=full."},"retrieved_at":{"type":"string","description":"Date the page was read (YYYY-MM-DD). Only with detail=full."}}}},"checked_at":{"type":["string","null"]},"stale":{"type":"boolean"},"applies_to":{"type":["object","null"],"description":"get_details only: billing options the fact is limited to."},"exceptions":{"type":"array","description":"get_details only: plans with a different value."},"also_stated_in":{"type":"array","items":{"type":"string"},"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."}}}},"link":{"type":"object","required":["url","landing","link_level","affiliate"],"properties":{"url":{"type":"string"},"landing":{"type":"string"},"link_level":{"type":"string"},"note":{"type":["string","null"]},"affiliate":{"type":"object","required":["status"],"properties":{"program":{"type":["string","null"]},"status":{"type":"string"},"disclosure":{"type":["string","null"]}}}}}}}},"evidence_detail":{"enum":["summary"],"description":"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."}}}}}},"404":{"description":"No product with this id.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}},"components":{"schemas":{"Error":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"enum":["invalid_arguments","invalid_json","not_found","method_not_allowed","payload_too_large","result_too_large","internal_error"]},"message":{"type":"string"},"errors":{"type":"array","items":{"type":"object","required":["field","message"],"properties":{"field":{"type":"string"},"message":{"type":"string"}}}}}}}}}}}