---
title: "Create an asynchronous job over a list (datavask, reverse, bbr, dagi, miljoe)"
method: POST
path: "/v1/jobs"
---

# Create an asynchronous job over a list (datavask, reverse, bbr, dagi, miljoe)

`POST /v1/jobs`

## Request

- Base URL: `https://api.grundfast.dk`
- URL: `https://api.grundfast.dk/v1/jobs`
- Auth: one of:
  - HTTP bearer
  - API key in cookie `gf_session`

The list arrives as JSON `{ kind, rows, columns?, srid?, label?, start? }`, a multipart `file` (CSV, NDJSON or a JSON array) with the same fields as form fields, or a raw `text/csv` / `application/x-ndjson` body with them as query parameters. `columns` maps roles (adresse, vej, husnr, postnr, by, x, y, bfe, adgangsadresse_id) to your column names; left out, they are detected from the names. Rows are worked in the background in modest chunks. Every uploaded row is counted against the quota at upload and handed back if it does not succeed: ONLY successful rows are billed. `start: false` makes a draft to fill with POST /v1/jobs/{id}/rows and start with POST /v1/jobs/{id}/start. A `job.completed` webhook fires when the last row is done. Rows per job follow the plan: 250 on Free, 10000 on Starter, 100000 on Pro, 500000 on Scale, 1000000 on Enterprise (402 over). One upload is at most 10 MB; upload a longer list in parts.

## Request body

- CreateJobInput
  - `kind` 'datavask' | 'reverse' | 'bbr' | 'dagi' | 'miljoe', required
  - `rows` object[]
  - `columns` object
    - `adresse` string
    - `vej` string
    - `husnr` string
    - `postnr` string
    - `by` string
    - `x` string
    - `y` string
    - `bfe` string
    - `adgangsadresse_id` string
  - `srid` union
    - 4326
    - 25832
  - `label` string
  - `start` boolean

## Response `201`

Job created (queued, or a draft)

- JobResponse
  - `job` object, required: An asynchronous job over a list. Poll it; download results and errors as files.
    - `id` string, required: job_…
    - `kind` 'datavask' | 'reverse' | 'bbr' | 'dagi' | 'miljoe', required
    - `status` 'draft' | 'queued' | 'running' | 'paused' | 'completed' | 'failed' | 'cancelled', required
    - `label` string, nullable, required
    - `totalRows` number, required
    - `processedRows` number, required: Rows with an answer or an error on file.
    - `succeeded` number, required
    - `failed` number, required
    - `billedUnits` number, required: Successful rows billed (0 for a test key).
    - `progress` number, required: processedRows / totalRows, 0..1.
    - `columns` object, required: Role → your column name (adresse, vej, husnr, postnr, by, x, y, bfe, adgangsadresse_id).
    - `srid` union, required
      - 4326
      - 25832
    - `inputColumns` string[], required
    - `error` string, nullable, required
    - `createdAt` string, required
    - `startedAt` string, nullable, required
    - `completedAt` string, nullable, required
    - `updatedAt` string, required
    - `resultsAvailable` boolean, required: False once the rows are deleted (JOB_RESULT_RETENTION_DAYS after the job ends).

## Other responses

- `400`: Error
- `401`: Error
- `402`: Error
- `409`: Error
- `413`: Error
- `429`: Error

---

[API](https://skmtc.dev/grundfast/apis/grundfast-api.md) · [All operations](https://skmtc.dev/grundfast/apis/grundfast-api/llms.txt) · [OpenAPI document](https://skmtc.dev/grundfast/apis/grundfast-api/revisions/ccef6e299bb5?raw)
