{"openapi": "3.1.0", "info": {"title": "Datacircle API", "version": "1.0.0", "description": "Find the best GTM APIs. We benchmark all the GTM APIs and we put the results on our website. This API lists every API on our sheet, who is best for each and every plan, free, with no key. Each plan comes with its score out of 100, and the best come first, as on the sheet. No key, no account. At most 60 calls a minute from one address: every plan is one file at https://datacircle.dev/datacircle.json.", "contact": {"name": "Datacircle", "url": "https://datacircle.dev/support"}, "license": {"name": "CC BY 4.0", "identifier": "CC-BY-4.0"}}, "servers": [{"url": "https://api.datacircle.dev/v1"}], "externalDocs": {"description": "What each key means", "url": "https://datacircle.dev/fields"}, "paths": {"/apis": {"get": {"operationId": "listApis", "summary": "List the APIs", "description": "Every API on the sheet, in its order, with its slug, how many plans and providers it has, its best plan and its pages.", "parameters": [], "responses": {"200": {"description": "List the APIs", "content": {"application/json": {"schema": {"type": "array", "items": {"$ref": "#/components/schemas/Api"}}}}}, "429": {"description": "More than 60 calls in a minute from one address.", "headers": {"Retry-After": {"description": "Seconds to wait.", "schema": {"type": "integer"}}}, "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Error"}}}}}}}, "/apis/{slug}/best": {"get": {"operationId": "getBestPlans", "summary": "Who is best for an API", "description": "The API's plans best first by score, as the sheet and its best page order them, each with its rank.", "parameters": [{"name": "slug", "in": "path", "required": true, "description": "The API's slug, the words of its sheet's address on datacircle.dev, /<slug>-api-pricing.", "schema": {"type": "string"}}, {"name": "limit", "in": "query", "description": "How many plans to give, 1 to 50. 10 when left out.", "schema": {"type": "integer", "minimum": 1, "maximum": 50, "default": 10}}], "responses": {"200": {"description": "Who is best for an API", "content": {"application/json": {"schema": {"type": "object", "properties": {"api": {"type": "string", "description": "This column names each row's API. Each API has a sheet in the GTM APIs list. Most sheets share the API's name. For the rest, we give the sheet's name after the API. \"Employee profile\", on the LinkedIn profiles sheet, returns a person's LinkedIn profile. \"Employee email\", on the Find email sheet, finds a person's work email. \"Email validation\", on the Validate email sheet, checks whether an email address takes mail. \"Employee phone\", on the Find phone sheet, finds a person's phone number. \"Company profile\", on the LinkedIn company profiles sheet, returns a company's LinkedIn page. \"Company headcount\" counts a company's staff. \"Phone validation\", on the Validate phone sheet, checks whether a phone number is valid. \"Post comments\", on the LinkedIn post comments sheet, returns the comments on a LinkedIn post. \"Post reactions\", on the LinkedIn post reactions sheet, returns the reactions to a LinkedIn post, each with the person who reacted. \"Employee lookalikes\", on the Similar people sheet, returns people similar to the person you send. \"Company lookalikes\", on the Similar companies sheet, returns companies similar to the company you send. \"Company technologies\" returns the tools a company uses. \"Company job count\" counts the jobs a company has open on LinkedIn. \"Employee posts\", on the LinkedIn person posts sheet, returns a person's LinkedIn posts. \"Company posts\", on the LinkedIn company posts sheet, returns a company's LinkedIn posts. \"Company funding\" returns a company's funding rounds. \"Company jobs\", on the Company open jobs sheet, returns the jobs a company has open. \"Employee search\", on the LinkedIn people search sheet, finds people by job title, company and place. \"Company search\", on the LinkedIn company search sheet, finds companies by industry, size and place. \"Job search\", on the LinkedIn job search sheet, finds jobs by title, company and place. \"Reverse email lookup\" finds the person behind an email address. \"Post search\", on the LinkedIn post search sheet, finds posts by keyword. \"Post details\", on the LinkedIn post details sheet, returns a post from the post's URL or ID. \"Job details\", on the LinkedIn job details sheet, returns a job from the job's URL or ID. \"Employee comments\", on the LinkedIn person comments sheet, returns the comments a person left on posts. \"Employee reactions\", on the LinkedIn person reactions sheet, returns the posts a person reacted to. \"Post reposts\", on the LinkedIn post reposts sheet, returns the people who reposted a LinkedIn post. \"Employee recommendations\", on the LinkedIn person recommendations sheet, returns the recommendations on a person's LinkedIn profile. \"Job lookalikes\", on the Similar jobs sheet, returns jobs similar to the job you send. \"Employee articles\", on the LinkedIn person articles sheet, returns a person's LinkedIn articles. \"Company enrichment\" returns a company's profile from each seller's own database. \"People search\" finds people in each seller's own database. \"Company discovery\" finds companies in each seller's own database. \"Job postings\" finds job postings in each seller's own database. \"Job posting details\" returns a job posting from the posting's ID. \"Person enrichment\" returns a person's profile. \"Leadership changes\" returns the new hires, promotions and departures in a company's senior roles. \"Company hierarchy\" returns a company's parent companies and subsidiaries. \"Web search\" returns the web pages that match a query. \"SERP\" returns a search engine's results page as data. \"News search\" returns the news articles that match a query. \"Image search\" returns the images a search engine finds for a query, in the order the engine ranks them. \"Video search\" returns the videos a search engine finds for a query, in the order the engine ranks them. \"Search autocomplete\" returns the searches a search engine suggests as you type a query. \"Web scraping\" returns a page's content from the page's URL. \"Keyword research\" returns a keyword's search volume, cost per click and competition. \"Ranked keywords\" returns the keywords a domain ranks for in Google, with the domain's position and traffic for each keyword. \"Related keywords\" returns keywords like the keyword you send, with the search volume of each. \"Backlinks\" returns the links that point to a domain. \"Domain authority\" returns a domain's authority score and the number of links to the domain. \"X profile\" returns an X (Twitter) account's profile from the account's handle. \"X posts\" returns an X account's posts. \"Instagram profile\" returns an Instagram account's profile. \"Instagram posts\" returns an Instagram account's posts. \"TikTok profile\" returns a TikTok account's profile. \"TikTok videos\" returns a TikTok account's videos. \"YouTube channel\" returns a YouTube channel's name, subscribers and description. \"YouTube channel videos\" returns a YouTube channel's videos. \"Reddit profile\" returns a Reddit account's profile. \"Reddit posts\" returns a Reddit account's posts. \"Facebook page\" returns a Facebook page's details from the page's URL. \"Facebook posts\" returns a Facebook page's posts. \"Threads profile\" returns a Threads account's profile. \"Threads posts\" returns a Threads account's posts. \"Bluesky profile\" returns a Bluesky account's profile. \"Bluesky posts\" returns a Bluesky account's posts. \"Telegram channel\" returns a Telegram channel's details. \"Telegram channel posts\" returns a Telegram channel's posts. \"Pinterest search\" returns the pins Pinterest finds for a query. \"Pinterest pin\" returns a Pinterest pin's details. \"Pinterest board pins\" returns the pins on a Pinterest board. \"Pinterest user boards\" returns a Pinterest account's boards. \"Hacker News search\" returns the Hacker News stories for a query. \"Hacker News story comments\" returns the comments on a Hacker News story. \"Twitch profile\" returns a Twitch channel's profile. \"Twitch videos\" returns a Twitch channel's videos. \"Twitch clip\" returns a Twitch clip's details. \"Kick clip\" returns a Kick clip's details. \"Snapchat profile\" returns a Snapchat account's profile. \"Truth Social profile\" returns a Truth Social account's profile. \"Truth Social posts\" returns a Truth Social account's posts. \"GitHub profile\" returns a GitHub account's profile. \"GitHub repository\" returns a GitHub repository's details. \"GitHub user repositories\" returns a GitHub account's repositories. \"Douyin profile\" returns a Douyin account's profile. \"Douyin user videos\" returns a Douyin account's videos. \"Douyin video\" returns a Douyin video's details. \"Weibo profile\" returns a Weibo account's profile. \"Weibo user posts\" returns a Weibo account's posts. \"Weibo post\" returns a Weibo post's details. \"Xiaohongshu profile\" returns a Xiaohongshu (RedNote) account's profile. \"Xiaohongshu user notes\" returns a Xiaohongshu account's notes. \"Xiaohongshu note\" returns a Xiaohongshu note's details. \"Zhihu profile\" returns a Zhihu account's profile. \"Zhihu question answers\" returns the answers to a Zhihu question. \"Kuaishou profile\" returns a Kuaishou account's profile. \"Kuaishou user videos\" returns a Kuaishou account's videos. \"Kuaishou video\" returns a Kuaishou video's details. \"Bilibili profile\" returns a Bilibili account's profile. \"Bilibili user videos\" returns a Bilibili account's videos. \"Bilibili video\" returns a Bilibili video's details. \"Facebook ads\" returns a company's ads from Meta's Ad Library. \"Google ads\" returns a company's ads from Google's Ads Transparency Center. \"LinkedIn ads\" returns a company's ads from LinkedIn's Ad Library. \"TikTok ads\" returns a company's TikTok ads. \"G2 reviews\" returns a software product's reviews on G2. \"Capterra reviews\" returns a software product's reviews on Capterra. \"Trustpilot reviews\" returns a company's reviews on Trustpilot. \"Glassdoor reviews\" returns a company's reviews on Glassdoor, written by people who work or worked there. \"App Store app\" returns an app's listing on the App Store from the app's App Store ID. \"App Store reviews\" returns an app's reviews on the App Store. \"Google Play app\" returns an app's listing on Google Play from the app's package name. \"Google Play reviews\" returns an app's reviews on Google Play. \"Amazon product\" returns a product's listing on Amazon from the product's ASIN. \"Amazon search\" returns the products Amazon finds for a query, in the order Amazon ranks them. \"Google Shopping product\" returns a product's offers on Google Shopping from the product's Google Shopping ID. \"Google Shopping search\" returns the products Google Shopping shows for a query, in the order Google Shopping ranks them. \"Walmart product\" returns the Walmart listing for a Walmart ID. \"Walmart search\" returns the products Walmart finds for a query, in the order Walmart ranks them. \"eBay product\" returns the eBay listing for a listing ID. \"eBay search\" returns the listings eBay finds for a query, in the order eBay ranks them. \"TikTok Shop product\" returns the listing at a TikTok Shop product link. \"TikTok Shop search\" returns the products TikTok Shop finds for a query, in the order TikTok Shop ranks them. \"Facebook Marketplace listing\" returns one listing from the listing's link or ID. \"Facebook Marketplace search\" returns the listings Facebook Marketplace shows for a search term in a city. \"Zillow search\" returns the homes Zillow lists in a place, in the order Zillow ranks them. \"Zillow property\" returns a home's Zillow listing from the home's Zillow URL. \"Redfin search\" returns the homes Redfin lists in a ZIP code, in the order Redfin ranks them. \"Redfin property\" returns a home's Redfin listing from the home's Redfin URL. \"Realtor.com search\" returns the homes Realtor.com lists in a place, in the order Realtor.com ranks them. \"Realtor.com property\" returns a home's Realtor.com listing from the home's Realtor.com ID. \"App Store search\" returns the apps the App Store finds for a query, in the order the App Store ranks them. \"Google Play search\" returns the apps Google Play finds for a query, in the order Google Play ranks them. \"ChatGPT answer\" returns ChatGPT's answer to a prompt. \"Perplexity answer\" returns Perplexity's answer to a prompt. \"Gemini answer\" returns Gemini's answer to a prompt. \"Bing Copilot answer\" returns Bing Copilot's answer to a prompt. \"Google AI Overview answer\" returns the AI Overview Google shows for a prompt, over its search results. \"Google AI Mode answer\" returns the answer Google's AI Mode gives a prompt. \"Business verification\" looks a company up by legal name in a state's register and returns the register's record of the company. \"Local business search\" finds businesses on a map that match your search in an area. You get each business's address, phone and website when the map lists them. \"Local business reviews\" returns a business's reviews on a map. You send the business's place ID."}, "slug": {"type": "string", "description": "The API's slug, the words of its sheet's address on datacircle.dev, /<slug>-api-pricing."}, "sheetPage": {"type": ["string", "null"], "format": "uri", "description": "The API's sheet on datacircle.dev, its plans and their prices."}, "bestPage": {"type": ["string", "null"], "format": "uri", "description": "The API's best page on datacircle.dev, which ranks its providers on our benchmark. Null where it has none."}, "total": {"type": "integer", "description": "How many plans the API has."}, "plans": {"type": "array", "items": {"$ref": "#/components/schemas/Plan"}}}}}}}, "400": {"description": "A parameter out of its range, with what it must be.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Error"}}}}, "404": {"description": "No API has this slug: the answer lists every slug.", "content": {"application/json": {"schema": {"type": "object", "properties": {"error": {"type": "string"}, "slugs": {"type": "array", "items": {"type": "string"}}}}}}}, "429": {"description": "More than 60 calls in a minute from one address.", "headers": {"Retry-After": {"description": "Seconds to wait.", "schema": {"type": "integer"}}}, "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Error"}}}}}}}, "/plans": {"get": {"operationId": "searchPlans", "summary": "Search the plans", "description": "Every plan on the sheet, or an API's, or those whose provider or plan name holds every word of query. total counts every plan found, plans holds up to limit of them from offset.", "parameters": [{"name": "api", "in": "query", "description": "The API, its name or its slug as /apis gives them. Every API when left out.", "schema": {"type": "string"}}, {"name": "query", "in": "query", "description": "Words that must all appear in the provider's or plan's name, ignoring case and accents.", "schema": {"type": "string"}}, {"name": "sort", "in": "query", "description": "score, the default: best first, as on the sheet at datacircle.dev, each API's plans together, unscored plans last. provider: A to Z. price: $ per 1,000, lowest first.", "schema": {"type": "string", "enum": ["score", "provider", "price"], "default": "score"}}, {"name": "limit", "in": "query", "description": "How many plans to give, 1 to 50. 10 when left out.", "schema": {"type": "integer", "minimum": 1, "maximum": 50, "default": 10}}, {"name": "offset", "in": "query", "description": "How many found plans to skip first. 0 when left out.", "schema": {"type": "integer", "minimum": 0, "default": 0}}], "responses": {"200": {"description": "Search the plans", "content": {"application/json": {"schema": {"type": "object", "properties": {"total": {"type": "integer", "description": "How many plans were found."}, "offset": {"type": "integer", "description": "How many found plans were skipped first."}, "sheetPage": {"type": ["string", "null"], "format": "uri", "description": "The API's sheet on datacircle.dev, its plans and their prices."}, "bestPage": {"type": ["string", "null"], "format": "uri", "description": "The API's best page on datacircle.dev, which ranks its providers on our benchmark. Null where it has none."}, "plans": {"type": "array", "items": {"$ref": "#/components/schemas/Plan"}, "description": "Up to limit plans, each with its rank on its API."}}}}}}, "400": {"description": "A parameter out of its range, with what it must be.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Error"}}}}, "429": {"description": "More than 60 calls in a minute from one address.", "headers": {"Retry-After": {"description": "Seconds to wait.", "schema": {"type": "integer"}}}, "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Error"}}}}}}}, "/providers/{slug}": {"get": {"operationId": "getProvider", "summary": "One provider on every API", "description": "The provider's plans on each API it sells, and its rank on each, as its best page ranks it.", "parameters": [{"name": "slug", "in": "path", "required": true, "description": "The provider's slug: its name in lowercase letters and digits, the rest a hyphen, as Bright Data's bright-data.", "schema": {"type": "string"}}], "responses": {"200": {"description": "One provider on every API", "content": {"application/json": {"schema": {"type": "object", "properties": {"provider": {"type": "string", "description": "Who sells the endpoint. On the sheet, the provider's name starts each row's API plan."}, "slug": {"type": "string"}, "website": {"type": "string", "format": "uri", "description": "The provider's website."}, "apis": {"type": "array", "items": {"type": "object", "properties": {"api": {"type": "string", "description": "This column names each row's API. Each API has a sheet in the GTM APIs list. Most sheets share the API's name. For the rest, we give the sheet's name after the API. \"Employee profile\", on the LinkedIn profiles sheet, returns a person's LinkedIn profile. \"Employee email\", on the Find email sheet, finds a person's work email. \"Email validation\", on the Validate email sheet, checks whether an email address takes mail. \"Employee phone\", on the Find phone sheet, finds a person's phone number. \"Company profile\", on the LinkedIn company profiles sheet, returns a company's LinkedIn page. \"Company headcount\" counts a company's staff. \"Phone validation\", on the Validate phone sheet, checks whether a phone number is valid. \"Post comments\", on the LinkedIn post comments sheet, returns the comments on a LinkedIn post. \"Post reactions\", on the LinkedIn post reactions sheet, returns the reactions to a LinkedIn post, each with the person who reacted. \"Employee lookalikes\", on the Similar people sheet, returns people similar to the person you send. \"Company lookalikes\", on the Similar companies sheet, returns companies similar to the company you send. \"Company technologies\" returns the tools a company uses. \"Company job count\" counts the jobs a company has open on LinkedIn. \"Employee posts\", on the LinkedIn person posts sheet, returns a person's LinkedIn posts. \"Company posts\", on the LinkedIn company posts sheet, returns a company's LinkedIn posts. \"Company funding\" returns a company's funding rounds. \"Company jobs\", on the Company open jobs sheet, returns the jobs a company has open. \"Employee search\", on the LinkedIn people search sheet, finds people by job title, company and place. \"Company search\", on the LinkedIn company search sheet, finds companies by industry, size and place. \"Job search\", on the LinkedIn job search sheet, finds jobs by title, company and place. \"Reverse email lookup\" finds the person behind an email address. \"Post search\", on the LinkedIn post search sheet, finds posts by keyword. \"Post details\", on the LinkedIn post details sheet, returns a post from the post's URL or ID. \"Job details\", on the LinkedIn job details sheet, returns a job from the job's URL or ID. \"Employee comments\", on the LinkedIn person comments sheet, returns the comments a person left on posts. \"Employee reactions\", on the LinkedIn person reactions sheet, returns the posts a person reacted to. \"Post reposts\", on the LinkedIn post reposts sheet, returns the people who reposted a LinkedIn post. \"Employee recommendations\", on the LinkedIn person recommendations sheet, returns the recommendations on a person's LinkedIn profile. \"Job lookalikes\", on the Similar jobs sheet, returns jobs similar to the job you send. \"Employee articles\", on the LinkedIn person articles sheet, returns a person's LinkedIn articles. \"Company enrichment\" returns a company's profile from each seller's own database. \"People search\" finds people in each seller's own database. \"Company discovery\" finds companies in each seller's own database. \"Job postings\" finds job postings in each seller's own database. \"Job posting details\" returns a job posting from the posting's ID. \"Person enrichment\" returns a person's profile. \"Leadership changes\" returns the new hires, promotions and departures in a company's senior roles. \"Company hierarchy\" returns a company's parent companies and subsidiaries. \"Web search\" returns the web pages that match a query. \"SERP\" returns a search engine's results page as data. \"News search\" returns the news articles that match a query. \"Image search\" returns the images a search engine finds for a query, in the order the engine ranks them. \"Video search\" returns the videos a search engine finds for a query, in the order the engine ranks them. \"Search autocomplete\" returns the searches a search engine suggests as you type a query. \"Web scraping\" returns a page's content from the page's URL. \"Keyword research\" returns a keyword's search volume, cost per click and competition. \"Ranked keywords\" returns the keywords a domain ranks for in Google, with the domain's position and traffic for each keyword. \"Related keywords\" returns keywords like the keyword you send, with the search volume of each. \"Backlinks\" returns the links that point to a domain. \"Domain authority\" returns a domain's authority score and the number of links to the domain. \"X profile\" returns an X (Twitter) account's profile from the account's handle. \"X posts\" returns an X account's posts. \"Instagram profile\" returns an Instagram account's profile. \"Instagram posts\" returns an Instagram account's posts. \"TikTok profile\" returns a TikTok account's profile. \"TikTok videos\" returns a TikTok account's videos. \"YouTube channel\" returns a YouTube channel's name, subscribers and description. \"YouTube channel videos\" returns a YouTube channel's videos. \"Reddit profile\" returns a Reddit account's profile. \"Reddit posts\" returns a Reddit account's posts. \"Facebook page\" returns a Facebook page's details from the page's URL. \"Facebook posts\" returns a Facebook page's posts. \"Threads profile\" returns a Threads account's profile. \"Threads posts\" returns a Threads account's posts. \"Bluesky profile\" returns a Bluesky account's profile. \"Bluesky posts\" returns a Bluesky account's posts. \"Telegram channel\" returns a Telegram channel's details. \"Telegram channel posts\" returns a Telegram channel's posts. \"Pinterest search\" returns the pins Pinterest finds for a query. \"Pinterest pin\" returns a Pinterest pin's details. \"Pinterest board pins\" returns the pins on a Pinterest board. \"Pinterest user boards\" returns a Pinterest account's boards. \"Hacker News search\" returns the Hacker News stories for a query. \"Hacker News story comments\" returns the comments on a Hacker News story. \"Twitch profile\" returns a Twitch channel's profile. \"Twitch videos\" returns a Twitch channel's videos. \"Twitch clip\" returns a Twitch clip's details. \"Kick clip\" returns a Kick clip's details. \"Snapchat profile\" returns a Snapchat account's profile. \"Truth Social profile\" returns a Truth Social account's profile. \"Truth Social posts\" returns a Truth Social account's posts. \"GitHub profile\" returns a GitHub account's profile. \"GitHub repository\" returns a GitHub repository's details. \"GitHub user repositories\" returns a GitHub account's repositories. \"Douyin profile\" returns a Douyin account's profile. \"Douyin user videos\" returns a Douyin account's videos. \"Douyin video\" returns a Douyin video's details. \"Weibo profile\" returns a Weibo account's profile. \"Weibo user posts\" returns a Weibo account's posts. \"Weibo post\" returns a Weibo post's details. \"Xiaohongshu profile\" returns a Xiaohongshu (RedNote) account's profile. \"Xiaohongshu user notes\" returns a Xiaohongshu account's notes. \"Xiaohongshu note\" returns a Xiaohongshu note's details. \"Zhihu profile\" returns a Zhihu account's profile. \"Zhihu question answers\" returns the answers to a Zhihu question. \"Kuaishou profile\" returns a Kuaishou account's profile. \"Kuaishou user videos\" returns a Kuaishou account's videos. \"Kuaishou video\" returns a Kuaishou video's details. \"Bilibili profile\" returns a Bilibili account's profile. \"Bilibili user videos\" returns a Bilibili account's videos. \"Bilibili video\" returns a Bilibili video's details. \"Facebook ads\" returns a company's ads from Meta's Ad Library. \"Google ads\" returns a company's ads from Google's Ads Transparency Center. \"LinkedIn ads\" returns a company's ads from LinkedIn's Ad Library. \"TikTok ads\" returns a company's TikTok ads. \"G2 reviews\" returns a software product's reviews on G2. \"Capterra reviews\" returns a software product's reviews on Capterra. \"Trustpilot reviews\" returns a company's reviews on Trustpilot. \"Glassdoor reviews\" returns a company's reviews on Glassdoor, written by people who work or worked there. \"App Store app\" returns an app's listing on the App Store from the app's App Store ID. \"App Store reviews\" returns an app's reviews on the App Store. \"Google Play app\" returns an app's listing on Google Play from the app's package name. \"Google Play reviews\" returns an app's reviews on Google Play. \"Amazon product\" returns a product's listing on Amazon from the product's ASIN. \"Amazon search\" returns the products Amazon finds for a query, in the order Amazon ranks them. \"Google Shopping product\" returns a product's offers on Google Shopping from the product's Google Shopping ID. \"Google Shopping search\" returns the products Google Shopping shows for a query, in the order Google Shopping ranks them. \"Walmart product\" returns the Walmart listing for a Walmart ID. \"Walmart search\" returns the products Walmart finds for a query, in the order Walmart ranks them. \"eBay product\" returns the eBay listing for a listing ID. \"eBay search\" returns the listings eBay finds for a query, in the order eBay ranks them. \"TikTok Shop product\" returns the listing at a TikTok Shop product link. \"TikTok Shop search\" returns the products TikTok Shop finds for a query, in the order TikTok Shop ranks them. \"Facebook Marketplace listing\" returns one listing from the listing's link or ID. \"Facebook Marketplace search\" returns the listings Facebook Marketplace shows for a search term in a city. \"Zillow search\" returns the homes Zillow lists in a place, in the order Zillow ranks them. \"Zillow property\" returns a home's Zillow listing from the home's Zillow URL. \"Redfin search\" returns the homes Redfin lists in a ZIP code, in the order Redfin ranks them. \"Redfin property\" returns a home's Redfin listing from the home's Redfin URL. \"Realtor.com search\" returns the homes Realtor.com lists in a place, in the order Realtor.com ranks them. \"Realtor.com property\" returns a home's Realtor.com listing from the home's Realtor.com ID. \"App Store search\" returns the apps the App Store finds for a query, in the order the App Store ranks them. \"Google Play search\" returns the apps Google Play finds for a query, in the order Google Play ranks them. \"ChatGPT answer\" returns ChatGPT's answer to a prompt. \"Perplexity answer\" returns Perplexity's answer to a prompt. \"Gemini answer\" returns Gemini's answer to a prompt. \"Bing Copilot answer\" returns Bing Copilot's answer to a prompt. \"Google AI Overview answer\" returns the AI Overview Google shows for a prompt, over its search results. \"Google AI Mode answer\" returns the answer Google's AI Mode gives a prompt. \"Business verification\" looks a company up by legal name in a state's register and returns the register's record of the company. \"Local business search\" finds businesses on a map that match your search in an area. You get each business's address, phone and website when the map lists them. \"Local business reviews\" returns a business's reviews on a map. You send the business's place ID."}, "slug": {"type": "string", "description": "The API's slug, the words of its sheet's address on datacircle.dev, /<slug>-api-pricing."}, "rank": {"type": ["integer", "null"], "minimum": 1, "description": "The provider's place among the API's providers, each by its best plan, best first, from 1, as its best page ranks them. Null where we score none of its plans."}, "sheetPage": {"type": ["string", "null"], "format": "uri", "description": "The API's sheet on datacircle.dev, its plans and their prices."}, "bestPage": {"type": ["string", "null"], "format": "uri", "description": "The API's best page on datacircle.dev, which ranks its providers on our benchmark. Null where it has none."}, "plans": {"type": "array", "items": {"$ref": "#/components/schemas/Plan"}}}}}}}}}}, "404": {"description": "No provider has this slug.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Error"}}}}, "429": {"description": "More than 60 calls in a minute from one address.", "headers": {"Retry-After": {"description": "Seconds to wait.", "schema": {"type": "integer"}}}, "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Error"}}}}}}}}, "components": {"schemas": {"Api": {"type": "object", "properties": {"api": {"type": "string", "description": "This column names each row's API. Each API has a sheet in the GTM APIs list. Most sheets share the API's name. For the rest, we give the sheet's name after the API. \"Employee profile\", on the LinkedIn profiles sheet, returns a person's LinkedIn profile. \"Employee email\", on the Find email sheet, finds a person's work email. \"Email validation\", on the Validate email sheet, checks whether an email address takes mail. \"Employee phone\", on the Find phone sheet, finds a person's phone number. \"Company profile\", on the LinkedIn company profiles sheet, returns a company's LinkedIn page. \"Company headcount\" counts a company's staff. \"Phone validation\", on the Validate phone sheet, checks whether a phone number is valid. \"Post comments\", on the LinkedIn post comments sheet, returns the comments on a LinkedIn post. \"Post reactions\", on the LinkedIn post reactions sheet, returns the reactions to a LinkedIn post, each with the person who reacted. \"Employee lookalikes\", on the Similar people sheet, returns people similar to the person you send. \"Company lookalikes\", on the Similar companies sheet, returns companies similar to the company you send. \"Company technologies\" returns the tools a company uses. \"Company job count\" counts the jobs a company has open on LinkedIn. \"Employee posts\", on the LinkedIn person posts sheet, returns a person's LinkedIn posts. \"Company posts\", on the LinkedIn company posts sheet, returns a company's LinkedIn posts. \"Company funding\" returns a company's funding rounds. \"Company jobs\", on the Company open jobs sheet, returns the jobs a company has open. \"Employee search\", on the LinkedIn people search sheet, finds people by job title, company and place. \"Company search\", on the LinkedIn company search sheet, finds companies by industry, size and place. \"Job search\", on the LinkedIn job search sheet, finds jobs by title, company and place. \"Reverse email lookup\" finds the person behind an email address. \"Post search\", on the LinkedIn post search sheet, finds posts by keyword. \"Post details\", on the LinkedIn post details sheet, returns a post from the post's URL or ID. \"Job details\", on the LinkedIn job details sheet, returns a job from the job's URL or ID. \"Employee comments\", on the LinkedIn person comments sheet, returns the comments a person left on posts. \"Employee reactions\", on the LinkedIn person reactions sheet, returns the posts a person reacted to. \"Post reposts\", on the LinkedIn post reposts sheet, returns the people who reposted a LinkedIn post. \"Employee recommendations\", on the LinkedIn person recommendations sheet, returns the recommendations on a person's LinkedIn profile. \"Job lookalikes\", on the Similar jobs sheet, returns jobs similar to the job you send. \"Employee articles\", on the LinkedIn person articles sheet, returns a person's LinkedIn articles. \"Company enrichment\" returns a company's profile from each seller's own database. \"People search\" finds people in each seller's own database. \"Company discovery\" finds companies in each seller's own database. \"Job postings\" finds job postings in each seller's own database. \"Job posting details\" returns a job posting from the posting's ID. \"Person enrichment\" returns a person's profile. \"Leadership changes\" returns the new hires, promotions and departures in a company's senior roles. \"Company hierarchy\" returns a company's parent companies and subsidiaries. \"Web search\" returns the web pages that match a query. \"SERP\" returns a search engine's results page as data. \"News search\" returns the news articles that match a query. \"Image search\" returns the images a search engine finds for a query, in the order the engine ranks them. \"Video search\" returns the videos a search engine finds for a query, in the order the engine ranks them. \"Search autocomplete\" returns the searches a search engine suggests as you type a query. \"Web scraping\" returns a page's content from the page's URL. \"Keyword research\" returns a keyword's search volume, cost per click and competition. \"Ranked keywords\" returns the keywords a domain ranks for in Google, with the domain's position and traffic for each keyword. \"Related keywords\" returns keywords like the keyword you send, with the search volume of each. \"Backlinks\" returns the links that point to a domain. \"Domain authority\" returns a domain's authority score and the number of links to the domain. \"X profile\" returns an X (Twitter) account's profile from the account's handle. \"X posts\" returns an X account's posts. \"Instagram profile\" returns an Instagram account's profile. \"Instagram posts\" returns an Instagram account's posts. \"TikTok profile\" returns a TikTok account's profile. \"TikTok videos\" returns a TikTok account's videos. \"YouTube channel\" returns a YouTube channel's name, subscribers and description. \"YouTube channel videos\" returns a YouTube channel's videos. \"Reddit profile\" returns a Reddit account's profile. \"Reddit posts\" returns a Reddit account's posts. \"Facebook page\" returns a Facebook page's details from the page's URL. \"Facebook posts\" returns a Facebook page's posts. \"Threads profile\" returns a Threads account's profile. \"Threads posts\" returns a Threads account's posts. \"Bluesky profile\" returns a Bluesky account's profile. \"Bluesky posts\" returns a Bluesky account's posts. \"Telegram channel\" returns a Telegram channel's details. \"Telegram channel posts\" returns a Telegram channel's posts. \"Pinterest search\" returns the pins Pinterest finds for a query. \"Pinterest pin\" returns a Pinterest pin's details. \"Pinterest board pins\" returns the pins on a Pinterest board. \"Pinterest user boards\" returns a Pinterest account's boards. \"Hacker News search\" returns the Hacker News stories for a query. \"Hacker News story comments\" returns the comments on a Hacker News story. \"Twitch profile\" returns a Twitch channel's profile. \"Twitch videos\" returns a Twitch channel's videos. \"Twitch clip\" returns a Twitch clip's details. \"Kick clip\" returns a Kick clip's details. \"Snapchat profile\" returns a Snapchat account's profile. \"Truth Social profile\" returns a Truth Social account's profile. \"Truth Social posts\" returns a Truth Social account's posts. \"GitHub profile\" returns a GitHub account's profile. \"GitHub repository\" returns a GitHub repository's details. \"GitHub user repositories\" returns a GitHub account's repositories. \"Douyin profile\" returns a Douyin account's profile. \"Douyin user videos\" returns a Douyin account's videos. \"Douyin video\" returns a Douyin video's details. \"Weibo profile\" returns a Weibo account's profile. \"Weibo user posts\" returns a Weibo account's posts. \"Weibo post\" returns a Weibo post's details. \"Xiaohongshu profile\" returns a Xiaohongshu (RedNote) account's profile. \"Xiaohongshu user notes\" returns a Xiaohongshu account's notes. \"Xiaohongshu note\" returns a Xiaohongshu note's details. \"Zhihu profile\" returns a Zhihu account's profile. \"Zhihu question answers\" returns the answers to a Zhihu question. \"Kuaishou profile\" returns a Kuaishou account's profile. \"Kuaishou user videos\" returns a Kuaishou account's videos. \"Kuaishou video\" returns a Kuaishou video's details. \"Bilibili profile\" returns a Bilibili account's profile. \"Bilibili user videos\" returns a Bilibili account's videos. \"Bilibili video\" returns a Bilibili video's details. \"Facebook ads\" returns a company's ads from Meta's Ad Library. \"Google ads\" returns a company's ads from Google's Ads Transparency Center. \"LinkedIn ads\" returns a company's ads from LinkedIn's Ad Library. \"TikTok ads\" returns a company's TikTok ads. \"G2 reviews\" returns a software product's reviews on G2. \"Capterra reviews\" returns a software product's reviews on Capterra. \"Trustpilot reviews\" returns a company's reviews on Trustpilot. \"Glassdoor reviews\" returns a company's reviews on Glassdoor, written by people who work or worked there. \"App Store app\" returns an app's listing on the App Store from the app's App Store ID. \"App Store reviews\" returns an app's reviews on the App Store. \"Google Play app\" returns an app's listing on Google Play from the app's package name. \"Google Play reviews\" returns an app's reviews on Google Play. \"Amazon product\" returns a product's listing on Amazon from the product's ASIN. \"Amazon search\" returns the products Amazon finds for a query, in the order Amazon ranks them. \"Google Shopping product\" returns a product's offers on Google Shopping from the product's Google Shopping ID. \"Google Shopping search\" returns the products Google Shopping shows for a query, in the order Google Shopping ranks them. \"Walmart product\" returns the Walmart listing for a Walmart ID. \"Walmart search\" returns the products Walmart finds for a query, in the order Walmart ranks them. \"eBay product\" returns the eBay listing for a listing ID. \"eBay search\" returns the listings eBay finds for a query, in the order eBay ranks them. \"TikTok Shop product\" returns the listing at a TikTok Shop product link. \"TikTok Shop search\" returns the products TikTok Shop finds for a query, in the order TikTok Shop ranks them. \"Facebook Marketplace listing\" returns one listing from the listing's link or ID. \"Facebook Marketplace search\" returns the listings Facebook Marketplace shows for a search term in a city. \"Zillow search\" returns the homes Zillow lists in a place, in the order Zillow ranks them. \"Zillow property\" returns a home's Zillow listing from the home's Zillow URL. \"Redfin search\" returns the homes Redfin lists in a ZIP code, in the order Redfin ranks them. \"Redfin property\" returns a home's Redfin listing from the home's Redfin URL. \"Realtor.com search\" returns the homes Realtor.com lists in a place, in the order Realtor.com ranks them. \"Realtor.com property\" returns a home's Realtor.com listing from the home's Realtor.com ID. \"App Store search\" returns the apps the App Store finds for a query, in the order the App Store ranks them. \"Google Play search\" returns the apps Google Play finds for a query, in the order Google Play ranks them. \"ChatGPT answer\" returns ChatGPT's answer to a prompt. \"Perplexity answer\" returns Perplexity's answer to a prompt. \"Gemini answer\" returns Gemini's answer to a prompt. \"Bing Copilot answer\" returns Bing Copilot's answer to a prompt. \"Google AI Overview answer\" returns the AI Overview Google shows for a prompt, over its search results. \"Google AI Mode answer\" returns the answer Google's AI Mode gives a prompt. \"Business verification\" looks a company up by legal name in a state's register and returns the register's record of the company. \"Local business search\" finds businesses on a map that match your search in an area. You get each business's address, phone and website when the map lists them. \"Local business reviews\" returns a business's reviews on a map. You send the business's place ID."}, "slug": {"type": "string", "description": "The API's slug, the words of its sheet's address on datacircle.dev, /<slug>-api-pricing."}, "plans": {"type": "integer", "description": "How many plans the API has on the sheet."}, "providers": {"type": "integer", "description": "How many providers sell it."}, "sheetPage": {"type": ["string", "null"], "format": "uri", "description": "The API's sheet on datacircle.dev, its plans and their prices."}, "bestPage": {"type": ["string", "null"], "format": "uri", "description": "The API's best page on datacircle.dev, which ranks its providers on our benchmark. Null where it has none."}, "best": {"type": ["object", "null"], "description": "The plan the sheet ranks first, null where we score none of the API's plans.", "properties": {"provider": {"description": "Who sells the endpoint. On the sheet, the provider's name starts each row's API plan."}, "plan": {"description": "The plan's name on the provider's pricing page."}, "score": {"description": "We score each plan out of 100 on five parts: price, accuracy, cost to get started, bundled calls and performance. We score accuracy and performance from our benchmark of the provider's call. Until we benchmark the call, the plan's accuracy, performance and Overall scores are N/A. The accuracy, performance and Overall scores are also N/A on a plan that lacks a check or feature the benchmarked plan has. The accuracy, performance and Overall scores are also N/A when we can't tell which benchmark score fits the plan. A plan whose accuracy score is 0 has an Overall score of 0, whatever the plan's other scores. Each API's sheet shows what we measured on each benchmarked plan, in the columns after the price. We rank a plan's price per 1,000 against the other scored plans of the same API. We score cost to get started and bundled calls on the plan alone. We give N/A to yearly plans, contact us plans and plans over $500 to start. We also give N/A to plans bought on a marketplace and plans that need your own LinkedIn or X account. We score a free plan only when the provider has no paid plan for that call. The free plan must never end. Any limit on the plan's calls must reset each day or sooner. Other free plans get N/A. A plan we don't score gets no score for any of the five parts, even when we benchmarked the call. Click Score in the sheet's bar to set the five weights. The JSON, datacircle.json and datacircle.csv give each plan's score at the default weights. A plan with N/A has an empty score in the JSON, datacircle.json and datacircle.csv. The sheet's CSV has no scores."}, "perThousand": {"description": "The price of 1,000 items on this plan, in dollars. The price is 0 on a free plan. On a plan that charges by the call, each call asks for one item. We add the Start fee to each item's price. On a plan that charges by the page, we divide a page's price by the most results one page holds. Then we multiply by 1,000. We leave the price blank when the provider doesn't say how many results a page holds. On a search that charges by the page, we price the first page of each search, whatever the page holds. On a flat fee, we take the most items the plan allows in one month. We multiply those items by the months the fee covers. We divide the fee by that total. Then we multiply by 1,000. We leave the price blank when the provider doesn't say how many items the plan allows. A plan with no end date and only limits per second, minute, hour or day has no cap on items. A flat fee with no cap on items shows \"no limit\" on the sheet. We leave the price blank in the CSV and JSON. On a waterfall's paid plan, we show the average cost of a call. We take the price of each provider listed under Waterfall. We weight each price by how often a call reaches that provider. We leave the price blank when a provider a call can reach has no hit rate or page size. On a plan with a Monthly fee, we first subtract one month of the fee from the plan's units. Then we divide the plan's price by the number of items the remaining units buy. Then we multiply by 1,000. We leave the price blank when the Monthly fee uses up all the plan's units. Some plans limit calls per second, minute, hour, day or month. We divide the price by the items the limit allows, if that is fewer than the items you pay for. Then we multiply by 1,000. We leave the price blank on a top-up, because a top-up buys no fixed number of items. We also leave the price blank when the provider's website doesn't say what an item costs on this plan. We leave the price blank, too, when the website doesn't say how many items the price buys."}}}}}, "Plan": {"type": "object", "description": "One plan of one API: a row of the sheet's JSON download, every key, with its page and its rank. What each key means: https://datacircle.dev/fields", "properties": {"provider": {"description": "Who sells the endpoint. On the sheet, the provider's name starts each row's API plan."}, "api": {"description": "This column names each row's API. Each API has a sheet in the GTM APIs list. Most sheets share the API's name. For the rest, we give the sheet's name after the API. \"Employee profile\", on the LinkedIn profiles sheet, returns a person's LinkedIn profile. \"Employee email\", on the Find email sheet, finds a person's work email. \"Email validation\", on the Validate email sheet, checks whether an email address takes mail. \"Employee phone\", on the Find phone sheet, finds a person's phone number. \"Company profile\", on the LinkedIn company profiles sheet, returns a company's LinkedIn page. \"Company headcount\" counts a company's staff. \"Phone validation\", on the Validate phone sheet, checks whether a phone number is valid. \"Post comments\", on the LinkedIn post comments sheet, returns the comments on a LinkedIn post. \"Post reactions\", on the LinkedIn post reactions sheet, returns the reactions to a LinkedIn post, each with the person who reacted. \"Employee lookalikes\", on the Similar people sheet, returns people similar to the person you send. \"Company lookalikes\", on the Similar companies sheet, returns companies similar to the company you send. \"Company technologies\" returns the tools a company uses. \"Company job count\" counts the jobs a company has open on LinkedIn. \"Employee posts\", on the LinkedIn person posts sheet, returns a person's LinkedIn posts. \"Company posts\", on the LinkedIn company posts sheet, returns a company's LinkedIn posts. \"Company funding\" returns a company's funding rounds. \"Company jobs\", on the Company open jobs sheet, returns the jobs a company has open. \"Employee search\", on the LinkedIn people search sheet, finds people by job title, company and place. \"Company search\", on the LinkedIn company search sheet, finds companies by industry, size and place. \"Job search\", on the LinkedIn job search sheet, finds jobs by title, company and place. \"Reverse email lookup\" finds the person behind an email address. \"Post search\", on the LinkedIn post search sheet, finds posts by keyword. \"Post details\", on the LinkedIn post details sheet, returns a post from the post's URL or ID. \"Job details\", on the LinkedIn job details sheet, returns a job from the job's URL or ID. \"Employee comments\", on the LinkedIn person comments sheet, returns the comments a person left on posts. \"Employee reactions\", on the LinkedIn person reactions sheet, returns the posts a person reacted to. \"Post reposts\", on the LinkedIn post reposts sheet, returns the people who reposted a LinkedIn post. \"Employee recommendations\", on the LinkedIn person recommendations sheet, returns the recommendations on a person's LinkedIn profile. \"Job lookalikes\", on the Similar jobs sheet, returns jobs similar to the job you send. \"Employee articles\", on the LinkedIn person articles sheet, returns a person's LinkedIn articles. \"Company enrichment\" returns a company's profile from each seller's own database. \"People search\" finds people in each seller's own database. \"Company discovery\" finds companies in each seller's own database. \"Job postings\" finds job postings in each seller's own database. \"Job posting details\" returns a job posting from the posting's ID. \"Person enrichment\" returns a person's profile. \"Leadership changes\" returns the new hires, promotions and departures in a company's senior roles. \"Company hierarchy\" returns a company's parent companies and subsidiaries. \"Web search\" returns the web pages that match a query. \"SERP\" returns a search engine's results page as data. \"News search\" returns the news articles that match a query. \"Image search\" returns the images a search engine finds for a query, in the order the engine ranks them. \"Video search\" returns the videos a search engine finds for a query, in the order the engine ranks them. \"Search autocomplete\" returns the searches a search engine suggests as you type a query. \"Web scraping\" returns a page's content from the page's URL. \"Keyword research\" returns a keyword's search volume, cost per click and competition. \"Ranked keywords\" returns the keywords a domain ranks for in Google, with the domain's position and traffic for each keyword. \"Related keywords\" returns keywords like the keyword you send, with the search volume of each. \"Backlinks\" returns the links that point to a domain. \"Domain authority\" returns a domain's authority score and the number of links to the domain. \"X profile\" returns an X (Twitter) account's profile from the account's handle. \"X posts\" returns an X account's posts. \"Instagram profile\" returns an Instagram account's profile. \"Instagram posts\" returns an Instagram account's posts. \"TikTok profile\" returns a TikTok account's profile. \"TikTok videos\" returns a TikTok account's videos. \"YouTube channel\" returns a YouTube channel's name, subscribers and description. \"YouTube channel videos\" returns a YouTube channel's videos. \"Reddit profile\" returns a Reddit account's profile. \"Reddit posts\" returns a Reddit account's posts. \"Facebook page\" returns a Facebook page's details from the page's URL. \"Facebook posts\" returns a Facebook page's posts. \"Threads profile\" returns a Threads account's profile. \"Threads posts\" returns a Threads account's posts. \"Bluesky profile\" returns a Bluesky account's profile. \"Bluesky posts\" returns a Bluesky account's posts. \"Telegram channel\" returns a Telegram channel's details. \"Telegram channel posts\" returns a Telegram channel's posts. \"Pinterest search\" returns the pins Pinterest finds for a query. \"Pinterest pin\" returns a Pinterest pin's details. \"Pinterest board pins\" returns the pins on a Pinterest board. \"Pinterest user boards\" returns a Pinterest account's boards. \"Hacker News search\" returns the Hacker News stories for a query. \"Hacker News story comments\" returns the comments on a Hacker News story. \"Twitch profile\" returns a Twitch channel's profile. \"Twitch videos\" returns a Twitch channel's videos. \"Twitch clip\" returns a Twitch clip's details. \"Kick clip\" returns a Kick clip's details. \"Snapchat profile\" returns a Snapchat account's profile. \"Truth Social profile\" returns a Truth Social account's profile. \"Truth Social posts\" returns a Truth Social account's posts. \"GitHub profile\" returns a GitHub account's profile. \"GitHub repository\" returns a GitHub repository's details. \"GitHub user repositories\" returns a GitHub account's repositories. \"Douyin profile\" returns a Douyin account's profile. \"Douyin user videos\" returns a Douyin account's videos. \"Douyin video\" returns a Douyin video's details. \"Weibo profile\" returns a Weibo account's profile. \"Weibo user posts\" returns a Weibo account's posts. \"Weibo post\" returns a Weibo post's details. \"Xiaohongshu profile\" returns a Xiaohongshu (RedNote) account's profile. \"Xiaohongshu user notes\" returns a Xiaohongshu account's notes. \"Xiaohongshu note\" returns a Xiaohongshu note's details. \"Zhihu profile\" returns a Zhihu account's profile. \"Zhihu question answers\" returns the answers to a Zhihu question. \"Kuaishou profile\" returns a Kuaishou account's profile. \"Kuaishou user videos\" returns a Kuaishou account's videos. \"Kuaishou video\" returns a Kuaishou video's details. \"Bilibili profile\" returns a Bilibili account's profile. \"Bilibili user videos\" returns a Bilibili account's videos. \"Bilibili video\" returns a Bilibili video's details. \"Facebook ads\" returns a company's ads from Meta's Ad Library. \"Google ads\" returns a company's ads from Google's Ads Transparency Center. \"LinkedIn ads\" returns a company's ads from LinkedIn's Ad Library. \"TikTok ads\" returns a company's TikTok ads. \"G2 reviews\" returns a software product's reviews on G2. \"Capterra reviews\" returns a software product's reviews on Capterra. \"Trustpilot reviews\" returns a company's reviews on Trustpilot. \"Glassdoor reviews\" returns a company's reviews on Glassdoor, written by people who work or worked there. \"App Store app\" returns an app's listing on the App Store from the app's App Store ID. \"App Store reviews\" returns an app's reviews on the App Store. \"Google Play app\" returns an app's listing on Google Play from the app's package name. \"Google Play reviews\" returns an app's reviews on Google Play. \"Amazon product\" returns a product's listing on Amazon from the product's ASIN. \"Amazon search\" returns the products Amazon finds for a query, in the order Amazon ranks them. \"Google Shopping product\" returns a product's offers on Google Shopping from the product's Google Shopping ID. \"Google Shopping search\" returns the products Google Shopping shows for a query, in the order Google Shopping ranks them. \"Walmart product\" returns the Walmart listing for a Walmart ID. \"Walmart search\" returns the products Walmart finds for a query, in the order Walmart ranks them. \"eBay product\" returns the eBay listing for a listing ID. \"eBay search\" returns the listings eBay finds for a query, in the order eBay ranks them. \"TikTok Shop product\" returns the listing at a TikTok Shop product link. \"TikTok Shop search\" returns the products TikTok Shop finds for a query, in the order TikTok Shop ranks them. \"Facebook Marketplace listing\" returns one listing from the listing's link or ID. \"Facebook Marketplace search\" returns the listings Facebook Marketplace shows for a search term in a city. \"Zillow search\" returns the homes Zillow lists in a place, in the order Zillow ranks them. \"Zillow property\" returns a home's Zillow listing from the home's Zillow URL. \"Redfin search\" returns the homes Redfin lists in a ZIP code, in the order Redfin ranks them. \"Redfin property\" returns a home's Redfin listing from the home's Redfin URL. \"Realtor.com search\" returns the homes Realtor.com lists in a place, in the order Realtor.com ranks them. \"Realtor.com property\" returns a home's Realtor.com listing from the home's Realtor.com ID. \"App Store search\" returns the apps the App Store finds for a query, in the order the App Store ranks them. \"Google Play search\" returns the apps Google Play finds for a query, in the order Google Play ranks them. \"ChatGPT answer\" returns ChatGPT's answer to a prompt. \"Perplexity answer\" returns Perplexity's answer to a prompt. \"Gemini answer\" returns Gemini's answer to a prompt. \"Bing Copilot answer\" returns Bing Copilot's answer to a prompt. \"Google AI Overview answer\" returns the AI Overview Google shows for a prompt, over its search results. \"Google AI Mode answer\" returns the answer Google's AI Mode gives a prompt. \"Business verification\" looks a company up by legal name in a state's register and returns the register's record of the company. \"Local business search\" finds businesses on a map that match your search in an area. You get each business's address, phone and website when the map lists them. \"Local business reviews\" returns a business's reviews on a map. You send the business's place ID."}, "website": {"description": "The provider's website."}, "pricingPage": {"description": "The page where you buy the plan: the provider's pricing page, or the plan's page on another site, like RapidAPI. Some providers have no pricing page, like a job board with a free public API. For those, this is the page of API docs for the plan. The button on the plan's page links to this page."}, "pitch": {"description": "How the provider sells the row's call, quoted from the call's own page. When one page covers all the provider's calls, we quote the provider's own pitch. \"[...]\" marks a cut."}, "strengths": {"description": "The plan's strengths, which we work out from the plan's row. Each strength is a band that many plans of the same API are in. Strengths differ by API. We list and explain them under Strengths on datacircle.dev/fields. Only LinkedIn profiles and Find email have strengths so far. Blank (`[]` in the JSON) when the plan has none, and then the plan's page leaves Strengths out. Under Filters, you see only the rows with every strength you tick."}, "aggregators": {"description": "Aggregators like treg and Deepline sell the row's call. With one aggregator account, you reach many providers. Each cell gives what a call costs through the aggregator with your own provider key. The cell also gives what 1,000 items cost when you pay the aggregator and have no account at the provider: \"treg: your key free, paid $1.50\". We add \"per 1,000 results\" when the aggregator charges per result found. We say \"paid, no fixed price\" when the aggregator publishes no price. When an aggregator charges by the page, we divide a page's price by the most results one page holds. Then we multiply by 1,000. We write \"paid, page size not stated\" when the aggregator doesn't say how many results a page holds. Some aggregators list the call but don't say whether you pay them or use your own key. For those, we write \"listed, how it's sold not stated\". An aggregator may sell one of the provider's calls without saying which. Then the cell ends with \"this call or another\", the provider's name and \"call\": \"this call or another Pubrio call\". A cell says \"none\" when no aggregator we checked for the row's API sells the call. A blank cell (`null` in the JSON) means we haven't checked any aggregator for that API. We skip calls an aggregator doesn't list. In the JSON, each aggregator has these keys. `aggregator` is the aggregator's name. `url` is the aggregator's page for the call. `ownKey` is what a call costs there with your own key, or null when you can't use yours. `paid` is true when you can pay the aggregator. `paid` and `ownKey` are both null when the aggregator doesn't say how the call is sold. `callStated` is false when the aggregator doesn't say whether the call is this one or another of the provider's. `usd` is the aggregator's price in dollars for one `per`, or null when the aggregator sets no price. `perThousand` is the aggregator's price in dollars for 1,000. `per` is \"call\", \"result\" or \"page\". `resultsPerPage` is the most results a page holds, or null."}, "waterfall": {"description": "Some routers, like treg's, try one provider after another until one finds the answer. On a router's call, the Waterfall column lists each provider the router tries, in order. After each provider, we give in brackets the name the router uses for that provider's call. Then we give the provider's price per 1,000 on this plan and how often the provider finds the answer. For Validate email and Validate phone, we give how often the provider checks what you send. We count a check whether the provider's verdict is right or wrong. We add \"misses billed\" when the provider charges for a miss. For a provider that charges by the page, we divide a page's price by the most results one page holds. Then we multiply by 1,000. We write \"page size not stated\" when the provider doesn't say how many results a page holds. The router publishes how often each provider finds an answer over all the router's calls. We assume each provider finds answers at the published rate. We assume this even on calls where the earlier providers found nothing. We leave the Waterfall column blank on calls with a single provider. In the JSON, each provider in the Waterfall is a step with these keys. `provider` is the provider's name. `call` is the provider's call, which you can also make alone. `perThousand`, `per` and `resultsPerPage` mean the same as the keys of the same names on a plan's row. `hitRate` is from 0 to 1, or null when the router publishes no rate. `missesBilled` is true when the provider charges for a miss."}, "freshness": {"description": "How old the answer may be, as the provider's pages say. \"live\": the provider gets the data at the moment you call. The provider reads sources like LinkedIn, company websites, job boards, search results, keyword data or a page you send. Or the provider finds or checks an email or phone number at the moment you call. Some providers keep each answer for an hour or less. They give the same answer to anyone who asks the same question in that time. We call a plan that keeps answers for an hour or less \"live\" too. Renidly, for example, keeps each answer for 20 minutes. \"1 month\" or \"30 days\": the provider answers from a copy and refreshes the copy as often as the value says. \"as of 2025-11-13\": from a copy last refreshed that day. \"stored\": from a copy with no date on the provider's pages. Some email or phone checks never ask the mail server or the carrier. They read only the format, the domain's DNS and the provider's own lists. We mark those checks \"stored\" too. Freshness is blank (`null` in the JSON) when the provider's pages don't say how fresh the answer is. Freshness is also blank when the pages don't agree with each other. Plans that answer from a copy are on the same sheet as the plans that read live. When the provider's pages give some fields a different freshness from the rest, we list those fields in brackets. `fieldFreshness` gives the freshness of each field in brackets. Bright Data's LinkedIn profile is \"live (current title, jobs, schools: as of 2025-11-13)\". LinkedIn put current title, jobs and schools behind a login wall. Bright Data serves those three fields from a copy."}, "fieldFreshness": {"description": "How old the answer may be, as the provider's pages say. \"live\": the provider gets the data at the moment you call. The provider reads sources like LinkedIn, company websites, job boards, search results, keyword data or a page you send. Or the provider finds or checks an email or phone number at the moment you call. Some providers keep each answer for an hour or less. They give the same answer to anyone who asks the same question in that time. We call a plan that keeps answers for an hour or less \"live\" too. Renidly, for example, keeps each answer for 20 minutes. \"1 month\" or \"30 days\": the provider answers from a copy and refreshes the copy as often as the value says. \"as of 2025-11-13\": from a copy last refreshed that day. \"stored\": from a copy with no date on the provider's pages. Some email or phone checks never ask the mail server or the carrier. They read only the format, the domain's DNS and the provider's own lists. We mark those checks \"stored\" too. Freshness is blank (`null` in the JSON) when the provider's pages don't say how fresh the answer is. Freshness is also blank when the pages don't agree with each other. Plans that answer from a copy are on the same sheet as the plans that read live. When the provider's pages give some fields a different freshness from the rest, we list those fields in brackets. `fieldFreshness` gives the freshness of each field in brackets. Bright Data's LinkedIn profile is \"live (current title, jobs, schools: as of 2025-11-13)\". LinkedIn put current title, jobs and schools behind a login wall. Bright Data serves those three fields from a copy."}, "history": {"description": "How far back the answers reach, on an API whose answers are dated. A company's funding rounds and open jobs are dated. \"since 2016\": back to 2016. \"open only\": only what is open now. \"the last 7 days\": a window that ends today. \"no limit\": every one ever. \", closed only\" after a value: the closed ones alone. Blank (`null` in the JSON) when the provider's pages don't say, or when the answers aren't dated."}, "countries": {"description": "On Validate phone, the countries whose numbers the call checks, like \"United States\". On Business verification, Company enrichment, Company discovery, Company hierarchy, Company headcount and Similar companies, the countries of the companies found. On People search, Person enrichment and Find email, the countries whose people the call finds. We take them from the provider's pages. \"Worldwide\": the call covers any country. \"Worldwide\" also means the call covers over 100 countries. Blank (`null` in the JSON) until we read the countries on the provider's pages. Also blank when the provider's pages don't list the countries. Blank on every other API."}, "fullFamilyTree": {"description": "On Company hierarchy, this column says whether one call gives the whole family tree. The whole tree runs from the top parent down each branch. \"yes\" (`true` in the JSON): one call gives the whole tree, counting every page of results the call returns. \"no\" (`false`): one call gives part of the tree, like the parents or one level of subsidiaries. You call again for each company to get the rest. The column is blank (`null` in the JSON) until we read the provider's website. The column is also blank when the provider's website doesn't say. Always blank on every other API."}, "checks": {"description": "This column lists the checks each call makes, as the provider's pages describe them. You find this column on the Validate email and Validate phone sheets. On Find email, the column lists the checks a finder makes on an address before giving you the address. A finder that asks the mail server takes longer than a finder that doesn't. On an email, \"format\": the address is well formed. \"mail servers\": the domain has servers that take mail. \"disposable domains\": the call spots a domain on a list of throwaway domains. \"role addresses\": the call spots a shared address, like sales@. \"mailbox\": the call checks with the mail server that the mailbox exists. On a number, \"numbering plan\": the number fits the rules of the number's country. \"carrier\": the call finds the carrier the number is with today. If the owner moved the number to a new carrier, you see the new carrier. \"line in service\": the call checks with the network that the line is live. \"messaging apps\": the call checks with a messaging app, like WhatsApp, that the number has an account there. A call without \"mailbox\" doesn't check the mailbox. Such a call can pass an address that bounces. The column is blank (`null` in the JSON) until we read the provider's pages. Also blank when the provider's pages don't say. Always blank on every other API."}, "searchesIn": {"description": "This column says where the call looks for posts. We read where the call looks on the provider's pages. You find this column on the LinkedIn post search sheet. \"LinkedIn's search\": the call runs LinkedIn's own search. \"Google's index\": the call searches Google for LinkedIn posts. Google sets how many posts the call can find. New posts show up only after Google indexes them. \"a search engine's index\": the call searches another search engine for LinkedIn posts. We also mark a call \"a search engine's index\" when the provider's pages don't name the search engine. \"the provider's own database\": the call searches a copy of LinkedIn posts the provider keeps. We leave the column blank (`null` in the JSON) when the provider's pages don't say. We leave the column blank for every other API."}, "keep": {"description": "How long the provider's terms let you keep the API's answers. \"no limit\" when the terms set none. \"no API terms\" when the provider has no API terms."}, "use": {"description": "What the provider's terms let you use the API's answers for. Also what the terms ask in return, like a link back or a credit. \"any\" when the terms limit nothing and ask nothing. \"no API terms\" when the provider has no API terms."}, "plan": {"description": "The plan's name on the provider's pricing page."}, "who": {"description": "Who the provider offers the plan to: \"anyone\", or the condition the provider's pages set, like \"anyone with a work email\" or \"on approval of an application\"."}, "auth": {"description": "\"none\" when the call needs no API key and no account with the provider on this plan. For example: a public job board, or a call you pay for each time from a wallet. Null when the call needs an API key or an account."}, "billing": {"description": "How you pay. \"free\": the plan costs nothing. \"on-demand\": you pay for what you use, with nothing to buy first. \"one-time\": a pack or a top-up you pay for first, then use. \"contact\": no public price, so you ask the provider for one. A subscription: \"monthly\", \"quarterly\" (every three months), \"half-yearly\" (every six months) or \"yearly\". The sheet shows \"one-time\" as \"pay first\" and \"on-demand\" as \"pay as you go\"."}, "charged": {"description": "On a pay-as-you-go plan (\"on-demand\"), when the provider takes the money. \"per call\": you pay for each call, from a wallet. AnyAPI, Scrappa and Tomba take USDC by x402 or MPP. \"monthly\": the provider bills you each month for what you used, like Crawlbase and the RapidAPI plans. \"at a threshold\": the provider bills you each time you owe a set amount, like API Direct at $10. Blank (`null` in the JSON) on every other plan. The sheet shows Charged in the Pay column."}, "topUp": {"description": "true on a top-up. A top-up is a plan you pay for first (\"one-time\"). You can top up any amount at or above the provider's minimum. The Pay column shows the minimum. All the money you top up pays for calls. AnyAPI's top-up from $10 works this way. false on a pack with a fixed size. Blank (`null` in the JSON) on every other plan. The CSV says \"yes\" on a top-up."}, "pay": {"description": "The plan's price, in the plan's `currency`. On a subscription, the price covers the months in `termMonths`. In the sheet's CSV, we write the months after the price. Some examples: \"$39.00/month\", \"€99.00/month\" on a plan in euros, or \"$468.00/15 months\" on gtm-api.com's yearly plan. A pack's Pay is the pack's price. A top-up's Pay is the smallest amount you can top up. On a top-up with no minimum from the provider, Pay is blank (`null` in the JSON). A free plan's Pay is $0.00. On a usage tier, Pay is what you pay each month for your calls below that tier. Each of those calls costs the price of the tier the call is in. Some tiers have a minimum. If your calls below the tier cost less than the minimum, you pay the minimum. When a usage tier sits on a subscription, you also pay the plan's price. Crawlbase has a tier for the next 10M requests. On that tier, Pay is $583: what you pay each month for your calls below the tier. On Mailgun's Foundation plan, you pay $95 a month for up to 5,000 validations. The $95 is the $35 plan plus $60 for the validations. On a pay-as-you-go plan, the sheet's Pay column shows Charged."}, "currency": {"description": "`currency` is the currency of the plan's Pay, as an ISO 4217 code: \"USD\" for dollars, \"EUR\" for euros. `exchangeRate` is the dollars one unit of the currency buys: 1 for dollars."}, "exchangeRate": {"description": "`currency` is the currency of the plan's Pay, as an ISO 4217 code: \"USD\" for dollars, \"EUR\" for euros. `exchangeRate` is the dollars one unit of the currency buys: 1 for dollars."}, "termMonths": {"description": "On a subscription: how many months the plan's Pay buys. 1, 3, 6 or 12 on a monthly, quarterly, half-yearly or yearly plan. Some providers give more months for the same price: gtm-api.com's yearly plans run 15 months for the price of 12. Blank (`null`) on every other plan."}, "score": {"description": "We score each plan out of 100 on five parts: price, accuracy, cost to get started, bundled calls and performance. We score accuracy and performance from our benchmark of the provider's call. Until we benchmark the call, the plan's accuracy, performance and Overall scores are N/A. The accuracy, performance and Overall scores are also N/A on a plan that lacks a check or feature the benchmarked plan has. The accuracy, performance and Overall scores are also N/A when we can't tell which benchmark score fits the plan. A plan whose accuracy score is 0 has an Overall score of 0, whatever the plan's other scores. Each API's sheet shows what we measured on each benchmarked plan, in the columns after the price. We rank a plan's price per 1,000 against the other scored plans of the same API. We score cost to get started and bundled calls on the plan alone. We give N/A to yearly plans, contact us plans and plans over $500 to start. We also give N/A to plans bought on a marketplace and plans that need your own LinkedIn or X account. We score a free plan only when the provider has no paid plan for that call. The free plan must never end. Any limit on the plan's calls must reset each day or sooner. Other free plans get N/A. A plan we don't score gets no score for any of the five parts, even when we benchmarked the call. Click Score in the sheet's bar to set the five weights. The JSON, datacircle.json and datacircle.csv give each plan's score at the default weights. A plan with N/A has an empty score in the JSON, datacircle.json and datacircle.csv. The sheet's CSV has no scores."}, "from": {"description": "On a usage tier, like Crawlbase's pay as you go, `from` is the monthly item count where the tier's price starts. `from` counts calls or results, as `per` says. `graduated` is true when this tier's price covers only the items from `from` up. The items below `from` then cost the lower tiers' prices. `graduated` is false when every item of the month costs this tier's price. Both are null on every other plan."}, "graduated": {"description": "On a usage tier, like Crawlbase's pay as you go, `from` is the monthly item count where the tier's price starts. `from` counts calls or results, as `per` says. `graduated` is true when this tier's price covers only the items from `from` up. The items below `from` then cost the lower tiers' prices. `graduated` is false when every item of the month costs this tier's price. Both are null on every other plan."}, "units": {"description": "What the plan gives for the price, counted in `unit`. On a usage tier, where the tier starts: \"from the 51st call a month\"."}, "unit": {"description": "The unit the plan charges by. A \"credit\" is the provider's own credit. A \"request\" is one call. A \"result\" is one item a call returns. \"usd\" is a prepaid balance in dollars. An \"execution hour\" is an hour the provider's servers run your job. A \"linked account\" is a LinkedIn account you connect. A \"seat\" is one user. A \"token\" is the provider's count of the text a call reads and writes. Some providers count run time in tokens too. A \"prompt\" is a question the provider asks AI engines for you, every day or on another schedule. A \"keyword\" is a search term the provider tracks for you. It searches the term every day or every week, as the plan says. We show the plan's unit. If the plan names none, we show the provider's `unit`."}, "renews": {"description": "When `units` come back: \"day\", \"month\", \"quarter\", \"half-year\", \"year\", or \"never\". On a monthly plan whose units come back each day, you pay for 30 days of them. A yearly, half-yearly or quarterly plan has \"month\" when the units come a month at a time. The plan has \"year\", \"half-year\" or \"quarter\" when you get all the units at once."}, "expires": {"description": "When the units you don't use lapse, in the provider's words: \"never\", \"365 days\", \"at renewal: unused credits do not carry over\". Blank when the provider's pages don't say."}, "ends": {"description": "The plan's last day, as the provider gives the date: 2026-12-02 for Explorium. We don't score a plan that ends. We don't link to the provider's site. The day after the last day, we take the plan off the sheet. Blank for plans with no last day."}, "calls": {"description": "The number of items you get for the plan's price, counted in `per`. On a plan that charges by the page, `calls` and `monthlyCap` count pages. `calls` is the number of items the plan's units pay for: \"100 calls, once\" for a free trial, \"1,250 results a month\" for an allowance. On a plan that charges by the call, `calls` is the plan's units divided by the cost of one call. That cost includes the Start fee. A plan can limit calls per day or per month. Then `calls` is the most calls the limit allows before the units renew. The limit counts each call as one item. On a plan that charges by the page, the limit counts each call as one page. Say a plan allows 10,000 requests a month and 200 calls a day. You get 6,000 calls a month, because 30 days of 200 calls is 6,000. Some providers count each result toward the limit. A list you send in one call counts one result for each row. When a provider counts results, `limitsCountedIn` says \"result\", and `calls` and `monthlyCap` count results. A limit of 2,000 results a day allows 60,000 results in a month of 30 days. We fill `monthlyCap` when a call costs 0 units, like a call on a flat fee. `monthlyCap` is the most items you get a month, or \"no limit\". On a plan with a daily or monthly limit, `monthlyCap` is the most calls in 30 days. 3,000 calls a day make 90,000. The Enough for column shows 3,000 calls a day as \"90,000 calls a month\". Any plan can limit calls per hour, minute or second. `calls` and `monthlyCap` also hold the most calls a limit per hour, minute or second allows. A limit of 50 calls an hour allows 36,000 calls in 30 days. We count a call limit in `monthlyCap` only when each call returns one item or a fixed-size page. On a free trial shorter than 30 days, `monthlyCap` is the most calls you get over the whole trial. The trial's calls never renew. A 7-day trial with 1,000 calls a day shows as \"7,000 calls, once\". Enough for shows `calls`, or `monthlyCap` when a row has no `calls`. On a plan with a Monthly fee, the provider first takes one month's fee from the plan's units. `calls` counts the calls left after the fee. We count the calls again each time the provider refills the plan's units. Enough for says \"0 calls left after the monthly fee\" when the fee uses up all the plan's units. Enough for is blank when the provider doesn't say how many items you get. Enough for is also blank on pay as you go plans and on top-ups. Enough for is blank too on subscriptions that charge for each item on top of the fee. Enough for is also blank when a waterfall's average call costs nothing. `calls` and `monthlyCap` are `null` when Enough for is blank."}, "monthlyCap": {"description": "The number of items you get for the plan's price, counted in `per`. On a plan that charges by the page, `calls` and `monthlyCap` count pages. `calls` is the number of items the plan's units pay for: \"100 calls, once\" for a free trial, \"1,250 results a month\" for an allowance. On a plan that charges by the call, `calls` is the plan's units divided by the cost of one call. That cost includes the Start fee. A plan can limit calls per day or per month. Then `calls` is the most calls the limit allows before the units renew. The limit counts each call as one item. On a plan that charges by the page, the limit counts each call as one page. Say a plan allows 10,000 requests a month and 200 calls a day. You get 6,000 calls a month, because 30 days of 200 calls is 6,000. Some providers count each result toward the limit. A list you send in one call counts one result for each row. When a provider counts results, `limitsCountedIn` says \"result\", and `calls` and `monthlyCap` count results. A limit of 2,000 results a day allows 60,000 results in a month of 30 days. We fill `monthlyCap` when a call costs 0 units, like a call on a flat fee. `monthlyCap` is the most items you get a month, or \"no limit\". On a plan with a daily or monthly limit, `monthlyCap` is the most calls in 30 days. 3,000 calls a day make 90,000. The Enough for column shows 3,000 calls a day as \"90,000 calls a month\". Any plan can limit calls per hour, minute or second. `calls` and `monthlyCap` also hold the most calls a limit per hour, minute or second allows. A limit of 50 calls an hour allows 36,000 calls in 30 days. We count a call limit in `monthlyCap` only when each call returns one item or a fixed-size page. On a free trial shorter than 30 days, `monthlyCap` is the most calls you get over the whole trial. The trial's calls never renew. A 7-day trial with 1,000 calls a day shows as \"7,000 calls, once\". Enough for shows `calls`, or `monthlyCap` when a row has no `calls`. On a plan with a Monthly fee, the provider first takes one month's fee from the plan's units. `calls` counts the calls left after the fee. We count the calls again each time the provider refills the plan's units. Enough for says \"0 calls left after the monthly fee\" when the fee uses up all the plan's units. Enough for is blank when the provider doesn't say how many items you get. Enough for is also blank on pay as you go plans and on top-ups. Enough for is blank too on subscriptions that charge for each item on top of the fee. Enough for is also blank when a waterfall's average call costs nothing. `calls` and `monthlyCap` are `null` when Enough for is blank."}, "perThousand": {"description": "The price of 1,000 items on this plan, in dollars. The price is 0 on a free plan. On a plan that charges by the call, each call asks for one item. We add the Start fee to each item's price. On a plan that charges by the page, we divide a page's price by the most results one page holds. Then we multiply by 1,000. We leave the price blank when the provider doesn't say how many results a page holds. On a search that charges by the page, we price the first page of each search, whatever the page holds. On a flat fee, we take the most items the plan allows in one month. We multiply those items by the months the fee covers. We divide the fee by that total. Then we multiply by 1,000. We leave the price blank when the provider doesn't say how many items the plan allows. A plan with no end date and only limits per second, minute, hour or day has no cap on items. A flat fee with no cap on items shows \"no limit\" on the sheet. We leave the price blank in the CSV and JSON. On a waterfall's paid plan, we show the average cost of a call. We take the price of each provider listed under Waterfall. We weight each price by how often a call reaches that provider. We leave the price blank when a provider a call can reach has no hit rate or page size. On a plan with a Monthly fee, we first subtract one month of the fee from the plan's units. Then we divide the plan's price by the number of items the remaining units buy. Then we multiply by 1,000. We leave the price blank when the Monthly fee uses up all the plan's units. Some plans limit calls per second, minute, hour, day or month. We divide the price by the items the limit allows, if that is fewer than the items you pay for. Then we multiply by 1,000. We leave the price blank on a top-up, because a top-up buys no fixed number of items. We also leave the price blank when the provider's website doesn't say what an item costs on this plan. We leave the price blank, too, when the website doesn't say how many items the price buys."}, "listPerThousand": {"description": "For a provider that prices in dollars, like an Apify Actor: dollars for 1,000 items at the provider's list price. Apify sells a year of credit at a discount: on Starter, $204 buys $228 of credit, twelve months at $19. So an Actor's yearly plans cost less per 1,000 than the Actor's list price. On a plan that charges by the call, List $ per 1,000 includes the Start fee. On a discounted plan, click or tap the plan's $ per 1,000 on the sheet to see who gives the discount. The plan's page also names who gives the discount, under the price. `listPerThousand` is blank (`null` in the JSON) when the provider prices in credits or calls. The key is also blank when the provider's pages don't say what an item costs."}, "overagePerThousand": {"description": "On a subscription: dollars for each 1,000 items you get past the plan's units, when the provider sells extra items. On a plan that charges by the call, Overage includes the Start fee."}, "unitsCap": {"description": "\"hard\" means calls stop once the plan's units run out. \"soft\" means calls go on after the plan's units run out. Those calls cost the Overage price when the provider gives one. Blank (`null` in the JSON) when the provider's pages don't say."}, "addons": {"description": "On an email API's subscription: the packs of units the provider sells on top of the plan. We read them on the pricing page. Each pack has `units` and `pay`, in the plan's currency. `renews` is \"month\" or \"year\" when you pay for the pack again with the plan. `renews` is \"never\" when you buy the pack once. `perThousand` is dollars for 1,000 emails at the pack's price. The sheet's CSV says \"500 credits a month for $10 ($20.00 per 1,000)\". An empty list when the provider sells none. Blank (null) on every other plan."}, "notFoundPerThousand": {"description": "What you pay for 1,000 items the provider has no answer for. 0 when the provider charges nothing for them, as on free plans. On a waterfall, the cost of a call when no provider finds the answer. That cost is the sum of the prices of the providers that charge for a miss."}, "catchAllPerThousand": {"description": "On an email API: dollars for 1,000 calls that return an address at a catch-all domain. Such a domain takes mail for any address. So you can't check whether the person's mailbox exists, and the email may bounce. 0 when such calls cost nothing, or when the provider returns no such address. The same as the row's $ per 1,000 when the provider charges for any address found. Blank when the provider's pages don't say."}, "bounceRefund": {"description": "On an email API: the credit or refund the provider gives when a paid address bounces. Also the conditions, in the provider's words, like \"the credit, reported from the dashboard or the API and reviewed\". \"never\" when the provider's pages say a bounced address stays charged. Blank when the pages don't say."}, "repeatFree": {"description": "On a call that costs units: how long you can get a paid item again for free. On a flat fee with a call limit, the time before the same item counts toward the limit again. We copy the time from the provider's pages, like \"20 minutes\". \"no limit\" means the provider never charges again for an item you paid for once. \"never\" means the provider charges each time you get the item again. Blank when the provider's pages don't say."}, "alsoPaysFor": {"description": "The other calls you get for the plan's price. The other calls each have a separate limit. We use the provider's words. When a plan pays for more than 40 other calls, we write their count instead, like \"300 other calls\". We leave out apps, extensions, MCP servers, proxies and storage, since they are not calls. We also leave out features you can use only in the provider's app, like sending the provider's email campaigns. For example, gtm-api.com's account price also buys 100 searches, 50 messages and 25 connection requests a day. \"nothing\" when you get only the row's call. The row's $ per 1,000 is for that call alone, since providers don't say how to split their price. Blank (`null` in the JSON) until we read the provider's plan. Also blank on a \"contact\" plan whose pages don't say what the price buys."}, "sharesBudgetWith": {"description": "The other calls that spend the same credits or limit as this row's call, like gtm-api.com's company and post reads. When more than 40 other calls spend the same credits or limit, we write their count instead, like \"300 other calls\". We leave out apps and MCP servers, which are not calls. We work out the row's $ per 1,000 as if you make none of these calls. \"nothing\" when no other call shares the budget. On the sheet, the Also pays for column lists these calls last, after the words \"from the same budget\". Blank (`null` in the JSON) until we check which calls share the budget. Also blank when the provider's pages don't say."}, "startPerCall": {"description": "A fee in dollars you pay once for each call, on top of the price per item. An Apify Actor's start fee is one. You pay the same fee for a call of 1,000 items or a call of one item. On a plan that charges by the call, each call asks for one item. On that plan, the $ per 1,000, List $ per 1,000, Overage and Enough for columns all count the Start fee. On a plan that charges by the result or the page, a call can return any number of results. On those plans, the $ per 1,000, List $ per 1,000, Overage and Enough for columns leave the Start fee out. The Start fee is $0.00 on a free plan, and blank when the plan has no start fee. A provider's page can give a range, like \"2-3 credits\". `startPerCall` then holds the lowest fee and `startPerCallMax` holds the highest. The sheet and the CSV show \"$0.04 to $0.06\". `startPerCallMax` is blank on a plan with one start fee or none."}, "startPerCallMax": {"description": "A fee in dollars you pay once for each call, on top of the price per item. An Apify Actor's start fee is one. You pay the same fee for a call of 1,000 items or a call of one item. On a plan that charges by the call, each call asks for one item. On that plan, the $ per 1,000, List $ per 1,000, Overage and Enough for columns all count the Start fee. On a plan that charges by the result or the page, a call can return any number of results. On those plans, the $ per 1,000, List $ per 1,000, Overage and Enough for columns leave the Start fee out. The Start fee is $0.00 on a free plan, and blank when the plan has no start fee. A provider's page can give a range, like \"2-3 credits\". `startPerCall` then holds the lowest fee and `startPerCallMax` holds the highest. The sheet and the CSV show \"$0.04 to $0.06\". `startPerCallMax` is blank on a plan with one start fee or none."}, "monthlyFee": {"description": "A monthly fee the call needs. The provider takes the fee from the plan's units. For example, RouterGrowth charges $9.625 a month for each LinkedIn account you connect. `monthlyFee` is the fee in dollars. `monthlyFeePer` is what one fee pays for, like \"LinkedIn account\". The Enough for and $ per 1,000 columns count what is left after one month of the fee. Blank (`null` in the JSON) when the call has no monthly fee."}, "monthlyFeePer": {"description": "A monthly fee the call needs. The provider takes the fee from the plan's units. For example, RouterGrowth charges $9.625 a month for each LinkedIn account you connect. `monthlyFee` is the fee in dollars. `monthlyFeePer` is what one fee pays for, like \"LinkedIn account\". The Enough for and $ per 1,000 columns count what is left after one month of the fee. Blank (`null` in the JSON) when the call has no monthly fee."}, "extras": {"description": "Fields that cost more than the row's price. Each group of extra fields has `fields` and `perThousand`. `perThousand` is the price you pay on top of the row's price. Some providers charge for each search and also for the extra fields on each result. For those providers, `perThousand` is the price for 1,000 searches. We assume each search returns the most results the plan allows."}, "costUnits": {"description": "The plan's units one call costs, counted in `unit`. 1 for a call at one credit. 0 for a free call, like a call on a flat fee. On a plan that charges by the result or the page, the units one result or page costs, as `per` says. Null when the provider doesn't list the cost."}, "per": {"description": "The price counts a \"call\" or a \"result\". A call asks for one item. A result is each item a call returns. Some calls return a page of results. \"result\" means you pay for each result on the page. \"page of 50\" means you pay for each page of up to 50 results. You pay for a whole page even when the page holds fewer than 50. In the JSON, `resultsPerPage` is the most results a page holds. `resultsPerPage` is `null` when the price isn't per page or the provider doesn't say the page size. \"page, size not stated\" means the provider doesn't say how many results a page holds. On a search, a call is one search, and a \"page of 10\" holds up to 10 results. The price is for the first page of each search. Each further page costs the same as the first page."}, "resultsPerPage": {"description": "The price counts a \"call\" or a \"result\". A call asks for one item. A result is each item a call returns. Some calls return a page of results. \"result\" means you pay for each result on the page. \"page of 50\" means you pay for each page of up to 50 results. You pay for a whole page even when the page holds fewer than 50. In the JSON, `resultsPerPage` is the most results a page holds. `resultsPerPage` is `null` when the price isn't per page or the provider doesn't say the page size. \"page, size not stated\" means the provider doesn't say how many results a page holds. On a search, a call is one search, and a \"page of 10\" holds up to 10 results. The price is for the first page of each search. Each further page costs the same as the first page."}, "resultsCap": {"description": "For a search API: the most results one search gets on this plan, however many pages you ask for. \"no limit\" when the provider says you can get every match. Blank (`null` in the JSON) when the provider's docs don't say, or when the API isn't a search. On a plan that charges by the page, you pay for each page you ask for."}, "perSecond": {"description": "The most calls a second you can keep up. When the provider counts a limit over a longer window, we divide the limit. We divide a limit per minute by 60, per 5 minutes by 300, per hour by 3,600. When the provider sets several limits, we show the tightest: 25 a second and 40 a minute is 0.67. We round to two decimals. A rate under 0.1 keeps two digits past the zeros: 5 an hour is 0.0014."}, "perDay": {"description": "The most calls a day. Some providers count each result of a call instead, like each row of a list. `limitsCountedIn` says what the provider counts: \"call\", \"result\" or \"page\". The provider counts the same unit for this column and for the plan's monthly limit. `limitsCountedIn` says \"call\" when the provider's docs don't say."}, "limitsCountedIn": {"description": "The most calls a day. Some providers count each result of a call instead, like each row of a list. `limitsCountedIn` says what the provider counts: \"call\", \"result\" or \"page\". The provider counts the same unit for this column and for the plan's monthly limit. `limitsCountedIn` says \"call\" when the provider's docs don't say."}, "concurrent": {"description": "The most calls running at once, or \"no limit\". \"n/a\" when the provider sets no cap on calls at once but limits calls by the second. Then Per second sets your limit. Blank (null) when the provider's pages don't say."}, "batch": {"description": "The most items you send in one call on this plan. 1 when the call takes one at a time. \"no limit\" when the provider says a call takes any number. Blank (null) when a call takes a list and the provider's pages don't say how many. A call that refuses fewer than a set number shows the fewest and the most, like \"2,000 to 2,000,000\". A call that needs at least 2,000 and has no top limit shows \"2,000 or more\". A call that needs at least 2,000 shows \"at least 2,000\" when the provider's pages don't give the top limit."}, "minBatch": {"description": "The fewest items you send in one call on this plan, when the provider refuses fewer. The Batch column shows this number first, like \"2,000 to 2,000,000\". Null when the provider sets no lowest number."}, "answer": {"description": "The way you get the call's answer. \"in the call\" when the call's response holds the answer. \"by polling or webhook\" when the call returns a job. Once the job is done, you get the answer from another call or at your webhook. \"in the call or by polling\" when the call returns the answer if the answer is ready in time. If the answer isn't ready, the call returns a job you check later. An Apify Actor returns a job when the run goes past 5 minutes. \"in the call or by webhook\" when you choose in your request. \"by polling\" when only another call gets the answer. \"by webhook\" when only a URL you give gets the answer. Blank (null) when the provider's pages don't say."}, "call": {"description": "The call's name in the provider's docs, when the provider sells more than one call for the API. LinkFinder AI's lead_full_name_to_email and linkedin_profile_to_email are two such calls, both POST /. Blank (`null` in the JSON) when the provider sells one."}, "method": {"description": "The call's HTTP method."}, "path": {"description": "We give the path from the provider's docs. When that path fails, we give the path that works. Each plan of a call has the same path. A plan the provider serves at a separate address has a separate path."}, "send": {"description": "You send an input like a URL, an email or a keyword. You must send every input listed before \"Optional:\". In the CSV and JSON downloads, the inputs after a semicolon are optional."}, "fields": {"description": "The fields the answer can hold at the row's price, each when the provider has the value. We count the answer that holds the result, a not-found included. We leave out a field that only an error holds. Errors include no credits left, a bad input, a timeout and a rate limit. We also leave out a failed row of a bulk answer. An answer with no result yet, still verifying or queued, is left out too. We count each field once. A list counts once, and so does each field in the list. So jobs, job title and job company are three fields. We count this way for every provider. Under Filters, Must return keeps the rows whose answer can hold every field you tick, at the row's price."}, "docsBehind": {"description": "Where the provider shows the call's docs only once you sign up (\"sign-up\") or only to customers who buy by contract (\"sales\"). The plan's Method, Path and You send are then empty, since no public page shows them. Empty where a public page documents the call."}, "latencyMs": {"description": "The median time a call takes. For a benchmarked call, we show our benchmark's median. The API's benchmark columns show the same median. From each call's time, we subtract the mean time of three free calls to the same provider, made just before. If that mean is longer than the call, we use the provider's median baseline instead. We cap the baseline at the call's time, so no time is below zero. For a call we didn't benchmark, we show the time from the provider's pages. Or we show a time we measured when we added the row. On a plan without a check or feature of the benchmarked plan, we show the provider's time or our own. We leave the median blank (null) when we have no time. We also leave the median blank when the benchmarked call gave no answer we could time. The JSON and datacircle.csv give the time in milliseconds. The sheet and the sheet's CSV give the time in seconds."}, "docs": {"description": "The provider's page for the call."}, "readFrom": {"description": "The pages we read the row's values from. They are the sheet's last column: click a cell to see each page, or press ⌘C to copy them all."}, "checked": {"description": "The day we last read every value on those pages, California time."}, "page": {"type": "string", "format": "uri", "description": "The address of the plan's own page on datacircle.dev. Only datacircle.json and datacircle.csv have this key, and each plan our MCP server gives. There it is the page search engines show for the plan: its own page, or the page of a plan list that holds it."}, "rank": {"type": ["integer", "null"], "minimum": 1, "description": "The plan's place among its API's plans we score, best first, from 1, as the sheet orders them. Null on a plan we don't score, listed after them."}}}, "Error": {"type": "object", "properties": {"error": {"type": "string"}}, "required": ["error"]}}}}