---
title: "Find emails in bulk"
method: POST
path: "/v1/email-finder/"
tags: ["Email Finder"]
---

# Find emails in bulk

`POST /v1/email-finder/`

## Request

- Base URL: `https://api.evaboot.com`
- URL: `https://api.evaboot.com/v1/email-finder/`
- Auth: HTTP bearer

Create a job that finds email addresses for a list of prospects. Each prospect needs a first name, a last name, and a company name or company domain — sending the domain as well improves accuracy.

The lookups run in the background, so the call returns straight away with `202` and a `job_id`. Poll `GET /v1/email-finder/{job_id}/` for progress and results: it answers `202` while the job is still running and `200` once every prospect is done.

**Webhook support:** include a `webhook_url` and we POST the finished job to it instead, with the same payload as the retrieve endpoint, so you do not have to poll.

**Cost:** 1 credit per deliverable email found. Prospects with no email, or an email that fails verification, are not charged. Credits are taken when the job finishes.

## Request body

- EmailFinderJobIn: Bulk email-finder job request — matches legacy ``EmailFinderJobSerializer`` (public_api/serializers/email_finder.py).
  - `job_name` string: Your own label for the job, so you can recognize it later. Optional.
  - `webhook_url` string: Optional HTTPS URL to notify when the job finishes. We send a POST carrying the same payload as `GET /v1/email-finder/{job_id}/`, so you can skip polling.
  - `prospects` EmailFinderProspectIn[]: The people to find emails for. Each entry needs a first and last name plus a company name or domain. Leave empty when sending `source`.
    - `first_name` string, required: First name of the prospect.
    - `last_name` string, required: Last name of the prospect.
    - `company_name` string: Name of the company the prospect works at. Supply this or `company_domain` for each prospect.
    - `company_domain` string: Web domain of the prospect's company, without a scheme or path. Improves accuracy when you already know it.
    - `source_ref` string: Optional. The `source_ref` of a lead read from a connected integration. With `write_back` on, the result is written back to that record.
  - `source` LeadSourceIn
    - `integration_id` string, uuid, required: A connected integration, from `GET /v1/integrations/`.
    - `source_id` string, required: A source of that integration, from `GET /v1/integrations/{id}/sources/`.
    - `max_leads` integer: Most leads to read from the source. The job costs at most this many credits.
  - `write_back` boolean: Write each result back onto the record its prospect's `source_ref` points to, once the job is paid for. Fills empty fields only and never creates a record.

## Response `202`

Accepted

- EmailFinderJobAcceptedOut: POST response — accepted-and-queued. HTTP 202. Matches legacy ``EmailFinderListCreateView.create`` at ``evaboot_django/public_api/views/email_finder.py:302-308``. Bubble's workflow stores ``job_id`` (the Bubble-minted ID) and uses it for subsequent GET polling.
  - `success` boolean: Always `true`; failures come back as an error response.
  - `job_id` string, required: Identifier of the queued job. Use it with `GET /v1/email-finder/{job_id}/` to collect the results.
  - `message` string: Human-readable confirmation that the job was queued.

## Other responses

- `401`: The API key is missing, malformed or unknown.
- `422`: The request body or a supplied URL failed validation.

---

[API](https://skmtc.dev/evaboot/apis/evaboot-public-api.md) · [All operations](https://skmtc.dev/evaboot/apis/evaboot-public-api/llms.txt) · [OpenAPI document](https://skmtc.dev/evaboot/apis/evaboot-public-api/revisions/d770494f2718?raw)
