Emails
Find a working email address for each point of interest from a previous list.
Purpose
Enrichment module: infers email addresses from each POI's website. Personal mailboxes rank above generic ones (info@, contact@, hello@). No address is invented — empty when no candidate qualifies.
Inputs
A list of POIs each carrying at least a website. The two execution modes differ in coverage vs cost.
| Field | Type | Required | Description |
|---|---|---|---|
items |
array of POI objects | yes | 1 to 10 000 entries. Entries without a site_web are filtered out before execution. |
mode |
"normal" | "deep" |
no, defaults to "normal" |
normal runs the standard extraction. deep runs an exhaustive second pass and requires a previously completed normal run on the same source. |
source_job_id |
string | conditionally | Required when mode = "deep". Must reference a done emails job in normal mode on the same upstream source. |
Outputs
Each input POI is augmented with up to two email fields. Original POI columns are preserved; the job appends:
| Column | Type | Description |
|---|---|---|
email |
string | null | Best-ranked address for this POI. Empty when no candidate qualifies. |
email_personal |
string | null | Set when the best candidate looks like a person's mailbox rather than a generic role address. |
Ranking is deterministic. Progress unit: sites. Result unit: emails.
Lifecycle
Standard job lifecycle: see Jobs & lifecycle.
Pipeline
| Slot | Value |
|---|---|
needs |
poi_list (POIs with a site_web field) |
produces |
enriched_list (POIs augmented with email, email_personal) |
| Typical upstream | scrap |
| Typical downstream | verify_emails, delivery_check, filter |
Default pipeline config: { "mode": "normal" }. deep is intended as a manual follow-up on POIs that came back empty from the normal run.
Endpoints
Create a job:
POST /api/jobs/emails
Content-Type: application/json
{
"items": [
{ "site_web": "https://example.com", "nom": "Example Co" }
],
"mode": "normal"
}
Response: a JobPublic object with id, status, and standard metadata. For the full job API surface, see Jobs API.
Limits
Global quotas: see /docs/concepts/limits. Module-specific caps:
| Limit | Value |
|---|---|
| Minimum items per job | 1 |
| Maximum items per job | 10 000 |
| Items kept | only those with a non-empty site_web |
deep mode prerequisite |
A done normal emails job on the same source_job_id |
Items without a website are dropped during normalization. If the filtered list is empty, the job is rejected with "Aucun établissement avec site web".
Errors
| HTTP | detail |
Cause |
|---|---|---|
| 400 | Mode email invalide : ... (attendu: normal | deep) |
mode is neither normal nor deep. |
| 400 | Aucun établissement avec site web |
No input item carries a site_web field. |
| 400 | Le mode Deep Extract n'est dispo qu'après une extraction normale ... |
mode = "deep" submitted without a valid prior normal run on the same source. |
| 400 | Quota dépassé : ... |
Estimated cost exceeds the per-job equivalent-France quota. |
| 401 / 403 | — | Missing or inactive session. |
Errors raised after creation surface via the SSE error event; the job ends in status = "error" and partial results remain downloadable.
What's next
- verify_emails — confirm each address is deliverable before sending.
- delivery_check — measure inbox placement on a real message.
- filter — keep only POIs that have a personal address, exclude disposable domains, or sample the list.