Extra phones
Extra phones
The phones_extra module digs past the single switchboard line returned by a typical map listing and surfaces the additional voice channels a business exposes on its own site: direct lines, mobile numbers, sales desks and support hotlines.
Purpose
Discovery sources publish one canonical phone per location. Real organisations publish several across homepage, landing pages, team bios, and legal notices. phones_extra reads the public-facing pages of each website attached to a POI, extracts every phone-shaped token, validates them through Google's phonenumbers library, normalises to E.164, and deduplicates against the primary number already on file.
Inputs
The module operates on an enriched POI list: typically the result of a prior discovery run.
| Field | Required | Notes |
|---|---|---|
site_web |
yes | POIs without a website are filtered out at submit. |
name |
no | Used for output labelling and audit trail. |
phone |
no | When present, used as the dedupe reference. |
address |
no | Used to bias country detection for ambiguous formats. |
Items missing site_web are silently dropped; if the filtered list is empty the request is rejected with a validation error.
Outputs
Each input row keeps its original columns and gains the fields below. Multiple numbers are joined with |. Empty strings indicate the module ran but found nothing of that kind. The primary telephone of the row is never repeated here, and at most 5 numbers are kept per site.
| Column | Type | Description |
|---|---|---|
phones_extra |
string | Every additional number found on the site, E.164. |
phones_extra_count |
string | How many numbers phones_extra holds. |
phones_source_urls |
string | Pages the numbers were read from. |
phones_mobile |
string | The numbers of phones_extra that are mobile lines, E.164. |
phones_fixed |
string | The other numbers (landline, VoIP, special numbers), E.164. |
Mobile vs fixed is decided from the national numbering plan of each number (for France, 06 and 07 are mobile). Numbers a plan cannot tell apart (such as US fixed-or-mobile ranges) are listed as fixed. All numbers are validated and normalised; anything that fails validation is discarded rather than surfaced as a best-effort guess.
Lifecycle
Standard job lifecycle. See Jobs lifecycle. Progress is reported in sites and final volume in numéros.
Pipeline
phones_extra is an enrichment module: it augments an existing POI list rather than generating one.
needs: poi_list
produces: enriched_list
Typical chain:
scrap → phones_extra → filter → export
Endpoints
POST /api/jobs/phones-extra
Create a new extra-phones job from a list of POIs.
Body
| Field | Type | Required | Description |
|---|---|---|---|
items |
array | yes | POIs to enrich, each with at least site_web. |
source_job_id |
string (uuid) | no | Parent job ID when chaining from a prior run. |
Response
Returns the standard JobPublic envelope (id, status, job_type, output_filename, quota cost, timestamps).
Example
POST /api/jobs/phones-extra
Content-Type: application/json
{
"source_job_id": "f3c2…",
"items": [
{ "name": "Acme SAS", "site_web": "https://acme.example", "phone": "+33123456789" },
{ "name": "Beta Co", "site_web": "https://beta.example" }
]
}
{
"id": "9a7b…",
"status": "pending",
"job_type": "phones_extra",
"output_filename": "telephones-extra-2-sites.xlsx"
}
Global quotas and per-job ceilings: see Limits.
Errors
| Condition | Response |
|---|---|
No item carries a site_web |
400: Aucun établissement avec site web. |
| Estimated cost above the per-job quota | 400: quota exceeded, with the numeric overage. |
| Account quota exhausted | 400: quota check failure before insert. |
Malformed body (missing items, wrong types) |
422: request validation error. |
Runtime errors on individual sites do not abort the job: the affected POI is recorded with empty extra-phone fields and the worker moves on.
What's next
- Verify emails: pair freshly found direct lines with deliverable inboxes.
- Filter: slice the enriched list by presence of a mobile, by country code, or by any combination of the new fields.