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
- The agent calls an endpoint, for example
GET https://agents.tomba.io/email-verifier?email=jane.doe@stripe.com. - The service answers
402 Payment Requiredwith aWWW-Authenticateheader that holds onePaymentchallenge for each accepted currency. - The agent pays one challenge through InFlow and receives a payment credential.
- The agent sends the same request again with the header
Authorization: Payment <credential>. - 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-Receiptheader.
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.
| Endpoint | Tomba API endpoint |
|---|---|
/domain-search | Domain search |
/email-finder | Email finder |
/email-verifier | Email verifier |
/email-count | Email count |
/email-format | Email format |
/email-sources | Email sources |
/author-finder | Author finder |
/linkedin | LinkedIn finder |
/enrich | Email enrichment |
/people/find | Person enrichment |
/companies/find | Company enrichment |
/combined/find | Combined enrichment |
/phone-finder | Phone finder |
/phone-validator | Phone validator |
/similar | Similar domains |
/technology | Technology |
/location | Location |
/domain-status | Domain status |
/domain-suggestions | Domain suggestions |
Discovery documents
These paths are free and need no payment.
| Path | Contents |
|---|---|
/.well-known/mpp.json | Price, accepted currencies, endpoints, and InFlow CLI commands |
/openapi.json | OpenAPI 3.1 description of the endpoints |
/llms.txt | Instructions for LLM agents |
/skill.md | Skill file for agent runtimes |
/.well-known/odp, /odp/offerings, /odp/collections | Offering Discovery Protocol catalog, with each endpoint as a priced offering |
/.well-known/aep | Agent Enrollment Protocol document. Enrolling is optional and changes neither access nor price. |
/.well-known/agent-card.json | Agent card |
/health | Service 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.
| Operation | Path |
|---|---|
| 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
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.
| Outcome | Charged | Status you receive |
|---|---|---|
| Tomba returns data | Yes, with a Payment-Receipt header | Tomba's status |
Tomba returns a negative answer, such as an undeliverable verification or a domain search with no email addresses | Yes, with a Payment-Receipt header | Tomba's status |
Tomba returns an error status, such as 422 for invalid parameters or 429 | No | Tomba's status |
Tomba returns a success status with no result — an empty or null data, such as /phone-finder with no number on record | No | Tomba's status |
Tomba returns a success status with an errors object | No | Tomba's status |
| Tomba returns a body that isn't JSON | No | 502 |
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
| Status | Meaning |
|---|---|
402 | The 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. |
404 | Unknown endpoint. The body lists the available endpoints. |
502 | InFlow 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. |
503 | The 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.