Servidor MCP

Web Data API Plan Finder

io.github.scraping-api-plans/web-data-plan-finder

Qué hace este MCP

Finds and evaluates web scraping, crawling, and SERP API plans against workload, pricing, and service requirements.

check_conditions
Check plans against conditions
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.
Solo lectura Idempotente
Esquema de entrada
{'type': 'object', 'properties': {'plans': {'type': 'array', 'items': {'type': 'string', 'maxLength': 300, 'minLength': 2}, 'maxItems': 20, 'minItems': 1, '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.', 'uniqueItems': True}, 'detail': {'enum': ['summary', 'full'], 'type': 'string', 'default': 'summary', 'description': 'summary returns one source sentence per fact; full returns every recorded fact and sentence.'}, 'offer_ids': {'type': 'array', 'items': {'type': 'string', 'maxLength': 80, 'minLength': 1}, 'maxItems': 20, 'minItems': 1, 'description': 'Plan ids to check (from search or get_details).', 'uniqueItems': True}, 'preferred': {'type': 'object', 'properties': {'data_regions': {'type': 'array', 'items': {'type': 'string', 'maxLength': 20, 'minLength': 2}, 'minItems': 1, 'description': 'Regions where data must be stored or processed, e.g. ["EU"]. Different from exit-IP countries.', 'uniqueItems': True}, 'billing_types': {'type': 'array', 'items': {'enum': ['monthly_subscription', 'annual_subscription', 'pay_as_you_go', 'prepaid_credits'], 'type': 'string'}, 'minItems': 1, '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.', 'uniqueItems': True}, 'search_engines': {'type': 'array', 'items': {'enum': ['google', 'bing', 'yahoo', 'yandex', 'baidu', 'duckduckgo', 'naver', 'brave'], 'type': 'string'}, 'minItems': 1, '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.", 'uniqueItems': True}, 'min_concurrency': {'type': 'integer', 'minimum': 1, 'description': 'Minimum number of concurrent requests (or browsers) the plan must allow.'}, 'search_countries': {'type': 'array', 'items': {'type': 'string', 'pattern': '^[A-Z]{2}$'}, 'minItems': 1, '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.', 'uniqueItems': True}, 'exit_ip_countries': {'type': 'array', 'items': {'type': 'string', 'pattern': '^[A-Z]{2}$'}, 'minItems': 1, '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.', 'uniqueItems': True}, '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.'}, 'search_result_types': {'type': 'array', 'items': {'enum': ['organic', 'ads', 'local_pack', 'knowledge_graph', 'people_also_ask', 'related_searches', 'shopping', 'news', 'images', 'videos', 'ai_overview'], 'type': 'string'}, 'minItems': 1, '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.', 'uniqueItems': True}, '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.'}, 'min_requests_per_minute': {'type': 'number', 'description': 'Minimum request rate the plan must allow, per minute.', 'exclusiveMinimum': 0}, 'realtime_search_required': {'type': 'boolean', 'description': 'Search results must be returned in real time (not through a queue).'}, 'target_errors_not_billed': {'type': 'boolean', 'description': 'Error responses from the target site (e.g. 404) must not be billed.'}, '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.'}}, 'description': 'Nice-to-have conditions; they do not filter, they break ties.', 'additionalProperties': False}, 'data_regions': {'type': 'array', 'items': {'type': 'string', 'maxLength': 20, 'minLength': 2}, 'minItems': 1, 'description': 'Regions where data must be stored or processed, e.g. ["EU"]. Different from exit-IP countries.', 'uniqueItems': True}, 'billing_types': {'type': 'array', 'items': {'enum': ['monthly_subscription', 'annual_subscription', 'pay_as_you_go', 'prepaid_credits'], 'type': 'string'}, 'minItems': 1, '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.', 'uniqueItems': True}, 'monthly_pages': {'type': 'object', 'properties': {'javascript': {'type': 'integer', 'minimum': 0}, 'plain_html': {'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).', 'minProperties': 1, 'additionalProperties': False}, 'search_engines': {'type': 'array', 'items': {'enum': ['google', 'bing', 'yahoo', 'yandex', 'baidu', 'duckduckgo', 'naver', 'brave'], 'type': 'string'}, 'minItems': 1, '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.", 'uniqueItems': True}, 'min_concurrency': {'type': 'integer', 'minimum': 1, 'description': 'Minimum number of concurrent requests (or browsers) the plan must allow.'}, 'monthly_searches': {'type': 'integer', 'minimum': 0, 'description': 'Search requests per month (one results page each).'}, 'search_countries': {'type': 'array', 'items': {'type': 'string', 'pattern': '^[A-Z]{2}$'}, 'minItems': 1, '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.', 'uniqueItems': True}, 'exit_ip_countries': {'type': 'array', 'items': {'type': 'string', 'pattern': '^[A-Z]{2}$'}, 'minItems': 1, '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.', 'uniqueItems': True}, '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.'}, '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.'}, '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.'}, 'search_result_types': {'type': 'array', 'items': {'enum': ['organic', 'ads', 'local_pack', 'knowledge_graph', 'people_also_ask', 'related_searches', 'shopping', 'news', 'images', 'videos', 'ai_overview'], 'type': 'string'}, 'minItems': 1, '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.', 'uniqueItems': True}, '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.'}, 'min_requests_per_minute': {'type': 'number', 'description': 'Minimum request rate the plan must allow, per minute.', 'exclusiveMinimum': 0}, 'browser_seconds_per_page': {'type': 'number', '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.', 'exclusiveMinimum': 0}, 'realtime_search_required': {'type': 'boolean', 'description': 'Search results must be returned in real time (not through a queue).'}, 'target_errors_not_billed': {'type': 'boolean', 'description': 'Error responses from the target site (e.g. 404) must not be billed.'}, '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.'}, '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.'}, '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.'}}, 'description': 'Give offer_ids, plans or both; 20 plans at most in total.', 'additionalProperties': False}
Esquema de salida
{'type': 'object', 'required': ['as_of', 'needs_input', 'results', 'assumptions', 'notes'], 'properties': {'as_of': {'type': 'string'}, 'notes': {'type': 'array', 'items': {'type': 'string'}}, 'request': {'type': 'object'}, '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': {'link': {'type': 'object', 'required': ['url', 'landing', 'link_level', 'affiliate'], 'properties': {'url': {'type': 'string'}, 'note': {'type': ['string', 'null']}, 'landing': {'type': 'string'}, 'affiliate': {'type': 'object', 'required': ['status'], 'properties': {'status': {'type': 'string'}, 'program': {'type': ['string', 'null']}, 'disclosure': {'type': ['string', 'null']}}}, 'link_level': {'type': 'string'}}}, 'match': {'enum': ['FULL_MATCH', 'PARTIAL_MATCH', 'NO_MATCH']}, 'listed': {'type': 'boolean'}, 'billing': {'type': 'string'}, 'verdict': {'type': 'string', 'description': 'One sentence: the conditions met, or the ones not met or not stated, with the reason.'}, 'offer_id': {'type': 'string'}, 'page_url': {'type': 'string'}, '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.'}, 'checked_at': {'type': ['string', 'null']}, 'conditions': {'type': 'array', 'items': {'type': 'object', 'required': ['condition', 'label', 'required', 'verdict', 'reason', 'facts'], 'properties': {'facts': {'type': 'array', 'items': {'type': 'object', 'required': ['key', 'status', 'value', 'level', 'evidence', 'checked_at'], 'properties': {'key': {'type': 'string'}, 'note': {'type': 'string'}, 'label': {'type': 'string'}, 'level': {'type': ['string', 'null'], 'description': 'Where the fact is recorded: offer (the plan), product or provider.'}, 'stale': {'type': 'boolean'}, 'value': {}, '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.'}, '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.'}}}}, 'applies_to': {'type': ['object', 'null'], 'description': 'get_details only: billing options the fact is limited to.'}, 'checked_at': {'type': ['string', 'null']}, 'exceptions': {'type': 'array', 'description': 'get_details only: plans with a different value.'}, 'via_exception': {'type': 'boolean', 'description': 'Present and true when a plan-specific exception replaced the general 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.'}, 'label': {'type': 'string'}, 'reason': {'type': 'string'}, 'verdict': {'enum': ['MET', 'UNMET', 'UNKNOWN']}, 'required': {'type': 'boolean'}, 'condition': {'type': 'string'}}}}, 'offer_name': {'type': 'string'}, 'product_id': {'type': 'string'}, 'assumptions': {'type': 'array', 'items': {'type': 'string'}}, 'provider_id': {'type': 'string'}, 'monthly_cost': {'type': 'object', 'required': ['status', 'usd', 'explanation'], 'properties': {'low': {'type': ['number', 'null']}, 'usd': {'type': ['number', 'null']}, 'high': {'type': ['number', 'null']}, 'facts': {'type': 'array', 'items': {'type': 'object', 'required': ['key', 'status', 'value', 'level', 'evidence', 'checked_at'], 'properties': {'key': {'type': 'string'}, 'note': {'type': 'string'}, 'label': {'type': 'string'}, 'level': {'type': ['string', 'null'], 'description': 'Where the fact is recorded: offer (the plan), product or provider.'}, 'stale': {'type': 'boolean'}, 'value': {}, '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.'}, '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.'}}}}, 'applies_to': {'type': ['object', 'null'], 'description': 'get_details only: billing options the fact is limited to.'}, 'checked_at': {'type': ['string', 'null']}, 'exceptions': {'type': 'array', 'description': 'get_details only: plans with a different value.'}, 'via_exception': {'type': 'boolean', 'description': 'Present and true when a plan-specific exception replaced the general 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.'}, 'status': {'enum': ['exact', 'range', 'lower_bound', 'unknown']}, 'explanation': {'type': 'string'}, 'lower_bound': {'type': ['number', 'null']}, 'upfront_usd': {'type': ['number', 'null']}}}, 'product_name': {'type': 'string'}, 'preferred_met': {'type': 'integer'}, 'provider_name': {'type': 'string'}, 'billing_options': {'type': 'array', 'items': {'type': 'string'}}, 'unmet_conditions': {'type': 'array', 'items': {'type': 'string'}}, 'prices_exclude_tax': {'type': ['boolean', 'null']}, 'unknown_conditions': {'type': 'array', 'items': {'type': 'string'}}, 'cheapest_in_product': {'type': ['object', 'null'], 'required': ['offer_id', 'offer_name', 'billing', 'monthly_cost', 'is_this_plan'], 'properties': {'billing': {'type': 'string'}, 'offer_id': {'type': 'string'}, 'page_url': {'type': 'string'}, 'offer_name': {'type': 'string'}, 'is_this_plan': {'type': 'boolean'}, 'monthly_cost': {'type': 'object'}}, '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.'}}}}, 'resolution': {'type': 'array', 'items': {'type': 'object', 'required': ['input', 'status', 'offer_id', 'candidates'], 'properties': {'note': {'type': ['string', 'null']}, '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.'}, 'offer_id': {'type': ['string', 'null']}, 'candidates': {'type': 'array', 'items': {'type': 'object', 'required': ['offer_id', 'offer_name', 'provider_name'], 'properties': {'listed': {'type': 'boolean'}, 'offer_id': {'type': 'string'}, 'offer_name': {'type': 'string'}, 'product_name': {'type': 'string'}, 'provider_name': {'type': 'string'}}}}, 'matched_by': {'enum': ['id', 'name', 'url', None]}, 'candidates_total': {'type': 'integer'}}}, 'description': 'How each entry of plans was read.'}, 'assumptions': {'type': 'array', 'items': {'type': 'string'}}, 'needs_input': {'type': 'array', 'items': {'type': 'object', 'required': ['field', 'reason'], 'properties': {'field': {'type': 'string'}, 'reason': {'type': 'string'}}}}}}
cost_scenarios
Plan costs as the workload changes
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.
Solo lectura Idempotente
Esquema de entrada
{'type': 'object', 'properties': {'scale': {'type': 'number', '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.', 'exclusiveMinimum': 0}, 'detail': {'enum': ['summary', 'full'], 'type': 'string', 'default': 'summary', 'description': 'summary returns one source sentence per fact; full returns every recorded fact and sentence.'}, 'target': {'type': 'object', 'properties': {'monthly_pages': {'type': 'object', 'properties': {'javascript': {'type': 'integer', 'minimum': 0}, 'plain_html': {'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.', 'minProperties': 1, 'additionalProperties': False}, 'monthly_searches': {'type': 'integer', 'minimum': 0, 'description': 'Searches 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.'}, 'structured_extraction_pages': {'type': 'integer', 'minimum': 0, 'description': 'Structured-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.', 'minProperties': 1, 'additionalProperties': False}, 'offer_ids': {'type': 'array', 'items': {'type': 'string', 'maxLength': 80, 'minLength': 1}, 'maxItems': 10, 'minItems': 1, '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.', 'uniqueItems': True}, 'preferred': {'type': 'object', 'properties': {'data_regions': {'type': 'array', 'items': {'type': 'string', 'maxLength': 20, 'minLength': 2}, 'minItems': 1, 'description': 'Regions where data must be stored or processed, e.g. ["EU"]. Different from exit-IP countries.', 'uniqueItems': True}, 'billing_types': {'type': 'array', 'items': {'enum': ['monthly_subscription', 'annual_subscription', 'pay_as_you_go', 'prepaid_credits'], 'type': 'string'}, 'minItems': 1, '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.', 'uniqueItems': True}, 'search_engines': {'type': 'array', 'items': {'enum': ['google', 'bing', 'yahoo', 'yandex', 'baidu', 'duckduckgo', 'naver', 'brave'], 'type': 'string'}, 'minItems': 1, '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.", 'uniqueItems': True}, 'min_concurrency': {'type': 'integer', 'minimum': 1, 'description': 'Minimum number of concurrent requests (or browsers) the plan must allow.'}, 'search_countries': {'type': 'array', 'items': {'type': 'string', 'pattern': '^[A-Z]{2}$'}, 'minItems': 1, '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.', 'uniqueItems': True}, 'exit_ip_countries': {'type': 'array', 'items': {'type': 'string', 'pattern': '^[A-Z]{2}$'}, 'minItems': 1, '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.', 'uniqueItems': True}, '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.'}, 'search_result_types': {'type': 'array', 'items': {'enum': ['organic', 'ads', 'local_pack', 'knowledge_graph', 'people_also_ask', 'related_searches', 'shopping', 'news', 'images', 'videos', 'ai_overview'], 'type': 'string'}, 'minItems': 1, '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.', 'uniqueItems': True}, '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.'}, 'min_requests_per_minute': {'type': 'number', 'description': 'Minimum request rate the plan must allow, per minute.', 'exclusiveMinimum': 0}, 'realtime_search_required': {'type': 'boolean', 'description': 'Search results must be returned in real time (not through a queue).'}, 'target_errors_not_billed': {'type': 'boolean', 'description': 'Error responses from the target site (e.g. 404) must not be billed.'}, '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.'}}, 'description': 'Nice-to-have conditions; they do not filter, they break ties.', 'additionalProperties': False}, 'data_regions': {'type': 'array', 'items': {'type': 'string', 'maxLength': 20, 'minLength': 2}, 'minItems': 1, 'description': 'Regions where data must be stored or processed, e.g. ["EU"]. Different from exit-IP countries.', 'uniqueItems': True}, 'billing_types': {'type': 'array', 'items': {'enum': ['monthly_subscription', 'annual_subscription', 'pay_as_you_go', 'prepaid_credits'], 'type': 'string'}, 'minItems': 1, '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.', 'uniqueItems': True}, 'monthly_pages': {'type': 'object', 'properties': {'javascript': {'type': 'integer', 'minimum': 0}, 'plain_html': {'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).', 'minProperties': 1, 'additionalProperties': False}, 'product_types': {'type': 'array', 'items': {'enum': ['scraping_api', 'serp_api', 'headless_browser', 'platform'], 'type': 'string'}, 'minItems': 1, 'description': 'Limit to these product types. Default: every type that can serve the workload.', 'uniqueItems': True}, 'search_engines': {'type': 'array', 'items': {'enum': ['google', 'bing', 'yahoo', 'yandex', 'baidu', 'duckduckgo', 'naver', 'brave'], 'type': 'string'}, 'minItems': 1, '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.", 'uniqueItems': True}, 'min_concurrency': {'type': 'integer', 'minimum': 1, 'description': 'Minimum number of concurrent requests (or browsers) the plan must allow.'}, 'monthly_searches': {'type': 'integer', 'minimum': 0, 'description': 'Search requests per month (one results page each).'}, 'search_countries': {'type': 'array', 'items': {'type': 'string', 'pattern': '^[A-Z]{2}$'}, 'minItems': 1, '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.', 'uniqueItems': True}, 'exit_ip_countries': {'type': 'array', 'items': {'type': 'string', 'pattern': '^[A-Z]{2}$'}, 'minItems': 1, '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.', 'uniqueItems': True}, '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.'}, '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.'}, '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.'}, 'search_result_types': {'type': 'array', 'items': {'enum': ['organic', 'ads', 'local_pack', 'knowledge_graph', 'people_also_ask', 'related_searches', 'shopping', 'news', 'images', 'videos', 'ai_overview'], 'type': 'string'}, 'minItems': 1, '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.', 'uniqueItems': True}, '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.'}, 'min_requests_per_minute': {'type': 'number', 'description': 'Minimum request rate the plan must allow, per minute.', 'exclusiveMinimum': 0}, 'browser_seconds_per_page': {'type': 'number', '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.', 'exclusiveMinimum': 0}, 'realtime_search_required': {'type': 'boolean', 'description': 'Search results must be returned in real time (not through a queue).'}, 'target_errors_not_billed': {'type': 'boolean', 'description': 'Error responses from the target site (e.g. 404) must not be billed.'}, '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.'}, '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.'}, '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.'}}, 'additionalProperties': False}
Esquema de salida
{'type': 'object', 'required': ['as_of', 'needs_input', 'compared', 'path', 'counts', 'at_start', 'at_end', 'switches', 'tracked', 'plans', 'assumptions', 'notes'], 'properties': {'path': {'type': ['object', 'null'], 'required': ['start', 'end', 'steps', 'resolution'], 'properties': {'end': {'type': 'object', 'properties': {'monthly_pages': {'type': 'object'}, 'monthly_searches': {'type': 'integer'}, 'ai_extraction_pages': {'type': 'integer'}, 'structured_extraction_pages': {'type': 'integer'}}, 'description': 'A monthly workload in the request format.'}, 'start': {'type': 'object', 'properties': {'monthly_pages': {'type': 'object'}, 'monthly_searches': {'type': 'integer'}, 'ai_extraction_pages': {'type': 'integer'}, 'structured_extraction_pages': {'type': 'integer'}}, 'description': 'A monthly workload in the request format.'}, 'steps': {'type': 'integer'}, 'resolution': {'type': 'string'}}}, 'as_of': {'type': 'string'}, 'notes': {'type': 'array', 'items': {'type': 'string'}}, 'plans': {'type': 'array', 'items': {'type': 'object', 'required': ['offer_id', 'offer_name', 'provider_name', 'link', 'facts'], 'properties': {'link': {'type': 'object', 'required': ['url', 'landing', 'link_level', 'affiliate'], 'properties': {'url': {'type': 'string'}, 'note': {'type': ['string', 'null']}, 'landing': {'type': 'string'}, 'affiliate': {'type': 'object', 'required': ['status'], 'properties': {'status': {'type': 'string'}, 'program': {'type': ['string', 'null']}, 'disclosure': {'type': ['string', 'null']}}}, 'link_level': {'type': 'string'}}}, 'facts': {'type': 'array', 'items': {'type': 'object', 'required': ['key', 'status', 'value', 'level', 'evidence', 'checked_at'], 'properties': {'key': {'type': 'string'}, 'note': {'type': 'string'}, 'label': {'type': 'string'}, 'level': {'type': ['string', 'null'], 'description': 'Where the fact is recorded: offer (the plan), product or provider.'}, 'stale': {'type': 'boolean'}, 'value': {}, '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.'}, '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.'}}}}, 'applies_to': {'type': ['object', 'null'], 'description': 'get_details only: billing options the fact is limited to.'}, 'checked_at': {'type': ['string', 'null']}, 'exceptions': {'type': 'array', 'description': 'get_details only: plans with a different value.'}, 'via_exception': {'type': 'boolean', 'description': 'Present and true when a plan-specific exception replaced the general 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.'}}}}, 'listed': {'type': 'boolean'}, 'offer_id': {'type': 'string'}, 'page_url': {'type': 'string'}, 'offer_name': {'type': 'string'}, 'product_name': {'type': 'string'}, 'provider_name': {'type': 'string'}}}, 'description': 'Every plan named above, with the official facts its costs were computed from.'}, 'at_end': {'type': 'array', 'items': {'type': 'object', 'required': ['offer_id', 'offer_name', 'provider_name', 'billing', 'match', 'monthly_cost'], 'properties': {'match': {'enum': ['FULL_MATCH', 'PARTIAL_MATCH', 'NO_MATCH']}, 'billing': {'type': 'string'}, 'offer_id': {'type': 'string'}, 'offer_name': {'type': 'string'}, 'monthly_cost': {'type': 'object', 'required': ['status', 'usd', 'explanation'], 'properties': {'low': {'type': ['number', 'null']}, 'usd': {'type': ['number', 'null']}, 'high': {'type': ['number', 'null']}, 'facts': {'type': 'array', 'items': {'type': 'object', 'required': ['key', 'status', 'value', 'level', 'evidence', 'checked_at'], 'properties': {'key': {'type': 'string'}, 'note': {'type': 'string'}, 'label': {'type': 'string'}, 'level': {'type': ['string', 'null'], 'description': 'Where the fact is recorded: offer (the plan), product or provider.'}, 'stale': {'type': 'boolean'}, 'value': {}, '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.'}, '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.'}}}}, 'applies_to': {'type': ['object', 'null'], 'description': 'get_details only: billing options the fact is limited to.'}, 'checked_at': {'type': ['string', 'null']}, 'exceptions': {'type': 'array', 'description': 'get_details only: plans with a different value.'}, 'via_exception': {'type': 'boolean', 'description': 'Present and true when a plan-specific exception replaced the general 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.'}, 'status': {'enum': ['exact', 'range', 'lower_bound', 'unknown']}, 'explanation': {'type': 'string'}, 'lower_bound': {'type': ['number', 'null']}, 'upfront_usd': {'type': ['number', 'null']}}}, 'provider_name': {'type': 'string'}}}, 'description': 'Up to three cheapest full matches at the target workload.'}, 'counts': {'type': ['object', 'null'], 'required': ['start', 'end'], 'properties': {'end': {'type': 'object', 'required': ['candidates', 'full', 'partial', 'no_match'], 'properties': {'full': {'type': 'integer'}, 'partial': {'type': 'integer'}, 'no_match': {'type': 'integer'}, 'candidates': {'type': 'integer'}}}, 'start': {'type': 'object', 'required': ['candidates', 'full', 'partial', 'no_match'], 'properties': {'full': {'type': 'integer'}, 'partial': {'type': 'integer'}, 'no_match': {'type': 'integer'}, 'candidates': {'type': 'integer'}}}}}, 'request': {'type': 'object'}, 'tracked': {'type': 'array', 'items': {'type': 'object', 'required': ['offer_id', 'at_start', 'at_end', 'cost_change', 'volume_limit', 'budget_exceeded', 'stops_matching'], 'properties': {'at_end': {'type': 'object', 'required': ['offer_id', 'offer_name', 'provider_name', 'billing', 'match', 'monthly_cost'], 'properties': {'match': {'enum': ['FULL_MATCH', 'PARTIAL_MATCH', 'NO_MATCH']}, 'billing': {'type': 'string'}, 'offer_id': {'type': 'string'}, 'offer_name': {'type': 'string'}, 'monthly_cost': {'type': 'object', 'required': ['status', 'usd', 'explanation'], 'properties': {'low': {'type': ['number', 'null']}, 'usd': {'type': ['number', 'null']}, 'high': {'type': ['number', 'null']}, 'facts': {'type': 'array', 'items': {'type': 'object', 'required': ['key', 'status', 'value', 'level', 'evidence', 'checked_at'], 'properties': {'key': {'type': 'string'}, 'note': {'type': 'string'}, 'label': {'type': 'string'}, 'level': {'type': ['string', 'null'], 'description': 'Where the fact is recorded: offer (the plan), product or provider.'}, 'stale': {'type': 'boolean'}, 'value': {}, '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.'}, '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.'}}}}, 'applies_to': {'type': ['object', 'null'], 'description': 'get_details only: billing options the fact is limited to.'}, 'checked_at': {'type': ['string', 'null']}, 'exceptions': {'type': 'array', 'description': 'get_details only: plans with a different value.'}, 'via_exception': {'type': 'boolean', 'description': 'Present and true when a plan-specific exception replaced the general 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.'}, 'status': {'enum': ['exact', 'range', 'lower_bound', 'unknown']}, 'explanation': {'type': 'string'}, 'lower_bound': {'type': ['number', 'null']}, 'upfront_usd': {'type': ['number', 'null']}}}, 'provider_name': {'type': 'string'}}}, 'at_start': {'type': 'object', 'required': ['offer_id', 'offer_name', 'provider_name', 'billing', 'match', 'monthly_cost'], 'properties': {'match': {'enum': ['FULL_MATCH', 'PARTIAL_MATCH', 'NO_MATCH']}, 'billing': {'type': 'string'}, 'offer_id': {'type': 'string'}, 'offer_name': {'type': 'string'}, 'monthly_cost': {'type': 'object', 'required': ['status', 'usd', 'explanation'], 'properties': {'low': {'type': ['number', 'null']}, 'usd': {'type': ['number', 'null']}, 'high': {'type': ['number', 'null']}, 'facts': {'type': 'array', 'items': {'type': 'object', 'required': ['key', 'status', 'value', 'level', 'evidence', 'checked_at'], 'properties': {'key': {'type': 'string'}, 'note': {'type': 'string'}, 'label': {'type': 'string'}, 'level': {'type': ['string', 'null'], 'description': 'Where the fact is recorded: offer (the plan), product or provider.'}, 'stale': {'type': 'boolean'}, 'value': {}, '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.'}, '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.'}}}}, 'applies_to': {'type': ['object', 'null'], 'description': 'get_details only: billing options the fact is limited to.'}, 'checked_at': {'type': ['string', 'null']}, 'exceptions': {'type': 'array', 'description': 'get_details only: plans with a different value.'}, 'via_exception': {'type': 'boolean', 'description': 'Present and true when a plan-specific exception replaced the general 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.'}, 'status': {'enum': ['exact', 'range', 'lower_bound', 'unknown']}, 'explanation': {'type': 'string'}, 'lower_bound': {'type': ['number', 'null']}, 'upfront_usd': {'type': ['number', 'null']}}}, 'provider_name': {'type': 'string'}}}, 'offer_id': {'type': 'string'}, 'offer_name': {'type': 'string'}, 'cost_change': {'type': ['object', 'null'], 'required': ['workload'], 'properties': {'match': {'enum': ['FULL_MATCH', 'PARTIAL_MATCH', 'NO_MATCH']}, 'reason': {'type': 'string'}, 'billing': {'type': 'string'}, 'verdict': {'enum': ['MET', 'UNMET', 'UNKNOWN']}, 'workload': {'type': 'object', 'properties': {'monthly_pages': {'type': 'object'}, 'monthly_searches': {'type': 'integer'}, 'ai_extraction_pages': {'type': 'integer'}, 'structured_extraction_pages': {'type': 'integer'}}, 'description': 'A monthly workload in the request format.'}, 'conditions': {'type': 'array', 'items': {'type': 'object', 'required': ['condition', 'verdict', 'reason'], 'properties': {'reason': {'type': 'string'}, 'verdict': {'enum': ['MET', 'UNMET', 'UNKNOWN']}, 'condition': {'type': 'string'}}}}, 'monthly_cost': {'type': 'object', 'required': ['status', 'usd', 'explanation'], 'properties': {'low': {'type': ['number', 'null']}, 'usd': {'type': ['number', 'null']}, 'high': {'type': ['number', 'null']}, 'facts': {'type': 'array', 'items': {'type': 'object', 'required': ['key', 'status', 'value', 'level', 'evidence', 'checked_at'], 'properties': {'key': {'type': 'string'}, 'note': {'type': 'string'}, 'label': {'type': 'string'}, 'level': {'type': ['string', 'null'], 'description': 'Where the fact is recorded: offer (the plan), product or provider.'}, 'stale': {'type': 'boolean'}, 'value': {}, '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.'}, '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.'}}}}, 'applies_to': {'type': ['object', 'null'], 'description': 'get_details only: billing options the fact is limited to.'}, 'checked_at': {'type': ['string', 'null']}, 'exceptions': {'type': 'array', 'description': 'get_details only: plans with a different value.'}, 'via_exception': {'type': 'boolean', 'description': 'Present and true when a plan-specific exception replaced the general 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.'}, 'status': {'enum': ['exact', 'range', 'lower_bound', 'unknown']}, 'explanation': {'type': 'string'}, 'lower_bound': {'type': ['number', 'null']}, 'upfront_usd': {'type': ['number', 'null']}}}}, 'description': 'First workload where the monthly cost differs from the start.'}, 'volume_limit': {'type': ['object', 'null'], 'required': ['workload'], 'properties': {'match': {'enum': ['FULL_MATCH', 'PARTIAL_MATCH', 'NO_MATCH']}, 'reason': {'type': 'string'}, 'billing': {'type': 'string'}, 'verdict': {'enum': ['MET', 'UNMET', 'UNKNOWN']}, 'workload': {'type': 'object', 'properties': {'monthly_pages': {'type': 'object'}, 'monthly_searches': {'type': 'integer'}, 'ai_extraction_pages': {'type': 'integer'}, 'structured_extraction_pages': {'type': 'integer'}}, 'description': 'A monthly workload in the request format.'}, 'conditions': {'type': 'array', 'items': {'type': 'object', 'required': ['condition', 'verdict', 'reason'], 'properties': {'reason': {'type': 'string'}, 'verdict': {'enum': ['MET', 'UNMET', 'UNKNOWN']}, 'condition': {'type': 'string'}}}}, 'monthly_cost': {'type': 'object', 'required': ['status', 'usd', 'explanation'], 'properties': {'low': {'type': ['number', 'null']}, 'usd': {'type': ['number', 'null']}, 'high': {'type': ['number', 'null']}, 'facts': {'type': 'array', 'items': {'type': 'object', 'required': ['key', 'status', 'value', 'level', 'evidence', 'checked_at'], 'properties': {'key': {'type': 'string'}, 'note': {'type': 'string'}, 'label': {'type': 'string'}, 'level': {'type': ['string', 'null'], 'description': 'Where the fact is recorded: offer (the plan), product or provider.'}, 'stale': {'type': 'boolean'}, 'value': {}, '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.'}, '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.'}}}}, 'applies_to': {'type': ['object', 'null'], 'description': 'get_details only: billing options the fact is limited to.'}, 'checked_at': {'type': ['string', 'null']}, 'exceptions': {'type': 'array', 'description': 'get_details only: plans with a different value.'}, 'via_exception': {'type': 'boolean', 'description': 'Present and true when a plan-specific exception replaced the general 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.'}, 'status': {'enum': ['exact', 'range', 'lower_bound', 'unknown']}, 'explanation': {'type': 'string'}, 'lower_bound': {'type': ['number', 'null']}, 'upfront_usd': {'type': ['number', 'null']}}}}, 'description': 'First workload the plan does not cover.'}, 'provider_name': {'type': 'string'}, 'stops_matching': {'type': ['object', 'null'], 'required': ['workload'], 'properties': {'match': {'enum': ['FULL_MATCH', 'PARTIAL_MATCH', 'NO_MATCH']}, 'reason': {'type': 'string'}, 'billing': {'type': 'string'}, 'verdict': {'enum': ['MET', 'UNMET', 'UNKNOWN']}, 'workload': {'type': 'object', 'properties': {'monthly_pages': {'type': 'object'}, 'monthly_searches': {'type': 'integer'}, 'ai_extraction_pages': {'type': 'integer'}, 'structured_extraction_pages': {'type': 'integer'}}, 'description': 'A monthly workload in the request format.'}, 'conditions': {'type': 'array', 'items': {'type': 'object', 'required': ['condition', 'verdict', 'reason'], 'properties': {'reason': {'type': 'string'}, 'verdict': {'enum': ['MET', 'UNMET', 'UNKNOWN']}, 'condition': {'type': 'string'}}}}, 'monthly_cost': {'type': 'object', 'required': ['status', 'usd', 'explanation'], 'properties': {'low': {'type': ['number', 'null']}, 'usd': {'type': ['number', 'null']}, 'high': {'type': ['number', 'null']}, 'facts': {'type': 'array', 'items': {'type': 'object', 'required': ['key', 'status', 'value', 'level', 'evidence', 'checked_at'], 'properties': {'key': {'type': 'string'}, 'note': {'type': 'string'}, 'label': {'type': 'string'}, 'level': {'type': ['string', 'null'], 'description': 'Where the fact is recorded: offer (the plan), product or provider.'}, 'stale': {'type': 'boolean'}, 'value': {}, '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.'}, '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.'}}}}, 'applies_to': {'type': ['object', 'null'], 'description': 'get_details only: billing options the fact is limited to.'}, 'checked_at': {'type': ['string', 'null']}, 'exceptions': {'type': 'array', 'description': 'get_details only: plans with a different value.'}, 'via_exception': {'type': 'boolean', 'description': 'Present and true when a plan-specific exception replaced the general 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.'}, 'status': {'enum': ['exact', 'range', 'lower_bound', 'unknown']}, 'explanation': {'type': 'string'}, 'lower_bound': {'type': ['number', 'null']}, 'upfront_usd': {'type': ['number', 'null']}}}}, 'description': 'First workload where the plan is no longer a full match.'}, 'budget_exceeded': {'type': ['object', 'null'], 'required': ['workload'], 'properties': {'match': {'enum': ['FULL_MATCH', 'PARTIAL_MATCH', 'NO_MATCH']}, 'reason': {'type': 'string'}, 'billing': {'type': 'string'}, 'verdict': {'enum': ['MET', 'UNMET', 'UNKNOWN']}, 'workload': {'type': 'object', 'properties': {'monthly_pages': {'type': 'object'}, 'monthly_searches': {'type': 'integer'}, 'ai_extraction_pages': {'type': 'integer'}, 'structured_extraction_pages': {'type': 'integer'}}, 'description': 'A monthly workload in the request format.'}, 'conditions': {'type': 'array', 'items': {'type': 'object', 'required': ['condition', 'verdict', 'reason'], 'properties': {'reason': {'type': 'string'}, 'verdict': {'enum': ['MET', 'UNMET', 'UNKNOWN']}, 'condition': {'type': 'string'}}}}, 'monthly_cost': {'type': 'object', 'required': ['status', 'usd', 'explanation'], 'properties': {'low': {'type': ['number', 'null']}, 'usd': {'type': ['number', 'null']}, 'high': {'type': ['number', 'null']}, 'facts': {'type': 'array', 'items': {'type': 'object', 'required': ['key', 'status', 'value', 'level', 'evidence', 'checked_at'], 'properties': {'key': {'type': 'string'}, 'note': {'type': 'string'}, 'label': {'type': 'string'}, 'level': {'type': ['string', 'null'], 'description': 'Where the fact is recorded: offer (the plan), product or provider.'}, 'stale': {'type': 'boolean'}, 'value': {}, '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.'}, '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.'}}}}, 'applies_to': {'type': ['object', 'null'], 'description': 'get_details only: billing options the fact is limited to.'}, 'checked_at': {'type': ['string', 'null']}, 'exceptions': {'type': 'array', 'description': 'get_details only: plans with a different value.'}, 'via_exception': {'type': 'boolean', 'description': 'Present and true when a plan-specific exception replaced the general 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.'}, 'status': {'enum': ['exact', 'range', 'lower_bound', 'unknown']}, 'explanation': {'type': 'string'}, 'lower_bound': {'type': ['number', 'null']}, 'upfront_usd': {'type': ['number', 'null']}}}}, 'description': 'First workload where the monthly cost is known to exceed the budget; null without a budget or when it never does.'}}}}, 'at_start': {'type': 'array', 'items': {'type': 'object', 'required': ['offer_id', 'offer_name', 'provider_name', 'billing', 'match', 'monthly_cost'], 'properties': {'match': {'enum': ['FULL_MATCH', 'PARTIAL_MATCH', 'NO_MATCH']}, 'billing': {'type': 'string'}, 'offer_id': {'type': 'string'}, 'offer_name': {'type': 'string'}, 'monthly_cost': {'type': 'object', 'required': ['status', 'usd', 'explanation'], 'properties': {'low': {'type': ['number', 'null']}, 'usd': {'type': ['number', 'null']}, 'high': {'type': ['number', 'null']}, 'facts': {'type': 'array', 'items': {'type': 'object', 'required': ['key', 'status', 'value', 'level', 'evidence', 'checked_at'], 'properties': {'key': {'type': 'string'}, 'note': {'type': 'string'}, 'label': {'type': 'string'}, 'level': {'type': ['string', 'null'], 'description': 'Where the fact is recorded: offer (the plan), product or provider.'}, 'stale': {'type': 'boolean'}, 'value': {}, '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.'}, '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.'}}}}, 'applies_to': {'type': ['object', 'null'], 'description': 'get_details only: billing options the fact is limited to.'}, 'checked_at': {'type': ['string', 'null']}, 'exceptions': {'type': 'array', 'description': 'get_details only: plans with a different value.'}, 'via_exception': {'type': 'boolean', 'description': 'Present and true when a plan-specific exception replaced the general 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.'}, 'status': {'enum': ['exact', 'range', 'lower_bound', 'unknown']}, 'explanation': {'type': 'string'}, 'lower_bound': {'type': ['number', 'null']}, 'upfront_usd': {'type': ['number', 'null']}}}, 'provider_name': {'type': 'string'}}}, 'description': 'Up to three cheapest full matches at the current workload.'}, 'compared': {'enum': ['all_plans', 'given_plans']}, 'switches': {'type': 'array', 'items': {'type': 'object', 'required': ['workload', 'from', 'to', 'reason'], 'properties': {'to': {'type': ['object', 'null'], 'required': ['offer_id', 'offer_name', 'provider_name', 'billing', 'match', 'monthly_cost'], 'properties': {'match': {'enum': ['FULL_MATCH', 'PARTIAL_MATCH', 'NO_MATCH']}, 'billing': {'type': 'string'}, 'offer_id': {'type': 'string'}, 'offer_name': {'type': 'string'}, 'monthly_cost': {'type': 'object', 'required': ['status', 'usd', 'explanation'], 'properties': {'low': {'type': ['number', 'null']}, 'usd': {'type': ['number', 'null']}, 'high': {'type': ['number', 'null']}, 'facts': {'type': 'array', 'items': {'type': 'object', 'required': ['key', 'status', 'value', 'level', 'evidence', 'checked_at'], 'properties': {'key': {'type': 'string'}, 'note': {'type': 'string'}, 'label': {'type': 'string'}, 'level': {'type': ['string', 'null'], 'description': 'Where the fact is recorded: offer (the plan), product or provider.'}, 'stale': {'type': 'boolean'}, 'value': {}, '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.'}, '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.'}}}}, 'applies_to': {'type': ['object', 'null'], 'description': 'get_details only: billing options the fact is limited to.'}, 'checked_at': {'type': ['string', 'null']}, 'exceptions': {'type': 'array', 'description': 'get_details only: plans with a different value.'}, 'via_exception': {'type': 'boolean', 'description': 'Present and true when a plan-specific exception replaced the general 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.'}, 'status': {'enum': ['exact', 'range', 'lower_bound', 'unknown']}, 'explanation': {'type': 'string'}, 'lower_bound': {'type': ['number', 'null']}, 'upfront_usd': {'type': ['number', 'null']}}}, 'provider_name': {'type': 'string'}}}, 'from': {'type': ['object', 'null'], 'required': ['offer_id', 'offer_name', 'provider_name', 'billing', 'match', 'monthly_cost'], 'properties': {'match': {'enum': ['FULL_MATCH', 'PARTIAL_MATCH', 'NO_MATCH']}, 'billing': {'type': 'string'}, 'offer_id': {'type': 'string'}, 'offer_name': {'type': 'string'}, 'monthly_cost': {'type': 'object', 'required': ['status', 'usd', 'explanation'], 'properties': {'low': {'type': ['number', 'null']}, 'usd': {'type': ['number', 'null']}, 'high': {'type': ['number', 'null']}, 'facts': {'type': 'array', 'items': {'type': 'object', 'required': ['key', 'status', 'value', 'level', 'evidence', 'checked_at'], 'properties': {'key': {'type': 'string'}, 'note': {'type': 'string'}, 'label': {'type': 'string'}, 'level': {'type': ['string', 'null'], 'description': 'Where the fact is recorded: offer (the plan), product or provider.'}, 'stale': {'type': 'boolean'}, 'value': {}, '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.'}, '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.'}}}}, 'applies_to': {'type': ['object', 'null'], 'description': 'get_details only: billing options the fact is limited to.'}, 'checked_at': {'type': ['string', 'null']}, 'exceptions': {'type': 'array', 'description': 'get_details only: plans with a different value.'}, 'via_exception': {'type': 'boolean', 'description': 'Present and true when a plan-specific exception replaced the general 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.'}, 'status': {'enum': ['exact', 'range', 'lower_bound', 'unknown']}, 'explanation': {'type': 'string'}, 'lower_bound': {'type': ['number', 'null']}, 'upfront_usd': {'type': ['number', 'null']}}}, 'provider_name': {'type': 'string'}}}, 'reason': {'type': 'string'}, 'workload': {'type': 'object', 'properties': {'monthly_pages': {'type': 'object'}, 'monthly_searches': {'type': 'integer'}, 'ai_extraction_pages': {'type': 'integer'}, 'structured_extraction_pages': {'type': 'integer'}}, 'description': 'A monthly workload in the request format.'}}}, 'description': 'Each workload on the path where the cheapest full match changes.'}, 'assumptions': {'type': 'array', 'items': {'type': 'string'}}, 'needs_input': {'type': 'array', 'items': {'type': 'object', 'required': ['field', 'reason'], 'properties': {'field': {'type': 'string'}, 'reason': {'type': 'string'}}}}}}
get_details
Get recorded conditions of a plan or product
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.
Solo lectura Idempotente
Esquema de entrada
{'type': 'object', 'properties': {'offer_id': {'type': 'string', 'maxLength': 80, 'minLength': 1, 'description': 'A plan id, e.g. "firecrawl-standard".'}, 'product_id': {'type': 'string', 'maxLength': 80, 'minLength': 1, 'description': 'A product id, e.g. "firecrawl-api".'}}, 'description': 'Give exactly one of offer_id or product_id.', 'additionalProperties': False}
Esquema de salida
{'type': 'object', 'required': ['as_of', 'provider', 'product', 'offers'], 'properties': {'as_of': {'type': 'string'}, 'offers': {'type': 'array', 'items': {'type': 'object', 'required': ['id', 'name', 'type', 'listed', 'facts', 'link'], 'properties': {'id': {'type': 'string'}, 'link': {'type': 'object', 'required': ['url', 'landing', 'link_level', 'affiliate'], 'properties': {'url': {'type': 'string'}, 'note': {'type': ['string', 'null']}, 'landing': {'type': 'string'}, 'affiliate': {'type': 'object', 'required': ['status'], 'properties': {'status': {'type': 'string'}, 'program': {'type': ['string', 'null']}, 'disclosure': {'type': ['string', 'null']}}}, 'link_level': {'type': 'string'}}}, 'name': {'type': 'string'}, 'type': {'type': 'string'}, 'facts': {'type': 'array', 'items': {'type': 'object', 'required': ['key', 'status', 'value', 'level', 'evidence', 'checked_at'], 'properties': {'key': {'type': 'string'}, 'note': {'type': 'string'}, 'label': {'type': 'string'}, 'level': {'type': ['string', 'null'], 'description': 'Where the fact is recorded: offer (the plan), product or provider.'}, 'stale': {'type': 'boolean'}, 'value': {}, '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.'}, '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.'}}}}, 'applies_to': {'type': ['object', 'null'], 'description': 'get_details only: billing options the fact is limited to.'}, 'checked_at': {'type': ['string', 'null']}, 'exceptions': {'type': 'array', 'description': 'get_details only: plans with a different value.'}, 'via_exception': {'type': 'boolean', 'description': 'Present and true when a plan-specific exception replaced the general 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.'}}}}, 'listed': {'type': 'boolean'}}}}, 'product': {'type': 'object', 'required': ['id', 'name', 'kinds', 'facts'], 'properties': {'id': {'type': 'string'}, 'name': {'type': 'string'}, 'facts': {'type': 'array', 'items': {'type': 'object', 'required': ['key', 'status', 'value', 'level', 'evidence', 'checked_at'], 'properties': {'key': {'type': 'string'}, 'note': {'type': 'string'}, 'label': {'type': 'string'}, 'level': {'type': ['string', 'null'], 'description': 'Where the fact is recorded: offer (the plan), product or provider.'}, 'stale': {'type': 'boolean'}, 'value': {}, '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.'}, '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.'}}}}, 'applies_to': {'type': ['object', 'null'], 'description': 'get_details only: billing options the fact is limited to.'}, 'checked_at': {'type': ['string', 'null']}, 'exceptions': {'type': 'array', 'description': 'get_details only: plans with a different value.'}, 'via_exception': {'type': 'boolean', 'description': 'Present and true when a plan-specific exception replaced the general 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.'}}}}, 'kinds': {'type': 'array'}}}, 'provider': {'type': 'object', 'required': ['id', 'name'], 'properties': {'id': {'type': 'string'}, 'name': {'type': 'string'}, '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."}, '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."}}}, '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.'}}}
relax_conditions
Smallest condition changes that admit plans
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.
Solo lectura Idempotente
Esquema de entrada
{'type': 'object', 'properties': {'limit': {'type': 'integer', 'default': 3, 'maximum': 20, 'minimum': 1, 'description': 'Maximum plans listed for each change and under confirm_with_provider (default 3).'}, 'detail': {'enum': ['summary', 'full'], 'type': 'string', 'default': 'summary', 'description': 'summary returns one source sentence per fact; full returns every recorded fact and sentence.'}, 'preferred': {'type': 'object', 'properties': {'data_regions': {'type': 'array', 'items': {'type': 'string', 'maxLength': 20, 'minLength': 2}, 'minItems': 1, 'description': 'Regions where data must be stored or processed, e.g. ["EU"]. Different from exit-IP countries.', 'uniqueItems': True}, 'billing_types': {'type': 'array', 'items': {'enum': ['monthly_subscription', 'annual_subscription', 'pay_as_you_go', 'prepaid_credits'], 'type': 'string'}, 'minItems': 1, '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.', 'uniqueItems': True}, 'search_engines': {'type': 'array', 'items': {'enum': ['google', 'bing', 'yahoo', 'yandex', 'baidu', 'duckduckgo', 'naver', 'brave'], 'type': 'string'}, 'minItems': 1, '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.", 'uniqueItems': True}, 'min_concurrency': {'type': 'integer', 'minimum': 1, 'description': 'Minimum number of concurrent requests (or browsers) the plan must allow.'}, 'search_countries': {'type': 'array', 'items': {'type': 'string', 'pattern': '^[A-Z]{2}$'}, 'minItems': 1, '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.', 'uniqueItems': True}, 'exit_ip_countries': {'type': 'array', 'items': {'type': 'string', 'pattern': '^[A-Z]{2}$'}, 'minItems': 1, '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.', 'uniqueItems': True}, '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.'}, 'search_result_types': {'type': 'array', 'items': {'enum': ['organic', 'ads', 'local_pack', 'knowledge_graph', 'people_also_ask', 'related_searches', 'shopping', 'news', 'images', 'videos', 'ai_overview'], 'type': 'string'}, 'minItems': 1, '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.', 'uniqueItems': True}, '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.'}, 'min_requests_per_minute': {'type': 'number', 'description': 'Minimum request rate the plan must allow, per minute.', 'exclusiveMinimum': 0}, 'realtime_search_required': {'type': 'boolean', 'description': 'Search results must be returned in real time (not through a queue).'}, 'target_errors_not_billed': {'type': 'boolean', 'description': 'Error responses from the target site (e.g. 404) must not be billed.'}, '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.'}}, 'description': 'Nice-to-have conditions; they do not filter, they break ties.', 'additionalProperties': False}, 'negotiable': {'type': 'array', 'items': {'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'], 'type': 'string'}, 'minItems': 1, '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.', 'uniqueItems': True}, 'data_regions': {'type': 'array', 'items': {'type': 'string', 'maxLength': 20, 'minLength': 2}, 'minItems': 1, 'description': 'Regions where data must be stored or processed, e.g. ["EU"]. Different from exit-IP countries.', 'uniqueItems': True}, 'billing_types': {'type': 'array', 'items': {'enum': ['monthly_subscription', 'annual_subscription', 'pay_as_you_go', 'prepaid_credits'], 'type': 'string'}, 'minItems': 1, '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.', 'uniqueItems': True}, 'monthly_pages': {'type': 'object', 'properties': {'javascript': {'type': 'integer', 'minimum': 0}, 'plain_html': {'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).', 'minProperties': 1, 'additionalProperties': False}, 'product_types': {'type': 'array', 'items': {'enum': ['scraping_api', 'serp_api', 'headless_browser', 'platform'], 'type': 'string'}, 'minItems': 1, 'description': 'Limit to these product types. Default: every type that can serve the workload.', 'uniqueItems': True}, 'search_engines': {'type': 'array', 'items': {'enum': ['google', 'bing', 'yahoo', 'yandex', 'baidu', 'duckduckgo', 'naver', 'brave'], 'type': 'string'}, 'minItems': 1, '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.", 'uniqueItems': True}, 'min_concurrency': {'type': 'integer', 'minimum': 1, 'description': 'Minimum number of concurrent requests (or browsers) the plan must allow.'}, 'monthly_searches': {'type': 'integer', 'minimum': 0, 'description': 'Search requests per month (one results page each).'}, 'search_countries': {'type': 'array', 'items': {'type': 'string', 'pattern': '^[A-Z]{2}$'}, 'minItems': 1, '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.', 'uniqueItems': True}, 'exit_ip_countries': {'type': 'array', 'items': {'type': 'string', 'pattern': '^[A-Z]{2}$'}, 'minItems': 1, '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.', 'uniqueItems': True}, '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.'}, '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.'}, '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.'}, 'search_result_types': {'type': 'array', 'items': {'enum': ['organic', 'ads', 'local_pack', 'knowledge_graph', 'people_also_ask', 'related_searches', 'shopping', 'news', 'images', 'videos', 'ai_overview'], 'type': 'string'}, 'minItems': 1, '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.', 'uniqueItems': True}, '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.'}, 'min_requests_per_minute': {'type': 'number', 'description': 'Minimum request rate the plan must allow, per minute.', 'exclusiveMinimum': 0}, 'browser_seconds_per_page': {'type': 'number', '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.', 'exclusiveMinimum': 0}, 'realtime_search_required': {'type': 'boolean', 'description': 'Search results must be returned in real time (not through a queue).'}, 'target_errors_not_billed': {'type': 'boolean', 'description': 'Error responses from the target site (e.g. 404) must not be billed.'}, '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.'}, '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.'}, '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.'}}, 'additionalProperties': False}
Esquema de salida
{'type': 'object', 'required': ['as_of', 'needs_input', 'counts', 'changes', 'confirm_with_provider', 'assumptions', 'notes'], 'properties': {'as_of': {'type': 'string'}, 'notes': {'type': 'array', 'items': {'type': 'string'}}, 'counts': {'type': 'object', 'required': ['candidates', 'full', 'partial', 'no_match'], 'properties': {'full': {'type': 'integer'}, 'partial': {'type': 'integer'}, 'no_match': {'type': 'integer'}, 'candidates': {'type': 'integer'}}}, 'changes': {'type': 'array', 'items': {'type': 'object', 'required': ['condition', 'label', 'field', 'current', 'ask_user', 'options', 'blocked_by', 'note'], 'properties': {'note': {'type': ['string', 'null']}, 'field': {'type': ['string', 'null'], 'description': 'Request field of the condition; null for monthly_volume, which changes the workload fields.'}, 'label': {'type': 'string'}, 'current': {}, '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': {'type': 'array', 'items': {'type': 'object', 'required': ['offer_id', 'offer_name', 'provider_name', 'billing', 'monthly_cost', 'meets_all', 'meets_all_after_change', 'was', 'facts', 'link'], 'properties': {'was': {'type': 'array', 'items': {'type': 'object', 'required': ['condition', 'verdict', 'reason'], 'properties': {'reason': {'type': 'string'}, 'verdict': {'enum': ['MET', 'UNMET', 'UNKNOWN']}, 'condition': {'type': 'string'}}}, 'description': 'Required conditions this plan did not meet before the change.'}, 'link': {'type': 'object', 'required': ['url', 'landing', 'link_level', 'affiliate'], 'properties': {'url': {'type': 'string'}, 'note': {'type': ['string', 'null']}, 'landing': {'type': 'string'}, 'affiliate': {'type': 'object', 'required': ['status'], 'properties': {'status': {'type': 'string'}, 'program': {'type': ['string', 'null']}, 'disclosure': {'type': ['string', 'null']}}}, 'link_level': {'type': 'string'}}}, 'facts': {'type': 'array', 'items': {'type': 'object', 'required': ['key', 'status', 'value', 'level', 'evidence', 'checked_at'], 'properties': {'key': {'type': 'string'}, 'note': {'type': 'string'}, 'label': {'type': 'string'}, 'level': {'type': ['string', 'null'], 'description': 'Where the fact is recorded: offer (the plan), product or provider.'}, 'stale': {'type': 'boolean'}, 'value': {}, '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.'}, '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.'}}}}, 'applies_to': {'type': ['object', 'null'], 'description': 'get_details only: billing options the fact is limited to.'}, 'checked_at': {'type': ['string', 'null']}, 'exceptions': {'type': 'array', 'description': 'get_details only: plans with a different value.'}, 'via_exception': {'type': 'boolean', 'description': 'Present and true when a plan-specific exception replaced the general 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).'}, 'listed': {'type': 'boolean'}, 'billing': {'type': 'string'}, 'offer_id': {'type': 'string'}, 'page_url': {'type': 'string'}, 'meets_all': {'enum': [True, False, 'unknown'], 'description': 'Against the request as given, before the change: false or "unknown".'}, 'offer_name': {'type': 'string'}, 'monthly_cost': {'type': 'object', 'required': ['status', 'usd', 'explanation'], 'properties': {'low': {'type': ['number', 'null']}, 'usd': {'type': ['number', 'null']}, 'high': {'type': ['number', 'null']}, 'facts': {'type': 'array', 'items': {'type': 'object', 'required': ['key', 'status', 'value', 'level', 'evidence', 'checked_at'], 'properties': {'key': {'type': 'string'}, 'note': {'type': 'string'}, 'label': {'type': 'string'}, 'level': {'type': ['string', 'null'], 'description': 'Where the fact is recorded: offer (the plan), product or provider.'}, 'stale': {'type': 'boolean'}, 'value': {}, '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.'}, '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.'}}}}, 'applies_to': {'type': ['object', 'null'], 'description': 'get_details only: billing options the fact is limited to.'}, 'checked_at': {'type': ['string', 'null']}, 'exceptions': {'type': 'array', 'description': 'get_details only: plans with a different value.'}, 'via_exception': {'type': 'boolean', 'description': 'Present and true when a plan-specific exception replaced the general 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.'}, 'status': {'enum': ['exact', 'range', 'lower_bound', 'unknown']}, 'explanation': {'type': 'string'}, 'lower_bound': {'type': ['number', 'null']}, 'upfront_usd': {'type': ['number', 'null']}}}, 'product_name': {'type': 'string'}, 'provider_name': {'type': 'string'}, 'meets_all_after_change': {'enum': [True], 'type': 'boolean', 'description': 'Against the request with this change applied: always true, because only plans that then meet every required condition are listed.'}}}}, 'admitted_total': {'type': 'integer'}}}}, 'ask_user': {'type': 'boolean', 'description': 'True when negotiable was not given: ask the user before changing this condition.'}, 'condition': {'type': 'string'}, 'blocked_by': {'type': 'array', 'items': {'type': 'object', 'required': ['condition', 'plans'], 'properties': {'label': {'type': 'string'}, 'plans': {'type': 'integer'}, 'condition': {'type': 'string'}}}, 'description': 'When no change of this condition alone is enough: other conditions not met by the plans that fail this one.'}}}}, 'request': {'type': 'object'}, 'assumptions': {'type': 'array', 'items': {'type': 'string'}}, 'needs_input': {'type': 'array', 'items': {'type': 'object', 'required': ['field', 'reason'], 'properties': {'field': {'type': 'string'}, 'reason': {'type': 'string'}}}}, 'confirm_with_provider': {'type': 'object', 'required': ['total', 'plans'], 'properties': {'plans': {'type': 'array', 'items': {'type': 'object', 'required': ['offer_id', 'offer_name', 'provider_name', 'monthly_cost', 'meets_all', 'unknown', 'pages_checked', 'link'], 'properties': {'link': {'type': 'object', 'required': ['url', 'landing', 'link_level', 'affiliate'], 'properties': {'url': {'type': 'string'}, 'note': {'type': ['string', 'null']}, 'landing': {'type': 'string'}, 'affiliate': {'type': 'object', 'required': ['status'], 'properties': {'status': {'type': 'string'}, 'program': {'type': ['string', 'null']}, 'disclosure': {'type': ['string', 'null']}}}, 'link_level': {'type': 'string'}}}, 'listed': {'type': 'boolean'}, 'billing': {'type': 'string'}, 'unknown': {'type': 'array', 'items': {'type': 'object', 'required': ['condition', 'reason', 'checked_at'], 'properties': {'label': {'type': 'string'}, 'reason': {'type': 'string'}, 'condition': {'type': 'string'}, 'checked_at': {'type': 'string'}}}}, 'offer_id': {'type': 'string'}, 'page_url': {'type': 'string'}, '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.'}, 'offer_name': {'type': 'string'}, 'monthly_cost': {'type': 'object', 'required': ['status', 'usd', 'explanation'], 'properties': {'low': {'type': ['number', 'null']}, 'usd': {'type': ['number', 'null']}, 'high': {'type': ['number', 'null']}, 'facts': {'type': 'array', 'items': {'type': 'object', 'required': ['key', 'status', 'value', 'level', 'evidence', 'checked_at'], 'properties': {'key': {'type': 'string'}, 'note': {'type': 'string'}, 'label': {'type': 'string'}, 'level': {'type': ['string', 'null'], 'description': 'Where the fact is recorded: offer (the plan), product or provider.'}, 'stale': {'type': 'boolean'}, 'value': {}, '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.'}, '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.'}}}}, 'applies_to': {'type': ['object', 'null'], 'description': 'get_details only: billing options the fact is limited to.'}, 'checked_at': {'type': ['string', 'null']}, 'exceptions': {'type': 'array', 'description': 'get_details only: plans with a different value.'}, 'via_exception': {'type': 'boolean', 'description': 'Present and true when a plan-specific exception replaced the general 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.'}, 'status': {'enum': ['exact', 'range', 'lower_bound', 'unknown']}, 'explanation': {'type': 'string'}, 'lower_bound': {'type': ['number', 'null']}, 'upfront_usd': {'type': ['number', 'null']}}}, 'product_name': {'type': 'string'}, 'pages_checked': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Official pages read for this provider.'}, 'provider_name': {'type': 'string'}}}}, 'total': {'type': 'integer'}}}}}
search
Find web data API plans by conditions
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.
Solo lectura Idempotente
Esquema de entrada
{'type': 'object', 'properties': {'limit': {'type': 'integer', 'default': 5, 'maximum': 5, 'minimum': 1, 'description': 'Maximum plans returned in each list (default and maximum 5).'}, 'detail': {'enum': ['summary', 'full'], 'type': 'string', 'default': 'summary', 'description': 'summary returns one source sentence per fact; full returns every recorded fact and sentence.'}, 'preferred': {'type': 'object', 'properties': {'data_regions': {'type': 'array', 'items': {'type': 'string', 'maxLength': 20, 'minLength': 2}, 'minItems': 1, 'description': 'Regions where data must be stored or processed, e.g. ["EU"]. Different from exit-IP countries.', 'uniqueItems': True}, 'billing_types': {'type': 'array', 'items': {'enum': ['monthly_subscription', 'annual_subscription', 'pay_as_you_go', 'prepaid_credits'], 'type': 'string'}, 'minItems': 1, '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.', 'uniqueItems': True}, 'search_engines': {'type': 'array', 'items': {'enum': ['google', 'bing', 'yahoo', 'yandex', 'baidu', 'duckduckgo', 'naver', 'brave'], 'type': 'string'}, 'minItems': 1, '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.", 'uniqueItems': True}, 'min_concurrency': {'type': 'integer', 'minimum': 1, 'description': 'Minimum number of concurrent requests (or browsers) the plan must allow.'}, 'search_countries': {'type': 'array', 'items': {'type': 'string', 'pattern': '^[A-Z]{2}$'}, 'minItems': 1, '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.', 'uniqueItems': True}, 'exit_ip_countries': {'type': 'array', 'items': {'type': 'string', 'pattern': '^[A-Z]{2}$'}, 'minItems': 1, '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.', 'uniqueItems': True}, '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.'}, 'search_result_types': {'type': 'array', 'items': {'enum': ['organic', 'ads', 'local_pack', 'knowledge_graph', 'people_also_ask', 'related_searches', 'shopping', 'news', 'images', 'videos', 'ai_overview'], 'type': 'string'}, 'minItems': 1, '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.', 'uniqueItems': True}, '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.'}, 'min_requests_per_minute': {'type': 'number', 'description': 'Minimum request rate the plan must allow, per minute.', 'exclusiveMinimum': 0}, 'realtime_search_required': {'type': 'boolean', 'description': 'Search results must be returned in real time (not through a queue).'}, 'target_errors_not_billed': {'type': 'boolean', 'description': 'Error responses from the target site (e.g. 404) must not be billed.'}, '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.'}}, 'description': 'Nice-to-have conditions; they do not filter, they break ties.', 'additionalProperties': False}, 'data_regions': {'type': 'array', 'items': {'type': 'string', 'maxLength': 20, 'minLength': 2}, 'minItems': 1, 'description': 'Regions where data must be stored or processed, e.g. ["EU"]. Different from exit-IP countries.', 'uniqueItems': True}, 'billing_types': {'type': 'array', 'items': {'enum': ['monthly_subscription', 'annual_subscription', 'pay_as_you_go', 'prepaid_credits'], 'type': 'string'}, 'minItems': 1, '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.', 'uniqueItems': True}, 'monthly_pages': {'type': 'object', 'properties': {'javascript': {'type': 'integer', 'minimum': 0}, 'plain_html': {'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).', 'minProperties': 1, 'additionalProperties': False}, 'product_types': {'type': 'array', 'items': {'enum': ['scraping_api', 'serp_api', 'headless_browser', 'platform'], 'type': 'string'}, 'minItems': 1, 'description': 'Limit to these product types. Default: every type that can serve the workload.', 'uniqueItems': True}, 'search_engines': {'type': 'array', 'items': {'enum': ['google', 'bing', 'yahoo', 'yandex', 'baidu', 'duckduckgo', 'naver', 'brave'], 'type': 'string'}, 'minItems': 1, '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.", 'uniqueItems': True}, 'min_concurrency': {'type': 'integer', 'minimum': 1, 'description': 'Minimum number of concurrent requests (or browsers) the plan must allow.'}, 'monthly_searches': {'type': 'integer', 'minimum': 0, 'description': 'Search requests per month (one results page each).'}, 'search_countries': {'type': 'array', 'items': {'type': 'string', 'pattern': '^[A-Z]{2}$'}, 'minItems': 1, '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.', 'uniqueItems': True}, 'exit_ip_countries': {'type': 'array', 'items': {'type': 'string', 'pattern': '^[A-Z]{2}$'}, 'minItems': 1, '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.', 'uniqueItems': True}, '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.'}, '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.'}, '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.'}, 'search_result_types': {'type': 'array', 'items': {'enum': ['organic', 'ads', 'local_pack', 'knowledge_graph', 'people_also_ask', 'related_searches', 'shopping', 'news', 'images', 'videos', 'ai_overview'], 'type': 'string'}, 'minItems': 1, '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.', 'uniqueItems': True}, '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.'}, 'min_requests_per_minute': {'type': 'number', 'description': 'Minimum request rate the plan must allow, per minute.', 'exclusiveMinimum': 0}, 'browser_seconds_per_page': {'type': 'number', '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.', 'exclusiveMinimum': 0}, 'realtime_search_required': {'type': 'boolean', 'description': 'Search results must be returned in real time (not through a queue).'}, 'target_errors_not_billed': {'type': 'boolean', 'description': 'Error responses from the target site (e.g. 404) must not be billed.'}, '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.'}, '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.'}, '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.'}}, 'additionalProperties': False}
Esquema de salida
{'type': 'object', 'required': ['as_of', 'needs_input', 'counts', 'full_matches', 'partial_matches', 'zero_result', 'assumptions', 'notes'], 'properties': {'as_of': {'type': 'string'}, 'notes': {'type': 'array', 'items': {'type': 'string'}}, 'counts': {'type': 'object', 'required': ['candidates', 'full', 'partial', 'no_match'], 'properties': {'full': {'type': 'integer'}, 'partial': {'type': 'integer'}, 'no_match': {'type': 'integer'}, 'candidates': {'type': 'integer'}}}, 'request': {'type': 'object'}, 'assumptions': {'type': 'array', 'items': {'type': 'string'}}, 'needs_input': {'type': 'array', 'items': {'type': 'object', 'required': ['field', 'reason'], 'properties': {'field': {'type': 'string'}, 'reason': {'type': 'string'}}}}, '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': {'label': {'type': 'string'}, 'closest': {'type': ['object', 'null'], 'required': ['offer_id', 'offer_name', 'provider_name', 'billing', 'monthly_cost', 'meets_all', 'fails'], 'properties': {'fails': {'type': 'string'}, 'billing': {'type': 'string'}, 'offer_id': {'type': 'string'}, 'page_url': {'type': 'string'}, '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.'}, 'offer_name': {'type': 'string'}, 'monthly_cost': {'type': 'object'}, 'provider_name': {'type': 'string'}}, '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").'}, 'unknown': {'type': 'integer'}, 'excluded': {'type': 'integer'}, 'condition': {'type': 'string'}, 'would_match_if_relaxed': {'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': {'link': {'type': 'object', 'required': ['url', 'landing', 'link_level', 'affiliate'], 'properties': {'url': {'type': 'string'}, 'note': {'type': ['string', 'null']}, 'landing': {'type': 'string'}, 'affiliate': {'type': 'object', 'required': ['status'], 'properties': {'status': {'type': 'string'}, 'program': {'type': ['string', 'null']}, 'disclosure': {'type': ['string', 'null']}}}, 'link_level': {'type': 'string'}}}, 'match': {'enum': ['FULL_MATCH', 'PARTIAL_MATCH', 'NO_MATCH']}, 'listed': {'type': 'boolean'}, 'billing': {'type': 'string'}, 'verdict': {'type': 'string', 'description': 'One sentence: the conditions met, or the ones not met or not stated, with the reason.'}, 'offer_id': {'type': 'string'}, 'page_url': {'type': 'string'}, '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.'}, 'checked_at': {'type': ['string', 'null']}, 'conditions': {'type': 'array', 'items': {'type': 'object', 'required': ['condition', 'label', 'required', 'verdict', 'reason', 'facts'], 'properties': {'facts': {'type': 'array', 'items': {'type': 'object', 'required': ['key', 'status', 'value', 'level', 'evidence', 'checked_at'], 'properties': {'key': {'type': 'string'}, 'note': {'type': 'string'}, 'label': {'type': 'string'}, 'level': {'type': ['string', 'null'], 'description': 'Where the fact is recorded: offer (the plan), product or provider.'}, 'stale': {'type': 'boolean'}, 'value': {}, '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.'}, '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.'}}}}, 'applies_to': {'type': ['object', 'null'], 'description': 'get_details only: billing options the fact is limited to.'}, 'checked_at': {'type': ['string', 'null']}, 'exceptions': {'type': 'array', 'description': 'get_details only: plans with a different value.'}, 'via_exception': {'type': 'boolean', 'description': 'Present and true when a plan-specific exception replaced the general 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.'}, 'label': {'type': 'string'}, 'reason': {'type': 'string'}, 'verdict': {'enum': ['MET', 'UNMET', 'UNKNOWN']}, 'required': {'type': 'boolean'}, 'condition': {'type': 'string'}}}}, 'offer_name': {'type': 'string'}, 'product_id': {'type': 'string'}, 'assumptions': {'type': 'array', 'items': {'type': 'string'}}, 'provider_id': {'type': 'string'}, 'monthly_cost': {'type': 'object', 'required': ['status', 'usd', 'explanation'], 'properties': {'low': {'type': ['number', 'null']}, 'usd': {'type': ['number', 'null']}, 'high': {'type': ['number', 'null']}, 'facts': {'type': 'array', 'items': {'type': 'object', 'required': ['key', 'status', 'value', 'level', 'evidence', 'checked_at'], 'properties': {'key': {'type': 'string'}, 'note': {'type': 'string'}, 'label': {'type': 'string'}, 'level': {'type': ['string', 'null'], 'description': 'Where the fact is recorded: offer (the plan), product or provider.'}, 'stale': {'type': 'boolean'}, 'value': {}, '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.'}, '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.'}}}}, 'applies_to': {'type': ['object', 'null'], 'description': 'get_details only: billing options the fact is limited to.'}, 'checked_at': {'type': ['string', 'null']}, 'exceptions': {'type': 'array', 'description': 'get_details only: plans with a different value.'}, 'via_exception': {'type': 'boolean', 'description': 'Present and true when a plan-specific exception replaced the general 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.'}, 'status': {'enum': ['exact', 'range', 'lower_bound', 'unknown']}, 'explanation': {'type': 'string'}, 'lower_bound': {'type': ['number', 'null']}, 'upfront_usd': {'type': ['number', 'null']}}}, 'product_name': {'type': 'string'}, 'preferred_met': {'type': 'integer'}, 'provider_name': {'type': 'string'}, 'billing_options': {'type': 'array', 'items': {'type': 'string'}}, 'unmet_conditions': {'type': 'array', 'items': {'type': 'string'}}, 'prices_exclude_tax': {'type': ['boolean', 'null']}, 'unknown_conditions': {'type': 'array', 'items': {'type': 'string'}}}}}, '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': {'link': {'type': 'object', 'required': ['url', 'landing', 'link_level', 'affiliate'], 'properties': {'url': {'type': 'string'}, 'note': {'type': ['string', 'null']}, 'landing': {'type': 'string'}, 'affiliate': {'type': 'object', 'required': ['status'], 'properties': {'status': {'type': 'string'}, 'program': {'type': ['string', 'null']}, 'disclosure': {'type': ['string', 'null']}}}, 'link_level': {'type': 'string'}}}, 'match': {'enum': ['FULL_MATCH', 'PARTIAL_MATCH', 'NO_MATCH']}, 'listed': {'type': 'boolean'}, 'billing': {'type': 'string'}, 'verdict': {'type': 'string', 'description': 'One sentence: the conditions met, or the ones not met or not stated, with the reason.'}, 'offer_id': {'type': 'string'}, 'page_url': {'type': 'string'}, '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.'}, 'checked_at': {'type': ['string', 'null']}, 'conditions': {'type': 'array', 'items': {'type': 'object', 'required': ['condition', 'label', 'required', 'verdict', 'reason', 'facts'], 'properties': {'facts': {'type': 'array', 'items': {'type': 'object', 'required': ['key', 'status', 'value', 'level', 'evidence', 'checked_at'], 'properties': {'key': {'type': 'string'}, 'note': {'type': 'string'}, 'label': {'type': 'string'}, 'level': {'type': ['string', 'null'], 'description': 'Where the fact is recorded: offer (the plan), product or provider.'}, 'stale': {'type': 'boolean'}, 'value': {}, '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.'}, '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.'}}}}, 'applies_to': {'type': ['object', 'null'], 'description': 'get_details only: billing options the fact is limited to.'}, 'checked_at': {'type': ['string', 'null']}, 'exceptions': {'type': 'array', 'description': 'get_details only: plans with a different value.'}, 'via_exception': {'type': 'boolean', 'description': 'Present and true when a plan-specific exception replaced the general 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.'}, 'label': {'type': 'string'}, 'reason': {'type': 'string'}, 'verdict': {'enum': ['MET', 'UNMET', 'UNKNOWN']}, 'required': {'type': 'boolean'}, 'condition': {'type': 'string'}}}}, 'offer_name': {'type': 'string'}, 'product_id': {'type': 'string'}, 'assumptions': {'type': 'array', 'items': {'type': 'string'}}, 'provider_id': {'type': 'string'}, 'monthly_cost': {'type': 'object', 'required': ['status', 'usd', 'explanation'], 'properties': {'low': {'type': ['number', 'null']}, 'usd': {'type': ['number', 'null']}, 'high': {'type': ['number', 'null']}, 'facts': {'type': 'array', 'items': {'type': 'object', 'required': ['key', 'status', 'value', 'level', 'evidence', 'checked_at'], 'properties': {'key': {'type': 'string'}, 'note': {'type': 'string'}, 'label': {'type': 'string'}, 'level': {'type': ['string', 'null'], 'description': 'Where the fact is recorded: offer (the plan), product or provider.'}, 'stale': {'type': 'boolean'}, 'value': {}, '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.'}, '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.'}}}}, 'applies_to': {'type': ['object', 'null'], 'description': 'get_details only: billing options the fact is limited to.'}, 'checked_at': {'type': ['string', 'null']}, 'exceptions': {'type': 'array', 'description': 'get_details only: plans with a different value.'}, 'via_exception': {'type': 'boolean', 'description': 'Present and true when a plan-specific exception replaced the general 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.'}, 'status': {'enum': ['exact', 'range', 'lower_bound', 'unknown']}, 'explanation': {'type': 'string'}, 'lower_bound': {'type': ['number', 'null']}, 'upfront_usd': {'type': ['number', 'null']}}}, 'product_name': {'type': 'string'}, 'preferred_met': {'type': 'integer'}, 'provider_name': {'type': 'string'}, 'billing_options': {'type': 'array', 'items': {'type': 'string'}}, 'unmet_conditions': {'type': 'array', 'items': {'type': 'string'}}, 'prices_exclude_tax': {'type': ['boolean', 'null']}, 'unknown_conditions': {'type': 'array', 'items': {'type': 'string'}}}}}}}
Añadido
relax_conditions
3 de October de 2026 a las 02:40
Añadido
cost_scenarios
3 de October de 2026 a las 02:40
Añadido
check_conditions
3 de October de 2026 a las 02:40
Añadido
get_details
3 de October de 2026 a las 02:40
Añadido
search
3 de October de 2026 a las 02:40