The fields of the Datacircle sheet
The contact fields three email finders return
These are the top three email finders in our ranking. Each column is one email finder on one plan, named in the Plan row. A ✓ means you get the field on that plan. "✓ costs more" means you pay extra to get that field.
| Field | GetProspect | DiscoLike | Icypeas |
|---|---|---|---|
| Plan | $399 monthly, Growth 50k | $399 monthly, Team | $499 monthly, Hypergrowth, 100,000 credits a month |
| Verification | ✓ | not in the answer | not in the answer |
| Confidence | not in the answer | not in the answer | ✓ |
| Catch-all domain | not in the answer | ✓ | not in the answer |
| Where found | not in the answer | not in the answer | not in the answer |
| Personal email | not in the answer | not in the answer | not in the answer |
| Name | not in the answer | ✓ | ✓ |
| Job title | not in the answer | not in the answer | not in the answer |
| Company | not in the answer | ✓ | not in the answer |
| LinkedIn URL | not in the answer | not in the answer | not in the answer |
| Location | not in the answer | not in the answer | not in the answer |
The Find email sheet shows the fields in the table above for every email finder on the site.
About this dataset
- Pick an API from the GTM APIs list on the left of the sheet. On a smaller screen, use the menu under the sheet's title. Pick "All GTM APIs" to see every API in one sheet. The API line in the table below says what each API returns.
- An endpoint is one provider's API on one data source. A provider can split an endpoint into several calls. The sheet has one row for each plan of each call, so a plan for two calls has two rows.
- The search at the top of the sheet keeps the plans whose name holds each word you type.
- The Freshness column shows whether a call reads the source live or answers from a copy.
- We read every value on the provider's own pages: the pricing page, the docs and the terms. The Read from column lists those pages.
- Every price column but Pay shows dollars. Pay shows a plan's price in the currency the provider sells the plan in. We convert each Pay price at the European Central Bank's rates of October 16, 2026: $1.1253 for €1. For other currencies the bank gives $1.3335 for £1, $0.05546 for Rp1,000 and $0.10097 for kr1 (Swedish kronor). The bank gives $0.15055 for DKK 1 (Danish kroner) and $0.14956 for CNY 1 (Chinese yuan). The bank gives $1.2137 for CHF 1 (Swiss francs) and $0.56639 for NZ$1 (New Zealand dollars). The bank gives $0.19674 for R$1 (Brazilian reais) and $0.01053 for ₹1 (Indian rupees). The bank gives $0.25751 for PLN 1 (Polish złoty). The bank gives $0.029927 for ฿1 (Thai baht). The bank gives $0.69588 for A$1 (Australian dollars). The bank gives $0.046265 for CZK 1 (Czech koruna). The bank gives $0.0063283 for ¥1 (Japanese yen). Romanian lei are $0.21109 for RON 1. The European Central Bank has no rate for rubles, Peruvian soles, Chilean pesos or Chilean unidades de fomento (UF). For rubles we use the Bank of Russia's rate of October 16, 2026: $0.011939 for ₽1. For soles we use the Central Reserve Bank of Peru's rate of October 16, 2026: $0.29169 for PEN 1. For pesos we use the Central Bank of Chile's rate of October 16, 2026: $1.0162 for CLP 1,000. For unidades de fomento we use the Servicio de Impuestos Internos' value of the UF on October 16, 2026, CLP 41,168.03, at that peso rate: $41.834 for CLF 1. The bank gives $6.3283 for ¥1,000 (Japanese yen). The bank gives $0.7507 for ₩1,000 (South Korean won). The bank gives $3.0993 for HUF 1,000 (Hungarian forints) and $0.054396 for MX$1 (Mexican pesos). The European Central Bank has no rate for Argentine pesos either: for them we use the Central Bank of Argentina's rate of October 16, 2026, ARS 1,518 for $1: $0.65876 for ARS 1,000. For Colombian pesos we use the representative market rate (TRM) the Financial Superintendence of Colombia certified for October 16, 2026, COP 3,170.46 for $1: $0.31541 for COP 1,000. For Vietnamese dong we use the central rate the State Bank of Vietnam set for October 16, 2026, VND 25,637 for $1: $0.039006 for VND 1,000. For Nigerian naira we use the central rate the Central Bank of Nigeria set for October 16, 2026, NGN 1,331.7582 for $1: $0.75089 for NGN 1,000. The bank gives $0.70618 for CA$1 (Canadian dollars). The bank gives $0.06085 for R1 (South African rand). For Kazakh tenge we use the official rate the National Bank of Kazakhstan set for October 16, 2026, KZT 454.14 for $1: $2.2019 for KZT 1,000. For Belarusian rubles we use the official rate the National Bank of the Republic of Belarus set for October 16, 2026, BYN 3.0091 for $1: $0.33232 for BYN 1. For Saudi riyals we use the Saudi Central Bank's fixed rate, SAR 3.75 for $1: $0.26667 for SAR 1. The bank gives $0.10592 for NOK 1 (Norwegian kroner).
- An item is what a row's API counts, like a profile on LinkedIn profiles or an email on Find email.
- $ per 1,000 is blank when no provider page says what an item costs on a paid plan. The
metain the plan's file says why. $ per 1,000 is blank on a plan that charges by the page when the provider doesn't say a page's size. Per then says "page, size not stated". $ per 1,000 is blank when the call costs 0 units and the provider doesn't say the plan's monthly limit. That row'scostUnitsis 0, and the row's Enough for is blank.
Each column below means the same on the sheet, in the CSV and in the JSON.
The bar above the sheet has three downloads:
- Download CSV: every row of the sheet, with the columns below. The CSV is UTF-8 and starts with a byte order mark, so Excel reads the accents. Excel can't fit more than 32,767 characters in one cell. When a list runs longer, we keep the names that fit and add how many we left out. The JSON has every name.
- Download JSON: every row of the sheet as one array of objects, with the keys below.
- Download zip: the raw catalog we build the sheet from. One file for each data source, each provider and each plan of each endpoint.
Anyone can download the sheet as CSV, JSON or a zip, with no sign-up. Our MCP server is open to anyone, with no key: add api.datacircle.dev/mcp to Claude, ChatGPT or Cursor. It answers from the sheet. list_apis lists the GTM APIs on it, and search_plans finds their plans by API, provider or price. Each plan comes with its score, and the best come first, as on the sheet. The server gives each plan with the JSON keys below and its page, and each API with its sheet's address (sheetPage) and, where it has one, its best page's (bestPage).
Our API is free and open, with no key: list every API, see who is best for each and search every plan, at api.datacircle.dev/v1 (its spec: api.datacircle.dev/v1/openapi.json). In our API's answers, each plan has the plan's own JSON keys, plus page and rank. A plan's rank is the plan's place among all scored plans of the plan's API, with the best plan at 1. A plan with no score has a rank of null. We list plans with no score last. Call / and you also get a provider rank for each API the provider sells. The provider rank is the provider's place among all providers of the API. On our site, the best page for each API lists the API's providers in provider rank order. A provider's rank for an API is null when the provider has no scored plan for that API.
A blank cell, or null in the JSON, means the provider's pages don't give that value. A plan's page leaves out the columns that are blank in the plan's row. In the sheet's CSV, a semicolon separates a list's items.
The sheet, the CSV and the JSON
datacircle.json and datacircle.csv, at datacircle.dev, hold every row of every sheet with every JSON key below. Each row is a plan. The CSV's columns are the JSON's keys. Each CSV cell holds the JSON's value, with a list or an object written as JSON. datacircle.dev/SKILL.md tells an AI how to download and query both files.
| On the sheet | CSV column | JSON key | Meaning |
|---|---|---|---|
| API plan | name |
The sheet's first column gives each row's name. No two rows on the sheet share a name. The name starts with the provider, then the plan's price. Some names: "API Builderz, $50 monthly", "HarvestAPI, $280 pack", "Crawlbase, pay as you go", "Bright Data, top-up" (a prepaid balance of any amount), "AnyAPI, top-up from $10" (a balance you top up by $10 or more), "free" or "contact us". Two plans with the same price also get the plan's name. We drop any words in the plan's name that the price already gives. If two rows share a name after that, we add the call's method and path to each name. When two names still match, we add the plan's units. When they still match after that, we add the call's name. The sheet's own CSV and JSON files have no name column. datacircle.json and datacircle.csv have a name column with the same names as the sheets. | |
| Provider | provider |
Who sells the endpoint, in Latin letters where its pages also write its name in another alphabet (互亿无线 Ihuyi is Ihuyi). On the sheet, the provider's name starts each row's API plan. | |
| API | API | api |
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. "eBay sold listings" returns the listings eBay shows as sold for a query, newest sale first. "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. "Domain WHOIS" returns a domain's WHOIS record: who registered it, its registrar, and when it was created, last updated and expires. "IP company lookup" returns the name of the company or network that owns an IP address. Some answers give the owner's domain, kind of owner or ASN too. |
category, subcategory, sheet |
Where the row's API sits in the GTM APIs list on the sheet's left. category is the API's category, like "Email and phone". subcategory is the API's subcategory, like "Email". sheet is the sheet that holds the API, like "Find email" for the Employee email API. Each is the list's own word, so it changes when an API moves in the list or a branch is renamed: "Email and phone" was "Contact" until 2026-11-07. Blank (null in the JSON) for an API the list doesn't hold yet. Only datacircle.json and datacircle.csv have these keys. |
||
page |
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. | ||
| Website | website |
The provider's website. | |
pricingPage |
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. | ||
docsBehind |
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. | ||
| Their pitch | Their pitch | pitch |
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 | Strengths | strengths |
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. |
| GDPR | This column says what the provider's own site claims about GDPR. We look for four proofs: EU company, EU servers, keeps no personal data, data processing agreement. Each cell lists the proofs found on the site and links to the provider's page about GDPR. A blank cell means we found no GDPR claim on the provider's site. Only Find email and Validate email have this column so far. Sort this column high to low to put the providers with the most proofs at the top. Among providers with the same number of proofs, the most accurate come first. Under Filters, pick GDPR compliant to keep only the providers that claim GDPR compliance. We leave this column out of the sheet's CSV and JSON. | ||
| Aggregators | Aggregators | aggregators |
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 | Waterfall | waterfall |
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 | Freshness | freshness, fieldFreshness |
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 | History | history |
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 | Countries | countries |
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. |
| Full family tree | Full family tree | fullFamilyTree |
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. |
| What it checks | What it checks | checks |
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. |
| Searches in | Searches in | searchesIn |
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 data | Keep data | keep |
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 data | Use data | use |
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 | Plan | plan |
The plan's name on the provider's pricing page, in English where that page writes it in another alphabet (XMLStock's "Максимум" is "Maximum"). Its plan page gives its own name too. |
| Who can get it | Who can get it | who |
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 |
"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 | Billing | billing |
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 | charged |
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. |
|
| Top-up | topUp |
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 | Pay | pay |
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, exchangeRate |
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 |
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. |
||
| $ a month | perMonth |
On a subscription: the plan's price for one month in dollars. We divide the plan's Pay by the months the plan buys (termMonths), 12 on most yearly plans. We work out this price for the sheet, to the cent. The sheet's CSV and JSON leave this price out. datacircle.json and datacircle.csv have this price. Blank (null) on every other plan. |
|
| Overall score | score |
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, X or WhatsApp account. We give N/A to plans for personal, non-commercial or academic use only, too. 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. | |
rank |
The plan's place among the scored plans of the same API. The plan with the highest Overall score is 1. A plan with no score has a rank of null. In the CSV, that rank is blank. In datacircle.json and datacircle.csv, we list each API's plans by rank. We put plans with no score last. We list the APIs in the order of the GTM APIs list. datacircle.json and each plan in our API's answers have the rank key. datacircle.csv has a rank column. |
||
| Price score | priceScore |
The plan's price score out of 100. We rank the plan's $ per 1,000 against the $ per 1,000 of the other scored plans of the same API. A plan that charges nothing for a call that finds nothing keeps the whole price score. A plan that charges full price for a call that finds nothing keeps half the price score. Some plans give no $ per 1,000. For those plans, when each call returns one result, we use the price our benchmark paid per call. We scale that price by what a credit costs on the plan. We skip our benchmark's price for a plan if another paid plan for the same call lists a $ per 1,000. Plans for one call can each charge a different price per call. On the sheet, click or tap the score to see how we worked out the score. | |
| Accuracy score | dataScore |
The plan's accuracy score out of 100, from our benchmark of the provider's call. On some APIs, the score measures how complete the call's answer is. On others, the score measures how often the answer is right. We lower the score when we test the call on fewer inputs than the benchmark has. Until we benchmark the call, the score is N/A, and so is the Overall score. 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. On the sheet, click or tap the score to see how we scored the plan. Each API's sheet shows what we measured on each benchmarked plan, in the columns after the price. | |
| Bundle score | bundleScore |
The plan's score out of 100 for the other calls the plan's price gets you. Also pays for lists those calls. On the sheet, click or tap the score to see why. | |
| Cost to get started score | costToGetStartedScore |
The plan's score out of 100 for getting your first result. The score weighs who can get the plan, how you pay, and the least you pay to start. On the sheet, click or tap the score to see why. | |
| Performance score | performanceScore |
The plan's performance score out of 100, from our benchmark of the provider's call. We divide the fastest benchmarked provider's median time by this provider's median time, then multiply by 100. We compare live calls with live calls, and calls that answer from a copy with each other. Some sheets have both kinds of call. On those sheets, each Performance score shows the group we compare the score with: "among live calls" or "among copies". A median under 0.1 s counts as 0.1 s, since the baseline we take off varies by about that much. The Performance score and the Overall score are N/A until we benchmark the call. 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. If the call gave no answer we could time, the Performance score is N/A. The Overall score then counts Performance as 0. The Performance score is N/A when we timed no other call of the same kind in the same benchmark. The Overall score then leaves Performance out. On the sheet, click or tap the score to see how we scored the plan. Each API's sheet shows what we measured on each benchmarked plan, in the columns after the price. | |
| You get | Units | units |
What the plan gives for the price, counted in unit. On a usage tier, where the tier starts: "from the 51st call a month". |
from, graduated |
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. |
||
to |
On a usage tier: the last call or result the tier's price covers each renews. to is one less than the next tier's from on the same call. Blank (null) on the last tier and on every other plan. Only datacircle.json and datacircle.csv have this key. |
||
unit |
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 your own LinkedIn account or WhatsApp number. 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 |
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 | Expires | expires |
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 | Ends | ends |
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. |
| Enough for | Enough for | calls, monthlyCap |
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". A call that charges by the result can take several items at once. Each item then counts as one result: 50 calls a day of 10 items make 15,000 results in 30 days. A call that returns a list, like a search, gets as many results as it finds. A limit on its calls doesn't cap its results. 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. Some providers say they limit the month but give no number. When such a plan has no daily or monthly limit, monthlyCap is null, whatever its limit per hour, minute or second. Such a limit says how fast you can call, not how many items the month gives. 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. |
| $ per 1,000 items | $ per 1,000 | perThousand |
The price of 1,000 items on this plan, in dollars. The price is 0 on a free plan. A lifetime plan is one you pay for once. Its units come back each day or month, with no end. On a lifetime plan, we spread the price over 24 months of units. On a plan that charges by the call, each call asks for one item. We add the Start fee to each item's price. When the call has a Minimum per call above that, each item costs the minimum. 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. |
| List $ per 1,000 | listPerThousand |
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. |
|
| Overage | Overage $ per 1,000 | overagePerThousand |
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. |
| Units cap | Units cap | unitsCap |
"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. |
| Add-ons | Add-ons | addons |
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. |
| Not found | Not found $ per 1,000 | notFoundPerThousand |
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. |
| Catch-all | Catch-all $ per 1,000 | catchAllPerThousand |
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. |
| Bounce refund | Bounce refund | bounceRefund |
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. |
| Repeat free | Repeat free | repeatFree |
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. |
| Monthly fee | Monthly fee | monthlyFee, monthlyFeePer |
You pay this fee each month to use the call. The provider takes the fee from your plan's units. For example, RouterGrowth charges $9.625 a month for each connected LinkedIn account. monthlyFee is the fee in dollars. On a free plan, the provider can take the fee from your free credits. We treat each free credit as worth the provider's lowest price for one credit on this call. monthlyFeePer names what one fee pays for, such as "LinkedIn account". The Enough for column counts only the units left after you pay one month's fee. The $ per 1,000 column does the same. The Monthly fee column is blank (null in the JSON) when the call has no monthly fee. |
| Start fee | Start fee | startPerCall, startPerCallMax |
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. |
| Minimum per call | minimumPerCall, perThousandFrom |
The least you pay for one call, in dollars, when its items and its Start fee cost less. The sheet says it under the $ per 1,000, on hover and on the plan's page. Rakko Keyword charges at least 15 credits a request, for any number of keywords. On a plan that charges by the call, each call asks for one item, so the $ per 1,000 counts each item at the minimum. On a plan that charges by the result or the page, the $ per 1,000 leaves the minimum out. perThousandFrom then says from how many results or pages a call the $ per 1,000 holds: 500 keywords at Rakko Keyword's 0.03 credits a keyword. A call of fewer costs the minimum. The minimum is $0.00 on a free plan. Blank (null in the JSON) when the call has no minimum, and perThousandFrom blank on a plan that charges by the call. |
|
| Per | Per | per, resultsPerPage |
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. |
costUnits |
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. |
||
| Most per search | Most per search | resultsCap |
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. |
| Extra fields | Extra fields | extras |
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. |
| Also pays for | Also pays for | alsoPaysFor |
The other calls you get for the plan's price. The other calls each have a separate limit. We use the provider's words, in English where the provider writes them in another alphabet, as the Call column does. When a plan pays for more than 40 other calls, we write their count instead, like "300 other calls", which the sheet says with the provider's name: "3,535 other ReefAPI 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. |
| Shares budget with | sharesBudgetWith |
The other calls that spend the same credits or limit as this row's call, like gtm-api.com's company and post reads. We name each in English where the provider writes it in another alphabet: XMLStock's "Яндекс Wordstat" is "Yandex Wordstat". 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. |
|
| Per day | Per day | perDay, limitsCountedIn |
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. |
| Per second | Per second | perSecond |
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. When the number isn't whole, the sheet shows the provider's own limit after it, like "0.056 (200 an hour)". |
perWindow |
The limit behind Per second, in the provider's own words, when the provider counts it over a minute, 5 minutes or an hour. count is the provider's number of calls and per is the window: "minute", "5 minutes" or "hour". For example, 200 calls an hour is {"count": 200, "per": "hour"}, and Per second shows it as 0.056. When Per second isn't a whole number, the sheet shows this limit after it, like "0.056 (200 an hour)". Null when the provider's limit a second is the tightest, or when the provider sets no limit. |
||
| Concurrent | Concurrent | concurrent |
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 | Batch | batch |
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 |
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 | Answer | answer |
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. |
| Median | Median | latencyMs |
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. |
| Fields | fields |
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. | |
completeness |
The share of the API's key fields the answer holds, out of 100, as the plan's page shows the share. The share counts the key fields you pay an extra field for. Key fields, below, lists them. Only datacircle.json and datacircle.csv have this key. | ||
keyFields |
The key fields of the row's API that the answer holds at the row's price. The plan's page names them too, like "Experience" or "Skills". A key field the answer holds in part, like only the top skills, is in the list too. Only datacircle.json and datacircle.csv have this key. | ||
extraKeyFields |
The key fields of the row's API you get only when you pay for an extra field (extras). Only datacircle.json and datacircle.csv have this key. |
||
| You send | You send | send |
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. |
| Call | call |
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 /. In English where the docs write it in another alphabet (XMLStock's "Яндекс Live" is "Yandex Live"). Its plan page gives its own name too. Blank (null in the JSON) when the provider sells one. |
|
| Method | Method | method |
The call's HTTP method. |
| Path | Path | path |
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. |
| Docs | docs |
The provider's page for the call. | |
docsBehind |
Where the provider shows the call's docs only after a sign-up ("sign-up") or only to buyers under contract ("sales"). Its method, path and inputs are then blank when no public page shows them. Null when the call's docs are public. | ||
docsBehind |
"sign-up" when the provider shows the call's docs only to people who sign up. "sales" when only the provider's sales team gives the docs. With either value, no public page gives the call's method, path or inputs. With "sign-up", the sheet's Method, Path and You send say "Docs behind sign-up". With "sales", they say "Docs on request from sales". In the CSV and JSON downloads, Method, Path and You send are blank. Null when a public page documents the call. | ||
| Read from | Read from | readFrom |
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 | checked |
The day we last read every value on those pages, California time. |
Key fields
Each plan's page lists the LinkedIn profile sections that some providers skip. A ✓ means the provider returns that section at the row's price. "✓ costs more" means you pay for an extra field to get that section. "✓ top skills, the rest costs more" means you get the top skills and pay for an extra field to get the rest. Completeness is the share of the plan page's sections that the provider returns. Sections you get by paying for extra fields count too. The Must return filter lists each field under the section the field belongs to. We work out the ✓ and Completeness from Fields and Extra fields. The ✓ and Completeness show on the plan's page, and in datacircle.json and datacircle.csv (completeness, keyFields and extraKeyFields). We leave the ✓ and Completeness out of the sheet and of the sheet's CSV and JSON.
| Key field | Meaning |
|---|---|
| Experience | The jobs on the profile: each job's title and company. Many calls also return each job's dates and description. We show "✓ current job" when the call returns only the current title or company. |
| Education | The schools on the profile: each school's name, often with the degree, the field of study and the dates. |
| Skills | The skills on the profile. "✓ top skills" when the answer holds only the profile's top skills. |
| Headline | The line under the name on the profile. |
| About | The About section: the summary the person wrote. |
| Location | Where the person is: a city, a region or a country. |
| Photo | The profile picture. |
| Followers | How many people follow the profile. |
| Connections | The number of connections on the profile. LinkedIn shows "500+" past 500. |
| Certifications | The licenses and certifications on the profile, each with a name, often with the issuer. |
| Languages | The languages on the profile, often with how well the person speaks each. "✓ profile language" when the answer holds only the profile's language. |
| Recommendations | The recommendations other LinkedIn members wrote about the person, often with each one's text. "✓ count" when the answer holds only how many there are. |
| Open to work | Whether the profile says the person is open to work. |
Each API's page lists key fields. On an API that returns a person's profile, the key fields are the LinkedIn profile sections. On Find email, the key fields are Location and the fields in the Find email table below. On any other API, the key fields are the field groups in the API's Must return filter. We count the key fields for Completeness the same way on each API's page. Locations, Round and Investors read "✓ count" when the API returns only a count instead of the full list. Description reads "✓ snippet" when the API returns a short piece of the description.
| Key field | Meaning |
|---|---|
| Verification | Whether the provider checked that the address takes mail, and the result: valid, invalid, risky or unknown. |
| Confidence | The provider's score for whether the address is the person's. |
| Catch-all domain | Whether the address is at a catch-all domain. A catch-all domain takes mail for any address, so you can't check the person's mailbox. |
| Where found | The pages or the source the provider found the address on. |
| Personal email | The person's own address, apart from the work one. |
| Name | The person's name. |
| Job title | The person's job title. |
| Company | The person's company: the company's name or domain. |
| LinkedIn URL | The person's LinkedIn profile URL. |
Strengths
We work out each plan's strengths from the plan's row. A row shows only the narrowest band the plan fits. A row under $1 per 1,000 shows only "under $1 per 1,000". A row with 60 fields or more shows only "60+ fields". For a plan with no price per profile or email, we use the provider's lowest price on the same API. Apify sells prepaid tokens, with no price per profile or email.
On LinkedIn profiles:
| Strength | Meaning |
|---|---|
| under $1 per 1,000, under $2 per 1,000 | 1,000 profiles cost under $1, or under $2, on a plan you pay for. Under Filters, under $2 includes the rows under $1. |
| 50+ fields, 60+ fields | The answer can hold 50 fields or more, or 60 or more, at the row's price, counted as Fields says. Under Filters, 50+ fields includes the rows with 60 or more. |
| 100+ profiles a request | You send 100 profile URLs or more in one call. Your plan's quota has room for 100 profiles or more. |
| read live | The provider reads the profile on LinkedIn when you call, every field included. |
| nothing charged when not found | A profile the provider can't find costs nothing, on a plan you pay for. |
On Find email:
| Strength | Meaning |
|---|---|
| under $5 per 1,000, under $10 per 1,000 | 1,000 emails cost under $5, or under $10, on a plan you pay for. Under Filters, under $10 includes the rows under $5. |
| catch-all free | An address at a catch-all domain costs nothing, as Catch-all says, on a plan where each email found costs you. |
| bounces refunded | The provider gives a credit or a refund for a bounced address, as the Bounce refund column says. We show this strength only on plans that charge you for each email found. |
| 100+ people a request | You send 100 people or more in one call, on a plan where you pay for 100 emails or more. |
| found live | The provider finds the email when you call, every field included. |
| nothing charged when not found | A person the provider finds no email for costs nothing, on a plan you pay for. |
Validate email has no strengths yet.
The zip: the catalog's files
The zip holds one folder, gtm_apis. The folder holds this page as the README, plus the four kinds of file this section lists. Path names are lower case, with an underscore for a space. We keep a provider's old folder name when we fix the provider's name, so the files stay where they were.
sources/: one file for each data source.<data_ source>. json catalog/: one file for each provider.<provider>/ provider. json catalog/: one file for each plan, for each call. We name the<provider>/ <data_ source>/ <api>/ <plan>. json <api>folder after the plan's API, likeemployee_profile. We name a plan's file by how you pay and how much, likemonthly_49.jsonorfree.json. When a provider sells one plan for two calls, we make two files. Each of those file names ends with the call, likemonthly_. Each file is one row of the sheet.499_ enrich_ person_ realtime. json aggregators/: one file for each aggregator, the rows'<aggregator>. json aggregators.
We compute the sheet's prices in dollars from the plan files. For a plan priced in another currency, we turn the plan's prices into dollars at the row's exchangeRate. A row's perThousand is the plan's unit price times the row's cost.units, times 1,000. The unit price is unit_price, or pay divided by units.
A cap in per_day or per_month can stop you from using all the calls you pay for. On a capped plan, the unit price is pay divided by the units your calls can use. We count each call as one item or one page. When limits_counted_in says the limit counts results, we count each result instead. Say a plan pays for 10,000 requests a month but caps you at 200 calls a day. 200 calls a day for 30 days is 6,000 calls, so you can use only 6,000 of the 10,000.
A flat fee's calls cost 0 units. For a flat fee, we find the most items you can get in the months that one pay covers. perThousand is pay divided by that number, times 1,000. The number of months is the file's term_months. A file without term_months counts 1 month for monthly billing, 3 for quarterly, 6 for half-yearly and 12 for yearly. The most items a month is the row's monthlyCap. monthlyCap is the lowest of the file's monthly_cap, per_month, 30 times per_day and the calls a limit per hour, minute or second allows in 30 days. We skip monthly_cap when monthly_cap isn't a number. On a call that charges by the result, per_month and per_day count calls, unless limits_counted_in says "result". We then multiply them by the file's batch, the most items one call takes. On a call that returns a list, we skip them.
On a monthly or longer fee, a limit per hour, minute or second also caps your calls. We count the calls that limit allows in 30 days. We do this only when each call returns one item or a fixed-size page. We skip that limit when the file's monthly_cap is null and the plan has no per_day or per_month: the provider limits the month but gives no number. Then monthlyCap is null and perThousand is blank. A flat fee with no cap has no perThousand. Some plans buy no months, like a one-time pack. On those plans, a call that costs 0 units has no perThousand. A free plan's perThousand is 0, whatever units the plan's file lists.
sources/<data_source>.json
| Key | Meaning |
|---|---|
data_source |
The source's name. |
website |
The source's website. |
apis |
The name of each API the source offers. Each API has a fields list: every field the API's answers can hold on this source. |
catalog/<provider>/provider.json
| Key | Meaning |
|---|---|
provider |
The provider's name, in Latin letters. |
previous_names |
The provider's earlier names, newest first. We add this list only when the provider changed names. For example, BoldData is now CompanyData.com, so the CompanyData.com file lists BoldData as an earlier name. |
website |
The provider's website. |
pricing_page |
The provider's pricing page, where you buy the plans. Some plans have their own pricing page, in the plan's pricing_page. |
unit |
The unit the provider's prices count, with the same values as the sheet's unit column. If a plan counts in a different unit, the plan's file names that unit in unit. |
keep |
The longest the provider's terms let you keep the API's responses. |
use |
The uses the provider's terms allow for the API's responses, and what the terms ask in return. |
pitch |
The provider's pitch, quoted from the provider's own page. That page is in source. |
source |
The public pages we read the provider's values from. A value a provider gave us in private has no page in source. |
found |
The time we first added the provider, in UTC. |
checked |
The day we last read every value on those pages, California time. |
mock |
True when the file holds a value we did not read on the provider's pages. False in the zip: we leave those files out. |
catalog/<provider>/<data_source>/<api>/<plan>.json
| Key | Meaning |
|---|---|
data_source, api, provider |
The data source, the API and the provider who sells the API on that source. |
plan |
The plan's name on the pricing page, as the page writes it. One in another alphabet has its English in plans_in_english.json, which the sheet shows. |
who |
Who can get the plan: "anyone", or the condition on the provider's pages. |
auth |
"none" when the provider's pages say the call needs no API key and no account on this plan. For example: a public job board, or a call you pay for each time from a wallet. We leave auth out when the call needs an API key or an account. |
pricing_page |
The page where you buy the plan, when that page isn't the provider's own pricing page. A RapidAPI page is one example. |
docs_behind |
sign-up where the provider shows the call's docs only once you sign up, sales where only to customers who buy by contract. Its method, path and send are then null, since no public page shows them. Left out where a public page documents the call. |
billing |
How you pay for the plan, as on the sheet. |
charged |
On an on-demand plan alone: "per call", "monthly" or "at a threshold", as on the sheet. |
top_up |
true on a one-time plan where you choose how much to top up. The amount must be at least the plan's pay. We leave top_up out on a pack with a fixed size and on every other plan. |
currency |
The currency of pay, unit_price and overage_unit_price, as an ISO 4217 code, like "EUR". We leave currency out on a plan in dollars. |
pay |
The plan's price, in the plan's currency. On a top-up, pay is the smallest top-up you can buy. pay is null when the provider's pages don't list the smallest top-up. On a usage tier, pay is the tier's monthly minimum, or 0 when the tier has no minimum. On a subscription's usage tier, you pay pay, the plan's price, on top of the cost of your calls. We add the cost of the same plan's lower tiers in the sheet. |
term_months |
On a subscription, the months pay buys, when the provider gives you more months than you pay for. For example, term_months is 15 on a yearly plan that gives you 15 months for the price of 12. We leave term_months out on every other plan. When a "2 months free" deal lowers a yearly price, we lower pay and leave term_months out. |
from, graduated |
On a usage tier, from is the count where the tier's price starts. The count is in cost.per: calls, results or pages. The count goes back to 0 each time your units renew, as renews says. graduated is true when you pay each lower tier's own price for the items in that tier. |
units |
Units you get for pay: a pack, a month's allowance, a free plan's credits. On a yearly plan, the year's, or a month's when renews is "month". |
unit |
The unit the plan counts in, when the plan's unit differs from the provider's unit. For example, Exa's Websets plans count Websets credits, and Exa's Search API counts a dollar balance. We leave unit out on every other plan. |
unit_price |
The price of one unit in the plan's currency, when the pricing page gives one. |
overage_unit_price |
The price of one unit past units on a subscription, in the plan's currency. |
units_cap |
"hard" when calls stop once the plan's units run out. "soft" when calls go on past the plan's units. Calls past the units cost the plan's overage_unit_price, if the provider's pages give an overage price. We leave units_cap out, or write null, when the provider's pages don't say. |
addons |
The packs of units the provider sells on top of the plan. Only subscriptions to find or check emails have this key. The table below gives the keys of each pack. An empty list when the provider sells no packs. Null when the provider sells packs but the provider's pages show no price. |
renews |
How often units come back: "day", "month", "quarter", "half-year", "year", or "never". One pay buys every refill in the billing period, even when units refill more often than the plan bills. A month is 30 days, a quarter 91, a half-year 182 and a year 365. A plan with term_months gets refills for the number of months in term_months. On a one-time plan, "day" or "month" means a lifetime plan: the units come back for good. We count 24 months of them. A pass for a set time, like 30 days, gives all its units at once. Its renews is "never", and its expires says when the pass ends. "month" on a yearly, half-yearly or quarterly plan means a month's units come each month. "year", "half-year" or "quarter" means all the units come at the start of the term. |
expires |
When unused units lapse, as on the pricing page. |
ends |
The plan's last day, as the provider gives the date: "2026-12-02" for Explorium. We put the link to the provider's page that gives this date in source. We leave this key out when no provider page gives a last day. |
per_second, per_minute, per_5_minutes, per_hour, per_day, per_month |
The endpoint's rate limits on this plan, one key for each span of time, like a second or a day. |
limits_counted_in |
This key says "result" or "page" when a provider counts results or pages toward per_day and per_month. The key uses the same words as cost.per. Argorant's email finder allows 2,000 a day and counts each row of a list as one. We leave this key out when the limits count calls. We also leave the key out when the provider's docs don't say what the limits count. |
concurrent |
The most calls running at once on this plan. The value is "no limit" when the provider says there's none, or null when the provider's pages don't say. Every plan has this key. |
also_pays_for |
The other calls you get for the plan's price. The other calls each have a separate limit. We use the provider's words. A name in another alphabet has its English in calls_in_english.json, which the sheet shows. 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. We also leave out tasks you can do only in the provider's app, like sending the provider's email campaigns. These are not calls. The list is empty when the price buys only this call. We leave out the key until we read what the price buys. We also leave the key out on a "contact" plan when the provider's pages don't say what the price buys. |
shares_budget_with |
The other calls that spend the same credits or limit as this call. A name in another alphabet has its English in calls_in_english.json, which the sheet shows. 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. Empty when no other call spends the same units or limit. null when the provider's pages don't say which calls share them. This key appears whenever also_pays_for appears. |
monthly_cap |
Only calls that cost 0 units have this key. The value is the most the plan gives a month, counted in the call's per. The value is "no limit" on a flat-fee plan of unlimited calls, which has no units. Null when the provider has a limit and doesn't say the limit's size. |
monthly_fee |
A monthly fee the call needs. The provider takes the fee from the plan's units. The next table lists the keys of this fee. RouterGrowth's LinkedIn profile and search calls need a LinkedIn account you connect. RouterGrowth takes $9.625 a month for each account from the plan's units. We leave this key out when the call has no monthly fee. |
call |
The call's name in the provider's docs. A plan file has this key only when the plan's provider sells more than one call for the API. Kooperativa sells "Enrich Person" from a stored copy of the data and "Enrich Person (Realtime)" live. Each plan file of Kooperativa has the key. A call named in another alphabet has its English in calls_in_english.json, which the sheet shows. |
method, path, base_url |
We give the call's method, path and base URL from the provider's docs. If the docs' path fails, we give the path that works. AeroLeads' email check is one such call. Each plan of a call has the same method, path and base URL. The file of a plan at a separate path or address gives that plan's own method, path and base URL. BlitzAPI serves the Credits plan at a separate address, through BlitzAPI's agent storefront. |
docs |
The provider's page for the call. |
docs_behind |
"sign-up" when the provider shows the call's docs only after a sign-up, or "sales" when only buyers under contract get them. Pipl sells its Search API after a demo. We then leave method, path and send null when no public page shows them, and file the plans from the provider's pricing and product pages. We leave the key out when the call's docs are public. |
docs_behind |
"sign-up" when the provider shows the call's docs only to people who sign up. "sales" when only the provider's sales team gives the docs. With either value, method, path and send are null. We leave the key out when a public page documents the call. |
pitch |
The provider's pitch for this call, quoted from the call's page. For Apify, we quote the page of each Actor. We leave the key out when the provider file's pitch covers all the provider's calls. |
keep, use |
Some products have terms of their own. keep and use hold a product's own terms for calls to that product. keep and use mean the same as in provider.json. APILayer sells mailboxlayer's email check under mailboxlayer's terms, and sells numverify's phone check under numverify's terms. One plan can have different terms from the provider's other plans. TGStat's terms let you use the Free plan only in free projects open to everyone. The terms also ask you to credit TGStat beside TGStat data. TGStat's Free plan files hold the rule on free projects and the rule on credit in use. We leave out keep and use when the provider's terms cover the plan. |
send |
The parameters you send the call. The parameters the call needs come first, then a semicolon, then the optional parameters. |
batch |
The most items one call takes on this plan. The value is 1 when the call takes one item at a time. The value is "no limit" when the provider allows any number. The value is null when a call takes a list and the provider publishes no limit. Every plan has this key. |
min_batch |
The fewest items one call takes on this plan. The provider refuses fewer. A call that takes 2,000 to 2,000,000 items has a min_batch of 2,000. We leave min_batch out when the provider sets no lowest number. All plans for one call share one min_batch. |
answer |
The way the call's answer comes back: "in the call", "in the call or by polling", "in the call or by webhook", "by polling", "by webhook" or "by polling or webhook", as on the sheet. The value is null when the provider's pages don't say. Every plan has this key. All plans of one call share one value. |
freshness |
This key gives the longest time the answer may lag behind the data source, as on the sheet. The key is null when the provider's pages don't say or don't agree with each other. Every plan has this key, and plans that use the same API call share one value. A plan whose own pages give a different lag gets that lag. |
field_freshness |
The fields in fields whose data is older or newer than the plan's freshness, as the provider's pages say. Each field comes with the field's own freshness, as on the sheet ({"jobs": "as of 2025-11-13"}). We leave the key out when no page gives a field a separate freshness. |
history |
How far back the funding rounds or the job postings go on this plan, as on the sheet. Null when the provider's pages don't say. Every plan on Company funding, Company open jobs, LinkedIn job search, Job postings and Job posting details has this key. |
results_cap |
The most results you can get from one search on this plan, however many pages you ask for. The value is a number or "no limit", or null when the provider's docs don't say. Every plan of LinkedIn people search, LinkedIn company search, LinkedIn job search and LinkedIn post search has this key. Every plan of People search, Company discovery, Job postings, Web search, SERP and News search has this key too. Each Image search and Video search plan has a results_cap: the most results one search can return. Each Search autocomplete plan has one too: the most suggestions one call can return. Every plan of Amazon search, Walmart search, eBay search, eBay sold listings, TikTok Shop search, Facebook Marketplace search, App Store search and Google Play search has this key too. Every plan of Zillow search, Redfin search and Realtor.com search has a results_cap: the most results one search can return. When cost.per is "page", you pay cost.units for each page of the search. |
searches_in |
On LinkedIn post search and LinkedIn people search, where the call looks for the posts or the people it returns. "LinkedIn's search": the call runs LinkedIn's own search (its search page, Sales Navigator's or Recruiter's). "Google's index": the call searches Google for LinkedIn posts or profiles. So the call returns only what Google has indexed. Google's index sets how many the call finds, and how fast. "a search engine's index": the call searches another search engine's index, or an index the provider's pages don't name. "the provider's own database": the call searches a copy of LinkedIn posts or profiles the provider keeps. Null when the provider's pages don't say. Every plan on the LinkedIn post search and LinkedIn people search sheets has this key. All plans of one call have the same value. |
countries |
On Validate phone: the countries whose numbers the call checks. 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 name each country in English. The names match the sheet. The list is ["Worldwide"] alone when the call covers any country, or over 100 countries. The key is null until we read the countries on the provider's pages. The key is also null when the provider's pages don't list the countries. No plan of any other API has this key. On Business verification, the plans of a call of one country we benchmark are on that country's own sheet. |
regions |
On Business verification alone, on a call of one country: the states, provinces or cities whose companies the call finds, like "New York". We name each one in English. A call of the whole country has no such key. The plans of a call with this key are on that place's own sheet, when we benchmark that place. |
full_family_tree |
On Company hierarchy: the key is true when one call gives the whole family tree. The key is false when one call gives only part of the tree. The values match the sheet's yes and no. The key is null until we read the provider's website. The key is null when the provider's website doesn't say. Every plan on the Company hierarchy sheet has this key. |
checks |
This key lists the checks each call makes, with the same names as the sheets on our site. An email check lists one or more of "format", "mail servers", "disposable domains", "role addresses" and "mailbox", in that order. A phone check lists one or more of "numbering plan", "carrier", "line in service" and "messaging apps", in that order. An email finder lists the checks the finder makes on an address before giving you the address. The finder's list uses the same check names as an email check. The key is null until we read the provider's pages. The key is also null when the provider's pages don't list the checks. Each plan has a separate list if the provider's pages show different checks on different plans. Every plan on the Validate email, Find email and Validate phone sheets has this key. |
lacks |
A call can do less on one plan than on another. This key lists, in the provider's words, what the call can't do on this plan. We list a gap only when the provider's pages say another plan of the call has the missing feature. We list only gaps that change the call's answers. We skip gaps already listed in checks or fields. HeroBounce's Pay As You Go plans lack "greylist auto-retry" and "AI-enhanced scoring". HeroBounce's Starter, Growth and Pro plans have "greylist auto-retry" and "AI-enhanced scoring". Our benchmark prices each call on the cheapest paid plan that has every feature of the plan we tested. A plan that lacks a feature of the benchmarked plan gets N/A for the Accuracy, Performance and Overall scores. The plan's Median shows the plan's latency_ms instead. We leave the key out when the provider's pages name no gap for this plan. |
fields |
The fields the call returns on this plan at the call's base cost. On a cheaper plan, the call may return fewer fields. Each field name comes from the source's apis. |
waterfall |
This key is on a call that tries one provider after another until one finds the answer, like treg's. The key lists the steps in the order the call tries them, each with the keys in the table below. Every plan of the call has the same steps. |
cost |
One call's cost on this plan, in the plan's unit. The keys of cost are in the cost table. A waterfall's plan has no cost key. We work out a waterfall's cost from the waterfall's steps. |
latency_ms |
The time a call takes, in milliseconds. The value comes from the provider's pages, or from our own measure when we added the plan. For a call we benchmarked, the sheet's Median shows our benchmark's median time. The sheet's Median shows latency_ms on a plan that lacks a check or feature that the benchmarked plan has. |
source, found, checked, mock |
As in provider.json. |
meta |
Our note on why we can't price a paid plan with no waterfall. The note's reason names the number the provider's pages leave unclear: the plan's cost, or how many units the plan's pay buys. Free plans, contact plans and plans we can price have no meta. |
cost
| Key | Meaning |
|---|---|
units |
Units one per costs on this plan. |
per |
What you pay for: "call", "result" or "page". A call asks for one item. A result is each item a call returns. A page is a batch of results that one call returns. On a search, "page" means you pay units for each page of results. The price per 1,000 searches counts one page for each search. |
results_per_page |
With per "page": the most results a page holds, or null when the provider's pages don't say. |
start |
The units you pay once per call, on top of units for each per. If the provider's page gives a range, the field holds two numbers: the least and the most. "2-3 credits" becomes [2, 3]. |
minimum |
The least one call costs, in units, when its units for each per and its start cost less. Rakko Keyword's "15 credits" at least a request is 15. |
not_found |
Units you pay when the provider can't find the profile or the email. Units you pay when an email check can't tell whether the address takes mail. |
catch_all |
This key is on a call that costs units to find or check an email. The key gives the units you pay for an address at a catch-all domain. A catch-all domain takes mail for any address, so you can't confirm the person's mailbox exists. 0 when free, null when the provider's pages don't say. |
bounce_refund |
Only calls that cost units to find or check an email have this key. The key gives the refund you get when a paid address bounces. The key also gives any condition on the refund. We quote the provider's pages. The value is "never" when the provider's pages say the provider keeps the charge. The value is null when the pages don't say. |
repeat_free |
How long after a paid call you can get the same profile again free on this plan. On a flat fee with a call limit, the time before the same profile counts against the limit again. Null when the provider's pages don't say. |
extras |
Fields that cost more: the table below. |
monthly_fee
| Key | Meaning |
|---|---|
units |
The number of the plan's units the fee takes each month, counted in the plan's unit. |
per |
What one fee pays for, in the provider's words. For example: "LinkedIn account". |
cost.extras
| Key | Meaning |
|---|---|
fields |
The fields the extra adds. We name each one as the source's apis does. We list fields the base cost covers in the plan's fields only. |
units |
Units the extra's fields cost on top of cost.units, counted by the extra's per. When an extra has no per, we count by cost.per. Always more than 0. Fields that cost nothing more are in the plan's fields. |
per |
"result" when the provider charges for the extra fields on each result a call returns. Set per to "result" when the call's cost.per is "page". For example, BetterContact charges 1 credit for each email BetterContact's people search finds. Also set per to "result" when the call is a search with cost.per set to "call" and a number in results_cap. For example, Nimble charges $1 more for each 1,000 web pages Nimble's search returns in full text. We leave per out when the extra fields cost units for each cost.per. |
waterfall
| Key | Meaning |
|---|---|
provider |
The provider at this step, in the router's words. |
call |
The router's name for the call at this step, which you can also call alone. |
units |
The router's charge for the step, in the plan's unit, for each per. |
per |
"call" or "result", or on a call that returns a page "result" or "page", as in cost. |
results_per_page |
With per "page", as in cost. |
hit_rate |
The share of the router's calls to this provider that find an answer, from 0 to 1. On Email validation and Phone validation, the share of calls where the provider gives a verdict, right or wrong. Null when the router publishes no rate. |
misses_billed |
True when the step charges units even if the step finds nothing. |
aggregators/<aggregator>.json
| Key | Meaning |
|---|---|
aggregator |
The aggregator's name. |
website |
The aggregator's website. |
own_key |
The aggregator's price for a call made with your own provider key, like "free". Null when the aggregator takes no key of yours. |
apis |
The APIs where we checked every call this aggregator sells. For each API in this list, a sheet row the aggregator doesn't sell says "none". |
carries |
Each call in our catalog that the aggregator sells, with the keys in the carries table. |
source, checked |
As in provider.json. |
carries
| Key | Meaning |
|---|---|
provider, api |
The provider and api of each sheet row the aggregator sells. |
call |
Which of the provider's calls the aggregator sells, when the provider sells more than one for the API. |
one_of |
In place of call: two or more of the provider's calls. The aggregator sells one of them and doesn't say which. |
tool |
The aggregator's name for the call. |
url |
The call's page on the aggregator's site. |
own_key |
True when you can make the call on the aggregator with your own provider key. Null when the aggregator lists the call but doesn't say whether you use your own key or pay the aggregator. paid is also null. |
paid |
True when you can pay the aggregator for the call, with no account at the provider. Null when the aggregator doesn't say whether you pay the aggregator or use your own key. own_key is also null. |
usd |
The aggregator's price for one per, in dollars. Null when the aggregator sets no price or takes no payment for the call. Also null when the aggregator doesn't say how the call is sold. |
per |
"call" when the aggregator charges for every call. "result" when the aggregator charges for each call that finds a result. On a call that returns pages, "result" means you pay for each result on the page. "page" means you pay for each page. Null when you can't pay the aggregator for the call, or the aggregator doesn't say how you pay. |
results_per_page |
The most results one page holds for the aggregator's page price, when per is "page". Null when the aggregator doesn't say. |
addons
| Key | Meaning |
|---|---|
units |
Units in the pack, in the plan's unit. |
pay |
The pack's price, in the plan's currency. |
renews |
"month" or "year" when you pay for the pack again each month or each year, along with the plan. "never" when you buy the pack once. |