FR
Copied
Modules

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

Original input columns are preserved; the job appends a single column:

Column Type Description
email string Every address found for this row, joined with \|. Ordered with personal mailboxes first (for example firstname.lastname@), then other addresses, then generic ones (contact@, info@). Addresses of equal rank are sorted alphabetically. Empty when nothing qualifies.

There is no separate email_personal column: the email_personal entry of the module registry is a signal computed from email, used by the has_personal_email rule of filter.

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 email, email_personal (the CSV carries a single email column, see Outputs)
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