TombaTomba
Start free
  • Documentation
  • API reference
  • SDKs & CLI
  • AI & MCP
  • Integrations
  • Enterprise
  • Migration guides

Find, verify and enrich B2B contacts from public sources, in the app, your spreadsheet or through the API.

GDPR & CCPA

// docs

  • API changelog
  • Support options
  • Security

// platform

  • Dashboard
  • Pricing
  • API status

// resources

  • Help center
  • Product updates
  • TombaBot crawler

// company

  • Website
  • Contact us
  • Edit or remove your data

© 2021–2026 Tomba.io

  • Terms of service
  • Privacy policy
  • Cookie policy
  • Security policy
  • GDPR
  • CCPA
Get started
    IntroductionQuickstartAuthenticationGoing to production
Platform
API guides
Response reference
Policies
Resources
Get started

Authentication

Every request to the Tomba API carries an API key and your account secret as headers. Apps that act on behalf of other Tomba users use OAuth 2.0 access tokens instead.

Request headers

HeaderValue
X-Tomba-KeyAn API key: ta_ followed by 37 characters.
X-Tomba-SecretYour account secret: ts_ followed by a UUID.

Your account has one secret, shared by all of its keys. Keys are what you create, name, expire, and revoke for each integration.

Keep both values on a server (Security). Anyone who obtains them can spend your credits, and every key of an account shares the account's rate limits.

Get your key and secret

Create keys and copy your secret on the API keys page of the dashboard. GET /v1/me also returns the secret, as secret_token.

Key expiry

  • Every key expires. The default and maximum lifetime is 365 days. When you create a key through the API, set expires_in_days to any value from 1 to 365.
  • Tomba emails the account owner 30 days, 7 days, and 1 day before a key expires.
  • GET /v1/keys returns each key's expires_at and expired fields.

A request with an expired key fails with status 400 and error type api_key_expired. The response includes an X-Tomba-Key-Expired header with the expiry time in RFC 3339 format:

Code
{ "errors": { "type": "api_key_expired", "message": "This API key expired on March 1, 2025. Create a new key at https://app.tomba.io/api", "code": 400 } }

Rotate keys

To replace a key without downtime:

  1. Create a new key in the dashboard or with POST /v1/keys.
  2. Deploy the new key to your integration.
  3. Delete the old key in the dashboard or with DELETE /v1/keys/{id}.
TerminalCode
curl -X POST "https://api.tomba.io/v1/keys" \ -H "X-Tomba-Key: $TOMBA_API_KEY" \ -H "X-Tomba-Secret: $TOMBA_SECRET_KEY" \ -H "Content-Type: application/json" \ -d '{"name": "billing-service", "expires_in_days": 90}'

The response returns the new key in data.message:

Code
{ "data": { "id": 1234, "message": "ta_xxxx" } }

PUT /v1/keys/{id} rotates a key in place instead: it issues a new value with a new 365-day term, and the old value stops working immediately. The response doesn't include the new value; read it with GET /v1/keys/{id}.

To rotate the secret, use Settings in the dashboard. Every key then works only with the new secret, so update all integrations at once.

OperationEndpoint
List keysGET /v1/keys
Get a keyGET /v1/keys/{id}
Create a keyPOST /v1/keys
Rename a keyPATCH /v1/keys/{id}
Rotate a keyPUT /v1/keys/{id}
Delete a keyDELETE /v1/keys/{id}

The number of active keys an account can hold depends on its plan; expired keys don't count toward it. In a workspace, GET /v1/keys returns the keys of every member, including their values.

OAuth 2.0

Apps that act on behalf of other Tomba users, such as MCP clients and workflow tools, use OAuth 2.0 and send the access token as Authorization: Bearer <access_token>.

ItemValue
Discoveryhttps://api.tomba.io/.well-known/oauth-authorization-server
Authorization endpointhttps://app.tomba.io/oauth/authorize
Token endpointhttps://api.tomba.io/v1/oauth/token
Revocation endpointhttps://api.tomba.io/v1/oauth/revoke
Dynamic client registrationhttps://api.tomba.io/v1/oauth/register
Device authorizationhttps://api.tomba.io/v1/oauth/device
Grant typesAuthorization code with PKCE (S256), refresh token, device code
Token lifetimeAccess tokens: 15 minutes. Refresh tokens: 30 days.

Request only the scopes your app needs:

ScopeGrants access to
searchDomain search, email finder, author finder, LinkedIn finder, phone finder, similar domains, technology, company search, domain suggestions
verifyEmail verifier
enrichEmail enrichment, person, company, and combined enrichment, email sources
leadsLeads, lead lists, lead attributes, bulk jobs
accountAccount settings and API keys
readAccount details, rate limits, email count, email format, location, domain status, phone validator

GET /v1/logs and GET /v1/usage don't accept OAuth tokens; call them with a key and secret. Users review and revoke app access under Connected apps.

The remote MCP server accepts additional credential formats; its page lists them.

Endpoints without authentication

The Logo API and GET /v1/domain-status need no credentials.

Errors

Statuserrors.typeCause
400authentication_failedA credential header is missing or malformed.
400api_key_expiredThe key is past its expiry date.
401authentication_failedThe key and secret don't match an account, or the account can't use the API yet: it's unconfirmed, has no password set, or its subscription has expired. The message says which.
403authentication_failedThe account is blocked or deleted.
401invalid_tokenThe OAuth access token is invalid, expired, or revoked.
403insufficient_scopeThe OAuth access token lacks the scope the endpoint needs.

Errors lists every error type.

Last modified on September 30, 2026
QuickstartGoing to production
On this page
  • Request headers
  • Get your key and secret
  • Key expiry
  • Rotate keys
  • OAuth 2.0
  • Endpoints without authentication
  • Errors
curl "https://api.tomba.io/v1/me" \ -H "X-Tomba-Key: $TOMBA_API_KEY" \ -H "X-Tomba-Secret: $TOMBA_SECRET_KEY"
JSON
JSON