Closed check
Check whether each point of interest is still operating, has shut down, or is uncertain: based on real abandonment signals on its website.
Purpose
The dead_check module inspects the website attached to each point of interest (POI) and decides whether the underlying business looks alive, dead, or uncertain. It correlates several abandonment signals on the same domain: expiring registration, redirection to an unrelated property (resale or rebranding), parking pages disguised as real sites, and stale or invalid TLS certificates. Directory listings (Doctolib, Pages Jaunes, Yelp, etc.) are recognised as such rather than blindly flagged as a personal site.
Inputs
A list of POIs, each carrying at least a website. Items without a site_web are filtered out at submit time.
| Field | Type | Required | Description |
|---|---|---|---|
items |
array of POI objects | yes | 1 to 10 000 entries. Entries without a site_web are dropped before execution. |
source_job_id |
string | no | Identifier of the upstream list-producing job (typically a scrap). Used for lineage in the UI and the pipeline. |
No other tuning parameters: the module runs in a single mode.
Outputs
Each input row keeps its original columns and gains the following:
| Column | Type | Description |
|---|---|---|
status |
string | Verdict: alive (the site answers like an active business), stale (reachable but abandoned-looking: under-construction page or no update for more than two years), dead (DNS failure, refused connection, server error, parking page, default server page, empty page), unknown (could not decide: protected page, timeout, or no URL), aggregator (the URL is a directory listing, not the business's own site). |
reasons |
string | Signals behind the verdict, joined with \| (for example parking_page, http_403_protected, no_url). |
final_url |
string | URL reached after redirects. |
http_status |
integer | HTTP status of the final response. |
last_modified |
string | Last modification date announced by the server, when available. |
ssl_valid |
string | Whether the TLS certificate is valid. |
response_ms |
integer | Response time in milliseconds. |
domain_expires_at |
string | Domain expiry date, when the registry publishes it. |
domain_expires_in_days |
integer | Days left before the domain expires. |
registrar |
string | Domain registrar. |
redirect_off_domain |
string | Whether the site redirects to another domain (resale or rebranding). |
The site_alive entry of the module registry is a signal, not a CSV header: in a pipeline, the alive_only rule of filter keeps the rows whose status is alive or stale.
The progress unit during execution is sites; the result unit is also sites.
Lifecycle
Standard job states. See Jobs lifecycle. Partial counters stream over SSE so early verdicts can be consumed without waiting for the final export.
Pipeline
Pipelinable; typically inserted right after the list-producing step, before any expensive enrichment.
| Slot | Value |
|---|---|
needs |
site_web |
produces |
site_alive |
| Category | verify |
| Typical upstream | scrap |
| Typical downstream | emails, techstack, ads_intelligence, filter |
A common pattern is scrap, then dead_check, then filter with alive_only (keeps status alive or stale), then any enrichment module. This avoids spending budget on shuttered businesses.
Endpoints
Create a job:
POST /api/jobs/dead-check
Content-Type: application/json
{
"items": [
{ "site_web": "https://example.com", "nom": "Example Co" }
],
"source_job_id": "…"
}
Response: a JobPublic object with id, status, and the standard job metadata. Poll GET /api/jobs/{id} or subscribe to the SSE stream for progress; download the final CSV from the job detail page once status = "done".
For the full job API surface (list, detail, cancel, export, events), see Jobs API. For per-account quotas, see Limits.
Errors
| HTTP | detail |
Cause |
|---|---|---|
| 400 | Aucun établissement avec site web |
No input item carries a site_web field. |
| 400 | Quota dépassé : … |
Estimated cost exceeds the per-job equivalent-France quota. |
| 401 / 403 | — | Missing or inactive session. |
Errors raised after the job has been created surface on the job detail page and via the SSE error event; the job ends in status = "error" and partial results, if any, remain downloadable.