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
Remote MCP server
Local MCP serverDocs for AI assistants
Agent payments (MPP)
    OverviewQuickstartUse with AI agents
Agent payments (MPP)

Tomba for AI agents

https://agents.tomba.io serves Tomba's finder, verifier, and enrichment endpoints to AI agents that have no Tomba account. Instead of sending an API key, the agent pays for each request through InFlow with the Machine Payments Protocol (MPP). If you have a Tomba account, call the Tomba API with your key and secret instead.

How it works

  1. The agent calls an endpoint, for example GET https://agents.tomba.io/email-verifier?email=jane.doe@stripe.com.
  2. The service answers 402 Payment Required with a WWW-Authenticate header that holds one Payment challenge for each accepted currency.
  3. The agent pays one challenge through InFlow and receives a payment credential.
  4. The agent sends the same request again with the header Authorization: Payment <credential>.
  5. The service checks the credential and calls the Tomba API. It settles the payment only if Tomba returned usable data, then returns Tomba's response with a Payment-Receipt header.

The InFlow CLI runs steps 2 to 4 for you; see the Quickstart. To build them into an agent, see Use with AI agents.

Endpoints

Every endpoint uses GET, takes the query parameters of the Tomba API endpoint listed next to it, and returns that endpoint's response body.

EndpointTomba API endpoint
/domain-searchDomain search
/email-finderEmail finder
/email-verifierEmail verifier
/email-countEmail count
/email-formatEmail format
/email-sourcesEmail sources
/author-finderAuthor finder
/linkedinLinkedIn finder
/enrichEmail enrichment
/people/findPerson enrichment
/companies/findCompany enrichment
/combined/findCombined enrichment
/phone-finderPhone finder
/phone-validatorPhone validator
/similarSimilar domains
/technologyTechnology
/locationLocation
/domain-statusDomain status
/domain-suggestionsDomain suggestions

Discovery documents

These paths are free and need no payment.

PathContents
/.well-known/mpp.jsonPrice, accepted currencies, endpoints, and InFlow CLI commands
/openapi.jsonOpenAPI 3.1 description of the endpoints
/llms.txtInstructions for LLM agents
/skill.mdSkill file for agent runtimes
/.well-known/odp, /odp/offerings, /odp/collectionsOffering Discovery Protocol catalog, with each endpoint as a priced offering
/.well-known/aepAgent Enrollment Protocol document. Enrolling is optional and changes neither access nor price.
/.well-known/agent-card.jsonAgent card
/healthService status. Add ?deep=1 to check that the service can issue payment challenges.

Browse the catalog

The ODP catalog lists every paid endpoint as an Offering, grouped into Collections, each priced per request. Responses use the application/odp+json media type.

OperationPath
Service document/.well-known/odp
List offerings/odp/offerings
Get one offering/odp/offerings/{id}
List collections/odp/collections
Get one collection/odp/collections/{id}
Offerings in a collection/odp/collections/{id}/offerings

Add ?representation=full to a listing for complete resources, or terse for identity and price only. Listings default to terse and a single resource defaults to full; any other value is rejected with a 400 problem body.

?limit= takes 1 to 100 and defaults to 50 — anything outside that, or not a number, is a 400. When more results remain, the page carries a next reference:

Code
{ "odp_version": "1.0", "items": [{ "id": "domain-search", "name": "Find all email addresses…" }], "next": "/odp/offerings?cursor=eyJleHBpcmVzQXQiOjE3OTEy…&representation=terse&limit=1" }

Follow next exactly as given — it is an origin-relative path that already carries your limit and representation, so don't rebuild it from the cursor. The last page omits next rather than sending null. Cursors are signed and stay valid for one hour.

Tomba is also listed in the InFlow directory.

Pricing

Each request costs 0.00312 USDC or 0.00312 USDT — $3.12 per 1,000 requests — paid from your InFlow balance. Every 402 response offers one challenge per currency, and you pay one of them. The InFlow CLI and the InFlow buyer SDK don't pick the currency you hold on their own; see Choose a currency.

The service settles payments in InFlow's production environment, so pay with a production InFlow account.

InFlow holds each charge for manual approval unless you add a policy that approves them. An unattended agent will wait, so set one up before you automate: Approve payments automatically.

Billing

You're charged only when Tomba returns usable data. Once the service has called Tomba for a paid request, the response carries X-Payment-Charged: true or X-Payment-Charged: false.

OutcomeChargedStatus you receive
Tomba returns dataYes, with a Payment-Receipt headerTomba's status
Tomba returns a negative answer, such as an undeliverable verification or a domain search with no email addressesYes, with a Payment-Receipt headerTomba's status
Tomba returns an error status, such as 422 for invalid parameters or 429NoTomba's status
Tomba returns a success status with no result — an empty or null data, such as /phone-finder with no number on recordNoTomba's status
Tomba returns a success status with an errors objectNoTomba's status
Tomba returns a body that isn't JSONNo502

When a response isn't charged, the credential stays unspent: correct the request and send it again with the same credential before the challenge's expires time.

  • A credential pays for one request to the endpoint it was issued for. It can't be spent on another endpoint, or again after it settles.
  • Every paid request is charged, including a repeat of an earlier request.

Errors

StatusMeaning
402The request has no credential, or the credential was rejected because it expired, was already spent, or was issued for another endpoint. The response carries new challenges, and for a rejected credential the body says why.
404Unknown endpoint. The body lists the available endpoints.
502InFlow couldn't be reached, or Tomba returned no usable data (with X-Payment-Charged: false). In both cases your credential wasn't spent; retry with it.
503The payment service is unavailable. Retry after the number of seconds in Retry-After.

Other statuses, such as 400, 422, and 429, come from the Tomba API; see Status codes.

Rate limits

There is no rate limit. Send as many paid requests as you like, as fast as you like — your spend is the only cap, and you control that with your InFlow balance and policy.

Responses still carry rate limit headers, listed in Access-Control-Expose-Headers so a browser client can read them. Should a 429 ever come back, it carries Retry-After, isn't charged, and leaves your credential unspent — wait and retry with the same one.

Last modified on October 7, 2026
Docs for AI assistantsQuickstart
On this page
  • How it works
  • Endpoints
    • Discovery documents
    • Browse the catalog
  • Pricing
  • Billing
  • Errors
  • Rate limits
JSON