Notifications and webhooks for jobs
You don't need to keep an eye on a long job. When it finishes, fails or stops at the quota, you are notified — in the dashboard, in the bell and by email. Your own code can get the same as a webhook.
Who is notified?
Only the person who started the job — and only while they are still a member of the team. For a job created via the API, that is the owner of the key. Messages in the dashboard are only shown when you are in the team the job belongs to.
If you cancel a job yourself, you get no message. If a colleague cancels your job, you are told.
When and how
| Event | Toast in the dashboard | Bell | |
|---|---|---|---|
| Job completed | yes | yes | only if the job ran for more than 2 minutes, or you weren't online |
| Job completed with error rows | yes | yes | same rule as «Job completed» |
| Job failed | yes | yes | yes |
| Job stopped at the quota | yes | yes | yes |
| Job cancelled by someone else | yes | yes | no |
| Job paused by someone else | no | yes | no |
| Result deleted soon (24 hours before, if nobody has downloaded it) | no | yes | yes |
| Job started after queue (has waited more than 1 minute) | yes | no | no |
The toast has buttons for what you usually need next — e.g. Get result, See failed rows or Open the job.
Turn notifications on and off
All job notifications are on from the start. You can turn each event off separately — per channel:
- Go to Settings → Notifications in the dashboard.
- Find the Jobs group.
- Turn off In the app (toast and bell) and/or Email for the events you don't want. A «–» means the event isn't sent on that channel.
- Click Save changes.
The settings are your own — they don't affect your colleagues. Jobs don't send notifications to Telegram.
Webhooks
If you want your own code to react when a job is done, use a webhook instead of asking for the status again and again.
How to set it up:
- Go to Webhooks in the dashboard and add an endpoint (https).
- Choose the events in the Jobs group.
- Verify the signature in the
X-Addr-Signatureheader with your signing secret.
Webhooks follow the team's subscription — not the individual's notification settings. They are sent for all the team's jobs, no matter who started them. On the job's detail page, the Webhooks tab shows what was sent for the job and whether it was delivered.
| Event | Sent when |
|---|---|
job.completed | The job is done — also when some rows couldn't be matched (see fejl and ok) |
job.failed | The job stopped because of an error |
job.quota_stopped | The team's quota was used up while the job was running |
job.cancelled | The job was cancelled — by anyone. annulleret_af_starter tells whether it was the person who started it |
job.result_expiring | The result is deleted within 24 hours, and nobody has downloaded it |
job.paused | The job was paused. af_starter tells whether it was the person who started it |
job.resumed | The job was resumed after a pause |
job.completed, job.failed, job.quota_stopped, job.cancelled and job.result_expiring are sent at most once per job; job.paused and job.resumed are sent every time it happens. The event type is in the X-Addr-Event-Type header, and a unique id in X-Addr-Event-Id — store the id so you can reject duplicates on retries.
The job's data in the webhook has the same fields as the job in GET /v1/jobs/{id} (without raekke_fejl), plus ok (rows without errors) and dashboard_url:
{
"id": "7c0e6f0a-3b1d-4f5e-9a51-2d4c8b1e9f20",
"type": "datavask",
"variant": "adresser",
"kilde": "dashboard",
"navn": "customers-october.csv",
"status": "faerdig",
"total": 48522,
"behandlet": 48522,
"fejl": 312,
"ok": 48210,
"procent": 100,
"raekker_pr_sek": 1840,
"eta_sek": null,
"afregnede_opslag": 48210,
"fejlbesked": null,
"oprettet": "2026-10-04T14:11:31.000Z",
"startet": "2026-10-04T14:11:32.000Z",
"faerdig": "2026-10-04T14:12:08.000Z",
"udloeber": "2026-10-11T14:12:08.000Z",
"resultat": {
"ndjson": "https://api.danskadresseapi.dk/v1/jobs/7c0e6f0a-3b1d-4f5e-9a51-2d4c8b1e9f20/resultat?format=ndjson",
"csv": "https://api.danskadresseapi.dk/v1/jobs/7c0e6f0a-3b1d-4f5e-9a51-2d4c8b1e9f20/resultat?format=csv"
},
"job_fejl": null,
"dashboard_url": "https://danskadresseapi.dk/dashboard/jobs?job=7c0e6f0a-3b1d-4f5e-9a51-2d4c8b1e9f20"
}For job.failed and job.quota_stopped the cause is in job_fejl (code, explanation and any reference) — see When a job fails — error codes. Download the result with the links in resultat and your API key.
More about signatures, retries and the webhook envelope: the webhooks guide.
