# Get your remaining credit balance Source: https://docs.revenuebase.ai/api-reference/account/get-your-remaining-credit-balance /api-reference/v2/email-openapi.json get /v2/account/balance Read the credit balance reported for your account. ## Credits and plans PAYG is Pay-as-you-go. AYCE is All-you-can-eat. | Usage | PAYG | AYCE | | - | - | - | | This request | **Free** 0 credits | **Free** 0 credits | ## When to use this endpoint Check your balance before a paid retrieval or verification, and refresh it after a completed job. Reading your balance does not reserve or spend credits. ## Example Set `REVENUEBASE_API_KEY` to your API key. ```bash curl --request GET 'https://api.revenuebase.ai/v2/account/balance' \ --header "X-Key: $REVENUEBASE_API_KEY" ``` Response captured from the local test API on October 13, 2026. Results can change as the dataset or account changes. ```json { "credits": 10488 } ``` ## Read the response `credits` is the credit balance reported for your account. It is not a row count or the daily free View allowance. This endpoint does not provide a credit-price breakdown or guarantee that an export hold will fit. Use [Estimate](/api-reference/estimate-export) for a contact file, [Company Estimate](/api-reference/estimate-company-export) for a company file, and [the credit guide](/api-reference/v2/credits) to understand holds. ## Errors and next steps Check the API key if authentication fails. If the credit service is unavailable, a 503 response can include Retry-After. Refresh the balance after a metered operation before deciding what to retrieve next. # Rotate your API key Source: https://docs.revenuebase.ai/api-reference/account/rotate-your-api-key /api-reference/v2/email-openapi.json post /v2/account/api-keys/rotate Replace the account’s default API key used by your integrations. ## Credits and plans PAYG is Pay-as-you-go. AYCE is All-you-can-eat. | Usage | PAYG | AYCE | | - | - | - | | This request | **Free** 0 credits | **Free** 0 credits | ## When to use this endpoint Use this when replacing the account's default integration key. Rotation changes credentials; it does not reset credits, allowances, or job ownership. > [!WARNING] > > The previous default key stops working immediately. Save the returned key securely and update every integration that used the old default key. ## Example Set `REVENUEBASE_API_KEY` to your API key. ```bash curl --request POST 'https://api.revenuebase.ai/v2/account/api-keys/rotate' \ --header "X-Key: $REVENUEBASE_API_KEY" ``` ## Read the response `api_key` is the new plaintext key. Capture it from this response and store it in your secret manager. Avoid logging it or including it in shared examples. This rotates the default key slot; separately named keys are managed in your account. ## Retries and recovery Do not automatically repeat a rotation after a lost response: another successful rotation replaces the key again. Check your account's key controls to recover access, then update your integrations. Use the new key in `X-Key` for subsequent requests. [Read the authentication guide](/api-reference/v2/authentication) for setup. # Cancel Company Export Source: https://docs.revenuebase.ai/api-reference/cancel-company-export /api-reference/v2/contact-openapi.json delete /company/exports/{export_id} Ask an unfinished company export to stop. ## Credits and plans PAYG is Pay-as-you-go. AYCE is All-you-can-eat. | Usage | PAYG | AYCE | | - | - | - | | Cancellation request | **Free** 0 credits | **Free** 0 credits | ## When to use this endpoint Stop a company export that is queued or writing rows. Cancellation adds no charge, and unfinished work releases its reservation when it ends. ## Example Set `REVENUEBASE_EXPORT_ID` to the `exportId` returned by Start Export. Use a job created by this API key's account. Set `REVENUEBASE_API_KEY` to your API key. ```bash curl --request DELETE "https://api.revenuebase.ai/v2/contact/company/exports/$REVENUEBASE_EXPORT_ID" \ --header "X-Key: $REVENUEBASE_API_KEY" ``` ## Read the status | Status | Meaning | | - | - | | `QUEUED` | Waiting to run; keep polling. | | `PROCESSING` | Writing records; keep polling. | | `FINALIZING` | Finishing the retrieval; keep polling. | | `CANCELLING` | A stop was requested; keep polling. | | `COMPLETED` | Download the file using downloadUrl. | | `ERROR` | Read error and code; stop polling. | | `CANCELLED` | The export stopped; stop polling. | Cancellation requests are idempotent. A finished export returns its existing terminal status. A completed export is not refunded; wait for an unfinished cancellation to reach a terminal state. ## Errors and next steps A missing export or one you do not own returns 404. Use the identifier from the start response. [Read status](/api-reference/company-export-status) until the job ends. # Cancel Export Source: https://docs.revenuebase.ai/api-reference/cancel-export /api-reference/v2/contact-openapi.json delete /exports/{export_id} Ask an unfinished contact export to stop. ## Credits and plans PAYG is Pay-as-you-go. AYCE is All-you-can-eat. | Usage | PAYG | AYCE | | - | - | - | | Cancellation request | **Free** 0 credits | **Free** 0 credits | ## When to use this endpoint Stop a contact export that is queued or writing rows. Cancellation adds no charge. An unfinished failed or cancelled export releases its held credits when it ends. ## Example Set `REVENUEBASE_EXPORT_ID` to the `exportId` returned by Start Export. Use a job created by this API key's account. Set `REVENUEBASE_API_KEY` to your API key. ```bash curl --request DELETE "https://api.revenuebase.ai/v2/contact/exports/$REVENUEBASE_EXPORT_ID" \ --header "X-Key: $REVENUEBASE_API_KEY" ``` ## Read the status | Status | What to do | | - | - | | `QUEUED` | Waiting to run; keep polling. | | `PROCESSING` | Writing the file; keep polling. | | `FINALIZING` | Finishing the retrieval; keep polling. | | `CANCELLING` | A stop was requested; keep polling. | | `COMPLETED` | Download the file. | | `ERROR` | Read error and code; stop polling. | | `CANCELLED` | The export stopped; stop polling. | ## Confirm the cancellation A queued or running export moves to CANCELLING, then ends. The request does not guarantee an immediate stop. Re-read [Export Status](/api-reference/export-status) until a terminal state. Cancellation is idempotent. A finished export returns its existing terminal status. Cancelling a completed export does not refund its charge. ## Errors and retries An unknown export or one you do not own returns 404. Confirm the ID from the start response. Poll every 5 to 10 seconds and slow down for longer jobs. Contact and company routes share the [default 10 requests per second per user](/api-reference/v2/rate-limits). Wait for the reset time or Retry-After when rate limited; coordinate requests across your workers and API keys. Keep polling through FINALIZING. Stop on COMPLETED, ERROR, or CANCELLED. Read error and code before correcting a failed request. Repeating the original start POST creates another job and can charge again. ## Next steps [Check export status](/api-reference/export-status) until it ends. # Column Values Source: https://docs.revenuebase.ai/api-reference/column-values /api-reference/v2/contact-openapi.json get /columns/{column}/values Get or search the options for one enumerable contact field. ## Credits and plans PAYG is Pay-as-you-go. AYCE is All-you-can-eat. | Usage | PAYG | AYCE | | - | - | - | | Vocabulary lookup | **Free** 0 credits | **Free** 0 credits | ## When to use Column Values Populate one filter picker or search its bounded vocabulary. Choose a field marked as enumerable in [Columns](/api-reference/columns). ## Example Set `REVENUEBASE_API_KEY` to your API key. ```bash curl --request GET 'https://api.revenuebase.ai/v2/contact/columns/COUNTRY_CODE_PER/values?limit=5' \ --header "X-Key: $REVENUEBASE_API_KEY" ``` Response captured from the local test API on October 13, 2026. Results can change as the dataset or account changes. ```json { "column": "COUNTRY_CODE_PER", "values": [ "AD", "AE", "AF", "AG", "AI" ], "truncated": true, "limit": 5, "multiselect": true } ``` ## Read the result | Field or input | Meaning | | - | - | | `column` | Canonical name of the requested field. | | `values` | Returned field values; use them in eq or in conditions. | | `truncated` | True means more options exist than were returned. | | `limit` | Applied vocabulary cap. Omit it to use the field’s valueLimit; a requested value is clamped to that cap. | | `search` | Optional query parameter narrowing the returned options. | | `multiselect` | Whether the field supports a multiselect picker. | ## Errors and limits An unknown field returns 404. Open-ended fields, such as JOB\_TITLE\_PER or COMPANY\_NAME\_ORG, return 422 COLUMN\_NOT\_ENUMERABLE; filter these fields with contains instead. This endpoint has no page cursor. A truncated list is not the full vocabulary. For all available picker values at once, request Columns with include=values. Contact and company routes share the [default 10 requests per second per user](/api-reference/v2/rate-limits). Wait for the reset time or Retry-After when rate limited; coordinate requests across your workers and API keys. ## Next steps Use the values in [a filter](/api-reference/v2/search-filters), then [Count](/api-reference/count) or [View](/api-reference/view) the audience. # Columns Source: https://docs.revenuebase.ai/api-reference/columns /api-reference/v2/contact-openapi.json get /columns Discover supported contact fields, default projections, and filter-picker values. ## Credits and plans PAYG is Pay-as-you-go. AYCE is All-you-can-eat. | Usage | PAYG | AYCE | | - | - | - | | Column catalog and embedded values | **Free** 0 credits | **Free** 0 credits | ## When to use Columns Discover supported fields before writing a filter or choosing output columns. This catalog covers person, job, and company fields available on contact records. Use [Company Columns](/api-reference/company-columns) for company-only requests. ## Example Set `REVENUEBASE_API_KEY` to your API key. ```bash curl --request GET 'https://api.revenuebase.ai/v2/contact/columns?include=values' \ --header "X-Key: $REVENUEBASE_API_KEY" ``` Response excerpt captured from the local test API on October 13, 2026. One catalog entry is shown; the actual response includes the other fields. ```json { "columns": [ { "columnName": "JOB_LEVEL_PER", "humanName": "Job Level", "sourceType": "LowCardinality(Nullable(String))", "multiselect": true, "valueLimit": 50, "distinctValues": [ "C-Team", "Director", "Manager", "Other", "Staff", "VP" ], "distinctValuesTruncated": false } ], "previewDefaultLimit": 1000, "previewMaxLimit": 50000, "exportMaxRows": 1000000, "valuesIncluded": true } ``` ## Read the catalog | Field | Meaning | | - | - | | `columns` | Field metadata, including columnName, humanName, sourceType, and filter behavior. | | `defaultColumns` | Default contact Preview projection. Set columns explicitly when you need a specific response. | | `multiselectColumns` | Enumerable fields suitable for a filter picker. | | `valueLimit` | Vocabulary cap on an enumerable field. | | `distinctValues` | Embedded options for a picker field when include=values is requested. | | `distinctValuesTruncated` | True if the embedded vocabulary is incomplete. | | `previewDefaultLimit`, `previewMaxLimit`, `exportMaxRows` | Current retrieval defaults and caps. | | `valuesIncluded` | True when embedded vocabularies were requested. | The example is an excerpt; the actual catalog contains additional fields. sourceType describes the source field type. snowflakeType is a legacy alias of the same value. ## Fetch picker values in one request Without include=values, the request returns field metadata. Add include=values to warm all available filter pickers in one call instead of making a separate request for every field. Cache the catalog in your application and refresh it periodically. X-Cache reports a cache hit or miss when present. Open-ended text, such as job titles and company names, is searched rather than enumerated. For one bounded vocabulary, use [Column Values](/api-reference/column-values). ## Limits and next steps Contact and company routes share the [default 10 requests per second per user](/api-reference/v2/rate-limits). Wait for the reset time or Retry-After when rate limited; coordinate requests across your workers and API keys. Build a [search filter](/api-reference/v2/search-filters) from the returned fields, then [Count](/api-reference/count) the audience. # Company Column Values Source: https://docs.revenuebase.ai/api-reference/company-column-values /api-reference/v2/contact-openapi.json get /company/columns/{column}/values Get the available options for one enumerable company field. ## Credits and plans PAYG is Pay-as-you-go. AYCE is All-you-can-eat. | Usage | PAYG | AYCE | | - | - | - | | Metadata request | **Free** 0 credits | **Free** 0 credits | ## When to use Company Column Values Populate a filter picker or search a bounded vocabulary, such as country codes. Choose an enumerable field from Company Columns. ## Example Set `REVENUEBASE_API_KEY` to your API key. ```bash curl --request GET 'https://api.revenuebase.ai/v2/contact/company/columns/COUNTRY_CODE_ORG/values?limit=5' \ --header "X-Key: $REVENUEBASE_API_KEY" ``` Response captured from the local test API on October 13, 2026. Results can change as the dataset or account changes. ```json { "column": "COUNTRY_CODE_ORG", "values": [ "AD", "AE", "AF", "AG", "AI" ], "truncated": true, "limit": 5, "multiselect": true } ``` ## Read the result and options values lists the returned options. column is the canonical field name; limit is the applied cap; truncated=true means more values exist. The optional search input narrows results, and limit is clamped to the field's own valueLimit. Omit limit to use that cap. Open-ended text fields such as company names are not enumerable and return 422 COLUMN\_NOT\_ENUMERABLE. Use contains in a filter for those fields. An unknown field returns 404. For all picker vocabularies, use Company Columns with include=values. ## Errors and retries Correct unsupported fields or filters before retrying a 400 or 422 response. If a 429 response is returned, wait for Retry-After. Contact and company routes share the [default 10 requests per second per user](/api-reference/v2/rate-limits). ## Next steps Use these values in [a company filter](/api-reference/v2/search-filters), then [Company Count](/api-reference/company-count). # Company Columns Source: https://docs.revenuebase.ai/api-reference/company-columns /api-reference/v2/contact-openapi.json get /company/columns Discover the company fields and filter options available to your integration. ## Credits and plans PAYG is Pay-as-you-go. AYCE is All-you-can-eat. | Usage | PAYG | AYCE | | - | - | - | | Metadata request | **Free** 0 credits | **Free** 0 credits | ## When to use Company Columns Discover supported company fields before building a filter or selecting output columns. Use include=values to fetch all available picker vocabularies in one request. ## Example Set `REVENUEBASE_API_KEY` to your API key. ```bash curl --request GET 'https://api.revenuebase.ai/v2/contact/company/columns?include=values' \ --header "X-Key: $REVENUEBASE_API_KEY" ``` Response excerpt captured from the local test API on October 13, 2026. One catalog entry is shown; the actual response includes the other fields. ```json { "columns": [ { "columnName": "EMPLOYEE_COUNT_RANGE_ORG", "humanName": "Employee Linkedin Count Range", "sourceType": "LowCardinality(Nullable(String))", "multiselect": true, "valueLimit": 50, "distinctValues": [ "1 to 10", "10001+", "1001 to 5000", "11 to 50", "201 to 500", "5001 to 10000", "501 to 1000", "51 to 200" ], "distinctValuesTruncated": false } ], "previewDefaultLimit": 1000, "previewMaxLimit": 50000, "exportMaxRows": 1000000, "valuesIncluded": true } ``` ## Read the catalog columns contains field metadata such as columnName, humanName, sourceType, and supported filter behavior. defaultColumns is the default company projection. multiselectColumns identifies picker fields; valueLimit gives each field's vocabulary cap. valuesIncluded=true confirms embedded vocabularies were requested. previewDefaultLimit, previewMaxLimit, and exportMaxRows report retrieval limits. Choose fields from this catalog for company Preview, Insights, and Enrich. Company Count and Export can also use contact conditions to select companies represented by those contacts. ## Errors and retries Correct unsupported fields or filters before retrying a 400 or 422 response. If a 429 response is returned, wait for Retry-After. Contact and company routes share the [default 10 requests per second per user](/api-reference/v2/rate-limits). ## Next steps [Get values for one field](/api-reference/company-column-values), or [count a company audience](/api-reference/company-count). # Company Count Source: https://docs.revenuebase.ai/api-reference/company-count /api-reference/v2/contact-openapi.json post /company/count Find the number of companies in an audience and the contact coverage at those companies. ## Credits and plans PAYG is Pay-as-you-go. AYCE is All-you-can-eat. | Usage | PAYG | AYCE | | - | - | - | | Count, including SmartSearch | **Free** 0 credits | **Free** 0 credits | Company records are deduplicated to one search row per `RBID_ORG`. If you need company fields alongside individual people, contact records already include their available company data; requesting those fields does not add a separate company-row charge. ## When to use Company Count * Size a company audience before retrieving rows. * Compare company criteria without spending credits. * Count distinct companies represented by contacts who meet job or person criteria. ## Example Set `REVENUEBASE_API_KEY` to your API key. ```bash curl --request POST 'https://api.revenuebase.ai/v2/contact/company/count' \ --header "X-Key: $REVENUEBASE_API_KEY" \ --header 'Content-Type: application/json' \ --data '{ "filter": { "type": "group", "op": "AND", "children": [ { "type": "condition", "column": "HEADQUARTERS_COUNTRY_NAME_ORG", "operator": "eq", "value": "United States" } ] } }' ``` Response captured from the local test API on October 13, 2026. Results can change as the dataset or account changes. ```json { "companies": 7042375, "contacts": 123034089, "contactsWithEmail": 28863408, "contactsWithCellphone": 36525227 } ``` ## Read the result | Field | Meaning | | - | - | | `companies` | Exact number of matching companies. | | `contacts` | Total contact rows at the selected companies, when available. | | `contactsWithEmail` | Contacts with an email at those companies, when available. | | `contactsWithCellphone` | Contacts with a mobile at those companies, when available. | Person or job filters select the companies of matching contacts. The returned contact totals still include all contacts at each selected company, not just the contacts matching those conditions. Optional totals are omitted when the dataset lacks them. ## Options and limits Reuse the filter for [Company Export](/api-reference/start-company-export). Company Count accepts company and contact criteria. `mode` is accepted for compatibility with Contact Count but does not change the result: company counts are exact. Omitting filter searches the whole company dataset. ## Errors and retries Correct unsupported fields or filters before retrying a 400 or 422 response. If a 429 response is returned, wait for Retry-After. Contact and company routes share the [default 10 requests per second per user](/api-reference/v2/rate-limits). ## Next steps [Company Preview](/api-reference/company-preview) returns a small inline list using company criteria. For a company list selected by person or job conditions, use [Company Estimate](/api-reference/estimate-company-export) and [Company Export](/api-reference/start-company-export). # Company Enrich Source: https://docs.revenuebase.ai/api-reference/company-enrich /api-reference/v2/contact-openapi.json post /company/enrich Retrieve company records for domains, LinkedIn URLs, or company identifiers you already have. ## Credits and plans PAYG is Pay-as-you-go. AYCE is All-you-can-eat. | Usage | PAYG | AYCE | | - | - | - | | Returned company match | **1 credit per match** | **Unlimited** 0 credits | | Selected company fields | Included in the row price | **Included** 0 credits | | Input identifiers | **10,000** combined | **10,000** combined | ## When to use Company Enrich Use a known list of domains, company LinkedIn URLs, or RBID\_ORGs. Send the list in one JSON request; no file upload is required. This retrieves stored company data. It does not verify a person's email address. ## Example Set `REVENUEBASE_API_KEY` to your API key. ```bash curl --request POST 'https://api.revenuebase.ai/v2/contact/company/enrich' \ --header "X-Key: $REVENUEBASE_API_KEY" \ --header 'Content-Type: application/json' \ --data '{ "domains": [ "stripe.com", "docs-example-no-match.invalid" ], "columns": [ "RBID_ORG", "COMPANY_NAME_ORG", "DOMAIN_ORG" ] }' ``` Response captured from the local test API on October 13, 2026 using an AYCE account. Results can change as the dataset or account changes. ```json { "matches": { "stripe.com": { "DOMAIN_ORG": "stripe.com", "RBID_ORG": "rb-oacwbixtv", "COMPANY_NAME_ORG": "Stripe" } }, "columns": [ "DOMAIN_ORG", "RBID_ORG", "COMPANY_NAME_ORG" ], "matched": 1, "total": 2 } ``` ## Read the matches | Field | Meaning | | - | - | | `matches` | Objects keyed by normalized input identifiers. Unmatched inputs are omitted. | | `matched` | Returned match entries, rather than necessarily distinct companies. | | `total` | Accepted distinct identifiers after normalization and deduplication. | | `columns` | Returned field names, including lookup keys and the company ID. | The request submits two domains and finds one match. On PAYG, it would hold **2 credits** and settle **1 credit**. The AYCE capture used **0 credits**. The .invalid domain deliberately demonstrates an unmatched input; replace both domains with your own list. ## Inputs and fields | Input | Meaning | | - | - | | `domains` | Company domains. Normalized to lowercase bare hosts; common URL prefixes and paths are removed. | | `linkedinUrls` | Company LinkedIn URLs. Lowercased and trailing slash removed; use the complete company URL. | | `rbidOrgs` | Company identifiers from a company result. Trimmed and lowercased. | | `columns` | Request fields explicitly. Omitted or empty returns lookup keys and the company ID. `["*"]` expands to all company catalog fields. | The **10,000-identifier maximum is combined across all three lists**, after normalization and deduplication. Supplying no valid identifiers or exceeding the cap returns 400. ## Control the hold and final charge PAYG reserves one credit per submitted array entry before normalization or deduplication. Have enough balance for that hold. The final charge is one credit per returned match; unused held credits are released. Unmatched inputs add no row charge. There is no SmartSearch fee. Deduplicate your input before sending it. The same company supplied as both a domain and a LinkedIn URL can produce two match entries and two row charges. Prefer one identifier per company when possible. Repeating a paid request can charge again. ## Errors and next steps A 402 response means the balance cannot cover the hold; reduce your input or add credits. Respect Retry-After for transient credit-service or rate-limit failures. Use [Company Count](/api-reference/company-count) to discover an audience by criteria, or [Company Export](/api-reference/start-company-export) for a file. # Company Export Status Source: https://docs.revenuebase.ai/api-reference/company-export-status /api-reference/v2/contact-openapi.json get /company/exports/{export_id} Follow a company file job and get its completed download link. ## Credits and plans PAYG is Pay-as-you-go. AYCE is All-you-can-eat. | Usage | PAYG | AYCE | | - | - | - | | Status and download-link refresh | **Free** 0 credits | **Free** 0 credits | ## When to use this endpoint Follow the exportId returned by Start Company Export. Reading status is free and does not run the search again. ## Example Set `REVENUEBASE_EXPORT_ID` to the `exportId` returned by Start Export. Use a job created by this API key's account. Set `REVENUEBASE_API_KEY` to your API key. ```bash curl --request GET "https://api.revenuebase.ai/v2/contact/company/exports/$REVENUEBASE_EXPORT_ID" \ --header "X-Key: $REVENUEBASE_API_KEY" ``` ## Read the status | Status | Meaning | | - | - | | `QUEUED` | Waiting to run; keep polling. | | `PROCESSING` | Writing records; keep polling. | | `FINALIZING` | Finishing the retrieval; keep polling. | | `CANCELLING` | A stop was requested; keep polling. | | `COMPLETED` | Download the file using downloadUrl. | | `ERROR` | Read error and code; stop polling. | | `CANCELLED` | The export stopped; stop polling. | On COMPLETED, rowCount reports written rows and downloadUrl points to the file. expiresInSeconds reports the link lifetime, normally 3,600 seconds. Re-read status to refresh an expired link. The body does not report the final charged-credit total. ## Errors and next steps A missing export or one you do not own returns 404. Use the identifier from the start response. [Cancel an unfinished export](/api-reference/cancel-company-export) if you no longer need it. Contact and company exports use their own export paths; Email Verification batches use numeric process\_id job endpoints. # Company Insights Source: https://docs.revenuebase.ai/api-reference/company-insights /api-reference/v2/contact-openapi.json post /company/insights Analyze the composition and field availability of a company audience. ## Credits and plans PAYG is Pay-as-you-go. AYCE is All-you-can-eat. | Usage | PAYG | AYCE | | - | - | - | | Analysis, including SmartSearch | **Free** 0 credits | **Free** 0 credits | ## When to use Company Insights Check industry, location, or employee-size distribution before retrieving companies, or find how often the fields you need are populated. Insights analyzes the filtered audience, rather than a Preview sample. ## Example Set `REVENUEBASE_API_KEY` to your API key. ```bash curl --request POST 'https://api.revenuebase.ai/v2/contact/company/insights' \ --header "X-Key: $REVENUEBASE_API_KEY" \ --header 'Content-Type: application/json' \ --data '{ "filter": { "type": "group", "op": "AND", "children": [ { "type": "condition", "column": "HEADQUARTERS_COUNTRY_NAME_ORG", "operator": "eq", "value": "United States" } ] }, "section": "fillRate", "fields": [ "DOMAIN_ORG", "LINKEDIN_URL_ORG" ] }' ``` Response captured from the local test API on October 13, 2026. Results can change as the dataset or account changes. ```json { "section": "fillRate", "fillRates": [ { "field": "DOMAIN_ORG", "total": 7042375, "populated": 5377353 }, { "field": "LINKEDIN_URL_ORG", "total": 7042375, "populated": 7042375 } ] } ``` ## Choose one section | section | Purpose | Result | | - | - | - | | `coverage` | Group the audience by a company field. | coverage.groupField and grouped rows with companies and available contact totals. | | `fillRate` | Measure availability of selected fields. | fillRates entries with field, total, and populated counts. | Use these exact case-sensitive section values. Person reachability and freshness sections are available on [Contact Insights](/api-reference/insights). For company contact totals, use [Company Count](/api-reference/company-count). ## Options and limits * Use company filters and fields from [Company Columns](/api-reference/company-columns). Person and job filters are unsupported. * For coverage, groupField defaults to EMPLOYEE\_COUNT\_RANGE\_ORG. Smaller categories can be combined as Other. * For fillRate, provide fields explicitly. The service uses up to 12 recognized, distinct fields; no usable fields produces an empty fillRates list. * Calculate a fill percentage as populated / total when total is greater than zero. These are counts, not returned company records. ## Errors and retries Correct unsupported fields or filters before retrying a 400 or 422 response. If a 429 response is returned, wait for Retry-After. Contact and company routes share the [default 10 requests per second per user](/api-reference/v2/rate-limits). ## Next steps Retrieve [inline companies](/api-reference/company-preview) or [estimate a file](/api-reference/estimate-company-export) using the same company filter. # Company Preview Source: https://docs.revenuebase.ai/api-reference/company-preview /api-reference/v2/contact-openapi.json post /company/preview Return matching company records directly in the API response. ## Credits and plans PAYG is Pay-as-you-go. AYCE is All-you-can-eat. | Usage | PAYG | AYCE | | - | - | - | | Company records | **Free** Shared 500-row organization daily allowance | **Unlimited** 0 credits | | Rows per request | Up to the remaining daily allowance | **50,000** maximum | Company records are deduplicated to one search row per `RBID_ORG`. If you need company fields alongside individual people, contact records already include their available company data; requesting those fields does not add a separate company-row charge. PAYG has a shared allowance of **500 free preview rows per organization per UTC day** across Contact View, Company View, and Company Preview. All members and API keys share it. Each returned row counts, including repeated previews; empty and failed queries do not. SmartSearch adds no credit charge on these free previews. The allowance resets at 00:00 UTC. AYCE has no daily preview allowance; per-request limits still apply. The response reports `X-Credits-Charged: 0` and `X-FreePreview-Remaining` on PAYG. Near the daily boundary, only remaining rows are returned, with a warning. At exhaustion, `429 FREE_PREVIEW_CAP_REACHED` is returned without rows or a credit charge. Wait until UTC midnight or explicitly choose a paid company export. `503 FREE_PREVIEW_UNAVAILABLE` means the allowance could not be verified; retry later. Counts do not consume preview allowance. ## When to use Company Preview Inspect a company list or retrieve an immediate batch of company records. For a downloadable file or a company audience selected through contact criteria, choose [Company Export](/api-reference/start-company-export). ## Example Set `REVENUEBASE_API_KEY` to your API key. ```bash curl --request POST 'https://api.revenuebase.ai/v2/contact/company/preview' \ --header "X-Key: $REVENUEBASE_API_KEY" \ --header 'Content-Type: application/json' \ --data '{ "filter": { "type": "group", "op": "AND", "children": [ { "type": "condition", "column": "HEADQUARTERS_COUNTRY_NAME_ORG", "operator": "eq", "value": "United States" } ] }, "columns": [ "RBID_ORG", "COMPANY_NAME_ORG", "DOMAIN_ORG" ], "limit": 2 }' ``` Response captured from the local test API on October 13, 2026 using an AYCE account. Results can change as the dataset or account changes. ```json { "rows": [ { "RBID_ORG": "rb-oacrey5u7", "COMPANY_NAME_ORG": "Bike Mart", "DOMAIN_ORG": "bikemart.com" }, { "RBID_ORG": "rb-oacrey7is", "COMPANY_NAME_ORG": "Fashion After 50.Com", "DOMAIN_ORG": null } ], "columns": [ "RBID_ORG", "COMPANY_NAME_ORG", "DOMAIN_ORG" ], "columnLabels": { "RBID_ORG": "Rbid Organization", "COMPANY_NAME_ORG": "Company Name", "DOMAIN_ORG": "Organization Domain" }, "rowCount": 2, "limit": 2 } ``` ## Read the response `rows` contains company objects. `rowCount` reports how many were returned; `limit` is the applied row cap. `columns` and `columnLabels` identify the returned fields. The list can be shorter than the limit. There is no pagination cursor or guaranteed order for ordinary requests. ## Options and limits | Option | Use it for | | - | - | | `filter` | Company criteria, including company-description SmartSearch or a company lookalike filter. Person and job conditions are unsupported here. | | `columns` | Select company fields; omitted or empty uses the company defaults. `["*"]` returns all company catalog fields. | | `limit` | 1,000 by default, clamped to 1 through 50,000 and further limited to the remaining daily allowance on PAYG. Choose a small explicit limit to inspect results. | | `includeScores` | Add available SmartSearch similarity details. Scores can be omitted with scoresOmitted=true. | | `reveal` | Accepted for compatibility; does not control company fields or apply contact email/mobile pricing. | ## Errors and retries Correct unsupported fields or filters before retrying a 400 or 422 response. If a 429 response is returned, wait for Retry-After. Contact and company routes share the [default 10 requests per second per user](/api-reference/v2/rate-limits). ## Next steps [Company Insights](/api-reference/company-insights) summarizes this audience. [Company Enrich](/api-reference/company-enrich) retrieves known company identifiers; [Company Export](/api-reference/start-company-export) creates a file. # Company Stats Source: https://docs.revenuebase.ai/api-reference/company-stats /api-reference/v2/contact-openapi.json get /company/stats Read whole-dataset company totals and key-field coverage. ## Credits and plans PAYG is Pay-as-you-go. AYCE is All-you-can-eat. | Usage | PAYG | AYCE | | - | - | - | | Metadata request | **Free** 0 credits | **Free** 0 credits | ## When to use Company Stats Read a dataset-wide summary of company coverage. These totals cover the company dataset used by the Contact and Company APIs. > [!NOTE] > > Company Stats does not accept audience filters. Use [Company Count](/api-reference/company-count) to count matching companies, or [Company Insights](/api-reference/company-insights) to measure field coverage within a filtered audience. ## Example Set `REVENUEBASE_API_KEY` to your API key. ```bash curl --request GET 'https://api.revenuebase.ai/v2/contact/company/stats' \ --header "X-Key: $REVENUEBASE_API_KEY" ``` Response captured from the local test API on October 13, 2026. Results can change as the dataset or account changes. ```json { "companies": 21337431, "withDomain": 16599854, "withLinkedinUrl": 21337431, "withAboutUs": 12862771, "contacts": 341045421 } ``` ## Read the totals companies is the number of company records. Optional withDomain, withLinkedinUrl, and withAboutUs report populated company fields. contacts sums contact rows represented by the company dataset. Fields can be omitted when the underlying catalog does not include them. These are whole-dataset totals, with no filter or individual company records. Responses can be cached; X-Cache indicates a cache hit or miss when supplied. ## Errors and retries This GET request has no filter or body. If a 429 response is returned, wait for Retry-After. Contact and company routes share the [default 10 requests per second per user](/api-reference/v2/rate-limits). ## Next steps [Company Count](/api-reference/company-count) measures a filtered audience; [Company Insights](/api-reference/company-insights) analyzes its composition and field fill rates. # Count matching contacts Source: https://docs.revenuebase.ai/api-reference/count /api-reference/v2/contact-openapi.json post /count Find the size of an audience and the availability of email and mobile details. ## Credits and plans PAYG is Pay-as-you-go. AYCE is All-you-can-eat. | Usage | PAYG | AYCE | | - | - | - | | Count request, including SmartSearch filters | **Free** 0 credits | **Included** 0 credits | Use Count to find how many contact rows match your audience before you decide whether to retrieve them. It also reports how many matching rows have an email or mobile number. ## When to use Count * Size an audience before downloading records. * Compare filters without spending credits. * Check email or mobile availability before choosing what to reveal. Count returns numbers, rather than names or contact details. Use [View](/api-reference/view) to inspect a free masked sample, or [Insights](/api-reference/insights) for audience composition and freshness. ## Example: size an audience This request counts VPs located in the United States. Get your API key from the [RevenueBase dashboard](https://app.revenuebase.ai/dashboard) and set it as `REVENUEBASE_API_KEY` before running the example. ```bash curl --request POST 'https://api.revenuebase.ai/v2/contact/count' \ --header "X-Key: $REVENUEBASE_API_KEY" \ --header 'Content-Type: application/json' \ --data '{ "filter": { "type": "group", "op": "AND", "children": [ { "type": "condition", "column": "COUNTRY_NAME_PER", "operator": "eq", "value": "United States" }, { "type": "condition", "column": "JOB_LEVEL_PER", "operator": "eq", "value": "VP" } ] }, "mode": "fast" }' ``` Response captured from the local test API on October 13, 2026. Results can change as the dataset or account changes. ```json { "total": 1318125, "companies": 323960, "withEmail": 567221, "withCellphone": 742003, "exact": { "total": true, "companies": false, "withEmail": false, "withCellphone": false }, "mode": "fast" } ``` | Field | What it means | | - | - | | `total` | Matching contact rows. Always exact. A row represents a person at a company, so this is not a distinct-person count. | | `companies` | Distinct companies represented in those rows. | | `withEmail` | Matching contact rows with an email address. | | `withCellphone` | Matching contact rows with a mobile number. | | `exact` | Whether each reported figure is exact. Treat `false` values as estimates. | | `mode` | `fast` by default; use `exact` for precise distinct-company and availability counts. Exact mode can take longer. | ## Limits and errors Count uses the shared [filter limits](/api-reference/v2/contact-api-overview#what-you-send). A `422` means the filter or column needs correction. On a `429`, wait until `X-RateLimit-Reset` before retrying. An empty audience returns zero counts and costs 0 credits. Omitting `filter`, or sending `null`, counts the entire dataset. If you need a count of accounts, use [Company Count](/api-reference/company-count). ## Next: inspect the audience for free Send the **same filter** to [View](/api-reference/view). Keep refining until the sample looks right, then [estimate an export](/api-reference/estimate-export) with an explicit row cap and contact-data choices. # Credit Prices Source: https://docs.revenuebase.ai/api-reference/credit-prices /api-reference/v2/contact-openapi.json get /credits/prices Read the current unit prices for contact and company retrieval. ## Credits and plans PAYG is Pay-as-you-go. AYCE is All-you-can-eat. | Usage | PAYG | AYCE | | - | - | - | | Price catalog lookup | **Free** 0 credits | **Free** 0 credits | ## When to use Credit Prices Calculate retrieval costs or a maximum hold in your application using the current unit rates. Reading these prices does not reserve or spend credits. ## Example Set `REVENUEBASE_API_KEY` to your API key. ```bash curl --request GET 'https://api.revenuebase.ai/v2/contact/credits/prices' \ --header "X-Key: $REVENUEBASE_API_KEY" ``` Response captured from the local test API on October 13, 2026. Results can change as the dataset or account changes. ```json { "contactRow": 1, "companyRow": 1, "email": 1, "mobile": 10, "smartField": 10 } ``` ## Read the chart | Field | Current PAYG price | Applies to | | - | - | - | | `contactRow` | **1 credit** | Each returned contact row or Enrich match. | | `companyRow` | **1 credit** | Each returned Company Enrich match or exported company row. | | `email` | **+1 credit** | Each populated selected revealed contact email. | | `mobile` | **+10 credits** | Each populated selected revealed contact mobile. | | `smartField` | **+10 credits** | Each semantic or lookalike filter node in a paid request. | The price catalog returns unit rates on both plans. AYCE includes unlimited contact and company retrieval at 0 credits; this endpoint is not an entitlement lookup. Free Count, View, Insights, and Estimate do not become paid because the catalog includes a SmartSearch rate. ## Estimate and reserve Use [Estimate](/api-reference/estimate-export) or [Company Estimate](/api-reference/estimate-company-export) for a filtered file forecast. An estimate can be smaller than the reservation required to start a job. Use the row cap and selected details to calculate the upper bound, and check [your balance](/api-reference/account/get-your-remaining-credit-balance). See [Credits & Plans](/api-reference/v2/credits) for missing-value charges, reveal defaults, holds, and repeated requests. Email Verification has its [own per-result chart](/api-reference/v2/email-verification-overview#credits-and-plans). ## Next steps Refresh rates before presenting a price calculation, then choose explicit row and reveal limits for the retrieval request. # Developer SDK Source: https://docs.revenuebase.ai/api-reference/developer-tools/developer-sdk Official Python SDK for integrating RevenueBase into your application. The RevenueBase Python SDK handles authentication, retries, and response parsing so you can focus on your application logic. ## Installation Python Install via `pip install revenuebase-sdk` ```bash theme={null} pip install revenuebase-sdk ``` ## Quick start ```python theme={null} from revenuebase_sdk import RevenuebaseClient client = RevenuebaseClient() result = client.email.verify(email="user@example.com") print(result.status) ``` ## Configuration The SDK reads from the `REVENUEBASE_API_KEY` environment variable automatically. You don't need to pass the key explicitly if it's set in your environment. ## Request an SDK for another language We currently support Python. If you'd like an SDK for another language, let us know and we'll prioritize based on demand. Request a language Email [developers@revenuebase.ai](mailto:developers@revenuebase.ai) with the language you need. ## Resources * [Authentication](/api-reference/v2/authentication) — API key setup * [Rate limits](/api-reference/v2/rate-limits) — Request limits and retry guidance * [API reference](/api-reference/v2/overview) — Full endpoint documentation # Low Code Tools Source: https://docs.revenuebase.ai/api-reference/developer-tools/low-code-tools Connect RevenueBase to your workflows without writing code. Use RevenueBase in no-code and low-code platforms to enrich data, trigger automations, and sync contacts — without building a custom integration. ## Native Low-Code Integrations n8n Use the native RevenueBase node in n8n to verify emails, resolve companies, and enrich contact data in your workflows. ## Others: Using the HTTP API directly Any low code platform that supports HTTP requests can connect to RevenueBase (such as Zapier, Make, ActivePieces, etc). Use these settings: | Field | Value | | - | - | | Base URL | `https://api.revenuebase.ai` | | Auth header | `x-key: your-api-key` | | Content type | `application/json` | See the [API reference](/api-reference/v2/overview) for available endpoints and request formats. ## Resources * [Authentication](/api-reference/v2/authentication) — API key setup * [Email Verification](/api-reference/v2/email-verification-overview) — Verify emails in bulk or one at a time # Upload a batch file for email verification Source: https://docs.revenuebase.ai/api-reference/email/upload-a-batch-file-for-email-verification /api-reference/v2/email-openapi.json post /v2/email/verify/batch Submit an email list for verification and retrieve the results when the job finishes. ## Credits and plans PAYG is Pay-as-you-go. AYCE is All-you-can-eat. Email verification uses the same per-result prices on both plans. | Result or option | PAYG | AYCE | | - | - | - | | Valid result | **1 credit** | **1 credit** | | Invalid result | **1 credit** | **1 credit** | | Unknown result | **Free** 0 credits | **Free** 0 credits | | Metadata | **Included** No extra cost | **Included** No extra cost | Uploading the file adds **0 credits**. Verification is charged while the job is processed: one credit for each Valid or Invalid result. **Metadata adds no cost.** ## When to use this endpoint Use one upload for a large list instead of making a single-address call for every row. The batch runs asynchronously and returns a numeric `process_id` for the [Utilities job endpoints](/api-reference/jobs/get-batch-job-status). ## Prepare your file Supply a UTF-8 `.csv` or `.json` file with an `email` field. Keep your own reference column when you need to reconnect results to your records; output order can differ from input order. ```csv emails.csv contact_id,email rb-pab23456t-rb-oadkxzpcq,mtobin@ecapital.com rb-pab2346sr-rb-oacopeifk,katherine.collins@travelers.com ``` Or use JSON records: ```json emails.json [ {"contact_id":"rb-pab23456t-rb-oadkxzpcq","email":"mtobin@ecapital.com"}, {"contact_id":"rb-pab2346sr-rb-oacopeifk","email":"katherine.collins@travelers.com"} ] ``` The input records below come from the captured [Contact Enrich example](/api-reference/enrich). Replace them with your own list. Verification results are returned by your batch; the input email addresses are not a promise of a Valid result. ## Example Set `REVENUEBASE_API_KEY` to your API key. ```bash curl --request POST 'https://api.revenuebase.ai/v2/email/verify/batch?metadata=true' \ --header "X-Key: $REVENUEBASE_API_KEY" \ --form 'requested_file=@emails.csv' ``` ## Read the response | Field | Meaning | | - | - | | `process_id` | Numeric job identifier. Save it for polling, cancellation, and downloads. | | `filename` | Stored input filename. | | `status` | PROCESSING QUEUED means the upload was accepted. Read current\_status from the status endpoint for the subsequent job state. | ## Options, limits, and budget * Submit up to **300,000 input rows per file** for a standard account. Larger files fail during processing. * Set `metadata=true` in the query string to include metadata in the output file. The default is false. * Budget one available credit per input row before starting. A job can fail with insufficient credits even though some eventual results would be free. * The final verification charge is **Valid results + Invalid results**. Metadata has no surcharge. * Repeated submissions create new jobs and can charge again for the same addresses. The real-time endpoint's 1-per-second limit describes individual checks; one batch upload processes the entire submitted list. ## Poll, then download [Upload a batch](/api-reference/email/upload-a-batch-file-for-email-verification), [check its status](/api-reference/jobs/get-batch-job-status), then [download the results](/api-reference/jobs/download-batch-job-results). | Job status | Meaning | | - | - | | `QUEUED` | Waiting to start. | | `PROCESSING` | Verification is running. | | `CANCELLING` | A cancellation was requested; wait for it to finish. | | `COMPLETED` | Finished. Download the output. | | `CANCELLED` | Stopped. Partial output may be available. | | `ERROR` | Failed. Read the message and correct the cause before submitting again. | Poll every 5 to 10 seconds, slowing down for longer jobs. Stop on COMPLETED, CANCELLED, or ERROR. A cancelled job may have partial output; a job cancelled before processing may have none. Output includes the original fields and each address's status. Metadata adds the fields described in [statuses and metadata](/api-reference/v2/email-verification-metadata). CSV normalizes failed individual checks to Unknown; JSON output can contain Error for those rows. Both are inconclusive and add no verification charge. ## Errors and retries An unsupported filename extension returns 400. A malformed file, missing email column, excessive row count, or insufficient budget can appear as an ERROR job after an accepted upload. Read the job message before submitting a corrected file. If an upload response is lost, [list your jobs](/api-reference/jobs/list-all-batch-jobs) before uploading again to avoid creating a second paid run. ## Next steps [Get batch job status](/api-reference/jobs/get-batch-job-status) using the returned process\_id. # Verify a single email address Source: https://docs.revenuebase.ai/api-reference/email/verify-a-single-email-address /api-reference/v2/email-openapi.json post /v2/email/verify Check one email address and return its verification result. ## Credits and plans PAYG is Pay-as-you-go. AYCE is All-you-can-eat. Email verification uses the same per-result prices on both plans. | Result or option | PAYG | AYCE | | - | - | - | | Valid result | **1 credit** | **1 credit** | | Invalid result | **1 credit** | **1 credit** | | Unknown result | **Free** 0 credits | **Free** 0 credits | | Metadata | **Included** No extra cost | **Included** No extra cost | **Requesting metadata does not increase the cost.** Set `metadata=true` on the original request to get the reason, provider, and mail-routing details with your result. ## When to use this endpoint * Check one address while a user is filling in a form or working with a contact. * Verify an email you already know, including one retrieved through Contact Enrich or Preview. * Use [Batch Email Verification](/api-reference/email/upload-a-batch-file-for-email-verification) for a list in one file. ## Example Set `REVENUEBASE_API_KEY` to your API key and `REVENUEBASE_EMAIL` to the business email address you want to check. ```bash curl --request POST 'https://api.revenuebase.ai/v2/email/verify?metadata=true' \ --header "X-Key: $REVENUEBASE_API_KEY" \ --header 'Content-Type: application/json' \ --data "{\"email\":\"$REVENUEBASE_EMAIL\"}" ``` ## Read the result Use `status` as the verification outcome. Valid and Invalid each consume one credit; Unknown is inconclusive and consumes zero. Without metadata, the response contains `email` and `status`. With metadata, additional fields can be empty or null when unavailable. See [statuses and metadata](/api-reference/v2/email-verification-metadata) for every field and common reason. Provider `Unknown` and verification `Unknown` have different meanings. `mx_record_checked` contains a hostname. A failed check can return just `email` and Unknown even with metadata enabled. ## Options and limits | Input | Use it for | | - | - | | `email` | Required email address in the JSON body. Invalid request syntax returns 422. | | `metadata` | Optional query parameter, false by default. Set to true for additional details at no extra cost. | Standard users can make **1 request per second** on this endpoint. The user's API keys and portal session share that limit. [Contact sales](https://revenuebase.ai/request-for-demo/) for a higher limit, or use a batch for a list. ## Billing and retries A second verification of the same address can charge again if it returns Valid or Invalid, including when you request metadata on the second call. Unknown is free, but the account can still need an available credit balance before a check starts. | HTTP status | What to do | | - | - | | `402` | Add credits before retrying. | | `429` | Wait for Retry-After. See the rate-limit guide. | | `503` | A required service is unavailable. Respect Retry-After and retry later. | | `422` | Correct the email or request format. | ## Next steps [Understand statuses and metadata](/api-reference/v2/email-verification-metadata), or [verify a list](/api-reference/email/upload-a-batch-file-for-email-verification). # Enrich selected contacts Source: https://docs.revenuebase.ai/api-reference/enrich /api-reference/v2/contact-openapi.json post /enrich Look up contact records by email address or by IDs selected from View. ## Credits and plans PAYG is Pay-as-you-go. AYCE is All-you-can-eat. | Usage | PAYG | AYCE | | - | - | - | | Returned contact match | **1 credit per match** | **Unlimited** 0 credits | | Revealed email | **+1 credit per populated email** | **Unlimited** 0 credits | | Revealed mobile | **+10 credits per populated mobile** | **Unlimited** 0 credits | | Input identifiers per request | **10,000** combined | **10,000** combined | PAYG prices add together. Only populated details selected by `reveal` add email or mobile charges. **Unmatched inputs cost 0 credits.** There is no SmartSearch fee on this endpoint because it takes identifiers rather than a search filter. ## When to use Enrich Use Enrich when you know which contacts you want. Send `RBID_PAO` values as `personIds` to retrieve people selected from a free View sample, or send existing email addresses as `emails` to look up their contact and company fields. | You have | Use | | - | - | | Selected IDs from View, or a list of known emails | Contact Enrich | | A filter describing the people you want | [Count](/api-reference/count) and [View](/api-reference/view), then [Preview](/api-reference/preview) or [Export](/api-reference/start-export) | | Company domains, company LinkedIn URLs, or company RBIDs | [Company Enrich](/api-reference/company-enrich) | | Email addresses whose deliverability you need to check | [Email Verification](/api-reference/v2/email-verification-overview) | This endpoint looks up records in the RevenueBase dataset. It does not verify whether an email is deliverable or perform a fresh employment check. Each returned row represents a person at a company. ## Example: retrieve contacts selected from View Set your API key as `REVENUEBASE_API_KEY`. In your application, use real `RBID_PAO` values returned by View. The sample below contains the two real IDs returned by View, and selects email without mobile. > [!WARNING] > > On PAYG, this request consumes credits. Omitting `reveal`, or sending > `null`, selects both email and mobile. Set `columns` as well: > fewer returned fields do not remove charges for selected details. ```bash curl --include --request POST 'https://api.revenuebase.ai/v2/contact/enrich' \ --header "X-Key: $REVENUEBASE_API_KEY" \ --header 'Content-Type: application/json' \ --data '{ "personIds": [ "rb-pab23456t-rb-oadkxzpcq", "rb-pab2346sr-rb-oacopeifk" ], "columns": [ "RBID_PAO", "FULL_NAME_PER", "JOB_TITLE_PER", "COMPANY_NAME_ORG", "EMAIL_ADDRESS_PER" ], "reveal": [ "email" ] }' ``` Response captured from the local test API on October 13, 2026 using an AYCE account. Results can change as the dataset or account changes. ```json { "matches": { "rb-pab23456t-rb-oadkxzpcq": { "RBID_PAO": "rb-pab23456t-rb-oadkxzpcq", "FULL_NAME_PER": "Matthew Tobin", "JOB_TITLE_PER": "Senior Vice President Business Development", "COMPANY_NAME_ORG": "Ecapital Corp", "EMAIL_ADDRESS_PER": "mtobin@ecapital.com" }, "rb-pab2346sr-rb-oacopeifk": { "RBID_PAO": "rb-pab2346sr-rb-oacopeifk", "FULL_NAME_PER": "Katherine Collins", "JOB_TITLE_PER": "AVP of Claim Operations", "COMPANY_NAME_ORG": "Travelers", "EMAIL_ADDRESS_PER": "katherine.collins@travelers.com" } }, "columns": [ "RBID_PAO", "FULL_NAME_PER", "JOB_TITLE_PER", "COMPANY_NAME_ORG", "EMAIL_ADDRESS_PER" ], "matched": 2, "total": 2 } ``` | Field | What it means | | - | - | | `matches` | An object keyed by the matched identifier. Email keys are normalized; person IDs have surrounding whitespace removed. Unmatched inputs have no entry. | | `RBID_PAO` | The person-at-company identifier, returned even when you omit it from `columns`. | | `columns` | Returned field names, including lookup fields and the stable identifier. Enrich does not return `columnLabels`. | | `matched` | Number of returned match entries, rather than distinct people. | | `total` | Number of valid, distinct input identifiers accepted after normalization and duplicate removal. | Both submitted IDs matched. The response uses those IDs as keys. On PAYG, the two returned matches and their two populated selected emails would cost **4 credits**; the AYCE capture used **0 credits**. ## Send a list in one request You can send `emails`, `personIds`, or both. The combined limit is **10,000 identifiers after normalization and duplicate removal**. For example, 6,000 emails and 4,000 person IDs fit in one request. Send the lists as JSON arrays; this endpoint does not upload a file. For each identifier, Enrich returns at most one matching contact row. If an identifier matches multiple rows, the endpoint selects one. It does not return every company or employment record for that person. Sending the same contact's email and person ID can produce two match entries, one under each key. PAYG charges each returned entry. Use one identifier per contact when you want to avoid retrieving it twice. ## Control the credit hold and returned fields A PAYG hold assumes every submitted array entry will match a row with every selected detail. The hold counts entries **before** normalization and duplicate removal. Remove duplicates before sending to keep that amount down. | `reveal` | Maximum PAYG hold per submitted entry | | - | - | | `[]` | 1 credit | | `["email"]` | 2 credits | | `["mobile"]` | 11 credits | | `["email", "mobile"]` | 12 credits | For the two submitted IDs with `reveal: ["email"]`, PAYG would reserve **4 credits**. Both matches have an email, so the final PAYG charge would also be **4 credits**. AYCE used **0 credits** for this capture. A `402 INSUFFICIENT_CREDITS` response rejects the request before lookup, even when you expect many identifiers to be unmatched. Split the list or select fewer details to lower the hold. | Option | Behavior | | - | - | | `emails` | Known email addresses to match. Providing an email as a lookup key does not waive an email-reveal charge. Use `reveal: []` for profile fields only. | | `personIds` | `RBID_PAO` values, such as those returned by View. These identify a person at a company. | | `columns` | Exact field names to return, in addition to lookup fields and `RBID_PAO`. Omitted, `null`, or `[]` returns those identifiers only. `["*"]` does not expand to all fields on Contact Enrich. | | `reveal` | On PAYG, select email, mobile, both, or neither. Omitted or `null` selects both. Charges follow this choice even when a priced field is excluded from `columns`. | Choose fields from [Get Columns](/api-reference/get-columns). Unknown requested columns are ignored on this endpoint. Available company fields on a contact row add no separate company-row charge. On PAYG, requested email or mobile fields not selected by `reveal` become `hasEmail` or `hasMobile` availability booleans. On AYCE, `columns` controls the returned fields; `reveal` does not mask them. Read `X-Credits-Charged` and `X-Credits-Remaining` on a metered response for the settled charge and remaining balance. ## Errors and retries | Response | What to do | | - | - | | `400` for no valid identifiers | Send at least one usable email or person ID. | | `400` for too many identifiers | Split the combined list into requests containing at most 10,000 accepted identifiers. | | `402 INSUFFICIENT_CREDITS` | Reduce the input list or selected details, or add credits. `creditsRequired` reports the hold and `creditsAvailable` your balance. | | `422` | Correct the request shape or field types; `emails` and `personIds` must be arrays. | | `429` | Follow `Retry-After` or wait until `X-RateLimit-Reset`. | | `503 CREDITS_UNAVAILABLE` | Credit metering is unavailable. Follow `Retry-After` before retrying. | An unsuccessful request releases its hold. A valid list with no matches returns `matches: {}` and `matched: 0` for **0 credits**. Repeating a paid request can charge again, including for the same identifiers. After an ambiguous timeout, the earlier call may already have completed; do not assume a retry will avoid another charge. ## Next step Join the returned `matches` to your input identifiers in your application. To retrieve a broader audience rather than a known list, begin with [Count](/api-reference/count) and [View](/api-reference/view). For a downloadable file, use [Estimate](/api-reference/estimate-export) and [Export](/api-reference/start-export). # Estimate Company Export Source: https://docs.revenuebase.ai/api-reference/estimate-company-export /api-reference/v2/contact-openapi.json post /company/exports/estimate Forecast the credit cost of a company file before starting its export job. ## Credits and plans PAYG is Pay-as-you-go. AYCE is All-you-can-eat. | Usage | PAYG | AYCE | | - | - | - | | Estimate; no job or hold | **Free** 0 credits | **Free** 0 credits | ## When to use Company Estimate Check a proposed company file before reserving credits. Send the same filter, columns, format, compression, and maxRows you intend to use for [Company Export](/api-reference/start-company-export). ## Example Set `REVENUEBASE_API_KEY` to your API key. ```bash curl --request POST 'https://api.revenuebase.ai/v2/contact/company/exports/estimate' \ --header "X-Key: $REVENUEBASE_API_KEY" \ --header 'Content-Type: application/json' \ --data '{ "filter": { "type": "group", "op": "AND", "children": [ { "type": "condition", "column": "HEADQUARTERS_COUNTRY_NAME_ORG", "operator": "eq", "value": "United States" } ] }, "columns": [ "RBID_ORG", "COMPANY_NAME_ORG", "DOMAIN_ORG" ], "format": "csv", "compression": "none", "maxRows": 100, "filename": "us-companies" }' ``` Response captured from the local test API on October 13, 2026. Results can change as the dataset or account changes. ```json { "creditsEstimate": 100 } ``` ## Read the forecast `creditsEstimate` is the estimated PAYG charge, based on matching companies and the row cap. It is null when export metering does not apply, including AYCE. The call creates no export job and reserves no credits. The PAYG chart is **1 credit per company row, plus 10 per SmartSearch filter node per request**. Selected company fields do not add contact email/mobile reveal charges. ## Estimate, hold, and charge With maxRows=100 and no SmartSearch nodes, the start request can require a **100-credit hold**, even if fewer companies match. One SmartSearch node adds 10 credits, making that bound 110. The final charge uses the companies actually written plus any SmartSearch node fees. Use a positive explicit maxRows to cap the job. Zero uses the service maximum. A forecast can be below the hold; have enough balance for the bound before starting. Company and person/job criteria are supported for company files. ## Errors and retries Correct unsupported fields or filters before retrying a 400 or 422 response. If a 429 response is returned, wait for Retry-After. Contact and company routes share the [default 10 requests per second per user](/api-reference/v2/rate-limits). ## Next steps Review the budget, then call [Start Company Export](/api-reference/start-company-export) with the same body. Reduce maxRows if the hold is too large. # Estimate export cost Source: https://docs.revenuebase.ai/api-reference/estimate-export /api-reference/v2/contact-openapi.json post /exports/estimate Compare export choices and forecast the cost before starting a download job. ## Credits and plans PAYG is Pay-as-you-go. AYCE is All-you-can-eat. | Usage | PAYG | AYCE | | - | - | - | | Estimate request | **Free** 0 credits | **Included** 0 credits | Estimate creates no credit hold or export job. Use Estimate to forecast the cost of a contact export after you have counted the audience and checked a free sample. Send the same filter, row cap, columns, and `reveal` choices you plan to send to Export. ## Choose what to retrieve Set `maxRows` to the number of contacts you want. Use `reveal` to choose which contact details you retrieve; `columns` controls which fields appear in the file. | Export `reveal` | PAYG: credits per row | AYCE | | - | - | - | | `[]` | 1 for the contact profile | **Unlimited** 0 credits | | `["email"]` | 1 for the row, +1 for a populated email | **Unlimited** 0 credits | | `["mobile"]` | 1 for the row, +10 for a populated mobile | **Unlimited** 0 credits | | `["email", "mobile"]` | 1 for the row, +1 for a populated email, +10 for a populated mobile | **Unlimited** 0 credits | * PAYG exports add **10 credits per SmartSearch filter node**, once per request. This means each semantic or lookalike node; ordinary field conditions add no search fee. * SmartSearch adds **0 credits on AYCE** and is free on Count and View on both plans. * Per-request and [rate limits](/api-reference/v2/rate-limits) apply to both plans, including unlimited AYCE retrieval. > [!WARNING] > > Omitting `reveal`, or sending `null`, selects **both email and mobile**. > Removing those fields from `columns` does not remove their reveal charges. > Set `reveal` explicitly to control the cost. ## Example: estimate 100 contacts with email Set your API key as `REVENUEBASE_API_KEY`. This reuses the Count/View audience, caps the export at 100 rows, and excludes mobile charges. ```bash curl --request POST 'https://api.revenuebase.ai/v2/contact/exports/estimate' \ --header "X-Key: $REVENUEBASE_API_KEY" \ --header 'Content-Type: application/json' \ --data '{ "filter": { "type": "group", "op": "AND", "children": [ { "type": "condition", "column": "COUNTRY_NAME_PER", "operator": "eq", "value": "United States" }, { "type": "condition", "column": "JOB_LEVEL_PER", "operator": "eq", "value": "VP" } ] }, "columns": [ "FULL_NAME_PER", "JOB_TITLE_PER", "COMPANY_NAME_ORG", "EMAIL_ADDRESS_PER" ], "maxRows": 100, "reveal": [ "email" ], "format": "csv", "compression": "gz" }' ``` Response captured from the local test API on October 13, 2026. Results can change as the dataset or account changes. ```json { "creditsEstimate": 200 } ``` **AYCE response for the same request:** ```json { "creditsEstimate": null } ``` | Field | What it means | | - | - | | `creditsEstimate` as a number | Forecast credits for this request's filter, row cap, and reveal choices. | | `creditsEstimate: null` | Export credit metering is not applied to this account or the current service configuration, including AYCE accounts. It is not an estimate error. | ## Estimate, hold, and final charge These are three different amounts: | Amount | Meaning | | - | - | | Estimate | A forecast based on audience counts and contact-detail availability. Counts and data can change; this is not a guaranteed ceiling. | | Hold | Credits reserved when Export starts. With `maxRows`, it assumes every requested row has every selected contact detail. | | Final charge | The rows actually written, populated selected details, and paid SmartSearch filter nodes. Unused held credits are released. | For the example above, `maxRows: 100` and `reveal: ["email"]` require a hold of up to **200 credits**. If the file contains 100 contacts but only 80 have an email, the final charge is **180 credits**. With both details selected, 100 contacts and one SmartSearch node require a hold of up to **1,210 credits**. If 80 have email and 20 have mobile, the final charge is **390 credits**: `100 + 80 + (20 × 10) + 10`. > [!NOTE] > > Your balance must cover the hold, even when the expected final charge > is smaller. Export returns `402 INSUFFICIENT_CREDITS` if it cannot > reserve that amount; it does not automatically export a smaller subset. ## Keep the request within a budget Read your balance with `GET /v2/account/balance`. Current unit prices are available from the free `GET /v2/contact/credits/prices` endpoint. For an upper bound, allow 1, 2, 11, or 12 credits per contact row according to the `reveal` table, plus 10 per SmartSearch node. With 200 credits and no SmartSearch nodes, an email-only export can cap at 100 rows. Using both details would cap at 16 rows. Always send a positive `maxRows`; `0` does not mean a zero-row export. ## Errors and next step A `503 ESTIMATE_UNAVAILABLE` means the count used for the forecast timed out. Do not interpret it as a zero-credit export. You can retry after `Retry-After`, narrow the filter, or decide to proceed with an explicit affordable `maxRows` and `reveal` upper bound. A `422` means the request or filter needs correction. Estimate does not validate every file-format, filename, or requested-column choice; choose fields from the column catalog before starting the export. On a `429`, wait for the rate-limit reset. No estimate response starts a paid job. When the choices and budget are right, send the **same body** to [Export](/api-reference/start-export). Changing the filter, row cap, or reveal choices requires a new estimate. # Export Status Source: https://docs.revenuebase.ai/api-reference/export-status /api-reference/v2/contact-openapi.json get /exports/{export_id} Follow a contact export and get the completed file’s download link. ## Credits and plans PAYG is Pay-as-you-go. AYCE is All-you-can-eat. | Usage | PAYG | AYCE | | - | - | - | | Status and download-link refresh | **Free** 0 credits | **Free** 0 credits | ## When to use this endpoint Follow the exportId returned by [Start Export](/api-reference/start-export). Reading status does not run another paid retrieval. ## Example Set `REVENUEBASE_EXPORT_ID` to the `exportId` returned by Start Export. Use a job created by this API key's account. Set `REVENUEBASE_API_KEY` to your API key. ```bash curl --request GET "https://api.revenuebase.ai/v2/contact/exports/$REVENUEBASE_EXPORT_ID" \ --header "X-Key: $REVENUEBASE_API_KEY" ``` ## Read the status | Status | What to do | | - | - | | `QUEUED` | Waiting to run; keep polling. | | `PROCESSING` | Writing the file; keep polling. | | `FINALIZING` | Finishing the retrieval; keep polling. | | `CANCELLING` | A stop was requested; keep polling. | | `COMPLETED` | Download the file. | | `ERROR` | Read error and code; stop polling. | | `CANCELLED` | The export stopped; stop polling. | ## Download a completed file | Field | Meaning | | - | - | | `rowCount` | Rows written to the finished file. | | `bytes` | Uncompressed bytes written. | | `compressedBytes` | Stored file size after compression. | | `downloadUrl` | Signed URL for the file; treat it as a private link. | | `expiresInSeconds` | Link lifetime, normally 3,600 seconds. | Download only when status is COMPLETED and a downloadUrl is present. Refresh an expired link by reading status again. Repeated downloads and link refreshes do not create another export or add credits. The response does not contain a final charged-credit total. ## Errors and retries An unknown export or one you do not own returns 404. Confirm the ID from the start response. Poll every 5 to 10 seconds and slow down for longer jobs. Contact and company routes share the [default 10 requests per second per user](/api-reference/v2/rate-limits). Wait for the reset time or Retry-After when rate limited; coordinate requests across your workers and API keys. Keep polling through FINALIZING. Stop on COMPLETED, ERROR, or CANCELLED. Read error and code before correcting a failed request. Repeating the original start POST creates another job and can charge again. ## Next steps [Cancel an unfinished export](/api-reference/cancel-export) if you no longer need it. Company files use [Company Export Status](/api-reference/company-export-status). Email Verification batches use numeric process\_id values and [the job endpoints](/api-reference/jobs/get-batch-job-status). # Health Source: https://docs.revenuebase.ai/api-reference/health /api-reference/v2/contact-openapi.json get /health Check whether the Contact API service is responding and read its version. ## Credits and plans PAYG is Pay-as-you-go. AYCE is All-you-can-eat. | Usage | PAYG | AYCE | | - | - | - | | Service health check | **Free** 0 credits | **Free** 0 credits | ## When to use Health Check service liveness or compare the running version while diagnosing an integration. This endpoint does not require an API key. ## Example ```bash curl --request GET 'https://api.revenuebase.ai/v2/contact/health' ``` Response captured from the local test API on October 13, 2026. Results can change as the dataset or account changes. ```json { "status": "ok", "version": "local" } ``` ## Read the response status=ok means the service handled the health request. version identifies the running build and can be unknown when no build identifier is configured. This check does not prove that your API key, database query, or credit balance will work. ## Next steps Use an authenticated [Stats request](/api-reference/stats) to check access without retrieving contact records. For a service incident, see [API Status](https://status.revenuebase.ai). # Insights Source: https://docs.revenuebase.ai/api-reference/insights /api-reference/v2/contact-openapi.json post /insights Analyze contact availability, freshness, audience composition, and field coverage before retrieval. ## Credits and plans PAYG is Pay-as-you-go. AYCE is All-you-can-eat. | Usage | PAYG | AYCE | | - | - | - | | Analysis, including SmartSearch | **Free** 0 credits | **Free** 0 credits | ## When to use Insights * Check how many contacts have the details you need before paying to retrieve them. * Compare audience composition or freshness while adjusting a filter. * Measure how often selected fields are populated. Insights analyzes the filtered audience, rather than the rows in a View or Preview sample. It returns aggregate counts without revealing contact details. ## Example Set `REVENUEBASE_API_KEY` to your API key. ```bash curl --request POST 'https://api.revenuebase.ai/v2/contact/insights' \ --header "X-Key: $REVENUEBASE_API_KEY" \ --header 'Content-Type: application/json' \ --data '{ "filter": { "type": "group", "op": "AND", "children": [ { "type": "condition", "column": "COUNTRY_CODE_PER", "operator": "eq", "value": "US" } ] }, "section": "reachability" }' ``` Response captured from the local test API on October 13, 2026. Results can change as the dataset or account changes. ```json { "section": "reachability", "reachability": { "total": 106956086, "withEmail": 24409894, "withMobile": 45333156, "withBoth": 13864920 } } ``` ## Choose one section | section | What you learn | Where to read it | | - | - | - | | `reachability` | Contact rows with an email, mobile, or both. | `reachability`: total, withEmail, withMobile, withBoth. | | `freshness` | How recently emails and profiles were checked. | `freshness.email` and `freshness.updated`: nonNull, withinSla, medianDays, and buckets. | | `coverage` | The audience grouped by a field. | `coverage`: groupField and rows with value, total, withEmail, withMobile. | | `fillRate` | Availability of the fields you select. | `fillRates`: field, total, and populated counts. | These section names are case-sensitive. Each call returns one section. The example reports email availability across the filtered US audience, without returning the addresses. ## Options and limits | Input | How to use it | | - | - | | `filter` | Reuse the audience filter from Count. Omitted or null analyzes all contact rows. | | `fields` | For fillRate, supply up to 12 recognized distinct fields. With no usable fields, the result is an empty list. | | `groupField` | For coverage, choose a supported column. The default is JOB\_LEVEL\_PER. | Freshness uses a 60-day email target and a 90-day profile target. nonNull counts available timestamps; withinSla counts those within the target. Read the returned buckets when comparing age ranges. Coverage groups seniority as C-Team, VP, Director, Manager, Staff, and Other. Other fields show the eight largest groups and can combine the rest as Other. This is a summary, not an exhaustive list of every value in a large vocabulary. For fillRate, calculate populated / total when total is greater than zero. The response supplies counts, rather than percentages. ## Errors and retries An unsupported section returns 400. Correct invalid fields or filters before retrying 400 or 422. Contact and company routes share the [default 10 requests per second per user](/api-reference/v2/rate-limits). Wait for the reset time or Retry-After when rate limited; coordinate requests across your workers and API keys. ## Next steps Inspect a [free masked View](/api-reference/view), retrieve a [bounded Preview](/api-reference/preview), or [estimate an export](/api-reference/estimate-export). Company-only analysis uses [Company Insights](/api-reference/company-insights). # Cancel a batch job Source: https://docs.revenuebase.ai/api-reference/jobs/cancel-a-batch-job /api-reference/v2/email-openapi.json post /v2/jobs/{process_id}/cancel Ask an email verification batch to stop processing. ## Credits and plans PAYG is Pay-as-you-go. AYCE is All-you-can-eat. | Usage | PAYG | AYCE | | - | - | - | | This request | **Free** 0 credits | **Free** 0 credits | These job endpoints manage **Email Verification batches**. Contact and company exports use `exportId` and their own export status endpoints. ## When to use this endpoint Cancel a queued or running job when you no longer need the remaining checks. Cancellation adds no credit charge. Results already verified as Valid or Invalid remain billable. ## Example Set `REVENUEBASE_PROCESS_ID` to the `process_id` returned by your batch upload. Set `REVENUEBASE_API_KEY` to your API key. ```bash curl --request POST "https://api.revenuebase.ai/v2/jobs/$REVENUEBASE_PROCESS_ID/cancel" \ --header "X-Key: $REVENUEBASE_API_KEY" ``` ## What happens next The response uses `current_status: "CANCELLING"`. A queued job will not process its list. A running job may finish its current work before stopping, so cancellation is not immediate. [Poll status](/api-reference/jobs/get-batch-job-status) until CANCELLED or another terminal state. Partial output can be available for a job that processed some rows. A completed job cannot be cancelled to refund its verification. ## Errors and retries Already CANCELLING or CANCELLED jobs return 400, as do COMPLETED or ERROR jobs and jobs outside your account. Re-read current\_status before repeating a request; an already accepted cancellation does not need another POST. ## Next steps [Check job status](/api-reference/jobs/get-batch-job-status), then [download available results](/api-reference/jobs/download-batch-job-results). # Download batch job results Source: https://docs.revenuebase.ai/api-reference/jobs/download-batch-job-results /api-reference/v2/email-openapi.json get /v2/jobs/{process_id}/download Save the output file from an email verification batch. ## Credits and plans PAYG is Pay-as-you-go. AYCE is All-you-can-eat. | Usage | PAYG | AYCE | | - | - | - | | This request | **Free** 0 credits | **Free** 0 credits | These job endpoints manage **Email Verification batches**. Contact and company exports use `exportId` and their own export status endpoints. ## When to use this endpoint Download results after a job reaches COMPLETED. A CANCELLED job can have partial results. Downloading does not run verification again or add credits. ## Example Set `REVENUEBASE_PROCESS_ID` to the `process_id` returned by your batch upload. Set `REVENUEBASE_API_KEY` to your API key. ```bash curl --request GET "https://api.revenuebase.ai/v2/jobs/$REVENUEBASE_PROCESS_ID/download" \ --header "X-Key: $REVENUEBASE_API_KEY" \ --output results.csv ``` ## Read the file response This response contains file bytes, rather than a JSON status object. The format follows the uploaded file: CSV or JSON. Content-Disposition supplies a filename. Match your output extension to your upload. Original fields are preserved and a status is added per processed address. With metadata=true on the upload, the output also contains the [metadata fields](/api-reference/v2/email-verification-metadata). Output order can change; reconnect records using your own reference field. ## Availability and errors | Job state | Download behavior | | - | - | | `COMPLETED` | The processed output is available. | | `CANCELLED` | Partial output may exist; a job stopped before processing can have no file and return 404. | | `QUEUED`, `PROCESSING`, `CANCELLING` | Returns 400 while the job is unfinished. | | `ERROR` | Returns 400; inspect the job message. | A missing or inaccessible process\_id also returns 400. Repeating a download is free; uploading the same list again creates a new verification job. ## Next steps [Interpret statuses and metadata](/api-reference/v2/email-verification-metadata). Use [List all jobs](/api-reference/jobs/list-all-batch-jobs) to find older outputs. # Get batch job status Source: https://docs.revenuebase.ai/api-reference/jobs/get-batch-job-status /api-reference/v2/email-openapi.json get /v2/jobs/{process_id} Follow one email verification batch until it finishes. ## Credits and plans PAYG is Pay-as-you-go. AYCE is All-you-can-eat. | Usage | PAYG | AYCE | | - | - | - | | This request | **Free** 0 credits | **Free** 0 credits | These job endpoints manage **Email Verification batches**. Contact and company exports use `exportId` and their own export status endpoints. ## When to use this endpoint Poll a numeric process\_id returned by an upload or job list. Polling is free and does not restart verification. ## Example Set `REVENUEBASE_PROCESS_ID` to the `process_id` returned by your batch upload. Set `REVENUEBASE_API_KEY` to your API key. ```bash curl --request GET "https://api.revenuebase.ai/v2/jobs/$REVENUEBASE_PROCESS_ID" \ --header "X-Key: $REVENUEBASE_API_KEY" ``` ## Read current\_status | Status | What to do | | - | - | | `QUEUED` | Waiting to start. | | `PROCESSING` | Verification is running. | | `CANCELLING` | A cancellation was requested; wait for it to finish. | | `COMPLETED` | Finished. Download the output. | | `CANCELLED` | Stopped. Partial output may be available. | | `ERROR` | Failed. Read the message and correct the cause before submitting again. | Poll every 5 to 10 seconds, slowing down for long jobs. Stop on a terminal status. `message` explains progress or a failure; read it before deciding to resubmit. Individual email results arrive in the output file. ## Errors and next steps A missing job or one outside your account returns 400. Confirm process\_id from [your job list](/api-reference/jobs/list-all-batch-jobs). When completed, [download the results](/api-reference/jobs/download-batch-job-results). # List active batch jobs Source: https://docs.revenuebase.ai/api-reference/jobs/list-active-batch-jobs /api-reference/v2/email-openapi.json get /v2/jobs Find the email verification jobs waiting or running on your account. ## Credits and plans PAYG is Pay-as-you-go. AYCE is All-you-can-eat. | Usage | PAYG | AYCE | | - | - | - | | This request | **Free** 0 credits | **Free** 0 credits | These job endpoints manage **Email Verification batches**. Contact and company exports use `exportId` and their own export status endpoints. ## When to use this endpoint Check work in progress. This list contains only QUEUED and PROCESSING jobs; use [List all jobs](/api-reference/jobs/list-all-batch-jobs) to find terminal or cancelling jobs. ## Example Set `REVENUEBASE_API_KEY` to your API key. ```bash curl --request GET 'https://api.revenuebase.ai/v2/jobs?page=1&batch=10' \ --header "X-Key: $REVENUEBASE_API_KEY" ``` Response captured from the local test API on October 13, 2026. Results can change as the dataset or account changes. ```json { "processes": [], "page": 1, "batch": 10, "total": 0 } ``` ## Pagination and results | Field or input | Meaning | | - | - | | `page` | 1-based page number; default 1. | | `batch` | Jobs per page; default 10, maximum 100. | | `total` | Number of matching jobs, rather than emails. | | `processes` | Job records, each with a process\_id, filename, status, message, and timestamps. | | `total_emails`, `valid_emails`, `invalid_emails` | Email counters on each job; values can be zero while processing. | | `credits_used` | Verification credits recorded for the job. Metadata has no surcharge. | Results are scoped to your own jobs. Increment page until you have read the total; new activity can change the list between requests. Save process\_id instead of relying on a job's position. ## Next steps [Get a job's status](/api-reference/jobs/get-batch-job-status), [cancel it](/api-reference/jobs/cancel-a-batch-job), or [download its output](/api-reference/jobs/download-batch-job-results). # List all batch jobs Source: https://docs.revenuebase.ai/api-reference/jobs/list-all-batch-jobs /api-reference/v2/email-openapi.json get /v2/jobs/all Find batch jobs across active, completed, cancelled, and failed states. ## Credits and plans PAYG is Pay-as-you-go. AYCE is All-you-can-eat. | Usage | PAYG | AYCE | | - | - | - | | This request | **Free** 0 credits | **Free** 0 credits | These job endpoints manage **Email Verification batches**. Contact and company exports use `exportId` and their own export status endpoints. ## When to use this endpoint Find a completed job for downloading, recover a lost process\_id, or inspect a failed run. You can filter by one status. ## Example Set `REVENUEBASE_API_KEY` to your API key. ```bash curl --request GET 'https://api.revenuebase.ai/v2/jobs/all?page=1&batch=10' \ --header "X-Key: $REVENUEBASE_API_KEY" ``` Response captured from the local test API on October 13, 2026. Results can change as the dataset or account changes. ```json { "processes": [], "page": 1, "batch": 10, "total": 0 } ``` ## Pagination and results | Field or input | Meaning | | - | - | | `page` | 1-based page number; default 1. | | `batch` | Jobs per page; default 10, maximum 100. | | `total` | Number of matching jobs, rather than emails. | | `processes` | Job records, each with a process\_id, filename, status, message, and timestamps. | | `total_emails`, `valid_emails`, `invalid_emails` | Email counters on each job; values can be zero while processing. | | `credits_used` | Verification credits recorded for the job. Metadata has no surcharge. | Set `status` to QUEUED, PROCESSING, COMPLETED, ERROR, CANCELLING, or CANCELLED to narrow the list. Results are scoped to your own jobs. Increment page until you have read the total; new activity can change the list between requests. Save process\_id instead of relying on a job's position. ## Next steps [Get a job's status](/api-reference/jobs/get-batch-job-status), [cancel it](/api-reference/jobs/cancel-a-batch-job), or [download its output](/api-reference/jobs/download-batch-job-results). # Lookalike Source: https://docs.revenuebase.ai/api-reference/lookalike /api-reference/v2/contact-openapi.json post /company/lookalike Find companies similar to a seed company and return their company fields. ## Credits and plans PAYG is Pay-as-you-go. AYCE is All-you-can-eat. | Usage | PAYG | AYCE | | - | - | - | | Company matches | **1 credit per returned company + 10 for the seed search** | **Unlimited** 0 credits | | Companies per request | **200** maximum; 25 default | **200** maximum; 25 default | ## When to use Lookalike Start from a company you already know and inspect nearby companies. This endpoint returns company records, rather than the people who work there. For a contact or company audience with other criteria, use a [lookalike filter](/api-reference/v2/smartsearch-lookalike) on Count, View, Preview, or Export. ## Example Set `REVENUEBASE_API_KEY` to your API key. ```bash curl --request POST 'https://api.revenuebase.ai/v2/contact/company/lookalike' \ --header "X-Key: $REVENUEBASE_API_KEY" \ --header 'Content-Type: application/json' \ --data '{ "domain": "stripe.com", "limit": 5, "columns": [ "RBID_ORG", "COMPANY_NAME_ORG", "DOMAIN_ORG" ] }' ``` Response captured from the local test API on October 13, 2026 using an AYCE account. Results can change as the dataset or account changes. ```json { "rbidOrg": "rb-oacwbixtv", "matches": [ { "rbidOrg": "rb-oabt7ovif", "similarity": 0.8989, "match": "exact", "COMPANY_NAME_ORG": "Haipals", "DOMAIN_ORG": "haipals.com" }, { "rbidOrg": "rb-oacls43ho", "similarity": 0.8824, "match": "exact", "COMPANY_NAME_ORG": "Paymentre", "DOMAIN_ORG": "paymentre.com" }, { "rbidOrg": "rb-oaczstvlg", "similarity": 0.8759, "match": "exact", "COMPANY_NAME_ORG": "Azapay", "DOMAIN_ORG": "azapaybusiness.com" }, { "rbidOrg": "rb-oacrxzm3i", "similarity": 0.8756, "match": "exact", "COMPANY_NAME_ORG": "Merchly", "DOMAIN_ORG": null }, { "rbidOrg": "rb-oackyxmvn", "similarity": 0.87, "match": "exact", "COMPANY_NAME_ORG": "Onyx Processing", "DOMAIN_ORG": "onyxprocessing.com" } ] } ``` ## Read the response `rbidOrg` identifies the resolved seed. `matches` is an ordered list of other companies, with rbidOrg, similarity, a match classification, and requested company fields. Higher similarity is closer to the seed. The seed itself is excluded. A match classification can be null when it falls outside the named tiers. ## Options and limits | Option | Meaning | | - | - | | `domain` or `rbidOrg` | Provide a seed domain or company identifier. If both are present, rbidOrg is used. | | `limit` | Defaults to 25 and is clamped to 1 through 200. This is a nearest-results cap. | | `columns` | Choose company fields; `["*"]` requests all company catalog fields. | The standalone request accepts these options. The match and maxDistance controls belong to the lookalike filter node, which you use when defining an audience. ## Errors and next steps An unresolved seed or one without usable similarity data can fail with a 404 or 422 response. Choose another seed or retrieve its company record first. [Company Enrich](/api-reference/company-enrich) retrieves known company identifiers. A [lookalike filter](/api-reference/v2/smartsearch-lookalike) lets you count an audience before choosing an inline response or file. # Match Presets Source: https://docs.revenuebase.ai/api-reference/match-presets /api-reference/v2/contact-openapi.json get /match-presets Discover the named SmartSearch settings for titles, descriptions, and lookalike filters. ## Credits and plans PAYG is Pay-as-you-go. AYCE is All-you-can-eat. | Usage | PAYG | AYCE | | - | - | - | | Preset catalog | **Free** 0 credits | **Free** 0 credits | ## When to use Match Presets Build a SmartSearch selector in your application or choose a named match setting for a filter. Use the service’s preset catalog instead of hardcoding numeric distance thresholds. ## Example Set `REVENUEBASE_API_KEY` to your API key. ```bash curl --request GET 'https://api.revenuebase.ai/v2/contact/match-presets' \ --header "X-Key: $REVENUEBASE_API_KEY" ``` Response captured from the local test API on October 13, 2026. Results can change as the dataset or account changes. ```json { "recommended": "similar", "title": [ { "match": "exact", "label": "Exact", "help": "Only people with essentially the same role. Includes equivalent wording and languages.", "maxDistance": 0.05, "similarityPct": 95, "onTargetPct": 99, "recommended": false }, { "match": "similar", "label": "Similar", "help": "Same underlying job. May include a small number of adjacent roles.", "maxDistance": 0.15, "similarityPct": 85, "onTargetPct": 91, "recommended": true }, { "match": "related", "label": "Related", "help": "Same function, with some variation in seniority and responsibilities.", "maxDistance": 0.25, "similarityPct": 75, "onTargetPct": 82, "recommended": false }, { "match": "broad", "label": "Broad", "help": "Explore related roles and functions. More results will require review.", "maxDistance": 0.3, "similarityPct": 70, "onTargetPct": 73, "recommended": false } ], "company": [ { "match": "exact", "label": "Exact", "help": "Only companies that are precisely what you described.", "maxDistance": 0.4, "similarityPct": 60, "onTargetPct": 86, "recommended": false }, { "match": "similar", "label": "Similar", "help": "Companies clearly in the space you described.", "maxDistance": 0.5, "similarityPct": 50, "onTargetPct": 56, "recommended": true }, { "match": "related", "label": "Related", "help": "Companies in and around the space you described.", "maxDistance": 0.55, "similarityPct": 45, "onTargetPct": 42, "recommended": false }, { "match": "broad", "label": "Broad", "help": "Anything with a real connection. More results will require review.", "maxDistance": 0.6, "similarityPct": 40, "onTargetPct": 24, "recommended": false } ], "lookalike": [ { "match": "exact", "label": "Exact", "help": "Direct competitors and near-twins of this company.", "maxDistance": 0.15, "similarityPct": 85, "onTargetPct": 85, "recommended": false }, { "match": "similar", "label": "Similar", "help": "Same market, with an overlapping offering.", "maxDistance": 0.3, "similarityPct": 70, "onTargetPct": 78, "recommended": true }, { "match": "related", "label": "Related", "help": "A similar space, but a different offering.", "maxDistance": 0.35, "similarityPct": 65, "onTargetPct": 50, "recommended": false }, { "match": "broad", "label": "Broad", "help": "The wider industry around this company. More results will require review.", "maxDistance": 0.4, "similarityPct": 60, "onTargetPct": 34, "recommended": false } ] } ``` ## Read the response | Field | Meaning | | - | - | | `recommended` | Recommended default match name. | | `title`, `company`, `lookalike` | Preset lists for job-title semantics, company-description semantics, and lookalike filters. | | `match`, `label`, `help` | Name to send in the filter and display text for a selector. | | `maxDistance`, `similarityPct` | The threshold associated with that preset for this target. | | `onTargetPct` | Measured calibration guidance, rather than a guarantee for your audience. | | `recommended` on a preset | Whether that entry is recommended for the target. | The response excerpt shows the recommended name; the full response includes the preset lists. The shared names are exact, similar, related, and broad, but their thresholds can differ by target. ## Use a named preset Send match on a semantic or lookalike filter node. Do not also send maxDistance; those choices are mutually exclusive. A named preset lets the service apply its current calibration. These are filter settings. The standalone [Lookalike endpoint](/api-reference/lookalike) accepts a seed and a nearest-results limit; it does not accept match or maxDistance. ## Next steps [Read SmartSearch](/api-reference/v2/smartsearch) and test a proposed filter with free [Count](/api-reference/count) and [View](/api-reference/view). # Preview matching contacts Source: https://docs.revenuebase.ai/api-reference/preview /api-reference/v2/contact-openapi.json post /preview Get matching contact records as JSON in the same response. ## Credits and plans PAYG is Pay-as-you-go. AYCE is All-you-can-eat. | Usage | PAYG | AYCE | | - | - | - | | Contact row | **1 credit per returned row** | **Unlimited** 0 credits | | Revealed email | **+1 credit per populated email** | **Unlimited** 0 credits | | Revealed mobile | **+10 credits per populated mobile** | **Unlimited** 0 credits | | SmartSearch filter node | **+10 credits per node per request** | **Included** 0 credits | | Rows per request | **50,000** maximum | **50,000** maximum | PAYG prices add together. Email and mobile charges apply only to populated details selected by `reveal`. A SmartSearch node is a semantic or lookalike filter; ordinary field conditions add no search fee. ## When to use Preview Use Preview when your application needs the matching records immediately. It accepts the same audience filter as Count and View. | You need | Use | | - | - | | Check the audience without paying for contact details | [Count](/api-reference/count), then [View](/api-reference/view) | | Retrieve a filtered list as JSON, up to 50,000 rows | Preview | | Retrieve only the contacts you selected in View | [Enrich](/api-reference/enrich) with their `RBID_PAO` values | | Download a file, up to 1,000,000 rows | [Estimate](/api-reference/estimate-export), then [Export](/api-reference/start-export) | Preview is paid retrieval on PAYG. For a free sample with email and mobile values masked, use View. On AYCE, contact retrieval is included; the per-request and [rate limits](/api-reference/v2/rate-limits) still apply. ## Example: retrieve two matching contacts Set your API key as `REVENUEBASE_API_KEY`. This reuses the audience from the Count and View examples. It requests email, excludes mobile charges, and limits the response to two records. > [!WARNING] > > On PAYG, this request consumes credits. Omitting `reveal`, or sending > `null`, selects both email and mobile. Removing those fields from > `columns` does not remove their reveal charges. ```bash curl --include --request POST 'https://api.revenuebase.ai/v2/contact/preview' \ --header "X-Key: $REVENUEBASE_API_KEY" \ --header 'Content-Type: application/json' \ --data '{ "filter": { "type": "group", "op": "AND", "children": [ { "type": "condition", "column": "COUNTRY_NAME_PER", "operator": "eq", "value": "United States" }, { "type": "condition", "column": "JOB_LEVEL_PER", "operator": "eq", "value": "VP" } ] }, "columns": [ "RBID_PAO", "FULL_NAME_PER", "JOB_TITLE_PER", "COMPANY_NAME_ORG", "EMAIL_ADDRESS_PER" ], "limit": 2, "reveal": [ "email" ] }' ``` Response captured from the local test API on October 13, 2026 using an AYCE account. Results can change as the dataset or account changes. ```json { "rows": [ { "RBID_PAO": "rb-pab23456t-rb-oadkxzpcq", "FULL_NAME_PER": "Matthew Tobin", "JOB_TITLE_PER": "Senior Vice President Business Development", "COMPANY_NAME_ORG": "Ecapital Corp", "EMAIL_ADDRESS_PER": "mtobin@ecapital.com" }, { "RBID_PAO": "rb-pab2346sr-rb-oacopeifk", "FULL_NAME_PER": "Katherine Collins", "JOB_TITLE_PER": "AVP of Claim Operations", "COMPANY_NAME_ORG": "Travelers", "EMAIL_ADDRESS_PER": "katherine.collins@travelers.com" } ], "columns": [ "RBID_PAO", "FULL_NAME_PER", "JOB_TITLE_PER", "COMPANY_NAME_ORG", "EMAIL_ADDRESS_PER" ], "columnLabels": { "RBID_PAO": "Rbid Person And Organization", "FULL_NAME_PER": "Person Full Name", "JOB_TITLE_PER": "Job Title", "COMPANY_NAME_ORG": "Company Name", "EMAIL_ADDRESS_PER": "Email Address" }, "rowCount": 2, "limit": 2 } ``` | Field | What it means | | - | - | | `rows` | The contact records returned by this request. Each row represents a person at a company. | | `RBID_PAO` | The person-at-company identifier. Request it if you need to retrieve a selected record later with Enrich. | | `columns`, `columnLabels` | Returned field names and display labels. | | `rowCount` | Records returned, rather than the audience's total size. Use Count for that total. | | `limit` | The applied row cap. Fewer rows can return if fewer contacts match. | | `warnings` | Optional information about adjustments made to the filter. | | `scoresOmitted` | When `true`, requested similarity scores could not be added; the records still return. | A missing selected email or mobile adds no detail charge. In this captured response, two returned contact rows and two populated emails would cost **4 PAYG credits**. The AYCE call used **0 credits**. ## Control the credit hold A PAYG request reserves enough credits for every row in `limit` to contain every selected detail, plus any SmartSearch filter fees. Your balance must cover that amount before the query runs, even when Count reports fewer matches. | `reveal` | Maximum PAYG hold per requested row, before SmartSearch | | - | - | | `[]` | 1 credit | | `["email"]` | 2 credits | | `["mobile"]` | 11 credits | | `["email", "mobile"]` | 12 credits | For the captured response, both returned contacts have an email. On PAYG, the request would hold **4 credits** and charge **4 credits**. This response was captured with an AYCE account and used **0 credits**. If the balance cannot cover the hold, the request returns `402 INSUFFICIENT_CREDITS`. The API does not automatically return a smaller affordable subset. Reduce `limit` or your reveal choices. ## Options and limits | Option | Behavior | | - | - | | `filter` | Reuse the filter from Count or View. Omitted or `null` selects the whole dataset. | | `limit` | Defaults to 1,000 when omitted or `null`; values are clamped to 1 through 50,000. Set a positive cap explicitly. | | `columns` | Fields to return. Omitted or `null` uses the default set; `["*"]` requests all fields. Available company fields on a contact row add no separate company-row charge. | | `reveal` | On PAYG, select email, mobile, both, or neither. Omitted or `null` selects both. Removing columns does not reduce reveal charges. | | `includeScores` | Adds available similarity fields for SmartSearch results. Defaults to `false`; it does not change unit credit prices. | On PAYG, an email or mobile column requested without its corresponding `reveal` selection becomes a `hasEmail` or `hasMobile` availability boolean. On AYCE, `columns` controls the returned fields; `reveal` does not mask them. Preview has **no pagination cursor**. Repeating the request does not fetch the next page. Normal results have no guaranteed ordering; similarity scores can order the returned SmartSearch rows when available. Use Export for a larger file or Enrich for particular records. ## Errors and retries | Response | What to do | | - | - | | `402 INSUFFICIENT_CREDITS` | Reduce the row cap or selected details, or add credits. `creditsRequired` is the needed hold; `creditsAvailable` is your balance. | | `400` or `422` | Correct the request, filter, or requested columns before retrying. | | `429` | Follow `Retry-After` or wait until `X-RateLimit-Reset`. | | `503 CREDITS_UNAVAILABLE` | Credit metering is unavailable. Follow `Retry-After` before retrying. | An unsuccessful request releases its hold. An empty successful result has no row or detail charge, but SmartSearch filter fees can still apply. A repeated paid request can charge again, even for the same rows or a cached result. After an ambiguous timeout, the first request may have completed and charged your account. Do not assume retries are free. ## Next step Use the returned records in your application. For a downloadable file, reuse the audience filter with [Estimate](/api-reference/estimate-export) and [Export](/api-reference/start-export). For a selected set of `RBID_PAO` values, use [Enrich](/api-reference/enrich). # Start Company Export Source: https://docs.revenuebase.ai/api-reference/start-company-export /api-reference/v2/contact-openapi.json post /company/exports Create an asynchronous job for a downloadable company file. ## Credits and plans PAYG is Pay-as-you-go. AYCE is All-you-can-eat. | Usage | PAYG | AYCE | | - | - | - | | Company row | **1 credit per written row** | **Unlimited** 0 credits | | SmartSearch filter node | **+10 credits per node per request** | **Included** 0 credits | | Rows per file | **1,000,000** maximum | **1,000,000** maximum | Company records are deduplicated to one search row per `RBID_ORG`. If you need company fields alongside individual people, contact records already include their available company data; requesting those fields does not add a separate company-row charge. ## When to use Company Export Download a company list as a file, including larger lists than an inline Preview can return. Company and person/job conditions are supported: a person filter selects the distinct companies represented by matching contacts. ## Example Set `REVENUEBASE_API_KEY` to your API key. ```bash curl --request POST 'https://api.revenuebase.ai/v2/contact/company/exports' \ --header "X-Key: $REVENUEBASE_API_KEY" \ --header 'Content-Type: application/json' \ --data '{ "filter": { "type": "group", "op": "AND", "children": [ { "type": "condition", "column": "HEADQUARTERS_COUNTRY_NAME_ORG", "operator": "eq", "value": "United States" } ] }, "columns": [ "RBID_ORG", "COMPANY_NAME_ORG", "DOMAIN_ORG" ], "format": "csv", "compression": "none", "maxRows": 100, "filename": "us-companies" }' ``` ## Read the start response HTTP 202 means the job was accepted. Save exportId; the response does not contain the company records or a finished file. maxRows is the applied row cap. A metered start response reports its reservation in X-Credits-Held. ## Choose your file and budget Set columns explicitly or use `["*"]` for all company catalog fields. Use format and compression to choose the file representation; the example requests an uncompressed CSV. A filename is a base name, up to 150 characters, using letters, digits, spaces, and . \_ ( ) -. Choose a positive maxRows. The service maximum is 1,000,000 rows, and zero requests that maximum. PAYG holds one credit per capped row plus 10 per SmartSearch node. For the example, the hold is 100 credits. A 402 response starts no job when the hold cannot be covered. Completion settles the written rows and node fees, then releases unused held credits. A successful empty export with SmartSearch nodes can still have the flat node charge. An unfinished failed or cancelled export releases its hold. Completed work is charged whether or not you download it. ## Poll and download [Poll Company Export Status](/api-reference/company-export-status) until COMPLETED, ERROR, or CANCELLED. Continue polling through QUEUED, PROCESSING, FINALIZING, or CANCELLING. Download the completed file using downloadUrl. A signed link lasts one hour; re-read status for a fresh link. ## Errors and retries Correct invalid filters, fields, or file options before retrying 400 or 422. Respect Retry-After for 429 or a transient credit-service failure. A repeated start POST creates another job and can charge again; avoid automatically resubmitting after an ambiguous response. ## Next steps [Get status](/api-reference/company-export-status) using exportId. [Cancel](/api-reference/cancel-company-export) when you no longer need an unfinished job. # Export matching contacts Source: https://docs.revenuebase.ai/api-reference/start-export /api-reference/v2/contact-openapi.json post /exports Download a filtered contact list with the row cap, contact details, and file format you choose. ## Credits and plans PAYG is Pay-as-you-go. AYCE is All-you-can-eat. | Export usage | PAYG | AYCE | | - | - | - | | Contact row | **1 credit per row** | **Unlimited** 0 credits | | Revealed email | **+1 credit per populated email** | **Unlimited** 0 credits | | Revealed mobile | **+10 credits per populated mobile** | **Unlimited** 0 credits | | SmartSearch filter node | **+10 credits per node per request** | **Included** 0 credits | * PAYG prices add together. Email/mobile charges apply only to populated details selected by `reveal`. * AYCE includes unlimited contact retrieval. The **1,000,000-row limit per export** and [rate limits](/api-reference/v2/rate-limits) still apply. Export runs in the background and returns an export ID, followed by a download link when the file is ready. Set `maxRows` to retrieve a subset or to cap a larger pull. ## Choose Export or another endpoint | You need | Use | | - | - | | Audience size without records | [Count](/api-reference/count), free | | A masked sample before buying | [View](/api-reference/view), free | | Chosen known records by identifier | [Enrich](/api-reference/enrich), metered on PAYG | | Records returned immediately, up to 50,000 | [Preview](/api-reference/preview), metered on PAYG | | A downloadable file, up to 1,000,000 contact rows | Export | Before starting, use Count, View, and Estimate, then confirm the [hold fits your balance](/api-reference/estimate-export#estimate-hold-and-final-charge). The examples use `REVENUEBASE_API_KEY` for your API key. ## Start a bounded export This exports up to 100 US VPs with email selected and mobile excluded. It is the same request body as the Estimate example. > [!WARNING] > > **Running this POST spends credits on PAYG when the export completes.** > Omitting `reveal`, or sending `null`, selects both email and mobile. > Choosing fewer `columns` does not remove reveal charges. ```bash curl --include --request POST 'https://api.revenuebase.ai/v2/contact/exports' \ --header "X-Key: $REVENUEBASE_API_KEY" \ --header 'Content-Type: application/json' \ --data '{ "filter": { "type": "group", "op": "AND", "children": [ { "type": "condition", "column": "COUNTRY_NAME_PER", "operator": "eq", "value": "United States" }, { "type": "condition", "column": "JOB_LEVEL_PER", "operator": "eq", "value": "VP" } ] }, "columns": [ "FULL_NAME_PER", "JOB_TITLE_PER", "COMPANY_NAME_ORG", "EMAIL_ADDRESS_PER" ], "maxRows": 100, "reveal": [ "email" ], "format": "csv", "compression": "gz" }' ``` Save the returned `exportId` as `REVENUEBASE_EXPORT_ID` for the status and cancellation calls below. For a metered account, this example reserves up to 200 credits. Read the `X-Credits-Held` response header. Acceptance is not completion, and held credits are not the final charge. | Field | What it means | | - | - | | `exportId` | Save this identifier to poll or cancel the same job. | | `status` | The current job state; `QUEUED` is still pending. | | `format`, `compression` | The file format and compression selected. | | `maxRows` | The applied row cap, rather than a promise that this many rows match. | ## Poll the existing export Set `EXPORT_ID` to the identifier returned by the start request. Poll every 5–10 seconds initially; back off for longer jobs and respect `X-RateLimit-Reset` after a `429`. Status requests cost 0 credits. ```bash curl 'https://api.revenuebase.ai/v2/contact/exports/'"$EXPORT_ID" \ --header "X-Key: $REVENUEBASE_API_KEY" ``` | Status | What to do | | - | - | | `QUEUED` | Wait and poll; the job has been accepted. | | `PROCESSING` | Wait and poll; the file is being written. | | `CANCELLING` | Wait and poll until cancellation finishes. | | `COMPLETED` | Stop polling and download using `downloadUrl`. | | `ERROR` | Stop polling. Read `code` and `error`; an unfinished failed job releases its hold. | | `CANCELLED` | Stop polling. No file is produced; the unfinished job releases its hold. | Read the response returned by your own call. Job IDs, timestamps, counts, and download links are specific to that request. `rowCount` is the number actually written. The completed status response does not include a final charged-credit field. The credit rules below explain how that amount is calculated. ## Download the file Set `DOWNLOAD_URL` to the signed URL from the completed response. The signed URL authorizes the download; no API-key header is required. Treat it as a credential and share it only with intended recipients. ```bash curl --fail --location --output contacts.csv.gz "$DOWNLOAD_URL" ``` The link expires after `expiresInSeconds` (normally one hour). Poll the same export again for a fresh link. Downloading that completed file again does not start another charged export. Starting a new POST can charge again, even for the same filter and records. ## Credits and options **Final PAYG charge:** returned contact rows + populated revealed emails + 10 × populated revealed mobiles + 10 × SmartSearch filter nodes. For 100 contacts with 80 emails, `reveal: ["email"]` costs 180 credits without SmartSearch. With both details selected, 20 mobiles, and one SmartSearch node, the charge is 390 credits. A successful empty export has no row/detail charge but can still incur the SmartSearch amount. | Option | Effect | | - | - | | `maxRows` | Positive row cap, up to 1,000,000. With an explicit cap, the hold assumes all selected details are populated on every capped row. | | `reveal` | `[]`, `["email"]`, `["mobile"]`, or `["email", "mobile"]`. Omitted/null defaults to both. Unselected requested details become availability booleans. | | `columns` | Fields included in the file. A contact row's available company fields have no separate company-row surcharge. Direct dial has no separate field surcharge. | | `format` | `csv`, `json` (default), or `parquet`. | | `compression` | `gz` (default), `zip`, or `none`. | | `filename` | Optional base name, up to 150 characters. Letters, digits, spaces, and `. _ ( ) -` are allowed; the API adds the format/compression extension. | `maxRows` limits quantity; it does not identify particular chosen rows or provide pagination. Use Enrich for selected IDs. An omitted/null filter means the entire dataset; an omitted row cap uses the service maximum. Send a positive cap and explicit reveal choices to bound spend. ## Cancel or recover To cancel an unfinished job, use the existing export ID: ```bash curl --request DELETE 'https://api.revenuebase.ai/v2/contact/exports/'"$EXPORT_ID" \ --header "X-Key: $REVENUEBASE_API_KEY" ``` Cancellation requests add no credit charge. Keep polling until `CANCELLED`; the hold is released when the unfinished job ends. Cancelling an already completed job returns its terminal state and does not refund the completed export. | Response or error | Action | | - | - | | `402 INSUFFICIENT_CREDITS` | No job starts. Lower `maxRows`, reduce `reveal`, or add credits, then estimate again. `creditsRequired` reports the needed hold and `creditsAvailable` your available balance. | | `400` / `422` | Correct the format, filename, filter, or columns before retrying. | | `429` | Wait for the rate-limit reset. | | `503 ESTIMATE_UNAVAILABLE` on a start without `maxRows` | Retry with an explicit affordable positive row cap; the uncapped start's count timed out. | | `503 CREDITS_UNAVAILABLE` | Metering is temporarily unavailable. Follow `Retry-After` before retrying. | | Export state `ERROR` with `EXPORT_TIMEOUT` | Narrow the audience or reduce the row cap before starting another job. | | Export state `ERROR` with `EXPORT_FAILED` | Read `error`; contact support with the export ID if the failure persists. | | Status/cancel `403` / `404` | Use the export owner's API key and verify the export ID. | > [!NOTE] > > Do not automatically repeat a start POST after an ambiguous timeout: > the original job may have been accepted. When you have an export ID, > check its status. The API does not promise that repeating a customer > start POST will return the same job or avoid another charge. ## Next step Use [Export Status](/api-reference/export-status) to follow the job, or [Cancel Export](/api-reference/cancel-export) to stop it before completion. For another audience, begin with [Count](/api-reference/count). # Stats Source: https://docs.revenuebase.ai/api-reference/stats /api-reference/v2/contact-openapi.json get /stats Read dataset-wide contact rows and distinct company totals. ## Credits and plans PAYG is Pay-as-you-go. AYCE is All-you-can-eat. | Usage | PAYG | AYCE | | - | - | - | | Dataset totals | **Free** 0 credits | **Free** 0 credits | ## When to use Stats Read an overview of the contact dataset or confirm an authenticated request works. To measure an audience selected by criteria, use [Count](/api-reference/count). ## Example Set `REVENUEBASE_API_KEY` to your API key. ```bash curl --request GET 'https://api.revenuebase.ai/v2/contact/stats' \ --header "X-Key: $REVENUEBASE_API_KEY" ``` Response captured from the local test API on October 13, 2026. Results can change as the dataset or account changes. ```json { "uniqueCompanies": 21337431, "contacts": 408446299 } ``` ## Read the totals | Field | Meaning | | - | - | | `contacts` | Contact rows in the whole dataset, rather than a filtered audience or distinct people. | | `uniqueCompanies` | Distinct companies represented by those contact rows. | A person with multiple company records can contribute more than one contact row. Stats does not return individual records or accept an audience filter. Results can be cached; read X-Cache when supplied. ## Next steps Contact and company routes share the [default 10 requests per second per user](/api-reference/v2/rate-limits). Wait for the reset time or Retry-After when rate limited; coordinate requests across your workers and API keys. Use [Count](/api-reference/count) for a filtered total or [Company Stats](/api-reference/company-stats) for company-field coverage. # Authenticate a request Source: https://docs.revenuebase.ai/api-reference/v2/authentication All RevenueBase API requests require an API key in the x-key header. No other authentication methods are supported. All requests require an API key in the `x-key` header. ## Get your API key 1. Sign up at [app.revenuebase.ai](https://app.revenuebase.ai). 2. Go to **Developers** located in the sidebar and copy the **Production API Key**. ## Send the key with every request ```bash theme={null} curl https://api.revenuebase.ai/v2/account/balance \ -H "x-key: {YOUR_API_KEY}" ``` The key goes in the `x-key` header — not in `Authorization`, not as a query parameter. ## Handle authentication errors A missing or invalid key returns `401 Unauthorized`. This response was captured with an invalid key on the local test API on October 13, 2026: ```json theme={null} { "detail": "Invalid API Key" } ``` A valid key that lacks permission for the endpoint returns `403 Forbidden`. Read the returned details to identify the missing permission. **If you get a 401, check:** * The header name is `x-key` (not `Authorization` or `x-api-key`) * You copied the full key with no leading or trailing spaces * The key hasn't been revoked in the dashboard ## Keep keys secure * **Never commit keys to version control** — use environment variables or a secrets manager * **Server-side only** — don't expose keys in client-side code, mobile apps, or browser requests * **Rotate if compromised** — create a new key in the dashboard and revoke the old one immediately ## Use multiple keys Create one key per environment (development, staging, production) or per service. Each key tracks its own usage independently. Revoke keys you no longer need from the dashboard. ## Next steps Rate limits and errors Limits per key, backoff strategy, and all error codes. Verify email addresses Make your first API call. # Search for companies Source: https://docs.revenuebase.ai/api-reference/v2/company-search-overview Choose a company workflow, compare plan costs, enrich a known list, or estimate and export an audience. Use the Company Search API to build account lists — one row per company, with the same filter object and the same workflow as [Contact Search](/api-reference/v2/contact-search-overview). Think of these endpoints as the **company part of a contact record**, deduplicated by `RBID_ORG` for search and export results. Ten matching contacts at one company produce ten contact rows, or one company row. ## Choose the right surface Both surfaces read the same underlying data. What differs is the grain of a row and therefore what a count means. | | Contact Search | Company Search | | - | - | - | | **A row is** | One person at one company | One company | | **Ask it for** | People to contact | Accounts to target | | **Base path** | `/v2/contact` | `/v2/contact/company` | | **Counts** | Contacts, plus distinct companies | Companies, plus contacts at them | | **Filter on** | Person, company, and job fields | Company fields; Count and Export also accept person/job conditions | Searching for "software companies with 200–500 employees" on the contact surface returns every person at those companies. On the company surface it returns the companies themselves, each with a count of how many contacts you'd get. ## Credits and plans PAYG is Pay-as-you-go. AYCE is All-you-can-eat. AYCE includes **unlimited company retrieval at 0 credits**; request rates and per-request limits still apply. | Endpoint or option | PAYG | AYCE | | - | - | - | | [Company Count](/api-reference/company-count), [Insights](/api-reference/company-insights), and [Estimate](/api-reference/estimate-company-export) | **Free** 0 credits | **Free** 0 credits | | [Company Preview](/api-reference/company-preview) | **Free** Within the shared 500-row organization daily allowance | **Unlimited** 0 credits | | [Standalone Lookalike](/api-reference/lookalike) | **1 credit per returned company + 10 for the seed search** | **Unlimited** 0 credits | | [Company Enrich](/api-reference/company-enrich) | **1 credit per returned match** | **Unlimited** 0 credits | | [Company Export](/api-reference/start-company-export) | **1 credit per written company row** | **Unlimited** 0 credits | | SmartSearch on a paid company export | **+10 credits per filter node per request** | **Included** 0 credits | Company fields have no contact email or mobile reveal surcharge. When using contact endpoints, available company fields are already part of the contact row; requesting them does not add a separate company-row charge. See [Credits & Plans](/api-reference/v2/credits) for holds and final charges. ## Understand the data model Company rows are built from the same contact data on the same load schedule. They carry the shared company fields, plus contact totals aggregated for you: | Field | What it means | | - | - | | `CONTACT_COUNT` | Contacts at this company | | `CONTACTS_WITH_EMAIL` | Of those, how many have an email address | | `CONTACTS_WITH_CELLPHONE` | Of those, how many have a mobile number | Company fields such as size, industry, headquarters, funding, and technologies are also available on **contact endpoints**, where you can combine them with person and job filters. Company description SmartSearch and look-alike filters work on both surfaces. The three totals above are company-only; use each surface's column catalog to discover its supported fields. Company responses contain company fields, without individual person or job values. **Company Preview and Insights accept company filters only**; a `_PER` or `_PAO` condition, or job title SmartSearch, returns `422`. **Company Count, Export Estimate, and Export can also use person and job filters.** They apply the filter to contacts, then select the distinct companies represented by those matching contacts. For example, you can count or export companies with matching VPs while keeping one company row per `RBID_ORG`. Contact totals on a company row describe **all contacts at that company**, not only the people who matched a role or location condition. > [!WARNING] > > **Use `HEADQUARTERS_*` for company address.** `CITY_ORG`, `STATE_NAME_ORG` and `COUNTRY_NAME_ORG` hold *a* location the company operates from — sometimes the head office, sometimes not. `HEADQUARTERS_CITY_ORG`, `HEADQUARTERS_STATE_NAME_ORG` and `HEADQUARTERS_COUNTRY_NAME_ORG` hold the headquarters. `LOCATION_COUNT_ORG` tells you how many locations a company lists. > > The non-HQ location fields will become arrays of multiple locations in a future release. Filter on `HEADQUARTERS_*` wherever you need a stable, single answer. | You want | Use | | - | - | | Companies that do a certain thing | Company description SmartSearch, on this surface | | Companies resembling a named account | Look-alike SmartSearch, on this surface | | Companies that employ a certain role | Company Count or Export with person/job conditions; use Contact Search for the matching people | ## Count matching companies ```bash theme={null} curl -X POST https://api.revenuebase.ai/v2/contact/company/count \ -H "x-key: $REVENUEBASE_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "filter": { "type": "group", "op": "AND", "children": [ { "type": "condition", "column": "HEADQUARTERS_COUNTRY_NAME_ORG", "operator": "eq", "value": "United States" } ] } }' ``` Response captured from the local test API on October 13, 2026. Results can change. ```json theme={null} { "companies": 7042375, "contacts": 123034089, "contactsWithEmail": 28863408, "contactsWithCellphone": 36525227 } ``` Company counts are exact. A `mode` field is accepted and ignored. Optional contact totals can be omitted when the dataset lacks them. The contact totals answer the question that usually comes next: this many accounts, and this many reachable people at them. ## Preview matching companies ```bash theme={null} curl -X POST https://api.revenuebase.ai/v2/contact/company/preview \ -H "x-key: $REVENUEBASE_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "filter": { "type": "group", "op": "AND", "children": [ { "type": "condition", "column": "HEADQUARTERS_COUNTRY_NAME_ORG", "operator": "eq", "value": "United States" } ] }, "columns": [ "RBID_ORG", "COMPANY_NAME_ORG", "DOMAIN_ORG" ], "limit": 2 }' ``` Response captured from the local test API on October 13, 2026 using an AYCE account. Results can change. ```json theme={null} { "rows": [ { "RBID_ORG": "rb-oacrey5u7", "COMPANY_NAME_ORG": "Bike Mart", "DOMAIN_ORG": "bikemart.com" }, { "RBID_ORG": "rb-oacrey7is", "COMPANY_NAME_ORG": "Fashion After 50.Com", "DOMAIN_ORG": null } ], "columns": [ "RBID_ORG", "COMPANY_NAME_ORG", "DOMAIN_ORG" ], "columnLabels": { "RBID_ORG": "Rbid Organization", "COMPANY_NAME_ORG": "Company Name", "DOMAIN_ORG": "Organization Domain" }, "rowCount": 2, "limit": 2 } ``` Omit `columns` and you get a default set covering name, domain, website, size, revenue, country, and the two main contact totals. The requested limit defaults to 1,000, with a 50,000 maximum. On PAYG, the response is further limited to the organization's remaining shared daily allowance of 500 free preview rows. With `"includeScores": true` on a SmartSearch filter, rows come back best-match first — which makes preview the fastest way to judge whether a description search or look-alike is aimed correctly. ## Analyze a set of companies `POST /v2/contact/company/insights` takes two of the four contact sections. `reachability` and `freshness` describe people, so they have no company analogue. | Section | Returns | | - | - | | `coverage` | Company counts grouped by a field you choose in `groupField`. Defaults to `EMPLOYEE_COUNT_RANGE_ORG` | | `fillRate` | How often each field in `fields` is populated across matching companies | ```bash theme={null} curl -X POST https://api.revenuebase.ai/v2/contact/company/insights \ -H "x-key: $REVENUEBASE_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "filter": { "type": "group", "op": "AND", "children": [ { "type": "condition", "column": "HEADQUARTERS_COUNTRY_NAME_ORG", "operator": "eq", "value": "United States" } ] }, "section": "fillRate", "fields": [ "DOMAIN_ORG", "LINKEDIN_URL_ORG" ] }' ``` ## Match companies you already have [Company Enrich](/api-reference/company-enrich) retrieves known companies using `domains`, `linkedinUrls`, and `rbidOrgs`. Send up to **10,000 distinct identifiers combined across all three lists**, after normalization and duplicate removal. You can send 10,000 domains in one request. Adding 6,000 domains and 5,000 distinct LinkedIn URLs exceeds the cap and returns 400. PAYG reserves one credit per submitted array entry before deduplication, then settles one credit per returned match. Unmatched inputs add no row charge. ```bash theme={null} curl -X POST https://api.revenuebase.ai/v2/contact/company/enrich \ -H "x-key: $REVENUEBASE_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "domains": [ "stripe.com", "docs-example-no-match.invalid" ], "columns": [ "RBID_ORG", "COMPANY_NAME_ORG", "DOMAIN_ORG" ] }' ``` Response captured from the local test API on October 13, 2026 using an AYCE account. Results can change. ```json theme={null} { "matches": { "stripe.com": { "DOMAIN_ORG": "stripe.com", "RBID_ORG": "rb-oacwbixtv", "COMPANY_NAME_ORG": "Stripe" } }, "columns": [ "DOMAIN_ORG", "RBID_ORG", "COMPANY_NAME_ORG" ], "matched": 1, "total": 2 } ``` Inputs are normalized before matching, and `matches` is keyed by that form. For example, `HTTPS://Stripe.com/` and `stripe.com` land on the same domain entry. `RBID_ORG` is included and can be reused as a seed. The same company supplied as a domain and LinkedIn URL can create two match entries and two PAYG row charges; prefer one identifier per company. ## Find similar companies `POST /v2/contact/company/lookalike` returns companies whose business resembles one you name, ranked by description similarity. ```bash theme={null} curl -X POST https://api.revenuebase.ai/v2/contact/company/lookalike \ -H "x-key: $REVENUEBASE_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "domain": "stripe.com", "limit": 5, "columns": [ "RBID_ORG", "COMPANY_NAME_ORG", "DOMAIN_ORG" ] }' ``` The [standalone Lookalike endpoint](/api-reference/lookalike) returns the nearest other companies, excluding the seed. It accepts `domain` or `rbidOrg`, `columns`, and `limit`. The limit is **25 by default and capped at 200**. The response contains the resolved seed `rbidOrg` and a `matches` list with each company's `similarity` and match classification. The `match` and `maxDistance` controls belong to **lookalike filter nodes**. They are not options on this standalone request. To build an account list with other filters applied — size, geography, industry — use a look-alike filter leg with `POST /v2/contact/company/count` and `/preview` instead. See [SmartSearch](/api-reference/v2/smartsearch). ## Export a company list Start with [Company Estimate](/api-reference/estimate-company-export), then [start the export](/api-reference/start-company-export), poll, and download. Use the same filter, columns, and positive `maxRows` cap for the estimate and start calls. A forecast can be lower than the hold required to start. **1. Start the export** ```bash theme={null} curl -X POST https://api.revenuebase.ai/v2/contact/company/exports \ -H "x-key: $REVENUEBASE_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "filter": { "type": "group", "op": "AND", "children": [ { "type": "condition", "column": "HEADQUARTERS_COUNTRY_NAME_ORG", "operator": "eq", "value": "United States" } ] }, "columns": [ "RBID_ORG", "COMPANY_NAME_ORG", "DOMAIN_ORG" ], "format": "csv", "compression": "gz", "maxRows": 100 }' ``` **2. Poll for status** ```bash theme={null} curl "https://api.revenuebase.ai/v2/contact/company/exports/$REVENUEBASE_EXPORT_ID" \ -H "x-key: $REVENUEBASE_API_KEY" ``` **3. Download the results** Stop polling on COMPLETED, ERROR, or CANCELLED. Keep polling through QUEUED, PROCESSING, FINALIZING, and CANCELLING. A completed export carries a `downloadUrl` valid for one hour. Statuses, formats, compression, row caps, and cancellation all behave exactly as on the contact surface. | Endpoint | What it does | | - | - | | `POST /v2/contact/company/exports/estimate` | Free cost forecast; creates no job and reserves no credits | | `POST /v2/contact/company/exports` | Start an export. Returns an `exportId` | | `GET /v2/contact/company/exports/{export_id}` | Get current status and the download link | | `DELETE /v2/contact/company/exports/{export_id}` | Cancel an export before it completes | PAYG has a shared allowance of **500 free preview rows per organization per UTC day** across Contact View, Company View, and Company Preview. All members and API keys share it. Each returned row counts, including repeated previews; empty and failed queries do not. SmartSearch adds no credit charge on these free previews. The allowance resets at 00:00 UTC. AYCE has no daily preview allowance; per-request limits still apply. ## Browse company fields | Endpoint | What it does | | - | - | | `GET /v2/contact/company/columns` | The company column catalog. `?include=values` embeds the value lists | | `GET /v2/contact/company/columns/{column}/values` | Values for one enumerable company column | | `GET /v2/contact/company/stats` | Table-wide totals: companies, and coverage of domain, LinkedIn URL, and description | The company catalog lists org-grain fields only, so anything it returns is safe to use in a company filter. For what each field contains and how it's sourced, see the [Person-Organization-Insight data dictionary](/docs/data-features/pre-joined-tables/person-organization-insight). ## Next steps Which endpoint should I use? Compare audience counts, samples, retrieved rows, and insights. Build a search filter Conditions, groups, and operators — shared by both surfaces. SmartSearch Match company descriptions and find look-alike companies. # The Contact API Source: https://docs.revenuebase.ai/api-reference/v2/contact-api-overview Search contacts and companies with the same filters. Understand joined contact records, deduplicated company results, and the endpoints for inspecting an audience. The Contact API lets you search **contacts and companies** with one reusable filter. Describe the people or accounts you want — by role, company size, what the business does, or resemblance to an account you already know — then count, inspect, and retrieve the records you need. Use `/v2/contact/*` for people with their company data attached. Use `/v2/contact/company/*` for the company part of that data, deduplicated to **one row per company** in search and export results. It's the same data as the [data feeds](/docs/data-feeds/overview), queried live instead of delivered monthly. ## What one record is A record from a **contact endpoint** is a **pre-joined contact**: one person, at one company, with that company's firmographics and insights already attached. There is no join to write and no second call to fetch its available company fields. PersonName, email, and phone\_PER \+ Their jobTitle, seniority, and tenure\_PAO \+ Their companySize, industry, and location\_ORG ↓ One row from a contact endpointFilter on any of the three at once — no join required That is why a single filter can say "VPs of Marketing **at** software companies **with** 200–500 employees **in** the US" without touching more than one endpoint. ## Read a column name The suffix on every column tells you which part of the record it describes. Learn this one thing and the whole API opens up. | Suffix | Describes | Examples | | - | - | - | | `_PER` | The person | `FULL_NAME_PER`, `EMAIL_ADDRESS_PER`, `COUNTRY_NAME_PER` | | `_ORG` | Their company | `COMPANY_NAME_ORG`, `INDUSTRY_LINKEDIN_ORG`, `EMPLOYEE_COUNT_RANGE_ORG` | | `_PAO` | Their job at that company | Role and tenure fields | > [!NOTE] > > **Developer rule of thumb** > > `COUNTRY_NAME_PER` is where the **person** is. For where the **company** is, use the `HEADQUARTERS_*` fields. These are frequently different. For "people in the United States", you almost always want `_PER`. These map directly onto the identifiers used across the data feeds — `RBID_PER` for the person, `RBID_ORG` for the company, `RBID_PAO` for this person at this company. See [Data Overview](/docs/data-feeds/overview) for the full model, and the [Person + Organization + Insights](/docs/data-features/pre-joined-tables/person-organization-insight) data dictionary for every field. ### Company location vs headquarters Companies operate from more than one place, and the field you pick decides which one you get. | Fields | What they hold | | - | - | | `HEADQUARTERS_CITY_ORG`, `HEADQUARTERS_STATE_NAME_ORG`, `HEADQUARTERS_COUNTRY_NAME_ORG` | **The company's headquarters.** Use these for a company address. | | `CITY_ORG`, `STATE_NAME_ORG`, `COUNTRY_NAME_ORG` | *A* location the company operates from — sometimes the headquarters, sometimes not. | | `LOCATION_COUNT_ORG` | How many locations the company lists. | > [!WARNING] > > Filtering on `COUNTRY_NAME_ORG` when you meant the head office quietly returns companies whose HQ is somewhere else. For "companies headquartered in the United States", use `HEADQUARTERS_COUNTRY_NAME_ORG`. The non-HQ location fields hold a single value today and will become arrays of multiple locations in a future release. Filter on `HEADQUARTERS_*` wherever you need a stable, single answer. ## Two ways to search Both read the same graph. What changes is the grain of a row. | | Contact Search | Company Search | | - | - | - | | **A row is** | One person, with their company attached | One company | | **Fields available** | Person, job, **and** company | Company only | | **Ask it for** | People to contact | Accounts to target | | **Base path** | `/v2/contact` | `/v2/contact/company` | **Contact Search is the main surface.** It returns the whole record — person fields and company fields together — so most work starts and ends here. **Company Search returns the company part of the same data.** In contact results, a company's fields repeat for each matching person at that company. Company search and export results deduplicate those companies by `RBID_ORG`. Reach for this surface when you want an account list or a company count. For example, two contacts at Northwind Analytics and one at Globex are **three contact rows or two company rows**: ```mermaid theme={null} %%{init: {'flowchart': {'htmlLabels': false}}}%% flowchart LR dana["Dana at Northwind"] --> northwind["Northwind: 1 company"] lee["Lee at Northwind"] --> northwind sam["Sam at Globex"] --> globex["Globex: 1 company"] ``` ## Use company search fields on contact endpoints You can filter contact searches directly on company fields: employee size, industry, headquarters, revenue, funding, technologies, and more. Company description SmartSearch and look-alike filters also work on contact searches. Add person or job conditions to find the people you want at those companies. For example, combine `HEADQUARTERS_COUNTRY_NAME_ORG = United States`, `EMPLOYEE_COUNT_RANGE_ORG = 201-500`, and `JOB_LEVEL_PER = VP` in one filter. Reuse that filter with contact **Count, View, Preview, Insights, or Export**. You do not need to search companies first and pass their IDs to a second query. > [!NOTE] > > The company surface adds three company-only totals: `CONTACT_COUNT`, > `CONTACTS_WITH_EMAIL`, and `CONTACTS_WITH_CELLPHONE`. Discover supported > fields with `/v2/contact/columns` for contacts or > `/v2/contact/company/columns` for companies. Available company fields > returned on a contact row have no separate company-row charge. > [!NOTE] > > Company Preview and Company Insights take company filters. Company Count > and Company Export can also apply person or job conditions to the contact > audience and return its distinct companies. See > [company filter scope](/api-reference/v2/company-search-overview#understand-the-data-model). ## Start in three minutes **1. Set your key** Every request takes an API key in the `x-key` header. Grab yours from **Developers** in the [dashboard](https://app.revenuebase.ai). ```bash theme={null} export KEY="{YOUR_API_KEY}" export API="https://api.revenuebase.ai/v2/contact" ``` **2. Prove it works** ```bash theme={null} curl "$API/stats" -H "x-key: $KEY" ``` Response captured from the local test API on October 13, 2026. Totals change as the dataset changes. ```json theme={null} { "uniqueCompanies": 21337431, "contacts": 408446299 } ``` **3. Size an audience** This counts VPs located in the United States, using the same audience as the Count and View examples. ```bash theme={null} curl -X POST "$API/count" \ -H "x-key: $KEY" -H "Content-Type: application/json" \ -d '{ "filter": { "type": "group", "op": "AND", "children": [ { "type": "condition", "column": "COUNTRY_NAME_PER", "operator": "eq", "value": "United States" }, { "type": "condition", "column": "JOB_LEVEL_PER", "operator": "eq", "value": "VP" } ] }, "mode": "fast" }' ``` Response captured from the local test API on October 13, 2026. Your counts can change. ```json theme={null} { "total": 1318125, "companies": 323960, "withEmail": 567221, "withCellphone": 742003, "exact": { "total": true, "companies": false, "withEmail": false, "withCellphone": false }, "mode": "fast" } ``` **4. Look at who you got** Reuse the filter with [View](/api-reference/view) for a **free masked sample**. If the people look right, [estimate an export](/api-reference/estimate-export) with an explicit `maxRows` and `reveal` choice, then [start the export](/api-reference/start-export). ## What makes it different Most contact APIs match characters. A title list of twenty entries misses the forty spellings you didn't think of, and `contains "marketing"` returns Marketing Interns. **SmartSearch matches meaning.** Describe a role, describe what a company does, or point at a company you already like — and combine all three in one query, with ordinary filters alongside. Nothing else in this market lets you put five look-alike companies, two job-title searches, and an exclusion in the same request. Company Description Find companies by what they actually do. Job Title Find people by the role they actually hold. Company Look-alike Find companies resembling one you name. ## The workflow Use [Count, View, Preview, Insights, and Start Export](/api-reference/v2/which-endpoint) to choose the output you need from the same audience: totals, a masked sample, aggregate analysis, immediate records, or a downloadable file. Start with **Count, View, Estimate, then Start Export**. The first three steps cost 0 credits. On PAYG, the export charges for returned rows and the contact details you choose, plus any paid SmartSearch filter-node charges. | Step | Endpoint | Answers | Credits | | - | - | - | - | | **1. Count** | [Count](/api-reference/count) | How many contact rows match? | 0 | | **2. View** | [View](/api-reference/view) | Do these look like the right people? | 0; email/mobile masked | | **3. Estimate** | [Estimate](/api-reference/estimate-export) | What might this export cost, and can I cover its hold? | 0 | | **4. Start Export** | [Start Export](/api-reference/start-export) | Create a job for a file, with a row cap I choose | PAYG chart; included on AYCE | [Preview](/api-reference/preview) returns up to 50,000 full contact rows inline and is charged on PAYG. [Enrich](/api-reference/enrich) retrieves chosen known records. Export creates a file of up to 1,000,000 rows; use `maxRows` to request a smaller list. See [credits and plans](/api-reference/v2/credits) for the additive chart, reveal choices, and the difference between estimates and holds. ## Limits Everything the API caps, in one place. Both surfaces share these unless a row says otherwise. ### What you send | Limit | Value | Exceeding it | | - | - | - | | Emails and person IDs per contact `enrich` call | **10,000** combined | `400` | | Domains, LinkedIn URLs, and company RBIDs per company `enrich` call | **10,000** combined | `400` | | Values in one `in` or `notIn` list | **50,000** | `422` | | Values across every `in` / `notIn` list in one request | **50,000** | `422` | | Conditions per filter | 25 | `422` | | Filter nesting depth | 8 | `422` | | Job title SmartSearch nodes per filter | 3 | `422` | | Company description SmartSearch nodes per filter | 3 | `422` | | Look-alike SmartSearch nodes per filter | 10 | `422` | | SmartSearch `text` length | 300 characters | `422` | | Export `filename` | 150 characters, letters/digits/spaces and `. _ ( ) -` | `400` | Both enrich caps count distinct accepted identifiers **after normalization and deduplication**, across all supplied lists. For example, 6,000 distinct domains plus 5,000 distinct LinkedIn URLs exceeds the company cap. Deduplicate inputs before sending them: both Enrich endpoints reserve PAYG credits using submitted entries before deduplication. See [Contact Enrich](/api-reference/enrich) and [Company Enrich](/api-reference/company-enrich) for their hold calculations. The two `in` list caps are separate and both apply. A single clause may carry 50,000 values, **and** every `in` and `notIn` clause in the filter adds up to at most 50,000 — so four `OR`-ed clauses of 20,000 each is rejected even though no single clause exceeds the cap. > [!TIP] > > Over a cap? Split the input and merge the responses. Both `enrich` endpoints key their results by the value you sent, so merging is a dictionary update — no re-matching required. ### What you get back | Limit | Value | Notes | | - | - | - | | Free View sample | **100** max per call | Email/mobile are availability booleans; PAYG: 500 rows per organization per UTC day, shared with company previews; AYCE: no daily allowance | | Preview rows | **50,000** max, 1,000 default | A higher `limit` is clamped, not rejected | | Export rows | **1,000,000** max | Lower it with `maxRows` | | Standalone Lookalike results | **200** max, 25 default | Nearest companies to the seed; use a lookalike filter for an audience with a similarity threshold | | Distinct values per column | The column's own `valueLimit` | Multiselect columns only; read it from `/v2/contact/columns` | | Export download link | 1 hour | Poll the export again for a fresh one | ### Rate limits Contact and company endpoints share a default limit of **10 requests per second per authenticated user**, across that user's API keys. Requests over the limit return `429`. When rate limiting is active, responses include `X-RateLimit-Limit`, `X-RateLimit-Remaining`, and `X-RateLimit-Reset`. See [Rate limits and error codes](/api-reference/v2/rate-limits) for retry guidance and how to request a higher limit, and [Credits & Plans](/api-reference/v2/credits) for usage charges. ## Where to go next Which endpoint should I use? Compare free audience checks, immediate Preview results, and file downloads with Start Export. Search for contacts The main surface — count, preview, insights, enrich, export. Search for companies The same data at company grain. SmartSearch Search by meaning, and combine several searches in one query. Build a search filter The JSON structure every endpoint shares. # Search for contacts Source: https://docs.revenuebase.ai/api-reference/v2/contact-search-overview Count and inspect an audience for free, estimate its cost, and choose how many contact records to retrieve. Use the Contact Search API to find business contacts by role, company, and location. Using Count, View, Estimate, and Export lets you check the audience before paying for the records and contact details you need. ## Choose the right method | You need | Endpoint | Credits | | - | - | - | | Matching audience size | [Count](/api-reference/count) | 0 | | A masked sample, up to 100 rows | [View](/api-reference/view) | 0 | | Audience composition, reachability, freshness, or field fill rates | [Insights](/api-reference/insights) | 0 | | A forecast before exporting | [Estimate](/api-reference/estimate-export) | 0 | | Full records returned immediately, up to 50,000 | [Preview](/api-reference/preview) | PAYG retrieval chart | | Known contacts, up to 10,000 identifiers | [Enrich](/api-reference/enrich) | PAYG match and detail prices | | A downloadable file, up to 1,000,000 rows | [Export](/api-reference/start-export) | PAYG retrieval chart | Reuse the same filter across the steps. To control spend, choose `reveal` explicitly and set `limit` for inline records or a positive `maxRows` for a file. See [Which endpoint should I use?](/api-reference/v2/which-endpoint) for a visual comparison of Count, View, Preview, Insights, and Start Export, with free calls and PAYG credit costs labeled. When rate limiting is active, Contact API responses report the limit through `X-RateLimit-Limit`, `X-RateLimit-Remaining`, and `X-RateLimit-Reset`. See [Rate limits and error codes](/api-reference/v2/rate-limits) for retry guidance, and [Credits and plans](/api-reference/v2/credits) for the prices. AYCE includes unlimited contact retrieval for 0 credits; per-request limits still apply. ## Understand the data model Every record is one person at one company. Person fields and company fields sit on the same record, so a single search can filter on both at once — no joining required. The company search fields also work here. Filter contacts by their company's size, industry, headquarters, revenue, funding, or technologies, and combine those conditions with a person's role or location. Company description SmartSearch and look-alike filters are available on contact searches too. See [shared company fields](/api-reference/v2/contact-api-overview#use-company-search-fields-on-contact-endpoints) for the company-only contact-total exceptions. Column names end in a suffix that tells you what the field describes: | Suffix | Describes | Examples | | - | - | - | | `_PER` | The person — name, contact details, location | `FULL_NAME_PER`, `EMAIL_ADDRESS_PER`, `COUNTRY_NAME_PER` | | `_ORG` | Their company — size, industry, location | `COMPANY_NAME_ORG`, `INDUSTRY_LINKEDIN_ORG`, `EMPLOYEE_COUNT_RANGE_ORG` | | `_PAO` | Their job at that company | Role and tenure fields | `COUNTRY_NAME_PER` is where the person is. For where the company is, use the `HEADQUARTERS_*` fields — `HEADQUARTERS_COUNTRY_NAME_ORG` and friends. These are frequently different, so for "people in the United States", use `_PER`. > [!WARNING] > > `COUNTRY_NAME_ORG` is *a* location the company operates from, not necessarily the head office. For "companies headquartered in the United States", use `HEADQUARTERS_COUNTRY_NAME_ORG`. See [Company location vs headquarters](/api-reference/v2/contact-api-overview#company-location-vs-headquarters). Every field is documented in the [Person-Organization-Insight data dictionary](/docs/data-features/pre-joined-tables/person-organization-insight), including how each one is sourced and how often it's populated. ## Count matching contacts Send a filter describing who you want. See [Build a search filter](/api-reference/v2/search-filters) for the full syntax. ```bash theme={null} curl -X POST https://api.revenuebase.ai/v2/contact/count \ -H "x-key: $REVENUEBASE_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "filter": { "type": "group", "op": "AND", "children": [ { "type": "condition", "column": "COUNTRY_NAME_PER", "operator": "eq", "value": "United States" }, { "type": "condition", "column": "JOB_LEVEL_PER", "operator": "eq", "value": "VP" } ] }, "mode": "fast" }' ``` Response captured from the local test API on October 13, 2026. Results can change. ```json theme={null} { "total": 1318125, "companies": 323960, "withEmail": 567221, "withCellphone": 742003, "exact": { "total": true, "companies": false, "withEmail": false, "withCellphone": false }, "mode": "fast" } ``` The `exact` object reports which figures are precise. In the default `fast` mode everything except `total` is an estimate — display those with a `~`. Send `"mode": "exact"` for precise figures at the cost of a slower response. Counting accounts rather than people? [Company Search](/api-reference/v2/company-search-overview) takes the same filter and returns one row per company. ## Preview matching contacts Preview returns full contact rows inline and is charged on PAYG. Use [View](/api-reference/view) for a free masked relevance check. The example below buys email without mobile; see [credits](/api-reference/v2/credits). ```bash theme={null} curl -X POST https://api.revenuebase.ai/v2/contact/preview \ -H "x-key: $REVENUEBASE_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "filter": { "type": "group", "op": "AND", "children": [ { "type": "condition", "column": "COUNTRY_NAME_PER", "operator": "eq", "value": "United States" }, { "type": "condition", "column": "JOB_LEVEL_PER", "operator": "eq", "value": "VP" } ] }, "columns": [ "RBID_PAO", "FULL_NAME_PER", "JOB_TITLE_PER", "COMPANY_NAME_ORG", "EMAIL_ADDRESS_PER" ], "limit": 2, "reveal": [ "email" ] }' ``` **Response:** Response captured from the local test API on October 13, 2026 using an AYCE account. Results can change. ```json theme={null} { "rows": [ { "RBID_PAO": "rb-pab23456t-rb-oadkxzpcq", "FULL_NAME_PER": "Matthew Tobin", "JOB_TITLE_PER": "Senior Vice President Business Development", "COMPANY_NAME_ORG": "Ecapital Corp", "EMAIL_ADDRESS_PER": "mtobin@ecapital.com" }, { "RBID_PAO": "rb-pab2346sr-rb-oacopeifk", "FULL_NAME_PER": "Katherine Collins", "JOB_TITLE_PER": "AVP of Claim Operations", "COMPANY_NAME_ORG": "Travelers", "EMAIL_ADDRESS_PER": "katherine.collins@travelers.com" } ], "columns": [ "RBID_PAO", "FULL_NAME_PER", "JOB_TITLE_PER", "COMPANY_NAME_ORG", "EMAIL_ADDRESS_PER" ], "columnLabels": { "RBID_PAO": "Rbid Person And Organization", "FULL_NAME_PER": "Person Full Name", "JOB_TITLE_PER": "Job Title", "COMPANY_NAME_ORG": "Company Name", "EMAIL_ADDRESS_PER": "Email Address" }, "rowCount": 2, "limit": 2 } ``` Omit `columns` to receive a default set. Results are unordered and there is no pagination — preview returns a sample, not page one of a list. For a complete list, use an export. ## Understand the response fields | Field | Values | What it means | | - | - | - | | `total` | integer | Contacts matching the filter. Always exact. | | `companies` | integer | Distinct companies represented. Estimated in `fast` mode. | | `withEmail` | integer | Matching contacts that have an email address. Estimated in `fast` mode. | | `withCellphone` | integer | Matching contacts that have a mobile number. Estimated in `fast` mode. | | `exact` | object | Which of the counts above are precise. | | `rows` | array | Matching records, one object per contact. | | `columns` | array | Column names present in each row, in order. | | `columnLabels` | object | Display names for each column, for table headers. | | `rowCount` | integer | Rows returned. Never exceeds `limit`. | ## Export a full list Exports run asynchronously. First inspect a free [View](/api-reference/view), then [estimate the export](/api-reference/estimate-export). Use the same body with an explicit row cap and reveal choice when starting the paid job. **1. Start the export** Returns an `exportId` when accepted; acceptance is not completion. This bounded example retrieves up to 100 contacts with email, without mobile. It can reserve up to 200 credits on PAYG before writing the file. ```bash theme={null} curl -X POST https://api.revenuebase.ai/v2/contact/exports \ -H "x-key: $REVENUEBASE_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "filter": { "type": "group", "op": "AND", "children": [ { "type": "condition", "column": "COUNTRY_NAME_PER", "operator": "eq", "value": "United States" }, { "type": "condition", "column": "JOB_LEVEL_PER", "operator": "eq", "value": "VP" } ] }, "maxRows": 100, "reveal": [ "email" ], "format": "csv", "compression": "gz" }' ``` Save the `exportId` returned by your start call as `REVENUEBASE_EXPORT_ID`. Read your actual status response for row counts and the download link. **2. Poll for status** ```bash theme={null} curl "https://api.revenuebase.ai/v2/contact/exports/$REVENUEBASE_EXPORT_ID" \ -H "x-key: $REVENUEBASE_API_KEY" ``` Poll every 5–10 seconds initially and back off for longer jobs. Stop on **`COMPLETED`, `ERROR`, or `CANCELLED`**. Status calls cost 0 credits. **3. Download the results** A completed export includes a `downloadUrl`: Save the `exportId` returned by your start call as `REVENUEBASE_EXPORT_ID`. Read your actual status response for row counts and the download link. The link requires no API key and expires after one hour. Treat it as a credential — anyone holding it can download the file. Poll again to get a fresh link. ## Track export status | Status | What it means | | - | - | | `QUEUED` | Accepted, not yet started | | `PROCESSING` | Writing rows | | `COMPLETED` | File ready. `downloadUrl` and row counts are present | | `ERROR` | Stop polling. `code` and `error` explain why | | `CANCELLING` | Cancellation requested, still winding down | | `CANCELLED` | Stopped. No file produced | ## Manage exports | Endpoint | What it does | | - | - | | `POST /v2/contact/exports` | Start an export. Returns an `exportId` | | `GET /v2/contact/exports/{export_id}` | Get current status and the download link | | `DELETE /v2/contact/exports/{export_id}` | Cancel an export before it completes | Cancelling an export that has already finished returns its final status unchanged. The [complete Export reference](/api-reference/start-export) explains credit holds, settlement, cancellation, signed-link refresh, and safe retry decisions. ## Analyze an audience `POST /v2/contact/insights` returns aggregate statistics for a filter instead of rows. Send one `section` per request. | Section | Returns | | - | - | | `reachability` | How many matching contacts have an email, a mobile number, or both | | `freshness` | How recently emails were verified and records updated, in age bands | | `coverage` | Contact counts broken down by a field you choose in `groupField` | | `fillRate` | How often each field in `fields` is populated | ```bash theme={null} curl -X POST https://api.revenuebase.ai/v2/contact/insights \ -H "x-key: $REVENUEBASE_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "filter": { "type": "group", "op": "AND", "children": [ { "type": "condition", "column": "COUNTRY_CODE_PER", "operator": "eq", "value": "US" } ] }, "section": "reachability" }' ``` **Response:** Response captured from the local test API on October 13, 2026. Results can change. ```json theme={null} { "section": "reachability", "reachability": { "total": 106956086, "withEmail": 24409894, "withMobile": 45333156, "withBoth": 13864920 } } ``` ## Match contacts you already have `POST /v2/contact/enrich` looks up records for a list of email addresses. Send up to **10,000 addresses per request**, counted after canonicalization and de-duplication — 12,000 addresses that resolve to 9,000 distinct ones is fine. Over the cap returns `400`; split the list and merge the responses. See [Limits](/api-reference/v2/contact-api-overview#limits). ```bash theme={null} curl -X POST https://api.revenuebase.ai/v2/contact/enrich \ -H "x-key: $REVENUEBASE_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "personIds": [ "rb-pab23456t-rb-oadkxzpcq", "rb-pab2346sr-rb-oacopeifk" ], "columns": [ "RBID_PAO", "FULL_NAME_PER", "JOB_TITLE_PER", "COMPANY_NAME_ORG", "EMAIL_ADDRESS_PER" ], "reveal": [ "email" ] }' ``` **Response:** Response captured from the local test API on October 13, 2026 using an AYCE account. Results can change. ```json theme={null} { "matches": { "rb-pab23456t-rb-oadkxzpcq": { "RBID_PAO": "rb-pab23456t-rb-oadkxzpcq", "FULL_NAME_PER": "Matthew Tobin", "JOB_TITLE_PER": "Senior Vice President Business Development", "COMPANY_NAME_ORG": "Ecapital Corp", "EMAIL_ADDRESS_PER": "mtobin@ecapital.com" }, "rb-pab2346sr-rb-oacopeifk": { "RBID_PAO": "rb-pab2346sr-rb-oacopeifk", "FULL_NAME_PER": "Katherine Collins", "JOB_TITLE_PER": "AVP of Claim Operations", "COMPANY_NAME_ORG": "Travelers", "EMAIL_ADDRESS_PER": "katherine.collins@travelers.com" } }, "columns": [ "RBID_PAO", "FULL_NAME_PER", "JOB_TITLE_PER", "COMPANY_NAME_ORG", "EMAIL_ADDRESS_PER" ], "matched": 2, "total": 2 } ``` Results are keyed by the address you submitted, so they join directly back to your own list. Addresses with no match are absent from `matches`; `total` minus `matched` is your miss count. ## Browse the data | Endpoint | What it does | | - | - | | `GET /v2/contact/columns` | The column catalog. `?include=values` embeds the value lists | | `GET /v2/contact/columns/{column}/values` | Values for one enumerable column | | `GET /v2/contact/stats` | Table-wide totals: contacts and distinct companies | | `GET /v2/contact/match-presets` | The named SmartSearch presets and what each one means | | `GET /v2/contact/health` | Service liveness. No API key required | ```bash theme={null} curl https://api.revenuebase.ai/v2/contact/stats \ -H "x-key: $REVENUEBASE_API_KEY" ``` **Response:** Response captured from the local test API on October 13, 2026. Results can change. ```json theme={null} { "uniqueCompanies": 21337431, "contacts": 408446299 } ``` For what each field contains and how it's sourced, see the [Person-Organization-Insight data dictionary](/docs/data-features/pre-joined-tables/person-organization-insight). The catalog tells you which columns exist; the data dictionary tells you what they mean. ## Find similar companies Look-alike search is company-grain, so it lives on the company surface — see [Search for companies](/api-reference/v2/company-search-overview). You can still use a look-alike leg inside a contact filter to find *people* at similar companies; see [SmartSearch](/api-reference/v2/smartsearch). ## Next steps Build a search filter Conditions, groups, and operators. SmartSearch Match job titles, company descriptions, and look-alike companies on meaning. # Understand credits and plans Source: https://docs.revenuebase.ai/api-reference/v2/credits Free audience inspection, additive PAYG credit prices, and the difference between export estimates, holds, and final charges. Compare API usage on Pay-as-you-go (PAYG) and All-you-can-eat (AYCE). AYCE includes **unlimited contact and company retrieval**, including available contact email and mobile details. Email Verification has its own per-result prices below. Per-request, masked-sample, and [rate limits](/api-reference/v2/rate-limits) still apply on both plans. ## Compare contact endpoint costs | Endpoint | PAYG | AYCE | | - | - | - | | [Count](/api-reference/count) Size an audience | **Free** 0 credits, including SmartSearch | **Included** 0 credits | | [View](/api-reference/view) Inspect a masked sample | **Free** 0 credits, including SmartSearch | **Included** 0 credits | | [Estimate](/api-reference/estimate-export) Forecast an export | **Free** 0 credits; no job or hold | **Included** 0 credits; no job or hold | | [Preview](/api-reference/preview) Retrieve a filtered list immediately | **Uses credits** Row, detail, and SmartSearch prices below | **Unlimited** Contact retrieval 0 credits | | [Enrich](/api-reference/enrich) Retrieve known contacts | **Uses credits** Match and detail prices below; no SmartSearch fee | **Unlimited** Contact retrieval 0 credits | | [Start Export](/api-reference/start-export) Prepare a file download | **Uses credits** Row, detail, and SmartSearch prices below | **Unlimited** Contact retrieval 0 credits | View returns up to 100 masked contact rows per request. PAYG has a shared allowance of **500 free preview rows per organization per UTC day** across Contact View, Company View, and Company Preview. All members and API keys share it. Each returned row counts, including repeated previews; empty and failed queries do not. SmartSearch adds no credit charge on these free previews. The allowance resets at 00:00 UTC. AYCE has no daily preview allowance; per-request limits still apply. Free previews return `X-Credits-Charged: 0` and, on PAYG, `X-FreePreview-Remaining`. A request near the boundary returns only the remaining allowance with a warning. Once exhausted, these endpoints return `429 FREE_PREVIEW_CAP_REACHED` until UTC midnight; they never switch to paid retrieval automatically. If the allowance cannot be checked, they return `503 FREE_PREVIEW_UNAVAILABLE`. Counts remain free and do not consume this allowance. Contact Preview (`/preview`), reveals, company enrichment, standalone lookalike, and exports retain their separate paid pricing. Insights, column metadata, dataset stats, match presets, and credit-price discovery also cost 0 credits. Reading or cancelling an existing export adds no credit charge. ## Compare retrieval prices | Usage | PAYG | AYCE | | - | - | - | | Contact row | **1 credit per returned row** | **Unlimited** 0 credits | | Revealed email | **+1 credit per populated selected email** | **Unlimited** 0 credits | | Revealed mobile | **+10 credits per populated selected mobile** | **Unlimited** 0 credits | | SmartSearch filter node | **+10 credits per node per paid request** | **Included** 0 credits | | Company row, on enrichment/export | **1 credit per returned company** | **Unlimited** 0 credits | | Direct dial | No separate field surcharge; row charge applies | **Included** 0 credits | PAYG prices are additive. A SmartSearch node means each semantic or lookalike node in the filter; its fee is per request, rather than per returned row. A contact row already contains its available company fields. Requesting those fields does not add a separate company-row charge. For contact exports, the final charge is: ```text theme={null} contact rows + populated revealed emails + (10 × populated revealed mobiles) + (10 × SmartSearch filter nodes) ``` Contact Preview uses the same chart on PAYG. Contact Enrich charges matching rows and selected populated details; it has no search-filter tree or SmartSearch fee. Company enrichment costs 1 per returned company; company exports add any SmartSearch filter-node charges to the company-row amount. Missing selected email/mobile values add no detail charge. An empty ordinary retrieval has no row charge, but a successful empty paid search/export with SmartSearch nodes can still charge the flat SmartSearch amount. ## Choose contact details explicitly | `reveal` | Maximum credits per contact row before SmartSearch | | - | - | | `[]` | 1: profile without revealed email/mobile | | `["email"]` | 2 | | `["mobile"]` | 11 | | `["email", "mobile"]` | 12 | > [!WARNING] > > Omitting `reveal`, or sending `null`, selects **both email and mobile**. > Choosing fewer `columns` does not remove reveal charges. Set `reveal` > explicitly on paid contact requests. On PAYG, an email/mobile column requested without its corresponding `reveal` selection becomes a `hasEmail` / `hasMobile` availability boolean. On AYCE Preview and Enrich, `columns` controls returned fields and `reveal` does not mask them. For example, an email-only file with 100 contacts and 80 populated emails costs **180 credits** without SmartSearch: `100 + 80`. A file with those same contacts, both details selected, 20 populated mobiles, and one SmartSearch node costs **390 credits**: `100 + 80 + (20 × 10) + 10`. ## Distinguish the estimate, hold, and charge | Amount | What it means | | - | - | | Estimate | A free forecast from the audience counts. It is not a guaranteed ceiling. | | Hold | Credits reserved before a metered export starts. With explicit `maxRows`, assume every selected detail is populated on every capped row. | | Final charge | Actual rows written, populated selected details, and SmartSearch nodes when the export completes. Unused held credits are released. | With `maxRows: 100` and email selected, the hold is up to 200 credits. With both details and one SmartSearch node, it is up to 1,210 credits, even when the final charge is the 390-credit example above. Your balance must cover the hold. If it cannot, Export returns `402 INSUFFICIENT_CREDITS` without starting a job. It does not automatically export a smaller affordable subset. Reduce `maxRows` or your reveal choices, then estimate again. Always use a positive row cap; `0` uses the maximum. An unfinished failed or cancelled export releases its hold when it ends. Cancelling a completed export does not refund it. Completion settles the charge whether or not you subsequently download the file. ## Holds for immediate retrieval Contact Preview and Enrich reserve a PAYG hold before retrieving records. Preview uses the applied `limit`; Enrich uses the submitted array-entry count before normalization or duplicate removal. Both assume every requested row or entry has every selected detail. Their final charge uses the records actually returned. Unmatched Enrich inputs add no row charge. See the [Preview hold](/api-reference/preview#control-the-credit-hold) and [Enrich hold](/api-reference/enrich#control-the-credit-hold-and-returned-fields) examples before sending a paid request. ## Compare company endpoint costs | Endpoint or option | PAYG | AYCE | | - | - | - | | [Company Count](/api-reference/company-count), [Insights](/api-reference/company-insights), and [Estimate](/api-reference/estimate-company-export) | **Free** 0 credits | **Free** 0 credits | | [Company Preview](/api-reference/company-preview) | **Free** Within the shared 500-row organization daily allowance | **Unlimited** 0 credits | | [Standalone Lookalike](/api-reference/lookalike) | **1 credit per returned company + 10 for the seed search** | **Unlimited** 0 credits | | [Company Enrich](/api-reference/company-enrich) | **1 credit per returned match** | **Unlimited** 0 credits | | [Company Export](/api-reference/start-company-export) | **1 credit per written row** | **Unlimited** 0 credits | | SmartSearch on a paid company export | **+10 per filter node per request** | **Included** 0 credits | Company Enrich holds one credit per submitted array entry before deduplication, then settles against returned matches. Company Export holds against the row cap plus SmartSearch node fees. Company fields do not add contact email or mobile reveal surcharges. ## Compare email verification costs | Result or option | PAYG | AYCE | | - | - | - | | Valid | **1 credit per result** | **1 credit per result** | | Invalid | **1 credit per result** | **1 credit per result** | | Unknown | **Free** 0 credits | **Free** 0 credits | | Metadata | **Included** No extra cost | **Included** No extra cost | | Upload, job status, cancellation, and download | **Free**, 0 additional credits | **Free**, 0 additional credits | The final verification charge is the number of Valid results plus Invalid results. Requesting metadata does not change that amount. A batch still needs enough available credits for its input before it starts. Cancelling a running batch does not refund already processed Valid or Invalid checks. See [verification statuses and metadata](/api-reference/v2/email-verification-metadata) and [the batch workflow](/api-reference/v2/email-verification-overview#process-a-batch). ## Check your balance and current prices Set your API key as `REVENUEBASE_API_KEY`. ```bash theme={null} curl 'https://api.revenuebase.ai/v2/account/balance' \ --header "X-Key: $REVENUEBASE_API_KEY" ``` Use the free [price catalog](/api-reference/credit-prices) when your application calculates a retrieval bound: ```bash theme={null} curl 'https://api.revenuebase.ai/v2/contact/credits/prices' \ --header "X-Key: $REVENUEBASE_API_KEY" ``` **Price response for the chart above:** ```json theme={null} { "contactRow": 1, "companyRow": 1, "email": 1, "mobile": 10, "smartField": 10 } ``` Metered synchronous retrieval responses expose `X-Credits-Charged` and `X-Credits-Remaining`. Export creation instead exposes `X-Credits-Held`. The current export status body does not report its final charged-credit amount. ## Repeat requests and downloads Repeated paid retrievals and new export POSTs can charge again, including for the same records. Do not automatically repeat a start POST after an ambiguous timeout. If you have an export ID, poll that job instead. Polling an existing export, refreshing its signed link, and downloading the same completed file again do not start another paid export. Follow the [export recovery guidance](/api-reference/start-export#cancel-or-recover). ## Next steps Estimate a bounded export Choose rows and details, then compare the forecast and hold with your budget. Export matching contacts Start, poll, download, cancel, and recover an export. # Email Verification statuses and metadata Source: https://docs.revenuebase.ai/api-reference/v2/email-verification-metadata Understand verification results, provider and MX details, and the reason behind each result. Request `?metadata=true` to include the details behind an email verification. **Metadata is included at no extra cost**, for both single checks and batch files. It does not add a charge per field or change the price of a result. ## Verification results and credits The primary `status` determines the verification charge on both PAYG and AYCE. AYCE includes unlimited contact retrieval; email verification uses the credit prices below on either plan. | `status` | Meaning | Credits per result | | - | - | - | | `Valid` | The check found evidence that the email account exists. | **1 credit** | | `Invalid` | The check found that the account or its mail domain is unavailable. | **1 credit** | | `Unknown` | The check could not reach a reliable conclusion. Keep this separate from Invalid. | **Free** 0 credits | These values are case-sensitive. Use `status` as the result of the check and `reason` to understand it. Requesting metadata keeps the same prices. For example, 100 checks that return 70 Valid, 20 Invalid, and 10 Unknown cost **90 credits**, with or without metadata. An unsuccessful check can return only `email` and `status: "Unknown"`, even when you requested metadata. Treat missing details as unavailable. ## Metadata fields | Field | Values or type | How to interpret it | | - | - | - | | `domain` | String | The domain of the submitted address. | | `timestamp` | String | When the verification result was produced. A timestamp without a timezone does not identify a UTC offset. | | `mx_record_present` | Boolean | Whether an MX record was detected. This describes domain routing; use the primary status to decide how to handle the email. | | `mx_record_checked` | String | The MX hostname that was checked, such as `aspmx.l.google.com`. This is a hostname, not a verification status or timestamp. | | `email_provider` | `Google`, `Microsoft`, or `Unknown` | The detected email provider. Provider `Unknown` means the provider was not classified; read `status` separately. | | `security_gateway` | String | A detected mail gateway or routing service, such as Proofpoint or Mimecast. Empty, null, or `Unknown` means no gateway was identified. | | `reason` | String | An explanation of the primary result. See the common reasons below. | Fields can be empty or null when the information is unavailable. An MX record or a recognized provider alone does not confirm that an individual mailbox exists. > [!TIP] > > **Use `email_provider` to group recipients for outbound campaigns.** > If you send at high volume with Smartlead or Instantly, match your sending > inbox to the recipient's provider when possible: > > * Send to `Microsoft` recipients from Microsoft inboxes. > * Send to `Google` recipients from Google inboxes. > > [Smartlead](https://helpcenter.smartlead.ai/en/articles/72-understanding-esp-matching-in-smartlead) > and [Instantly](https://help.instantly.ai/en/articles/7044069-email-service-providers-matching) > support provider matching to help improve inbox placement. Customers have > anecdotally reported deliverability improvements of **25% or more** with > this approach. These are customer reports, rather than a measured benchmark; > results vary by campaign. Provider `Unknown` cannot be used to make this match. > > Request `metadata=true` on your original verification call to get > `email_provider` **at no extra cost**. ## Common reasons `reason` is an open string. Handle unrecognized values without failing your integration; this table describes common values returned by the verifier. | `reason` | Meaning | Suggested handling | | - | - | - | | `user_account_found` | The check detected the account. | Read the accompanying status before using the address. | | `user_account_not_found` | The check did not find the account. | Exclude an Invalid result from your send list. | | `user_account_could_not_be_detected` | The check could not determine whether the account exists. | Keep the result as inconclusive; retry later if needed. | | `consumer_email` | The address uses a personal email domain, outside the verifier's business-email checks. | Treat the Unknown result as unverified. | | `domain_does_not_exist` | The domain could not be found in DNS. | Review the address and domain spelling. | | `no_mx_records_found` | No mail exchange records were found for the domain. | Review the domain's mail setup. | | `no_nameservers_found` | The DNS lookup could not find usable nameservers. | Review the domain and its DNS setup. | | `unknown_mx_records` | The MX lookup could not complete reliably. | Treat the routing information as unresolved. | | Empty, null, or `N/A` | No more specific reason was supplied. | Use the primary status; do not infer another result. | ## Batch output For CSV output, `status` uses Valid, Invalid, and Unknown. The JSON batch output can also contain `Error` when an individual check fails. Treat that value as inconclusive; it adds **0 verification credits**. A row's verification status is separate from its job's processing status. For example, a COMPLETED job can contain Unknown results. A job status of ERROR describes a failed batch, rather than an Invalid email address. ## Next steps * [Verify one address](/api-reference/email/verify-a-single-email-address) with `metadata=true`. * [Upload a file](/api-reference/email/upload-a-batch-file-for-email-verification) with the same option for metadata in each output row. * [Read the batch workflow](/api-reference/v2/email-verification-overview) for status polling and downloads. # Verify email addresses Source: https://docs.revenuebase.ai/api-reference/v2/email-verification-overview Choose a single check or a batch file, understand the result, and retrieve your verification output. Use Email Verification when you already have an address and want to check its current verification status. Use a single check for one address or a batch file for a list. ## Credits and plans PAYG is Pay-as-you-go. AYCE is All-you-can-eat. | Result or option | PAYG | AYCE | | - | - | - | | Valid result | **1 credit** | **1 credit** | | Invalid result | **1 credit** | **1 credit** | | Unknown result | **Free** 0 credits | **Free** 0 credits | | Request metadata | **Included** No extra cost | **Included** No extra cost | **Requesting metadata does not increase the cost.** Add `?metadata=true` to either verification endpoint to include provider, MX, gateway, and reason details. Set it on your original request; verifying an address again can consume another credit for a Valid or Invalid result. For example, 70 Valid, 20 Invalid, and 10 Unknown results cost **90 credits**, with or without metadata. Email verification uses these prices on both plans; AYCE's unlimited contact retrieval is shown separately in [credits and plans](/api-reference/v2/credits). ## Choose a method | Method | Use it when | Response and limit | | - | - | - | | [Single check](/api-reference/email/verify-a-single-email-address) | Your application needs one result now. | Immediate JSON; **1 request per second** for standard users. | | [Batch file](/api-reference/email/upload-a-batch-file-for-email-verification) | You want to process a list in one upload. | Numeric process\_id; up to **300,000 input rows** for a standard account. | All of a user's keys and portal session share the real-time endpoint limit. [Contact sales](https://revenuebase.ai/request-for-demo/) for a higher limit. The batch runs in the background and processes many addresses from one call. ## Verify one address Set `REVENUEBASE_API_KEY` to your API key and `REVENUEBASE_EMAIL` to the business email address you want to check. ```bash theme={null} curl --request POST 'https://api.revenuebase.ai/v2/email/verify?metadata=true' \ --header "X-Key: $REVENUEBASE_API_KEY" \ --header 'Content-Type: application/json' \ --data "{\"email\":\"$REVENUEBASE_EMAIL\"}" ``` The response always identifies the address and its primary status. Metadata can include `domain`, `timestamp`, `mx_record_present`, `mx_record_checked`, `email_provider`, `security_gateway`, and `reason`. Fields can be missing, empty, or null when unavailable. Read [statuses and metadata](/api-reference/v2/email-verification-metadata) for the meaning of every field, common reasons, and the distinction between provider Unknown and verification Unknown. `mx_record_checked` is an MX hostname, rather than a status such as "checked". For high-volume outbound with Smartlead or Instantly, use `email_provider` to group recipients by provider. See [provider matching](/api-reference/v2/email-verification-metadata#metadata-fields) for Microsoft-to-Microsoft and Google-to-Google sending guidance. ## Process a batch Prepare a UTF-8 CSV with an `email` column, or a JSON array of records with an `email` field. Include your own reference field to reconnect results to input records because output order can change. 1. [Upload the file](/api-reference/email/upload-a-batch-file-for-email-verification). Save the returned process\_id. The upload itself is free; allow one available credit per input row before processing. 2. [Poll status](/api-reference/jobs/get-batch-job-status) every 5 to 10 seconds, slowing down for longer jobs. Stop on COMPLETED, CANCELLED, or ERROR. 3. [Download the file](/api-reference/jobs/download-batch-job-results) when complete. Cancelled jobs can have partial output; jobs stopped before processing can have none. Each processed row includes its status and, when requested, metadata. Downloading results is free. A completed job can contain Unknown results; its processing state describes the job, while each row's status describes that address. ## Manage your jobs | Utility | Use it to | | - | - | | [List active jobs](/api-reference/jobs/list-active-batch-jobs) | Find queued or running batches. | | [List all jobs](/api-reference/jobs/list-all-batch-jobs) | Find completed outputs, failures, or a lost process\_id. | | [Get status](/api-reference/jobs/get-batch-job-status) | Follow one batch and read its progress or error message. | | [Cancel](/api-reference/jobs/cancel-a-batch-job) | Stop remaining checks; already processed Valid and Invalid results remain billable. | | [Download](/api-reference/jobs/download-batch-job-results) | Save the output bytes as CSV or JSON. | These utilities cost **0 additional credits**. Contact and company exports have their own export identifiers and status endpoints. # Make your first API call Source: https://docs.revenuebase.ai/api-reference/v2/make-first-call Check your API key for free, count an audience, and choose the next step before spending credits. Start with a free balance check and Contact Count. These requests confirm access and help you size an audience before choosing how much to retrieve. ## Prerequisites * A RevenueBase account. * An API key from your [dashboard](https://app.revenuebase.ai/dashboard). Set your key as an environment variable: ```bash theme={null} export REVENUEBASE_API_KEY="your_api_key" ``` **1. Check your credit balance** This request costs **0 credits** and does not reserve a hold. ```bash theme={null} curl 'https://api.revenuebase.ai/v2/account/balance' \ --header "X-Key: $REVENUEBASE_API_KEY" ``` Response captured from the local test API on October 13, 2026. Results can change. ```json theme={null} { "credits": 10488 } ``` Read `credits` as your reported credit balance. It is separate from the free View sample allowance. A 401 means you should check the key and header; see [authentication](/api-reference/v2/authentication). **2. Count an audience for free** This request counts VPs located in the United States. Count costs **0 credits**, including when your filter uses SmartSearch. ```bash theme={null} curl --request POST 'https://api.revenuebase.ai/v2/contact/count' \ --header "X-Key: $REVENUEBASE_API_KEY" \ --header 'Content-Type: application/json' \ --data '{ "filter": { "type": "group", "op": "AND", "children": [ { "type": "condition", "column": "COUNTRY_NAME_PER", "operator": "eq", "value": "United States" }, { "type": "condition", "column": "JOB_LEVEL_PER", "operator": "eq", "value": "VP" } ] }, "mode": "fast" }' ``` Response captured from the local test API on October 13, 2026. Results can change. ```json theme={null} { "total": 1318125, "companies": 323960, "withEmail": 567221, "withCellphone": 742003, "exact": { "total": true, "companies": false, "withEmail": false, "withCellphone": false }, "mode": "fast" } ``` `total` is the matching contact-row count. Read the `exact` flags: false means that figure is an estimate. Use `mode: "exact"` when you need precise company and availability counts. **3. Inspect before retrieving** Reuse the filter in [View](/api-reference/view) for a **free masked sample**. Adjust it until the sample looks right. Then [Estimate](/api-reference/estimate-export) with a positive `maxRows` cap and explicit `reveal` choices before [Start Export](/api-reference/start-export). The estimate is free; a PAYG export reserves credits before running. ## Choose your next step | You need | Read this | | - | - | | Immediate contact records | [Preview](/api-reference/preview), or [Enrich](/api-reference/enrich) for known emails or IDs | | An account list | [Company Search](/api-reference/v2/company-search-overview) | | Email checks | [Email Verification](/api-reference/v2/email-verification-overview): 1 credit per Valid or Invalid result, 0 for Unknown | | Verification reasons and provider details | [Statuses and metadata](/api-reference/v2/email-verification-metadata): metadata adds no cost | | PAYG prices or AYCE entitlements | [Credits & Plans](/api-reference/v2/credits) | | Higher throughput or a large list | [Rate limits and batch capacities](/api-reference/v2/rate-limits) | # API overview Source: https://docs.revenuebase.ai/api-reference/v2/overview Choose a Contact, Company, or Email Verification workflow and understand its costs and job identifiers. **Base URL:** `https://api.revenuebase.ai` Use the API to search contacts and companies, retrieve records you already know, or verify email addresses from your own list. ## Choose a workflow | You want to | Start here | What you receive | | - | - | - | | Find people matching criteria | [Contact Count](/api-reference/count), then [View](/api-reference/view) | Free totals and a masked sample | | Retrieve contacts immediately | [Preview](/api-reference/preview) for criteria, or [Enrich](/api-reference/enrich) for known identifiers | Contact records in JSON | | Build an account list | [Company Count](/api-reference/company-count) | Distinct companies and available contact totals | | Retrieve known companies | [Company Enrich](/api-reference/company-enrich) | Matches for up to 10,000 combined identifiers | | Download a contact or company audience | [Contact Estimate](/api-reference/estimate-export) or [Company Estimate](/api-reference/estimate-company-export), then Start Export | An exportId, followed by a file | | Verify one email or an uploaded list | [Email Verification](/api-reference/v2/email-verification-overview) | A primary verification result and optional metadata | | Check credits or manage email jobs | [Balance](/api-reference/account/get-your-remaining-credit-balance) and [job utilities](/api-reference/jobs/list-all-batch-jobs) | Account information or existing batch jobs | ## Understand costs before retrieval Count, View, Insights, Estimate, and metadata lookups cost **0 credits**. PAYG retrieval charges depend on returned records, selected contact details, and SmartSearch options. AYCE includes **unlimited contact and company retrieval at 0 credits**, within request caps. Email Verification uses the same prices on both plans: **1 credit per Valid or Invalid result**, and **0 for Unknown**. Requesting verification metadata adds **no cost**. See [Credits & Plans](/api-reference/v2/credits) and [email statuses and metadata](/api-reference/v2/email-verification-metadata). ## Keep the job identifiers separate | Job type | Identifier | Follow it with | | - | - | - | | Contact file export | `exportId` | [Export Status](/api-reference/export-status) | | Company file export | `exportId` | [Company Export Status](/api-reference/company-export-status) | | Email Verification batch | Numeric `process_id` | [Batch Job Status](/api-reference/jobs/get-batch-job-status), then [Download](/api-reference/jobs/download-batch-job-results) | Save the identifier returned by the start or upload call. Polling an existing job is free. Repeating a start or upload creates another job and can charge again. ## Authentication Include your API key in the `x-key` header on every request. See [Authentication](/api-reference/v2/authentication). The public [Contact Health](/api-reference/health) check is the exception and does not require a key. Begin with [your first free call](/api-reference/v2/make-first-call) and read [request rates and batch capacities](/api-reference/v2/rate-limits) before processing a larger list. # Rate limits and error codes Source: https://docs.revenuebase.ai/api-reference/v2/rate-limits Request rates, bulk-processing capacities, retry guidance, and HTTP error codes. ## Rate limits | API | Standard request rate | How the limit is shared | | - | - | - | | Contact API, including company endpoints | **10 requests per second** by default | One request budget across contact and company routes for the authenticated user; the user's API keys share it | | Real-time Email Verification: `POST /v2/email/verify` | **1 request per second** for standard users | Per user on this endpoint; the user's API keys and portal session share it | Your account or service configuration may allow a different rate. Contact API responses report the active limit in `X-RateLimit-Limit`. For higher throughput, [contact sales](https://revenuebase.ai/request-for-demo/) to request an increased limit. **All-you-can-eat includes unlimited contact and company retrieval at 0 credits.** Request rates and per-request limits still apply on that plan. ## Process a large list in one request Rate limits count **requests**, rather than the number of records in a request. Use enrichment arrays, audience filters, file exports, or an email batch upload to process many records together. | Operation | Capacity in one request | What you receive | | - | - | - | | [Company Enrich](/api-reference/company-enrich) | **Up to 10,000 company identifiers** across `domains`, `linkedinUrls`, and `rbidOrgs` combined | Matching company records, keyed by input | | [Contact Enrich](/api-reference/enrich) | **Up to 10,000 contact identifiers** across `emails` and `personIds` combined | Matching contact records, keyed by input | | [Count](/api-reference/count) and [Estimate](/api-reference/estimate-export) | One filter describes the audience; no separate call per matching record | Audience counts or an export-cost forecast | | [View](/api-reference/view) | **Up to 100 sample rows** | A free masked sample, rather than the whole audience | | [Contact Preview](/api-reference/preview) or [Company Preview](/api-reference/company-preview) | **Up to 50,000 rows** | Records returned immediately | | [Contact Export](/api-reference/start-export) or [Company Export](/api-reference/start-company-export) | **Up to 1,000,000 rows** | A background job, then a downloadable file | | [Batch Email Verification](/api-reference/email/upload-a-batch-file-for-email-verification) | One `.csv` or `.json` file, up to **300,000 input rows** for a standard account | A background job, then verification results | ### Example: enrich a list of company domains Put up to **10,000 domains in the `domains` array** on a single Company Enrich request. You do not need ten calls containing 1,000 domains each. If you also send LinkedIn URLs or company RBIDs, the **combined** identifier limit is 10,000 after normalization and duplicate removal. Set your API key as `REVENUEBASE_API_KEY`. This small example uses the same request shape as a larger list: ```bash theme={null} curl --request POST 'https://api.revenuebase.ai/v2/contact/company/enrich' \ --header "X-Key: $REVENUEBASE_API_KEY" \ --header 'Content-Type: application/json' \ --data '{ "domains": ["stripe.com", "docs-example-no-match.invalid"], "columns": ["RBID_ORG", "COMPANY_NAME_ORG", "DOMAIN_ORG"] }' ``` PAYG company enrichment costs **1 credit per returned match**; combining inputs reduces request count, rather than the per-record credit price. AYCE includes **unlimited company retrieval for 0 credits**. An unmatched identifier does not add a company-row charge. For a large email list, upload a file to Batch Email Verification instead of calling the real-time endpoint once per address. Save the returned `process_id`, poll the existing job every 5–10 seconds, and download the results when ready. The real-time limit is a request rate, rather than the batch job's processing speed. See the [email batch walkthrough](/api-reference/v2/email-verification-overview#process-a-batch) for the upload, status, and download calls. ## Retry a rate-limited request When you exceed a limit, the API returns `429 Too Many Requests`. * Honor `Retry-After` when present. Email Verification supplies this on a rate-limit response. * For Contact API, also read `X-RateLimit-Reset` and wait until that time. * If no retry header is available, use exponential backoff. Coordinate requests across workers sharing the same user. * After an export or email batch returns a job ID, poll that job. Repeating the upload or export-start request creates a new job and can incur additional charges. This fallback example retries a real-time email request: ```python theme={null} import time from revenuebase_sdk import RevenuebaseClient, RateLimitError client = RevenuebaseClient() def call_with_backoff(email, max_retries=5): for attempt in range(max_retries): try: return client.email.verify(email=email) except RateLimitError: wait = 2 ** attempt # 1s, 2s, 4s, 8s, 16s time.sleep(wait) raise RuntimeError("Max retries exceeded") ``` ## Track usage with response headers Contact API responses include the following headers when rate limiting is active. These headers are not a contract for every RevenueBase API response; for a rate-limited Email Verification request, use `Retry-After`. | Header | Description | | - | - | | `X-RateLimit-Limit` | Max requests allowed in the current window | | `X-RateLimit-Remaining` | Requests remaining in the current window | | `X-RateLimit-Reset` | Unix timestamp when the window resets | | `Retry-After` | Seconds to wait before retrying a rate-limited request | Read `X-RateLimit-Reset` before retrying to avoid sending requests that will immediately fail. ## Error codes | Status | Cause | Fix | | - | - | - | | `400 Bad Request` | Malformed request body or missing required parameters | Check required fields and data types | | `401 Unauthorized` | Missing or invalid API key | Verify the `x-key` header is present and the key is correct | | `403 Forbidden` | Key is valid but not authorized for this endpoint | Check your account tier and key permissions | | `404 Not Found` | Endpoint or resource doesn't exist | Check the URL and endpoint path | | `422 Validation Error` | Request parsed correctly but failed field validation | Fix the fields listed in the `detail` array (see below) | | `429 Too Many Requests` | Rate limit exceeded | Wait for the window to reset; use exponential backoff | | `500 Server Error` | Unexpected error on our end | Retry with backoff; contact [support@revenuebase.ai](mailto:support@revenuebase.ai) if it persists | ## Parse a 422 Validation Error Validation errors return a `detail` array identifying each failing field. This response was captured by submitting an empty JSON body to Email Verification on the local test API on October 13, 2026: ```json theme={null} { "detail": [ { "type": "missing", "loc": [ "body", "email" ], "msg": "Field required", "input": {} } ] } ``` `loc` identifies where the problem is (e.g. `["body", "email"]`), and `msg` tells you what's wrong. Fix each entry in the array and retry. ## Next steps Verify email addresses Verify emails in real time or in batch. # Build a search filter Source: https://docs.revenuebase.ai/api-reference/v2/search-filters Describe what you want using conditions, groups, and operators — the filter object shared by every Contact Search and Company Search endpoint. Every Contact Search and Company Search endpoint takes the same `filter` object. Write it once and send it to `count`, `preview`, `insights`, or `exports` on either surface without changes. A filter is **plain JSON** — a nested tree of objects with a `type` field. It is not GraphQL, and there is no query language to learn or GraphQL endpoint to call. Build it with whatever your language uses for JSON. The one difference is which columns each surface accepts: contact endpoints take person, company, and job fields, while company endpoints take company fields only. See [Search for companies](/api-reference/v2/company-search-overview) for what that rules out. Every column is documented in the [Person-Organization-Insight data dictionary](/docs/data-features/pre-joined-tables/person-organization-insight). ## Start with one condition A filter is a `group` containing a list of `children`. The simplest one holds a single condition: ```json theme={null} { "filter": { "type": "group", "op": "AND", "children": [ { "type": "condition", "column": "COUNTRY_NAME_PER", "operator": "eq", "value": "United States" } ] } } ``` Use `POST /v2/contact/count` to check the result before adding complexity. ## Combine conditions Add more entries to `children`. The group's `op` decides how they combine — `AND` requires all of them, `OR` requires any. ```json theme={null} "children": [ { "type": "condition", "column": "COUNTRY_NAME_PER", "operator": "eq", "value": "United States" }, { "type": "condition", "column": "JOB_LEVEL_PER", "operator": "in", "valueList": ["VP", "C-Level"] } ] ``` `eq` reads `value`, a single item. `in` reads `valueList`, an array. Sending the wrong one is the most common cause of a `422`. ## Nest groups for mixed logic To express "in the United States **and** (software **or** financial services)", nest a group inside a group: ```json theme={null} "children": [ { "type": "condition", "column": "COUNTRY_NAME_PER", "operator": "eq", "value": "United States" }, { "type": "group", "op": "OR", "children": [ { "type": "condition", "column": "INDUSTRY_LINKEDIN_ORG", "operator": "eq", "value": "Software Development" }, { "type": "condition", "column": "INDUSTRY_LINKEDIN_ORG", "operator": "eq", "value": "Financial Services" } ]} ] ``` Set `"negate": true` on any group to exclude everything it matches. ## Add SmartSearch nodes [SmartSearch](/api-reference/v2/smartsearch) nodes match on meaning rather than characters. They are ordinary children — they sit in the same `children` list as conditions, nest inside groups, and negate the same way. **Job title** — the role a person holds, however it's worded: ```json theme={null} { "type": "semantic", "on": "title", "text": "runs demand generation for a software company", "match": "similar" } ``` **Company description** — what a company does: ```json theme={null} { "type": "semantic", "on": "company", "text": "operates cold storage and refrigerated warehousing", "match": "similar" } ``` **Company look-alike** — companies resembling one you name: ```json theme={null} { "type": "lookalike", "domain": "northwind.com", "match": "similar" } ``` All three take the same four `match` presets — `exact`, `similar`, `related`, `broad` — or a raw `maxDistance` if you'd rather set your own threshold. Never both. ## Node reference Four node types, told apart by `type`. Every node also accepts `joinWithPrevious` (`AND` or `OR`) to control how it binds to the preceding sibling, and an optional `id` of your own for round-tripping state from an interface. | `type` | Required | Optional | | - | - | - | | `group` | `children` | `op` (`AND` default), `negate` | | `condition` | `column`, `operator` | `value` or `valueList` | | `semantic` | `on` (`title` / `company`), `text` | `match` or `maxDistance` | | `lookalike` | `domain` or `rbidOrg` | `match` or `maxDistance` | ## A filter using everything Conditions, a nested `OR`, two SmartSearch types, and a negated exclusion — in one tree: ```json theme={null} { "filter": { "type": "group", "op": "AND", "children": [ { "type": "condition", "column": "COUNTRY_NAME_PER", "operator": "eq", "value": "United States" }, { "type": "condition", "column": "JOB_LEVEL_PER", "operator": "in", "valueList": ["VP", "C-Level"] }, { "type": "group", "op": "OR", "children": [ { "type": "semantic", "on": "title", "text": "runs demand generation", "match": "similar" }, { "type": "semantic", "on": "title", "text": "leads marketing operations", "match": "similar" } ]}, { "type": "semantic", "on": "company", "text": "sells software to mid-market retailers", "match": "related" }, { "type": "group", "negate": true, "children": [ { "type": "lookalike", "domain": "competitor.com", "match": "similar" } ]} ] } } ``` Read it as: in the US, **and** VP or C-Level, **and** (demand gen **or** marketing ops), **and** at a company selling software to mid-market retailers, **and not** at a company resembling `competitor.com`. See [SmartSearch](/api-reference/v2/smartsearch) for how the presets are calibrated per target and more worked combinations. ## Operator reference | Operator | Matches | Reads | | - | - | - | | `eq`, `ne` | Equal to / not equal to a value | `value` | | `in`, `notIn` | Is / is not one of a list | `valueList` | | `contains` | Text appears anywhere in the field | `value` | | `startsWith`, `endsWith` | Text at the start or end of the field | `value` | | `gt`, `gte`, `lt`, `lte` | Greater or less than, for numbers and dates | `value` | | `isNull`, `isNotNull` | Field is empty / has a value | neither | Every node also accepts `joinWithPrevious` (`AND` or `OR`) to control how it binds to the preceding sibling, and an optional `id` of your own for round-tripping state from an interface. ## Find available columns and values `GET /v2/contact/columns` returns every column, what it holds, and which ones offer a fixed set of values. Add `?include=values` to receive those value lists in the same response. `GET /v2/contact/company/columns` does the same for the company surface, listing company fields only. ```bash theme={null} curl "https://api.revenuebase.ai/v2/contact/columns?include=values" \ -H "x-key: {YOUR_API_KEY}" ``` | Field | What it means | | - | - | | `columnName` | The name to use in a filter | | `humanName` | Display name for an interface | | `valueKind` | `string`, `number`, `date`, or `boolean` | | `grain` | `person`, `org`, or `pao` — matching the column suffix | | `multiselect` | Whether the column has a fixed set of values | | `distinctValues` | Every value the column holds. Present with `?include=values` on multiselect columns | | `valueLimit` | Maximum values this column will return | Request the catalog once at startup and cache it. Building filter inputs from `distinctValues` avoids searches that silently match nothing because a value was spelled differently than stored. `GET /v2/contact/columns/{column}/values` returns values for a single multiselect column, with an optional `search` parameter. Open-ended columns — job title, company name, email address — return `400`; filter those with `contains` instead. ## Filter limits | Limit | Value | Exceeding it | | - | - | - | | Conditions per filter | 25 | `422` | | Nesting depth | 8 | `422` | | Values in one `in` or `notIn` list | 50,000 | `422` | | Values across every `in` / `notIn` list in one request | 50,000 | `422` | | Job title SmartSearch nodes | 3 | `422` | | Company description SmartSearch nodes | 3 | `422` | | Look-alike SmartSearch nodes | 10 | `422` | | SmartSearch `text` length | 300 characters | `422` | ## Handle filter errors A rejected filter returns `422`. As with every validation error across the API, `detail` is an array identifying each problem, and `code` names the rule that was broken: ```json theme={null} { "title": "Invalid filter", "status": 422, "detail": [ { "loc": ["body", "filter", "children", 2], "msg": "Filter has too many conditions (31; max 25).", "type": "value_error.invalid_filter" } ], "code": "INVALID_FILTER", "request_id": "01J8Z..." } ``` `loc` points at the part of the filter that failed, and `msg` explains what's wrong. See [Rate limits and error codes](/api-reference/v2/rate-limits) for the shared error format. | Code | Cause | Fix | | - | - | - | | `INVALID_FILTER` | Too many conditions, nested too deep, or an invalid semantic node | Simplify the filter; `detail` names the limit | | `UNKNOWN_COLUMN` | A `column` value isn't in the catalog | Check the spelling against `GET /v2/contact/columns` | | `IN_LIST_TOO_LARGE` | One `in` / `notIn` list exceeds 50,000 values, or all of them together do | Split the search into several requests | Include `request_id` when contacting [support@revenuebase.ai](mailto:support@revenuebase.ai) — it identifies the individual request in our logs. ## Next steps SmartSearch Match on meaning instead of exact text. Search for contacts Count, preview, and export using the filter you built. # Search by meaning with SmartSearch Source: https://docs.revenuebase.ai/api-reference/v2/smartsearch Match job titles, company descriptions, and look-alike companies on meaning rather than exact text, using four named presets. SmartSearch matches on **meaning** rather than characters. You describe what you're looking for in plain language, and we find it however it happens to be worded. There are three, and the important part is that you can combine them. Company Description Find companies by what they actually do. Job Title Find people by the role they actually hold. Company Look-alike Find companies resembling one you name. ## Why not keywords and booleans? Keyword and boolean filters match characters. That works when your target has one spelling, and fails the moment it doesn't — which is most of the time in B2B data. Say you want people who run demand generation: | Approach | What happens | | - | - | | `JOB_TITLE_PER contains "demand generation"` | Misses Head of Growth, VP Marketing, Directeur Marketing | | `JOB_TITLE_PER in [20 titles you thought of]` | Misses the 40 you didn't | | `JOB_TITLE_PER contains "marketing"` | Catches Marketing Interns and Marketing Assistants | | **Job Title SmartSearch** | Catches the role, skips the intern | The same failure repeats on the company side. `Financial Services` covers a retail bank and a crypto exchange. A keyword search for "logistics" misses a freight forwarder that calls itself a supply chain partner. Booleans aren't wrong — they're exact, fast, and you should keep using them for things that genuinely are exact, like country, headcount band, or seniority. SmartSearch is for the parts of a query that are fuzzy by nature: **what a person does** and **what a company does**. > [!NOTE] > > Use both. A good filter is usually SmartSearch for role and business, plus ordinary conditions for geography, size, and seniority. See [Search Filters](/api-reference/v2/search-filters). ## Each one on its own Every SmartSearch is a single node in a filter. Here is each one doing its own job, before any combining. ### Company Description Find companies by what they actually do, however they word it: ```json theme={null} { "type": "semantic", "on": "company", "text": "third-party logistics and freight forwarding", "match": "similar" } ``` Catches a freight forwarder that calls itself a supply chain partner. Detail: [Company Description](/api-reference/v2/smartsearch-company-description). ### Job Title Find people by the role they actually hold, whatever it happens to be called: ```json theme={null} { "type": "semantic", "on": "title", "text": "runs demand generation", "match": "similar" } ``` Catches Head of Growth and VP Marketing, and skips the Marketing Intern. Detail: [Job Title](/api-reference/v2/smartsearch-job-title). ### Company Look-alike Find companies resembling one you name, by domain: ```json theme={null} { "type": "lookalike", "domain": "ourbestcustomer.com", "match": "similar" } ``` No industry code and no keyword list. Detail: [Company Look-alike](/api-reference/v2/smartsearch-lookalike). Each of these is a complete filter on its own — send any one of them to `/count` or `/preview` and it works. The rest of this page is about what happens when you put them together. ## Combining them is the point Any one semantic search is useful. Combining several in a single query is what nothing else in this market does. You can put up to **three** job title searches, **three** company description searches, and **ten** look-alikes in one filter, nest them in `AND` / `OR` groups, and negate any of them — alongside ordinary conditions. Every combination below is one request. ### Two descriptions, OR'd A market that doesn't reduce to one sentence: ```json theme={null} { "type": "group", "op": "OR", "children": [ { "type": "semantic", "on": "company", "text": "third-party logistics and freight forwarding", "match": "similar" }, { "type": "semantic", "on": "company", "text": "customs brokerage and trade compliance services", "match": "similar" } ]} ``` ### A look-alike plus a job title "People who run security at companies like our best customer" — no industry code, no title list: ```json theme={null} "children": [ { "type": "lookalike", "domain": "ourbestcustomer.com", "match": "similar" }, { "type": "semantic", "on": "title", "text": "owns information security", "match": "similar" } ] ``` ### Descriptions and titles together "Ops leaders at cold chain companies": ```json theme={null} "children": [ { "type": "semantic", "on": "company", "text": "operates cold storage and refrigerated warehousing", "match": "similar" }, { "type": "group", "op": "OR", "children": [ { "type": "semantic", "on": "title", "text": "runs warehouse operations", "match": "similar" }, { "type": "semantic", "on": "title", "text": "leads supply chain", "match": "similar" } ]} ] ``` ## Worked use cases > [accordion] Expand from your best accounts > > You closed ten great deals and want more like them. You don't have to work out what they have in common. > > ```json theme={null} > { "type": "group", "op": "OR", "children": [ > { "type": "lookalike", "domain": "customer-one.com", "match": "similar" }, > { "type": "lookalike", "domain": "customer-two.com", "match": "similar" }, > { "type": "lookalike", "domain": "customer-three.com", "match": "similar" } > ]} > ``` > > Send it to `POST /v2/contact/company/count` for the account list, or add a job title node and send it to `POST /v2/contact/count` for the people to call. > [accordion] Enter a new vertical you can't name > > The industry taxonomy has no code for what you sell into. Describe it instead, at `related` to see the shape of the market: > > ```json theme={null} > { "type": "semantic", "on": "company", > "text": "manages clinical trials for pharmaceutical sponsors", > "match": "related" } > ``` > > Preview with `"includeScores": true`, see where the results stop being right, then tighten to `similar` or `exact` before you export. > [accordion] Find a buying committee, not a person > > Three roles that all touch the same purchase, each its own node: > > ```json theme={null} > { "type": "group", "op": "OR", "children": [ > { "type": "semantic", "on": "title", "text": "owns information security", "match": "similar" }, > { "type": "semantic", "on": "title", "text": "runs IT infrastructure", "match": "similar" }, > { "type": "semantic", "on": "title", "text": "manages vendor risk", "match": "similar" } > ]} > ``` > [accordion] Target a market while excluding a segment > > Everyone like our customers, minus anyone resembling the incumbent we never beat: > > ```json theme={null} > "children": [ > { "type": "lookalike", "domain": "ourbestcustomer.com", "match": "similar" }, > { "type": "group", "negate": true, "children": [ > { "type": "lookalike", "domain": "incumbent.com", "match": "similar" } > ]} > ] > ``` ## The full combination Everything at once: US-based, senior demand gen and marketing ops people, at companies resembling any of five accounts, excluding anyone at a company like a competitor. ```json theme={null} { "filter": { "type": "group", "op": "AND", "children": [ { "type": "condition", "column": "COUNTRY_NAME_PER", "operator": "eq", "value": "United States" }, { "type": "group", "op": "OR", "children": [ { "type": "semantic", "on": "title", "text": "runs demand generation", "match": "similar" }, { "type": "semantic", "on": "title", "text": "leads marketing operations", "match": "similar" } ]}, { "type": "group", "op": "OR", "children": [ { "type": "lookalike", "domain": "northwind.com", "match": "similar" }, { "type": "lookalike", "domain": "acmecorp.com", "match": "similar" }, { "type": "lookalike", "domain": "globex.io", "match": "similar" }, { "type": "lookalike", "domain": "initech.com", "match": "similar" }, { "type": "lookalike", "domain": "umbrella-hq.com", "match": "similar" } ]}, { "type": "group", "negate": true, "children": [ { "type": "lookalike", "domain": "competitor.com", "match": "similar" } ]} ] } } ``` Three things are doing the work: * **The `OR` group of five look-alikes** is an "any of these". Put look-alikes in an `AND` group and a company must resemble all five at once, which almost nothing does. * **The negated group** is how you exclude. There is no "not in" look-alike node. * **Two title nodes joined by `OR`.** One node holding several roles collapses to a single role internally and silently matches only that one. Drop the title group and send the rest to `POST /v2/contact/company/count` for the same targeting at company grain. ## One vocabulary for all three Every SmartSearch takes the same four presets. Send `match` and the server owns the number, so "Similar" means the same measured thing in your app, in ours, and in a partner's. | `match` | Label | What you get | | - | - | - | | `exact` | Exact | Essentially the same thing. Different wording and other languages still match. | | `similar` | Similar | The same underlying thing, with some variation. **Recommended default.** | | `related` | Related | Adjacent — same family, looser fit. | | `broad` | Broad | Explore the neighbourhood. Expect to review results. | Presets are **cumulative**: each is a similarity floor, so `broad` returns everything `related` would plus a looser band beneath it. Widening never drops a result you already had. ### Calibrated per target RevenueBase calibrates these floors against judged benchmarks. They differ per target because the three vector spaces are not comparable — **read down a column, never across**. | `match` | Job title | Company description | Look-alike | | - | - | - | - | | `exact` | 95–100% (99% on-target) | 60–100% (86% on-target) | 85–100% (85% on-target) | | `similar` | 85–95% (91% on-target) | 50–60% (56% on-target) | 70–85% (78% on-target) | | `related` | 75–85% (82% on-target) | 45–50% (42% on-target) | 65–70% (50% on-target) | | `broad` | 70–75% (73% on-target) | 40–45% (24% on-target) | 60–65% (34% on-target) | Each cell shows the similarity band, followed by the measured on-target rate in parentheses. The on-target rate is the share of matches at that setting that fit the search criteria. Job title holds up well all the way to `broad`. Company description and look-alike fall off sharply past `similar` — company description at `broad` is **24% on target**, meaning roughly three in four results need review. Treat `related` and `broad` on those two as discovery tools, not list-building settings. ### Or set your own thresholds The presets are a good starting point, not a ceiling. They're the settings we'd pick, calibrated on our benchmarks — but what counts as a good match depends on your market, and you're welcome to find your own. Send a raw `maxDistance` instead of `match`: ```text theme={null} maxDistance = 1 − similarity ``` A 78% similarity floor is `"maxDistance": 0.22`. A raw `maxDistance` means exactly what it says and skips the preset calibration entirely. To find your own numbers, preview with `"includeScores": true`, see where results stop being useful, and set `maxDistance` just below that point: ```json theme={null} { "filter": { ... }, "limit": 200, "includeScores": true } ``` Rows come back with `_titleSimilarity` and `_companySimilarity` between 0 and 1, best-match first. Scroll to where quality drops off and you have your threshold. Send `match` **or** `maxDistance`, never both — sending both is a `422`. ### If you send neither **Every SmartSearch node defaults to `similar`.** One rule, all three targets — the floor differs because the vector spaces differ, but the promise is the same. | Target | Default floor | On target | | - | - | - | | Job title | 85% similarity | 91% | | Company description | 50% similarity | 56% | | Look-alike | 70% similarity | 78% | Omitting `match` is **exactly** the same search as sending `"match": "similar"` — the same threshold and the same query handling, so the two return the same rows. Send it explicitly when the intent matters to a future reader, and send `exact` or `broad` when you want to move off the recommendation. ### Read the presets at runtime Fetch the table rather than hardcoding it, so your app picks up any recalibration automatically: ```bash theme={null} curl https://api.revenuebase.ai/v2/contact/match-presets \ -H "x-key: {YOUR_API_KEY}" ``` ## Limits | Limit | Value | | - | - | | Job title nodes per filter | 3 | | Company description nodes per filter | 3 | | Look-alike nodes per filter | 10 | | `text` length | 300 characters | Title and company caps are counted separately, so three of each in one filter is fine. Each look-alike node is a full scan of the company vector index, which is why that cap sits where it does. ## Next steps Build a search filter The JSON structure that holds all of this together. Person + Organization + Insights What every field means and how it's sourced. # Company Description SmartSearch Source: https://docs.revenuebase.ai/api-reference/v2/smartsearch-company-description Find companies by what they actually do, described in plain language, instead of by industry code. Describe what a company **does**, in your own words. The match runs against each company's own description, so you find businesses by actual activity rather than by an industry label somebody picked from a dropdown years ago. ```json theme={null} { "type": "semantic", "on": "company", "text": "sells payroll software to small businesses", "match": "similar" } ``` Works on both surfaces — [Contact Search](/api-reference/v2/contact-search-overview) to find people at those companies, [Company Search](/api-reference/v2/company-search-overview) to get the companies themselves. ## Why not just use industry? Industry taxonomies are too coarse for most go-to-market work. `Financial Services` contains a retail bank, a crypto exchange, a mortgage broker, and an insurance claims processor. If you sell to one of those, the label is nearly useless as a filter. Description search separates them, because it reads what the business says about itself: | You want | Industry gives you | Description search gives you | | - | - | - | | Crypto exchanges | All of Financial Services | Companies that describe trading digital assets | | Cold storage operators | Logistics, or Warehousing, or neither | Companies that describe running refrigerated warehouses | | Clinical trial software | Software Development | Companies that describe serving pharma research | > [!NOTE] > > We recommend against filtering on industry columns for targeting. Their values carry both false positives and false negatives at a rate that will quietly distort your results. Describe the business instead. ## Control how close a match must be Two ways to do it. Pick one — sending both `match` and `maxDistance` is a `422`. ### Option 1 — a named preset Send `match` with one of four names. Each is a similarity floor calibrated for company descriptions specifically. | `match` | What it means here | Similarity band | On target | | - | - | - | - | | `exact` | Only companies that are precisely what you described | 60–100% | 86% | | `similar` | Companies clearly in the space you described | 50–60% | 56% | | `related` | Companies in and around the space you described | 45–50% | 42% | | `broad` | Anything with a real connection. More results will require review | 40–45% | 24% | **On target** is the measured share of matches at that stop that genuinely fit. Presets are cumulative — `broad` returns everything `related` would, plus a looser band beneath it. ### Option 2 — your own similarity threshold Send `maxDistance` instead and put the floor wherever you like: ```text theme={null} maxDistance = 1 − similarity ``` A 55% similarity floor is `"maxDistance": 0.45`. A raw `maxDistance` means exactly what it says and skips our calibration. To find your own number, preview with `"includeScores": true` and read `_companySimilarity` on each row — they come back best-match first. Scroll to where results stop being useful and set your floor just above that. ### If you send neither You get **`similar`** — a 50% similarity floor. Sending nothing is exactly the same search as sending `"match": "similar"`, down to the same rows. > [!NOTE] > > **Short queries widen `exact` automatically.** A one- or two-word query ("airlines", "staffing agencies") embeds with a lower ceiling than a descriptive phrase, so `exact` would starve — 6 of 8 major airlines sat below its normal floor. On queries of two words or fewer, `exact` runs at a 55% floor instead of 60%. This applies to the preset only; a raw `maxDistance` always means exactly what it says. Company descriptions vary enormously in length and style, which is why these floors sit far lower than the [job title](/api-reference/v2/smartsearch-job-title) ones. **Do not carry a number across from another target** — 50% here is a solid match; 50% on a job title is noise. Accuracy falls off sharply past `similar`. At `broad`, roughly three in four results need review. Use `related` and `broad` to discover companies you hadn't thought of, then tighten before you build a list. ## Write a good description The phrasing matters more here than on the other two targets. A phrase describing what the business makes, who it sells to, and how it operates works well. A company name, a product brand, or a single abstract noun works poorly. **Better:** ```json theme={null} { "type": "semantic", "on": "company", "text": "regional passenger airlines operating short-haul routes", "match": "exact" } ``` **Weaker, but handled:** ```json theme={null} { "type": "semantic", "on": "company", "text": "airlines", "match": "exact" } ``` Short queries are compensated for automatically. A one- or two-word category noun embeds with a lower ceiling than a descriptive phrase, so `exact` widens to keep its promise. You still get better results from the fuller phrase, so write one when you can. ## Examples ```json theme={null} { "type": "semantic", "on": "company", "text": "operates cold storage and refrigerated warehousing", "match": "exact" } ``` ```json theme={null} { "type": "semantic", "on": "company", "text": "provides clinical trial management software to pharmaceutical companies", "match": "similar" } ``` ```json theme={null} { "type": "semantic", "on": "company", "text": "develops and finances renewable energy projects", "match": "related" } ``` ## Combine several descriptions Up to three company-description nodes per filter. Join them with `OR` to cover a market that doesn't reduce to one sentence — the piece no keyword tool can do: ```json theme={null} { "type": "group", "op": "OR", "children": [ { "type": "semantic", "on": "company", "text": "third-party logistics and freight forwarding", "match": "similar" }, { "type": "semantic", "on": "company", "text": "customs brokerage and trade compliance services", "match": "similar" } ]} ``` See [SmartSearch](/api-reference/v2/smartsearch) for combining this with job titles and look-alikes. ## Next steps Company Look-alike Start from a company you already like instead of describing one. Search for companies Count, preview, and export the accounts you matched. # Job Title SmartSearch Source: https://docs.revenuebase.ai/api-reference/v2/smartsearch-job-title Find people by the role they actually hold, however their title is worded, in any language. Describe the role in plain language. The match runs against a canonical form of every person's title, so wording, seniority phrasing, abbreviations, and other languages all resolve to the same underlying job. ```json theme={null} { "type": "semantic", "on": "title", "text": "runs demand generation for a software company", "match": "similar" } ``` Job title is person-grain. It works on [Contact Search](/api-reference/v2/contact-search-overview) only — sending one to a company endpoint returns a `422` pointing you back here. ## Why not a list of titles? Because the list is never finished. One buyer persona is spelled a dozen ways across a dozen companies, and every `in` list you write is a guess at which dozen: | The role | Titles that mean it | | - | - | | Demand generation lead | Head of Growth, Demand Gen Manager, VP Marketing, Growth Marketing Lead, Directeur Marketing | | Security decision maker | CISO, VP Information Security, Head of InfoSec, Director of Cyber Risk | | Warehouse operations lead | Fulfilment Manager, DC Operations Director, Head of Distribution | A `contains` filter on `"marketing"` catches Marketing Interns and misses Heads of Growth. One SmartSearch node catches the role and skips the intern, because it matches what the title **means**. ## Control how close a match must be Two ways to do it. Pick one — sending both `match` and `maxDistance` is a `422`. ### Option 1 — a named preset Send `match` with one of four names. Each is a similarity floor calibrated for job titles specifically. | `match` | What it means here | Similarity band | On target | | - | - | - | - | | `exact` | Only people with essentially the same role. Includes equivalent wording and languages | 95–100% | 99% | | `similar` | Same underlying job. May include a small number of adjacent roles | 85–95% | 91% | | `related` | Same function, with some variation in seniority and responsibilities | 75–85% | 82% | | `broad` | Explore related roles and functions. More results will require review | 70–75% | 73% | **On target** is the measured share of matches at that stop that genuinely hold the role, from a study over a 2,452-pair judged benchmark. Presets are cumulative — `broad` returns everything `related` would, plus a looser band beneath it. ### Option 2 — your own similarity threshold Send `maxDistance` instead and put the floor wherever you like: ```text theme={null} maxDistance = 1 − similarity ``` An 80% similarity floor is `"maxDistance": 0.20`. A raw `maxDistance` means exactly what it says and skips our calibration. To find your own number, preview with `"includeScores": true` and read `_titleSimilarity` on each row — they come back best-match first. Scroll to where results stop being useful and set your floor just above that. > [!NOTE] > > Title distances are clamped at 0.30 (a 70% floor). Sending a looser `maxDistance` is accepted and then run at 0.30, so `broad` sits on that real ceiling rather than below it. ### If you send neither You get **`similar`** — an 85% similarity floor. Sending nothing is exactly the same search as sending `"match": "similar"`, down to the same rows. > [!NOTE] > > `"match": "same"` is accepted as a legacy alias for `similar` on job title filters only. It predates the shared vocabulary. Use `similar` in new code. Job title is the most accurate of the three SmartSearch targets at every stop. Even `broad` is 73% on target, which makes it genuinely usable for list building in a way that `broad` on the other two targets is not. Start at `similar`. Move outward when the count is too small; tighten to `exact` when a preview shows roles you didn't intend. ## One role per node This is the single most common mistake. The matcher reduces a node's whole text to **one** standard job title before matching, so a comma list of different roles silently collapses into just one of them. **Wrong** — matches only CMOs: ```json theme={null} { "type": "semantic", "on": "title", "text": "head of marketing, marketing director, CMO", "match": "similar" } ``` **Right** — give each distinct role its own node and join with `OR`: ```json theme={null} { "type": "group", "op": "OR", "children": [ { "type": "semantic", "on": "title", "text": "head of marketing", "match": "similar" }, { "type": "semantic", "on": "title", "text": "runs marketing operations", "match": "similar" } ]} ``` Up to three job title nodes per filter. If you need more roles than that, merge the ones closest in seniority and function. ## Examples ```json theme={null} { "type": "semantic", "on": "title", "text": "chief information security officer", "match": "exact" } ``` ```json theme={null} { "type": "semantic", "on": "title", "text": "manages a team of field sales reps", "match": "similar" } ``` ```json theme={null} { "type": "semantic", "on": "title", "text": "anyone in procurement or vendor management", "match": "broad" } ``` ## Pair it with seniority SmartSearch finds the function; `JOB_LEVEL_PER` pins the seniority. Together they're sharper than either alone: ```json theme={null} "children": [ { "type": "semantic", "on": "title", "text": "runs demand generation", "match": "related" }, { "type": "condition", "column": "JOB_LEVEL_PER", "operator": "in", "valueList": ["VP", "C-Level"] } ] ``` Widening the SmartSearch to `related` while pinning the level is often better than tightening the SmartSearch: you catch more phrasings of the role without catching juniors. ## Next steps Combine SmartSearches Mix job titles with company descriptions and look-alikes. Search for contacts Count, preview, and export the people you matched. # Company Look-alike SmartSearch Source: https://docs.revenuebase.ai/api-reference/v2/smartsearch-lookalike Name a company you already like and find every company whose business resembles it. Name one company and match every company that resembles it. The comparison uses a **name-free** description vector, so it keys on what a company does — not what it's called, not what industry code it carries, not who it shares investors with. ```json theme={null} { "type": "lookalike", "domain": "northwind.com", "match": "similar" } ``` This is the fastest path from "our best customers look like this" to a list, because you don't have to articulate what they have in common. You point at one and we work it out. ## Name the seed company | Field | Use when | | - | - | | `domain` | You have a website or email domain. Resolved server-side | | `rbidOrg` | You already hold our company id | `POST /v2/contact/company/enrich` returns `RBID_ORG` for a domain, so you can resolve once and reuse the id across many searches. ## Control how close a match must be Two ways to do it. Pick one — sending both `match` and `maxDistance` is a `422`. ### Option 1 — a named preset Send `match` with one of four names. Each is a similarity floor calibrated for look-alikes specifically. | `match` | What it means here | Similarity band | On target | | - | - | - | - | | `exact` | Direct competitors and near-twins of this company | 85–100% | 85% | | `similar` | Same market, with an overlapping offering | 70–85% | 78% | | `related` | A similar space, but a different offering | 65–70% | 50% | | `broad` | The wider industry around this company. More results will require review | 60–65% | 34% | **On target** is the measured share of matches at that stop that genuinely fit. Presets are cumulative — `broad` returns everything `related` would, plus a looser band beneath it. ### Option 2 — your own similarity threshold Send `maxDistance` instead and put the floor wherever you like: ```text theme={null} maxDistance = 1 − similarity ``` A 75% similarity floor is `"maxDistance": 0.25`. A raw `maxDistance` means exactly what it says and skips our calibration. To find your own number, preview with `"includeScores": true` and read `_companySimilarity` on each row — they come back best-match first. Scroll to where results stop being useful and set your floor just above that. The `POST /v2/contact/company/lookalike` endpoint also returns a `similarity` score per match, which is a quick way to see the shape of a seed's neighbourhood before committing to a threshold. ### If you send neither You get **`similar`** — a 70% similarity floor. Sending nothing is exactly the same search as sending `"match": "similar"`, down to the same rows. `exact` and `similar` are both strong. Past that, accuracy halves — `related` is a coin flip and `broad` is exploratory. Use the loose stops to find categories you hadn't considered, then tighten. ## Two endpoints, two jobs As a filter leg Inside any filter, to count, preview, or export everyone at similar companies. This is the list-building path. As an endpoint POST /v2/contact/company/lookalike returns the neighbours ranked, with a similarity score on each. This is the exploration path. Use the endpoint when you want to see and judge the neighbours, ranked by how close they are. Use the filter leg when you want a set cut at a threshold, combined with your other filters. Use `match` or `maxDistance` on a **lookalike filter node** to set a similarity threshold for an audience. With neither supplied, the filter uses `similar`. The [standalone Lookalike endpoint](/api-reference/lookalike) accepts a seed, `columns`, and `limit`. It returns the nearest other companies, with a `similarity` score and match classification for each. Its limit is **25 by default and capped at 200**; it does not accept `match` or `maxDistance`. ## Any of several seeds Up to ten look-alike nodes per filter — far more headroom than the other two targets. Join them with `OR` so a company qualifies by resembling **any** seed: ```json theme={null} { "type": "group", "op": "OR", "children": [ { "type": "lookalike", "domain": "acmecorp.com", "match": "similar" }, { "type": "lookalike", "domain": "globex.io", "match": "similar" }, { "type": "lookalike", "domain": "initech.com", "match": "similar" } ]} ``` > [!WARNING] > > Put look-alikes in an `AND` group and a company must resemble **every** seed at once. That combination almost never matches anything. Use `OR` unless you specifically want the intersection. Feeding in your top ten closed-won accounts is the highest-value version of this: it describes your ICP from evidence rather than from a positioning document. ## Exclude a look-alike There is no "not in" look-alike node. Wrap it in a group and negate: ```json theme={null} { "type": "group", "negate": true, "children": [ { "type": "lookalike", "domain": "competitor.com", "match": "similar" } ]} ``` Useful for carving a segment out of a broad sweep — everyone like our customers, minus anyone like the incumbent we never beat. ## When a company has no vector A company with no usable description has nothing to compare against. | Where | What happens | | - | - | | In a filter | Matches nothing, silently | | `POST /v2/contact/company/lookalike` | Returns `404` | The `404` is deliberate: it lets you tell "no similar companies exist" apart from "we can't assess this company". If a seed returns `404`, pick a different one — usually a larger company in the same space. ## Next steps Company Description Describe a market instead of naming one company in it. Combine SmartSearches Look-alikes plus job titles, in one filter. # Which endpoint should I use? Source: https://docs.revenuebase.ai/api-reference/v2/which-endpoint Choose how to check an audience or retrieve its contact records. Use the **same filter** to define an audience. Choose the endpoint based on what you want back: numbers, a masked sample, analysis, inline records, or a downloadable file. ## One audience, five operations Count, View, and Insights are free on every plan. Preview and Start Export use credits on Pay-as-you-go (PAYG). All-you-can-eat (AYCE) includes unlimited contact retrieval at 0 credits, within the per-call limits shown below. ```mermaid theme={null} %%{init: {'flowchart': {'htmlLabels': false, 'nodeSpacing': 20, 'padding': 12}}}%% flowchart LR audience["Contact audience filter"] --> count["`Count: audience size Free (0 credits)`"] audience --> view["`View: masked sample Free (0 credits)`"] audience --> insights["`Insights: audience analysis Free (0 credits)`"] audience --> preview["`Preview Rows returned now (JSON) Up to 50,000 rows PAYG: uses credits AYCE: included`"] audience --> export["`Start Export Job ID, then file download Up to 1,000,000 rows PAYG: uses credits AYCE: included`"] classDef free fill:#173b2b,stroke:#4fbf84,color:#e4f8eb classDef paid fill:#3d2e13,stroke:#e5ae46,color:#ffebb5 class count,view,insights free class preview,export paid ``` These are independent calls. You can run Insights before View, or go directly to Preview when you already know what you need. | Endpoint | Question it answers | What you get | Credits | | - | - | - | - | | [Count](/api-reference/count) | How large is this audience? | Matching contact total, distinct-company count, and email/mobile availability counts. No individual records. | 0 | | [View](/api-reference/view) | Are these the people I meant? | Up to 100 contact rows. Names, roles, and company fields; email/mobile appear as availability booleans. | 0 | | [Preview](/api-reference/preview) | Can I retrieve these records now? | Up to 50,000 contact rows inline, with the fields you request and the email/mobile details you choose to reveal. | Metered on PAYG; included on AYCE | | [Insights](/api-reference/insights) | What is the audience's composition and data coverage? | Aggregate reachability, freshness, coverage, or field fill rates. No individual contact records. | 0 | | [Start Export](/api-reference/start-export) | Can I download a larger list as a file? | An `exportId` for an asynchronous job. Poll its status, then download the completed file of up to 1,000,000 rows. | Metered on PAYG; included on AYCE | Count's contact `total` is exact. Its other counts are estimates in default `fast` mode; check `exact` or request `mode: "exact"` for precise figures. On PAYG, View shares 500 preview rows per organization per UTC day with Company View and Company Preview. All members and API keys share the allowance. See [limits](/api-reference/v2/contact-api-overview#what-you-get-back). ## View checks relevance; Preview retrieves records **View** is a free relevance check. A row can show a person's name, role, company, and whether contact details are available. It replaces email and mobile values with `hasEmail` and `hasMobile` booleans. **Preview** retrieves contact records in the response. Set `columns` to choose the returned fields, `limit` to cap the rows, and `reveal` to choose email, mobile, both, or neither. It is charged on PAYG even when you request only profile and company fields. AYCE includes contact retrieval at 0 credits. > [!NOTE] > > Omitting `reveal` selects both email and mobile. Set it explicitly to > control cost; choosing fewer `columns` does not remove reveal charges. > See [credits and plans](/api-reference/v2/credits). View and Preview return samples with no pagination. A smaller `limit` changes how many rows you retrieve, not the audience defined by your filter. ## Preview returns rows; Start Export starts a file job **Preview** returns the contact rows directly in its API response. Use it when your application needs an immediate batch, capped by `limit` at up to 50,000 rows. **Start Export** returns a job ID, rather than contact rows or a finished file. Use it for a file of up to 1,000,000 rows, with `maxRows` as your row cap. Poll the export status and download the file once the job succeeds. Both use the same [PAYG credit rates](/api-reference/v2/credits#compare-retrieval-prices). Preview reserves credits before returning rows and settles the actual charge with the response. Start Export holds credits while the job runs and settles the actual charge when it completes. AYCE includes both at 0 credits. Use the free [Estimate](/api-reference/estimate-export) before starting a metered export. ## Count measures size; Insights describes the audience Count gives you headline numbers. Insights lets you choose one analysis section per call: | Insights section | Use it to ask | | - | - | | `reachability` | How many matching contact rows have email, mobile, or both? | | `freshness` | How recently were emails verified and records updated? | | `coverage` | How is the audience distributed across a field, such as seniority or company industry? | | `fillRate` | How often are the fields I need populated? | Insights evaluates the **filtered audience**, rather than the rows in a View or Preview sample. Grouped outputs can summarize smaller categories as `Other`; they are summaries, not record downloads. ## A practical sequence Suppose you want VPs at US-headquartered software companies. 1. **Count** to check audience size. 2. **View** to inspect names, roles, and companies without spending credits. 3. **Insights** to check email availability and industry distribution if needed. 4. **Preview** for an immediate batch, or **Estimate** followed by **Start Export** for a file. Reuse the same filter throughout. Company search fields work directly on contact endpoints, so you can combine company criteria with job or person criteria in one request. Available company fields on a contact row require no second company lookup or separate company-row charge. ## The company equivalents [Company Search](/api-reference/v2/company-search-overview) returns the company part of the same data, deduplicated to one search result per `RBID_ORG`. | Contact operation | Company operation | What changes | | - | - | - | | `/count` | `/company/count` | Counts companies, with aggregated contact totals. Company counts are exact; person/job filters select companies represented by matching contacts. | | `/view` | `/company/view` | Up to 100 company rows per request; shares the PAYG daily preview allowance. | | `/preview` | `/company/preview` | One row per company, with company fields and contact totals. PAYG: limited to the remaining shared 500-row daily allowance, 0 credits. AYCE: up to 50,000 rows, 0 credits. | | `/insights` | `/company/insights` | Company `coverage` and `fillRate`; contact `reachability` and `freshness` sections are unavailable here. | | `/enrich` | `/company/enrich` | Known company domains, LinkedIn URLs, and RBIDs; 10,000 combined identifiers. PAYG charges 1 per returned match; AYCE includes unlimited company retrieval. | | `/exports/estimate` | `/company/exports/estimate` | Free forecast for company rows and SmartSearch charges; creates no job or hold. | | `/exports` | `/company/exports` | Starts an asynchronous file job with company rows. Metered on PAYG; included on AYCE. | All paths above use the base URL `https://api.revenuebase.ai/v2/contact`. Company Preview and Insights require company filters. Company Count and Estimate and Export can also apply person/job conditions and select the distinct companies of the matching contacts. Their company contact totals still describe all contacts at each selected company. Check the [column catalogs](/api-reference/v2/company-search-overview#browse-company-fields) for fields supported on each surface. # View a free contact sample Source: https://docs.revenuebase.ai/api-reference/view /api-reference/v2/contact-openapi.json post /view Check a sample of matching people before retrieving their contact details. ## Credits and plans PAYG is Pay-as-you-go. AYCE is All-you-can-eat. | Usage or limit | PAYG | AYCE | | - | - | - | | Masked sample, including SmartSearch filters | **Free** 0 credits | **Included** 0 credits | | Rows per request | Up to 100 | Up to 100 | | Shared preview rows per organization per UTC day | 500 | Unlimited | AYCE includes [unlimited contact retrieval](/api-reference/start-export#credits-and-plans). This endpoint's masked-sample limits still apply; use [Preview](/api-reference/preview) or [Export](/api-reference/start-export) to retrieve full records on that plan. Use View to check whether your filter finds the right people before you retrieve contact details. Names, roles, and company fields let you assess relevance. Email and mobile values are replaced by availability booleans. ## When to use View Call [Count](/api-reference/count) first to size the audience, then reuse its filter here. You can refine and inspect the sample without paying for contact details. | You need | Use | | - | - | | A free sample with email/mobile masked | View | | Full contact rows returned immediately | [Preview](/api-reference/preview), which is charged on PAYG | | A downloadable file with a row cap | [Export](/api-reference/start-export) | ## Example: inspect two matching contacts Set your API key as `REVENUEBASE_API_KEY`. This uses the same audience as the Count example and requests availability for email and mobile. ```bash curl --request POST 'https://api.revenuebase.ai/v2/contact/view' \ --header "X-Key: $REVENUEBASE_API_KEY" \ --header 'Content-Type: application/json' \ --data '{ "filter": { "type": "group", "op": "AND", "children": [ { "type": "condition", "column": "COUNTRY_NAME_PER", "operator": "eq", "value": "United States" }, { "type": "condition", "column": "JOB_LEVEL_PER", "operator": "eq", "value": "VP" } ] }, "columns": [ "RBID_PAO", "FULL_NAME_PER", "JOB_TITLE_PER", "COMPANY_NAME_ORG", "EMAIL_ADDRESS_PER", "CELLPHONE_PER" ], "limit": 2 }' ``` Response captured from the local test API on October 13, 2026. Results can change as the dataset or account changes. ```json { "rows": [ { "RBID_PAO": "rb-pab23456t-rb-oadkxzpcq", "FULL_NAME_PER": "Matthew Tobin", "JOB_TITLE_PER": "Senior Vice President Business Development", "COMPANY_NAME_ORG": "Ecapital Corp", "hasEmail": true, "hasMobile": false }, { "RBID_PAO": "rb-pab2346sr-rb-oacopeifk", "FULL_NAME_PER": "Katherine Collins", "JOB_TITLE_PER": "AVP of Claim Operations", "COMPANY_NAME_ORG": "Travelers", "hasEmail": true, "hasMobile": true } ], "columns": [ "RBID_PAO", "FULL_NAME_PER", "JOB_TITLE_PER", "COMPANY_NAME_ORG", "hasEmail", "hasMobile" ], "columnLabels": { "RBID_PAO": "Rbid Person And Organization", "FULL_NAME_PER": "Person Full Name", "JOB_TITLE_PER": "Job Title", "COMPANY_NAME_ORG": "Company Name", "hasEmail": "hasEmail", "hasMobile": "hasMobile" }, "rowCount": 2, "limit": 2 } ``` | Field | What it means | | - | - | | `rows` | The sample records. Email/mobile values are never revealed by this endpoint. | | `hasEmail`, `hasMobile` | Whether the corresponding contact detail is available; these are booleans, not contact details. | | `RBID_PAO` | The stable person-at-company identifier, included even if omitted from `columns`. Use it as a `personIds` value in Enrich to retrieve a chosen row. | | `columns`, `columnLabels` | Returned field names and display labels. Masked fields use `hasEmail` / `hasMobile`. | | `rowCount`, `limit` | Rows returned and the applied sample limit. These are not the full audience total. | ## Limits and errors * Up to **100 rows per call**. Higher limits are clamped to 100; omit `limit` to use that cap. * A **500-row daily budget per PAYG organization**, shared with Company View and Company Preview, resetting at UTC midnight. All members and API keys share the allowance; AYCE has no daily preview allowance. Read `X-FreePreview-Remaining` to track it. Repeated samples count toward this row budget even though they cost no credits. * `429 FREE_PREVIEW_CAP_REACHED` means the daily budget is exhausted. Wait for the reset. Other `429` responses use the ordinary [request rate limit](/api-reference/v2/rate-limits). * `422` means the filter or requested column needs correction. An empty audience returns an empty sample. View has no pagination cursor; repeating it does not fetch the next page. Use `includeScores` when you want similarity information for a SmartSearch sample. ## Next: choose records and estimate the cost To retrieve selected rows, pass their `RBID_PAO` values as `personIds` to [Enrich](/api-reference/enrich), with an explicit `reveal` choice. To download a filtered list, reuse the filter with [Estimate](/api-reference/estimate-export), set `maxRows`, and choose whether to buy email, mobile, both, or neither. # Data Coverage Source: https://docs.revenuebase.ai/docs/data-features/data-coverage Current API dataset totals, field fill rates, country coverage, and timestamp freshness for contacts and companies. Use this page to see how many records you can search and how often each field has a value. The [Data Dictionary](/docs/data-features/data-dictionary) explains what those fields mean. Use the country checkboxes to combine any countries, or start with an **APAC**, **EMEA**, **North America**, **Latin America**, or **Europe** preset. You can select all, clear all, or change the countries in a preset. Search by country name or code; you can also type a list such as `US, UK, France` and press Enter. The totals, field fill rates, tables, and verification freshness update together from the saved snapshot. **Country selection does not call the API or use credits.** **Worldwide** is the default and includes records without a recorded country. The **Country not recorded** checkbox lets you include those rows in a custom group. Contact figures use the person's location; company figures use the headquarters location. | Region preset | Countries included | | - | - | | North America | United States and Canada | | Latin America | Mexico, Central America, the Caribbean, and South America | | APAC | Asia and Oceania, excluding the Middle East | | EMEA | Europe, the Middle East, and Africa | | Europe | European countries and territories | These are starting points for a grouping. Open the country picker to see and change the countries in any preset. **Last checked: 2026-11-04 14:22:28 UTC.** This report covers the entire API serving dataset. This snapshot was collected from the production Contact API. > [!NOTE] > > These figures cover the **searchable API datasets**. A contact row represents a > person's job and available company data; a company row represents one `RBID_ORG`. They do not measure > each standalone data-feed table or the number of distinct people in `PER_LATEST`. > Your Snowflake or S3 feed can have a different scope and release date. ## Dataset totals Contact percentages use all contact rows. Company percentages use all company rows. A record with both email and mobile appears in both individual counts. | Dataset or field | Records | Share of dataset | | - | -: | -: | | Contacts | | | | Verified emails | | | | Mobile numbers | | | | Contacts with both | | | | Companies | | | | Companies with a domain | | | | Companies with a LinkedIn URL | | | | Companies with an About Us description | | | ## Country coverage Contact countries use `COUNTRY_NAME_PER`, the person's country. Company countries use `HEADQUARTERS_COUNTRY_NAME_ORG`, the headquarters country. The percentage is each country's share of the selected geography. Worldwide includes records without a country. Worldwide shows the eight largest countries and all remaining recorded countries together. Selecting countries shows the chosen recorded names. Expand the table to see the complete alphabetical list for the selected geography. Case-only spelling variants are combined; other names are kept as returned by the API. Records without a country are shown separately. > [tab] Contacts > > | Country or territory | Contacts | Share | With email | With mobile | With email and mobile | > | - | -: | -: | -: | -: | -: | > | Afghanistan | 132,846 | | 5,576 | 1,206 | 83 | > | Aland Islands | 8,751 | | 1,417 | 114 | 31 | > | Albania | 163,157 | | 17,625 | 2,378 | 426 | > | Algeria | 973,191 | | 28,572 | 3,660 | 393 | > | American Samoa | 8,455 | | 363 | 183 | 39 | > | Andorra | 22,947 | | 2,137 | 171 | 34 | > | Angola | 305,780 | | 21,984 | 3,094 | 452 | > | Anguilla | 5,318 | | 617 | 340 | 86 | > | Antarctica | 3,339 | | 159 | 73 | 21 | > | Antigua and Barbuda | 12,526 | | 970 | 522 | 75 | > | Argentina | 4,810,045 | | 529,090 | 20,438 | 3,992 | > | Armenia | 158,102 | | 24,377 | 905 | 176 | > | Aruba | 20,206 | | 2,224 | 238 | 50 | > | Australia | 8,319,619 | | 2,288,039 | 412,116 | 158,064 | > | Austria | 1,087,225 | | 297,629 | 17,013 | 5,268 | > | Azerbaijan | 311,098 | | 31,302 | 1,491 | 169 | > | Bahamas | 66,969 | | 8,104 | 2,636 | 486 | > | Bahrain | 236,451 | | 28,117 | 1,720 | 296 | > | Bangladesh | 1,851,520 | | 94,202 | 28,060 | 2,302 | > | Barbados | 48,182 | | 6,400 | 1,811 | 352 | > | Belarus | 247,894 | | 9,845 | 1,979 | 81 | > | Belgium | 2,631,052 | | 707,697 | 26,037 | 8,148 | > | Belize | 24,490 | | 2,640 | 402 | 62 | > | Benin | 117,247 | | 3,873 | 903 | 33 | > | Bermuda | 26,856 | | 5,681 | 1,340 | 413 | > | Bhutan | 27,092 | | 1,615 | 124 | 6 | > | Bolivia | 314,936 | | 14,661 | 2,741 | 249 | > | Bonaire, Saint Eustatius and Saba | 1,386 | | 349 | 59 | 13 | > | Bosnia and Herzegovina | 126,927 | | 19,694 | 505 | 70 | > | Botswana | 142,917 | | 14,377 | 1,248 | 175 | > | Bouvet Island | 150 | | 3 | 0 | 0 | > | Brazil | 29,709,098 | | 2,673,014 | 224,169 | 33,468 | > | British Indian Ocean Territory | 2,491 | | 118 | 36 | 5 | > | British Virgin Islands | 7,332 | | 1,083 | 333 | 64 | > | Brunei Darussalam | 40,165 | | 2,906 | 165 | 18 | > | Bulgaria | 441,022 | | 96,823 | 2,980 | 685 | > | Burkina Faso | 104,321 | | 5,754 | 544 | 51 | > | Burundi | 23,582 | | 1,479 | 119 | 17 | > | Cabo Verde | 20,739 | | 1,541 | 111 | 14 | > | Cambodia | 212,252 | | 22,771 | 2,155 | 245 | > | Cameroon | 337,756 | | 8,482 | 1,864 | 68 | > | Canada | 12,357,204 | | 3,207,062 | 643,946 | 246,249 | > | Cayman Islands | 30,306 | | 7,345 | 1,251 | 437 | > | Central African Republic | 12,894 | | 735 | 54 | 7 | > | Chad | 32,205 | | 1,555 | 172 | 30 | > | Chile | 3,465,070 | | 307,240 | 22,179 | 3,837 | > | China | 8,773,687 | | 207,228 | 85,071 | 3,308 | > | Christmas Island | 708 | | 21 | 8 | 0 | > | Cocos (Keeling) Islands | 300 | | 2 | 1 | 0 | > | Colombia | 4,802,489 | | 318,043 | 41,065 | 5,181 | > | Comoros | 5,842 | | 119 | 10 | 0 | > | Congo Republic | 67,220 | | 2,782 | 258 | 21 | > | Cook Islands | 2,473 | | 211 | 28 | 7 | > | Costa Rica | 669,701 | | 80,082 | 8,780 | 1,762 | > | Cote d'Ivoire | 438,176 | | 20,230 | 2,483 | 295 | > | Croatia | 345,123 | | 71,270 | 1,747 | 347 | > | Cuba | 96,400 | | 1,019 | 436 | 51 | > | Curacao | 28,640 | | 3,663 | 434 | 87 | > | Cyprus | 202,967 | | 39,738 | 4,689 | 1,270 | > | Czech Republic | 1,185,353 | | 265,896 | 22,410 | 6,755 | > | Denmark | 1,923,765 | | 223,811 | 41,357 | 7,605 | > | Djibouti | 20,361 | | 692 | 91 | 9 | > | Dominica | 7,134 | | 548 | 300 | 43 | > | Dominican Republic | 533,100 | | 54,204 | 8,501 | 1,408 | > | DR Congo | 221,407 | | 12,377 | 5,359 | 1,855 | > | Ecuador | 1,321,965 | | 78,474 | 5,837 | 557 | > | Egypt | 3,132,287 | | 256,328 | 19,519 | 2,089 | > | El Salvador | 269,216 | | 26,485 | 1,168 | 211 | > | Equatorial Guinea | 11,474 | | 400 | 80 | 14 | > | Eritrea | 3,149 | | 303 | 17 | 5 | > | Estonia | 155,453 | | 47,477 | 1,084 | 329 | > | Eswatini | 40,284 | | 3,102 | 153 | 20 | > | Ethiopia | 366,579 | | 34,621 | 1,650 | 247 | > | Faeroe Islands | 7,563 | | 898 | 69 | 8 | > | Falkland Islands | 1,074 | | 46 | 11 | 2 | > | Fiji | 78,705 | | 9,706 | 307 | 60 | > | Finland | 985,848 | | 380,874 | 26,101 | 13,501 | > | France | 15,717,686 | | 2,934,533 | 256,738 | 67,682 | > | French Guiana | 19,262 | | 1,749 | 55 | 6 | > | French Polynesia | 25,115 | | 1,893 | 143 | 22 | > | French Southern Territories | 553 | | 29 | 7 | 0 | > | Gabon | 73,012 | | 2,448 | 405 | 28 | > | Gambia | 30,845 | | 1,857 | 197 | 21 | > | Georgia | 214,290 | | 32,829 | 2,863 | 626 | > | Germany | 9,009,255 | | 2,315,280 | 92,250 | 26,934 | > | Ghana | 808,114 | | 63,778 | 4,617 | 414 | > | Gibraltar | 14,183 | | 3,341 | 165 | 59 | > | Greece | 901,673 | | 154,975 | 12,660 | 2,858 | > | Greenland | 8,484 | | 303 | 56 | 2 | > | Grenada | 12,110 | | 996 | 414 | 78 | > | Guadeloupe | 46,876 | | 3,362 | 206 | 18 | > | Guam | 25,266 | | 1,996 | 1,195 | 178 | > | Guatemala | 444,703 | | 37,990 | 3,061 | 515 | > | Guernsey | 17,338 | | 5,276 | 273 | 120 | > | Guinea | 79,362 | | 3,996 | 406 | 39 | > | Guinea-Bissau | 4,924 | | 262 | 21 | 3 | > | Guyana | 38,805 | | 3,782 | 307 | 59 | > | Haiti | 71,567 | | 2,956 | 615 | 65 | > | Heard and McDonald Islands | 175 | | 4 | 0 | 0 | > | Honduras | 234,698 | | 21,513 | 1,306 | 239 | > | Hong Kong | 1,098,250 | | 151,145 | 21,154 | 6,227 | > | Hungary | 638,283 | | 149,529 | 9,600 | 2,863 | > | Iceland | 71,472 | | 14,330 | 638 | 185 | > | India | 48,783,774 | | 5,700,352 | 2,473,253 | 560,711 | > | Indonesia | 9,546,686 | | 527,393 | 57,097 | 5,220 | > | Iran | 1,391,560 | | 10,190 | 9,369 | 119 | > | Iraq | 424,355 | | 20,207 | 2,499 | 214 | > | Ireland | 1,517,981 | | 438,419 | 48,562 | 19,380 | > | Isle of Man | 20,770 | | 5,767 | 523 | 185 | > | Israel | 1,156,876 | | 271,931 | 45,139 | 16,346 | > | Italy | 8,610,279 | | 1,670,234 | 344,865 | 91,365 | > | Jamaica | 245,965 | | 25,583 | 8,144 | 1,540 | > | Japan | 1,838,570 | | 200,539 | 12,480 | 3,291 | > | Jersey | 31,016 | | 9,786 | 1,225 | 499 | > | Jordan | 553,704 | | 54,150 | 3,683 | 516 | > | Kazakhstan | 365,064 | | 29,599 | 1,590 | 188 | > | Kenya | 1,551,743 | | 124,355 | 7,287 | 935 | > | Kiribati | 2,514 | | 137 | 3 | 0 | > | Kosovo | 59,247 | | 12,218 | 879 | 255 | > | Kuwait | 420,959 | | 48,503 | 3,561 | 624 | > | Kyrgyz Republic | 45,534 | | 2,231 | 196 | 20 | > | Laos | 26,916 | | 2,051 | 181 | 25 | > | Latvia | 182,560 | | 40,354 | 1,372 | 307 | > | Lebanon | 433,347 | | 51,968 | 2,870 | 483 | > | Lesotho | 35,787 | | 3,761 | 103 | 8 | > | Liberia | 47,327 | | 2,817 | 691 | 112 | > | Libya | 97,734 | | 6,274 | 440 | 34 | > | Liechtenstein | 11,745 | | 3,509 | 104 | 37 | > | Lithuania | 295,618 | | 78,354 | 5,758 | 1,749 | > | Luxembourg | 205,050 | | 57,117 | 3,612 | 1,259 | > | Macau | 48,581 | | 3,465 | 317 | 50 | > | Madagascar | 128,806 | | 6,592 | 661 | 53 | > | Malawi | 104,047 | | 10,973 | 389 | 58 | > | Malaysia | 3,132,239 | | 253,264 | 56,353 | 7,867 | > | Maldives | 71,036 | | 8,143 | 1,093 | 228 | > | Mali | 98,648 | | 5,800 | 468 | 31 | > | Malta | 144,944 | | 32,693 | 3,544 | 1,160 | > | Marshall Islands | 6,085 | | 522 | 1,329 | 183 | > | Martinique | 43,710 | | 3,650 | 249 | 37 | > | Mauritania | 34,900 | | 1,307 | 237 | 12 | > | Mauritius | 168,890 | | 24,566 | 3,185 | 640 | > | Mayotte | 8,862 | | 550 | 17 | 1 | > | Mexico | 8,467,357 | | 617,734 | 31,829 | 5,772 | > | Micronesia, Fed. Sts. | 3,075 | | 149 | 24 | 4 | > | Moldova | 96,060 | | 9,858 | 550 | 71 | > | Monaco | 27,842 | | 5,476 | 370 | 91 | > | Mongolia | 76,589 | | 6,624 | 279 | 43 | > | Montenegro | 48,154 | | 5,264 | 278 | 42 | > | Montserrat | 911 | | 26 | 32 | 5 | > | Morocco | 1,519,727 | | 118,912 | 7,449 | 876 | > | Mozambique | 209,655 | | 17,537 | 1,218 | 156 | > | Myanmar | 224,614 | | 6,280 | 974 | 60 | > | Namibia | 136,850 | | 14,060 | 2,455 | 434 | > | Nauru | 890 | | 39 | 3 | 0 | > | Nepal | 420,872 | | 31,659 | 2,144 | 211 | > | Netherlands | 6,612,017 | | 1,830,963 | 354,321 | 129,223 | > | New Caledonia | 31,990 | | 4,011 | 276 | 59 | > | New Zealand | 1,356,985 | | 362,665 | 15,271 | 5,469 | > | Nicaragua | 182,169 | | 11,864 | 888 | 111 | > | Niger | 40,171 | | 1,410 | 170 | 13 | > | Nigeria | 3,050,770 | | 208,587 | 54,128 | 5,184 | > | Niue | 517 | | 16 | 2 | 0 | > | Norfolk Island | 522 | | 22 | 8 | 0 | > | North Korea | 2,055 | | 158 | 41 | 4 | > | North Macedonia | 131,162 | | 20,674 | 589 | 95 | > | Northern Mariana Islands | 4,751 | | 368 | 199 | 26 | > | Norway | 1,349,446 | | 325,809 | 38,073 | 12,299 | > | Oman | 376,492 | | 36,950 | 3,079 | 479 | > | Pakistan | 3,879,849 | | 225,690 | 23,725 | 1,738 | > | Palau | 2,189 | | 123 | 23 | 8 | > | Palestine | 102,426 | | 10,511 | 2,114 | 622 | > | Panama | 403,417 | | 46,664 | 6,923 | 1,345 | > | Papua New Guinea | 148,707 | | 16,576 | 510 | 97 | > | Paraguay | 274,870 | | 22,022 | 1,275 | 155 | > | Peru | 2,767,903 | | 155,068 | 30,960 | 3,075 | > | Philippines | 5,327,684 | | 501,756 | 27,796 | 4,257 | > | Pitcairn | 298 | | 4 | 1 | 0 | > | Poland | 2,739,961 | | 654,212 | 21,488 | 4,995 | > | Portugal | 2,140,868 | | 345,467 | 83,256 | 20,728 | > | Puerto Rico | 330,446 | | 37,835 | 13,887 | 3,087 | > | Qatar | 678,331 | | 88,593 | 5,803 | 1,115 | > | Reunion | 95,676 | | 9,320 | 663 | 95 | > | Romania | 1,478,205 | | 232,460 | 7,577 | 1,336 | > | Russia | 2,217,845 | | 46,841 | 18,361 | 1,273 | > | Rwanda | 129,758 | | 12,730 | 716 | 106 | > | Saint-Martin | 1,005 | | 135 | 26 | 6 | > | Samoa | 5,606 | | 531 | 29 | 3 | > | San Marino | 5,617 | | 731 | 50 | 13 | > | Sao Tome and Principe | 2,734 | | 109 | 8 | 1 | > | Saudi Arabia | 3,325,291 | | 381,182 | 25,019 | 4,449 | > | Senegal | 332,223 | | 18,381 | 1,765 | 173 | > | Serbia | 531,930 | | 102,689 | 2,512 | 491 | > | Seychelles | 14,755 | | 1,321 | 111 | 18 | > | Sierra Leone | 44,169 | | 2,789 | 407 | 50 | > | Singapore | 2,036,996 | | 322,636 | 70,414 | 21,883 | > | Sint Maarten | 2,696 | | 521 | 147 | 44 | > | Slovakia | 318,836 | | 79,823 | 2,849 | 742 | > | Slovenia | 193,171 | | 49,253 | 2,797 | 802 | > | Solomon Islands | 7,534 | | 596 | 25 | 4 | > | Somalia | 69,798 | | 3,308 | 295 | 20 | > | South Africa | 5,484,013 | | 805,524 | 122,648 | 28,610 | > | South Georgia and South Sandwich Is. | 390 | | 14 | 2 | 0 | > | South Korea | 1,031,536 | | 74,994 | 8,606 | 1,500 | > | South Sudan | 29,028 | | 2,137 | 204 | 32 | > | Spain | 8,416,385 | | 815,674 | 56,798 | 9,523 | > | Sri Lanka | 822,838 | | 88,514 | 3,438 | 397 | > | St. Barths | 1,322 | | 174 | 47 | 6 | > | St. Helena | 601 | | 52 | 3 | 0 | > | St. Kitts and Nevis | 6,871 | | 661 | 337 | 42 | > | St. Lucia | 19,934 | | 1,569 | 636 | 60 | > | St. Pierre and Miquelon | 933 | | 42 | 2 | 0 | > | St. Vincent and the Grenadines | 8,616 | | 518 | 213 | 17 | > | Sudan | 121,780 | | 3,277 | 594 | 26 | > | Suriname | 34,068 | | 4,184 | 328 | 60 | > | Svalbard and Jan Mayen Islands | 551 | | 67 | 7 | 1 | > | Sweden | 2,971,363 | | 935,813 | 35,669 | 15,835 | > | Switzerland | 2,385,817 | | 696,552 | 43,610 | 15,155 | > | Syria | 131,849 | | 3,928 | 675 | 31 | > | Taiwan | 815,006 | | 84,861 | 5,281 | 1,221 | > | Tajikistan | 20,082 | | 1,040 | 62 | 7 | > | Tanzania | 357,877 | | 23,886 | 2,376 | 213 | > | Thailand | 1,234,944 | | 126,205 | 7,364 | 1,200 | > | Timor-Leste | 10,155 | | 648 | 156 | 18 | > | Togo | 71,549 | | 2,700 | 432 | 24 | > | Tokelau | 306 | | 6 | 1 | 0 | > | Tonga | 4,205 | | 234 | 23 | 3 | > | Trinidad and Tobago | 186,806 | | 22,628 | 6,425 | 1,163 | > | Tunisia | 723,303 | | 50,358 | 3,493 | 297 | > | Türkiye | 5,922,147 | | 603,915 | 19,611 | 1,561 | > | Turkmenistan | 13,645 | | 865 | 47 | 10 | > | Turks and Caicos Islands | 8,115 | | 921 | 277 | 48 | > | Tuvalu | 811 | | 15 | 2 | 0 | > | Uganda | 412,833 | | 30,556 | 2,337 | 215 | > | Ukraine | 1,226,398 | | 115,589 | 7,681 | 1,097 | > | United Arab Emirates | 4,399,762 | | 587,734 | 53,382 | 11,865 | > | United Kingdom | 20,257,526 | | 5,104,191 | 852,665 | 328,475 | > | United States | 111,885,857 | | 25,874,770 | 46,869,710 | 14,484,806 | > | United States Minor Outlying Islands | 810 | | 93 | 124 | 28 | > | United States Virgin Islands | 17,751 | | 1,680 | 1,450 | 290 | > | Uruguay | 466,487 | | 47,387 | 6,555 | 1,145 | > | Uzbekistan | 143,953 | | 6,459 | 573 | 48 | > | Vanuatu | 6,437 | | 565 | 42 | 6 | > | Vatican | 1,366 | | 49 | 39 | 5 | > | Venezuela | 1,031,627 | | 32,477 | 4,162 | 322 | > | Vietnam | 1,498,476 | | 63,279 | 25,816 | 2,099 | > | Wallis and Futuna Islands | 923 | | 35 | 6 | 0 | > | Western Sahara | 1,649 | | 165 | 7 | 1 | > | Yemen | 83,651 | | 3,048 | 468 | 30 | > | Zambia | 302,404 | | 27,947 | 1,328 | 192 | > | Zimbabwe | 332,565 | | 30,234 | 1,182 | 128 | > | All other recorded countries | 175,823,956 | | 23,256,004 | 2,768,537 | 726,995 | > | Country not recorded | 2,747,192 | | 418,110 | 212,308 | 53,839 | > > > [accordion] All recorded countries and territories > > > > | Country or territory | Contacts | Share | With email | With mobile | With email and mobile | > > | - | -: | -: | -: | -: | -: | > > | Afghanistan | 132,846 | | 5,576 | 1,206 | 83 | > > | Aland Islands | 8,751 | | 1,417 | 114 | 31 | > > | Albania | 163,157 | | 17,625 | 2,378 | 426 | > > | Algeria | 973,191 | | 28,572 | 3,660 | 393 | > > | American Samoa | 8,455 | | 363 | 183 | 39 | > > | Andorra | 22,947 | | 2,137 | 171 | 34 | > > | Angola | 305,780 | | 21,984 | 3,094 | 452 | > > | Anguilla | 5,318 | | 617 | 340 | 86 | > > | Antarctica | 3,339 | | 159 | 73 | 21 | > > | Antigua and Barbuda | 12,526 | | 970 | 522 | 75 | > > | Argentina | 4,810,045 | | 529,090 | 20,438 | 3,992 | > > | Armenia | 158,102 | | 24,377 | 905 | 176 | > > | Aruba | 20,206 | | 2,224 | 238 | 50 | > > | Australia | 8,319,619 | | 2,288,039 | 412,116 | 158,064 | > > | Austria | 1,087,225 | | 297,629 | 17,013 | 5,268 | > > | Azerbaijan | 311,098 | | 31,302 | 1,491 | 169 | > > | Bahamas | 66,969 | | 8,104 | 2,636 | 486 | > > | Bahrain | 236,451 | | 28,117 | 1,720 | 296 | > > | Bangladesh | 1,851,520 | | 94,202 | 28,060 | 2,302 | > > | Barbados | 48,182 | | 6,400 | 1,811 | 352 | > > | Belarus | 247,894 | | 9,845 | 1,979 | 81 | > > | Belgium | 2,631,052 | | 707,697 | 26,037 | 8,148 | > > | Belize | 24,490 | | 2,640 | 402 | 62 | > > | Benin | 117,247 | | 3,873 | 903 | 33 | > > | Bermuda | 26,856 | | 5,681 | 1,340 | 413 | > > | Bhutan | 27,092 | | 1,615 | 124 | 6 | > > | Bolivia | 314,936 | | 14,661 | 2,741 | 249 | > > | Bonaire, Saint Eustatius and Saba | 1,386 | | 349 | 59 | 13 | > > | Bosnia and Herzegovina | 126,927 | | 19,694 | 505 | 70 | > > | Botswana | 142,917 | | 14,377 | 1,248 | 175 | > > | Bouvet Island | 150 | | 3 | 0 | 0 | > > | Brazil | 29,709,098 | | 2,673,014 | 224,169 | 33,468 | > > | British Indian Ocean Territory | 2,491 | | 118 | 36 | 5 | > > | British Virgin Islands | 7,332 | | 1,083 | 333 | 64 | > > | Brunei Darussalam | 40,165 | | 2,906 | 165 | 18 | > > | Bulgaria | 441,022 | | 96,823 | 2,980 | 685 | > > | Burkina Faso | 104,321 | | 5,754 | 544 | 51 | > > | Burundi | 23,582 | | 1,479 | 119 | 17 | > > | Cabo Verde | 20,739 | | 1,541 | 111 | 14 | > > | Cambodia | 212,252 | | 22,771 | 2,155 | 245 | > > | Cameroon | 337,756 | | 8,482 | 1,864 | 68 | > > | Canada | 12,357,204 | | 3,207,062 | 643,946 | 246,249 | > > | Cayman Islands | 30,306 | | 7,345 | 1,251 | 437 | > > | Central African Republic | 12,894 | | 735 | 54 | 7 | > > | Chad | 32,205 | | 1,555 | 172 | 30 | > > | Chile | 3,465,070 | | 307,240 | 22,179 | 3,837 | > > | China | 8,773,687 | | 207,228 | 85,071 | 3,308 | > > | Christmas Island | 708 | | 21 | 8 | 0 | > > | Cocos (Keeling) Islands | 300 | | 2 | 1 | 0 | > > | Colombia | 4,802,489 | | 318,043 | 41,065 | 5,181 | > > | Comoros | 5,842 | | 119 | 10 | 0 | > > | Congo Republic | 67,220 | | 2,782 | 258 | 21 | > > | Cook Islands | 2,473 | | 211 | 28 | 7 | > > | Costa Rica | 669,701 | | 80,082 | 8,780 | 1,762 | > > | Cote d'Ivoire | 438,176 | | 20,230 | 2,483 | 295 | > > | Croatia | 345,123 | | 71,270 | 1,747 | 347 | > > | Cuba | 96,400 | | 1,019 | 436 | 51 | > > | Curacao | 28,640 | | 3,663 | 434 | 87 | > > | Cyprus | 202,967 | | 39,738 | 4,689 | 1,270 | > > | Czech Republic | 1,185,353 | | 265,896 | 22,410 | 6,755 | > > | Denmark | 1,923,765 | | 223,811 | 41,357 | 7,605 | > > | Djibouti | 20,361 | | 692 | 91 | 9 | > > | Dominica | 7,134 | | 548 | 300 | 43 | > > | Dominican Republic | 533,100 | | 54,204 | 8,501 | 1,408 | > > | DR Congo | 221,407 | | 12,377 | 5,359 | 1,855 | > > | Ecuador | 1,321,965 | | 78,474 | 5,837 | 557 | > > | Egypt | 3,132,287 | | 256,328 | 19,519 | 2,089 | > > | El Salvador | 269,216 | | 26,485 | 1,168 | 211 | > > | Equatorial Guinea | 11,474 | | 400 | 80 | 14 | > > | Eritrea | 3,149 | | 303 | 17 | 5 | > > | Estonia | 155,453 | | 47,477 | 1,084 | 329 | > > | Eswatini | 40,284 | | 3,102 | 153 | 20 | > > | Ethiopia | 366,579 | | 34,621 | 1,650 | 247 | > > | Faeroe Islands | 7,563 | | 898 | 69 | 8 | > > | Falkland Islands | 1,074 | | 46 | 11 | 2 | > > | Fiji | 78,705 | | 9,706 | 307 | 60 | > > | Finland | 985,848 | | 380,874 | 26,101 | 13,501 | > > | France | 15,717,686 | | 2,934,533 | 256,738 | 67,682 | > > | French Guiana | 19,262 | | 1,749 | 55 | 6 | > > | French Polynesia | 25,115 | | 1,893 | 143 | 22 | > > | French Southern Territories | 553 | | 29 | 7 | 0 | > > | Gabon | 73,012 | | 2,448 | 405 | 28 | > > | Gambia | 30,845 | | 1,857 | 197 | 21 | > > | Georgia | 214,290 | | 32,829 | 2,863 | 626 | > > | Germany | 9,009,255 | | 2,315,280 | 92,250 | 26,934 | > > | Ghana | 808,114 | | 63,778 | 4,617 | 414 | > > | Gibraltar | 14,183 | | 3,341 | 165 | 59 | > > | Greece | 901,673 | | 154,975 | 12,660 | 2,858 | > > | Greenland | 8,484 | | 303 | 56 | 2 | > > | Grenada | 12,110 | | 996 | 414 | 78 | > > | Guadeloupe | 46,876 | | 3,362 | 206 | 18 | > > | Guam | 25,266 | | 1,996 | 1,195 | 178 | > > | Guatemala | 444,703 | | 37,990 | 3,061 | 515 | > > | Guernsey | 17,338 | | 5,276 | 273 | 120 | > > | Guinea | 79,362 | | 3,996 | 406 | 39 | > > | Guinea-Bissau | 4,924 | | 262 | 21 | 3 | > > | Guyana | 38,805 | | 3,782 | 307 | 59 | > > | Haiti | 71,567 | | 2,956 | 615 | 65 | > > | Heard and McDonald Islands | 175 | | 4 | 0 | 0 | > > | Honduras | 234,698 | | 21,513 | 1,306 | 239 | > > | Hong Kong | 1,098,250 | | 151,145 | 21,154 | 6,227 | > > | Hungary | 638,283 | | 149,529 | 9,600 | 2,863 | > > | Iceland | 71,472 | | 14,330 | 638 | 185 | > > | India | 48,783,774 | | 5,700,352 | 2,473,253 | 560,711 | > > | Indonesia | 9,546,686 | | 527,393 | 57,097 | 5,220 | > > | Iran | 1,391,560 | | 10,190 | 9,369 | 119 | > > | Iraq | 424,355 | | 20,207 | 2,499 | 214 | > > | Ireland | 1,517,981 | | 438,419 | 48,562 | 19,380 | > > | Isle of Man | 20,770 | | 5,767 | 523 | 185 | > > | Israel | 1,156,876 | | 271,931 | 45,139 | 16,346 | > > | Italy | 8,610,279 | | 1,670,234 | 344,865 | 91,365 | > > | Jamaica | 245,965 | | 25,583 | 8,144 | 1,540 | > > | Japan | 1,838,570 | | 200,539 | 12,480 | 3,291 | > > | Jersey | 31,016 | | 9,786 | 1,225 | 499 | > > | Jordan | 553,704 | | 54,150 | 3,683 | 516 | > > | Kazakhstan | 365,064 | | 29,599 | 1,590 | 188 | > > | Kenya | 1,551,743 | | 124,355 | 7,287 | 935 | > > | Kiribati | 2,514 | | 137 | 3 | 0 | > > | Kosovo | 59,247 | | 12,218 | 879 | 255 | > > | Kuwait | 420,959 | | 48,503 | 3,561 | 624 | > > | Kyrgyz Republic | 45,534 | | 2,231 | 196 | 20 | > > | Laos | 26,916 | | 2,051 | 181 | 25 | > > | Latvia | 182,560 | | 40,354 | 1,372 | 307 | > > | Lebanon | 433,347 | | 51,968 | 2,870 | 483 | > > | Lesotho | 35,787 | | 3,761 | 103 | 8 | > > | Liberia | 47,327 | | 2,817 | 691 | 112 | > > | Libya | 97,734 | | 6,274 | 440 | 34 | > > | Liechtenstein | 11,745 | | 3,509 | 104 | 37 | > > | Lithuania | 295,618 | | 78,354 | 5,758 | 1,749 | > > | Luxembourg | 205,050 | | 57,117 | 3,612 | 1,259 | > > | Macau | 48,581 | | 3,465 | 317 | 50 | > > | Madagascar | 128,806 | | 6,592 | 661 | 53 | > > | Malawi | 104,047 | | 10,973 | 389 | 58 | > > | Malaysia | 3,132,239 | | 253,264 | 56,353 | 7,867 | > > | Maldives | 71,036 | | 8,143 | 1,093 | 228 | > > | Mali | 98,648 | | 5,800 | 468 | 31 | > > | Malta | 144,944 | | 32,693 | 3,544 | 1,160 | > > | Marshall Islands | 6,085 | | 522 | 1,329 | 183 | > > | Martinique | 43,710 | | 3,650 | 249 | 37 | > > | Mauritania | 34,900 | | 1,307 | 237 | 12 | > > | Mauritius | 168,890 | | 24,566 | 3,185 | 640 | > > | Mayotte | 8,862 | | 550 | 17 | 1 | > > | Mexico | 8,467,357 | | 617,734 | 31,829 | 5,772 | > > | Micronesia, Fed. Sts. | 3,075 | | 149 | 24 | 4 | > > | Moldova | 96,060 | | 9,858 | 550 | 71 | > > | Monaco | 27,842 | | 5,476 | 370 | 91 | > > | Mongolia | 76,589 | | 6,624 | 279 | 43 | > > | Montenegro | 48,154 | | 5,264 | 278 | 42 | > > | Montserrat | 911 | | 26 | 32 | 5 | > > | Morocco | 1,519,727 | | 118,912 | 7,449 | 876 | > > | Mozambique | 209,655 | | 17,537 | 1,218 | 156 | > > | Myanmar | 224,614 | | 6,280 | 974 | 60 | > > | Namibia | 136,850 | | 14,060 | 2,455 | 434 | > > | Nauru | 890 | | 39 | 3 | 0 | > > | Nepal | 420,872 | | 31,659 | 2,144 | 211 | > > | Netherlands | 6,612,017 | | 1,830,963 | 354,321 | 129,223 | > > | New Caledonia | 31,990 | | 4,011 | 276 | 59 | > > | New Zealand | 1,356,985 | | 362,665 | 15,271 | 5,469 | > > | Nicaragua | 182,169 | | 11,864 | 888 | 111 | > > | Niger | 40,171 | | 1,410 | 170 | 13 | > > | Nigeria | 3,050,770 | | 208,587 | 54,128 | 5,184 | > > | Niue | 517 | | 16 | 2 | 0 | > > | Norfolk Island | 522 | | 22 | 8 | 0 | > > | North Korea | 2,055 | | 158 | 41 | 4 | > > | North Macedonia | 131,162 | | 20,674 | 589 | 95 | > > | Northern Mariana Islands | 4,751 | | 368 | 199 | 26 | > > | Norway | 1,349,446 | | 325,809 | 38,073 | 12,299 | > > | Oman | 376,492 | | 36,950 | 3,079 | 479 | > > | Pakistan | 3,879,849 | | 225,690 | 23,725 | 1,738 | > > | Palau | 2,189 | | 123 | 23 | 8 | > > | Palestine | 102,426 | | 10,511 | 2,114 | 622 | > > | Panama | 403,417 | | 46,664 | 6,923 | 1,345 | > > | Papua New Guinea | 148,707 | | 16,576 | 510 | 97 | > > | Paraguay | 274,870 | | 22,022 | 1,275 | 155 | > > | Peru | 2,767,903 | | 155,068 | 30,960 | 3,075 | > > | Philippines | 5,327,684 | | 501,756 | 27,796 | 4,257 | > > | Pitcairn | 298 | | 4 | 1 | 0 | > > | Poland | 2,739,961 | | 654,212 | 21,488 | 4,995 | > > | Portugal | 2,140,868 | | 345,467 | 83,256 | 20,728 | > > | Puerto Rico | 330,446 | | 37,835 | 13,887 | 3,087 | > > | Qatar | 678,331 | | 88,593 | 5,803 | 1,115 | > > | Reunion | 95,676 | | 9,320 | 663 | 95 | > > | Romania | 1,478,205 | | 232,460 | 7,577 | 1,336 | > > | Russia | 2,217,845 | | 46,841 | 18,361 | 1,273 | > > | Rwanda | 129,758 | | 12,730 | 716 | 106 | > > | Saint-Martin | 1,005 | | 135 | 26 | 6 | > > | Samoa | 5,606 | | 531 | 29 | 3 | > > | San Marino | 5,617 | | 731 | 50 | 13 | > > | Sao Tome and Principe | 2,734 | | 109 | 8 | 1 | > > | Saudi Arabia | 3,325,291 | | 381,182 | 25,019 | 4,449 | > > | Senegal | 332,223 | | 18,381 | 1,765 | 173 | > > | Serbia | 531,930 | | 102,689 | 2,512 | 491 | > > | Seychelles | 14,755 | | 1,321 | 111 | 18 | > > | Sierra Leone | 44,169 | | 2,789 | 407 | 50 | > > | Singapore | 2,036,996 | | 322,636 | 70,414 | 21,883 | > > | Sint Maarten | 2,696 | | 521 | 147 | 44 | > > | Slovakia | 318,836 | | 79,823 | 2,849 | 742 | > > | Slovenia | 193,171 | | 49,253 | 2,797 | 802 | > > | Solomon Islands | 7,534 | | 596 | 25 | 4 | > > | Somalia | 69,798 | | 3,308 | 295 | 20 | > > | South Africa | 5,484,013 | | 805,524 | 122,648 | 28,610 | > > | South Georgia and South Sandwich Is. | 390 | | 14 | 2 | 0 | > > | South Korea | 1,031,536 | | 74,994 | 8,606 | 1,500 | > > | South Sudan | 29,028 | | 2,137 | 204 | 32 | > > | Spain | 8,416,385 | | 815,674 | 56,798 | 9,523 | > > | Sri Lanka | 822,838 | | 88,514 | 3,438 | 397 | > > | St. Barths | 1,322 | | 174 | 47 | 6 | > > | St. Helena | 601 | | 52 | 3 | 0 | > > | St. Kitts and Nevis | 6,871 | | 661 | 337 | 42 | > > | St. Lucia | 19,934 | | 1,569 | 636 | 60 | > > | St. Pierre and Miquelon | 933 | | 42 | 2 | 0 | > > | St. Vincent and the Grenadines | 8,616 | | 518 | 213 | 17 | > > | Sudan | 121,780 | | 3,277 | 594 | 26 | > > | Suriname | 34,068 | | 4,184 | 328 | 60 | > > | Svalbard and Jan Mayen Islands | 551 | | 67 | 7 | 1 | > > | Sweden | 2,971,363 | | 935,813 | 35,669 | 15,835 | > > | Switzerland | 2,385,817 | | 696,552 | 43,610 | 15,155 | > > | Syria | 131,849 | | 3,928 | 675 | 31 | > > | Taiwan | 815,006 | | 84,861 | 5,281 | 1,221 | > > | Tajikistan | 20,082 | | 1,040 | 62 | 7 | > > | Tanzania | 357,877 | | 23,886 | 2,376 | 213 | > > | Thailand | 1,234,944 | | 126,205 | 7,364 | 1,200 | > > | Timor-Leste | 10,155 | | 648 | 156 | 18 | > > | Togo | 71,549 | | 2,700 | 432 | 24 | > > | Tokelau | 306 | | 6 | 1 | 0 | > > | Tonga | 4,205 | | 234 | 23 | 3 | > > | Trinidad and Tobago | 186,806 | | 22,628 | 6,425 | 1,163 | > > | Tunisia | 723,303 | | 50,358 | 3,493 | 297 | > > | Türkiye | 5,922,147 | | 603,915 | 19,611 | 1,561 | > > | Turkmenistan | 13,645 | | 865 | 47 | 10 | > > | Turks and Caicos Islands | 8,115 | | 921 | 277 | 48 | > > | Tuvalu | 811 | | 15 | 2 | 0 | > > | Uganda | 412,833 | | 30,556 | 2,337 | 215 | > > | Ukraine | 1,226,398 | | 115,589 | 7,681 | 1,097 | > > | United Arab Emirates | 4,399,762 | | 587,734 | 53,382 | 11,865 | > > | United Kingdom | 20,257,526 | | 5,104,191 | 852,665 | 328,475 | > > | United States | 111,885,857 | | 25,874,770 | 46,869,710 | 14,484,806 | > > | United States Minor Outlying Islands | 810 | | 93 | 124 | 28 | > > | United States Virgin Islands | 17,751 | | 1,680 | 1,450 | 290 | > > | Uruguay | 466,487 | | 47,387 | 6,555 | 1,145 | > > | Uzbekistan | 143,953 | | 6,459 | 573 | 48 | > > | Vanuatu | 6,437 | | 565 | 42 | 6 | > > | Vatican | 1,366 | | 49 | 39 | 5 | > > | Venezuela | 1,031,627 | | 32,477 | 4,162 | 322 | > > | Vietnam | 1,498,476 | | 63,279 | 25,816 | 2,099 | > > | Wallis and Futuna Islands | 923 | | 35 | 6 | 0 | > > | Western Sahara | 1,649 | | 165 | 7 | 1 | > > | Yemen | 83,651 | | 3,048 | 468 | 30 | > > | Zambia | 302,404 | | 27,947 | 1,328 | 192 | > > | Zimbabwe | 332,565 | | 30,234 | 1,182 | 128 | > > | Country not recorded | 2,747,192 | | 418,110 | 212,308 | 53,839 | > [tab] Companies > > | Headquarters country or territory | Companies | Share | > | - | -: | -: | > | \[Argentina, Falkland Islands] | 1 | | > | \[United Kingdom, Wallis and Futuna Islands] | 1 | | > | Afghanistan | 2,641 | | > | Aland Islands | 174 | | > | Åland Islands | 9 | | > | Albania | 5,839 | | > | Algeria | 13,216 | | > | American Samoa | 109 | | > | Andorra | 1,440 | | > | Angola | 6,915 | | > | Anguilla | 357 | | > | Antarctica | 15 | | > | Antigua and Barbuda | 324 | | > | Argentina | 137,523 | | > | Armenia | 7,097 | | > | Aruba | 702 | | > | Australia | 532,813 | | > | Austria | 70,127 | | > | Azerbaijan | 9,662 | | > | Bahamas | 1,824 | | > | Bahrain | 6,545 | | > | Bangladesh | 58,041 | | > | Barbados | 1,317 | | > | Belarus | 4,361 | | > | Belgium | 299,223 | | > | Belize | 856 | | > | Benin | 3,593 | | > | Bermuda | 1,072 | | > | Bhutan | 526 | | > | Bolivia | 7,679 | | > | Bonaire, Saint Eustatius and Saba | 214 | | > | Bosnia and Herzegovina | 5,877 | | > | Botswana | 3,043 | | > | Brazil | 1,258,978 | | > | British Indian Ocean Territory | 58 | | > | British Virgin Islands | 1,021 | | > | Brunei Darussalam | 834 | | > | Bulgaria | 21,672 | | > | Burkina Faso | 2,386 | | > | Burundi | 483 | | > | Cabo Verde | 554 | | > | Cambodia | 6,136 | | > | Cameroon | 10,831 | | > | Canada | 623,314 | | > | Cayman Islands | 1,942 | | > | Central African Republic | 152 | | > | Chad | 710 | | > | Chile | 103,615 | | > | China | 539,067 | | > | Christmas Island | 8 | | > | Cocos (Keeling) Islands | 10 | | > | Colombia | 123,452 | | > | Comoros | 171 | | > | Congo Republic | 1,716 | | > | Cook Islands | 117 | | > | Costa Rica | 14,493 | | > | Cote d'Ivoire | 11,043 | | > | Côte D'Ivoire | 791 | | > | Croatia | 17,850 | | > | Cuba | 1,372 | | > | Curacao | 1,273 | | > | Curaçao | 66 | | > | Cyprus | 13,884 | | > | Czech Republic | 52,916 | | > | Czechia | 5,253 | | > | Denmark | 82,256 | | > | Djibouti | 365 | | > | Dominica | 258 | | > | Dominican Republic | 11,699 | | > | Dr Congo | 6,525 | | > | Ecuador | 28,126 | | > | Egypt | 65,934 | | > | El Salvador | 5,840 | | > | Equatorial Guinea | 238 | | > | Eritrea | 32 | | > | Estonia | 15,190 | | > | Eswatini | 868 | | > | Ethiopia | 7,406 | | > | Faeroe Islands | 387 | | > | Falkland Islands | 37 | | > | Faroe Islands | 31 | | > | Fiji | 1,329 | | > | Finland | 50,106 | | > | France | 1,284,808 | | > | French Guiana | 2,117 | | > | French Polynesia | 798 | | > | French Southern Territories | 12 | | > | Gabon | 1,660 | | > | Gambia | 723 | | > | Georgia | 10,040 | | > | Germany | 767,065 | | > | Ghana | 21,036 | | > | Gibraltar | 1,077 | | > | Greece | 43,211 | | > | Greenland | 249 | | > | Grenada | 393 | | > | Guadeloupe | 3,898 | | > | Guam | 622 | | > | Guatemala | 11,483 | | > | Guernsey | 905 | | > | Guinea | 1,871 | | > | Guinea-Bissau | 110 | | > | Guyana | 856 | | > | Haiti | 1,392 | | > | Heard and McDonald Islands | 1 | | > | Honduras | 4,298 | | > | Hong Kong | 36,186 | | > | Hungary | 39,421 | | > | Iceland | 4,316 | | > | India | 1,608,973 | | > | Indonesia | 158,757 | | > | Iran | 48,113 | | > | Iraq | 7,572 | | > | Ireland | 64,080 | | > | Isle of Man | 1,422 | | > | Israel | 48,541 | | > | Italy | 474,522 | | > | Jamaica | 5,063 | | > | Japan | 89,749 | | > | Jersey | 1,712 | | > | Jordan | 13,794 | | > | Kazakhstan | 6,855 | | > | Kenya | 40,981 | | > | Kiribati | 39 | | > | Kosovo | 3,033 | | > | Kuwait | 8,553 | | > | Kyrgyz Republic | 1,007 | | > | Kyrgyzstan | 88 | | > | Laos | 651 | | > | Latvia | 10,386 | | > | Lebanon | 14,432 | | > | Lesotho | 676 | | > | Liberia | 1,139 | | > | Libya | 2,456 | | > | Liechtenstein | 1,377 | | > | Lithuania | 16,776 | | > | Luxembourg | 11,101 | | > | Macau | 633 | | > | Madagascar | 3,658 | | > | Malawi | 2,385 | | > | Malaysia | 73,355 | | > | Maldives | 2,546 | | > | Mali | 1,887 | | > | Malta | 7,083 | | > | Marshall Islands | 111 | | > | Martinique | 5,564 | | > | Mauritania | 821 | | > | Mauritius | 5,728 | | > | Mayotte | 822 | | > | Mexico | 294,537 | | > | Micronesia, Fed. Sts. | 34 | | > | Moldova | 3,121 | | > | Monaco | 2,299 | | > | Mongolia | 2,440 | | > | Montenegro | 2,367 | | > | Montserrat | 24 | | > | Morocco | 35,420 | | > | Mozambique | 4,891 | | > | Myanmar | 5,357 | | > | Namibia | 3,329 | | > | Nauru | 61 | | > | Nepal | 15,998 | | > | Netherlands | 483,403 | | > | New Caledonia | 1,244 | | > | New Zealand | 76,239 | | > | Nicaragua | 2,805 | | > | Niger | 797 | | > | Nigeria | 83,977 | | > | Niue | 22 | | > | Norfolk Island | 10 | | > | North Korea | 54 | | > | North Macedonia | 5,247 | | > | Northern Mariana Islands | 185 | | > | Norway | 96,024 | | > | Oman | 8,198 | | > | Pakistan | 108,181 | | > | Palau | 38 | | > | Palestine | 3,578 | | > | Panama | 11,569 | | > | Papua New Guinea | 1,967 | | > | Paraguay | 6,579 | | > | Peru | 75,556 | | > | Philippines | 55,982 | | > | Pitcairn | 2 | | > | Poland | 158,556 | | > | Portugal | 107,588 | | > | Puerto Rico | 9,083 | | > | Qatar | 12,756 | | > | Reunion | 4,410 | | > | Réunion | 236 | | > | Romania | 49,282 | | > | Russia | 36,220 | | > | Rwanda | 4,217 | | > | Saint-Martin | 59 | | > | Samoa | 144 | | > | San Marino | 613 | | > | Sao Tome and Principe | 73 | | > | Saudi Arabia | 61,523 | | > | Senegal | 9,355 | | > | Serbia | 19,927 | | > | Seychelles | 896 | | > | Sierra Leone | 1,215 | | > | Singapore | 73,367 | | > | Sint Maarten | 254 | | > | Slovakia | 16,907 | | > | Slovenia | 11,964 | | > | Solomon Islands | 117 | | > | Somalia | 1,806 | | > | South Africa | 280,967 | | > | South Georgia and South Sandwich Is. | 10 | | > | South Korea | 26,421 | | > | South Sudan | 677 | | > | Spain | 750,987 | | > | Sri Lanka | 26,003 | | > | St. Barths | 57 | | > | St. Helena | 24 | | > | St. Kitts and Nevis | 227 | | > | St. Lucia | 744 | | > | St. Pierre and Miquelon | 646 | | > | St. Vincent and the Grenadines | 359 | | > | Sudan | 2,477 | | > | Suriname | 1,362 | | > | Svalbard and Jan Mayen Islands | 73 | | > | Sweden | 139,562 | | > | Switzerland | 180,348 | | > | Syria | 2,411 | | > | Taiwan | 19,546 | | > | Tajikistan | 462 | | > | Tanzania | 9,467 | | > | Thailand | 29,178 | | > | Timor-Leste | 101 | | > | Togo | 2,443 | | > | Tokelau | 2 | | > | Tonga | 67 | | > | Trinidad and Tobago | 3,670 | | > | Tunisia | 16,672 | | > | Türkiye | 251,073 | | > | Turkmenistan | 382 | | > | Turks and Caicos Islands | 277 | | > | Tuvalu | 22 | | > | Uganda | 12,524 | | > | Ukraine | 34,384 | | > | United Arab Emirates | 160,968 | | > | United Kingdom | 1,960,529 | | > | United States | 8,003,010 | | > | United States Minor Outlying Islands | 16 | | > | United States Virgin Islands | 928 | | > | Uruguay | 13,674 | | > | Uzbekistan | 4,344 | | > | Vanuatu | 291 | | > | Vatican | 55 | | > | Venezuela | 15,365 | | > | Vietnam | 46,848 | | > | Wallis and Futuna Islands | 21 | | > | Western Sahara | 271 | | > | Yemen | 1,647 | | > | Zambia | 6,113 | | > | Zimbabwe | 9,034 | | > | All other recorded countries | 6,992,098 | | > | Headquarters country not recorded | 825,053 | | > > > [accordion] All recorded countries and territories > > > > | Headquarters country or territory | Companies | Share | > > | - | -: | -: | > > | \[Argentina, Falkland Islands] | 1 | | > > | \[United Kingdom, Wallis and Futuna Islands] | 1 | | > > | Afghanistan | 2,641 | | > > | Aland Islands | 174 | | > > | Åland Islands | 9 | | > > | Albania | 5,839 | | > > | Algeria | 13,216 | | > > | American Samoa | 109 | | > > | Andorra | 1,440 | | > > | Angola | 6,915 | | > > | Anguilla | 357 | | > > | Antarctica | 15 | | > > | Antigua and Barbuda | 324 | | > > | Argentina | 137,523 | | > > | Armenia | 7,097 | | > > | Aruba | 702 | | > > | Australia | 532,813 | | > > | Austria | 70,127 | | > > | Azerbaijan | 9,662 | | > > | Bahamas | 1,824 | | > > | Bahrain | 6,545 | | > > | Bangladesh | 58,041 | | > > | Barbados | 1,317 | | > > | Belarus | 4,361 | | > > | Belgium | 299,223 | | > > | Belize | 856 | | > > | Benin | 3,593 | | > > | Bermuda | 1,072 | | > > | Bhutan | 526 | | > > | Bolivia | 7,679 | | > > | Bonaire, Saint Eustatius and Saba | 214 | | > > | Bosnia and Herzegovina | 5,877 | | > > | Botswana | 3,043 | | > > | Brazil | 1,258,978 | | > > | British Indian Ocean Territory | 58 | | > > | British Virgin Islands | 1,021 | | > > | Brunei Darussalam | 834 | | > > | Bulgaria | 21,672 | | > > | Burkina Faso | 2,386 | | > > | Burundi | 483 | | > > | Cabo Verde | 554 | | > > | Cambodia | 6,136 | | > > | Cameroon | 10,831 | | > > | Canada | 623,314 | | > > | Cayman Islands | 1,942 | | > > | Central African Republic | 152 | | > > | Chad | 710 | | > > | Chile | 103,615 | | > > | China | 539,067 | | > > | Christmas Island | 8 | | > > | Cocos (Keeling) Islands | 10 | | > > | Colombia | 123,452 | | > > | Comoros | 171 | | > > | Congo Republic | 1,716 | | > > | Cook Islands | 117 | | > > | Costa Rica | 14,493 | | > > | Cote d'Ivoire | 11,043 | | > > | Côte D'Ivoire | 791 | | > > | Croatia | 17,850 | | > > | Cuba | 1,372 | | > > | Curacao | 1,273 | | > > | Curaçao | 66 | | > > | Cyprus | 13,884 | | > > | Czech Republic | 52,916 | | > > | Czechia | 5,253 | | > > | Denmark | 82,256 | | > > | Djibouti | 365 | | > > | Dominica | 258 | | > > | Dominican Republic | 11,699 | | > > | Dr Congo | 6,525 | | > > | Ecuador | 28,126 | | > > | Egypt | 65,934 | | > > | El Salvador | 5,840 | | > > | Equatorial Guinea | 238 | | > > | Eritrea | 32 | | > > | Estonia | 15,190 | | > > | Eswatini | 868 | | > > | Ethiopia | 7,406 | | > > | Faeroe Islands | 387 | | > > | Falkland Islands | 37 | | > > | Faroe Islands | 31 | | > > | Fiji | 1,329 | | > > | Finland | 50,106 | | > > | France | 1,284,808 | | > > | French Guiana | 2,117 | | > > | French Polynesia | 798 | | > > | French Southern Territories | 12 | | > > | Gabon | 1,660 | | > > | Gambia | 723 | | > > | Georgia | 10,040 | | > > | Germany | 767,065 | | > > | Ghana | 21,036 | | > > | Gibraltar | 1,077 | | > > | Greece | 43,211 | | > > | Greenland | 249 | | > > | Grenada | 393 | | > > | Guadeloupe | 3,898 | | > > | Guam | 622 | | > > | Guatemala | 11,483 | | > > | Guernsey | 905 | | > > | Guinea | 1,871 | | > > | Guinea-Bissau | 110 | | > > | Guyana | 856 | | > > | Haiti | 1,392 | | > > | Heard and McDonald Islands | 1 | | > > | Honduras | 4,298 | | > > | Hong Kong | 36,186 | | > > | Hungary | 39,421 | | > > | Iceland | 4,316 | | > > | India | 1,608,973 | | > > | Indonesia | 158,757 | | > > | Iran | 48,113 | | > > | Iraq | 7,572 | | > > | Ireland | 64,080 | | > > | Isle of Man | 1,422 | | > > | Israel | 48,541 | | > > | Italy | 474,522 | | > > | Jamaica | 5,063 | | > > | Japan | 89,749 | | > > | Jersey | 1,712 | | > > | Jordan | 13,794 | | > > | Kazakhstan | 6,855 | | > > | Kenya | 40,981 | | > > | Kiribati | 39 | | > > | Kosovo | 3,033 | | > > | Kuwait | 8,553 | | > > | Kyrgyz Republic | 1,007 | | > > | Kyrgyzstan | 88 | | > > | Laos | 651 | | > > | Latvia | 10,386 | | > > | Lebanon | 14,432 | | > > | Lesotho | 676 | | > > | Liberia | 1,139 | | > > | Libya | 2,456 | | > > | Liechtenstein | 1,377 | | > > | Lithuania | 16,776 | | > > | Luxembourg | 11,101 | | > > | Macau | 633 | | > > | Madagascar | 3,658 | | > > | Malawi | 2,385 | | > > | Malaysia | 73,355 | | > > | Maldives | 2,546 | | > > | Mali | 1,887 | | > > | Malta | 7,083 | | > > | Marshall Islands | 111 | | > > | Martinique | 5,564 | | > > | Mauritania | 821 | | > > | Mauritius | 5,728 | | > > | Mayotte | 822 | | > > | Mexico | 294,537 | | > > | Micronesia, Fed. Sts. | 34 | | > > | Moldova | 3,121 | | > > | Monaco | 2,299 | | > > | Mongolia | 2,440 | | > > | Montenegro | 2,367 | | > > | Montserrat | 24 | | > > | Morocco | 35,420 | | > > | Mozambique | 4,891 | | > > | Myanmar | 5,357 | | > > | Namibia | 3,329 | | > > | Nauru | 61 | | > > | Nepal | 15,998 | | > > | Netherlands | 483,403 | | > > | New Caledonia | 1,244 | | > > | New Zealand | 76,239 | | > > | Nicaragua | 2,805 | | > > | Niger | 797 | | > > | Nigeria | 83,977 | | > > | Niue | 22 | | > > | Norfolk Island | 10 | | > > | North Korea | 54 | | > > | North Macedonia | 5,247 | | > > | Northern Mariana Islands | 185 | | > > | Norway | 96,024 | | > > | Oman | 8,198 | | > > | Pakistan | 108,181 | | > > | Palau | 38 | | > > | Palestine | 3,578 | | > > | Panama | 11,569 | | > > | Papua New Guinea | 1,967 | | > > | Paraguay | 6,579 | | > > | Peru | 75,556 | | > > | Philippines | 55,982 | | > > | Pitcairn | 2 | | > > | Poland | 158,556 | | > > | Portugal | 107,588 | | > > | Puerto Rico | 9,083 | | > > | Qatar | 12,756 | | > > | Reunion | 4,410 | | > > | Réunion | 236 | | > > | Romania | 49,282 | | > > | Russia | 36,220 | | > > | Rwanda | 4,217 | | > > | Saint-Martin | 59 | | > > | Samoa | 144 | | > > | San Marino | 613 | | > > | Sao Tome and Principe | 73 | | > > | Saudi Arabia | 61,523 | | > > | Senegal | 9,355 | | > > | Serbia | 19,927 | | > > | Seychelles | 896 | | > > | Sierra Leone | 1,215 | | > > | Singapore | 73,367 | | > > | Sint Maarten | 254 | | > > | Slovakia | 16,907 | | > > | Slovenia | 11,964 | | > > | Solomon Islands | 117 | | > > | Somalia | 1,806 | | > > | South Africa | 280,967 | | > > | South Georgia and South Sandwich Is. | 10 | | > > | South Korea | 26,421 | | > > | South Sudan | 677 | | > > | Spain | 750,987 | | > > | Sri Lanka | 26,003 | | > > | St. Barths | 57 | | > > | St. Helena | 24 | | > > | St. Kitts and Nevis | 227 | | > > | St. Lucia | 744 | | > > | St. Pierre and Miquelon | 646 | | > > | St. Vincent and the Grenadines | 359 | | > > | Sudan | 2,477 | | > > | Suriname | 1,362 | | > > | Svalbard and Jan Mayen Islands | 73 | | > > | Sweden | 139,562 | | > > | Switzerland | 180,348 | | > > | Syria | 2,411 | | > > | Taiwan | 19,546 | | > > | Tajikistan | 462 | | > > | Tanzania | 9,467 | | > > | Thailand | 29,178 | | > > | Timor-Leste | 101 | | > > | Togo | 2,443 | | > > | Tokelau | 2 | | > > | Tonga | 67 | | > > | Trinidad and Tobago | 3,670 | | > > | Tunisia | 16,672 | | > > | Türkiye | 251,073 | | > > | Turkmenistan | 382 | | > > | Turks and Caicos Islands | 277 | | > > | Tuvalu | 22 | | > > | Uganda | 12,524 | | > > | Ukraine | 34,384 | | > > | United Arab Emirates | 160,968 | | > > | United Kingdom | 1,960,529 | | > > | United States | 8,003,010 | | > > | United States Minor Outlying Islands | 16 | | > > | United States Virgin Islands | 928 | | > > | Uruguay | 13,674 | | > > | Uzbekistan | 4,344 | | > > | Vanuatu | 291 | | > > | Vatican | 55 | | > > | Venezuela | 15,365 | | > > | Vietnam | 46,848 | | > > | Wallis and Futuna Islands | 21 | | > > | Western Sahara | 271 | | > > | Yemen | 1,647 | | > > | Zambia | 6,113 | | > > | Zimbabwe | 9,034 | | > > | Headquarters country not recorded | 825,053 | | ## Field fill rates **Fill rate = rows with a non-null value / all rows in that API dataset.** These tables include every field returned by the contact and company column catalogs. Counts are measured across the full dataset, rather than a sample. > [!NOTE] > > **A value being present does not mean it is positive or non-empty.** The API > counts non-null values. An empty list, an empty string, `false`, or `0` can count > as populated. For example, a populated `HAS_EMAIL_PER` flag can be `false`; > use `EMAIL_ADDRESS_PER` to measure email address availability. Person and job fields count contact rows. Company and Insights fields can be measured on contact rows or on unique company rows, so their percentages can differ between tabs. The tables use the API field names from the pre-joined dictionary. Unsuffixed base-table names, such as `EMAIL_ADDRESS`, correspond to suffixed API names, such as `EMAIL_ADDRESS_PER`, where available. > [tab] Contact fields > > Denominator: ** contacts**. These 173 fields match the [enhanced table dictionary](/docs/data-features/data-dictionary#velocity_enhanced_unlimited_latest). > > ### Person and job fields > > | Field | Records with a non-null value | Fill rate | > | - | -: | -: | > | `ABOUT_ME_PER` | | | > | `CELLPHONE_PER` | | | > | `CERTIFICATIONS_PER` | | | > | `CITY_PER` | | | > | `CONTINENT_PER` | | | > | `COUNTRY_CODE_PER` | | | > | `COUNTRY_NAME_PER` | | | > | `COUNTRY_REGION_PER` | | | > | `DIRECT_PHONE_PER` | | | > | `EDUCATION_PER` | | | > | `EMAIL_ADDRESS_PER` | | | > | `EMAIL_DOMAIN_PER` | | | > | `EMAIL_LAST_VERIFIED_AT_PER` | | | > | `EMAIL_STATUS_PER` | | | > | `FIRST_NAME_PER` | | | > | `FULL_NAME_PER` | | | > | `HAS_CELLPHONE_PER` | | | > | `HAS_EMAIL_PER` | | | > | `HAS_PHONE_PER` | | | > | `INTERESTS_PER` | | | > | `JOB_COUNT_PER` | | | > | `JOB_DESCRIPTION_PER` | | | > | `JOB_FUNCTION_PER` | | | > | `JOB_IS_CURRENT_PER` | | | > | `JOB_LEVEL_PER` | | | > | `JOB_LOCATION_CITY_PER` | | | > | `JOB_LOCATION_CONTINENT_PER` | | | > | `JOB_LOCATION_COUNTRY_CODE_PER` | | | > | `JOB_LOCATION_COUNTRY_PER` | | | > | `JOB_LOCATION_COUNTRY_REGION_PER` | | | > | `JOB_LOCATION_STATE_PER` | | | > | `JOB_START_DATE_PER` | | | > | `JOB_TITLE_PER` | | | > | `LANGUAGES_PER` | | | > | `LAST_NAME_PER` | | | > | `LINKEDIN_CONNECTIONS_COUNT_PER` | | | > | `LINKEDIN_HEADLINE_PER` | | | > | `LINKEDIN_INDUSTRY_PER` | | | > | `LINKEDIN_URL_PER` | | | > | `LOCATION_COUNTRY_CODE_PER` | | | > | `LOCATION_COUNTRY_NAME_PER` | | | > | `LOCATION_COUNTRY_REGION_PER` | | | > | `LOCATION_POSTCODE_PER` | | | > | `LOCATION_STATE_CODE_PER` | | | > | `LOCATION_STATE_NAME_PER` | | | > | `LOCATION_STREET_PER` | | | > | `LOGO_URL` | | | > | `MIDDLE_NAME_PER` | | | > | `PATENTS_PER` | | | > | `PERSONA_PER` | | | > | `PUBLICATIONS_PER` | | | > | `RBID_PAO` | | | > | `RBID_PER` | | | > | `REVENUEBASE_CONTACT_VERIFICATION_SUMMARY` | | | > | `SKILLS_PER` | | | > | `STATE_CODE_PER` | | | > | `STATE_NAME_PER` | | | > | `SUFFIX_NAME_PER` | | | > | `TITLE_NAME_PER` | | | > | `UPDATED_AT_PER` | | | > | `WEBSITES_PER` | | | > > > [accordion] Company and Insights fields on contact rows > > > > A company value is counted once for every contact row carrying that value. For coverage per unique company, open the **Company fields** tab. > > > > | Field | Records with a non-null value | Fill rate | > > | - | -: | -: | > > | `ABM_TECH_ORG` | | | > > | `ABOUT_US_ORG` | | | > > | `ACCOUNT_EXECUTIVE_OPEN_ROLES_COUNT_ORG` | | | > > | `ANALYTICS_TECH_ORG` | | | > > | `ANDROID_DEV_ROLE_COUNT_ORG` | | | > > | `APPLICATION_SECURITY_TECH_ORG` | | | > > | `APPSTORE_APP_CATEGORY_ORG` | | | > > | `APPSTORE_UPDATE_COUNT_ORG` | | | > > | `BUSINESS_DEVELOPMENT_OPEN_ROLES_COUNT_ORG` | | | > > | `BUSINESS_DEVELOPMENT_ROLE_COUNT_ORG` | | | > > | `CITY_ORG` | | | > > | `CLOUD_PROVIDER_TECH_ORG` | | | > > | `CLOUD_SECURITY_TECH_ORG` | | | > > | `CMS_TECH_ORG` | | | > > | `COMPANY_ENTITY_TYPE` | | | > > | `COMPANY_HEADLINE` | | | > > | `COMPANY_LEGAL_TYPE` | | | > > | `COMPANY_NAME_LANGUAGE` | | | > > | `COMPANY_NAME_ORG` | | | > > | `CONVERSATION_INTELLIGENCE_TECH_ORG` | | | > > | `COUNTRY_CODE_ORG` | | | > > | `COUNTRY_NAME_ORG` | | | > > | `COUNTRY_REGION_ORG` | | | > > | `CRM_TECH_ORG` | | | > > | `CUSTOMER_SUCCESS_OPEN_ROLES_COUNT_ORG` | | | > > | `CUSTOMER_SUCCESS_ROLE_COUNT_ORG` | | | > > | `DEMAND_GENERATION_OPEN_ROLES_COUNT_ORG` | | | > > | `DEVELOPMENT_TECH_ORG` | | | > > | `DEVOPS_OPEN_ROLES_COUNT_ORG` | | | > > | `DEVOPS_ROLE_COUNT_ORG` | | | > > | `DOMAIN_ORG` | | | > > | `E_COMMERCE_PLATFORM_TECH_ORG` | | | > > | `EMAIL_HOSTING_TECH_ORG` | | | > > | `EMAIL_SECURITY_TECH_ORG` | | | > > | `EMPLOYEE_COUNT_MAX` | | | > > | `EMPLOYEE_COUNT_MIN` | | | > > | `EMPLOYEE_COUNT_RANGE_ORG` | | | > > | `EMPLOYEE_ON_LINKEDIN_GROWTH_RATE_ORG` | | | > > | `EMPLOYEE_PROFILES_ON_LINKEDIN_ORG` | | | > > | `ENGINEER_ROLE_COUNT_ORG` | | | > > | `ERP_TECH_ORG` | | | > > | `FOUNDED_ORG` | | | > > | `FUNDING_ROUND_NUMBER_OF_INVESTORS_ORG` | | | > > | `GRC_OPEN_ROLES_COUNT_ORG` | | | > > | `GRC_ROLE_COUNT_ORG` | | | > > | `HAS_CIO_ORG` | | | > > | `HAS_CISO_ORG` | | | > > | `HAS_MOBILE_APP_ORG` | | | > > | `HAS_WEB_APP_ORG` | | | > > | `HEADQUARTERS_CITY_ORG` | | | > > | `HEADQUARTERS_COUNTRY_NAME_ORG` | | | > > | `HEADQUARTERS_STATE_NAME_ORG` | | | > > | `INDUSTRY_LINKEDIN_ORG` | | | > > | `INDUSTRY_NAICS_CODE_ORG` | | | > > | `INDUSTRY_NAICS_DESCRIPTION_ORG` | | | > > | `INDUSTRY_SIC_CODE_ORG` | | | > > | `INDUSTRY_SIC_DESCRIPTION_ORG` | | | > > | `IOS_DEV_ROLE_COUNT_ORG` | | | > > | `IS_LINKEDIN_URL_CLAIMED_ORG` | | | > > | `IS_WEBSITE_FOR_SALE_ORG` | | | > > | `IT_OPEN_ROLES_COUNT_ORG` | | | > > | `IT_ROLE_COUNT_ORG` | | | > > | `LAST_APPSTORE_UPDATE_ORG` | | | > > | `LAST_FUNDING_AMOUNT_ORG` | | | > > | `LAST_FUNDING_DATE_ORG` | | | > > | `LAST_FUNDING_TYPE_ORG` | | | > > | `LAST_PLAYSTORE_UPDATE_ORG` | | | > > | `LEAD_INVESTORS_ORG` | | | > > | `LINKEDIN_URL_ORG` | | | > > | `LOCATION_CONTINENT_ORG` | | | > > | `LOCATION_COUNT_ORG` | | | > > | `LOGO_URL_ORG` | | | > > | `MARKETING_AUTOMATION_TECH_ORG` | | | > > | `MARKETING_OPEN_ROLES_COUNT_ORG` | | | > > | `MARKETING_ROLE_COUNT_ORG` | | | > > | `MARTECH_CATEGORIES_ORG` | | | > > | `MOBILE_DEV_ROLE_COUNT_ORG` | | | > > | `MONTHLY_GOOGLE_ADSPEND_ORG` | | | > > | `MONTHLY_ORGANIC_TRAFFIC_ORG` | | | > > | `MONTHLY_PAID_TRAFFIC_ORG` | | | > > | `NETWORK_INFRASTRUCTURE_OPEN_ROLES_COUNT_ORG` | | | > > | `NETWORK_INFRASTRUCTURE_ROLE_COUNT_ORG` | | | > > | `OPERATIONS_OPEN_ROLES_COUNT_ORG` | | | > > | `OPERATIONS_ROLE_COUNT_ORG` | | | > > | `PHONE_ORG` | | | > > | `PLAYSTORE_APP_CATEGORY_ORG` | | | > > | `PLAYSTORE_DOWNLOAD_COUNT_ORG` | | | > > | `POSTCODE_ORG` | | | > > | `QA_ROLE_COUNT_ORG` | | | > > | `RBID_ORG` | | | > > | `REVENUE_MAX` | | | > > | `REVENUE_MIN` | | | > > | `REVENUE_RANGE_ORG` | | | > > | `SALES_AUTOMATION_TECH_ORG` | | | > > | `SALES_OPEN_ROLES_COUNT_ORG` | | | > > | `SALES_ROLE_COUNT_ORG` | | | > > | `SECURITY_OPEN_ROLES_COUNT_ORG` | | | > > | `SECURITY_ROLE_COUNT_ORG` | | | > > | `SPECIALTIES_ORG` | | | > > | `STATE_CODE_ORG` | | | > > | `STATE_NAME_ORG` | | | > > | `STREET_ORG` | | | > > | `TOP_APPLEAPPSTORE_URL_ORG` | | | > > | `TOP_APPSTORE_RATING_ORG` | | | > > | `TOP_APPSTORE_REVIEW_COUNT_ORG` | | | > > | `TOP_PLAYSTORE_RATING_ORG` | | | > > | `TOP_PLAYSTORE_REVIEW_COUNT_ORG` | | | > > | `TOP_PLAYSTORE_URL_ORG` | | | > > | `TOTAL_FUNDING_AMOUNT_ORG` | | | > > | `TOTAL_MONTHLY_TRAFFIC_ORG` | | | > > | `TOTAL_REVIEWS_ORG` | | | > > | `WEBSITE_ORG` | | | > [tab] Company fields > > Denominator: ** companies**, one per `RBID_ORG`. These 114 fields include company attributes, Insights enrichments, and the three company contact-count fields. > > | Field | Records with a non-null value | Fill rate | > | - | -: | -: | > | `ABM_TECH_ORG` | | | > | `ABOUT_US_ORG` | | | > | `ACCOUNT_EXECUTIVE_OPEN_ROLES_COUNT_ORG` | | | > | `ANALYTICS_TECH_ORG` | | | > | `ANDROID_DEV_ROLE_COUNT_ORG` | | | > | `APPLICATION_SECURITY_TECH_ORG` | | | > | `APPSTORE_APP_CATEGORY_ORG` | | | > | `APPSTORE_UPDATE_COUNT_ORG` | | | > | `BUSINESS_DEVELOPMENT_OPEN_ROLES_COUNT_ORG` | | | > | `BUSINESS_DEVELOPMENT_ROLE_COUNT_ORG` | | | > | `CITY_ORG` | | | > | `CLOUD_PROVIDER_TECH_ORG` | | | > | `CLOUD_SECURITY_TECH_ORG` | | | > | `CMS_TECH_ORG` | | | > | `COMPANY_ENTITY_TYPE` | | | > | `COMPANY_LEGAL_TYPE` | | | > | `COMPANY_NAME_LANGUAGE` | | | > | `COMPANY_NAME_ORG` | | | > | `CONTACT_COUNT` | | | > | `CONTACTS_WITH_CELLPHONE` | | | > | `CONTACTS_WITH_EMAIL` | | | > | `CONVERSATION_INTELLIGENCE_TECH_ORG` | | | > | `COUNTRY_CODE_ORG` | | | > | `COUNTRY_NAME_ORG` | | | > | `COUNTRY_REGION_ORG` | | | > | `CRM_TECH_ORG` | | | > | `CUSTOMER_SUCCESS_OPEN_ROLES_COUNT_ORG` | | | > | `CUSTOMER_SUCCESS_ROLE_COUNT_ORG` | | | > | `DEMAND_GENERATION_OPEN_ROLES_COUNT_ORG` | | | > | `DEVELOPMENT_TECH_ORG` | | | > | `DEVOPS_OPEN_ROLES_COUNT_ORG` | | | > | `DEVOPS_ROLE_COUNT_ORG` | | | > | `DOMAIN_ORG` | | | > | `E_COMMERCE_PLATFORM_TECH_ORG` | | | > | `EMAIL_HOSTING_TECH_ORG` | | | > | `EMAIL_SECURITY_TECH_ORG` | | | > | `EMPLOYEE_COUNT_MAX` | | | > | `EMPLOYEE_COUNT_MIN` | | | > | `EMPLOYEE_COUNT_RANGE_ORG` | | | > | `EMPLOYEE_ON_LINKEDIN_GROWTH_RATE_ORG` | | | > | `EMPLOYEE_PROFILES_ON_LINKEDIN_ORG` | | | > | `ENGINEER_ROLE_COUNT_ORG` | | | > | `ERP_TECH_ORG` | | | > | `FOUNDED_ORG` | | | > | `FUNDING_ROUND_NUMBER_OF_INVESTORS_ORG` | | | > | `GRC_OPEN_ROLES_COUNT_ORG` | | | > | `GRC_ROLE_COUNT_ORG` | | | > | `HAS_CIO_ORG` | | | > | `HAS_CISO_ORG` | | | > | `HAS_MOBILE_APP_ORG` | | | > | `HAS_WEB_APP_ORG` | | | > | `HEADQUARTERS_CITY_ORG` | | | > | `HEADQUARTERS_COUNTRY_NAME_ORG` | | | > | `HEADQUARTERS_STATE_NAME_ORG` | | | > | `INDUSTRY_LINKEDIN_ORG` | | | > | `INDUSTRY_NAICS_CODE_ORG` | | | > | `INDUSTRY_NAICS_DESCRIPTION_ORG` | | | > | `INDUSTRY_SIC_CODE_ORG` | | | > | `INDUSTRY_SIC_DESCRIPTION_ORG` | | | > | `IOS_DEV_ROLE_COUNT_ORG` | | | > | `IS_LINKEDIN_URL_CLAIMED_ORG` | | | > | `IS_WEBSITE_FOR_SALE_ORG` | | | > | `IT_OPEN_ROLES_COUNT_ORG` | | | > | `IT_ROLE_COUNT_ORG` | | | > | `LAST_APPSTORE_UPDATE_ORG` | | | > | `LAST_FUNDING_AMOUNT_ORG` | | | > | `LAST_FUNDING_DATE_ORG` | | | > | `LAST_FUNDING_TYPE_ORG` | | | > | `LAST_PLAYSTORE_UPDATE_ORG` | | | > | `LEAD_INVESTORS_ORG` | | | > | `LINKEDIN_URL_ORG` | | | > | `LOCATION_CONTINENT_ORG` | | | > | `LOCATION_COUNT_ORG` | | | > | `LOGO_URL_ORG` | | | > | `MARKETING_AUTOMATION_TECH_ORG` | | | > | `MARKETING_OPEN_ROLES_COUNT_ORG` | | | > | `MARKETING_ROLE_COUNT_ORG` | | | > | `MARTECH_CATEGORIES_ORG` | | | > | `MOBILE_DEV_ROLE_COUNT_ORG` | | | > | `MONTHLY_GOOGLE_ADSPEND_ORG` | | | > | `MONTHLY_ORGANIC_TRAFFIC_ORG` | | | > | `MONTHLY_PAID_TRAFFIC_ORG` | | | > | `NETWORK_INFRASTRUCTURE_OPEN_ROLES_COUNT_ORG` | | | > | `NETWORK_INFRASTRUCTURE_ROLE_COUNT_ORG` | | | > | `OPERATIONS_OPEN_ROLES_COUNT_ORG` | | | > | `OPERATIONS_ROLE_COUNT_ORG` | | | > | `PHONE_ORG` | | | > | `PLAYSTORE_APP_CATEGORY_ORG` | | | > | `PLAYSTORE_DOWNLOAD_COUNT_ORG` | | | > | `POSTCODE_ORG` | | | > | `QA_ROLE_COUNT_ORG` | | | > | `RBID_ORG` | | | > | `REVENUE_MAX` | | | > | `REVENUE_MIN` | | | > | `REVENUE_RANGE_ORG` | | | > | `SALES_AUTOMATION_TECH_ORG` | | | > | `SALES_OPEN_ROLES_COUNT_ORG` | | | > | `SALES_ROLE_COUNT_ORG` | | | > | `SECURITY_OPEN_ROLES_COUNT_ORG` | | | > | `SECURITY_ROLE_COUNT_ORG` | | | > | `SPECIALTIES_ORG` | | | > | `STATE_CODE_ORG` | | | > | `STATE_NAME_ORG` | | | > | `STREET_ORG` | | | > | `TOP_APPLEAPPSTORE_URL_ORG` | | | > | `TOP_APPSTORE_RATING_ORG` | | | > | `TOP_APPSTORE_REVIEW_COUNT_ORG` | | | > | `TOP_PLAYSTORE_RATING_ORG` | | | > | `TOP_PLAYSTORE_REVIEW_COUNT_ORG` | | | > | `TOP_PLAYSTORE_URL_ORG` | | | > | `TOTAL_FUNDING_AMOUNT_ORG` | | | > | `TOTAL_MONTHLY_TRAFFIC_ORG` | | | > | `TOTAL_REVIEWS_ORG` | | | > | `WEBSITE_ORG` | | | ## Freshness Email freshness measures the age of `EMAIL_LAST_VERIFIED_AT_PER`. Profile freshness measures the age of `UPDATED_AT_PER`. **Contacts with a timestamp** is the number with a recorded verification date. **Verified within the window** shows how many of those contacts were checked within 60 days for email or 90 days for profiles. The percentage divides that recent count by the number with a timestamp. It does not describe the percentage with a timestamp. These figures update for the selected countries. A single country and Worldwide show the API's measured median age. A group shows an age range containing its median, calculated from the combined histogram. Country medians are not averaged. Expand the table to see missing timestamps and age bands. | Verification timestamp | Contacts with a timestamp | Verification window | Verified within the window | Verified within window (% of timestamped contacts) | Median age or range | | - | -: | -: | -: | -: | -: | | Email last verified | | 60 days | | | | | Profile last verified | | 90 days | | | | > [accordion] Timestamp age breakdown > > | Timestamp age | Email verification timestamps | Profile verification timestamps | > | - | -: | -: | > | 0 to 30 days | | | > | 31 to 60 days | | | > | 61 to 90 days | | | > | 91 to 180 days | | | > | 181 to 365 days | | | > | More than 365 days | | | > | Future dates | | | > | Timestamp not recorded | | | > [!NOTE] > > **These timestamps record when RevenueBase last verified the information.** > `UPDATED_AT_PER` records when we checked core profile information against > publicly available sources and confirmed it was accurate at that time. The > information may have changed on that date, or we may have confirmed it without > making any changes. > > `EMAIL_LAST_VERIFIED_AT_PER` records when we last checked email deliverability. > The 60-day email and 90-day profile windows show how recently those checks > occurred in this snapshot. > > See [Verification Summaries](/docs/data-features/data-freshness/verification-summaries#how-to-read-it) > for a record's verification dates and sources, > [How verification works](/docs/data-features/data-freshness/data-freshness#how-verification-works) > for the checking process, and > [Recommended quality filters](/docs/data-features/data-freshness/data-freshness#recommended-quality-filters) > for using verification recency in your audience criteria. **Company record freshness is not available from the current Company API.** It does not expose an organization update timestamp or a company freshness section. Funding dates and app update dates describe those events; they do not measure when the company record was last refreshed. ## Check coverage for your audience Your audience can have different coverage from the full dataset. Use [Contact Insights](/api-reference/insights) with your filters for reachability, freshness, country coverage, or field fill rates. Use [Company Insights](/api-reference/company-insights) for company coverage and field fill rates. Each fill-rate request accepts up to 12 recognized fields. | What you want to measure | Endpoint | Credits | | - | - | -: | | All contact and distinct company totals | [Contact Stats](/api-reference/stats) | 0 | | All company totals and key-field availability | [Company Stats](/api-reference/company-stats) | 0 | | Contact reachability, timestamps, countries, or field fill rates | [Contact Insights](/api-reference/insights) | 0 | | Company countries or field fill rates | [Company Insights](/api-reference/company-insights) | 0 | | Available field names | [Contact Columns](/api-reference/columns) or [Company Columns](/api-reference/company-columns) | 0 | | Recorded country values for a filter | [Contact Column Values](/api-reference/column-values) or [Company Column Values](/api-reference/company-column-values) | 0 | All statistics on this page use free aggregate calls. They return counts and field metadata, without downloading individual contact or company records. The last-checked time stays visible so you can tell how recent the snapshot is. # Data Dictionary Source: https://docs.revenuebase.ai/docs/data-features/data-dictionary A complete field-level reference for every column in RevenueBase. Covers the PER_LATEST, ORG_LATEST, INSIGHTS_LATEST, VELOCITY_BASE_UNLIMITED_LATEST, and VELOCITY_ENHANCED_UNLIMITED_LATEST tables. > [tab] PER\_LATEST > > The `PER_LATEST` table contains one row per person. All fields appear without a table suffix. > > | Gigasheet label | Field | Description | Type | > | - | - | - | - | > | About Me | `ABOUT_ME` | LinkedIn personal profile about me field | Text | > | Cellphone | `CELLPHONE` | Mobile phone number | Text | > | Certifications | `CERTIFICATIONS` | LinkedIn personal profile certifications | Variant | > | Person City | `CITY` | The city where the person lives | Text | > | Company Name | `COMPANY_NAME` | Name of the person's current employer | Text | > | Person Continent | `CONTINENT` | The continent that the person is located in | Text | > | Person Country Code | `COUNTRY_CODE` | The code for the country the person is located in | Text | > | Person Country | `COUNTRY_NAME` | The name of the country the person is located in | Text | > | Person Region | `COUNTRY_REGION` | The global region that the person is located in | Text | > | Direct Phone | `DIRECT_PHONE` | The direct office contact number | Text | > | Education | `EDUCATION` | The person's education history | Variant | > | Email Address | `EMAIL_ADDRESS` | The person's work email address | Text | > | Email Domain | `EMAIL_DOMAIN` | The domain of the person's work email address | Text | > | Email Last Verified At | `EMAIL_LAST_VERIFIED_AT` | The contact's email last verified timestamp | Timestamp | > | Email Status | `EMAIL_STATUS` | The verification status of the email | Text | > | First Name | `FIRST_NAME` | The person's first name | Text | > | Person Full Name | `FULL_NAME` | The person's full name | Text | > | Interests | `INTERESTS` | LinkedIn personal profile interests field | Variant | > | Job Count | `JOB_COUNT` | The number of jobs a person has had | Number | > | Job Description | `JOB_DESCRIPTION` | The description of the person's current job | Text | > | Job End Date | `JOB_END_DATE` | When the person ended their most recent job | Date | > | Job Function | `JOB_FUNCTION` | The department that the person works in | Text | > | Job is Current | `JOB_IS_CURRENT` | Indicates whether the job is currently active | Boolean | > | Job Level | `JOB_LEVEL` | The seniority level of the person's job | Text | > | Job Location City | `JOB_LOCATION_CITY` | The city where the person works | Text | > | Job Location Continent | `JOB_LOCATION_CONTINENT` | The continent where the person works | Text | > | Job Location Country | `JOB_LOCATION_COUNTRY` | The country name where the person works | Text | > | Job Location Country Code | `JOB_LOCATION_COUNTRY_CODE` | The country code where the person works | Text | > | Job Location Region | `JOB_LOCATION_COUNTRY_REGION` | The geographic region that a contact works in | Text | > | Job Location State | `JOB_LOCATION_STATE` | State or province where the person works | Text | > | Job Location State Code | `JOB_LOCATION_STATE_CODE` | State/province code where the person works | Text | > | — | `JOB_ORDER_IN_PROFILE` | Position of this job in the person's LinkedIn profile | Number | > | LinkedIn URL Organization | `JOB_ORG_LINKEDIN_URL` | The company's LinkedIn URL associated with the person's job | Text | > | Person Job Start Date | `JOB_START_DATE` | When the person began their current job | Date | > | Job Title | `JOB_TITLE` | The person's current job title | Text | > | Languages | `LANGUAGES` | The languages spoken | Variant | > | Last Name | `LAST_NAME` | The person's last name | Text | > | LinkedIn Connections | `LINKEDIN_CONNECTIONS_COUNT` | Number of LinkedIn connections the person has | Number | > | LinkedIn Headline | `LINKEDIN_HEADLINE` | The person's LinkedIn headline | Text | > | LinkedIn Person Industry | `LINKEDIN_INDUSTRY` | The LinkedIn industry associated with the person's employer | Text | > | — | `LINKEDIN_NUM_ID` | LinkedIn's numeric identifier for the person | Text | > | LinkedIn URL Person | `LINKEDIN_URL` | The person's LinkedIn profile URL | Text | > | — | `LOGO_URL` | The person's LinkedIn profile picture URL | Text | > | Middle Name | `MIDDLE_NAME` | The person's middle name | Text | > | — | `NICKNAME_NAME` | The person's nickname | Text | > | Patents | `PATENTS` | Any patents listed on someone's LinkedIn profile | Variant | > | Persona | `PERSONA` | Classification of person job type by several business areas | Text | > | Publications | `PUBLICATIONS` | Any publications listed on someone's LinkedIn profile | Variant | > | Rbid Person | `RBID` | RevenueBase's unique identifier for the person. Stays the same if the person changes jobs. | Text | > | Rbid Organization | `RBID_ORG` | RevenueBase's unique identifier for the person's current employer | Text | > | Rbid Person And Organization | `RBID_PAO` | RevenueBase's unique identifier for the person at a specific organization | Text | > | RevenueBase Contact Verification Summary | `REVENUEBASE_CONTACT_VERIFICATION_SUMMARY` | Verification summary showing when and how a record was verified | Text | > | Skills | `SKILLS` | The person's job skills | Variant | > | Person State Code | `STATE_CODE` | The abbreviation of the state/province/region the person is located in | Text | > | Person State | `STATE_NAME` | The state/province/region the person is located in | Text | > | Suffix | `SUFFIX_NAME` | The person's name suffix | Text | > | Prefix | `TITLE_NAME` | The person's name prefix | Text | > | Person Updated At | `UPDATED_AT` | The contact's last update timestamp. Any field update triggers a change in this value. | Timestamp | > | Personal Websites | `WEBSITES` | The contact's personal websites | Variant | > [tab] ORG\_LATEST > > The `ORG_LATEST` table contains one row per organization. All fields appear without a table suffix. > > | Gigasheet label | Field | Description | Type | > | - | - | - | - | > | LinkedIn About Us | `ABOUT_US` | Description of the organization from LinkedIn | Text | > | Crunchbase Categories | `CATEGORY_CRUNCHBASE` | Organization industry categories from Crunchbase | Variant | > | G2 Categories | `CATEGORY_G2` | Organization software categories from G2 | Variant | > | Company Entity Type | `COMPANY_ENTITY_TYPE` | Legal entity type of the company | Text | > | Company LinkedIn Headline | `COMPANY_HEADLINE` | Company LinkedIn page headline | Text | > | Company Legal Type | `COMPANY_LEGAL_TYPE` | Legal type of the company | Variant | > | Company Name | `COMPANY_NAME` | Name of the company | Text | > | Company Name Language | `COMPANY_NAME_LANGUAGE` | The language the company name is written in | Text | > | Organization Domain | `DOMAIN` | Domain of the organization's website | Text | > | Domain TLD | `DOMAIN_TLD` | Top-level domain of the organization's website | Text | > | Employee Count Max | `EMPLOYEE_COUNT_MAX` | Maximum number of employees | Number | > | Employee Count Min | `EMPLOYEE_COUNT_MIN` | Minimum number of employees | Number | > | Employee Count Range | `EMPLOYEE_COUNT_RANGE` | Range of employee count | Text | > | Employee Profiles on LinkedIn | `EMPLOYEE_PROFILES_ON_LINKEDIN` | Number of employee profiles on LinkedIn | Number | > | Organization Year Founded | `FOUNDED` | Year of the organization's founding | Number | > | Organization City HQ | `HEADQUARTERS_CITY` | City where the organization HQ is located | Text | > | Organization Continent HQ | `HEADQUARTERS_CONTINENT` | Continent where the organization HQ is located | Text | > | Organization Country Code HQ | `HEADQUARTERS_COUNTRY_CODE` | Country code where the organization HQ is located | Text | > | Organization Country HQ | `HEADQUARTERS_COUNTRY_NAME` | Country where the organization HQ is located | Text | > | Organization Region HQ | `HEADQUARTERS_COUNTRY_REGION` | Global region where the organization HQ is located | Text | > | Organization Postcode HQ | `HEADQUARTERS_POSTCODE` | Postal code of the organization HQ | Text | > | Organization State Code HQ | `HEADQUARTERS_STATE_CODE` | State code where the organization HQ is located | Text | > | Organization State HQ | `HEADQUARTERS_STATE_NAME` | State where the organization HQ is located | Text | > | Organization Street HQ | `HEADQUARTERS_STREET` | Street address of the organization HQ | Text | > | LinkedIn Company Industry | `INDUSTRY_LINKEDIN` | Industry description from LinkedIn | Text | > | Industry NAICS 2022 Code | `INDUSTRY_NAICS_2022_CODE` | NAICS 2022 industry classification code | Variant | > | Industry NAICS 2022 Description | `INDUSTRY_NAICS_2022_DESCRIPTION` | NAICS 2022 industry classification description | Variant | > | Industry NAICS Code | `INDUSTRY_NAICS_CODE` | NAICS industry code | Text | > | Industry NAICS Description | `INDUSTRY_NAICS_DESCRIPTION` | NAICS industry description | Text | > | Industry SIC Code | `INDUSTRY_SIC_CODE` | Standard Industrial Classification code | Text | > | Industry SIC Description | `INDUSTRY_SIC_DESCRIPTION` | Standard Industrial Classification description | Text | > | UK SIC 2007 Code | `INDUSTRY_UK_STANDARD_2007_CODE` | UK Standard Industrial Classification 2007 code | Variant | > | UK SIC 2007 Description | `INDUSTRY_UK_STANDARD_2007_DESCRIPTION` | UK Standard Industrial Classification 2007 description | Variant | > | Is LinkedIn URL Claimed | `IS_LINKEDIN_URL_CLAIMED` | Indicates if the LinkedIn URL is claimed by the company | Boolean | > | Is Website For Sale | `IS_WEBSITE_FOR_SALE` | Indicates if the website is listed for sale | Boolean | > | Is Website Working | `IS_WEBSITE_WORKING` | Indicates if the organization's website is currently active | Boolean | > | — | `LINKEDIN_FOLLOWERS` | Number of LinkedIn followers for the organization | Number | > | LinkedIn URL Organization | `LINKEDIN_URL` | LinkedIn URL for the organization | Text | > | — | `LINKEDIN_URL_ID` | LinkedIn numeric identifier for the organization | Number | > | Organization City | `LOCATION_CITY` | City of the organization's listed location | Text | > | Company Continent | `LOCATION_CONTINENT` | Continent of the organization's listed location | Text | > | Number Of Locations On LinkedIn | `LOCATION_COUNT` | Number of locations associated with the organization | Number | > | Organization Country Code | `LOCATION_COUNTRY_CODE` | Country code of the organization's listed location | Text | > | Organization Country | `LOCATION_COUNTRY_NAME` | Country name of the organization's listed location | Text | > | Organization Region | `LOCATION_COUNTRY_REGION` | Region of the organization's listed location | Text | > | — | `LOCATION_IS_PRIMARY` | Indicates if the location is the primary one | Boolean | > | Organization Postcode | `LOCATION_POSTCODE` | Postal code of the organization's listed location | Text | > | Organization State Code | `LOCATION_STATE_CODE` | State code of the organization's listed location | Text | > | Organization State | `LOCATION_STATE_NAME` | State name of the organization's listed location | Text | > | Organization Street | `LOCATION_STREET` | Street address of the organization's listed location | Text | > | Company Logo URL | `LOGO_URL` | URL to the company logo on LinkedIn | Text | > | Organization Phone | `PHONE` | Contact phone number for the organization | Text | > | Predicted NAICS 2022 Code | `PREDICTED_INDUSTRY_NAICS_2022_CODE` | RevenueBase's predicted NAICS 2022 industry code | Variant | > | Predicted NAICS 2022 Description | `PREDICTED_INDUSTRY_NAICS_2022_DESCRIPTION` | RevenueBase's predicted NAICS 2022 industry description | Variant | > | Rbid | `RBID` | RevenueBase's unique identifier for the organization | Text | > | Revenue Max | `REVENUE_MAX` | Maximum revenue of the company | Number | > | Revenue Min | `REVENUE_MIN` | Minimum revenue of the company | Number | > | Revenue Range | `REVENUE_RANGE` | Range of the company's revenue | Text | > | LinkedIn Organization Specialties | `SPECIALTIES` | Specialties or key areas of focus of the organization | Text | > | Organization Updated At | `UPDATED_AT` | The organization record's last update date | Date | > | Organization Website | `WEBSITE` | Organization website URL | Text | > [tab] INSIGHTS\_LATEST > > The `INSIGHTS_LATEST` table contains one row per organization. Fields use the `_ORG` suffix. It includes firmographic identity fields (shared with `ORG_LATEST`) and Insights-specific enrichment columns. > > | Gigasheet label | Field | Description | Type | > | - | - | - | - | > | LinkedIn About Us | `ABOUT_US_ORG` | Description of the organization from LinkedIn | Text | > | ABM Technographics | `ABM_TECH_ORG` | Evidence of account-based management technologies in use | Text | > | Account Executive Open Roles Count | `ACCOUNT_EXECUTIVE_OPEN_ROLES_COUNT_ORG` | Number of open job postings for account executive positions | Number | > | Analytics Technographics | `ANALYTICS_TECH_ORG` | Evidence of analytics technologies in use | Text | > | Android Dev Role Count | `ANDROID_DEV_ROLE_COUNT_ORG` | Number of people with Android developer titles | Number | > | Application Security Technographics | `APPLICATION_SECURITY_TECH_ORG` | Evidence of application security technologies in use | Text | > | Appstore App Category | `APPSTORE_APP_CATEGORY_ORG` | Apple App Store classification of the organization's top app | Text | > | Appstore Number Of Updates | `APPSTORE_UPDATE_COUNT_ORG` | Number of updates to the organization's top App Store app | Number | > | Business Development Open Roles Count | `BUSINESS_DEVELOPMENT_OPEN_ROLES_COUNT_ORG` | Number of open job postings for business development positions | Number | > | Number Of Business Development Roles | `BUSINESS_DEVELOPMENT_ROLE_COUNT_ORG` | Number of people with business development titles | Number | > | Organization City | `CITY_ORG` | City of the organization's listed location | Text | > | Cloud Provider Technographics | `CLOUD_PROVIDER_TECH_ORG` | Evidence of cloud providers in use | Text | > | Cloud Security Technographics | `CLOUD_SECURITY_TECH_ORG` | Evidence of cloud security technologies in use | Text | > | CMS Technographics | `CMS_TECH_ORG` | Evidence of content management systems in use | Text | > | Company Name | `COMPANY_NAME_ORG` | Name of the company | Text | > | Conversation Intelligence Technographics | `CONVERSATION_INTELLIGENCE_TECH_ORG` | Evidence of conversation intelligence technologies in use | Text | > | Organization Country Code | `COUNTRY_CODE_ORG` | Country code of the organization's location | Text | > | Organization Country | `COUNTRY_NAME_ORG` | Country name of the organization's location | Text | > | Organization Region | `COUNTRY_REGION_ORG` | Global region of the organization's location | Text | > | CRM Technographics | `CRM_TECH_ORG` | Evidence of customer relationship management technologies in use | Text | > | Customer Success Open Roles Count | `CUSTOMER_SUCCESS_OPEN_ROLES_COUNT_ORG` | Number of open job postings for customer success positions | Number | > | Customer Success Team Size | `CUSTOMER_SUCCESS_ROLE_COUNT_ORG` | Number of people with customer success titles | Number | > | Demand Generation Open Roles Count | `DEMAND_GENERATION_OPEN_ROLES_COUNT_ORG` | Number of open job postings for demand generation positions | Number | > | Development Technographics | `DEVELOPMENT_TECH_ORG` | Evidence of development technologies in use | Text | > | DevOps Open Roles Count | `DEVOPS_OPEN_ROLES_COUNT_ORG` | Number of open job postings for DevOps positions | Number | > | DevOps Role Team Size | `DEVOPS_ROLE_COUNT_ORG` | Number of people with DevOps titles | Number | > | Organization Domain | `DOMAIN_ORG` | Domain of the organization's website | Text | > | E-Commerce Platform Technographics | `E_COMMERCE_PLATFORM_TECH_ORG` | Evidence of e-commerce platform technologies in use | Text | > | Email Hosting Technographics | `EMAIL_HOSTING_TECH_ORG` | Evidence of email hosting providers in use | Text | > | Email Security Technographics | `EMAIL_SECURITY_TECH_ORG` | Evidence of email security technologies in use | Text | > | Employee Count Range | `EMPLOYEE_COUNT_RANGE_ORG` | Range of employee count | Text | > | Employee LinkedIn Percent Growth Rate | `EMPLOYEE_ON_LINKEDIN_GROWTH_RATE_ORG` | Latest month's LinkedIn employee growth rate (%) | Number | > | Employee Profiles on LinkedIn | `EMPLOYEE_PROFILES_ON_LINKEDIN_ORG` | Number of employee profiles on LinkedIn | Number | > | Engineer Role Team Size | `ENGINEER_ROLE_COUNT_ORG` | Number of people with engineering titles | Number | > | ERP Technographics | `ERP_TECH_ORG` | Evidence of ERP technologies in use | Text | > | Organization Year Founded | `FOUNDED_ORG` | Year of the organization's founding | Number | > | Funding Round Number of Investors | `FUNDING_ROUND_NUMBER_OF_INVESTORS_ORG` | Number of investors in the last known funding round | Number | > | GRC Open Roles Count | `GRC_OPEN_ROLES_COUNT_ORG` | Number of open job postings for governance, risk, and compliance positions | Number | > | GRC Team Size | `GRC_ROLE_COUNT_ORG` | Number of people with governance, risk, and compliance titles | Number | > | Organization Has CIO | `HAS_CIO_ORG` | If the business has a chief information officer | Text | > | Organization Has CISO | `HAS_CISO_ORG` | If the business has a chief information security officer | Text | > | Has Mobile App | `HAS_MOBILE_APP_ORG` | If the business has a Google Play or Apple App Store mobile app | Text | > | Has Web App | `HAS_WEB_APP_ORG` | If the business maintains a web application | Text | > | Organization City HQ | `HEADQUARTERS_CITY_ORG` | City where the organization HQ is located | Text | > | Organization Country HQ | `HEADQUARTERS_COUNTRY_NAME_ORG` | Country where the organization HQ is located | Text | > | Organization State HQ | `HEADQUARTERS_STATE_NAME_ORG` | State where the organization HQ is located | Text | > | LinkedIn Company Industry | `INDUSTRY_LINKEDIN_ORG` | Industry description from LinkedIn | Text | > | Industry NAICS Code | `INDUSTRY_NAICS_CODE_ORG` | NAICS industry code | Text | > | Industry NAICS Description | `INDUSTRY_NAICS_DESCRIPTION_ORG` | NAICS industry description | Text | > | Industry SIC Code | `INDUSTRY_SIC_CODE_ORG` | Standard Industrial Classification code | Text | > | Industry SIC Description | `INDUSTRY_SIC_DESCRIPTION_ORG` | Standard Industrial Classification description | Text | > | iOS Dev Team Size | `IOS_DEV_ROLE_COUNT_ORG` | Number of people with iOS developer titles | Number | > | Is LinkedIn URL Claimed | `IS_LINKEDIN_URL_CLAIMED_ORG` | Indicates if the LinkedIn URL is claimed by the company | Boolean | > | Is Website For Sale | `IS_WEBSITE_FOR_SALE_ORG` | Indicates if the website is listed for sale | Boolean | > | IT Open Roles Count | `IT_OPEN_ROLES_COUNT_ORG` | Number of open job postings for IT positions | Number | > | IT Role Team Size | `IT_ROLE_COUNT_ORG` | Number of people with IT titles | Number | > | Last Appstore Update | `LAST_APPSTORE_UPDATE_ORG` | Date of the last update to the organization's top App Store app | Date | > | Last Funding Amount | `LAST_FUNDING_AMOUNT_ORG` | The last funding amount received by the organization | Number | > | Last Funding Date | `LAST_FUNDING_DATE_ORG` | The date of the last funding round | Date | > | Last Funding Type | `LAST_FUNDING_TYPE_ORG` | The type of the last funding round | Text | > | Last Playstore Update | `LAST_PLAYSTORE_UPDATE_ORG` | Date of the last update to the most downloaded Play Store app | Date | > | Organization Lead Investors | `LEAD_INVESTORS_ORG` | Lead investors in the last known funding round | Text | > | LinkedIn URL Organization | `LINKEDIN_URL_ORG` | LinkedIn URL for the organization | Text | > | Company Continent | `LOCATION_CONTINENT_ORG` | Continent of the organization's listed location | Text | > | Number Of Locations On LinkedIn | `LOCATION_COUNT_ORG` | Number of physical offices the organization lists | Number | > | Marketing Automation Tech | `MARKETING_AUTOMATION_TECH_ORG` | Evidence of marketing automation technologies in use | Text | > | Marketing Open Roles Count | `MARKETING_OPEN_ROLES_COUNT_ORG` | Number of open job postings for marketing positions | Number | > | Marketing Role Team Size | `MARKETING_ROLE_COUNT_ORG` | Number of people with marketing titles | Number | > | G2 Martech Categories | `MARTECH_CATEGORIES_ORG` | G2 martech sub-category | Text | > | Mobile Dev Role Team Size | `MOBILE_DEV_ROLE_COUNT_ORG` | Number of people with mobile developer titles | Number | > | Monthly Google Adspend Dollars | `MONTHLY_GOOGLE_ADSPEND_ORG` | Estimated monthly Google Ads budget | Number | > | Monthly Organic Traffic | `MONTHLY_ORGANIC_TRAFFIC_ORG` | Estimated monthly organic search traffic | Number | > | Monthly Paid Traffic | `MONTHLY_PAID_TRAFFIC_ORG` | Estimated monthly paid traffic (PPC) | Number | > | Network Infrastructure Open Roles Count | `NETWORK_INFRASTRUCTURE_OPEN_ROLES_COUNT_ORG` | Number of open job postings for network infrastructure positions | Number | > | Network Infrastructure Role Team Size | `NETWORK_INFRASTRUCTURE_ROLE_COUNT_ORG` | Number of people with network infrastructure titles | Number | > | Operations Open Roles Count | `OPERATIONS_OPEN_ROLES_COUNT_ORG` | Number of open job postings for operations positions | Number | > | Operations Role Team Size | `OPERATIONS_ROLE_COUNT_ORG` | Number of people with operations titles | Number | > | Organization Phone | `PHONE_ORG` | Contact phone number for the organization | Text | > | Playstore App Category | `PLAYSTORE_APP_CATEGORY_ORG` | Google Play Store classification of the top app | Text | > | Playstore Download Count | `PLAYSTORE_DOWNLOAD_COUNT_ORG` | Total number of downloads for the top Play Store app | Number | > | Organization Postcode | `POSTCODE_ORG` | Postal code of the organization's location | Text | > | QA Role Team Size | `QA_ROLE_COUNT_ORG` | Number of people with quality assurance titles | Number | > | Rbid Organization | `RBID_ORG` | RevenueBase's unique identifier for the organization | Text | > | Revenue Range | `REVENUE_RANGE_ORG` | Range of the company's revenue | Text | > | Sales Automation Technographics | `SALES_AUTOMATION_TECH_ORG` | Evidence of sales automation technologies in use | Text | > | Sales Open Roles Count | `SALES_OPEN_ROLES_COUNT_ORG` | Number of open job postings for sales positions | Number | > | Sales Team Size | `SALES_ROLE_COUNT_ORG` | Number of people with sales titles | Number | > | Security Open Roles | `SECURITY_OPEN_ROLES_COUNT_ORG` | Number of open job postings for security positions | Number | > | Security Team Size | `SECURITY_ROLE_COUNT_ORG` | Number of people with security titles | Number | > | LinkedIn Organization Specialties | `SPECIALTIES_ORG` | Specialties or key areas of focus of the organization | Text | > | Organization State Code | `STATE_CODE_ORG` | State code of the organization's location | Text | > | Organization State | `STATE_NAME_ORG` | State name of the organization's location | Text | > | Organization Street | `STREET_ORG` | Street address of the organization's location | Text | > | Top Appstore URL | `TOP_APPLEAPPSTORE_URL_ORG` | URL of the organization's top App Store app | Text | > | Top Appstore Rating | `TOP_APPSTORE_RATING_ORG` | Rating of the organization's top App Store app | Number | > | Top Appstore Review Count | `TOP_APPSTORE_REVIEW_COUNT_ORG` | Total reviews for the organization's top App Store app | Number | > | Top Playstore Rating | `TOP_PLAYSTORE_RATING_ORG` | Rating of the most downloaded Play Store app | Number | > | Top Playstore Review Count | `TOP_PLAYSTORE_REVIEW_COUNT_ORG` | Total reviews for the most downloaded Play Store app | Number | > | Top Playstore URL | `TOP_PLAYSTORE_URL_ORG` | URL of the most downloaded Play Store app | Text | > | Total Funding Amount | `TOTAL_FUNDING_AMOUNT_ORG` | Total funding received to date | Number | > | Total Monthly Web Traffic | `TOTAL_MONTHLY_TRAFFIC_ORG` | Estimated total monthly web traffic | Number | > | Total Appstore and Play Review Count | `TOTAL_REVIEWS_ORG` | Total reviews across the top App Store and Play Store apps | Number | > | Organization Updated At | `UPDATED_AT` | Date this organization record was last updated | Date | > | — | `VALID_EMAIL_COUNT_ORG` | Number of people with valid email addresses associated with the organization | Number | > | Organization Website | `WEBSITE_ORG` | Organization website URL | Text | > [tab] VELOCITY\_BASE\_UNLIMITED\_LATEST > > The `VELOCITY_BASE_UNLIMITED_LATEST` table is a pre-joined, denormalized view combining person and organization data. Person fields use the `_PER` suffix; organization fields use the `_ORG` suffix. A small subset of fields (e.g. `EMPLOYEE_COUNT_MIN`, `LOGO_URL`) appear without a suffix. > > | Field | Description | Type | > | - | - | - | > | `ABOUT_ME_PER` | LinkedIn personal profile about me field | Text | > | `ABOUT_US_ORG` | Description of the organization from LinkedIn | Text | > | `CELLPHONE_PER` | Mobile phone number | Text | > | `CERTIFICATIONS_PER` | LinkedIn personal profile certifications | Variant | > | `CITY_ORG` | City of the organization's location | Text | > | `CITY_PER` | The city where the person lives | Text | > | `COMPANY_ENTITY_TYPE` | Legal entity type of the company | Text | > | `COMPANY_HEADLINE` | Company LinkedIn page headline | Text | > | `COMPANY_LEGAL_TYPE` | Legal type of the company | Variant | > | `COMPANY_NAME_LANGUAGE` | The language the company name is written in | Text | > | `COMPANY_NAME_ORG` | Name of the company | Text | > | `CONTINENT_PER` | The continent that the person is located in | Text | > | `COUNTRY_CODE_ORG` | Country code of the organization's location | Text | > | `COUNTRY_CODE_PER` | The code for the country the person is located in | Text | > | `COUNTRY_NAME_ORG` | Country name of the organization's location | Text | > | `COUNTRY_NAME_PER` | The name of the country the person is located in | Text | > | `COUNTRY_REGION_ORG` | Global region of the organization's location | Text | > | `COUNTRY_REGION_PER` | The global region that the person is located in | Text | > | `DIRECT_PHONE_PER` | The direct office contact number | Text | > | `DOMAIN_ORG` | Domain of the organization's website | Text | > | `EDUCATION_PER` | The person's education history | Variant | > | `EMAIL_ADDRESS_PER` | The person's work email address | Text | > | `EMAIL_DOMAIN_PER` | The domain of the person's work email address | Text | > | `EMAIL_LAST_VERIFIED_AT_PER` | The contact's email last verified timestamp | Timestamp | > | `EMAIL_STATUS_PER` | The verification status of the email | Text | > | `EMPLOYEE_COUNT_MAX` | Maximum number of employees | Number | > | `EMPLOYEE_COUNT_MIN` | Minimum number of employees | Number | > | `EMPLOYEE_COUNT_RANGE_ORG` | Range of employee count | Text | > | `EMPLOYEE_PROFILES_ON_LINKEDIN_ORG` | Number of employee profiles on LinkedIn | Number | > | `FIRST_NAME_PER` | The person's first name | Text | > | `FOUNDED_ORG` | Year of the organization's founding | Number | > | `FULL_NAME_PER` | The person's full name | Text | > | `HAS_CELLPHONE_PER` | If the person has a valid mobile phone number | Boolean | > | `HAS_EMAIL_PER` | If the person has a valid email | Boolean | > | `HAS_PHONE_PER` | If the person has a valid direct phone number | Boolean | > | `HEADQUARTERS_CITY_ORG` | City where the organization HQ is located | Text | > | `HEADQUARTERS_COUNTRY_NAME_ORG` | Country where the organization HQ is located | Text | > | `HEADQUARTERS_STATE_NAME_ORG` | State where the organization HQ is located | Text | > | `INDUSTRY_LINKEDIN_ORG` | Industry description from LinkedIn | Text | > | `INDUSTRY_NAICS_CODE_ORG` | NAICS industry code | Text | > | `INDUSTRY_NAICS_DESCRIPTION_ORG` | NAICS industry description | Text | > | `INDUSTRY_SIC_CODE_ORG` | Standard Industrial Classification code | Text | > | `INDUSTRY_SIC_DESCRIPTION_ORG` | Standard Industrial Classification description | Text | > | `INTERESTS_PER` | LinkedIn personal profile interests field | Variant | > | `IS_WEBSITE_FOR_SALE_ORG` | Indicates if the website is listed for sale | Boolean | > | `JOB_COUNT_PER` | The number of jobs a person has had | Number | > | `JOB_DESCRIPTION_PER` | The description of the person's current job | Text | > | `JOB_FUNCTION_PER` | The department that the person works in | Text | > | `JOB_IS_CURRENT_PER` | Indicates whether the job is currently active | Boolean | > | `JOB_LEVEL_PER` | The seniority level of the person's job | Text | > | `JOB_LOCATION_CITY_PER` | The city where the person works | Text | > | `JOB_LOCATION_CONTINENT_PER` | The continent where the person works | Text | > | `JOB_LOCATION_COUNTRY_CODE_PER` | The country code where the person works | Text | > | `JOB_LOCATION_COUNTRY_PER` | The country name where the person works | Text | > | `JOB_LOCATION_COUNTRY_REGION_PER` | The geographic region that a contact works in | Text | > | `JOB_LOCATION_STATE_PER` | State or province where the person works | Text | > | `JOB_START_DATE_PER` | When the person began their current job | Date | > | `JOB_TITLE_PER` | The person's current job title | Text | > | `LANGUAGES_PER` | The languages spoken | Variant | > | `LAST_NAME_PER` | The person's last name | Text | > | `LINKEDIN_CONNECTIONS_COUNT_PER` | Number of LinkedIn connections the person has | Number | > | `LINKEDIN_HEADLINE_PER` | The person's LinkedIn headline | Text | > | `LINKEDIN_INDUSTRY_PER` | The LinkedIn industry associated with the person's employer | Text | > | `LINKEDIN_URL_ORG` | LinkedIn URL for the organization | Text | > | `LINKEDIN_URL_PER` | The person's LinkedIn profile URL | Text | > | `LOCATION_CONTINENT_ORG` | Continent of the organization's listed location | Text | > | `LOCATION_COUNT_ORG` | Number of locations associated with the organization | Number | > | `LOCATION_COUNTRY_CODE_PER` | Country code of the person's location address | Text | > | `LOCATION_COUNTRY_NAME_PER` | Country name of the person's location address | Text | > | `LOCATION_COUNTRY_REGION_PER` | Region of the person's location address | Text | > | `LOCATION_POSTCODE_PER` | Postal code of the person's location address | Text | > | `LOCATION_STATE_CODE_PER` | State code of the person's location address | Text | > | `LOCATION_STATE_NAME_PER` | State name of the person's location address | Text | > | `LOCATION_STREET_PER` | Street address of the person's location | Text | > | `LOGO_URL` | The person's LinkedIn profile picture URL | Text | > | `LOGO_URL_ORG` | URL to the company logo on LinkedIn | Text | > | `MIDDLE_NAME_PER` | The person's middle name | Text | > | `PATENTS_PER` | Any patents listed on someone's LinkedIn profile | Variant | > | `PERSONA_PER` | Classification of person job type by several business areas | Text | > | `PHONE_ORG` | Contact phone number for the organization | Text | > | `POSTCODE_ORG` | Postal code of the organization's location | Text | > | `PUBLICATIONS_PER` | Any publications listed on someone's LinkedIn profile | Variant | > | `RBID_ORG` | RevenueBase's unique identifier for the organization | Text | > | `RBID_PAO` | RevenueBase's unique identifier for the person at a specific organization | Text | > | `RBID_PER` | RevenueBase's unique identifier for the person. Stays the same if the person changes jobs. | Text | > | `REVENUEBASE_CONTACT_VERIFICATION_SUMMARY` | Verification summary showing when and how a record was verified | Text | > | `REVENUE_MAX` | Maximum revenue of the company | Number | > | `REVENUE_MIN` | Minimum revenue of the company | Number | > | `REVENUE_RANGE_ORG` | Range of the company's revenue | Text | > | `SKILLS_PER` | The person's job skills | Variant | > | `SPECIALTIES_ORG` | Specialties or key areas of focus of the organization | Text | > | `STATE_CODE_ORG` | State code of the organization's location | Text | > | `STATE_CODE_PER` | The abbreviation of the state/province/region the person is located in | Text | > | `STATE_NAME_ORG` | State name of the organization's location | Text | > | `STATE_NAME_PER` | The state/province/region the person is located in | Text | > | `STREET_ORG` | Street address of the organization's location | Text | > | `SUFFIX_NAME_PER` | The person's name suffix | Text | > | `TITLE_NAME_PER` | The person's name prefix | Text | > | `UPDATED_AT_PER` | The contact's last update timestamp. Any field update triggers a change in this value. | Timestamp | > | `WEBSITE_ORG` | Organization website URL | Text | > | `WEBSITES_PER` | The contact's personal websites | Variant | > [tab] VELOCITY\_ENHANCED\_UNLIMITED\_LATEST > > The `VELOCITY_ENHANCED_UNLIMITED_LATEST` table combines all columns from `VELOCITY_BASE_UNLIMITED_LATEST` with the full Insights enrichment layer from `INSIGHTS_LATEST`. Person fields use the `_PER` suffix; organization fields use the `_ORG` suffix. A small subset of fields (e.g. `EMPLOYEE_COUNT_MIN`, `LOGO_URL`) appear without a suffix. > > | Field | Description | Type | > | - | - | - | > | `ABOUT_ME_PER` | LinkedIn personal profile about me field | Text | > | `ABOUT_US_ORG` | Description of the organization from LinkedIn | Text | > | `ABM_TECH_ORG` | Evidence of account-based management technologies in use | Text | > | `ACCOUNT_EXECUTIVE_OPEN_ROLES_COUNT_ORG` | Number of open job postings for account executive positions | Number | > | `ANALYTICS_TECH_ORG` | Evidence of analytics technologies in use | Text | > | `ANDROID_DEV_ROLE_COUNT_ORG` | Number of people with Android developer titles | Number | > | `APPLICATION_SECURITY_TECH_ORG` | Evidence of application security technologies in use | Text | > | `APPSTORE_APP_CATEGORY_ORG` | Apple App Store classification of the organization's top app | Text | > | `APPSTORE_UPDATE_COUNT_ORG` | Number of updates to the organization's top App Store app | Number | > | `BUSINESS_DEVELOPMENT_OPEN_ROLES_COUNT_ORG` | Number of open job postings for business development positions | Number | > | `BUSINESS_DEVELOPMENT_ROLE_COUNT_ORG` | Number of people with business development titles | Number | > | `CELLPHONE_PER` | Mobile phone number | Text | > | `CERTIFICATIONS_PER` | LinkedIn personal profile certifications | Variant | > | `CITY_ORG` | City of the organization's location | Text | > | `CITY_PER` | The city where the person lives | Text | > | `CLOUD_PROVIDER_TECH_ORG` | Evidence of cloud providers in use | Text | > | `CLOUD_SECURITY_TECH_ORG` | Evidence of cloud security technologies in use | Text | > | `CMS_TECH_ORG` | Evidence of content management systems in use | Text | > | `COMPANY_ENTITY_TYPE` | Legal entity type of the company | Text | > | `COMPANY_HEADLINE` | Company LinkedIn page headline | Text | > | `COMPANY_LEGAL_TYPE` | Legal type of the company | Variant | > | `COMPANY_NAME_LANGUAGE` | The language the company name is written in | Text | > | `COMPANY_NAME_ORG` | Name of the company | Text | > | `CONTINENT_PER` | The continent that the person is located in | Text | > | `CONVERSATION_INTELLIGENCE_TECH_ORG` | Evidence of conversation intelligence technologies in use | Text | > | `COUNTRY_CODE_ORG` | Country code of the organization's location | Text | > | `COUNTRY_CODE_PER` | The code for the country the person is located in | Text | > | `COUNTRY_NAME_ORG` | Country name of the organization's location | Text | > | `COUNTRY_NAME_PER` | The name of the country the person is located in | Text | > | `COUNTRY_REGION_ORG` | Global region of the organization's location | Text | > | `COUNTRY_REGION_PER` | The global region that the person is located in | Text | > | `CRM_TECH_ORG` | Evidence of customer relationship management technologies in use | Text | > | `CUSTOMER_SUCCESS_OPEN_ROLES_COUNT_ORG` | Number of open job postings for customer success positions | Number | > | `CUSTOMER_SUCCESS_ROLE_COUNT_ORG` | Number of people with customer success titles | Number | > | `DEMAND_GENERATION_OPEN_ROLES_COUNT_ORG` | Number of open job postings for demand generation positions | Number | > | `DEVELOPMENT_TECH_ORG` | Evidence of development technologies in use | Text | > | `DEVOPS_OPEN_ROLES_COUNT_ORG` | Number of open job postings for DevOps positions | Number | > | `DEVOPS_ROLE_COUNT_ORG` | Number of people with DevOps titles | Number | > | `DIRECT_PHONE_PER` | The direct office contact number | Text | > | `DOMAIN_ORG` | Domain of the organization's website | Text | > | `E_COMMERCE_PLATFORM_TECH_ORG` | Evidence of e-commerce platform technologies in use | Text | > | `EDUCATION_PER` | The person's education history | Variant | > | `EMAIL_ADDRESS_PER` | The person's work email address | Text | > | `EMAIL_DOMAIN_PER` | The domain of the person's work email address | Text | > | `EMAIL_HOSTING_TECH_ORG` | Evidence of email hosting providers in use | Text | > | `EMAIL_LAST_VERIFIED_AT_PER` | The contact's email last verified timestamp | Timestamp | > | `EMAIL_SECURITY_TECH_ORG` | Evidence of email security technologies in use | Text | > | `EMAIL_STATUS_PER` | The verification status of the email | Text | > | `EMPLOYEE_COUNT_MAX` | Maximum number of employees | Number | > | `EMPLOYEE_COUNT_MIN` | Minimum number of employees | Number | > | `EMPLOYEE_COUNT_RANGE_ORG` | Range of employee count | Text | > | `EMPLOYEE_ON_LINKEDIN_GROWTH_RATE_ORG` | Latest month's LinkedIn employee growth rate (%) | Number | > | `EMPLOYEE_PROFILES_ON_LINKEDIN_ORG` | Number of employee profiles on LinkedIn | Number | > | `ENGINEER_ROLE_COUNT_ORG` | Number of people with engineering titles | Number | > | `ERP_TECH_ORG` | Evidence of ERP technologies in use | Text | > | `FIRST_NAME_PER` | The person's first name | Text | > | `FOUNDED_ORG` | Year of the organization's founding | Number | > | `FULL_NAME_PER` | The person's full name | Text | > | `FUNDING_ROUND_NUMBER_OF_INVESTORS_ORG` | Number of investors in the last known funding round | Number | > | `GRC_OPEN_ROLES_COUNT_ORG` | Number of open job postings for governance, risk, and compliance positions | Number | > | `GRC_ROLE_COUNT_ORG` | Number of people with governance, risk, and compliance titles | Number | > | `HAS_CELLPHONE_PER` | If the person has a valid mobile phone number | Boolean | > | `HAS_CIO_ORG` | If the business has a chief information officer | Text | > | `HAS_CISO_ORG` | If the business has a chief information security officer | Text | > | `HAS_EMAIL_PER` | If the person has a valid email | Boolean | > | `HAS_MOBILE_APP_ORG` | If the business has a Google Play or Apple App Store mobile app | Text | > | `HAS_PHONE_PER` | If the person has a valid direct phone number | Boolean | > | `HAS_WEB_APP_ORG` | If the business maintains a web application | Text | > | `HEADQUARTERS_CITY_ORG` | City where the organization HQ is located | Text | > | `HEADQUARTERS_COUNTRY_NAME_ORG` | Country where the organization HQ is located | Text | > | `HEADQUARTERS_STATE_NAME_ORG` | State where the organization HQ is located | Text | > | `INDUSTRY_LINKEDIN_ORG` | Industry description from LinkedIn | Text | > | `INDUSTRY_NAICS_CODE_ORG` | NAICS industry code | Text | > | `INDUSTRY_NAICS_DESCRIPTION_ORG` | NAICS industry description | Text | > | `INDUSTRY_SIC_CODE_ORG` | Standard Industrial Classification code | Text | > | `INDUSTRY_SIC_DESCRIPTION_ORG` | Standard Industrial Classification description | Text | > | `INTERESTS_PER` | LinkedIn personal profile interests field | Variant | > | `IOS_DEV_ROLE_COUNT_ORG` | Number of people with iOS developer titles | Number | > | `IS_LINKEDIN_URL_CLAIMED_ORG` | Indicates if the LinkedIn URL is claimed by the company | Boolean | > | `IS_WEBSITE_FOR_SALE_ORG` | Indicates if the website is listed for sale | Boolean | > | `IT_OPEN_ROLES_COUNT_ORG` | Number of open job postings for IT positions | Number | > | `IT_ROLE_COUNT_ORG` | Number of people with IT titles | Number | > | `JOB_COUNT_PER` | The number of jobs a person has had | Number | > | `JOB_DESCRIPTION_PER` | The description of the person's current job | Text | > | `JOB_FUNCTION_PER` | The department that the person works in | Text | > | `JOB_IS_CURRENT_PER` | Indicates whether the job is currently active | Boolean | > | `JOB_LEVEL_PER` | The seniority level of the person's job | Text | > | `JOB_LOCATION_CITY_PER` | The city where the person works | Text | > | `JOB_LOCATION_CONTINENT_PER` | The continent where the person works | Text | > | `JOB_LOCATION_COUNTRY_CODE_PER` | The country code where the person works | Text | > | `JOB_LOCATION_COUNTRY_PER` | The country name where the person works | Text | > | `JOB_LOCATION_COUNTRY_REGION_PER` | The geographic region that a contact works in | Text | > | `JOB_LOCATION_STATE_PER` | State or province where the person works | Text | > | `JOB_START_DATE_PER` | When the person began their current job | Date | > | `JOB_TITLE_PER` | The person's current job title | Text | > | `LANGUAGES_PER` | The languages spoken | Variant | > | `LAST_APPSTORE_UPDATE_ORG` | Date of the last update to the organization's top App Store app | Date | > | `LAST_FUNDING_AMOUNT_ORG` | The last funding amount received by the organization | Number | > | `LAST_FUNDING_DATE_ORG` | The date of the last funding round | Date | > | `LAST_FUNDING_TYPE_ORG` | The type of the last funding round | Text | > | `LAST_NAME_PER` | The person's last name | Text | > | `LAST_PLAYSTORE_UPDATE_ORG` | Date of the last update to the most downloaded Play Store app | Date | > | `LEAD_INVESTORS_ORG` | Lead investors in the last known funding round | Text | > | `LINKEDIN_CONNECTIONS_COUNT_PER` | Number of LinkedIn connections the person has | Number | > | `LINKEDIN_HEADLINE_PER` | The person's LinkedIn headline | Text | > | `LINKEDIN_INDUSTRY_PER` | The LinkedIn industry associated with the person's employer | Text | > | `LINKEDIN_URL_ORG` | LinkedIn URL for the organization | Text | > | `LINKEDIN_URL_PER` | The person's LinkedIn profile URL | Text | > | `LOCATION_CONTINENT_ORG` | Continent of the organization's listed location | Text | > | `LOCATION_COUNT_ORG` | Number of locations associated with the organization | Number | > | `LOCATION_COUNTRY_CODE_PER` | Country code of the person's location address | Text | > | `LOCATION_COUNTRY_NAME_PER` | Country name of the person's location address | Text | > | `LOCATION_COUNTRY_REGION_PER` | Region of the person's location address | Text | > | `LOCATION_POSTCODE_PER` | Postal code of the person's location address | Text | > | `LOCATION_STATE_CODE_PER` | State code of the person's location address | Text | > | `LOCATION_STATE_NAME_PER` | State name of the person's location address | Text | > | `LOCATION_STREET_PER` | Street address of the person's location | Text | > | `LOGO_URL` | The person's LinkedIn profile picture URL | Text | > | `LOGO_URL_ORG` | URL to the company logo on LinkedIn | Text | > | `MARKETING_AUTOMATION_TECH_ORG` | Evidence of marketing automation technologies in use | Text | > | `MARKETING_OPEN_ROLES_COUNT_ORG` | Number of open job postings for marketing positions | Number | > | `MARKETING_ROLE_COUNT_ORG` | Number of people with marketing titles | Number | > | `MARTECH_CATEGORIES_ORG` | G2 martech sub-category | Text | > | `MIDDLE_NAME_PER` | The person's middle name | Text | > | `MOBILE_DEV_ROLE_COUNT_ORG` | Number of people with mobile developer titles | Number | > | `MONTHLY_GOOGLE_ADSPEND_ORG` | Estimated monthly Google Ads budget | Number | > | `MONTHLY_ORGANIC_TRAFFIC_ORG` | Estimated monthly organic search traffic | Number | > | `MONTHLY_PAID_TRAFFIC_ORG` | Estimated monthly paid traffic (PPC) | Number | > | `NETWORK_INFRASTRUCTURE_OPEN_ROLES_COUNT_ORG` | Number of open job postings for network infrastructure positions | Number | > | `NETWORK_INFRASTRUCTURE_ROLE_COUNT_ORG` | Number of people with network infrastructure titles | Number | > | `OPERATIONS_OPEN_ROLES_COUNT_ORG` | Number of open job postings for operations positions | Number | > | `OPERATIONS_ROLE_COUNT_ORG` | Number of people with operations titles | Number | > | `PATENTS_PER` | Any patents listed on someone's LinkedIn profile | Variant | > | `PERSONA_PER` | Classification of person job type by several business areas | Text | > | `PHONE_ORG` | Contact phone number for the organization | Text | > | `PLAYSTORE_APP_CATEGORY_ORG` | Google Play Store classification of the top app | Text | > | `PLAYSTORE_DOWNLOAD_COUNT_ORG` | Total number of downloads for the top Play Store app | Number | > | `POSTCODE_ORG` | Postal code of the organization's location | Text | > | `PUBLICATIONS_PER` | Any publications listed on someone's LinkedIn profile | Variant | > | `QA_ROLE_COUNT_ORG` | Number of people with quality assurance titles | Number | > | `RBID_ORG` | RevenueBase's unique identifier for the organization | Text | > | `RBID_PAO` | RevenueBase's unique identifier for the person at a specific organization | Text | > | `RBID_PER` | RevenueBase's unique identifier for the person. Stays the same if the person changes jobs. | Text | > | `REVENUEBASE_CONTACT_VERIFICATION_SUMMARY` | Verification summary showing when and how a record was verified | Text | > | `REVENUE_MAX` | Maximum revenue of the company | Number | > | `REVENUE_MIN` | Minimum revenue of the company | Number | > | `REVENUE_RANGE_ORG` | Range of the company's revenue | Text | > | `SALES_AUTOMATION_TECH_ORG` | Evidence of sales automation technologies in use | Text | > | `SALES_OPEN_ROLES_COUNT_ORG` | Number of open job postings for sales positions | Number | > | `SALES_ROLE_COUNT_ORG` | Number of people with sales titles | Number | > | `SECURITY_OPEN_ROLES_COUNT_ORG` | Number of open job postings for security positions | Number | > | `SECURITY_ROLE_COUNT_ORG` | Number of people with security titles | Number | > | `SKILLS_PER` | The person's job skills | Variant | > | `SPECIALTIES_ORG` | Specialties or key areas of focus of the organization | Text | > | `STATE_CODE_ORG` | State code of the organization's location | Text | > | `STATE_CODE_PER` | The abbreviation of the state/province/region the person is located in | Text | > | `STATE_NAME_ORG` | State name of the organization's location | Text | > | `STATE_NAME_PER` | The state/province/region the person is located in | Text | > | `STREET_ORG` | Street address of the organization's location | Text | > | `SUFFIX_NAME_PER` | The person's name suffix | Text | > | `TITLE_NAME_PER` | The person's name prefix | Text | > | `TOP_APPLEAPPSTORE_URL_ORG` | URL of the organization's top App Store app | Text | > | `TOP_APPSTORE_RATING_ORG` | Rating of the organization's top App Store app | Number | > | `TOP_APPSTORE_REVIEW_COUNT_ORG` | Total reviews for the organization's top App Store app | Number | > | `TOP_PLAYSTORE_RATING_ORG` | Rating of the most downloaded Play Store app | Number | > | `TOP_PLAYSTORE_REVIEW_COUNT_ORG` | Total reviews for the most downloaded Play Store app | Number | > | `TOP_PLAYSTORE_URL_ORG` | URL of the most downloaded Play Store app | Text | > | `TOTAL_FUNDING_AMOUNT_ORG` | Total funding received to date | Number | > | `TOTAL_MONTHLY_TRAFFIC_ORG` | Estimated total monthly web traffic | Number | > | `TOTAL_REVIEWS_ORG` | Total reviews across the top App Store and Play Store apps | Number | > | `UPDATED_AT_PER` | The contact's last update timestamp. Any field update triggers a change in this value. | Timestamp | > | `WEBSITE_ORG` | Organization website URL | Text | > | `WEBSITES_PER` | The contact's personal websites | Variant | # Data Freshness & Quality Source: https://docs.revenuebase.ai/docs/data-features/data-freshness/data-freshness How RevenueBase keeps data current, why some records may be outdated, and how to assess data quality programmatically. RevenueBase continuously verifies and refreshes its dataset, but no B2B data source is perfect. This page explains how the refresh cycle works, why some records may lag, and how you can use the fields to assess quality in your own systems. See the [release notes](/docs/release-notes) for the current month's exact figures — these numbers update monthly. ## How to read our data quality stats * **Email re-verification:** % of emails verified (last 60 days) * **Contact freshness:** % of job experiences verified on LinkedIn (last 90 days) * **Company accuracy:** % of company data verified by trusted sources (last 90 days) ## Data updates & refresh schedule RevenueBase data is updated on a **monthly** basis. > [!TIP] > > For S3 deliveries, each update creates a new date-stamped folder. Previous deliveries remain accessible and are **never overwritten**. Bucket names and credentials remain the same across all deliveries. ## How verification works A record is "re-verified" when the source profile was accessible and we confirmed or updated core profile information — name and location, plus other core fields when available. This is distinct from simply checking that a URL resolves. Verification means we read the profile content and either confirmed it matches our existing record or updated our record to reflect changes. Two verification cycles run in parallel: **Profile verification** — we continuously refresh profile data and aim to review all available profiles within each **90-day** cycle. The `updated_at` field on each record reflects when this last occurred. It indicates core profile verification, not guaranteed refresh of every section. Work experience can be hidden by source platforms and may not refresh in a given cycle. If a profile's `updated_at` is more than 90 days old, it typically means the source was temporarily inaccessible during the most recent verification cycle (see [why records become stale](#why-records-become-stale) below). **Email verification** — we continuously monitor email validity and aim to reverify all available email addresses within each **60-day** cycle, independent of profile verification. The `email_last_verified_at` field reflects when this last occurred. Email verification checks deliverability — whether the address accepts mail — not just whether it has valid syntax. The charts below pull from live data in our system. [RevenueBase re-verification cadence and coverage](https://embed.domo.com/cards/MJnqm) [RevenueBase email re-verification frequency](https://embed.domo.com/cards/NYor2) > [!TIP] > > A recently verified email is one of the strongest signals that a record is current. If `email_last_verified_at` is recent and the email status is valid, the associated work experience is very likely still accurate — even if `updated_at` is slightly older. Prioritize records with recently verified emails when building high-confidence segments. ## Why records become stale Most records in RevenueBase are verified within the cycles described above. When a record falls behind, it's typically for one of three reasons: ### Source accessibility issues Profiles may return 404 errors, timeout, or become temporarily unreachable during a verification pass. When this happens, the existing record is retained but `updated_at` is not advanced. If a profile remains inaccessible for **one year**, we deprecate and remove it from the dataset entirely. This prevents the accumulation of records that can no longer be confirmed. ### Platform scraping protections LinkedIn and other source platforms periodically apply protections that hide full profiles — or specific sections like work experience — from public view. These protections affect random profiles and can last anywhere from days to months before the profile becomes fully accessible again. During this time, we retain the existing record but cannot update it. There is no way to predict which profiles will be affected or for how long. ### Delayed profile updates by individuals People frequently change jobs weeks or months before updating their online profiles. Someone who starts a new role in May might not update their LinkedIn until September. RevenueBase would then capture that change in the October or November verification cycle. This is an inherent limitation of any data source that relies on self-reported professional information — the data is only as current as the person's last profile edit. ## Profile deprecation Records that have not been successfully verified for **one year** are deprecated and removed from the dataset. This is an intentional quality measure — it prevents your systems from relying on records that can no longer be confirmed against any source. When a profile is deprecated: * It is removed from subsequent monthly data releases * If you're consuming via Snowflake, the record will no longer appear in `*_LATEST` views * If you're consuming via S3, the record will be absent from the next delivery folder * Previous deliveries are never modified — historical snapshots remain intact ## Assessing record quality Every record ships with fields that let you evaluate freshness and reliability programmatically. Use these to build scoring logic, filter thresholds, or quality gates in your pipelines. | Field | What it tells you | Quality signal | | - | - | - | | `updated_at` | When core profile information was last verified against the source (name, location, and other core fields when available) | Records verified within 90 days are within normal cycle. This does not guarantee every section (such as experience) was refreshed. Older records may have accessibility issues. | | `email_last_verified_at` | When the email address was last checked for deliverability | Recent email verification (within 60 days) is a strong indicator the record is current. | | `revenuebase_contact_verification_summary` | Machine-readable summary of verification status across all contact fields | Use this for programmatic quality filtering. See [Verification Summaries](/docs/data-features/data-freshness/verification-summaries) for schema details. | ### Recommended quality filters For **high-confidence outbound** (email campaigns, direct outreach): filter to records where `email_last_verified_at` is within the last 60 days. All emails in the dataset are verified as valid. ```sql theme={null} -- High-confidence outbound: recently verified emails (all emails in dataset are valid) SELECT * FROM RELEASE.PER_LATEST WHERE EMAIL_LAST_VERIFIED_AT >= DATEADD(day, -60, CURRENT_DATE()); ``` For **enrichment and analytics** (market sizing, account scoring): the full dataset is appropriate, but weight records by recency — `updated_at` within 90 days should receive higher confidence than older records. ```sql theme={null} -- Enrichment/analytics: weight by profile freshness (higher confidence for recent verification) SELECT *, CASE WHEN UPDATED_AT >= DATEADD(day, -90, CURRENT_DATE()) THEN 1.0 WHEN UPDATED_AT >= DATEADD(day, -180, CURRENT_DATE()) THEN 0.7 ELSE 0.5 END AS freshness_score FROM RELEASE.PER_LATEST ORDER BY UPDATED_AT DESC; ``` For **AI agent pipelines**: pass the `revenuebase_contact_verification_summary` and `email_last_verified_at` fields to your agent so it can make programmatic decisions about whether to act on a record or flag it for review. ```sql theme={null} -- AI agent pipelines: include verification context for programmatic quality decisions SELECT RBID_PER, EMAIL_ADDRESS, EMAIL_LAST_VERIFIED_AT, REVENUEBASE_CONTACT_VERIFICATION_SUMMARY, UPDATED_AT FROM RELEASE.PER_LATEST WHERE EMAIL_LAST_VERIFIED_AT IS NOT NULL; ``` ## Sparse profiles and data quality Some profiles in the dataset contain minimal information — a name and company association, but limited detail on title, location, or experience. These profiles are sourced the same way as complete ones, but the underlying source simply contains less data. In some cases, sparse profiles may be incomplete or low-quality. **The strongest indicator that a person genuinely belongs to an organization is a valid company email address.** If a profile is sparse but has a verified email at the company domain, the association is reliable. If a sparse profile has no verified email, treat the association with lower confidence. When building segments or powering outbound, all emails in the dataset are verified as valid. Use `EMAIL_LAST_VERIFIED_AT` to prioritize recently verified addresses for the highest confidence. ## Gigasheet updates RevenueBase data in Gigasheet is refreshed automatically at the beginning of every month — no action is required on your part. * Any **saved views** you have created will be dynamically updated at the time of the data refresh. Your filters and logic are preserved; only the underlying data changes. * If you are receiving a **raw data feed** (S3, Snowflake, etc.), the updated data is delivered to your configured destination at the beginning of the month. # Verification Summaries Source: https://docs.revenuebase.ai/docs/data-features/data-freshness/verification-summaries How to read and use the revenuebase_contact_verification_summary field The **revenuebase\_contact\_verification\_summary** field gives you a human and machine-readable summary of how and when RevenueBase verified a contact. Use it to understand data freshness and to display verification transparency to your users. ## Verification summary examples The **revenuebase\_contact\_verification\_summary** field looks something like this: ``` Verified by RevenueBase Experience last observed on LinkedIn on September 7, 2025: Proposal Manager at Metaphase Profile: linkedin.com/in/jamie-gregory-xxx333 Email last verified on October 15, 2025 via RevenueBase's Email Verification Tool Next verification scheduled: November 2025 Learn more at https://revenuebase.ai/verified-by-revenuebase ``` ## How to read it Use this key to interpret each part of the summary: | Element | Meaning | | - | - | | **Verified by RevenueBase** | The record was verified directly by RevenueBase systems. | | **Experience last observed** | The last time the LinkedIn profile was publicly visible in this state. | | **Email verified** | When the mailbox was confirmed to exist within its domain. | | **Next verification** | When the contact is next scheduled for re-verification. | ## Observe, verify, reconfirm RevenueBase follows a clear process for every person record: **1. Observe** We observe publicly available professional information such as LinkedIn profiles. **2. Verify** We verify email deliverability and domain integrity using our proprietary system. **3. Re-confirm** We recheck every contact regularly. ## Why this matters For humans Every record includes a timestamped source, so you always know what we observed and when. For partners Display the Verification Summary in your product to show your users that the data is traceable and current. For AI systems Autonomous AI models can use the timestamps and sources to evaluate data freshness and accuracy within loops. > [!WARNING] > > Profiles and domains can change after verification—sometimes even retroactively. ## Continuous updates RevenueBase continuously updates its dataset and reissues verification summaries in every release, so the field always reflects the latest observed and verified information: | Cadence | What happens | | - | - | | **Every 30 days** | Full dataset refresh. | | **Every 60 days** | Email deliverability is re-verified. | | **Every 90 days** | At least core information (name, location) on profile re-confirmed using a trusted source such as public LinkedIn profiles. | > [!TIP] > > Use the **revenuebase\_contact\_verification\_summary** field in your UI or exports so your users and AI systems can see verification dates and sources at a glance. # Historical Experience Source: https://docs.revenuebase.ai/docs/data-features/data-tables/historical-experience Career history and job change data — past roles, tenure, and professional trajectory. > [!NOTE] > > The [Data Dictionary](/docs/data-features/data-dictionary) has the most up-to-date field definitions for all RevenueBase tables. Use it as your primary reference for column names and descriptions. The `historical_experience` table tracks career history for contacts in the RevenueBase database. Each row represents one LinkedIn profile with a nested array structure: a `jobs` array containing job objects, each with an `experience` array of position records. Use it to understand career trajectories, identify recent job changers, find alumni of specific organizations, and build more personalized outreach. ## Where the data comes from Historical experience is derived from professional profiles and public career history. Positions are normalized to titles, seniority, and department where possible. Start and end dates are captured with the precision available from the source (sometimes year-only for older roles). Tenure is calculated from those dates. ## Counts and coverage Each row represents one LinkedIn profile with nested arrays: a `jobs` array containing job objects, each with an `experience` array of position records. Not every contact has historical experience; fill rates are higher for recent roles and for people with detailed public profiles. Use the fill-rate query below to see coverage and average positions per profile. ## Table stats | Metric | Value | | - | - | | **Total records** | One row per LinkedIn profile (with array of jobs) | | **Update frequency** | Monthly (aligned with contacts release) | | **Primary key** | `linkedin_url` | | **Main foreign keys** | Join to `PER_LATEST` table on `linkedin_url`, join to `ORG_LATEST` table via `rbid_org` | ## Data dictionary For the complete and most current field reference, see the [Data Dictionary](/docs/data-features/data-dictionary). Fill rates for historical data are typically lower than for current-position data. Older positions, smaller organizations, and non-US contacts tend to have less complete records. The table structure uses one row per LinkedIn profile with an array of job positions. ### Top-level fields | Field | Type | Description | | - | - | - | | `unique_id` | VARCHAR | Unique identifier for this record | | `linkedin_url` | VARCHAR | LinkedIn profile URL (primary key) | | `job_count` | INTEGER | Maximum number of jobs for this profile | | `jobs` | ARRAY | Array of job objects containing experience data | ### Jobs array structure Each element in the `jobs` array is an object containing: | Field | Type | Description | | - | - | - | | `rbid` | VARCHAR | RevenueBase person identifier (from `PER_LATEST` table) | | `rbid_pao` | VARCHAR | RevenueBase person-at-organization identifier | | `rbid_org` | VARCHAR | RevenueBase organization identifier | | `linkedin_id` | INTEGER | LinkedIn organization page ID (from `ORG_LATEST` table) | | `email_address` | VARCHAR | Email address (from `PER_LATEST` table) | | `experience` | ARRAY | Array of experience objects containing position details | ### Experience array structure Each element in the `experience` array within a job object contains: | Field | Type | Description | | - | - | - | | `job_title` | VARCHAR | Job title for this position | | `job_org_name` | VARCHAR | Organization name for this position | | `job_org_linkedin_url` | VARCHAR | LinkedIn organization page URL | | `job_function` | VARCHAR | Department or functional area | | `job_is_current` | BOOLEAN | Whether this is the person's current position | > [!NOTE] > > **One row per LinkedIn profile with nested arrays.** Each row contains a `jobs` array. Each job object contains an `experience` array with one or more position records. A person may have multiple positions at the same organization (different roles over time), which is why `experience` is an array. Use nested array functions to query and filter individual positions. > [!NOTE] > > The `experience` array structure may include additional fields like `start_date`, `end_date`, and other position-related attributes depending on data availability. Query the nested arrays to access individual job positions. ### Joining to other tables The `jobs` array contains `rbid`, `rbid_org`, and `email_address` that you can use to join to other tables. The `experience` array within each job contains position-specific details: | Approach | When to use | | - | - | | **Join to person table** | Use `jobs[].rbid` or join on `linkedin_url` to get current contact information | | **Join to organization table** | Use `jobs[].rbid_org` to get organization firmographics and HQ address for that employer | | **Access position details** | Flatten both `jobs` and `experience` arrays to access individual position fields like `job_title`, `job_org_name`, `job_function`, `job_is_current` | | **Contact's current location** | For "where does this person live now," use **contacts** (`CITY`, `STATE_NAME`, `COUNTRY_NAME`), not historical experience | > [!TIP] > > To analyze "contacts who worked in California" or "alumni of organizations in EMEA," flatten both the `jobs` and `experience` arrays, join to `org_latest` on `rbid_org`, and filter on organization location fields. > [!WARNING] > > **Fill rates for historical data are inherently lower** than for current-position data. Older positions, smaller organizations, and non-US contacts tend to have less complete records. The `experience` object may not contain all fields for every position, and `rbid_org` may be null when the employer is not in the RevenueBase organizations table. ## Common use cases > [accordion] Find recent job changers > > People who just started a new role are often more receptive to new tools. Flatten both the `jobs` and `experience` arrays and filter for positions where `experience.job_is_current = TRUE`. Join to the person table and filter by `UPDATED_AT` to find recently updated profiles. > [accordion] Organization alumni targeting > > Find everyone who used to work at a specific organization by flattening both arrays and filtering for `experience.job_org_linkedin_url` matching the target organization, or use `jobs[].rbid_org` to join to the organization table. Filter for `experience.job_is_current = FALSE`. Useful for selling to former champions who already know your space. > [accordion] Career trajectory analysis > > Flatten both arrays and compare `job_title`, `job_function`, and `job_org_name` across positions for a profile. Use `job_count` to identify profiles with multiple positions, then analyze the progression in the nested arrays. > [accordion] Multiple positions at same organization > > Some profiles may have multiple entries in the `experience` array within the same job object, representing different roles at the same organization over time. Flatten both arrays to see all positions and their progression. ## Joining this table Join `HISTORICAL_EXPERIENCE_LATEST` to `PER_LATEST` table on `linkedin_url` to get current contact info. Flatten both the `jobs` and `experience` arrays to access individual positions. Join to `org_latest` table using `jobs[].rbid_org` when you need firmographics or HQ address for a specific role. ### Flattening the nested arrays To work with individual positions, you need to flatten both the `jobs` array and the `experience` array within each job. Here's a pattern for Snowflake: ```sql theme={null} SELECT he.linkedin_url, he.unique_id, job.value:rbid AS rbid, job.value:rbid_org AS rbid_org, job.value:rbid_pao AS rbid_pao, job.value:email_address AS email_address, job.value:linkedin_id AS linkedin_id, exp.value:job_title AS job_title, exp.value:job_org_name AS job_org_name, exp.value:job_org_linkedin_url AS job_org_linkedin_url, exp.value:job_function AS job_function, exp.value:job_is_current AS job_is_current FROM RELEASE.HISTORICAL_EXPERIENCE_LATEST he, LATERAL FLATTEN(input => he.jobs) job, LATERAL FLATTEN(input => job.value:experience) exp WHERE exp.value IS NOT NULL; ``` ### Historical experience + contacts (recent job changers with contact info) ```sql theme={null} SELECT per.FIRST_NAME, per.LAST_NAME, per.EMAIL_ADDRESS, exp.value:job_title AS new_title, exp.value:job_org_name AS new_company, per.JOB_TITLE AS current_title_in_feed FROM RELEASE.HISTORICAL_EXPERIENCE_LATEST he JOIN RELEASE.PER_LATEST per ON he.linkedin_url = per.LINKEDIN_URL , LATERAL FLATTEN(input => he.jobs) job , LATERAL FLATTEN(input => job.value:experience) exp WHERE exp.value:job_is_current = TRUE AND per.EMAIL_ADDRESS IS NOT NULL ORDER BY per.UPDATED_AT DESC; ``` ### Historical experience + contacts + organizations (alumni with HQ location) ```sql theme={null} SELECT per.FIRST_NAME, per.LAST_NAME, per.EMAIL_ADDRESS, exp.value:job_org_name AS former_employer, exp.value:job_title AS former_title, org.HEADQUARTERS_COUNTRY_NAME_ORG, org.HEADQUARTERS_CITY_ORG FROM RELEASE.HISTORICAL_EXPERIENCE_LATEST he JOIN RELEASE.PER_LATEST per ON he.linkedin_url = per.LINKEDIN_URL , LATERAL FLATTEN(input => he.jobs) job , LATERAL FLATTEN(input => job.value:experience) exp LEFT JOIN RELEASE.ORG_LATEST org ON job.value:rbid_org = org.RBID WHERE exp.value:job_org_linkedin_url LIKE '%salesforce%' AND exp.value:job_is_current = FALSE AND per.EMAIL_ADDRESS IS NOT NULL ORDER BY per.UPDATED_AT DESC; ``` ## How to calculate fill rates Use this to see how many profiles you have, how many positions total, and how complete key fields are. ```sql theme={null} SELECT COUNT(*) AS total_profiles, SUM(job_count) AS total_positions, ROUND(AVG(job_count), 1) AS avg_positions_per_profile, COUNT(DISTINCT linkedin_url) AS unique_profiles FROM RELEASE.HISTORICAL_EXPERIENCE_LATEST; -- To analyze individual positions, flatten both arrays: SELECT COUNT(*) AS total_positions, ROUND(COUNT(job.value:rbid_org) * 100.0 / COUNT(*), 1) AS rbid_org_fill_pct, ROUND(COUNT(exp.value:job_title) * 100.0 / COUNT(*), 1) AS job_title_fill_pct, ROUND(COUNT(exp.value:job_org_name) * 100.0 / COUNT(*), 1) AS job_org_name_fill_pct, ROUND(COUNT(exp.value:job_function) * 100.0 / COUNT(*), 1) AS job_function_fill_pct FROM RELEASE.HISTORICAL_EXPERIENCE_LATEST he, LATERAL FLATTEN(input => he.jobs) job, LATERAL FLATTEN(input => job.value:experience) exp WHERE exp.value IS NOT NULL; ``` ## Sample queries ### Recent job changers (last 90 days) **What you're finding:** People who started a new job in the last 90 days, for outreach or lead scoring. **Why these fields:** We need current contact info from the person table and the new role from the flattened jobs array. Filter for current positions with recent start dates. **Logic:** Flatten both the jobs and experience arrays, filter to current positions (`job_is_current = TRUE`). Join to person table for contact info. Use `UPDATED_AT` to identify recently updated profiles. ```sql theme={null} SELECT per.FIRST_NAME, per.LAST_NAME, per.EMAIL_ADDRESS, exp.value:job_title AS new_title, exp.value:job_org_name AS new_company, per.UPDATED_AT AS profile_updated_at FROM RELEASE.HISTORICAL_EXPERIENCE_LATEST he JOIN RELEASE.PER_LATEST per ON he.linkedin_url = per.LINKEDIN_URL , LATERAL FLATTEN(input => he.jobs) job , LATERAL FLATTEN(input => job.value:experience) exp WHERE exp.value:job_is_current = TRUE AND per.UPDATED_AT >= DATEADD(day, -90, CURRENT_DATE()) AND per.EMAIL_ADDRESS IS NOT NULL ORDER BY per.UPDATED_AT DESC; ``` ### Alumni of a specific organization **What you're finding:** People who used to work at a given organization (e.g. Salesforce), with current contact info, for alumni campaigns or competitive targeting. **Why these fields:** Filter the jobs array for the target organization's domain and non-current positions. Join to person table for current contact info. **Logic:** Flatten both arrays, filter by target organization LinkedIn URL pattern and non-current positions. Join to person table for email and current context. Order by profile update date descending. ```sql theme={null} SELECT per.FIRST_NAME, per.LAST_NAME, per.EMAIL_ADDRESS, per.JOB_TITLE AS current_title, per.COMPANY_NAME AS current_company, exp.value:job_title AS former_title, exp.value:job_org_name AS former_employer, exp.value:job_org_linkedin_url AS former_company_linkedin FROM RELEASE.HISTORICAL_EXPERIENCE_LATEST he JOIN RELEASE.PER_LATEST per ON he.linkedin_url = per.LINKEDIN_URL , LATERAL FLATTEN(input => he.jobs) job , LATERAL FLATTEN(input => job.value:experience) exp WHERE exp.value:job_org_linkedin_url LIKE '%salesforce%' AND exp.value:job_is_current = FALSE AND per.EMAIL_ADDRESS IS NOT NULL ORDER BY per.UPDATED_AT DESC; ``` ## Related Person Full field reference for person-level records, including current job title and contact info. Organization Organization firmographics — headcount, industry, location, and tech stack. Joining Tables How to join Historical Experience to Person and Organization using RBID keys. Data Freshness & Quality How records are verified and when historical data may be incomplete. ### Profiles with multiple positions **What you're finding:** Profiles that have held multiple positions, useful for career trajectory analysis. **Why these fields:** Use `job_count` to identify profiles with multiple positions, then flatten to see all positions. **Logic:** Filter for profiles with `job_count > 1`, then flatten both arrays to see all positions. ```sql theme={null} SELECT he.linkedin_url, he.job_count, per.FIRST_NAME, per.LAST_NAME, exp.value:job_title AS job_title, exp.value:job_org_name AS company_name, exp.value:job_function AS job_function, exp.value:job_is_current AS is_current FROM RELEASE.HISTORICAL_EXPERIENCE_LATEST he JOIN RELEASE.PER_LATEST per ON he.linkedin_url = per.LINKEDIN_URL , LATERAL FLATTEN(input => he.jobs) job , LATERAL FLATTEN(input => job.value:experience) exp WHERE he.job_count > 1 AND exp.value IS NOT NULL ORDER BY he.linkedin_url, exp.value:job_is_current DESC; ``` # Insights Source: https://docs.revenuebase.ai/docs/data-features/data-tables/insight Insight data — technographics, hiring indicators, funding events, and engagement signals. > [!NOTE] > > The [Data Dictionary](/docs/data-features/data-dictionary) has the most up-to-date field definitions for this table. Use it as your primary reference for column names and descriptions. **The Insights table contains organization-level intelligence signals derived from technographic data (tools in use), hiring activity (open roles and team composition), funding events, and growth indicators.** Use the Insight table to prioritize accounts based on buying signals, identify organizations going through growth or change, and layer intent-like signals into your targeting. All Insight data is organization-level — there are no contact-level insight fields. ## Where the data comes from Insights data is derived from multiple sources: technographic data from website and stack detection, hiring data from job boards and career pages, funding data from press and regulatory filings, and engagement-style signals where available. Data is updated with each monthly release; recency varies by signal type. ## Counts and coverage Not every organization has insights; fill rates are highest for organizations with a clear web presence and for venture-backed organizations. Use the fill-rate query below to see coverage for your dataset. ## Table stats | Metric | Value | | - | - | | **Total records** | Varies by subscription; one row per insight event or snapshot | | **Update frequency** | Monthly (aligned with contacts and organizations release) | | **Primary key** | `RBID_ORG` | | **Main foreign key** | `RBID_ORG` → `ORG_LATEST.RBID` | ## Data dictionary For the complete and most current field reference, see the [Data Dictionary](/docs/data-features/data-dictionary). Fill rates vary significantly by insight type. Technographic data is available for organizations with a detectable web/tech footprint; funding data is richest for venture-backed organizations; hiring signals depend on public job postings. ### Identifiers | Field | Description | Example | | - | - | - | | `RBID_ORG` | RevenueBase's unique identifier for an organization | rb-oab75n3pe | ### Technographic signals RevenueBase derives technographic signals from a variety of sources across the web, primarily from skills and technologies listed in an organization's job postings and from Google Play and Apple App Store listings. The presence of a technographic indicator means we detected that technology in use at some point in time. Because we don't currently have a reliable way to determine when an organization stops using a particular technology, these signals are additive only — they expand over time but don't contract. A technology that appears in an organization's profile may no longer be actively in use. Treat technographic data as a cumulative footprint of an organization's technology stack rather than a real-time snapshot of what's deployed today. | Field | Description | Example | | - | - | - | | `ABM_TECH_ORG` | There is evidence of particular activity based management technologies in use | 6Sense;Demandbase;Uberflip;Terminus;Engagio;Triblio | | `ANALYTICS_TECH_ORG` | There is evidence of particular analytics technologies in use | Tableau;Power BI;Segment;Looker;Qlik | | `APPLICATION_SECURITY_TECH_ORG` | There is evidence of particular application security technologies in use | Synopsys;Checkmarx;Snyk;Veracode;Semgrep | | `CLOUD_PROVIDER_TECH_ORG` | There is evidence of particular cloud providers in use | AWS;Google Cloud;Microsoft Azure;IBM Cloud;Oracle Cloud;Alibaba | | `CLOUD_SECURITY_TECH_ORG` | There is evidence of particular cloud security technologies in use | Datadog;Wiz;Sysdig;Lacework | | `CMS_TECH_ORG` | There is evidence of particular content management systems in use | Hubspot;Wordpress;Wix;Squarespace;Drupal;Optimizely;Contentful;Adobe Experience Manager;Sitecore;sanity;Prismic;Adobe CQ;Strapi;Episerver | | `CONVERSATION_INTELLIGENCE_TECH_ORG` | There is evidence of particular conversation intelligence technologies in use | Chorus;Gong;Aircall;Clari;Dialpad | | `CRM_TECH_ORG` | There is evidence of particular customer relationship management technologies in use | Salesforce CRM;Hubspot;Microsoft Dynamics;Zoho;Pipedrive CRM;SugarCRM | | `DEVELOPMENT_TECH_ORG` | There is evidence of particular development technologies in use | MongoDB;PostgreSQL;Couchbase;Neo4j;TigerGraph | | `E_COMMERCE_PLATFORM_TECH_ORG` | There is evidence of particular e-commerce platform technologies used | WooCommerce;BigCommerce; Shopify;Salesforce Commerce Cloud;Oracle Commerce | | `EMAIL_HOSTING_TECH_ORG` | There is evidence of particular email hosting providers in use | Google;Microsoft | | `EMAIL_SECURITY_TECH_ORG` | There is evidence of particular email security technologies in use | Mimecast;Symantec;Proofpoint;Fortinet;Microsoft Defender;Barracuda | | `ERP_TECH_ORG` | There is evidence of particular ERP technologies in use | SAP ecc;SAP s/4hana;Infor Cloudsuite Industrial | | `MARKETING_AUTOMATION_TECH_ORG` | There is evidence of particular Marketing Automation technologies in use | Mailchimp;Hubspot;Klaviyo;Pardot;Marketo;Salesforce Marketing Cloud | | `MARTECH_CATEGORIES_ORG` | G2 martech sub-category | eCommerce Platforms & Carts;Live Chat & Chatbots;Display & Programmatic Advertising;Native/Content Advertising;Business/Customer Intelligence & Data Science | | `SALES_AUTOMATION_TECH_ORG` | There is evidence of particular sales automation technologies in use | Salesloft;Outreach;Yesware;Apollo | | `HAS_WEB_APP_ORG` | If the business maintains a web application | Yes | | `HAS_MOBILE_APP_ORG` | If the business has either a Google or Apple mobile app available | Yes | ### Hiring signals RevenueBase accumulates job postings over a rolling 12 to 18 month window and tallies the total number of posts for each job function. Keep in mind that these values are directional rather than precise — job postings fluctuate daily as organizations open, close, and re-list roles. A single posting may also represent multiple headcount for the same position. We also surface role-based signals derived from the RevenueBase contact database. These include binary indicators like whether an organization has a CISO on staff, as well as counts such as `IT_ROLE_COUNT_ORG` that reflect the number of contacts we've identified in a given function. These counts are based on current job titles in our database and will shift as contacts are added, updated, or removed. As with hiring signals, treat these data points as directional indicators of an organization's structure and investment areas rather than exact headcounts. > [!WARNING] > > **Data lag and trend indicators:** All open position columns (`*_OPEN_ROLES_COUNT_ORG`) and role count columns (`*_ROLE_COUNT_ORG`) reflect trends, not real-time values. There is a 2-3 month lag between the data source and the dataset. These fields should be used to identify hiring trends and organizational patterns, not as real-time metrics for current job openings or exact team sizes. Use them for directional signals about organization growth, investment areas, and organizational structure. | Field | Description | Example | | - | - | - | | `ACCOUNT_EXECUTIVE_OPEN_ROLES_COUNT_ORG` | Number of open job postings for account executives positions at the organization | 1 | | `BUSINESS_DEVELOPMENT_OPEN_ROLES_COUNT_ORG` | Number of open job postings for business development positions at the organization | 350 | | `BUSINESS_DEVELOPMENT_ROLE_COUNT_ORG` | Number of people with business development titles associated with the organization | 662 | | `CUSTOMER_SUCCESS_OPEN_ROLES_COUNT_ORG` | Number of open job postings for customer success positions at the organization | 2 | | `CUSTOMER_SUCCESS_ROLE_COUNT_ORG` | Number of people with customer success titles associated with the organization | 29 | | `DEMAND_GENERATION_OPEN_ROLES_COUNT_ORG` | Number of open job postings for demand generation positions at the organization | 1 | | `DEVOPS_OPEN_ROLES_COUNT_ORG` | Number of open job postings for development operations positions at the organization | 5 | | `DEVOPS_ROLE_COUNT_ORG` | Number of people with development operations titles associated with the organization | 14 | | `ENGINEER_ROLE_COUNT_ORG` | Number of people with engineering titles associated with the organization | 26 | | `GRC_OPEN_ROLES_COUNT_ORG` | Number of open job postings for governance, risk, and compliance positions at the organization | 450 | | `GRC_ROLE_COUNT_ORG` | Number of people with governance, risk, and compliance titles associated with the organization | 3477 | | `IOS_DEV_ROLE_COUNT_ORG` | Number of people with IOS developer titles associated with the organization | 589 | | `IT_OPEN_ROLES_COUNT_ORG` | Number of open job postings for information technology positions at the organization | 2 | | `IT_ROLE_COUNT_ORG` | Number of people with information technology titles associated with the organization | 476 | | `MARKETING_OPEN_ROLES_COUNT_ORG` | Number of open job postings for marketing positions at the organization | 1 | | `MARKETING_ROLE_COUNT_ORG` | Number of people with marketing titles associated with the organization | 3 | | `MOBILE_DEV_ROLE_COUNT_ORG` | Number of people with mobile developer titles associated with the organization | 1 | | `NETWORK_INFRASTRUCTURE_OPEN_ROLES_COUNT_ORG` | Number of open job postings for network infrastructure positions at the organization | 6 | | `NETWORK_INFRASTRUCTURE_ROLE_COUNT_ORG` | Number of people with network infrastructure titles associated with the organization | 32 | | `OPERATIONS_OPEN_ROLES_COUNT_ORG` | Number of open job postings for operations positions at the organization | 324 | | `OPERATIONS_ROLE_COUNT_ORG` | Number of people with operations titles associated with the organization | 1 | | `QA_ROLE_COUNT_ORG` | Number of people with quality assurance titles associated with the organization | 18 | | `SALES_OPEN_ROLES_COUNT_ORG` | Number of open job postings for sales positions at the organization | 6 | | `SALES_ROLE_COUNT_ORG` | Number of people with sales titles associated with the organization | 4 | | `SECURITY_OPEN_ROLES_COUNT_ORG` | Number of open job postings for security positions at the organization | 500 | | `SECURITY_ROLE_COUNT_ORG` | Number of people with security titles associated with the organization | 6 | | `ANDROID_DEV_ROLE_COUNT_ORG` | Number of people with Android developer titles associated with the organization | 467 | | `HAS_CIO_ORG` | If the business has a chief information officer | Yes | | `HAS_CISO_ORG` | If the business has a chief information security officer | Yes | | `VALID_EMAIL_COUNT_ORG` | Number of people with valid email addresses associated with the organization in RevenueBase | 47 | ### Funding & financial signals | Field | Description | Example | | - | - | - | | `FUNDING_ROUND_NUMBER_OF_INVESTORS_ORG` | If the business received funding, the last known number of investors | 2 | | `LAST_FUNDING_AMOUNT_ORG` | If the organization received funding, the last funding amount | 15400000 | | `LAST_FUNDING_DATE_ORG` | If the organization received funding, the last funding date | 2022-09-22 | | `LAST_FUNDING_TYPE_ORG` | If the business received funding, the last funding type | Post-IPO Equity | | `LEAD_INVESTORS_ORG` | If the business received funding, the last set of lead investors | Exact Sciences | | `TOTAL_FUNDING_AMOUNT_ORG` | If the organization received funding, the total amount of funding to date | 175500000 | | `MONTHLY_GOOGLE_ADSPEND_ORG` | Estimated monthly Google Ads budget | 1370 | ### Growth indicators | Field | Description | Example | | - | - | - | | `EMPLOYEE_ON_LINKEDIN_GROWTH_RATE_ORG` | Percentage of latest month's employee growth rate as a percentage. | 4 | | `MONTHLY_ORGANIC_TRAFFIC_ORG` | Estimated monthly search result clicks | 4943 | | `MONTHLY_PAID_TRAFFIC_ORG` | Estimated monthly pay per click number | 372 | | `TOTAL_MONTHLY_TRAFFIC_ORG` | Estimated monthly web traffic | 5315 | ### Mobile App Store Data We pull this data from the Google Play and Apple App Store several times per year. | Field | Description | Example | | - | - | - | | `TOTAL_REVIEWS_ORG` | Total reviews of the two top applications from Google and Apple. | 1373 | | `LAST_APPSTORE_UPDATE_ORG` | The date of the last update to this particular application | 2021-12-24 | | `LAST_PLAYSTORE_UPDATE_ORG` | The last date of an update to the most frequently downloaded application | 2023-11-09 | | `APPSTORE_UPDATE_COUNT_ORG` | The number of updates to this top application | 8 | | `APPSTORE_APP_CATEGORY_ORG` | The applestore classification of this application | Sports | | `TOP_APPLEAPPSTORE_URL_ORG` | The latest apple store app for the organization. Where there are multiple latest apps, the 'top' app is the one with the most updates and the highest rating | [https://apps.apple.com/ng/app/id1541201440](https://apps.apple.com/ng/app/id1541201440) | | `TOP_APPSTORE_RATING_ORG` | The rating of the top apple store app for the organization | 4.5 | | `TOP_APPSTORE_REVIEW_COUNT_ORG` | The total reviews for the organizations' top apple store application | 35 | | `PLAYSTORE_APP_CATEGORY_ORG` | The playstore classification of this application | Finance | | `PLAYSTORE_DOWNLOAD_COUNT_ORG` | The total number of downloads for this application | 272740 | | `TOP_PLAYSTORE_URL_ORG` | The most frequently downloaded playstore app for the organization | [https://play.google.com/store/apps/details?id=com.todo1.davivienda.mobileapp.hn\&hl=es\_419](https://play.google.com/store/apps/details?id=com.todo1.davivienda.mobileapp.hn\&hl=es_419) | | `TOP_PLAYSTORE_RATING_ORG` | The latest rating of the playstore app with the most downloads | 3.6 | | `TOP_PLAYSTORE_REVIEW_COUNT_ORG` | The total of reviews for the most highly downloaded application | 1291 | ## Joining this table Join `insights_latest` to `org_latest` on `RBID_ORG` = `RBID` to attach firmographics. To get insights for contacts, join `per_latest` to `insights_latest` on `per.RBID_ORG` = `insights.RBID_ORG`. ### Insight + organizations (signals with firmographics) ```sql theme={null} SELECT co.COMPANY_NAME, co.DOMAIN, co.INDUSTRY_LINKEDIN, co.EMPLOYEE_COUNT_MAX, i.CRM_TECH_ORG, i.SALES_ROLE_COUNT_ORG, i.HAS_CIO_ORG, i.EMPLOYEE_ON_LINKEDIN_GROWTH_RATE_ORG, i.LAST_FUNDING_AMOUNT_ORG FROM RELEASE.INSIGHTS_LATEST i JOIN RELEASE.ORG_LATEST co ON i.RBID_ORG = co.RBID WHERE co.EMPLOYEE_COUNT_MAX BETWEEN 50 AND 500; ``` ### Insight + organizations (organization-level insights with contact context) ```sql theme={null} SELECT c.FIRST_NAME, c.LAST_NAME, c.EMAIL_ADDRESS, c.JOB_TITLE, co.COMPANY_NAME, co.DOMAIN, i.CRM_TECH_ORG, i.SALES_ROLE_COUNT_ORG FROM RELEASE.PER_LATEST c JOIN RELEASE.ORG_LATEST co ON c.RBID_ORG = co.RBID JOIN RELEASE.INSIGHTS_LATEST i ON c.RBID_ORG = i.RBID_ORG ORDER BY i.LAST_FUNDING_DATE_ORG DESC; ``` ## How to calculate fill rates Use this pattern to see how many records have each insight type and how complete key fields are. ```sql theme={null} SELECT COUNT(*) AS record_count, ROUND(COUNT(CRM_TECH_ORG) * 100.0 / COUNT(*), 1) AS tech_fill_pct, ROUND(COUNT(SALES_ROLE_COUNT_ORG) * 100.0 / COUNT(*), 1) AS hiring_fill_pct, ROUND(COUNT(LAST_FUNDING_AMOUNT_ORG) * 100.0 / COUNT(*), 1) AS funding_fill_pct, ROUND(COUNT(EMPLOYEE_ON_LINKEDIN_GROWTH_RATE_ORG) * 100.0 / COUNT(*), 1) AS growth_fill_pct FROM RELEASE.INSIGHTS_LATEST; ``` ## Sample queries ### Find organizations showing growth signals (hiring + headcount growth) **What you're finding:** Organizations that are growing headcount and actively hiring — strong candidates for sales or hiring tools. **Why these fields:** `EMPLOYEE_ON_LINKEDIN_GROWTH_RATE_ORG` and `*_OPEN_ROLES_COUNT_ORG` fields are trend indicators that show hiring patterns. We join to **organizations** to filter by size (`EMPLOYEE_COUNT_MAX`) and to get `COMPANY_NAME` and `DOMAIN`. `LAST_FUNDING_AMOUNT_ORG` and `LAST_FUNDING_TYPE_ORG` add optional context for prioritization. **Logic:** Require meaningful headcount growth and hiring trends, and limit to a mid-market size band. Order by growth rate so the hottest accounts are first. Note that open role counts reflect trends with a 2-3 month lag, not real-time job openings. ```sql theme={null} SELECT co.COMPANY_NAME, co.DOMAIN, co.EMPLOYEE_COUNT_MAX, i.EMPLOYEE_ON_LINKEDIN_GROWTH_RATE_ORG, i.SALES_OPEN_ROLES_COUNT_ORG, i.LAST_FUNDING_AMOUNT_ORG, i.LAST_FUNDING_TYPE_ORG FROM RELEASE.INSIGHTS_LATEST i JOIN RELEASE.ORG_LATEST co ON i.RBID_ORG = co.RBID WHERE i.EMPLOYEE_ON_LINKEDIN_GROWTH_RATE_ORG > 20 AND i.SALES_OPEN_ROLES_COUNT_ORG > 0 AND co.EMPLOYEE_COUNT_MAX BETWEEN 50 AND 500 ORDER BY i.EMPLOYEE_ON_LINKEDIN_GROWTH_RATE_ORG DESC; ``` > [!TIP] > > Array containment syntax varies: Snowflake often uses `ARRAY_CONTAINS(value, array)` or `array IN (SELECT value FROM table)`. BigQuery uses `value IN UNNEST(array)`. Check your warehouse docs and adjust the filter accordingly. # Organization Source: https://docs.revenuebase.ai/docs/data-features/data-tables/organization Organization-level firmographic data — industry, size, revenue, location, and more. > [!NOTE] > > The [Data Dictionary](/docs/data-features/data-dictionary) has the most up-to-date field definitions for this table. Use it as your primary reference for column names and descriptions. > [!WARNING] > > **Column names in this table have no `_ORG` suffix.** Use `HEADQUARTERS_CITY`, `INDUSTRY_LINKEDIN`, etc. exactly as listed below — do not append `_ORG` to any field when querying `RELEASE.ORG_LATEST` directly. The `_ORG` suffix appears only in `INSIGHTS_LATEST` and the pre-joined `VELOCITY_*` tables, where it disambiguates organization fields after a merge — never in `ORG_LATEST` itself. The `organizations` table contains organization-level records with firmographic data. Use it for account targeting, ICP filtering, segmentation, and enriching your CRM with organization-level attributes. One row per organization; join to contacts and insights via `RBID`. ## Where data comes from Organization records are built from public profiles, websites, regulatory filings, and third-party data providers. Industry and size are normalized for consistent filtering. Location and financials are updated with each release; fill rates for revenue and funding are higher for public and venture-backed organizations. ## Organization counts by region The map below shows current organization counts by country. Use it to understand coverage and plan account-based campaigns by region. **View interactive map: organization counts by country** [RevenueBase organization counts by region](https://embed.domo.com/cards/xn5zr) ## Table stats | Metric | Value | | - | - | | **Total records** | See map above; updated with each release | | **Update frequency** | Monthly (new delivery on the 1st of each month) | | **Primary key** | `RBID` | | **Main foreign key** | `VELOCITY_BASE_UNLIMITED_LATEST.rbid_org` and `INSIGHTS_LATEST.rbid_org` join here | ## Data dictionary For the complete and most current field reference, see the [Data Dictionary](/docs/data-features/data-dictionary). Fill rate is the percentage of rows where a field is non-null. Rates vary by segment (e.g. US and public organizations often have higher fill rates for financials and industry). ### Identifiers | Field | Description | Example | | - | - | - | | `RBID` | RevenueBase's unique identifier for an organization. The same value is placed in a field RBID\_ORG of people dataset | rb-oacksydgz | | `DOMAIN` | Domain of the organization's website | company.com | | `DOMAIN_TLD` | Top-level domain of the organization's website | .com | | `WEBSITE` | Organization URL | [https://www.company.com](https://www.company.com) | | `LINKEDIN_URL` | LinkedIn URL for the organization | [https://www.linkedin.com/company/company\_name](https://www.linkedin.com/company/company_name) | | `LINKEDIN_URL_ID` | LinkedIn unique identifier for the organization | 76647045 | ### Organization basics | Field | Description | Example | | - | - | - | | `COMPANY_NAME` | Name of the organization | Dell Technologies | | `COMPANY_NAME_LANGUAGE` | The language the name of the organization is written | en | | `ABOUT_US` | Description of the organization | Upstream Fullvision is a full service design firm in Honolulu Hawaii. Specializing in homes and small business design, 3D rendering/virtual tour, graphic design and beyond. Upstream Fullvision will provide the best service to turn your concept into reality. | | `COMPANY_ENTITY_TYPE` | Legal entity type of the organization | Privately Held | | `COMPANY_LEGAL_TYPE` | Legal type of the organization | \[ ""Corporation"" ] | | `FOUNDED` | Year of the organization's founding | 1997 | | `PHONE` | Contact phone number for the organization | +1 972-000-0000 | | `IS_LINKEDIN_URL_CLAIMED` | Indicates if the LinkedIn URL is claimed by the organization | TRUE | | `IS_WEBSITE_FOR_SALE` | Indicates if the website is listed for sale | FALSE | | `IS_WEBSITE_WORKING` | Indicates if the organization's website is currently active | TRUE | | `LOGO_URL` | URL to the company logo on LinkedIn | [https://media.licdn.com/dms/image/](https://media.licdn.com/dms/image/)... | ### Industry & classification | Field | Description | Example | | - | - | - | | `CATEGORY_CRUNCHBASE` | Organization industry categories from Crunchbase | \["SaaS", "Enterprise Software"] | | `CATEGORY_G2` | Organization software categories from G2 | \["CRM", "Sales Automation"] | | `INDUSTRY_LINKEDIN` | Industry description from LinkedIn | \[ ""Software Development"" ] | | `INDUSTRY_NAICS_CODE` | NAICS Code | \[ ""484121"", ""541512"", ""541511"", ""561499"" ] | | `INDUSTRY_NAICS_DESCRIPTION` | NAICS Description | \[ ""General Freight Trucking, Long-Distance, Truckload"", ""Computer Systems Design Services"", ""Custom Computer Programming Services"", ""All Other Business Support Services"" ] | | `INDUSTRY_NAICS_2022_CODE` | NAICS 2022 industry classification code | \["511210"] | | `INDUSTRY_NAICS_2022_DESCRIPTION` | NAICS 2022 industry classification description | \["Software Publishers"] | | `INDUSTRY_SIC_CODE` | Standard Industrial Classification code | \[ ""7373"" ] | | `INDUSTRY_SIC_DESCRIPTION` | Standard Industrial classification description | \[ ""Computer systems design"" ] | | `INDUSTRY_UK_STANDARD_2007_CODE` | UK Standard Industrial Classification 2007 code | \["62012"] | | `INDUSTRY_UK_STANDARD_2007_DESCRIPTION` | UK Standard Industrial Classification 2007 description | \["Business and domestic software development"] | | `PREDICTED_INDUSTRY_NAICS_2022_CODE` | RevenueBase's predicted NAICS 2022 industry code | \["511210"] | | `PREDICTED_INDUSTRY_NAICS_2022_DESCRIPTION` | RevenueBase's predicted NAICS 2022 industry description | \["Software Publishers"] | | `SPECIALTIES` | Specialties or key areas of focus of the organization | \[ ""technology"", ""education and implementation"", ""data synchornization"", ""product data management"", ""advisory services"", ""innovation"", ""data quality analytics"" ] | ### Size & financials | Field | Description | Example | | - | - | - | | `EMPLOYEE_COUNT_MIN` | Minimum number of employees | 5001 | | `EMPLOYEE_COUNT_MAX` | Maximum number of employees | 10000 | | `EMPLOYEE_COUNT_RANGE` | Range of employee count | 5001 to 10000 | | `EMPLOYEE_PROFILES_ON_LINKEDIN` | Number of employee profiles in LinkedIn | 7196 | | `REVENUE_MIN` | Minimum revenue of the organization | 1000000 | | `REVENUE_MAX` | Maximum revenue of the organization | 9999999 | | `REVENUE_RANGE` | Range of the organization's revenue | `$50M to <$100M` | | `LINKEDIN_FOLLOWERS` | Number of LinkedIn followers for the organization | 2039 | ### Addresses | Field | Description | Example | | - | - | - | | `LOCATION_STREET` | Street address of the organization's location | 2440 Sand Hill Rd 300 | | `LOCATION_CITY` | City where the organization is located | New York | | `LOCATION_STATE_NAME` | State name of the organization's location | California | | `LOCATION_STATE_CODE` | State code of the organization's location | CA | | `LOCATION_POSTCODE` | Postal code of the organization's location | 94612 | | `LOCATION_COUNTRY_NAME` | Country name of the organization's location | United States | | `LOCATION_COUNTRY_CODE` | Country code of the organization's location | US | | `LOCATION_COUNTRY_REGION` | Region of the organization's location | NORAM | | `LOCATION_CONTINENT` | Continent of the organization's location | North America | | `LOCATION_IS_PRIMARY` | Indicates if the location is the primary one | TRUE | | `LOCATION_COUNT` | Number of locations associated with the organization | 1 | | `HEADQUARTERS_STREET` | Street address of the organization HQ | 1 Infinite Loop | | `HEADQUARTERS_CITY` | City where the organization's HQ is located | New York | | `HEADQUARTERS_STATE_NAME` | State where the organization's HQ is located | NY | | `HEADQUARTERS_STATE_CODE` | State code where the organization HQ is located | CA | | `HEADQUARTERS_POSTCODE` | Postal code of the organization HQ | 95014 | | `HEADQUARTERS_COUNTRY_NAME` | Country where the organization's HQ is located | United States | | `HEADQUARTERS_COUNTRY_CODE` | Country code where the organization HQ is located | US | | `HEADQUARTERS_COUNTRY_REGION` | Global region where the organization HQ is located | NORAM | | `HEADQUARTERS_CONTINENT` | Continent where the organization HQ is located | North America | > [!NOTE] > > **Location vs. Headquarters:** For small organizations, location and HQ fields may point to the same address. For organizations with multiple branches, the `LOCATION_*` fields represent one of the locations listed on the organization's LinkedIn page, while `HEADQUARTERS_*` fields are derived from the headquarters information on the LinkedIn organization page. ### Metadata | Field | Description | Example | | - | - | - | | `UPDATED_AT` | The organization record's last update date | 2024-01-15 | ## Joining this table Join `org_latest` to `per_latest` on `RBID` = `RBID_ORG` to attach firmographics to people. Join to `insights_latest` on `RBID` = `RBID_ORG` to attach buying signals and technographics. ### Organization + Person (accounts with decision-makers) ```sql theme={null} SELECT co.RBID, co.COMPANY_NAME, co.DOMAIN, co.INDUSTRY_LINKEDIN, co.EMPLOYEE_COUNT_MAX, COUNT(c.RBID) AS contact_count FROM RELEASE.ORG_LATEST co JOIN RELEASE.PER_LATEST c ON c.RBID_ORG = co.RBID WHERE co.INDUSTRY_LINKEDIN LIKE '%Software%' AND co.EMPLOYEE_COUNT_MAX BETWEEN 50 AND 500 GROUP BY co.RBID, co.COMPANY_NAME, co.DOMAIN, co.INDUSTRY_LINKEDIN, co.EMPLOYEE_COUNT_MAX HAVING COUNT(c.RBID) >= 1; ``` ### Organization + Insights (firmographics + signals) ```sql theme={null} SELECT co.COMPANY_NAME, co.DOMAIN, co.INDUSTRY_LINKEDIN, co.EMPLOYEE_COUNT_MAX, i.CRM_TECH_ORG, i.SALES_ROLE_COUNT_ORG, i.HAS_CIO_ORG, i.LAST_FUNDING_AMOUNT_ORG FROM RELEASE.ORG_LATEST co LEFT JOIN RELEASE.INSIGHTS_LATEST i ON co.RBID = i.RBID_ORG WHERE co.EMPLOYEE_COUNT_MAX BETWEEN 100 AND 1000; ``` ## How to calculate fill rates Use this pattern to compute fill rates for any field or segment. Replace the sample fields with the columns you care about. ```sql theme={null} SELECT COUNT(*) AS total_records, ROUND(COUNT(DOMAIN) * 100.0 / COUNT(*), 1) AS domain_fill_pct, ROUND(COUNT(INDUSTRY_LINKEDIN) * 100.0 / COUNT(*), 1) AS industry_fill_pct, ROUND(COUNT(EMPLOYEE_COUNT_MAX) * 100.0 / COUNT(*), 1) AS employee_count_fill_pct, ROUND(COUNT(HEADQUARTERS_COUNTRY_NAME) * 100.0 / COUNT(*), 1) AS hq_country_fill_pct FROM RELEASE.ORG_LATEST; ``` ## Sample queries ### Find target accounts by ICP (mid-size software in the US) **What you’re finding:** Organizations that match your ideal customer profile so you can build an account list or sync to a CRM. **Why these fields:** `industry` and `employee_count` define ICP; `revenue_range` adds budget signal. `hq_city` and `hq_state` support territory or regional campaigns. We select only the columns you’d need for account creation or routing. **Logic:** Filter by industry, size band, country, and revenue band. Order by `employee_count` to prioritize larger accounts within the band. ```sql theme={null} SELECT COMPANY_NAME, DOMAIN, INDUSTRY_LINKEDIN, EMPLOYEE_COUNT_MAX, REVENUE_RANGE, HEADQUARTERS_CITY, HEADQUARTERS_STATE_NAME, HEADQUARTERS_COUNTRY_NAME, HEADQUARTERS_COUNTRY_CODE FROM RELEASE.ORG_LATEST WHERE (INDUSTRY_LINKEDIN LIKE '%Software%' OR INDUSTRY_LINKEDIN LIKE '%Information Technology%') AND EMPLOYEE_COUNT_MAX BETWEEN 50 AND 500 AND HEADQUARTERS_COUNTRY_CODE = 'US' AND REVENUE_RANGE IN ('$10M to <$50M') ORDER BY EMPLOYEE_COUNT_MAX DESC NULLS LAST; ``` ### Normalize LinkedIn URN **What you're finding:** The `LINKEDIN_URL_ID` field contains LinkedIn's numeric organization identifier. Some integrations (e.g. LinkedIn Ads, Sales Navigator APIs) require the full URN format (`urn:li:organization:`) rather than the raw ID or URL. **Why these fields:** `LINKEDIN_URL_ID` is the source value; the query constructs the URN by prepending the standard LinkedIn organization URN prefix. Rows without a `LINKEDIN_URL_ID` are excluded. ```sql theme={null} SELECT RBID, COMPANY_NAME, LINKEDIN_URL, LINKEDIN_URL_ID, 'urn:li:organization:' || LINKEDIN_URL_ID AS LINKEDIN_URN FROM RELEASE.ORG_LATEST WHERE LINKEDIN_URL_ID IS NOT NULL; ``` ### Check fill rates for a segment **What you’re finding:** How complete key fields are for a subset (e.g. one industry or region) so you know what to expect when building lists. **Why these fields:** Same as the global fill-rate query, but with a `WHERE` clause so percentages reflect only the segment you care about. ```sql theme={null} SELECT COUNT(*) AS total_records, ROUND(COUNT(DOMAIN) * 100.0 / COUNT(*), 1) AS domain_fill_pct, ROUND(COUNT(INDUSTRY_LINKEDIN) * 100.0 / COUNT(*), 1) AS industry_fill_pct, ROUND(COUNT(EMPLOYEE_COUNT_MAX) * 100.0 / COUNT(*), 1) AS employee_count_fill_pct, ROUND(COUNT(REVENUE_MAX) * 100.0 / COUNT(*), 1) AS revenue_fill_pct FROM RELEASE.ORG_LATEST WHERE HEADQUARTERS_COUNTRY_NAME = 'United States' AND INDUSTRY_LINKEDIN LIKE '%Software%'; ``` # Person Source: https://docs.revenuebase.ai/docs/data-features/data-tables/person Individual person records — verified emails, titles, seniority, direct dials. > [!NOTE] > > The [Data Dictionary](/docs/data-features/data-dictionary) has the most up-to-date field definitions for this table. Use it as your primary reference for column names and descriptions. > [!WARNING] > > **Column names in this table have no `_PER` suffix.** Use field names exactly as listed below — do not append `_PER` to any field when querying `RELEASE.PER_LATEST` directly. The `_PER` suffix appears only in the pre-joined `VELOCITY_*` tables, where it disambiguates person fields after a merge — never in `PER_LATEST` itself. The `person` table contains individual person records with professional contact information and email verification data. This is the primary table for building prospect lists, outbound campaigns, and enrichment workflows. Each row is one person at one organization; if a contact holds multiple current positions, they appear in multiple rows. ## Where the data comes from Person records are built from professional profiles, public sources, and verified email and phone data. RevenueBase continuously verifies email deliverability using its internal email verification system and re-verifies addresses on a regular cadence. Titles, seniority, and department are normalized from raw job titles so you can filter and segment consistently. ## Person counts by region The map below shows current person counts by country. Use it to understand coverage and plan targeting by region. **View interactive map: person counts by country** [RevenueBase person counts by region](https://embed.domo.com/cards/wV5yw) ## Table stats | Metric | Value | | - | - | | **Total records** | See map above; updated with each release | | **Update frequency** | Monthly (new delivery on the 1st of each month) | | **Primary key** | `RBID_PAO` | | **Main foreign key** | `RBID_ORG` → `ORG_LATEST.RBID` | ## Data dictionary For the complete and most current field reference, see the [Data Dictionary](/docs/data-features/data-dictionary). Fill rate is the percentage of rows where a field is non-null. Rates vary by segment (e.g. US and larger organizations often have higher fill rates for phone and seniority). ### Identifiers | Field | Description | Example | | - | - | - | | `RBID` | RevenueBase's unique identification for the person. The RBID stays the same if someone changes their job. | rb-pabq6o2xf | | `RBID_ORG` | RevenueBase's unique identifier for an organization | rb-oab75n3pe | | `RBID_PAO` | RevenueBase's unique identifier for the person at a specific organization. | rb-pabq6o2xf-rb-oab75n3pe | | `LINKEDIN_URL` | The person's linkedin URL | [https://www.linkedin.com/in/simon%c3%a9-burger-ca-sa-0a3a13158](https://www.linkedin.com/in/simon%c3%a9-burger-ca-sa-0a3a13158) | | `LINKEDIN_NUM_ID` | LinkedIn's permanent numeric Member ID (also known as Member Number, LinkedIn ID, or Person ID). Unlike vanity profile URLs, this ID never changes — making it the most reliable key for deduplication and cross-system matching. \~95% fill rate, null values are possible for small amount of profiles | 599793536 | ### Name & demographics | Field | Description | Example | | - | - | - | | `FIRST_NAME` | The person's first name | Marc | | `MIDDLE_NAME` | The person's middle name | F. | | `LAST_NAME` | The person's last name | Rojas | | `FULL_NAME` | The person's full name | Kathryn E. Gibson | | `TITLE_NAME` | The person's name prefix | Dr. | | `SUFFIX_NAME` | The person's name suffix | Ph. D | | `LINKEDIN_HEADLINE` | The person's Linkedin headline | Sales Executive, Rapid Diagnostics, Abbott | | `LINKEDIN_CONNECTIONS_COUNT` | Number of LinkedIn connections the person has | 500 | | `NICKNAME_NAME` | The person's nickname | Mike | | `ABOUT_ME` | Linkedin personal profile about me field | Experienced Transportation Security Officer with a demonstrated history of working in the government administration industry. Skilled in Negotiation, Team Building, Public Speaking, Management, and Marketing. Strong military and protective services professional with a Doctor of Philosophy - PhD focused in Public Service Leadership Emergency Management from Capella University. | ### Professional info | Field | Description | Example | | - | - | - | | `JOB_TITLE` | The person's current job title | Senior Technical Consultant | | `JOB_LEVEL` | The seniority level of the person's job | Manager | | `JOB_FUNCTION` | The department that the person works in. | Information Technology | | `PERSONA` | Classification of person job type by several business areas | Sales Engineer/Solution Architect, Information Technology | | `JOB_DESCRIPTION` | The description of the person's current job | Financial analysts,tax analysts,account payable | | `JOB_IS_CURRENT` | Indicates whether the job is currently active | TRUE | | `JOB_START_DATE` | When the person began their job | 2013-01-01 00:00:00 | | `JOB_COUNT` | The number of jobs a person has had | 4 | | `JOB_END_DATE` | When the person ended their most recent job | 2022-06-01 | | `JOB_ORDER_IN_PROFILE` | Position of this job in the person's LinkedIn profile | 1 | | `LINKEDIN_INDUSTRY` | The Linkedin industry associated with the person's employer | Information Technology & Services | ### Contact information | Field | Description | Example | | - | - | - | | `EMAIL_ADDRESS` | The person's work email address | [some\_valid\_email@somedomain.com](mailto:some_valid_email@somedomain.com) | | `EMAIL_DOMAIN` | The domain of the person's work email address | somedomain.com | | `EMAIL_STATUS` | The verification status of the email. If an email exists in the dataset, it has been verified as valid. | VALID | | `EMAIL_LAST_VERIFIED_AT` | The contact's email last verified timestamp. Timestamp specifically designed to indicate last revalidation of email at RevenueBase side | 2013-01-01 00:00:00 | | `DIRECT_PHONE` | The direct office contact number | +1 612-876-4679 | | `CELLPHONE` | Mobile phone number | +1 352-359-7618 | ### Addresses (contact location) The first set of address fields (`CITY`, `STATE_NAME`, `STATE_CODE`, `COUNTRY_NAME`, `COUNTRY_CODE`, `COUNTRY_REGION`, `CONTINENT`) describes **where the person is located** on their professional profile. The fields prefixed with `JOB_LOCATION_` describe **where the person works from** — usually the office location if they work from an office. These two address sets do not always match: someone might live in Boston, MA and work in Providence, RI. The person's location (the first set) typically has a higher fill rate, so use those fields when you search for people by location. | Field | Description | Example | | - | - | - | | `CITY` | The city where the person lives | Lexington | | `STATE_NAME` | The state/province/region of the country that the person is located in | District of Columbia | | `STATE_CODE` | The abbreviation of the state/province/region of the country that the person is located in | DC | | `COUNTRY_NAME` | The name of the country the person is located in | United States | | `COUNTRY_CODE` | The code for the country the person is located in | US | | `COUNTRY_REGION` | The global region that the person is located in | NORAM | | `CONTINENT` | The continent that the person is located in | North America | | `JOB_LOCATION_CITY` | The city in where the person works | New York | | `JOB_LOCATION_STATE` | Name of State or Province of the country that the person is located | New York | | `JOB_LOCATION_STATE_CODE` | The state/province/region of the country that the person is located in | NY | | `JOB_LOCATION_COUNTRY` | The country name where the person works | South Africa | | `JOB_LOCATION_COUNTRY_CODE` | The country code where the person works | ZA | | `JOB_LOCATION_COUNTRY_REGION` | The geographic region that a contact works in | EMEA | | `JOB_LOCATION_CONTINENT` | The continent where the person works | North America | ### Organization context | Field | Description | Example | | - | - | - | | `JOB_ORG_LINKEDIN_URL` | The organization's LinkedIn URL | [https://www.linkedin.com/company/company\_url](https://www.linkedin.com/company/company_url) | | `COMPANY_NAME` | The organization's name | Meta. Inc | ### Profile enrichments | Field | Description | Example | | - | - | - | | `EDUCATION` | The person's education | \[ \{ ""degree"": ""Bachelor's degree, Biology"", ""end\_date"": ""2003-01-01"", ""organization"": ""Louis Pasteur University Strasbourg"", ""start\_date"": ""1999-01-01"" }, \{ ""degree"": ""Ph.D, Biochemistry"", ""description"": ""Advisor: Daniel Kern Thesis title: New insights in tRNA-dependent asparagine biosynthesis."", ""end\_date"": ""2008-01-01"", ""organization"": ""Molecular and Cellular Biology Institute (IBMC)"", ""start\_date"": ""2004-01-01"" }, \{ ""degree"": ""Master's degree, Biochemistry"", ""description"": ""I discovered a new type of ribonucleoprotein involved in amino acid biosynthesis in bacteria and archea."", ""end\_date"": ""2004-01-01"", ""organization"": ""Louis Pasteur University Strasbourg"", ""start\_date"": ""2003-01-01"" }] | | `CERTIFICATIONS` | Linkedin personal profile certifications | \[ \{ ""authority"": ""Capella University"", ""linkedin\_url"": ""[https://www.linkedin.com/company/capella-university](https://www.linkedin.com/company/capella-university)"", ""name"": ""Doctoral Candidate"", ""start\_date"": ""2021-03-01"" }] | | `LANGUAGES` | The languages spoken | \[ \{ ""language"": ""english"", ""proficiency"": ""native or bilingual proficiency"" }, \{ ""language"": ""german"", ""proficiency"": ""limited working proficiency"" }] | | `SKILLS` | The person's job skills | \[ ""media tours"", ""microsoft office"", ""research"", ""photoshop"", ""photography"", ""media production"", ""social media"", ""microsoft excel"", ""safety training"", ""microsoft word"", ""hostile environment safety"", ""journalism"", ""powerpoint"", ""first aid"", ""public speaking"", ""leadership"" ] | | `INTERESTS` | Linkedin personal profile interests field | \[ ""Playing Music"" ] | | `PATENTS` | Any patents listed on someone's Linkedin profile | \[ \{ ""title"": ""Tagged Credit Profile System For Credit Applicants"", ""url"": ""[https://patents.google.com/patent/US20090327120A1/\&urlhash=H5PF\&trk=public\_profile\_patent-title](https://patents.google.com/patent/US20090327120A1/\&urlhash=H5PF\&trk=public_profile_patent-title)"" }, \{ ""date"": ""2004-07-01"", ""title"": ""On-line Distribution Of Per-use Media With Flexible Purchase Options"", ""url"": ""[http://www.google.com/patents/US20050027616\&urlhash=HU\_b\&trk=public\_profile\_patent-title](http://www.google.com/patents/US20050027616\&urlhash=HU_b\&trk=public_profile_patent-title)"" }] | | `PUBLICATIONS` | Any publications listed on someone's Linkedin profile | \[ \{ ""date"": ""2018-07-01"", ""title"": ""Impact Des Assistantes Humanitaire Sur L'attentisme De Déplace Interne Dela Rdc"" }] | | `WEBSITES` | The person's personal website | `[{"url": "https://www.example.com"}, {"url": "http://personal.blogspot.com/"}]` | | `LOGO_URL` | The person's linkedin profile picture URL | [https://us.cdn.com/ca-sa-0a3a13158](https://us.cdn.com/ca-sa-0a3a13158) | ### Metadata | Field | Description | Example | | - | - | - | | `UPDATED_AT` | The person's last update timestamp. Any field update (except email and phone related fields) will trigger a change in this value. LinkedIn successful profile revalidation (even with no updates) will also update this timestamp | 2013-01-01 00:00:00 | | `REVENUEBASE_CONTACT_VERIFICATION_SUMMARY` | Verification Summary showing details on a record observed specifing when and how it was verified | Verified by RevenueBase \| Experience last observed on LinkedIn on September 7, 2025: Proposal Manager at Metaphase \| Profile: linkedin.com/in/jamie-gregory-28878356 \| Email last verified on October 15, 2025 via RevenueBase’s Email Verification Tool \| Next verification scheduled: November, 2025 \| Learn more at [https://revenuebase.ai/verified-by-revenuebase](https://revenuebase.ai/verified-by-revenuebase) | ## Understanding verification fields All emails in the dataset have been verified as valid by RevenueBase's email verification system. If an email address exists in the dataset, it means it has passed verification and is considered deliverable. > [!TIP] > > For the safest outbound sends, filter on `EMAIL_LAST_VERIFIED_AT >= DATEADD(day, -60, CURRENT_DATE())` to prioritize recently verified addresses. Since all emails in the dataset are valid, you don't need to filter on `EMAIL_STATUS`. ## Joining this table Join `PER_LATEST` to `ORG_LATEST` on `RBID_ORG` = `RBID` when you need full firmographic or HQ address data. Join to `insights_latest` on `RBID_ORG` = `RBID_ORG` when you need organization-level insight or intent signals. ### Person + Organization (full organization attributes) ```sql theme={null} SELECT c.RBID, c.FIRST_NAME, c.LAST_NAME, c.EMAIL_ADDRESS, c.JOB_TITLE, co.COMPANY_NAME, co.INDUSTRY_LINKEDIN, co.EMPLOYEE_COUNT_MAX, co.HEADQUARTERS_CITY, co.HEADQUARTERS_COUNTRY_NAME FROM RELEASE.PER_LATEST c JOIN RELEASE.ORG_LATEST co ON c.RBID_ORG = co.RBID WHERE co.EMPLOYEE_COUNT_MAX BETWEEN 100 AND 1000; ``` ## How to calculate fill rates Run a query that counts non-null values and divides by total rows. Use this pattern to inspect any field or segment. ```sql theme={null} SELECT COUNT(*) AS total_records, ROUND(COUNT(EMAIL_ADDRESS) * 100.0 / COUNT(*), 1) AS email_fill_pct, ROUND(COUNT(CELLPHONE) * 100.0 / COUNT(*), 1) AS phone_fill_pct, ROUND(COUNT(JOB_TITLE) * 100.0 / COUNT(*), 1) AS title_fill_pct, ROUND(COUNT(JOB_FUNCTION) * 100.0 / COUNT(*), 1) AS department_fill_pct FROM RELEASE.PER_LATEST; ``` ## Sample queries ### Build a prospect list (VP+ in engineering or sales at mid-size software organizations) **What you’re finding:** Decision-makers and influencers at software organizations in a size band that fits your ICP. **Why these fields:** All emails in the dataset are verified as valid. `EMAIL_LAST_VERIFIED_AT` helps prioritize recently verified addresses. `JOB_LEVEL` and `JOB_FUNCTION` narrow to buying roles. `LINKEDIN_INDUSTRY_ORG` and `EMPLOYEE_COUNT_MAX` (denormalized) avoid a join while filtering by ICP. **Logic:** Restrict to verified emails, seniority in C-Suite/VP/Director, departments that typically own tooling decisions, and a single industry + employee range. Order by `EMAIL_LAST_VERIFIED_AT` so the freshest data appears first. ```sql theme={null} SELECT PER.FIRST_NAME, PER.LAST_NAME, PER.EMAIL_ADDRESS, PER.JOB_TITLE, PER.JOB_LEVEL, PER.COMPANY_NAME, ORG.EMPLOYEE_COUNT_MAX FROM RELEASE.PER_LATEST AS PER INNER JOIN RELEASE.ORG_LATEST AS ORG ON PER.RBID_ORG = ORG.RBID WHERE JOB_LEVEL IN ('C-Team', 'VP', 'Director') AND JOB_FUNCTION IN ('Engineering', 'Sales') AND LINKEDIN_INDUSTRY LIKE '%Software%' AND EMPLOYEE_COUNT_MAX BETWEEN 100 AND 1000 ORDER BY EMAIL_LAST_VERIFIED_AT DESC LIMIT 500; ``` ### Check fill rates for a segment **What you’re finding:** How complete key fields are for a subset (e.g. one industry or country) so you can set expectations for list build size and which filters to use. **Why these fields:** Same as the global fill-rate query, but run with a `WHERE` clause so rates reflect only the segment you care about. ```sql theme={null} SELECT COUNT(*) AS total_records, ROUND(COUNT(EMAIL_ADDRESS) * 100.0 / COUNT(*), 1) AS email_fill_pct, ROUND(COUNT(CELLPHONE) * 100.0 / COUNT(*), 1) AS phone_fill_pct, ROUND(COUNT(JOB_TITLE) * 100.0 / COUNT(*), 1) AS title_fill_pct FROM RELEASE.PER_LATEST WHERE LINKEDIN_INDUSTRY LIKE '%Software%' AND COUNTRY_NAME = 'United States'; ``` # Person + Organization Source: https://docs.revenuebase.ai/docs/data-features/pre-joined-tables/person-organization Contacts combined with organization firmographics in a single flat table. > [!NOTE] > > The [Data Dictionary](/docs/data-features/data-dictionary) has the most up-to-date field definitions for this table. Use it as your primary reference for column names and descriptions. ## What's included `VELOCITY_BASE_UNLIMITED` is a pre-joined table that combines [Person](/docs/data-features/data-tables/person) and [Organization](/docs/data-features/data-tables/organization) in one view. | Metric | Value | | - | - | | **Total records** | One row per contact (see [Person](/docs/data-features/data-tables/person) for counts) | | **Primary key** | `RBID_PAO` | | **Source tables** | `PER_LATEST` LEFT JOIN `ORG_LATEST` on `RBID_ORG` | ## Data dictionary For the complete and most current field reference, see the [Data Dictionary](/docs/data-features/data-dictionary). Field names, descriptions, and examples are sourced from the [Person](/docs/data-features/data-tables/person) and [Organization](/docs/data-features/data-tables/organization) table pages. This pre-joined table includes all person fields (suffix `_PER`) and all organization fields (suffix `_ORG`). ### Identifiers | Field | Description | Example | | - | - | - | | `RBID_PER` | RevenueBase's unique identification for the person. The RBID stays the same if someone changes their job. | `rb-pabq6o2xf` | | `RBID_ORG` | RevenueBase's unique identifier for a company | `rb-oab75n3pe` | | `RBID_PAO` | RevenueBase's unique identifier for the person at a specific company. | Concatenates `RBID_PER` with `RBID_ORG`: `rb-pabq6o2xf-rb-oab75n3pe` | ### Person fields | Field | Description | Example | | - | - | - | | `FIRST_NAME_PER` | The person's first name | Marc | | `LAST_NAME_PER` | The person's last name | Rojas | | `FULL_NAME_PER` | The person's full name | Kathryn E. Gibson | | `MIDDLE_NAME_PER` | The person's middle name | F. | | `TITLE_NAME_PER` | The person's name prefix | Dr. | | `SUFFIX_NAME_PER` | The person's name suffix | Ph. D | | `EMAIL_ADDRESS_PER` | The person's work email address | [kcollins@fortmckaygroup.com](mailto:kcollins@fortmckaygroup.com) | | `EMAIL_DOMAIN_PER` | The domain of the person's work email address | fortmckaygroup.com | | `EMAIL_STATUS_PER` | The verification status of the email. | VALID, NOT AVAILABLE, LIMITED INFO | | `EMAIL_LAST_VERIFIED_AT_PER` | The contact's email last verified timestamp. Timestamp specifically designed to indicate last revalidation of email at RevenueBase side | 2013-01-01 00:00:00 | | `HAS_EMAIL_PER` | If the person has a valid email | true | | `DIRECT_PHONE_PER` | The direct office contact number | +1 612-876-4679 | | `CELLPHONE_PER` | Mobile phone number | +1 352-359-7618 | | `HAS_PHONE_PER` | If the person has a valid direct phone number | true | | `HAS_CELLPHONE_PER` | If the person has a valid mobile phone number | true | | `JOB_TITLE_PER` | The person's current job title | Senior Technical Consultant | | `JOB_LEVEL_PER` | The seniority level of the person's job | Manager | | `JOB_FUNCTION_PER` | The department that the person works in. | Information Technology | | `JOB_DESCRIPTION_PER` | The description of the person's current job | Financial analysts,tax analysts,account payable | | `JOB_IS_CURRENT_PER` | Indicates whether the job is currently active | TRUE | | `JOB_START_DATE_PER` | When the person began their job | 2013-01-01 00:00:00 | | `JOB_COUNT_PER` | The number of jobs a person has had | 4 | | `JOB_LOCATION_CITY_PER` | The city in where the person works | New York | | `JOB_LOCATION_STATE_PER` | Name of State or Province of the country that the person is located | New York | | `JOB_LOCATION_COUNTRY_PER` | The country name where the person works | South Africa | | `JOB_LOCATION_COUNTRY_CODE_PER` | The country code where the person works | ZA | | `JOB_LOCATION_CONTINENT_PER` | The continent where the person works | North America | | `JOB_LOCATION_COUNTRY_REGION_PER` | The geographic region that a contact works in | EMEA | | `CITY_PER` | The city where the person lives | Lexington | | `STATE_NAME_PER` | The state/province/region of the country that the person is located in | District of Columbia | | `STATE_CODE_PER` | The abbreviation of the state/province/region of the country that the person is located in | DC | | `COUNTRY_NAME_PER` | The name of the country the person is located in | United States | | `COUNTRY_CODE_PER` | The code for the country the person is located in | US | | `CONTINENT_PER` | The continent that the person is located in | North America | | `COUNTRY_REGION_PER` | The global region that the person is located in | NORAM | | `LINKEDIN_URL_PER` | The person's linkedin URL | [https://www.linkedin.com/in/simon%c3%a9-burger-ca-sa-0a3a13158](https://www.linkedin.com/in/simon%c3%a9-burger-ca-sa-0a3a13158) | | `LINKEDIN_HEADLINE_PER` | The person's Linkedin headline | Sales Executive, Rapid Diagnostics, Abbott | | `LINKEDIN_INDUSTRY_PER` | The Linkedin industry associated with the person's employer | Information Technology & Services | | `LINKEDIN_CONNECTIONS_COUNT_PER` | The number of LinkedIn connections the person has | 500 | | `LOGO_URL` | The person's linkedin profile picture URL | [https://us.cdn.com/ca-sa-0a3a13158](https://us.cdn.com/ca-sa-0a3a13158) | | `ABOUT_ME_PER` | Linkedin personal profile about me field | Experienced Transportation Security Officer with a demonstrated history of working in the government administration industry. Skilled in Negotiation, Team Building, Public Speaking, Management, and Marketing. Strong military and protective services professional with a Doctor of Philosophy - PhD focused in Public Service Leadership Emergency Management from Capella University. | | `EDUCATION_PER` | The person's education | \[ \{ ""degree"": ""Bachelor's degree, Biology"", ""end\_date"": ""2003-01-01"", ""organization"": ""Louis Pasteur University Strasbourg"", ""start\_date"": ""1999-01-01"" }, \{ ""degree"": ""Ph.D, Biochemistry"", ""description"": ""Advisor: Daniel Kern Thesis title: New insights in tRNA-dependent asparagine biosynthesis."", ""end\_date"": ""2008-01-01"", ""organization"": ""Molecular and Cellular Biology Institute (IBMC)"", ""start\_date"": ""2004-01-01"" }, \{ ""degree"": ""Master's degree, Biochemistry"", ""description"": ""I discovered a new type of ribonucleoprotein involved in amino acid biosynthesis in bacteria and archea."", ""end\_date"": ""2004-01-01"", ""organization"": ""Louis Pasteur University Strasbourg"", ""start\_date"": ""2003-01-01"" }] | | `CERTIFICATIONS_PER` | Linkedin personal profile certifications | \[ \{ ""authority"": ""Capella University"", ""linkedin\_url"": ""[https://www.linkedin.com/company/capella-university](https://www.linkedin.com/company/capella-university)"", ""name"": ""Doctoral Candidate"", ""start\_date"": ""2021-03-01"" }] | | `SKILLS_PER` | The person's job skills | \[ ""media tours"", ""microsoft office"", ""research"", ""photoshop"", ""photography"", ""media production"", ""social media"", ""microsoft excel"", ""safety training"", ""microsoft word"", ""hostile environment safety"", ""journalism"", ""powerpoint"", ""first aid"", ""public speaking"", ""leadership"" ] | | `LANGUAGES_PER` | The languages spoken | \[ \{ ""language"": ""english"", ""proficiency"": ""native or bilingual proficiency"" }, \{ ""language"": ""german"", ""proficiency"": ""limited working proficiency"" }] | | `INTERESTS_PER` | Linkedin personal profile interests field | \[ ""Playing Music"" ] | | `PATENTS_PER` | Any patents listed on someone's Linkedin profile | \[ \{ ""title"": ""Tagged Credit Profile System For Credit Applicants"", ""url"": ""[https://patents.google.com/patent/US20090327120A1/\&urlhash=H5PF\&trk=public\_profile\_patent-title](https://patents.google.com/patent/US20090327120A1/\&urlhash=H5PF\&trk=public_profile_patent-title)"" }, \{ ""date"": ""2004-07-01"", ""title"": ""On-line Distribution Of Per-use Media With Flexible Purchase Options"", ""url"": ""[http://www.google.com/patents/US20050027616\&urlhash=HU\_b\&trk=public\_profile\_patent-title](http://www.google.com/patents/US20050027616\&urlhash=HU_b\&trk=public_profile_patent-title)"" }] | | `PUBLICATIONS_PER` | Any publications listed on someone's Linkedin profile | \[ \{ ""date"": ""2018-07-01"", ""title"": ""Impact Des Assistantes Humanitaire Sur L'attentisme De Déplace Interne Dela Rdc"" }] | | `PERSONA_PER` | Classification of person job type by several business areas | Sales Engineer/Solution Architect, Information Technology | | `WEBSITES_PER` | The contact's personal website | \[ \{ ""url"": ""[http://www.dollerhide.com](http://www.dollerhide.com)"" }, \{ ""url"": ""[http://dollerhide.blogspot.com/](http://dollerhide.blogspot.com/)"" } ] | | `UPDATED_AT_PER` | The contact's last update timestamp. Any field update (except email and phone related fields) will trigger a change in this value. LinkedIn successful profile revalidation (even with no updates) will also update this timestamp | 2013-01-01 00:00:00 | | `REVENUEBASE_CONTACT_VERIFICATION_SUMMARY` | Verification Summary showing details on a record observed specifying when and how it was verified | Verified by RevenueBase \| Experience last observed on LinkedIn on September 7, 2025: Proposal Manager at Metaphase \| Profile: linkedin.com/in/jamie-gregory-28878356 \| Email last verified on October 15, 2025 via RevenueBase's Email Verification Tool \| Next verification scheduled: November, 2025 \| Learn more at [https://revenuebase.ai/verified-by-revenuebase](https://revenuebase.ai/verified-by-revenuebase) | ### Company fields | Field | Description | Example | | - | - | - | | `COMPANY_NAME_ORG` | Name of the organization | Dell Technologies | | `DOMAIN_ORG` | Domain of the company's website | fsiservices.com | | `WEBSITE_ORG` | Company URL | [https://www.fsiservices.com](https://www.fsiservices.com) | | `ABOUT_US_ORG` | Description of the company | Upstream Fullvision is a full service design firm in Honolulu Hawaii. Specializing in homes and small business design, 3D rendering/virtual tour, graphic design and beyond. Upstream Fullvision will provide the best service to turn your concept into reality. | | `FOUNDED_ORG` | Year of the company's founding | 1997 | | `COMPANY_ENTITY_TYPE` | Legal entity type of the company | Privately Held | | `COMPANY_LEGAL_TYPE` | Legal type of the company | \[ ""Corporation"" ] | | `COMPANY_NAME_LANGUAGE` | The language the name of the organization is written | en | | `COMPANY_HEADLINE` | Company tagline or headline | Empowering businesses with data | | `EMPLOYEE_COUNT_MAX` | Maximum number of employees | 10000 | | `EMPLOYEE_COUNT_MIN` | Minimum number of employees | 5001 | | `EMPLOYEE_COUNT_RANGE_ORG` | Range of employee count | 5001 to 10000 | | `EMPLOYEE_PROFILES_ON_LINKEDIN_ORG` | Number of employee profiles in LinkedIn | 7196 | | `INDUSTRY_LINKEDIN_ORG` | Industry description from LinkedIn | \[ ""Software Development"" ] | | `INDUSTRY_NAICS_CODE_ORG` | NAICS Code | \[ ""484121"", ""541512"", ""541511"", ""561499"" ] | | `INDUSTRY_NAICS_DESCRIPTION_ORG` | NAICS Description | \[ ""General Freight Trucking, Long-Distance, Truckload"", ""Computer Systems Design Services"", ""Custom Computer Programming Services"", ""All Other Business Support Services"" ] | | `INDUSTRY_SIC_CODE_ORG` | Standard Industrial Classification code | \[ ""7373"" ] | | `INDUSTRY_SIC_DESCRIPTION_ORG` | Standard Industrial classification description | \[ ""Computer systems design"" ] | | `IS_WEBSITE_FOR_SALE_ORG` | Indicates if the website is listed for sale | FALSE | | `LINKEDIN_URL_ORG` | LinkedIn URL for the company | [https://www.linkedin.com/company/champify-data](https://www.linkedin.com/company/champify-data) | | `LOGO_URL_ORG` | Company logo URL | [https://media.licdn.com/dms/image/C4D0BAQHcm](https://media.licdn.com/dms/image/C4D0BAQHcm)... | | `SPECIALTIES_ORG` | Specialties or key areas of focus of the company | \[ ""technology"", ""education and implementation"", ""data synchornization"", ""product data management"", ""advisory services"", ""innovation"", ""data quality analytics"" ] | | `REVENUE_MAX` | Maximum revenue of the company | 9999999 | | `REVENUE_MIN` | Minimum revenue of the company | 1000000 | | `REVENUE_RANGE_ORG` | Range of the company's revenue | `$50M to <$100M` | | `PHONE_ORG` | Contact phone number for the company | +1 972-577-0000 | | `STREET_ORG` | Street address of the company | 2440 Sand Hill Rd 300 | | `CITY_ORG` | City where the company is located | New York | | `STATE_NAME_ORG` | State/province where the company is located | California | | `STATE_CODE_ORG` | State/province code where the company is located | CA | | `COUNTRY_NAME_ORG` | Country where the company is located | United States | | `COUNTRY_CODE_ORG` | Country code where the company is located | US | | `POSTCODE_ORG` | Postal code of the company | 94612 | | `COUNTRY_REGION_ORG` | Global region where the company is located | NORAM | | `LOCATION_STREET_PER` | Street address of the company location | 2440 Sand Hill Rd 300 | | `LOCATION_STATE_NAME_PER` | State name of the company location | California | | `LOCATION_STATE_CODE_PER` | State code of the company location | CA | | `LOCATION_POSTCODE_PER` | Postal code of the company location | 94612 | | `LOCATION_COUNTRY_NAME_PER` | Country name of the company location | United States | | `LOCATION_COUNTRY_CODE_PER` | Country code of the location | US | | `LOCATION_COUNTRY_REGION_PER` | Region of the company location | NORAM | | `LOCATION_CONTINENT_ORG` | Continent of the company location | North America | | `LOCATION_COUNT_ORG` | Number of locations associated with the company | 1 | | `HEADQUARTERS_CITY_ORG` | City where the company HQ is located | New York | | `HEADQUARTERS_STATE_NAME_ORG` | State where the company HQ is located | NY | | `HEADQUARTERS_COUNTRY_NAME_ORG` | Country where the company HQ is located | United States | > [!NOTE] > > Since this is a LEFT JOIN from contacts, every contact appears even if they don't have a matched company. Company fields will be NULL for unmatched contacts. ## Example queries ### Prospect list — no joins needed ```sql theme={null} SELECT FIRST_NAME_PER, LAST_NAME_PER, EMAIL_ADDRESS_PER, JOB_TITLE_PER, COMPANY_NAME_ORG, INDUSTRY_LINKEDIN_ORG, EMPLOYEE_COUNT_MAX, HEADQUARTERS_STATE_NAME_ORG FROM RELEASE.VELOCITY_BASE_UNLIMITED_LATEST WHERE JOB_LEVEL_PER IN ('VP', 'Director', 'C-Suite') AND INDUSTRY_LINKEDIN_ORG LIKE '%Software%' AND EMPLOYEE_COUNT_MAX BETWEEN 100 AND 1000 AND HEADQUARTERS_COUNTRY_NAME_ORG = 'United States' ORDER BY EMAIL_LAST_VERIFIED_AT_PER DESC LIMIT 500; ``` ### Export for a campaign ```sql theme={null} SELECT FIRST_NAME_PER, LAST_NAME_PER, EMAIL_ADDRESS_PER, JOB_TITLE_PER, COMPANY_NAME_ORG, EMPLOYEE_COUNT_RANGE_ORG, INDUSTRY_LINKEDIN_ORG, HEADQUARTERS_CITY_ORG, HEADQUARTERS_STATE_NAME_ORG FROM RELEASE.VELOCITY_BASE_UNLIMITED_LATEST WHERE JOB_FUNCTION_PER = 'Marketing' AND EMPLOYEE_COUNT_MAX >= 200 AND EMAIL_LAST_VERIFIED_AT_PER >= DATEADD(day, -60, CURRENT_DATE()) ORDER BY COMPANY_NAME_ORG, LAST_NAME_PER; ``` # Person + Organization + Insights Source: https://docs.revenuebase.ai/docs/data-features/pre-joined-tables/person-organization-insight Pre-joined view of person, organization, and insights > [!NOTE] > > The [Data Dictionary](/docs/data-features/data-dictionary) has the most up-to-date field definitions for this table. Use it as your primary reference for column names and descriptions. ## What's included `VELOCITY_ENHANCED_UNLIMITED` is a pre-joined table that combines [Person](/docs/data-features/data-tables/person), [Organization](/docs/data-features/data-tables/organization), and [Insights](/docs/data-features/data-tables/insight) in one view. Use this view when you need contact, company, and company-level insight (e.g., technographics, hiring signals) columns in a single query. No need to join the three base tables yourself — the view is maintained for you. Note that all insights are company-level only. ## Data dictionary For the complete and most current field reference, see the [Data Dictionary](/docs/data-features/data-dictionary). Field names, descriptions, and examples are sourced from the [Person](/docs/data-features/data-tables/person), [Organization](/docs/data-features/data-tables/organization), and [Insight](/docs/data-features/data-tables/insight) table pages. This pre-joined table includes all person fields (suffix `_PER`), all company fields (suffix `_ORG` from Companies category), and all insight fields (suffix `_ORG` from Company Insights category). ### Identifiers | Field | Description | Example | | - | - | - | | `RBID_PER` | RevenueBase's unique identification for the person. The RBID stays the same if someone changes their job. | `rb-pabq6o2xf` | | `RBID_ORG` | RevenueBase's unique identifier for a company | `rb-oab75n3pe` | | `RBID_PAO` | RevenueBase's unique identifier for the person at a specific company. | Concatenates `RBID_PER` with `RBID_ORG`: `rb-pabq6o2xf-rb-oab75n3pe` | ### Key person fields | Field | Description | Example | | - | - | - | | `FIRST_NAME_PER` | The person's first name | Marc | | `LAST_NAME_PER` | The person's last name | Rojas | | `FULL_NAME_PER` | The person's full name | Kathryn E. Gibson | | `EMAIL_ADDRESS_PER` | The person's work email address | [kcollins@fortmckaygroup.com](mailto:kcollins@fortmckaygroup.com) | | `JOB_TITLE_PER` | The person's current job title | Senior Technical Consultant | | `JOB_LEVEL_PER` | The seniority level of the person's job | Manager | | `JOB_FUNCTION_PER` | The department that the person works in. | Information Technology | > [!NOTE] > > For the complete list of person fields, see [Person + Organization](/docs/data-features/pre-joined-tables/person-organization) documentation. This table includes all person fields with `_PER` suffix. ### Key company fields | Field | Description | Example | | - | - | - | | `COMPANY_NAME_ORG` | Name of the organization | Dell Technologies | | `DOMAIN_ORG` | Domain of the company's website | fsiservices.com | | `EMPLOYEE_COUNT_MAX` | Maximum number of employees | 10000 | | `EMPLOYEE_COUNT_RANGE_ORG` | Range of employee count | 5001 to 10000 | | `INDUSTRY_LINKEDIN_ORG` | Industry description from LinkedIn | \[ ""Software Development"" ] | | `REVENUE_RANGE_ORG` | Range of the company's revenue | `$50M to <$100M` | | `HEADQUARTERS_CITY_ORG` | City where the company HQ is located | New York | | `HEADQUARTERS_STATE_NAME_ORG` | State where the company HQ is located | NY | | `HEADQUARTERS_COUNTRY_NAME_ORG` | Country where the company HQ is located | United States | > [!NOTE] > > For the complete list of company fields, see [Person + Organization](/docs/data-features/pre-joined-tables/person-organization) documentation. This table includes all company fields with `_ORG` suffix from the Companies category. ### Insight fields | Field | Description | Example | | - | - | - | | `ABM_TECH_ORG` | There is evidence of particular activity based management technologies in use | 6Sense;Demandbase;Uberflip;Terminus;Engagio;Triblio | | `ANALYTICS_TECH_ORG` | There is evidence of particular analytics technologies in use | Tableau;Power BI;Segment;Looker;Qlik | | `CRM_TECH_ORG` | There is evidence of particular customer relationship management technologies in use | Salesforce CRM;Hubspot;Microsoft Dynamics;Zoho;Pipedrive CRM;SugarCRM | | `SALES_ROLE_COUNT_ORG` | Number of people with sales titles associated with the organization | 4 | | `SALES_OPEN_ROLES_COUNT_ORG` | Number of open job postings for sales positions at the organization | 6 | | `LAST_FUNDING_AMOUNT_ORG` | If the organization received funding, the last funding amount | 15400000 | | `LAST_FUNDING_DATE_ORG` | If the organization received funding, the last funding date | 2022-09-22 | | `LAST_FUNDING_TYPE_ORG` | If the business received funding, the last funding type | Post-IPO Equity | | `TOTAL_FUNDING_AMOUNT_ORG` | If the organization received funding, the total amount of funding to date | 175500000 | | `EMPLOYEE_ON_LINKEDIN_GROWTH_RATE_ORG` | Percentage of latest month's employee growth rate as a percentage. | 4 | | `HAS_CIO_ORG` | If the business has a chief information officer | Yes | | `HAS_CISO_ORG` | If the business has a chief information security officer | Yes | > [!NOTE] > > For the complete list of insight fields, see [Insight](/docs/data-features/data-tables/insight) documentation. This table includes all insight fields with `_ORG` suffix from the Company Insights category. ### Example queries #### Find contacts at companies using specific technologies ```sql theme={null} SELECT RBID_PER, FIRST_NAME_PER, LAST_NAME_PER, EMAIL_ADDRESS_PER, JOB_TITLE_PER, COMPANY_NAME_ORG, CRM_TECH_ORG, SALES_ROLE_COUNT_ORG FROM RELEASE.VELOCITY_ENHANCED_UNLIMITED_LATEST WHERE CRM_TECH_ORG IS NOT NULL AND SALES_ROLE_COUNT_ORG > 0 LIMIT 100; ``` #### Find contacts at companies with recent funding ```sql theme={null} SELECT FIRST_NAME_PER, LAST_NAME_PER, EMAIL_ADDRESS_PER, COMPANY_NAME_ORG, LAST_FUNDING_AMOUNT_ORG, LAST_FUNDING_DATE_ORG, LAST_FUNDING_TYPE_ORG FROM RELEASE.VELOCITY_ENHANCED_UNLIMITED_LATEST WHERE LAST_FUNDING_DATE_ORG >= DATEADD(month, -12, CURRENT_DATE()) AND JOB_LEVEL_PER IN ('VP', 'Director', 'C-Suite') ORDER BY LAST_FUNDING_DATE_ORG DESC; ``` ### See also * [Person + Organization](/docs/data-features/pre-joined-tables/person-organization) when you don't need insight fields. * [Pre-Joined Tables overview](/docs/data-features/pre-joined-tables/pre-joined-overview) for when to use each view. * [Person](/docs/data-features/data-tables/person), [Organization](/docs/data-features/data-tables/organization), and [Insight](/docs/data-features/data-tables/insight) for the complete field reference. # Pre-Joined Tables Source: https://docs.revenuebase.ai/docs/data-features/pre-joined-tables/pre-joined-overview Pre-joined RevenueBase tables combine Person, Organization, and Insight into a single view — query B2B contacts, firmographics, and signals without writing SQL joins. > [!NOTE] > > The [Data Dictionary](/docs/data-features/data-dictionary) has the most up-to-date field definitions for all RevenueBase tables. Use it as your primary reference for column names and descriptions. Pre-Joined Tables are ready-made views that combine multiple base tables (e.g., Person/Contacts, Companies, Insight) so you can query them without writing joins yourself. Use them when you need a single table that already links people, companies, and optional insight data. ### Benefits of pre-joined tables * **Fewer joins** — Query one table instead of joining tables manually. * **Consistent keys** — Join keys and relationships are defined and documented for each pre-joined view. * **Easier analytics** — Start with [Person + Organization](/docs/data-features/pre-joined-tables/person-organization) or [Person + Organization + Insight](/docs/data-features/pre-joined-tables/person-organization-insight) and filter or aggregate as needed. ### Available pre-joined views | Table Name | View | Description | | - | - | - | | `VELOCITY_BASE_UNLIMITED_LATEST` | [Person + Organization](/docs/data-features/pre-joined-tables/person-organization) | Contacts joined to Organization (one row per contact). | | `VELOCITY_ENHANCED_UNLIMITED_LATEST` | [Person + Organization + Insight](/docs/data-features/pre-joined-tables/person-organization-insight) | Contacts, Organization, and Insight in one view. | ### When to use which * **Person + Organization** — When you need contact and organization attributes together (e.g., contact email + organization name) without insight fields. * **Person + Organization + Insight** — When you also need insight or score fields on the same row. For custom joins or other combinations, use the base tables and [Joining tables](/docs/data-feeds/joining-overview). # Joining Tables Overview Source: https://docs.revenuebase.ai/docs/data-feeds/joining-overview How to join RevenueBase Person, Organization, Insights, and Historical Experience tables using RBID keys — entity relationships and SQL join patterns for B2B data. RevenueBase data is organized into separate tables that link together through shared keys. This page explains how the tables relate and how to join them correctly. ## Entity relationship **Key relationships:** * **Person** joins to **Organization** via `RBID_ORG = RBID` (many-to-one) * **Insights** joins to **Organization** via `RBID_ORG = RBID` (one-to-one, org-level only) * **Person** can join to **Insight** via `RBID_ORG = RBID_ORG` (many-to-one, gets org-level insights) * **Historical Experience** joins to **Person** via `linkedin_url` (one-to-one) ```mermaid theme={null} erDiagram ORGANIZATION ||--o{ PERSON : "RBID = RBID_ORG" ORGANIZATION ||--|| INSIGHT : "RBID = RBID_ORG" PERSON ||--|| HISTORICAL_EXPERIENCE : "linkedin_url" PERSON { string RBID_ORG string linkedin_url } ORGANIZATION { string RBID } INSIGHT { string RBID_ORG } HISTORICAL_EXPERIENCE { string linkedin_url } ``` ## Join keys reference | From table | To table | Join key | Join type | Notes | | - | - | - | - | - | | `per_latest` | `org_latest` | `per.RBID_ORG = org.RBID` | LEFT JOIN | Not all contacts have an organization | | `org_latest` | `insights_latest` | `org.RBID = insights.RBID_ORG` | LEFT JOIN | All insights are org-level | | `per_latest` | `insights_latest` | `per.RBID_ORG = insights.RBID_ORG` | LEFT JOIN | Get org-level insights for contacts | | `per_latest` | `historical_experience_latest` | `per.LINKEDIN_URL = he.linkedin_url` | LEFT JOIN | One profile per LinkedIn URL | ## Common join patterns ### Contacts with organization info The most common join — enriching contacts with their organization's firmographic data: ```sql theme={null} SELECT c.FIRST_NAME, c.LAST_NAME, c.EMAIL_ADDRESS, c.JOB_TITLE, co.COMPANY_NAME, co.INDUSTRY_LINKEDIN, co.EMPLOYEE_COUNT_MAX, co.LOCATION_CITY, co.LOCATION_STATE_NAME FROM RELEASE.PER_LATEST c LEFT JOIN RELEASE.ORG_LATEST co ON c.RBID_ORG = co.RBID WHERE c.EMAIL_ADDRESS IS NOT NULL; ``` > [!NOTE] > > Use `LEFT JOIN` (not `INNER JOIN`) if you want to include contacts that don't have an organization record. Use `INNER JOIN` if you only want contacts with a known organization. ### Contacts with org-level insights ```sql theme={null} SELECT c.FIRST_NAME, c.LAST_NAME, c.EMAIL_ADDRESS, c.JOB_TITLE, co.COMPANY_NAME, i.CRM_TECH_ORG, i.SALES_ROLE_COUNT_ORG FROM RELEASE.PER_LATEST c LEFT JOIN RELEASE.ORG_LATEST co ON c.RBID_ORG = co.RBID LEFT JOIN RELEASE.INSIGHTS_LATEST i ON c.RBID_ORG = i.RBID_ORG WHERE c.EMAIL_ADDRESS IS NOT NULL; ``` ### Full join: contacts + companies + insights ```sql theme={null} SELECT c.FIRST_NAME, c.LAST_NAME, c.JOB_TITLE, co.COMPANY_NAME, co.INDUSTRY_LINKEDIN, co.EMPLOYEE_COUNT_MAX, c.EMAIL_ADDRESS, c.EMAIL_LAST_VERIFIED_AT, i.CRM_TECH_ORG, i.LAST_FUNDING_AMOUNT_ORG FROM RELEASE.PER_LATEST c LEFT JOIN RELEASE.ORG_LATEST co ON c.RBID_ORG = co.RBID LEFT JOIN RELEASE.INSIGHTS_LATEST i ON c.RBID_ORG = i.RBID_ORG WHERE c.EMAIL_ADDRESS IS NOT NULL ORDER BY c.EMAIL_LAST_VERIFIED_AT DESC; ``` ### Contacts with historical experience ```sql theme={null} SELECT c.FIRST_NAME, c.LAST_NAME, c.EMAIL_ADDRESS, he.job_count, he.jobs FROM RELEASE.PER_LATEST c LEFT JOIN RELEASE.HISTORICAL_EXPERIENCE_LATEST he ON c.LINKEDIN_URL = he.linkedin_url WHERE c.EMAIL_ADDRESS IS NOT NULL; ``` > [!NOTE] > > Historical experience uses an array structure. Use `LATERAL FLATTEN` to work with individual positions. See [Historical Experience](/docs/data-features/data-tables/historical-experience) for details. ## Gotchas and tips > [accordion] NULL RBID\_ORG > > Not every contact has a linked organization. If you use `INNER JOIN` on `org_latest`, you'll silently drop those contacts. Use `LEFT JOIN` unless you specifically want to exclude unmatched contacts. Check for `RBID_ORG IS NULL` to see how many contacts lack organization associations. > [accordion] All emails are valid > > All emails in the dataset are verified as valid. You don't need to filter on `EMAIL_STATUS = 'VALID'` — if an email exists in the dataset, it's valid. Use `EMAIL_LAST_VERIFIED_AT` to prioritize recently verified addresses. > [accordion] Insight is org-level only > > All insights are org-level only. When joining insights to contacts, you get the org-level insights associated with the contact's organization (`RBID_ORG`). There are no contact-level insights. > [accordion] Historical experience array structure > > The historical experience table stores one row per LinkedIn profile with a `jobs` array. Use `LATERAL FLATTEN` to work with individual positions. See [Historical Experience](/docs/data-features/data-tables/historical-experience) for examples. > [accordion] Performance on large joins > > When joining across large tables, always include filter conditions (`WHERE` clauses) to reduce the working set before the join. Filtering on `EMAIL_LAST_VERIFIED_AT`, `INDUSTRY_LINKEDIN`, or `EMPLOYEE_COUNT_MAX` early will significantly speed up queries. > [accordion] Pre-joined tables > > For common combinations (people + companies, or people + companies + insights), consider using pre-joined tables like `velocity_base_unlimited_latest` or `velocity_enhanced_unlimited_latest` instead of writing joins yourself. See [Pre-Joined Tables](/docs/data-features/pre-joined-tables/pre-joined-overview) for details. ## Joining with your own data You can also join RevenueBase tables with your own internal data in Snowflake. The most common approach is matching on `domain`: ```sql theme={null} -- Match your account list against RevenueBase companies by domain SELECT your_accounts.account_name, co.COMPANY_NAME, co.EMPLOYEE_COUNT_MAX, co.INDUSTRY_LINKEDIN FROM your_database.your_schema.accounts your_accounts JOIN RELEASE.ORG_LATEST co ON LOWER(your_accounts.website_domain) = LOWER(co.DOMAIN); ``` > [!TIP] > > Always normalize domains when joining — use `LOWER()` and strip `www.` prefixes to avoid mismatches. Consider using `TRIM()` to remove whitespace as well. # Data Overview Source: https://docs.revenuebase.ai/docs/data-feeds/overview Overview on data with RevenueBase. RevenueBase delivers verified B2B data on people and organizations — structured into relational tables and refreshed monthly. ## Core identifiers Every record links back to one of three identifiers. Getting these right is the foundation for every join, deduplication, and enrichment workflow. | Identifier | Entity | Scope | What it identifies | | - | - | - | - | | `RBID_PER` | Person | Global | The human being — stable across every company they work at | | `RBID_ORG` | Organization | Global | The company — one ID regardless of how many people work there | | `RBID_PAO` | Contact | Per company | This person at this company — combines `RBID_PER` and `RBID_ORG` | > [!NOTE] > > **Developer rule of thumb** > > 1. Use **Person** when you care about *who* someone is — deduplication, career tracking, identity resolution. > 2. Use **Contact** when you care about *where* they work and in what role — outbound campaigns, enrichment, work email lookup. > 3. A person can have many contacts. A contact belongs to exactly one person and one organization. ### Example: Jane Smith works at two companies PersonOne person, identified by RBID\_PER ↙ 1 contact 1 contact ↘ Contact AJane @ Acme CorpRBID\_PAO: rb-pao-001 Contact BJane @ StripeRBID\_PAO: rb-pao-002 ↓ RBID\_ORG: rb-org-acme↓ RBID\_ORG: rb-org-stripe OrganizationAcme Corp, identified by RBID\_ORG OrganizationStripe, identified by RBID\_ORG Person Contact (Person × Org) Organization | Entity | ID | Key data | | - | - | - | | Person | `RBID_PER: rb-per123` | Jane Smith, LinkedIn profile, personal email | | Contact | `RBID_PAO: rb-pao-001` | VP Engineering at Acme, [jane@acme.com](mailto:jane@acme.com), +1 415… | | Contact | `RBID_PAO: rb-pao-002` | Advisor at Stripe, [jane@stripe.com](mailto:jane@stripe.com) | | Organization | `RBID_ORG: rb-org-acme` | Acme Corp, 500 employees, SaaS, San Francisco | | Organization | `RBID_ORG: rb-org-stripe` | Stripe, 8,000 employees, Fintech, San Francisco | > [!NOTE] > > If someone holds multiple current positions, they will have **multiple rows** in the person table — each with a unique `RBID_PAO` but sharing the same `RBID_PER`. > [!NOTE] > > `RBID_ORG` and `RBID_PAO` may be missing if the person's LinkedIn profile does not link to a company page. This occurs because the company name field on LinkedIn is free text — people can enter anything and may skip linking to an existing company page. ## Table index | Table | Primary key | Foreign key | Description | | - | - | - | - | | [`PER_LATEST`](/docs/data-features/data-tables/person) | `RBID_PAO` | `RBID_ORG` → `ORG_LATEST.RBID` | Contact-level table — one row per person per organization | | [`ORG_LATEST`](/docs/data-features/data-tables/organization) | `RBID` | — | Organization firmographics — one row per company | | [`INSIGHTS_LATEST`](/docs/data-features/data-tables/insight) | `RBID_ORG` | `RBID_ORG` → `ORG_LATEST.RBID` | Derived signals and scores at the organization level | | [`HISTORICAL_EXPERIENCE`](/docs/data-features/data-tables/historical-experience) | `LINKEDIN_URL` | `LINKEDIN_URL` → `PER_LATEST.LINKEDIN_URL` | Job and experience history for a person | | `VELOCITY_BASE_UNLIMITED_LATEST` | `RBID_PAO` | — | Pre-joined: Person + Organization in a single view | | `VELOCITY_ENHANCED_UNLIMITED_LATEST` | `RBID_PAO` | — | Pre-joined: Person + Organization + Insights in a single view | For full field references, see [Person](/docs/data-features/data-tables/person), [Organization](/docs/data-features/data-tables/organization), [Insights](/docs/data-features/data-tables/insight), and [Historical experience](/docs/data-features/data-tables/historical-experience). ## Schema conventions * **Timestamps** — `UPDATED_AT` and `EMAIL_LAST_VERIFIED_AT` are in UTC. `UPDATED_AT` changes when any field is updated (LinkedIn profile revalidation also triggers it, even with no data changes). `EMAIL_LAST_VERIFIED_AT` tracks the last time the email address was independently revalidated. * **Nullability** — All fields are nullable. Missing values are `NULL` — not empty strings or sentinel values. * **Fill rates** — Fill rate is the percentage of rows where a field is non-null. Rates vary by segment: US records and larger organizations typically have higher fill rates for phone, seniority, and financial data. See the [Data Dictionary](/docs/data-features/data-dictionary) for per-field fill rates. *** ## Delivery paths In Snowflake, tables appear under the `RELEASES` database. For S3 deliveries, each table corresponds to a dataset folder in your bucket. | Table | Snowflake path | S3 path | | - | - | - | | Person | `RELEASES.RELEASE.PER_LATEST` | `/per//` | | Organization | `RELEASES.RELEASE.ORG_LATEST` | `/org//` | | Insights | `RELEASES.RELEASE.INSIGHTS_LATEST` | `/insights//` | | Pre-joined: Person + Organization | `RELEASES.RELEASE.VELOCITY_BASE_UNLIMITED_LATEST` | `/velocity_base_unlimited//` | | Pre-joined: Person + Organization + Insights | `RELEASES.RELEASE.VELOCITY_ENHANCED_UNLIMITED_LATEST` | `/velocity_enhanced_unlimited//` | *** ## Entity reference ### Person A real human being. There is exactly one Person record per human, identified by `RBID_PER`. It holds identity-level data — name, personal email, LinkedIn URL. ### Organization A company. One record per company, identified by `RBID_ORG`. It holds firmographic data — headcount, revenue, industry, location. **Organization counts by country** [https://embed.domo.com/cards/6BgR9](https://embed.domo.com/cards/6BgR9) ### Contact The join between Person and Organization. Jane at Acme Corp is one Contact; Jane at Stripe is another. Each Contact gets a unique `RBID_PAO`, but the same `RBID_PER` threads through both. If a person holds multiple current positions, they appear in multiple rows — one per organization. **Contact counts** [https://embed.domo.com/cards/8Mk6o](https://embed.domo.com/cards/8Mk6o) [https://embed.domo.com/cards/9DlQ3](https://embed.domo.com/cards/9DlQ3) [RevenueBase re-verification cadence and coverage](https://embed.domo.com/cards/MJnqm) ### Email A verified work email address for the contact at their current organization. Sourced from professional profiles and verified for deliverability. Use this for outbound outreach, enrichment, and CRM sync. **Emails verified by month** [RevenueBase email re-verification frequency](https://embed.domo.com/cards/NYor2) ### Phone A direct dial or company phone number associated with the contact. Where available, includes mobile numbers. Use this for outbound calling, sequencing, and contact enrichment workflows. **Mobile phone number fill rate** [https://embed.domo.com/cards/gnrL9](https://embed.domo.com/cards/gnrL9) *** Haven't set up your data feed yet? Start in Guides > Setting Up Your Integration. # AWS S3 setup Source: https://docs.revenuebase.ai/docs/getting-started/aws-s3 Grant your AWS account access to the RevenueBase S3 bucket and start loading your data files. RevenueBase delivers data to a managed S3 bucket and grants your AWS account read access. Data is available in **CSV**, **JSON**, and **Parquet** formats — you get all three with every delivery. Each monthly delivery lands in a new date-stamped folder; previous deliveries are never overwritten. *** ## Setup your AWS S3 integration **1. Locate Integrations** On the RevenueBase web application, select `Integrations` from the side bar. **2. Fill in your AWS Account ID** ![Setting up your AWS S3 integration in RevenueBase.](https://mintcdn.com/revenuebase/Auh5vTyjkiLq1Qq7/images/portal/integration-amazons3.png?fit=max\&auto=format\&n=Auh5vTyjkiLq1Qq7\&q=85\&s=28f2e6370d2d48deeb80b34c3cc01c34) Under `Step 1 — Your AWS details`, submit your AWS Account ID. > [!NOTE] > > You can find your AWS Account ID in the top-right dropdown of the AWS Console, or by running `aws sts get-caller-identity` in the AWS CLI. **3. Wait for bucket configuration** Once your AWS Account ID has been submitted, please allow up to 24 hours as we prepare to provision your S3 buckets. Once provisioned, you will receive an email including your bucket ARN, region, access details, and a step-by-step setup guide. ![Setting up your AWS S3 integration in RevenueBase.](https://mintcdn.com/revenuebase/Auh5vTyjkiLq1Qq7/images/portal/integration-amazons3-confirm.png?fit=max\&auto=format\&n=Auh5vTyjkiLq1Qq7\&q=85\&s=b92587adfbad3be0875ce0c1227c7327) **4. Verify access** Once your S3 bucket is provisioned, test your connection using the AWS CLI: ```bash theme={null} aws s3 ls s3://// \ --request-payer requester \ --region ``` You can also access via ARN: ```bash theme={null} aws s3 ls s3://arn:aws:s3:::accesspoint/// \ --request-payer requester \ --region ``` > [!NOTE] > > Use the **AWS CLI** — not the AWS Console web UI — to access RevenueBase buckets. The Console does not support `--request-payer` and will return access errors. *** ## Bucket structure Your data lives in date-stamped folders within the S3 bucket. The path structure is: ``` /// ``` | Path segment | Description | | - | - | | `delivery_date` | Date of delivery in `YYYYMMDD` format (e.g., `20260201`) | | `dataset_name` | The dataset included in your subscription (e.g., `per`, `org`, or a pre-joined dataset) | | `file_format` | One of `json`, `csv`, or `parquet` | For more on Parquet, see the [official Parquet documentation](https://parquet.apache.org/docs/). > [!NOTE] > > Data is split across multiple files within each delivery folder. This is by design — it enables parallel processing and significantly improves import performance for large datasets. *** ## Next Steps Join Tables Now that your data feed is connected, see Joining Tables in the Data section for SQL patterns combining Person, Organization, Insights, and Historical Experience. Data Freshness & Quality Before writing queries, read Data Freshness & Quality to understand `EMAIL_LAST_VERIFIED_AT`, sparse profiles, and the monthly verification cadence. # FAQ Source: https://docs.revenuebase.ai/docs/getting-started/faq Answers to common questions about RevenueBase data organization, delivery, updates, and troubleshooting. ## Data organization & structure > [accordion] How is the data organized? > > RevenueBase uses three core identifiers to track people, organizations, and the relationship between them: > > * **`RBID_PER`** — Unique person identifier. This follows the person across job changes. When someone moves to a new company, their `RBID_PER` stays the same. > * **`RBID_ORG`** — Unique organization identifier. > * **`RBID_PAO`** — Unique person-at-organization identifier. This is essentially `RBID_PER` combined with `RBID_ORG`, so it changes when a person moves to a new company. > > If someone holds multiple current positions, they will have **multiple rows** in the contacts table — each with a unique `RBID_PAO`, but sharing the same `RBID_PER`. > [accordion] Why are RBID\_ORG and RBID\_PAO sometimes missing? > > These fields may be null when a person's LinkedIn profile doesn't link to an existing company page. The company name field on LinkedIn is free text — people can type anything and may skip linking to a recognized company page. Without that link, we can't resolve the organization to a canonical `RBID_ORG`. > [accordion] What are sparse or 'junk' profiles? > > Some profiles in the dataset contain minimal information — a name and loose company association, but limited detail on title, seniority, or work history. These come from source profiles that simply contain less data. In some cases they may be incomplete or low-quality. > > **The strongest indicator that a person genuinely belongs to an organization is a valid company email address.** If a sparse profile has a verified email at the company domain, treat it as reliable. If it has no verified email, treat the association with lower confidence. See [Data Freshness & Quality](/docs/data-features/data-freshness/data-freshness) for more on assessing record quality. ## Data delivery & access > [accordion] What data delivery methods are available? > > RevenueBase supports three delivery methods: > > * **Snowflake Data Sharing** — We share tables directly to your Snowflake account. No data movement required; query in place. > * **AWS S3 bucket** — We deliver files to an S3 bucket (either one we provision for you, or your own). Access via AWS CLI. > * **Gigasheet** — Browser-based spreadsheet UI for searching, filtering, and exporting data without code. > > Azure Blob Storage and Google Cloud Storage delivery are available on request. Contact your RevenueBase account representative to set up these delivery methods. > > For setup instructions, see the [Quickstart](/docs/getting-started/snowflake). > [accordion] How do I access my AWS Account ID? > > [https://scribehow.com/embed/Accessing\_Your\_AWS\_Account\_ID\_\_nhNyJoXKRky8G-VdcErFrw](https://scribehow.com/embed/Accessing_Your_AWS_Account_ID__nhNyJoXKRky8G-VdcErFrw) > [accordion] How do I access my Snowflake Account ID? > > [https://scribehow.com/embed/Accessing\_Your\_Snowflake\_Account\_ID\_\_wKZQGdYPT4CLpce72ZjWAw](https://scribehow.com/embed/Accessing_Your_Snowflake_Account_ID__wKZQGdYPT4CLpce72ZjWAw) > [accordion] What file formats are supported for S3 delivery? > > RevenueBase supports sending dynamic feeds in three formats: **CSV**, **JSON**, and **Parquet**. When you get access to the data in S3, you get access to all three formats. > > * **CSV** — Best for spreadsheet tools, SQL imports, and lightweight pipelines > * **JSON** — Best for programmatic ingestion and nested data structures > * **Parquet** — Best for high-performance analytics and columnar query engines. Read more in [Parquet's official documentation](https://parquet.apache.org/docs/). > [accordion] How do I access the Snowflake share? > > Once we've provisioned the share: > > 1. Navigate to **Data Sharing → Private Sharing** in the left panel of the Snowflake UI > 2. Click on the incoming share tabs (e.g., `RELEASES_EXT_SHARE` or `RELEASES_RAW_SHARE`) > 3. Click **Get Data** to add the shared database to your account > > This creates a `RELEASES` database in your Snowflake account containing the shared tables. See the [Quickstart](/docs/getting-started/snowflake) for detailed setup steps. > [accordion] How do I get data feed credentials? > > Feed credentials are separate from your API key. In the [dashboard](https://app.revenuebase.ai/dashboard), open **Settings** → **Data Feeds** to see connection details and credentials. > [accordion] Will credentials and paths stay the same across deliveries? > > Yes. For S3 deliveries, your bucket name and access credentials are permanent — they don't change between monthly releases. > > Each delivery creates a new date-stamped folder following this path structure: > > ``` > /// > ``` > > * `delivery_date` — Date of delivery in `YYYYMMDD` format > * `dataset_name` — Depends on your subscription (e.g., `per`, `org`) > * `file_format` — One of `json`, `csv`, or `parquet` > > Previous deliveries remain accessible at their original paths and are never overwritten. ## Data updates & refresh > [accordion] When is the data refreshed? > > New data releases target the **1st of each month**. Depending on weekends, the actual date may shift by ±2–3 days. We send an email notification when new data is posted and ready. > [accordion] What is the verification cadence? > > Two verification cycles run in parallel: > > * **Profile verification** — 95% of profiles are re-verified every **90 days**. "Re-verified" means the source profile was accessible and we were able to confirm or update at least the core profile information (name, title, company, location). Check the `updated_at` field for the most recent verification date on any record. > * **Email verification** — All email addresses are re-verified every **60 days**. Check the `email_last_verified_at` field. A valid email is a strong signal that the associated work experience is still current. > > See [Data Freshness & Quality](/docs/data-features/data-freshness/data-freshness) for the full explanation of how verification works. > [accordion] Why are some profiles outdated or not recently updated? > > Profiles may have older `updated_at` dates for several reasons: > > * **Source accessibility issues** — The profile returned a 404 or was temporarily unreachable during the verification pass. Profiles that remain inaccessible for one year are deprecated and removed from the dataset. > * **Platform scraping protections** — LinkedIn periodically hides full profiles or experience sections from public view. This affects random profiles and can last days to months. > * **Delayed updates by individuals** — People often change jobs weeks or months before updating their profiles. Someone who starts a new role in May might not update LinkedIn until September, and we'd capture that change in October or November. > > See [Data Freshness & Quality](/docs/data-features/data-freshness/data-freshness) for detailed guidance on working with these records. ## Company data & verification > [accordion] How is 'claimed page' status calculated? > > We detect whether a LinkedIn company page appears to be actively managed by checking for custom content such as a logo, website address, company size, and description. > > This method is not 100% accurate. Some pages may have extensive information (phone numbers, addresses, founding dates) but still appear unclaimed. The challenge is that checking pages without being logged in doesn't show LinkedIn's unclaimed banner, so our system relies on indirect signals. We're actively improving the accuracy of this detection. > [accordion] Why do logo URLs return 403 errors? > > LinkedIn periodically rotates logo URLs to protect their assets. Updated URLs are included in each monthly data refresh, though they may eventually face the same issue. > > The most reliable solution is to **build a logo cache on your end** and populate it incrementally with each delivery. This way you maintain persistent access regardless of URL rotation. ## API > [accordion] How do I get an API key? > > Sign in to the [RevenueBase portal](https://app.revenuebase.ai) and open **My API keys** in the sidebar. Choose **Create API key**, select the permissions you need, then copy the full key from the confirmation and store it securely. The list shows masked values afterward. See [Manage your API keys](/docs/portal/settings-and-billing#manage-your-api-keys) for creation, rotation, and revocation instructions. > [accordion] Why do I get 401 Unauthorized? > > Check that you are sending the key in the **x-key** header (not `Authorization`). Ensure the key is correct and has not been revoked. > [accordion] Why do I get 429 Too Many Requests? > > You have exceeded the rate limit. Wait for the window to reset or implement exponential backoff. See [Rate limits and error codes](/api-reference/rate-limits). > [accordion] What does 422 Validation Error mean? > > The request body or parameters failed validation. The response `detail` array lists each invalid field and message. Fix those fields and retry. ## Troubleshooting ### Data feeds > [accordion] I can't connect to the data feed. > > Verify host, port, and TLS settings. Ensure you are using the feed username and password, not the API key. Check firewall and network rules. > [accordion] A table or column is missing. > > Table and schema access depend on your plan. Confirm the table name and schema (e.g., `public`) and check the [Tables & Schemas](/docs/data-feeds/overview) and table pages ([Person](/docs/data-features/data-tables/person), [Organization](/docs/data-features/data-tables/organization), [Insight](/docs/data-features/data-tables/insight)). > [accordion] InvalidAccessPointAlias error (S3) > > This error typically occurs when using the **AWS Console** instead of the **AWS CLI**, or when the region is misconfigured. > > * Use the **AWS CLI** — the Console web UI does not support `--request-payer` and will return access errors > * Confirm you're targeting the correct region in your CLI command > * Verify your AWS account has been linked to the RevenueBase bucket > > If the issue persists, contact **[support@revenuebase.ai](mailto:support@revenuebase.ai)**. > [accordion] Access Denied or bucket not found (S3) > > * Double-check that you're including `--request-payer requester` in your CLI command > * Verify your AWS credentials are configured correctly (`aws configure`) > * Ensure the bucket alias or ARN is copied exactly as provided — typos in the access point name are common > [accordion] Snowflake share not visible > > * Confirm your Snowflake account locator and region match what was provided to RevenueBase during onboarding. See [Snowflake's account identifier documentation](https://docs.snowflake.com/en/user-guide/admin-account-identifier) for where to find this. > * Check the **Data Sharing** area in the Snowflake UI for the RevenueBase incoming share > * If you recently onboarded, allow up to 24 hours for the share to propagate > [accordion] Missing RBID\_ORG or RBID\_PAO fields > > These fields may be null when a person's LinkedIn profile doesn't link to a company page. The company name on LinkedIn is free text, so some profiles will not have a resolvable organization ID. A valid company email is the strongest indicator that the person-organization association is accurate. ### Gigasheet > [accordion] Can multiple users log in with the same email? > > No. This breaks the system. Each user must have their own individual email account on a business domain. If you have multiple business domains, you must use the email your account was originally created with — otherwise you won't have the correct account permissions. > [accordion] Who do I contact for Gigasheet UI issues? > > Contact **[support@gigasheet.com](mailto:support@gigasheet.com)** for slow load times, exports not working, or adding/removing users. > [accordion] Who do I contact for data or use-case questions? > > Contact your **RevenueBase Account Manager** or **[support@revenuebase.ai](mailto:support@revenuebase.ai)** for questions about your data or how to use the platform. ## Still have questions? Data Freshness & Quality How verification works, why records become stale, and how to assess quality programmatically. API Reference & Playground Full API documentation, endpoint reference, and interactive playground. Get Support Email [support@revenuebase.ai](mailto:support@revenuebase.ai) for help from the RevenueBase team. # Connect your AI assistant Source: https://docs.revenuebase.ai/docs/getting-started/mcp Connect Claude or another MCP client to RevenueBase for contact search, enrichment, and email verification. The RevenueBase MCP server lets your AI assistant search business contacts, inspect audience coverage, enrich known email addresses, and verify email deliverability using your RevenueBase account. ## Before you connect You need a RevenueBase account and an AI client that supports remote MCP connections over Streamable HTTP with OAuth. Available tools and data depend on your account access and plan. Sign in to [the RevenueBase app](https://app.revenuebase.ai/) once with the account you will connect. This links your sign-in to your RevenueBase account. ## Connect in Claude **1. Add the connector** Open Claude's connector settings and choose **Add custom connector**. Enter the production server URL: ```text theme={null} https://mcp.revenuebase.ai/mcp ``` **2. Sign in to RevenueBase** Choose **Connect** and complete the RevenueBase sign-in and authorization flow with the same account you used in the app. Your client handles OAuth; you do not paste an API key into the connector. **3. Check the connection** Start a conversation with the connector enabled. Ask: ```text theme={null} List the fields available for a RevenueBase contact search. Do not retrieve contact records. ``` Field discovery confirms access without retrieving contact rows. ## Connect another MCP client Use the same server URL and complete your client's RevenueBase OAuth flow. For clients that accept an MCP configuration file, the connection entry is: ```json theme={null} { "mcpServers": { "revenuebase": { "url": "https://mcp.revenuebase.ai/mcp" } } } ``` Your client must support account OAuth for remote MCP servers. This connection uses your RevenueBase sign-in; a REST API key alone cannot authenticate it. > [!NOTE] > > `https://docs.revenuebase.ai/mcp` is the separate documentation search server. > Use `https://mcp.revenuebase.ai/mcp` for contact data and email verification. ## Tools and credits | Tool | Result | Documented credit behavior | | - | - | - | | `list_columns` | Searchable fields and their types | Free | | `column_values` | Values for an enumerable field | Free | | `count_contacts` | Matching contact totals | Free | | `audience_insights` | Aggregate reachability and coverage | Free | | `search_contacts` | A bounded contact preview; default 20, maximum 100 records | Returned rows may use credits according to your plan | | `enrich_email` | Contact details for up to 25 supplied emails | Returned matches may use credits according to your plan | | `verify_email` | Valid, Invalid, or Unknown for one email | One credit for Valid or Invalid; none for Unknown | | `verify_emails_batch` | A verification job for up to 1,000 emails | One credit per Valid or Invalid result as the job runs | | `job_status` | The status of one of your verification jobs | Free | | `list_verification_jobs` | Your verification jobs and totals | Free | Review the requested operation and credit cost before authorizing contact retrieval, enrichment, or email verification. Batch verification creates a job; completed results are available in the RevenueBase app. ## Troubleshooting * **Sign-in succeeds but tools reject access:** sign in to the RevenueBase app with the same account, then reconnect the MCP server. * **Email tools are absent:** check your account's access to email verification. Tool availability depends on the signed-in account. * **Insufficient credits:** check your balance and plan in the RevenueBase app. Free discovery and aggregate tools can still operate without paid credits. * **Repeated authorization errors:** confirm the connector URL is exactly `https://mcp.revenuebase.ai/mcp`, then reconnect through your client. For help, contact [support@revenuebase.ai](mailto:support@revenuebase.ai). Read the [privacy policy](https://revenuebase.ai/privacy-policy) and [terms of service](https://revenuebase.ai/stc-01-14-2024) for data handling and permitted use. # Overview Source: https://docs.revenuebase.ai/docs/getting-started/overview Choose the RevenueBase portal, an API integration, or a data feed for your first task. > [tab] Portal > > Find contacts and companies, enrich a list, or verify email addresses in the > [RevenueBase portal](https://app.revenuebase.ai). You can use the apps without writing code. > > Start with the portal > > Choose your first task and understand free browsing, credits, and Unlimited retrieval. > > Audience Builder > > Find an audience, match an existing list, and export contacts or companies. > > Email Verifier > > Verify an address or a file and understand Valid, Invalid, and Unknown results. > > Organization settings > > Invite colleagues, compare roles, and manage shared credits and monthly limits. > [tab] Data Feeds > > RevenueBase **Dynamic Data Feeds** deliver structured B2B data (contacts, companies, and insights) > to you in two ways: data is available in our **S3 bucket** (we grant your AWS account access), > or we share it through **Snowflake Data Sharing** to your Snowflake account. > Updates are delivered on a **monthly** cadence. The full [Data Feeds overview](/docs/data-feeds/overview) has step-by-step onboarding for each > delivery method. > > ## Choose your delivery method > > AWS S3 > > We grant your AWS account access so you can list and download date-stamped delivery folders. You get access to all three formats in S3: CSV, JSON, and Parquet. > > Snowflake > > We share the data through Data Sharing to your Snowflake account. You get a database (e.g. RELEASES) with tables you can query directly in SQL. > > Gigasheet > > We share data to you through a spreadsheet-like interface — no SQL required. > > ## Key references > > Data Dictionary > > A complete field-level reference for every column in RevenueBase. > > Pre-Joined Tables > > Ready-made views that combine people, organizations, and insights with no joins required. > > Data Freshness > > Verification cycle, staleness thresholds, and recommended filters. > [tab] API > > ## Get started with our API > > API Reference > > Explore to learn more about our endpoints. > > Authentication > > Get testing with your API key. > > Rate Limits > > Check rate limit and error codes before going live. > > The RevenueBase [API](/api-reference/v2/overview) gives you an additional layer on top of the foundation: > > Verification & Enrichment Tools > > Clean and enhance your own data. Verify emails in real time or batch. Operates on whatever you send — your CRM, third-party lists, product data. Per-outcome pricing. # Snowflake setup Source: https://docs.revenuebase.ai/docs/getting-started/snowflake Accept a RevenueBase Snowflake Data Share and start querying person, organization, and insights tables directly. RevenueBase delivers data directly to your Snowflake account — which is a secure, zero-copy share that adds a `RELEASES` database directly to your Snowflake account. No file downloads or ETL pipelines required. Tables are immediately queryable once you accept the share. ## Setup your Snowflake integration **1. Locate Integrations** On the RevenueBase web application, select `Integrations` from the side bar. **2. Fill in your Snowflake Account ID** ![Setting up your Snowflake integration in RevenueBase.](https://mintcdn.com/revenuebase/hSeSKbjNmHUVZXeP/images/portal/integration-snowflake.png?fit=max\&auto=format\&n=hSeSKbjNmHUVZXeP\&q=85\&s=38f50b1fa71d08a88c98ee23be890b2b) Under `Step 1 — Your Snowflake Account Locator`, submit your Snowflake Account ID. > [!NOTE] > > You can find your Snowflake Account ID in the bottom-left corner of the Snowflake Dashboard. It looks like `ABC12345.XYZ67890`. **3. Access granteed on Snowflake** Once submitted, you will get direct data access in your Snowflake account. Please allow up to 10 minutes for data sharing to happen. ![Setting up your Snowflake integration in RevenueBase.](https://mintcdn.com/revenuebase/hSeSKbjNmHUVZXeP/images/portal/integration-snowflake-step3.png?fit=max\&auto=format\&n=hSeSKbjNmHUVZXeP\&q=85\&s=774dc71ebc88436f630878a1b2305728) **4. Verify access** Once you see the `RELEASES` database, you can start testing your data access by querying the database: ```sql theme={null} SELECT * FROM RELEASE.PER_LATEST LIMIT 100; ``` *** ## Table paths All RevenueBase tables live under the `RELEASES` database. Use the schema-qualified path when writing queries. | Table | Snowflake path | | - | - | | Person | `RELEASES.RELEASE.PER_LATEST` | | Organization | `RELEASES.RELEASE.ORG_LATEST` | | Insights | `RELEASES.RELEASE.INSIGHTS_LATEST` | | Person + Organization (pre-joined) | `RELEASES.RELEASE.VELOCITY_BASE_UNLIMITED_LATEST` | | Person + Organization + Insights (pre-joined) | `RELEASES.RELEASE.VELOCITY_ENHANCED_UNLIMITED_LATEST` | | Raw feed | `RELEASES.CUSTOM.RAW_FEED_PER_LATEST` | *** ## Next Steps Join Tables Now that your data feed is connected, see Joining Tables in the Data section for SQL patterns combining Person, Organization, Insights, and Historical Experience. Data Freshness & Quality Before writing queries, read Data Freshness & Quality to understand `EMAIL_LAST_VERIFIED_AT`, sparse profiles, and the monthly verification cadence. # What is RevenueBase? Source: https://docs.revenuebase.ai/docs/getting-started/what-is-rb 400M+ verified B2B contacts and 65M+ companies — the trust layer for B2B data. RevenueBase is the **trust layer for B2B data** — one platform to clean the data you have, keep it current, and find what's missing. It covers 400M+ verified B2B contacts and 65M+ companies, backed by 1B+ verification signals processed every month and a 97%+ email deliverability rate. ## What it does RevenueBase is built around three capabilities: * **Data feeds** — Always-current contact and company records delivered flat-rate to your cloud storage. No metered access, no data that decays between deliveries. * **Clean & enrich APIs** — Per-outcome pricing for email verification and record enrichment. You pay for results, not API calls. * **Discovery and search** — Query by meaning, not just keywords. Combine natural language with deterministic filters (headcount, revenue, funding stage, industry, job title, seniority, geography, tech stack) in a single query. Launching 2026. ## How it's different Every record is **100% source-traced** — you can see where each data point came from and when it was last verified. There's no black-box scoring, no hidden enrichment logic. Verification runs continuously: contact profiles re-verify on a 90-day rolling cycle, email addresses every 60 days. RevenueBase is designed for teams that build on top of data — product teams shipping GTM tooling, sales and marketing ops managing data pipelines, and agencies running multi-client campaigns. The flat-rate model means your costs don't spike as usage grows. ## Where to go next Quickstart overview Connect your first data feed or make your first API call. Data features Explore the tables, fields, and filters available across the dataset. # Enriching Your Data Source: https://docs.revenuebase.ai/docs/gigasheet/advanced-usage/export-enrichment/enrichment How to enrich your data using RevenueBase in Gigasheet Use Gigasheet to upload your own list of people (for example, LinkedIn URLs) and enrich it with RevenueBase contact and firmographic data — job title, company name, email, cell phone, and more. Match on LinkedIn URL, domain, or email; then pull in the columns you need. ## Video walkthrough [https://www.loom.com/embed/8526a4de09434d27988074254afe83c4](https://www.loom.com/embed/8526a4de09434d27988074254afe83c4) ## How contact enrichment works **Use case:** You have a list of people (e.g., LinkedIn URLs) and want to enrich it with contact information and firmographic data from RevenueBase. **Example:** Upload 100 LinkedIn URLs, then enrich with job title, company name, email, and cell phone. ### Step 1: Create a RevenueBase sheet with your match column **1. Add a new RevenueBase sheet** In Gigasheet, go to **RevenueBase** and click **Add New**. **2. Choose sheet type** Create a **LinkedIn person URL** sheet (or the sheet type that matches your data — e.g., domain, email). **3. Upload identifiers** Upload or paste your identifiers (LinkedIn URLs, domains, or emails) into that sheet. **4. Confirm data** Open the sheet and confirm your data is loaded. ### Step 2: Match your format to RevenueBase Your upload format must **exactly match** how RevenueBase stores the same field. Otherwise matches will fail. * **LinkedIn URLs:** Use `https://` with the full URL and **no trailing slash**. * **Domains and emails:** Use the same format RevenueBase uses in its published data. Check a few rows in an existing RevenueBase sheet to see the exact pattern, then make your list identical. ### Step 3: Run Crossfile lookup **1. Open Crossfile lookup** Go to **Insert** → **Crossfile v Lookup**. **2. Select your match column** Select the **column in your file** that you want to match (e.g., the column containing LinkedIn URLs). **3. Select the RevenueBase file** **Browse** to the RevenueBase file that contains the same identifier type and choose the **match column** (e.g., **LinkedIn URL Person**). **4. Choose match and return options** Select **NearMatch** to allow for case or minor formatting differences. Choose **which columns to return** (e.g., full name, email, job title, company name, cell phone). You can select any columns available in the RevenueBase file. **5. Apply** Click **Apply** and wait for enrichment to complete. ### Step 4: Wait for enrichment to complete * While the job is running, the file area **grays out** at the top. * When enrichment is done, the new values appear in **blue** and the file becomes active again. ### Step 5: Use your enriched data From the enriched sheet you can download the file, save it for later, or keep working in Gigasheet. > [!TIP] > > * Use **NearMatch** when your identifiers might differ slightly in case or formatting. > * Any column visible in the RevenueBase file can be selected as a return value for enrichment. > * Enrichment is useful for filling gaps in your CRM, verifying emails, or adding firmographic and contact data to prospect lists. ## How to enrich company target lists with people attributes This walkthrough shows how to upload a list of target company domains and find the right people within those organizations using Gigasheet and RevenueBase data. [https://www.loom.com/embed/5717dfcb117f4f25b326d4b78661ebd6](https://www.loom.com/embed/5717dfcb117f4f25b326d4b78661ebd6) ### Step-by-step summary **1. Upload your file** In the Gigasheet navigation bar, go to **My Files** → **Add New** and upload an Excel/CSV file of domains (or other unique identifiers). Domains must match RevenueBase's formatting exactly — no `www.`, no `https://`, no trailing slashes (e.g., `aheadoftime.com`, not `www.aheadoftime.com`). **2. Open your RevenueBase file** Go to **Shared with Me** in the Gigasheet navigation bar and select your RevenueBase data file. **3. Apply a Found in Sheet filter** Click the **Filter** button, select the unique identifier you want to match on (e.g., **Organization Domain**), set the operator to **Found in Sheet**, and browse to select the file you just uploaded. Choose the matching column and click **Apply**. **4. Layer on additional filters** Add filters for job titles, seniority, or other person-level attributes to narrow down to the exact personnel you need. **5. Export** Once your audience is refined, export as needed. > [!NOTE] > > You can also match on other unique identifiers, such as Company Name + Headquarter Location (useful when multiple companies share a name), or Company LinkedIn URL. # Exporting Source: https://docs.revenuebase.ai/docs/gigasheet/advanced-usage/export-enrichment/exporting How to export RevenueBase data Export your filtered or searched RevenueBase data from Gigasheet as CSV for use in other tools (CRM, campaigns, etc.). ## Video walkthrough [YouTube video player](https://www.youtube.com/embed/EZi1_1m5hH4?si=9xVoJAiH9ZqMF1Yq) ## How to export 1. In Gigasheet, apply any search or [Filter](/docs/gigasheet/advanced-usage/search-filter-views/filtering) to get the rows you want. 2. Use **File** → **Export** or the export option in the toolbar. 3. Choose format (e.g., **CSV**) and optionally which columns to include. 4. Download the file or send it to a connected destination, depending on Gigasheet’s options. Exported data follows your RevenueBase license terms. Export only what you need for your use case. # Exporting to HubSpot ## Prerequisites * RevenueBase data loaded in Gigasheet (people + organizations or enhanced view). * A HubSpot account and access to create or update contacts and companies. ## How to save data to HubSpot 1. Filter and select the rows or leave unfiltered to export the current view. 2. Click **File** → **Save to** → **HubSpot** in the toolbar. 3. Choose your export behavior settings and click **Export**. ![Gigasheet interface showing the save to HubSpot option.](https://mintcdn.com/revenuebase/kBOEHKOR2edn7OkP/images/gigasheet-hubspot-save.png?fit=max\&auto=format\&n=kBOEHKOR2edn7OkP\&q=85\&s=db4fd7f376cd3ac9cec804c445b7d940) ![Gigasheet interface showing the config screen for HubSpot export.](https://mintcdn.com/revenuebase/kBOEHKOR2edn7OkP/images/gigasheet-hubspot-saveto.png?fit=max\&auto=format\&n=kBOEHKOR2edn7OkP\&q=85\&s=2fad2c74eb141c3f315f7ef77275999c) > [!WARNING] > > Exported data is subject to your RevenueBase and HubSpot license terms. Export only what you need for your use case. ## How to automate data exports to HubSpot 1. Click **Library** on the left sidebar, then select **Data Connectors** under **Other**. 2. Select **HubSpot** as the destination and follow the prompts to connect your HubSpot account. 3. Once connected, you can set up automated exports by configuring the automation settings. ![Gigasheet interface showing the HubSpot cron job configuration.](https://mintcdn.com/revenuebase/kBOEHKOR2edn7OkP/images/gigasheet-hubspot-cronjob.png?fit=max\&auto=format\&n=kBOEHKOR2edn7OkP\&q=85\&s=cb618c5bee824e2e1e904b51a6b56ae3) > [!NOTE] > > If your Gigasheet instance uses a different path for HubSpot (e.g., a custom integration or CSV upload into HubSpot), follow the steps provided in Gigasheet or by your admin. Contact support if you don’t see a HubSpot export option. # Filtering Source: https://docs.revenuebase.ai/docs/gigasheet/advanced-usage/search-filter-views/filtering How to filter RevenueBase data in Gigasheet Filter your RevenueBase data in Gigasheet to build targeted lists without writing SQL. ## Video walkthrough [YouTube video player](https://www.youtube.com/embed/WnS7av_-RZM?si=sahDXauPy7i1t7dS) ## Filter your data to build a targeted list **1. Open your RevenueBase sheet** Open your RevenueBase sheet in Gigasheet. **2. Choose a column to filter on** Click the column header for the field you want to filter on (e.g., **Industry**, **Verification status**, **Employee count**). **3. Set filter conditions** Choose **Filter** or the filter icon and set your conditions (e.g., Industry = Software, Verification status = valid). **4. Narrow or reset** Apply multiple column filters to narrow results further. Clear filters as needed to reset the view. > [!TIP] > > Common filters for RevenueBase data include verification status, seniority, department, industry, employee count, and location. ## Advanced filtering examples RevenueBase offers 150+ filters. The examples below show how to combine them for real-world use cases. ### Example 1 — Finding SANS-certified cybersecurity teams worldwide **Use case:** Find all teams in the world that are SANS certified for cybersecurity. Use the **Filter** dialog to search **Certifications** or **Skills** for "SANS" (with **Contains**), and add a rule so **Email Address** is not empty so you only get contactable people. Connect the certification/skills rules with **or**, then **and** with the email rule. ![Filter dialog showing Certifications and Skills containing SANS, and Email Address is not empty](https://mintcdn.com/revenuebase/7KUI2kcjuPBHaCvy/images/gigasheet-filter-sans-certified.png?fit=max\&auto=format\&n=7KUI2kcjuPBHaCvy\&q=85\&s=1df86bc7be5796e50c28cdfb497763fb) ### Example 2 — Isolating B2B companies by excluding B2C keywords **Use case:** Filter for B2B companies by removing certain B2C keywords from results. Use **Does not contain** on **LinkedIn Company**, **LinkedIn Organization**, and **LinkedIn About Us** with B2C-oriented terms (e.g., entertainment, wishlist, consumer, membership, shopping, b2c). Combine with **or** so that any of these fields lacking those terms helps surface B2B companies. Then add **and** rules for employee count, funding type, job title, job level, and persona as needed. ![Filter dialog excluding B2C keywords from company and about us fields](https://mintcdn.com/revenuebase/7KUI2kcjuPBHaCvy/images/gigasheet-filter-b2b-exclude.png?fit=max\&auto=format\&n=7KUI2kcjuPBHaCvy\&q=85\&s=fa5975d392bda97453046060416a790d) ### Example 3 — Mining for technologies not in RevenueBase's preset filters **Use case:** Find companies using a specific technology (e.g., Selenium) that isn't available as a preset filter — by mining current employees' job descriptions and other text fields. Use the **Filter** dialog with **Contains** on person-level text fields such as **Job Description**, **About Me**, **LinkedIn Headline**, and **Job Title**. Enter the technology name (e.g., "selenium") in each rule and connect them with **or** so a match in any field includes the row. ![Filter dialog searching for Selenium across Job Description, About Me, LinkedIn Headline, and Job Title](https://mintcdn.com/revenuebase/7KUI2kcjuPBHaCvy/images/gigasheet-filter-selenium.png?fit=max\&auto=format\&n=7KUI2kcjuPBHaCvy\&q=85\&s=fe33ab1d43302e56a0243242de37d6b7) # Grouping & aggregation Source: https://docs.revenuebase.ai/docs/gigasheet/advanced-usage/search-filter-views/grouping Group and aggregate RevenueBase data at company level in Gigasheet Roll up people-level records to the company level to count contacts per company, prioritize accounts, or layer analysis with nested groups. ## Why grouping matters Gigasheet defaults to showing people-level records. But sometimes you need to see people rolled up to the company level — for example, to count how many matching contacts exist at each company, or to prioritize accounts. ## How to group **1. Apply filters (optional)** Apply any filters you need so the grouped view shows only the audience you care about. **2. Open Group and choose Company Name** Click the **Group** button (next to the **Filter** button) and select **Company Name** to aggregate your results at a company level. ![Group dialog with Company Name selected; data grouped by company with record counts](https://mintcdn.com/revenuebase/7KUI2kcjuPBHaCvy/images/gigasheet-group-company-name.png?fit=max\&auto=format\&n=7KUI2kcjuPBHaCvy\&q=85\&s=3343a66a57605b87db6ecdd824708849) ## Nested groups for territory planning, account prioritization & personalization at scale You can use nested groups to layer your analysis. For example, if you want to know which retail companies have the biggest e-commerce teams: **1. Run your filter query** Find the relevant audience (e.g., retail and e-commerce companies in North America and Europe, with revenue and job title filters). ![Filter dialog for retail and e-commerce with industry, keywords, location, revenue, and job title](https://mintcdn.com/revenuebase/7KUI2kcjuPBHaCvy/images/gigasheet-group-filter-retail.png?fit=max\&auto=format\&n=7KUI2kcjuPBHaCvy\&q=85\&s=0a40b2118d81ddab68c0a5c3f43dc7ea) **2. Group by company and nest by department** Group by **Company Name** and add a nested level (e.g., e-commerce department) to see department size at every company and prioritize accordingly. ![Group dialog with Company Name and Job Title as nested group levels](https://mintcdn.com/revenuebase/7KUI2kcjuPBHaCvy/images/gigasheet-group-nested.png?fit=max\&auto=format\&n=7KUI2kcjuPBHaCvy\&q=85\&s=07dcd75667dac7dba3f5cb642d3f7c03) # Saved Views Source: https://docs.revenuebase.ai/docs/gigasheet/advanced-usage/search-filter-views/saved-views Create, share, and manage saved views in Gigasheet Save filter and grouping logic as views so you can return to the same segment later without reapplying steps. ## Creating and managing saved views When you create a filter you want to save and return to later, click **View** and then **Add New View**. > [!TIP] > > Saved views are **dynamic** — they automatically update every month when the database is refreshed with new data. Any time you click into your view, it will reflect all the filters and logic you added, including any group functions or columns you configured. ## How to save a view 1. Open your RevenueBase sheet in Gigasheet (people + company or enhanced view). 2. Use the search bar and [Filter](/docs/gigasheet/advanced-usage/search-filter-views/filtering) to narrow to the contacts or companies you want. 3. Save the current view (e.g. **Save view**, **Save as view**, or your organization’s equivalent in Gigasheet). 4. Name the view so you can find it later. You can return to it anytime without reapplying filters. Saved views are useful for recurring segments, reporting, or quick access to the same slice of data for [Exporting CSVs](/docs/gigasheet/advanced-usage/export-enrichment/exporting), [Exporting to HubSpot](/docs/gigasheet/advanced-usage/export-enrichment/exporting-hubspot), or [enriching your data with RevenueBase data](/docs/gigasheet/advanced-usage/export-enrichment/enrichment). ### Video walkthrough [YouTube video player](https://www.youtube.com/embed/Tl6FCAqOaUU?si=VvKOXtNzd53z2mVo) ## Sharing & managing views * You can share views with other Gigasheet users on your team. * To duplicate, update, or manage a view, use the **three-dot menu (⋯)** next to the view name. ![Views panel showing saved views and the three-dot menu with Copy Link, Rename, Duplicate, Delete](https://mintcdn.com/revenuebase/7KUI2kcjuPBHaCvy/images/gigasheet-saved-views-menu.png?fit=max\&auto=format\&n=7KUI2kcjuPBHaCvy\&q=85\&s=7216933d4e67c407a1e674b2126b9741) # Sharing Data Source: https://docs.revenuebase.ai/docs/gigasheet/advanced-usage/search-filter-views/sharing-data How to add a tab in Gigasheet for sharing RevenueBase data Add a tab in Gigasheet to share RevenueBase data with your team or external stakeholders. Tabs let you organize and expose specific views or filtered datasets without giving full access to the entire sheet. ## Steps 1. In Gigasheet, open the sheet that contains your RevenueBase data (people + company or enhanced view). 2. Use **Add tab** or the tab bar to create a new tab (naming it e.g. **Shared view** or **Sales list**). 3. In the new tab, apply the search and [Filter](/docs/gigasheet/advanced-usage/search-filter-views/filtering) you want to share — e.g. a segment by industry, region, or job level. 4. Optionally hide columns that shouldn’t be shared (e.g. internal notes) using column visibility or **Manage columns**. 5. Share the tab or sheet via Gigasheet’s sharing options (e.g. invite by email, share link, or embed) so others see only that tab’s filtered view. # Getting Started with Gigasheet Source: https://docs.revenuebase.ai/docs/gigasheet/overview Search, filter, and export RevenueBase's 400M+ verified B2B contacts and 65M+ companies in Gigasheet — a spreadsheet interface, no SQL required. RevenueBase data is available in **Gigasheet** so you can work with large datasets in a spreadsheet-like interface — no SQL required. Gigasheet is a third-party tool that excels at managing large datasets; your RevenueBase subscription includes a **free Gigasheet subscription** for you and your team. Use Gigasheet to search, filter, and export RevenueBase contacts and companies, and to run enrichment workflows. ## What Gigasheet looks like ![Gigasheet interface showing the main workspace with a Filter dialog open, spreadsheet-style grid with columns like Last Name, Job Level, Job Function, and a status bar indicating row and column counts.](https://mintcdn.com/revenuebase/tQY6lMrXS65RP65S/images/gigasheet-overview.png?fit=max\&auto=format\&n=tQY6lMrXS65RP65S\&q=85\&s=b2705c49a1cbb870871fcb01b63bc699) The screenshot above, which shows the Gigasheet workspace, a spreadsheet-style grid with a filter dialog. ## How the data is structured Gigasheet exposes RevenueBase data in pre-joined tables so you can work without writing SQL or joining rows yourself. Person + Organization One table contains all people in the database with organization information already joined. Person + Organization + Insight In this enhanced package, the table includes people, organizations, and insights all joined together. ## What you can do * **Search** — Find people and organizations by name, domain, industry, and other attributes. * **Filter** — Narrow results with filters on verification status, seniority, company size, and more. * **Export data** — Download filtered results as CSV or use them in downstream tools. * **Enrich your data with RevenueBase data** — Enrich your own lists using RevenueBase data inside Gigasheet. ### Core features 1. [Filtering](/docs/gigasheet/advanced-usage/search-filter-views/filtering) - Build targeted lists with 150+ filters. 2. [Grouping & aggregation](/docs/gigasheet/advanced-usage/search-filter-views/grouping) - Roll up people to company level for account prioritization. 3. [Saved views](/docs/gigasheet/advanced-usage/search-filter-views/saved-views) - Save and reuse filter logic; views update monthly. 4. [Sharing data](/docs/gigasheet/advanced-usage/search-filter-views/sharing-data) - Share sheets and views with your team. 5. [Exporting data](/docs/gigasheet/advanced-usage/export-enrichment/exporting) - Download filtered results as CSV or export to HubSpot. 6. [Enrich your data](/docs/gigasheet/advanced-usage/export-enrichment/enrichment) - Enrich your lists with RevenueBase contact and company data. ### Reference Monthly data updates How and when data is refreshed. Troubleshooting & FAQs Who to contact and common questions. # Gigasheet Source: https://docs.revenuebase.ai/docs/gigasheet/setup-and-access Log into Gigasheet with your RevenueBase credentials to access verified B2B contact and company data in a spreadsheet interface — no SQL required. Log into Gigasheet to access your RevenueBase data in a spreadsheet-style interface. Once you're in, you can search, filter, save views, and export — no SQL or code required. ## Setup your Gigasheet integration **1. Locate Integrations** On the RevenueBase web application, select `Integrations` from the side bar. **2. Fill in your account details** ![Setting up your Snowflake integration in RevenueBase.](https://mintcdn.com/revenuebase/Auh5vTyjkiLq1Qq7/images/portal/integration-gigasheet.png?fit=max\&auto=format\&n=Auh5vTyjkiLq1Qq7\&q=85\&s=123baeeee3acce58b4713d8b329b93fc) Under `Step 1 — Confirm your account details`, submit your name and email. **3. Wait for workspace setup** Once your information has been submitted, please allow a few seconds for the Gigasheet workspace to be provisioned. ![Setting up your Snowflake integration in RevenueBase.](https://mintcdn.com/revenuebase/Auh5vTyjkiLq1Qq7/images/portal/integration-gigasheet-step2.png?fit=max\&auto=format\&n=Auh5vTyjkiLq1Qq7\&q=85\&s=6c4278b70e33edc8ac01c744b43f5aeb) **4. Confirmation** Once your Gigasheet workspace has been provisioned, you will receive an invitation email directly in your inbox to get started. ![Setting up your Snowflake integration in RevenueBase.](https://mintcdn.com/revenuebase/Auh5vTyjkiLq1Qq7/images/portal/integration-gigasheet-confirm.png?fit=max\&auto=format\&n=Auh5vTyjkiLq1Qq7\&q=85\&s=ad5f56778f498d639d42521009228055) ## Log in and open your RevenueBase file **1. Open the RevenueBase file link and log in** Open the [RevenueBase file in Gigasheet](https://app.gigasheet.com/spreadsheet/RevenueBase-File/5f776238_022d_46c4_b0f1_8f6cfff75132) (or use your Gigasheet URL from your admin). Log in with your credentials. If you use SSO or a custom domain, use the sign-in option your organization has configured. **2. Open Shared with me** Under **Workspaces**, open the **Shared with me** section. Your RevenueBase file is listed there. **3. Open your RevenueBase file** Click the RevenueBase file to open your licensed dataset (e.g. people + company or enhanced view). You can then search, [filter](/docs/gigasheet/advanced-usage/search-filter-views/filtering), [save views](/docs/gigasheet/advanced-usage/search-filter-views/saving-views), [export](/docs/gigasheet/advanced-usage/export-enrichment/exporting), and [enrich your data](/docs/gigasheet/advanced-usage/export-enrichment/enrichment). ## Video walkthrough [YouTube video player](https://www.youtube.com/embed/NuyznbE-PH8?si=qEK3-QjlJu73X4Ox) > [!TIP] > > **Prefer to browse from the app?** You can also go to [Gigasheet](https://gigasheet.com), log in, and navigate to **Workspaces** → **Shared with me** to find the RevenueBase file. > [!WARNING] > > If you don't have a Gigasheet login or don't see RevenueBase data in **Shared with me**, contact your account manager or admin to confirm your subscription and access. You can also contact **[support@revenuebase.ai](mailto:support@revenuebase.ai)**. ## Account & login rules 1. **One account per email.** Multiple users cannot log in with the same email — this breaks the system. Each user must have their own email account. 2. **Business email required.** Emails must be on a business domain. 3. **Consistent email required.** If you have multiple business domains, you must access the platform with the email your account was originally created with. Using a different domain email will result in incorrect account permissions. Next Steps Get started with your Gigasheet access and start querying RevenueBase data. # Use Audience Builder Source: https://docs.revenuebase.ai/docs/portal/audience-builder Build an audience, refine the matches, enrich an existing list, and export the records you need. Use **Audience Builder** in the [RevenueBase portal](https://app.revenuebase.ai) to find companies and the people who work at them. Start with your target audience, inspect the matches, and choose how many records to retrieve. ## Credits and plans | Activity | Pay-as-you-go (PAYG) | All-you-can-eat (AYCE / Unlimited) | | - | - | - | | Audience counts and masked contact samples | **Free**, including Smart search | **Included**, 0 credits | | Contact export | **1 credit per contact**, plus selected populated email/mobile details and any SmartSearch fee | **Unlimited**, including available email and mobile details | | Company export | **1 credit per company**, plus any SmartSearch fee | **Unlimited**, 0 retrieval credits | | HubSpot export | Requires Unlimited | **Included** when the integration is available and connected | On PAYG, a selected populated email adds **1 credit** and a selected populated mobile adds **10 credits**. SmartSearch adds **10 credits per filter node** on a paid retrieval, rather than per record. Missing email or mobile values add no detail charge. For example, exporting 100 contacts with email selected, 80 populated emails, and no SmartSearch costs **180 credits**. The portal shows an estimate before you confirm. See [Credits & Plans](/api-reference/v2/credits) for the complete pricing and reservation rules. ## Build your first audience Start with a specific audience, such as: > Heads of sales based in the United States, working at software companies with 50–200 employees. 1. Open **Audience Builder**. 2. Describe the audience in the chat and send your request. To build it manually, choose **Edit filters**. 3. Open **Edit filters** to review the resulting conditions. Check the job title, company description, company size, and location separately. 4. If you change the filters, choose **Update audience**, then inspect a few matches in **Contacts** and **Companies**. 5. Adjust the filters until the results reflect your intended audience. A written description is a starting point. The filters determine which records match, so review them when you change the prompt or add a new condition. Chat and the filter editor work on the same audience. Watch: How do I describe my audience? ## Understand the result views | View | Use it to… | | - | - | | **Contacts** | Inspect people and their available company information. | | **Companies** | Inspect the companies matching the company part of your search. | | **Audience report** | Review aggregate breakdowns of the audience. | | **API request** | Get a request for the current search to use in your own software. | Contact and company totals measure different things. One company may have many matching contacts. The rows visible in the grid are a preview, so they can be fewer than the total audience. If you only see companies, choose **Contacts**. Then check that your person filters describe the people you need. Watch: Why am I only seeing companies? ## Refine your filters ### Choose Exact search or Smart search Use **Exact search** for known values, such as a country, company size, or a specific field value. Use **Smart search** to match meaning in a company description or job title. For example, a company may sell software to hospitals without using your exact phrase “healthcare software.” A description-based Smart search can find relevant businesses beyond that phrase. Review the results and add exact constraints where needed. **Company lookalike** uses seed company domains or RevenueBase organization IDs. Enter domains such as `revenuebase.ai`, rather than company names. Watch: Smart search or Exact search? Watch: When keyword search can't find the audience ### Adjust matching precision Smart search offers **Broad**, **Related**, **Similar**, and **Exact** matching presets. Start broader when exploring a market. Tighten the match when adjacent industries or roles are getting in the way. The **Exact** Smart search preset is a precision setting for meaning-based matching. Use **Exact search** when you need a direct field constraint. See [SmartSearch](/api-reference/v2/smartsearch) for how the matching presets work. If the results include the wrong industry, refine the company description, tighten the precision, and add an exact industry condition if it reflects your target. Watch: Broad, Related, Similar, and Exact Watch: Results include the wrong industry ### Separate person location from company headquarters **Person location** describes where a contact is based. **Company headquarters** describes the company's location. A contact in Canada may work for a company headquartered in the United States. For the example above, apply United States to the person's location. Add a company headquarters condition only if you also want the employer to be based there. Watch: Person location or company HQ? ### Understand location fields Start with **Location 0** for the full explanation, then use **Location 1** for a shorter introduction to what location means in your search. Watch: Location 0 - Every location field explained Watch: Location 1 - What does location mean? ### Troubleshoot location results Use these walkthroughs when results include people outside your target area or when adding location conditions reduces your audience. Review the selected location fields and how their conditions combine. Watch: Location 2 - Why am I seeing people outside my area? Watch: Location 3 - Why did my list shrink? ### Choose location filters and coverage Choose the location that matches your goal, then review how to combine location conditions for wider coverage. Use **AND** when every requirement must match and **OR** when either alternative is acceptable. Watch: Location 4 - Which location should I use? Watch: Location 5 - How do I get the widest coverage? ### Combine conditions with AND, OR, and groups * **AND** requires every condition in the group to match. * **OR** requires at least one condition in the group to match. * **Group** lets you combine alternatives while keeping other requirements in place. For example, use a title group of “Head of Sales OR VP of Sales,” then combine it with “person based in the United States” using AND. Putting the location inside the OR group would allow it to match on its own. Watch: AND, OR, and groups ## Match a list you already have Open **Edit filters → Match your data** when you already know which people or companies you want to find. You can also use the **Enrich your data** plus button in the chat. | Input you have | Matching option | | - | - | | Email addresses | **Email enrich** | | LinkedIn person URLs | **Enrich LinkedIn Person URL** | | LinkedIn company URLs | **Enrich LinkedIn Company URL** | | Company website domains | **Domain Enrich** | 1. Choose the matching option for your identifiers. 2. Paste your list or upload a file using that option's input controls. Follow the template and size limit shown there. 3. Review the matched contacts or companies. Remove extra spaces and check that each input has the expected format if matches are missing. 4. Choose the fields you need and review the retrieval cost before exporting. **Email enrich** accepts a CSV with an `Email`, `email_address`, or `business_email` column, regardless of capitalization. It skips blank rows, invalid email cells, and duplicate addresses. Use domains for domain matching and full LinkedIn profile or company URLs for URL matching. Multiple contacts can belong to one company, so a domain list and a contact list need not produce the same number of rows. > [!NOTE] > > Enrichment finds RevenueBase records and adds their available fields. To check whether email addresses are deliverable, use [Email Verifier](/docs/portal/email-verifier). Watch: Enrich a list you already have ## Understand previews On PAYG and trial accounts, contact browsing uses a free masked sample. Availability indicators show whether an email or mobile exists without revealing the value. A masked field is different from a missing field. Unlimited accounts can retrieve full contact records under their plan. The preview size and export limits shown in the portal still apply. A preview is a way to inspect the audience; it does not mean every matching record is already on screen. ## Save and reopen an audience 1. Build the filters you want to keep. 2. Open **Save audience** and choose **Save**. Give a new audience a name when prompted. 3. Open **Audiences** to find and reload it later. 4. Use **Save As...** to keep a separate version of an audience. A saved audience keeps the search configuration so you can run it again. An exported CSV is a file of the records retrieved by that export. Saving an audience does not purchase its results or freeze the underlying dataset. Private audiences stay private unless explicitly shared. An Admin role alone does not make a colleague's private work visible. Watch: Save and reload an audience ## Export records 1. Check the **Contacts** or **Companies** view and choose the columns you want in the CSV. 2. Open **Export**. Choose selected rows, the preview, or a larger set of matches from the options available to your account. 3. For contacts, choose whether to include available emails, mobile numbers, or both. On PAYG, these choices affect the cost. 4. Set the record count or budget in the export controls. Review the estimate and the credits required to start. 5. Confirm the export. Larger exports run in the background. 6. Open **Notifications**, the bell at the top right, to download the completed file. The displayed export limit may cap a larger audience. Check the final row count before starting. If you need more than your current limit, contact [support@revenuebase.ai](mailto:support@revenuebase.ai). ### Understand reserved credits An estimate is a forecast. A paid export can reserve enough credits for every selected detail to be populated, so the credits required to start can be higher than the estimate. When the job finishes, it charges for the actual records and selected populated details, plus any SmartSearch fee, and releases unused reserved credits. If you cannot start an export, reduce the number of records or the selected details. An admin can also add organization credits or adjust your monthly limit. Starting a new export can charge again; reopen the existing completed file when you just need another download. Watch: What does an export cost? ## Send an audience to HubSpot HubSpot export is available to eligible **Unlimited** accounts when the integration is configured. Open **Export** in Audience Builder. If you see **Connect HubSpot**, follow that connection flow. Once connected, choose **Export to HubSpot** and review the selected records before sending them. If you cannot see the option, check your plan and ask your admin or RevenueBase support about integration availability. An admin manages connection configuration; Members can use an already-configured integration where their access allows it. Watch: Send an audience to HubSpot ## Get the API request for your search Open **API request** to see how to run your current search from your own software. Choose the request example you need, then use your own key from **My API keys**. Follow the [Contact API walkthrough](/api-reference/v2/contact-api-overview) to count, inspect, estimate, and retrieve records. Watch: Get the API call for any search # Use Email Verifier Source: https://docs.revenuebase.ai/docs/portal/email-verifier Verify a single email or a CSV/JSON list, understand the results, and download your completed batch. Open **Email Verifier** in the [RevenueBase portal](https://app.revenuebase.ai) to check whether an address is deliverable. You can check one address or upload a list. ## Credits and plans | Result or action | Pay-as-you-go (PAYG) | All-you-can-eat (AYCE / Unlimited) | | - | - | - | | **Valid** result | **1 credit** | **1 credit** | | **Invalid** result | **1 credit** | **1 credit** | | **Unknown** result | **Free**, 0 credits | **Free**, 0 credits | | Upload, check progress, cancel, or download | **Free**, no additional charge | **Free**, no additional charge | | Request metadata through the API | **Included**, no extra cost | **Included**, no extra cost | Unlimited contact retrieval does not include unlimited email verification. Verification uses the same per-result prices on both plans. Before a batch starts, you need enough available credits for its email count at one credit each. The final charge counts **Valid + Invalid** results. For example, 1,000 inputs with 800 Valid, 150 Invalid, and 50 Unknown results cost **950 credits**. ## Verify one address 1. Open **Email Verifier**. 2. Enter the address under **Verify a single email address**. 3. Click **Verify email**. 4. Read the status beside the address. | Status | Meaning | What to do next | | - | - | - | | **Valid** | The address was confirmed as deliverable at the time of the check. | Use it in your outreach workflow, subject to your usual sending practices. | | **Invalid** | The verification determined that the address is not deliverable. | Remove or correct it before sending. | | **Unknown** | The check could not establish a conclusive result. | Keep it separate from confirmed Valid results; consider checking it again later. | An Unknown result does not confirm that the address is invalid. A Valid result describes the check at that time; it does not guarantee inbox placement for every message. ## Verify a list ### Prepare your file Upload a **CSV or JSON file up to 25 MB** with a field named **`email`**. Optional columns are preserved in the output, so you can keep an internal contact ID beside each address. For example, a CSV can contain: ```csv theme={null} email,contact_id alex@example.com,contact-001 jamie@example.com,contact-002 ``` Use the template offered in the upload area if you need a starting file. Rows without an email are skipped. ### Submit the batch 1. Drag the file into **Upload email list**, or choose it from your computer. 2. Review the detected email count, skipped rows, and credit estimate. 3. Confirm that you have enough available credits, then start verification. 4. Find the batch in **Job history** below the upload area. If you do not have enough credits, an admin can add organization credits or adjust your monthly limit. You can also submit a smaller list. See [Organization settings](/docs/portal/organization-settings#understand-shared-credits-and-monthly-limits). Watch: Verify a list before you send ## Track progress and download results Use the status filter in **Job history** to find a batch. Completed jobs show their row counts, Valid, Invalid, and Unknown totals, and credits used. | Job status | What it means | Available next step | | - | - | - | | **Queued** | Waiting to begin. | Wait, or cancel the batch. | | **Processing** | Verification is running. | Wait, or request cancellation. | | **Complete** | Processing has finished. | Download from the file name or download icon. | | **Error** | The job ended with an error. | Read the error message before deciding whether to submit again. | | **Cancelling** | A cancellation request is being processed. | Wait for the final state. | | **Cancelled** | The batch stopped before completion. | Download any available partial output. | To cancel a queued or processing batch, choose its cancel control and confirm. Checks already processed as Valid or Invalid remain billable. Cancellation does not refund those checks. Downloading the same completed batch again adds no verification charge. Submitting the file as a new batch runs new checks and can charge again. ## Understand metadata and email providers The portal shows the main **Valid**, **Invalid**, or **Unknown** result. If your workflow needs detailed metadata, use the [Email Verification API](/api-reference/v2/email-verification-overview) and request metadata there. **Requesting metadata does not increase the cost.** The [metadata reference](/api-reference/v2/email-verification-metadata) explains the detailed statuses, catch-all results, and email-provider classifications. A provider value of Unknown is separate from a verification result of Unknown. For high-volume outbound workflows with tools such as Smartlead or Instantly, `email_provider` can help you group Google and Microsoft recipients for provider-matched sending. Customers have reported benefits from this approach, but RevenueBase has no controlled benchmark for the size of the improvement. See the [provider guidance](/api-reference/v2/email-verification-metadata#metadata-fields). To find or add information about people and companies, use [Audience Builder](/docs/portal/audience-builder#match-a-list-you-already-have). # Manage organization settings Source: https://docs.revenuebase.ai/docs/portal/organization-settings Understand Admin and Member access, invite colleagues, and manage shared credits, monthly limits, and team API keys. Your organization brings your team together around a shared RevenueBase credit balance. Open your **organization name** at the bottom of the [portal](https://app.revenuebase.ai) sidebar and choose **Organization Settings**. Use **Members** for the directory and invitations, **Usage & limits** for credits, and **Team API keys** for admin key oversight. ## Compare Admin and Member access | Action | Member | Admin | | - | - | - | | Use Audience Builder and Email Verifier | **Yes**, subject to plan and available credits | **Yes**, subject to plan and available credits | | View the member directory | **Yes** | **Yes** | | Invite people, manage invitations, change roles, or remove members | No | **Yes** | | View personal available credits and monthly usage | **Yes** | **Yes** | | View organization balances and manage monthly member limits | No | **Yes** | | Create, rotate, or revoke personal API keys | **Yes**, own keys | **Yes**, own keys | | View team key metadata and revoke team keys | No | **Yes** | | Buy credits and manage billing or connection configuration | No | **Yes** | | Use an already-configured integration | Where available under the account's access and plan | Where available under the account's access and plan | Private jobs, results, exports, and audiences are not automatically visible to the whole organization. Being an Admin does not grant access to a colleague's private work. Explicitly shared resources follow their sharing permissions. ## Invite colleagues **Admins only.** 1. Open **Organization Settings → Members**. 2. Choose **Invite members**. 3. Enter one or more email addresses, separated by commas, spaces, or new lines. Duplicate addresses are ignored. 4. Choose **Member** or **Admin**. That role applies to everyone in this invitation. 5. Send the invitations. Each person receives an email link to join your organization. Choose Member for someone who needs to search, export, or verify emails. Choose Admin when they also need to manage team access, spending limits, or billing. If some invitations fail, the dialog identifies those addresses. **Retry failed invitations** retries those recipients without resending the successful invitations. ### Manage pending invitations Find pending invitations on the **Members** page. Resend an invitation if the recipient needs another email, or revoke it if they should no longer join. Revoking a pending invitation is different from removing someone who has already joined. ### Join an organization Open the invitation email and follow its link. Sign in or create an account using the invited email address. If you cannot find the invitation, check spam and ask an admin to confirm the address and resend it. ## Change roles or remove members **Admins only.** Find the person on **Members**, choose the role change or removal action, and read the confirmation before applying it. * Changing a role changes what the person can manage. Promote someone to Admin only when they need those controls. * Removing a member removes their organization access and revokes their keys. It does not make their private work team-visible. * The portal protects the last Admin from removal or demotion. Keep another Admin in place before changing the last Admin's access. If a newly changed role is not reflected immediately, refresh the portal or sign in again. Contact [support@revenuebase.ai](mailto:support@revenuebase.ai) if access still looks wrong. ## Understand shared credits and monthly limits Everyone spends from **one organization credit balance**. Admins can add an optional monthly spending limit for each person. | Setting or condition | Effect | | - | - | | **No personal limit** | No individual monthly cap. Spending still depends on available organization credits. | | A positive monthly limit | This month's usage and credits reserved for the person's running jobs count toward that limit. | | A limit of **0** | Blocks new spending. | | Monthly reset | Usage resets on the **first day of each month at 00:00 UTC**. Unused limits do not roll over. | | Organization credits run out | New paid work cannot start, even if the person has room under their limit. | | A limit exceeds the organization balance | The limit is allowed, but it does not guarantee those credits will be available. | > [!NOTE] > > A monthly limit is a spending cap, not an allocation. Setting a 5,000-credit limit does not reserve 5,000 credits for that person. Other members draw from the same pool. For example, if the organization has 8,000 available credits and two members each have a 5,000-credit limit, they share those 8,000 credits. They do not each have a separate 5,000-credit balance. The plan determines which actions use credits. **Unlimited contact and company retrieval remains included**; email verification still uses credits for Valid and Invalid results. See [Credits & Plans](/api-reference/v2/credits). ### Set a monthly limit **Admins only.** 1. Open **Usage & limits**. 2. Find the member under **Member usage & monthly limits** and choose **Edit limit**. 3. Choose **No personal limit** or **Set monthly limit**. 4. If setting a limit, enter the monthly credit amount. Review this month's usage, running-job reservations, and the credits that would remain. 5. Choose **Save limit**. Usage already incurred this month counts toward a newly saved limit. Lowering the limit can leave no credits available for new work; it does not erase prior usage. Some existing accounts show **Existing lifetime limit**. That restriction remains until an admin explicitly saves a monthly setting. Saving replaces it with the new monthly limit policy. ### Read usage and reservations Members see **Your available credits** and their own monthly usage. Admins also see **Team credits available**, **Reserved for running jobs**, **Team credit balance**, and member usage controls. **Reserved for running jobs** means credits are held while work runs. When a job finishes, its actual cost is charged and unused reserved credits are released. These job reservations are separate from monthly spending limits. If you have reached your monthly limit, wait for the reset or ask an admin to increase it. If the organization has run out of credits, an admin needs to add funds. Increasing your personal limit alone does not replenish the organization balance. ## Manage team API keys **Admins only.** Open **Team API keys** to inspect key owners, masked key details, permissions, and creation information. Choose **Revoke** and confirm when a key should no longer work. Team oversight does not reveal another person's full key or let an admin create or rotate a key for them. Each person uses **My API keys** to create and manage their own keys. See [API key instructions](/docs/portal/settings-and-billing#manage-your-api-keys). ## Manage billing and personal settings * **Plan & Billing**, in the organization menu, lets admins review plans, buy organization credits, and manage invoices and billing details. * **Profile settings**, in the same menu, is for each person's own profile, sign-in security, and account deletion. * **My API keys** remains a separate sidebar item for everyone. See [Settings and billing](/docs/portal/settings-and-billing) for the walkthroughs. ## Resolve access problems | What you see | What to check | | - | - | | Missing billing, invitation, limit, or team-key controls | These actions require Admin access. Ask an Admin in your organization. | | No credits available | Check whether you reached a personal limit, credits are reserved for running jobs, or organization funds have run out. | | An invitation does not work | Confirm the invited email address and ask an Admin to check or resend the pending invitation. | | A colleague's audience or export is missing | Private work is not automatically shared. Ask the owner whether it was explicitly shared with you. | | Account deletion is blocked for the last Admin | Arrange another Admin first, or contact support if you need to close the organization. | For unresolved account issues or organization deletion, contact [support@revenuebase.ai](mailto:support@revenuebase.ai). # Start with the RevenueBase portal Source: https://docs.revenuebase.ai/docs/portal/overview Find an audience, enrich a list, or verify email addresses without writing code. The [RevenueBase portal](https://app.revenuebase.ai) gives you two apps: **Audience Builder** for finding contacts and companies, and **Email Verifier** for checking addresses you already have. ## Choose your first task | I want to… | Start here | | - | - | | Find people or companies that match my ideal customer | [Build an audience](/docs/portal/audience-builder#build-your-first-audience) | | Add contact or company information to an existing list | [Match your data](/docs/portal/audience-builder#match-a-list-you-already-have) | | Check whether email addresses are deliverable | [Use Email Verifier](/docs/portal/email-verifier) | | Invite colleagues or set their spending limits | [Open Organization Settings](/docs/portal/organization-settings) | | Manage my profile, API keys, plan, or invoices | [Open settings and billing](/docs/portal/settings-and-billing) | ## Sign in 1. Open [app.revenuebase.ai](https://app.revenuebase.ai) and sign in with your account email or the sign-in provider you use for RevenueBase. 2. Complete any email or account verification requested on screen. 3. Choose **Audience Builder** or **Email Verifier** from the sidebar. If a colleague invited you, use the link in the invitation email to join their organization. Use the email address that received the invitation. You can use the portal without an API key. You only need a key when connecting your own software or an [AI assistant through MCP](/docs/getting-started/mcp). ## Understand credits before you start | Activity | Pay-as-you-go (PAYG) | All-you-can-eat (AYCE / Unlimited) | | - | - | - | | Check audience counts and inspect a masked contact sample | **Free**, 0 credits | **Included**, 0 credits | | Retrieve contacts and companies | **Uses credits** when you retrieve paid records | **Unlimited**, 0 retrieval credits | | Verify email addresses | **1 credit** per Valid or Invalid result; Unknown is free | **1 credit** per Valid or Invalid result; Unknown is free | Unlimited includes available contact email and mobile details. Request limits and account access controls still apply. See the [full credit comparison](/api-reference/v2/credits) for retrieval prices and the difference between an estimate, reserved credits, and the final charge. Your organization shares one credit balance. If you have a monthly spending limit, **Your available credits** reflects what you can use now. [Ask an admin](/docs/portal/organization-settings#understand-shared-credits-and-monthly-limits) if you need more. Watch: What's free in the trial? ## Find your settings Open your **organization name** at the bottom of the sidebar for **Organization Settings**, **Plan & Billing**, **Profile settings**, and **Log out**. Billing controls are available to admins. **My API keys** is a separate sidebar item for both Admins and Members. The [Organization settings guide](/docs/portal/organization-settings) explains what each role can do. ## Understand the data * [Data Coverage](/docs/data-features/data-coverage): explore countries, field availability, and verification recency. Country selections use the saved daily report. * [Data Dictionary](/docs/data-features/data-dictionary): look up fields and their definitions. * [Data Freshness](/docs/data-features/data-freshness/data-freshness): understand when and how information is checked. * [Verification summaries](/docs/data-features/data-freshness/verification-summaries): review the checks behind profile and email data. For account or data questions, contact [support@revenuebase.ai](mailto:support@revenuebase.ai). # Manage settings and billing Source: https://docs.revenuebase.ai/docs/portal/settings-and-billing Update your profile, manage your API keys, and find plan, credit, and billing controls. Open your **organization name** at the bottom of the [portal](https://app.revenuebase.ai) sidebar to find account and organization controls. **My API keys** stays in the main sidebar. ## Find the right settings | Setting | Where to open it | Who can use it | | - | - | - | | Your name, sign-in security, and account deletion | Organization menu → **Profile settings** | Admins and Members, for their own account | | Your API keys | **My API keys** in the sidebar | Admins and Members, for their own keys | | Members, invitations, usage, and monthly limits | Organization menu → **Organization Settings** | Members have a read-only directory and their own usage; admins manage the team | | Team API key metadata and revocation | Organization Settings → **Team API keys** | Admins | | Plan, credit purchases, invoices, and billing details | Organization menu → **Plan & Billing** | Admins | See [Organization settings](/docs/portal/organization-settings) for the full Admin and Member comparison. ## Update your profile 1. Open the organization menu and choose **Profile settings**. 2. Edit your first or last name. 3. Save your changes. Your email address is read-only here. Contact [support@revenuebase.ai](mailto:support@revenuebase.ai) if you need help with an account email change. ## Reset your password Password changes use the hosted sign-in screen. Follow the reset instructions in **Profile settings**, sign out, and choose **Forgot password** when signing back in. If you use Google or your organization's single sign-on, manage your password with that provider. You may not have a separate RevenueBase password. ## Manage your API keys You only need a key for API calls or connected tools, including [MCP](/docs/getting-started/mcp). Normal portal use does not require you to create one. ### Create a key 1. Open **My API keys**. 2. Choose **Create API key** and give it a name that identifies its purpose. 3. Select the permissions the integration needs. The available choices cover email verification and contact access; both are selected by default. 4. Create the key, then copy its full value from the confirmation and store it securely. The key list shows masked values afterward. 5. Add it to your integration using the [authentication guide](/api-reference/v2/authentication). Keep keys out of public documents, source code, and screenshots. Each person should manage their own keys; an admin does not create keys on another member's behalf. ### Replace or revoke a key The account's default key offers **Rotate**. Other keys offer **Revoke**, so you can replace one integration's key without changing the others. * **Rotate** replaces the default key. Copy the replacement and update any software using the old value. * **Revoke** stops a key from authorizing requests. For a planned replacement, create and install the new key before revoking the old one. Confirm the action only when you are ready for the old key to stop working. Admins can inspect and revoke team keys in [Organization Settings](/docs/portal/organization-settings#manage-team-api-keys), but cannot retrieve another person's full key or rotate it for them. ## Manage your plan and credits Admins can open **Plan & Billing** from the organization menu. | Tab | Use it to… | | - | - | | **Plan & credits** | Review the plan and purchase options, and add credits. | | **Invoices** | Find billing invoices. | | **Billing settings** | Manage the available billing details and payment settings. | PAYG charges for paid record retrieval. Unlimited includes **unlimited contact and company retrieval**, including available contact email and mobile details. **Email verification still costs one credit per Valid or Invalid result on either plan; Unknown is free.** Review [Credits & Plans](/api-reference/v2/credits) for the full comparison. Credit purchases add to the shared organization balance. A member's monthly limit controls how much they can spend; it does not create a separate balance or reserve part of the pool. ### Read the credit amounts | Amount | What it tells you | | - | - | | **Your available credits** | What you can spend now, subject to organization funds, your spending limit, and running-job reservations. | | **Team credits available**, shown to admins | Organization credits available for new work. | | **Reserved for running jobs** | Credits held while jobs run. Actual charges settle when the jobs finish, and unused reserved credits are released. | | **Team credit balance**, shown to admins | The shared organization balance, including credits currently reserved. | If a task stops for insufficient credits, an admin may need to add funds or increase your monthly limit. After that change, return to the task and check its status before submitting it again. Starting a second paid job can create another charge. ## Delete your account Account deletion is permanent. It removes your profile, personal API keys, private lists, and layouts. Your organization, shared resources, and organization credits remain; required billing records are retained. 1. Open **Profile settings** and find **Danger zone**. 2. Choose **Delete my account** and read the eligibility message. 3. If eligible, type `delete my account` and choose **Continue**. 4. Confirm the deletion. Complete a fresh sign-in if requested, then review the confirmation again. 5. Wait for confirmed completion and sign-out. If an error appears, follow its instructions; do not assume the deletion finished. The last admin cannot leave an organization without another admin taking over. Some accounts, including those linked to multiple organizations or legacy feed subscriptions, need support assistance. To delete the entire organization, contact [support@revenuebase.ai](mailto:support@revenuebase.ai). # Release notes Source: https://docs.revenuebase.ai/docs/release-notes Recent updates to the RevenueBase platform, APIs, and data. ## How to read our quality stats Here is how we measure the quality of our data: * **Email re-verification:** The share of distinct valid email addresses with a verification date within the stated window. The 30-, 45-, and 60-day windows are cumulative. * **Profile dates:** A recent verification timestamp should reflect a successful retrieval of current profile information. When that cannot be substantiated, the corrected date uses the last known profile-change date. Record update dates and successful profile observations measure different things. * **Company accuracy:** The share of company data verified by trusted sources within the past 90 days. November 2026 > [accordion] View November 2026 release notes > > The November release is live in Audience Builder, the API, and for Snowflake and S3 customers. It brings broader coverage and SmartSearch for finding relevant companies and roles when exact wording misses them. > > Business contacts > > **435.8M** > > Business emails > > **72.0M** > > Mobile numbers > > **54.5M** > > ## Data release > > Coverage increased in this release: > > | Metric | Total | Change | > | - | -: | -: | > | Business contacts | 435.8M | +27.4M | > | Companies | 68.0M | +0.6M | > | Business emails | 72.0M | +5.0M | > | Mobile numbers | 54.5M | +1.0M | > > ## Email re-verification > > * **98.4%** of emails were re-verified within the past 45 days. > * **80%** were re-verified within the past 30 days. > > ## More recently verified data > > * **Contact profiles:** 65.6% were verified or re-verified on LinkedIn within 90 days, up from 33.9% in October. > * **Company information:** 54.7% was verified by trusted sources within 90 days. > > ## SmartSearch in Audience Builder > > * **Find the audience your keywords miss.** SmartSearch matches meaning in company descriptions and job titles. For example, a company that sells software to hospitals can match even if its description never says "healthcare software." > * **Use Exact search for known values** such as country or company size. > * **Refine as you go.** Review your filters and matches, then adjust the audience. October 2026 > [accordion] View October 2026 release notes > > The October release brings broader contact coverage, more frequent email verification, corrected profile timestamps, and new Audience Builder workflows. > > ## Data release > > * **413M+ contact records**, **66M+ distinct valid business email addresses**, and **53M+ contact records with cellphones**. > * **60 million profiles updated within the past 30 days** in this release. > * Job titles are present on **90.4%** of contact records and job start dates on **64.3%**. > > ## More frequent email verification > > * We are increasing how often we verify email addresses to help customers running high-volume outbound campaigns lower already low bounce rates even further. > * The valid-email total has declined slightly because more frequent checks identify addresses that no longer pass verification. > * This release contains **66,770,864 distinct valid business email addresses**. Their latest verification dates fall within these windows: > > | Verification window | Valid email addresses | Share of valid email addresses | > | - | -: | -: | > | Past 30 days | 35,530,606 | 53.2% | > | Past 45 days | 65,185,437 | 97.6% | > | Past 60 days | 65,273,456 | 97.8% | > > ## Corrected profile timestamps > > * Some profile checks could not retrieve the latest LinkedIn information. Older information was carried forward, but those records incorrectly received a recent verification timestamp. > * We fixed this issue and retroactively corrected dates on **more than 100 million profiles**. Where a recent observation could not be verified, we used the last known profile-change date. > * The average recorded age now appears older because the dates have been corrected. This does not mean all affected profile information is inaccurate. > * We are refreshing affected profiles with updated information. **Weekly data updates are planned this quarter** to shorten the time between receiving new information and making it available to customers. > * Use **Audience Report** to review freshness and field coverage for your audience before exporting. > > ## Audience Builder improvements > > * **Build and refine audiences in chat.** Describe the people and companies you want, inspect the applied filters, and undo changes as you refine your search. > * **Export company lists.** Switch to the Companies tab and export selected companies, the preview, or all matches. > * **Choose your export columns.** Export only the visible columns and review the credit cost before starting. > * **Add only new records to HubSpot.** Choose “Only add net-new records” to skip matches already in HubSpot and review the skipped-record summary. > * **Follow background jobs.** The Notifications drawer shows longer-running exports and email-verification jobs, with All, Unread, and Trash filters. September 2026 > [accordion] View September 2026 release notes > > Email re-verification > > **98.8%** > > Contact freshness > > **89%** > > Company accuracy > > **82.3%** > > > [!NOTE] > > > > Direct data feed customers can access the September release today. It will be live in Gigasheet and Audience Builder later this week. > > ## What's new > > This cycle focused on HQ address and organization data. > > > [accordion] Dataset scale: 401M contacts > > > > The September release brings the dataset to **401M+ verified contacts**, with **68M+ business emails** and **53M+ cellphone numbers**. > > > > Organizations grew by **1.6M** (65.9M to 67.6M, +2.5%), and contacts grew by **1.8M**. > > > [accordion] Company HQ location coverage improvements > > > > HQ location fields on organization records saw major fill-rate gains: > > > > * **HQ country / region / continent:** 88.4% → 97.4% > > * **HQ city:** 77.2% → 82.9% > > > [accordion] Organization enrichment fill-rate improvements > > > > * **Company logo:** 58.2% → 82.3% > > * **LinkedIn employee profile counts on LinkedIn company records:** 34.3% → 43.4% > > > [accordion] Fixed truncated "About" text on person profiles > > > > A subset of contact profiles carried a truncated preview snippet of the LinkedIn "About" section, cut off with an ellipsis, instead of the full bio text. This happened because LinkedIn started hiding the full field value. Affected records have been backfilled with the complete text. > > > [accordion] HQ street and postcode: accuracy over volume > > > > HQ street coverage moved from **67% to 56.1%**, and HQ postcode from **73.3% to 61.1%**. This is a deliberate trade-off. > > > > Previously, a company's "primary office" was promoted to HQ even when it was a regional branch. Street and postcode are now filled only from a source that agrees with the resolved HQ on city and country. Fewer fields are filled, but the ones you get are the real headquarters. August 2026 > [accordion] View August 2026 release notes > > Email re-verification > > **97.7%** > > Contact freshness > > **89%** > > Company accuracy > > **60%** > > ## What's new > > > [accordion] Dataset scale: 399M contacts > > > > The August release brings the dataset to **399M total contacts**, with **66M verified emails** and **53M cellphone numbers**. > > > [accordion] Resolved \~3M duplicate profiles from multiple LinkedIn URLs > > > > De-duplicated approximately 3M profiles created when the same individual was represented under multiple LinkedIn URLs, including cases where a profile URL changed due to a name edit or a custom URL update. > > > [accordion] Corrected country default bug on organization records > > > > Fixed a systematic bug affecting 33,427 organization records where international cities were incorrectly defaulted to "United States" or "India" as the headquarters country. > > > > **Impact:** Organization HQ country fill-rate improved to 88% (from 87%). July 2026 > [accordion] View July 2026 release notes > > Email re-verification > > **98.4%** > > Contact freshness > > **77.5%** > > Company accuracy > > **89%** > > ## What's new > > > [accordion] Dataset scale: 403M contacts > > > > The June release brings the dataset to **403M total contacts** (no change), with **66.5M verified emails** (+1.2M) and **53.2M phone numbers** (-0.2M). > > > [accordion] Fixed job order in profile indicator > > > > The job\_order\_in\_profile field is used to indicate > > the sequence of a person's job history entries as they appear on their LinkedIn profile. In some cases, this > > value did not correctly reflect the true LinkedIn display order — job history entries could appear out of > > sequence when reconstructed from this field. > > > [accordion] Massive update of companies websites and domains > > > > Roughly 3M companies saw updates to their websites and domains. June 2026 > [accordion] View June 2026 release notes > > Email re-verification > > **97%** > > Contact freshness > > **84%** > > Company accuracy > > **89%** > > ## What's new > > > [accordion] Dataset scale: 403M contacts > > > > The June release brings the dataset to **403M total contacts** (+15M), with **65.3M verified emails** (+0.3M) and **53.4M phone numbers** (+0.6M). > > > [accordion] Persona and job classification fill-rate recovery > > > > AI-classified fields recovered coverage that was missing from the May release, with substantial gains across all three dimensions: > > > > * **Persona:** 71% → 84% > > * **Job function:** 66% → 79% > > * **Job level:** 73% → 87% > > > [accordion] Enrichment field fill-rate improvements > > > > Additional fill-rate gains across several enrichment fields: > > > > * **ERP tech org:** +11pp > > * **Education:** +5pp > > * **LinkedIn connections count:** +4pp > > * **LinkedIn headline:** +1pp May 2026 > [accordion] View May 2026 release notes > > Email re-verification > > **98%** > > Contact freshness > > **83%** > > Company accuracy > > **89%** > > ## What's new > > > [accordion] Dataset scale: 388M contacts > > > > The May release brings the dataset to **388M total contacts**, with approximately **65M verified emails** and **52.8M cellphone numbers**. > > > [accordion] Fill-rate improvements across enrichment fields > > > > Significant fill-rate gains across multiple enrichment fields in this release: > > > > * **Persona:** 62.2% → 71.3% *(expected to grow further in the next release)* > > * **Job function:** 60.0% → 66.7% > > * **Job level:** 70.1% → 72.6% > > * **Education:** 41.4% → 44.8% > > > [accordion] LinkedIn Member ID now available > > > > A new `linkedin_num_id` field is now exposed on person records with a fill-rate of \~95%. This is the permanent numeric LinkedIn Member ID (also referred to as Member Number, LinkedIn ID, or Person ID in API contexts) — a fixed identifier that cannot be changed, unlike vanity profile URLs which users can update at any time. > > > > Because the numeric ID is stable and permanent, it's the preferred identifier for deduplication and cross-system matching. Customers frequently use it to reliably link RevenueBase records with their own CRM data or third-party enrichment sources. > > > [accordion] Resolved \~5M hidden duplicate profiles > > > > Fixed an issue where the same person could appear multiple times in the dataset with different LinkedIn profile URLs due to URL encoding variations. Approximately 5M affected records have been deduplicated, improving overall dataset consistency. April 2026 > [accordion] View April 2026 release notes > > Email re-verification > > **97%** > > Contact freshness > > **84%** > > Company accuracy > > **89%** > > The Contact Freshness is less than our usual number due to brand new contacts we have imported from a new vendor updated at the end of 2025. > > ## What's new > > > [accordion] Extended Data Source for Social Profile Collection > > > > Integrated an additional data source for collecting social profiles, broadening the foundation of our profile coverage. This expansion will directly improve experience data coverage and increase the total number of profiles available in the dataset. > > > [accordion] Improvement in Cellphone Coverage > > > > Major improvement to cellphone data coverage (7.5M cellphone number increase globally, 6.9M in the US), substantially increasing the fill-rate for cellphone numbers across profiles. This enhancement makes mobile contact data more accessible and reliable for outreach workflows. > > > [accordion] Data Quality Fixes > > > > Cleaned up job title fields that contained meaningless values — records where `job_title` consisted entirely of special characters such as `&`, `;`, `/`, and similar symbols rather than actual job title text. These values have been removed or corrected, improving the overall quality of the data. March 2026 > [accordion] View March 2026 release notes > > Email re-verification > > **98%** > > Contact freshness > > **92.3%** > > Company accuracy > > **88.7%** > > ## Data updates > > > [accordion] Data improvements > > > > * Removed 0.9M contacts who recently left their jobs > > * Removed 1.2M undeliverable email addresses, sustaining >95% deliverability > > * Removed 0.1M invalid mobile numbers > > ## What's new > > > [accordion] Documentation site launch > > > > RevenueBase launched our dedicated documentation site covering quickstart guides, full API reference with live playground, and data feed schema documentation. > > > [accordion] New LinkedIn fields on company dataset > > > > Two new fields sourced from LinkedIn have been added to the Company dataset: > > > > * **`logo_url`** — direct link to the company's LinkedIn profile logo > > > > * **`company_headline`** — headline text displayed on the company's LinkedIn page > > > > > [!WARNING] > > > > > > LinkedIn periodically rotates logo URLs as part of their asset protection mechanisms. For long-term use cases, cache a local copy of logos at retrieval time rather than relying on the URL remaining stable. > > > [accordion] LinkedIn connections count in Gigasheet > > > > The Gigasheet dataset now includes the `linkedin_connections_count` column, surfacing the number of LinkedIn connections per profile directly in the dataset. No additional joins required. > > > [accordion] Job title data quality fix > > > > Resolved an issue where LinkedIn's data protection mechanisms caused company names to appear in place of job title values. Approximately 90% of affected records have been corrected via a targeted backfill. Remaining cases will be resolved in upcoming job data updates. > > > [accordion] Funding dates backfill — Insight dataset > > > > Resolved a data gap where last funding dates were not updated for approximately two months due to a third-party provider issue. Funding date fields in the Insight dataset are now current. February 2026 > [accordion] View February 2026 release notes > > Email re-verification > > **97%** > > Contact freshness > > **93%** last 90 days > > Company accuracy > > **88%** > > ## Data updates > > > [accordion] Data improvements > > > > * Removed 0.9M contacts who recently left their jobs > > * Removed 1.5M undeliverable email addresses, sustaining >95% deliverability > > * Removed 0.3M invalid mobile numbers > > ## What's new > > > [accordion] Company name added to person dataset > > > > A dedicated `company_name` field has been added directly to Person records. Previously, retrieving company names required joining Person data with Company data. This field is now available inline, removing that join dependency. > > > [accordion] Indian states now supported > > > > Person location data now includes full support for Indian state codes and state names, extending existing coverage beyond the USA and Canada. Contacts in India can be searched and filtered using standardized state codes. > > > > **Impact:** 7% increase in fill-rate for `state_code` and `state_name` fields for Indian contacts. > > > [accordion] Headquarters country assignment — quality fix > > > > Resolved an issue where company headquarters addresses formatted as "City, State" could be incorrectly assigned to the wrong country. US state codes were in some cases misinterpreted as country codes (e.g., `MD` for Maryland parsed as Moldova). > > > > **Impact:** 2–5% improvement in headquarters address fill-rate and accuracy across countries. January 2026 > [accordion] View January 2026 release notes > > Email re-verification > > **98%** > > Contact freshness > > **95%** > > Company accuracy > > **89%** > > ## Data updates > > > [accordion] Data quality metrics > > > > * **Email re-verification:** 98% verified within the last 60 days > > * **Contact freshness:** 95% of job experiences re-verified on LinkedIn within the last 90 days > > * **Company accuracy:** 89% of company data verified by trusted sources within the last 90 days > > > [accordion] Data improvements > > > > * Removed 3.2M contacts who recently left their jobs > > * Removed 2.9M undeliverable email addresses, sustaining >95% deliverability > > * Removed 0.7M invalid mobile numbers > > ## What's new > > > [accordion] LinkedIn data protection — experience and education fill-rate impact > > > > LinkedIn has tightened its data protection measures, making data collection significantly harder. A new workaround approach has been introduced to prevent loss of most experience and education data from LinkedIn profiles. > > > > In the January release, all fields maintained approximately the same fill rate as the previous month, with the exception of experience and education data, which saw a minor drop of 1–2%. These protections may also extend the rescraping period going forward. # RevenueBase Docs Source: https://docs.revenuebase.ai/index Verified B2B contacts and company data — delivered via Snowflake, S3, REST API, or Gigasheet. Deterministic filters, rolling verification. # B2B data *infrastructure* Production-ready data, cleans and enriches your existing records, and helps you discover what's missing. Explore guides, data schemas, and API references on how to build. Not sure where to start? [What fields does the organization table have? →](/?search=what+fields+does+the+organization+table+have) [How do I enrich a contact list? →](/?search=how+do+i+enrich+a+contact+list) [How do I authenticate with the API? →](/?search=how+do+i+authenticate+with+the+api) [How do I set up a Snowflake data feed? →](/?search=how+do+i+set+up+a+snowflake+data+feed) ## Get started Pick the workflow that fits how you access and use RevenueBase data. GuidesFind guides to set up your data feeds.Find guides to set up data feeds through integrations, how to add a new user to your organization, etc. S3 Snowflake Gigasheet Explore → [Open](/docs/getting-started/overview) DataBuild SQL queries and ingestion pipelines.Learn about RevenueBase tables and how to effectively build SQL queries, ingestion pipelines, and integrations on top of the full dataset. Data Engineers SQL Builders Explore → [Open](/docs/data-feeds/overview) API ReferenceBuild on top of our REST APIs.Explore our full REST API surface with an interactive playground for every endpoint. Authenticate, test requests, and inspect responses without leaving the docs. API Integrators Explore → [Open](/api-reference/v2/make-first-call)