Skip to main content

Documentation Index

Fetch the complete documentation index at: https://docs.sixtyfour.ai/llms.txt

Use this file to discover all available pages before exploring further.

Use case

Identify the person behind an email address — name, employer, title, LinkedIn, and other contact details. Use it to enrich inbound signups, qualify support tickets, deduplicate CRM records, or investigate unknown senders.

Endpoint

POST https://api.sixtyfour.ai/reverse-email

API Reference

See the full request/response schema and parameters in the API Reference.

Pricing

See Credits & Pricing Guide for credit costs.

Errors

For error responses (400, 403, 422, etc.), see Handling Errors.

Sync usage

curl -X POST "https://api.sixtyfour.ai/reverse-email" \
  -H "x-api-key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "lead": {
      "email": "sarah.johnson@example.com"
    }
  }'

Async pattern

For production workflows, use /reverse-email-async to submit a job and poll for results. This avoids long-lived HTTP connections and lets you parallelize many lookups without blocking your client. The flow is:
  1. SubmitPOST /reverse-email-async with the same body as the sync endpoint. Response includes a task_id.
  2. PollGET /job-status/{task_id} until status is completed, failed, or cancelled.
  3. Read result — When completed, the resolved person record is in the result field, in the same shape as the sync response.
The async start endpoint returns uppercase RUNNING. Subsequent /job-status/{task_id} calls return lowercase statuses. charge_amount is returned in cents, not credits.

Polling example

import requests
import time

response = requests.post(
    "https://api.sixtyfour.ai/reverse-email-async",
    headers={"x-api-key": "YOUR_API_KEY", "Content-Type": "application/json"},
    json={
        "lead": {
            "email": "sarah.johnson@example.com"
        }
    }
)
response.raise_for_status()
task_id = response.json()["task_id"]

while True:
    status = requests.get(
        f"https://api.sixtyfour.ai/job-status/{task_id}",
        headers={"x-api-key": "YOUR_API_KEY"}
    ).json()

    if status["status"] == "completed":
        results = status["result"]
        break
    if status["status"] in ("failed", "cancelled"):
        raise RuntimeError(f"Job {status['status']}: {status.get('error', 'Unknown error')}")

    time.sleep(5)

Webhook callback

Pass a webhook_url to receive the result via HTTP POST instead of polling. The signed payload, retry behavior, and verification steps are documented in Outgoing Webhooks.
POST /reverse-email-async
{
  "lead": {
    "email": "sarah.johnson@example.com"
  },
  "webhook_url": "https://your-server.com/webhooks/sixtyfour"
}

Bulk processing

Use /reverse-email-bulk (sync) or /reverse-email-bulk-async (async) to resolve up to 100 email addresses in a single call. Both accept a leads array and the same providers and webhook_url fields as the single-lead endpoints.

Bulk sync

Returns 200 OK with results once every lead is processed. Best for small batches where you want a single round-trip.
curl -X POST "https://api.sixtyfour.ai/reverse-email-bulk" \
  -H "x-api-key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "leads": [
      { "email": "sarah.johnson@example.com" },
      { "email": "john.doe@acme.com" }
    ]
  }'

Bulk async

Submit a batch, get back a task_id, then poll /job-status/{task_id} (or set webhook_url to receive a callback). Recommended for batches of more than a handful of leads, or when you don’t want to hold a long-lived HTTP connection.
import requests
import time

response = requests.post(
    "https://api.sixtyfour.ai/reverse-email-bulk-async",
    headers={"x-api-key": "YOUR_API_KEY", "Content-Type": "application/json"},
    json={
        "leads": [
            {"email": "sarah.johnson@example.com"},
            {"email": "john.doe@acme.com"}
        ]
    }
)
response.raise_for_status()
task_id = response.json()["task_id"]

while True:
    status = requests.get(
        f"https://api.sixtyfour.ai/job-status/{task_id}",
        headers={"x-api-key": "YOUR_API_KEY"}
    ).json()

    if status["status"] == "completed":
        results = status["result"]
        break
    if status["status"] in ("failed", "cancelled"):
        raise RuntimeError(f"Job {status['status']}: {status.get('error', 'Unknown error')}")

    time.sleep(10)