> ## Documentation Index
> Fetch the complete documentation index at: https://orbisearch.com/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# Find a Person's Email From Their Name and Company Domain

> Use POST /v1/email-lookup to find the deliverable email address for a specific person at a specific domain. Returns a verified result in a single call.

Email lookup lets you find a person's deliverable email address when you only have their first name, last name, and the domain of the company they work at. Send the three fields, get a verified email back.

## When to use email lookup

* **Contact enrichment** — you've collected a name and company from a form, LinkedIn, or a CSV and need a reachable email to act on it.
* **Lead research** — you know who you want to contact and where they work, but not the exact address.
* **Reconnecting with known contacts** — after a company moves off a free email provider to a custom domain.

For verifying an address you already have, use [single verification](/docs/guides/single-verification). For verifying a list of known addresses, use [bulk verification](/docs/guides/bulk-verification).

<Note>
  **Looking up more than one person? Use [bulk lookup](/docs/guides/bulk-lookup).** Bulk jobs run in the background, so each lookup gets more time to resolve — which finds more addresses than a single timed request. Use synchronous lookup only for ad-hoc, one-off lookups, or when your tool (such as Clay) doesn't support bulk.
</Note>

## Making a request

To look up an email, send a `POST` request to `/v1/email-lookup` with the person's first name, last name, and company domain in the JSON body. Include your API key in the `X-API-Key` header.

<Steps>
  <Step title="Get your API key">
    Sign in to the [OrbiSearch dashboard](https://orbisearch.com/dashboard/api-keys) and copy your API key.
  </Step>

  <Step title="Send the request">
    Call `POST /v1/email-lookup` with your key in the request header.

    <CodeGroup>
      ```bash cURL theme={null}
      curl --request POST \
        --url "https://api.orbisearch.com/v1/email-lookup" \
        --header "X-API-Key: YOUR_API_KEY" \
        --header "Content-Type: application/json" \
        --data '{
          "first_name": "Jane",
          "last_name": "Doe",
          "domain": "acme.com"
        }'
      ```

      ```python Python theme={null}
      import requests

      response = requests.post(
          "https://api.orbisearch.com/v1/email-lookup",
          json={
              "first_name": "Jane",
              "last_name": "Doe",
              "domain": "acme.com",
          },
          headers={"X-API-Key": "YOUR_API_KEY"},
      )

      result = response.json()
      print(result["email"], result["status"])
      ```

      ```javascript JavaScript theme={null}
      const response = await fetch(
        "https://api.orbisearch.com/v1/email-lookup",
        {
          method: "POST",
          headers: {
            "X-API-Key": "YOUR_API_KEY",
            "Content-Type": "application/json",
          },
          body: JSON.stringify({
            first_name: "Jane",
            last_name: "Doe",
            domain: "acme.com",
          }),
        }
      );

      const result = await response.json();
      console.log(result.email, result.status);
      ```
    </CodeGroup>
  </Step>

  <Step title="Read the response">
    When a deliverable address is found, the response includes the discovered `email` and the same enrichment fields as [single verification](/docs/guides/single-verification).

    ```json theme={null}
    {
      "email": "jane.doe@acme.com",
      "status": "safe",
      "substatus": "deliverable",
      "explanation": "Safe to email. The mailbox exists and is deliverable.",
      "email_provider": "Google Workspace",
      "mx_record": "aspmx.l.google.com",
      "is_domain_catch_all": false,
      "is_secure_email_gateway": false,
      "is_disposable": false,
      "is_role_account": false,
      "is_free": false,
      "credits_consumed": 1,
      "first_name": "Jane",
      "last_name": "Doe",
      "domain": "acme.com"
    }
    ```
  </Step>
</Steps>

## Interpreting the response

The top-level `status` uses the same vocabulary as [`/v1/verify`](/docs/api-reference/verify-email):

| `status`  | `substatus`        | What it means                                                                                                                                                              |
| --------- | ------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `safe`    | `deliverable`      | We found a deliverable address for this person. The `email` field contains it.                                                                                             |
| `unknown` | `no_address_found` | We couldn't confirm a deliverable address for this person at this domain. The `email` field is `null`.                                                                     |
| `unknown` | `timeout`          | The lookup hit the per-request time budget before completing. For people who are harder to find, [bulk lookup](/docs/guides/bulk-lookup) gives each entry more time to resolve. |

In every case, the response echoes the `first_name`, `last_name`, and `domain` you sent (with casing and whitespace cleaned up), and includes `credits_consumed`. When a deliverable address is found, the full set of verification fields (`email_provider`, `mx_record`, enrichment flags) is populated — see [Single Verification: Response Fields](/docs/guides/single-verification#response-fields) for their meaning.

When `email` is `null`, don't send to that person at that domain — we couldn't find a deliverable address for them.

## Pricing

Each lookup costs **1 credit**. Every returned response is charged — including `substatus: timeout` (the lookup ran but did not complete within your `timeout` value). Refunds are issued only when OrbiSearch infrastructure cannot complete the request (`502`).

Results are cached for 24 hours. Looking up the same person (same first name, last name, and domain, ignoring casing and whitespace) within that window returns the cached result at no credit cost.

## Rate limits

This endpoint shares the [20 requests per second](/docs/api-reference/errors) per API key limit with [`/v1/verify`](/docs/api-reference/verify-email) and [`/v1/bulk`](/docs/api-reference/bulk-submit).

## The `timeout` parameter

By default, OrbiSearch waits up to 97 seconds for the lookup to complete. You can override this with the `timeout` field in the request body (minimum 30, maximum 97, in seconds).

```bash theme={null}
curl --request POST \
  --url "https://api.orbisearch.com/v1/email-lookup" \
  --header "X-API-Key: YOUR_API_KEY" \
  --header "Content-Type: application/json" \
  --data '{
    "first_name": "Jane",
    "last_name": "Doe",
    "domain": "acme.com",
    "timeout": 60
  }'
```

If the lookup hits the timeout, you receive a `status: unknown` / `substatus: timeout` response. The credit is charged like any other returned response. For people who need more time to resolve, use [bulk lookup](/docs/guides/bulk-lookup) — it runs in the background and gives each entry more time than a single synchronous request.
