Skip to content

Notifications and webhooks for jobs

4 min read

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

EventToast in the dashboardBellEmail
Job completedyesyesonly if the job ran for more than 2 minutes, or you weren't online
Job completed with error rowsyesyessame rule as «Job completed»
Job failedyesyesyes
Job stopped at the quotayesyesyes
Job cancelled by someone elseyesyesno
Job paused by someone elsenoyesno
Result deleted soon (24 hours before, if nobody has downloaded it)noyesyes
Job started after queue (has waited more than 1 minute)yesnono

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:

  1. Go to Settings → Notifications in the dashboard.
  2. Find the Jobs group.
  3. 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.
  4. 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:

  1. Go to Webhooks in the dashboard and add an endpoint (https).
  2. Choose the events in the Jobs group.
  3. Verify the signature in the X-Addr-Signature header 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.

EventSent when
job.completedThe job is done — also when some rows couldn't be matched (see fejl and ok)
job.failedThe job stopped because of an error
job.quota_stoppedThe team's quota was used up while the job was running
job.cancelledThe job was cancelled — by anyone. annulleret_af_starter tells whether it was the person who started it
job.result_expiringThe result is deleted within 24 hours, and nobody has downloaded it
job.pausedThe job was paused. af_starter tells whether it was the person who started it
job.resumedThe 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:

JSON
{
  "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.

Was this helpful?