post /v2/reveal/emails

Reveal emails

Get emails and email statuses for people.

Webhook result: Documentation


Endpoint POST /v2/reveal/emails
Credit cost 1 credit / email found (not charged for notFound)
Response Asynchronous — results delivered to your webhook
Max per request 500 person IDs

Quickstart#

Person IDs come from the id field in Search People or Enrich Person responses.

curl -X POST "https://api.ocean.io/v2/reveal/emails" \
  -H "X-Api-Token: YOUR_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "personIds": ["abc123", "def456", "ghi789"],
    "webhookUrl": "https://yourapp.com/webhooks/ocean-emails"
  }'
import requests

response = requests.post(
    'https://api.ocean.io/v2/reveal/emails',
    headers={'X-Api-Token': 'YOUR_API_TOKEN'},
    json={
        'personIds': ['abc123', 'def456', 'ghi789'],
        'webhookUrl': 'https://yourapp.com/webhooks/ocean-emails',
    },
)
data = response.json()  # {"status": "in progress"} — results arrive at your webhook
const response = await fetch('https://api.ocean.io/v2/reveal/emails', {
  method: 'POST',
  headers: { 'X-Api-Token': 'YOUR_API_TOKEN', 'Content-Type': 'application/json' },
  body: JSON.stringify({
    personIds: ['abc123', 'def456', 'ghi789'],
    webhookUrl: 'https://yourapp.com/webhooks/ocean-emails',
  }),
});
const data = await response.json(); // {"status": "in progress"} — results arrive at your webhook

Immediate response:

{ "status": "in progress" }

Webhook payload:

{
  "results": [
    { "personId": "abc123", "email": { "address": "[email protected]", "status": "verified" } },
    { "personId": "def456", "email": { "address": "[email protected]", "status": "guessed" } },
    { "personId": "ghi789", "email": { "address": null, "status": "notFound" } }
  ]
}
Status Meaning Charged?
verified SMTP-confirmed deliverable via ZeroBounce Yes
guessed High-confidence pattern match, not SMTP-verified Yes
catchAll ZeroBounce-verified — catch-all domain accepts all inbound addresses Yes
notFound Could not find or verify No

Authorizations

apiToken string
x-api-token string

Body application/json

List of Ocean person ids to fetch the email data for. One email credit will be charged for every verified email found.
Array of string
webhookUrl string Required
Url of the webhook the email data should be sent to, when completed.

Responses

200 Successful Response
status enum Required
Status of the request. `"in progress"` if any email has to be verified in the background. All the email results are sent to the webhook once they are all done.
"in progress""webhook sent"
400 Bad Request
detail enum Required
"Conflicting API tokens provided in query parameters and headers"
402 Payment Required
detail enum Required
"Insufficient email credits"
403 Forbidden
detail enum Required
"API token should be provided in headers or query parameters""Current API token is not registered in our database"
404 Not found
422 Validation Error
Array of ValidationError
Array of string | integer
string | integer
msg string Required
type string Required
input any
object

FAQs#

What's the difference between verified and guessed?

verified means the address was SMTP-confirmed deliverable via ZeroBounce. guessed means the address was constructed from a known domain pattern with high confidence, but wasn't SMTP-checked. verified will have lower bounce rates in outreach.

What if I have more than 500 IDs?

Split into batches of up to 500 and send as separate requests in parallel.