Oppora API documentation
The Oppora API gives your code and AI agents the B2B data behind the app: find and verify work emails, find phone numbers, enrich people from a LinkedIn URL, and search companies and people. Call the REST API from any HTTP client, or connect the MCP server to Claude, ChatGPT, Cursor or VS Code. One API key works for both, on every plan.
Last updated:
Quickstart: find an email in three steps
- 1
Create an API key
In the app, open Integrations > Oppora API and click New key. Copy the
opp_live_secret; it is shown once. Send it asAuthorization: Bearer opp_live_YOUR_KEYon every request. - 2
Call email search
Base URL:
https://api.oppora.ai/api/v1/public. A lookup can take up to about 90 seconds while the waterfall runs, so give your client a 120-second timeout. For lists, use the bulk endpoint instead.curl -X POST https://api.oppora.ai/api/v1/public/email/search \ -H "Authorization: Bearer opp_live_YOUR_KEY" \ -H "Content-Type: application/json" \ -d '{"first_name": "Alice", "last_name": "Chen", "domain": "stripe.com"}' - 3
Read the result
You get the address, its status and what the call cost. Credits are charged only when the status is
validorrisky; misses are free. Check your balance any time withGET /credits.Response{ "email": "[email protected]", "status": "valid", "credit_charged": 1, "credits_remaining": 9841 }
Endpoints and credits
All paths are relative to https://api.oppora.ai/api/v1/public. Responses are plain JSON. Searches that find nothing are free. Full schemas are in the REST API reference.
| Endpoint | What it does | Credits |
|---|---|---|
| Account | ||
| GET/me | Your key, user, workspace and rate limits | Free |
| GET/credits | Remaining data and phone credits | Free |
| GET/usage | Requests and errors per day across all your keys | Free |
| Discover and enrich | ||
| POST/discover/companies | Search companies by industry, size, location, revenue, funding and growth | 5 data credits per call with results |
| POST/discover/people | Search people by title, seniority, department, company and location | 10 data credits per call with results |
| POST/enrich/people | Person, company and job details from a LinkedIn profile URL, with an optional email | 5 data credits per match, plus 1 if an email is found |
| GET/filters/industries, /countries, /departments, /management-levels | Exact values the discover filters accept | Free |
| Email and phone | ||
| POST/email/search | Find a work email from a name and company domain | 1 data credit when valid or risky |
| POST/email/verify | Check deliverability, standard or advanced (catch-all aware) | 1 data credit, 2 for advanced |
| POST/phone/search | Find a phone number from a LinkedIn URL or name plus company | 1 phone credit when found |
| Bulk jobsUp to 5,000 rows per job and 5 jobs running at once. Poll /jobs/{id} for progress and results. | ||
| POST/email/search/bulk | Email lookups for a batch of people | 1 data credit per email found |
| POST/email/verify/bulk | Verification for a batch of addresses | 1 data credit per result, either mode |
| POST/phone/search/bulk | Phone lookups for a batch of people | 1 phone credit per number found |
| GET/jobs, /jobs/{id} | List jobs, read status and results | Free |
| POST/jobs/{id}/cancel | Cancel a job | Free |
| Lists | ||
| GET, POST/lists | List or create lists | Free |
| GET, PATCH, DELETE/lists/{id} | Read, update or delete a list | Free |
| GET/lists/{id}/analytics | Email coverage and verification quality for a list | Free |
| GET/lists/{id}/leads, /lists/{id}/companies | Read a list's leads or companies, with filters | Free |
| POST/lists/{id}/leads/import, /lists/{id}/companies/import | Import up to 5,000 rows as a background job | Free |
| GET, POST/folders | List or create folders | Free |
What email statuses mean
- valid
- The recipient's mail server confirmed the mailbox exists. Safe to send.
- risky
- The domain accepts mail for any address (catch-all) or would not confirm this one. Oppora's own waterfall returns a risky address only after a deeper check passes, but it bounces more often than a valid one. Send to these in smaller batches.
- invalid
- The mailbox does not exist or the domain cannot receive mail. Do not send. Email search never charges for it.
The verifier can also return catch-all (the domain accepts every address) or unknown (the server gave no clear answer). Run /email/verify with "mode": "advanced" for a catch-all aware check.
Rate limits
Limits apply per key and cover MCP calls too. You can set a lower limit on a key, never a higher one. GET /me returns the limits for the key you call it with.
| Plan | Per minute | Per day |
|---|---|---|
| Free | 30 | 1,000 |
| Pro | 300 | 50,000 |
| Max | 1,500 | 250,000 |