Migrate from Prospeo
This guide maps the Prospeo API (Enrich Person, Bulk Enrich Person, Enrich Company, Bulk Enrich Company, Search Person, Search Company, and Account Information) to Tomba. Prospeo API behavior checked on 2026-09-29 against the Prospeo API documentation.
Before you begin
- Get your API key (
ta_…) and secret (ts_…); see Authentication. - Check what each endpoint costs in Credit costs and your plan's throttling in Limits by plan.
- Prospeo's Enrich Person takes whichever datapoints you have. Tomba has one endpoint per input: a name and company, a LinkedIn URL, or an email address. Route each call by the datapoint you send.
Endpoint mapping
Replace the host api.prospeo.io with api.tomba.io.
| Prospeo | Tomba | Notes |
|---|---|---|
POST /enrich-person with a name and company | GET /v1/email-finder | |
POST /enrich-person with linkedin_url | GET /v1/linkedin | |
POST /enrich-person with email | GET /v1/enrich | |
POST /enrich-person with only_verified_mobile | GET /v1/phone-finder | Accepts an email address, a LinkedIn URL, or a domain. |
POST /bulk-enrich-person | Bulk jobs of type finder, linkedin, or enrich | See Bulk and async jobs. |
POST /enrich-company | GET /v1/companies/find | Looks up by domain only. |
POST /bulk-enrich-company | Bulk jobs of type company | |
POST /search-person filtered by company website | GET /v1/domain-search | Returns people with their email addresses, one domain per request. |
POST /search-company | POST /v1/reveal/search | Uses Tomba's own filters. |
POST /search-suggestions | No equivalent | |
GET /account-information | GET /v1/me | See Check usage. |
Older /email-finder, /domain-search, and /email-verifier paths | GET /v1/email-finder, GET /v1/domain-search, GET /v1/email-verifier |
Authentication changes
Prospeo reads the key from the X-KEY header. Tomba needs two headers, X-Tomba-Key and X-Tomba-Secret, and its lookups are GET requests with query parameters instead of POST requests with JSON bodies:
Code
Tomba API keys expire; plan their rotation with Key expiry.
Parameter mapping
| Prospeo field | Tomba parameter | Notes |
|---|---|---|
data.first_name, data.last_name, data.full_name | first_name, last_name, full_name | On /v1/email-finder. |
data.company_website | domain | |
data.company_name | company | |
data.company_linkedin_url | No equivalent | Send domain or company. |
data.linkedin_url | url | On /v1/linkedin. |
data.email | email | On /v1/enrich. |
data.person_id | No equivalent | |
only_verified_email | No equivalent | Filter on data.verification.status; see Status mapping. |
enrich_mobile | enrich_mobile | Adds phone numbers in data.phone_data, at an extra cost. |
only_verified_mobile | No equivalent | Use /v1/phone-finder. |
Enrich Company data.company_website | domain | On /v1/companies/find. |
Enrich Company data.company_name, data.company_linkedin_url, data.company_id | No equivalent | Get the domain for a company name with GET /v1/domain-suggestions. |
Search Person filters.company.websites.include | domain | On /v1/domain-search, one domain per request. |
Search page | page |
Response field mapping
Tomba wraps every result in data. For Enrich Person calls answered by /v1/email-finder, /v1/linkedin, or /v1/enrich:
| Prospeo | Tomba | Notes |
|---|---|---|
person.email.email | data.email | null when no address is found. |
person.email.status | data.verification.status | See Status mapping. |
person.email.revealed, verification_method | No equivalent | |
person.email.email_mx_provider | No equivalent | The email verifier returns data.email.smtp_provider. |
person.first_name, last_name, full_name | data.first_name, .last_name, .full_name | |
person.linkedin_url | data.linkedin | |
person.current_job_title | data.position | |
person.location.country_code | data.country | |
person.location.country, state, city, time_zone | No equivalent | |
person.mobile | data.phone_data | Returned with enrich_mobile=true. See Phone. |
person.person_id, headline, job_history, skills | No equivalent | |
company.name, company.domain | data.company, data.website_url | |
free_enrichment | No equivalent | Repeating a request within your usage window is free; see Duplicate requests. |
For Enrich Company calls answered by /v1/companies/find, the company is in data:
Prospeo company | Tomba | Notes |
|---|---|---|
name, domain, description | data.name, data.domain, data.description | |
employee_range | data.metrics.employees | A range, such as 51-200. |
employee_count | No equivalent | |
industry | No equivalent | GET /v1/domain-search returns it in data.organization.industries. |
founded | data.foundedYear | A string. |
location.country, country_code, state, city | data.geo.country, .countryCode, .state, .city | |
linkedin_url, twitter_url, facebook_url | data.linkedin.handle, data.twitter.handle, data.facebook.handle | Handles, not URLs. |
technology.technology_names | data.tech | |
sic_codes, naics_codes | data.category.sic4Codes, data.category.naics6Codes | |
phone_hq | data.site.phoneNumbers | |
logo_url | No equivalent | Use https://logo.tomba.io/{domain}; see Logo API. |
revenue_range, funding, job_postings, keywords | No equivalent |
Field definitions are in Enrichment.
Status mapping
Prospeo email.status | Tomba |
|---|---|
VERIFIED | data.verification.status is valid |
UNAVAILABLE | data.email is null, or data.verification.status isn't valid |
Tomba returns its best match with a status, including catch-all (accept_all) and unconfirmed (unknown) addresses. If you sent only_verified_email: true, keep only results whose status is valid. Compare status case-insensitively. Each value is defined in Status values.
Error mapping
Prospeo returns errors with HTTP 400 and an error_code. Tomba uses a distinct HTTP status for each cause, with an errors object:
Prospeo error_code | Tomba | What to do |
|---|---|---|
NO_MATCH | 200 with data.email null | Treat as no match. /v1/companies/find returns 200 with an errors body, type not_found. |
INVALID_DATAPOINTS, INVALID_REQUEST | 422 params_invalid | Fix the parameter named in the message. |
INSUFFICIENT_CREDITS | 402 quota_exceeded | Wait for your usage window to renew or add credits. |
INVALID_API_KEY | 400 authentication_failed (missing or malformed), 400 api_key_expired, 401 authentication_failed (wrong key or secret) | Check both headers; rotate an expired key. |
INTERNAL_ERROR | 500 api_error | Retry with backoff. |
429 rate limit | 429 rate_limit | Retry after the Retry-After delay; see Handle 429 responses. |
| No equivalent | 400 unknown_record | The email finder received a disposable or webmail domain. |
| No equivalent | 451 claimed_email | The owner of the address asked Tomba to stop processing it. Remove it from your data. |
Error responses don't consume credits. Every type is listed in Errors.
Bulk and async jobs
Prospeo's bulk endpoints answer up to 50 records in one synchronous response. A Tomba bulk job runs in the background: create it, launch it, poll its progress, and download the results as CSV. For a few records, send single requests instead.
| Prospeo | Tomba bulk type |
|---|---|
| Bulk Enrich Person with names and companies | finder: a CSV file with name and domain columns. See Email finder. |
| Bulk Enrich Person with LinkedIn URLs | linkedin: a JSON list of profile URLs. See LinkedIn finder. |
| Bulk Enrich Person with email addresses | enrich: a JSON list of addresses. See Email enrichment. |
| Bulk Enrich Company | company: a JSON list of domains. See Company enrichment. |
The requests for each step are in Lifecycle, and webhook_url sends an event when a job ends; see Bulk job events. A job is charged when you first download its results; see Billing.
Code example
This function replaces an Enrich Person call made with a full name, a company website, and only_verified_email: true, and returns Prospeo's field names. It needs Node.js 18 or later.
Code
Cutover checklist
- Store the Tomba key and secret as
TOMBA_API_KEYandTOMBA_SECRET_KEY, and send them asX-Tomba-KeyandX-Tomba-Secretinstead ofX-KEY. - Route each Enrich Person call by its datapoint: name and company to
/v1/email-finder, LinkedIn URL to/v1/linkedin, email address to/v1/enrich. - Turn JSON bodies into query parameters:
company_websitebecomesdomainandcompany_namebecomescompany. - Read
data.emailanddata.verification.status, and keep onlyvalidaddresses where you usedonly_verified_email. - Replace
error_codehandling with HTTP status handling:402,422,429withRetry-After, and451. - Move bulk enrichment to Tomba bulk jobs, or loop over single requests for small batches.
- Run the same sample of people and companies through both services and compare the results before you switch production traffic.