> ## Documentation Index
> Fetch the complete documentation index at: https://docs.getqr.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Bulk-oprettelse af QR-koder

> Opret op til 100 QR-koder på én gang, og download dem som et ZIP-arkiv.

> [!NOTE]
>
> GetQR API'et er i beta og er tilgængeligt for udvalgte arbejdsområder. Detaljer kan ændre sig før den generelle udgivelse.

En bulk-oprettelse gør en liste med navne og URL'er til website-QR-koder med ét fælles design. Den kører i baggrunden: Start den, følg fremskridtet, og download derefter ZIP-arkivet.

| Metode | Sti | Beskrivelse |
| - | - | - |
| `GET` | `/api/v1/bulk-qr-creations` | [Hent den aktuelle bulk-oprettelse](#hent-den-aktuelle-bulk-oprettelse) |
| `POST` | `/api/v1/bulk-qr-creations` | [Opret fra JSON](#opret-fra-json) |
| `POST` | `/api/v1/bulk-qr-creations/csv` | [Opret fra en CSV-fil](#opret-fra-en-csv-fil) |
| `GET` | `/api/v1/bulk-qr-creations/{id}` | [Hent en bulk-oprettelse](#hent-en-bulk-oprettelse) |
| `DELETE` | `/api/v1/bulk-qr-creations/{id}` | [Afbryd en bulk-oprettelse](#afbryd-en-bulk-oprettelse) |
| `GET` | `/api/v1/bulk-qr-creations/{id}/download` | [Download arkivet](#download-arkivet) |

## Sådan fungerer det

**1. Start bulk-oprettelsen**

Send dine rækker med [Opret fra JSON](#opret-fra-json) eller [Opret fra en CSV-fil](#opret-fra-en-csv-fil). API'et svarer `202` med bulk-oprettelsen og dens `id`.

**2. Følg fremskridtet**

Kald [Hent en bulk-oprettelse](#hent-en-bulk-oprettelse) med få sekunders mellemrum, indtil `status` er `completed` eller `failed`.

**3. Download arkivet**

Når `status` er `completed`, kalder du [Download arkivet](#download-arkivet) for at få en ZIP med QR-kodebillederne.

* **Grænse.** Op til 100 rækker pr. bulk-oprettelse.
* **Én ad gangen.** Der kører kun én bulk-oprettelse pr. arbejdsområde. Starter du en ny, mens en kører, returneres den, der kører.
* **Idempotens.** Hver forespørgsel kræver en `idempotencyKey`. Gentager du en forespørgsel med samme nøgle og samme body, returneres den bulk-oprettelse, der allerede er startet. Samme nøgle med en anden body returnerer `422`.
* **Rækker.** Hver række skal have et `name` og en `url`. Se [Rækker](#rækker).
* **Abonnement.** Bulk-oprettelse er ikke tilgængelig på Single QR-abonnementet: Forespørgslen returnerer `403 exceeded_limit`.

## Rækker

* **Navn.** Bliver QR-kodens titel. Trimmes og afkortes til 40 tegn. Gentagne navne (uden hensyn til store og små bogstaver) får et nummer: `Menu`, `Menu 2`, `Menu 3`.
* **URL.** Bliver destinationen. Den skal være en `http`- eller `https`-adresse med et rigtigt domæne, f.eks. `example.com/menu`, og må ikke indeholde mellemrum. En URL uden skema får `https://`.
* **Tomme rækker.** Rækker uden både navn og URL springes over. En række med kun det ene afvises.

Alle QR-koder er `website`-QR-koder på et kortlink. Se [QR-kodedata efter type](https://docs.getqr.com/da/api/guides/qr-types.md).

## Headere

**Authorization** `string` *required*

`Bearer` efterfulgt af din API-nøgle. Se [Godkendelse](https://docs.getqr.com/da/api/authentication.md).

**Content-Type** `string`

`application/json` til [Opret fra JSON](#opret-fra-json), `multipart/form-data` til [Opret fra en CSV-fil](#opret-fra-en-csv-fil).

## Objektet for en bulk-oprettelse

**id** `string`

Bulk-oprettelsens id, f.eks. `cm2k7x9qb0003ax8eb4f6gh2t`.

**status** `string`

`queued`, `processing`, `packaging` eller `completed`. En mislykket eller afbrudt bulk-oprettelse går via `rollingBack` til `failed`.

**sourceFilename** `string`

Kildefilens navn.

**totalCount** `integer`

Antal rækker.

**createdCount** `integer`

QR-koder oprettet indtil nu.

**renderedCount** `integer`

QR-kodebilleder renderet indtil nu.

**percent** `integer`

Samlet fremskridt, 0 til 100. Oprettelse går op til 40, rendering op til 90, pakning er 95, og `completed` er 100.

**stalled** `boolean`

`true`, når en igangværende bulk-oprettelse ikke har gjort fremskridt i 2 minutter. Bliv ved med at spørge: [Hent en bulk-oprettelse](#hent-en-bulk-oprettelse) genstarter en bulk-oprettelse, der står stille.

**error** `object | null`

Når `status` er `failed`: `code` og `message`. En afbrudt bulk-oprettelse har koden `cancelled_by_user`. En mislykket bulk-oprettelse rulles tilbage, så ingen af dens QR-koder bevares.

**downloadUrl** `string | null`

Stien til [Download arkivet](#download-arkivet), når `status` er `completed`.

**createdAt** `string`

Startdato, ISO 8601.

**updatedAt** `string`

Dato for seneste opdatering, ISO 8601.

**completedAt** `string | null`

Dato for afslutning, ISO 8601.

**failedAt** `string | null`

Dato for fejl, ISO 8601.

## Hent den aktuelle bulk-oprettelse

`GET /api/v1/bulk-qr-creations`

Returnerer den bulk-oprettelse, der stadig kører i dit arbejdsområde. Når ingen kører, returneres den senest afsluttede (`completed` eller `failed`), indtil den er afvist: Det sker, når du downloader dens arkiv eller afviser den i dashboardet. Ellers returneres `null`. Brug den til at genoptage overvågningen efter en genstart.

```bash cURL theme={null}
curl "https://getqr.com/api/v1/bulk-qr-creations" \
  -H "Authorization: Bearer $GETQR_API_KEY"
```

```json 200 theme={null}
{
  "id": "cm2k7x9qb0003ax8eb4f6gh2t",
  "status": "processing",
  "sourceFilename": "campaign-links.csv",
  "totalCount": 50,
  "createdCount": 18,
  "renderedCount": 12,
  "percent": 26,
  "stalled": false,
  "error": null,
  "downloadUrl": null,
  "createdAt": "2026-08-14T08:00:00.000Z",
  "updatedAt": "2026-08-14T08:00:20.000Z",
  "completedAt": null,
  "failedAt": null
}
```

```json 200 (nothing to resume) theme={null}
null
```

## Opret fra JSON

`POST /api/v1/bulk-qr-creations`

Starter en bulk-oprettelse ud fra en liste med rækker. Svarer `202 Accepted`. Bulk-oprettelsen kører i baggrunden.

**rows** `object[]` *required*

QR-koder, der skal oprettes, op til 100. Hver række er `{ "name": "...", "url": "..." }` og tager ingen andre felter. Se [Rækker](#rækker).

**design** `object` *required*

Design, der anvendes på alle QR-koder: `styles`, `frameOptions` og `logoOptions`, alle valgfri. Send `{}` for standarddesignet. Andre felter afvises. Se [Tilpasning](https://docs.getqr.com/da/api/guides/customization.md).

**sourceFilename** `string` *required*

Navn, der vises i dashboardet og bruges til arkivet, 1 til 255 tegn.

**idempotencyKey** `string` *required*

Din egen nøgle til denne bulk-oprettelse, 8 til 100 tegn.

```bash cURL theme={null}
curl -X POST "https://getqr.com/api/v1/bulk-qr-creations" \
  -H "Authorization: Bearer $GETQR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "rows": [
      { "name": "Menu", "url": "https://example.com/menu" },
      { "name": "Wine list", "url": "example.com/wine" }
    ],
    "design": { "styles": { "dotsOptions": { "type": "rounded" } } },
    "sourceFilename": "campaign-links.csv",
    "idempotencyKey": "campaign-2026-08-14"
  }'
```

```json 202 theme={null}
{
  "id": "cm2k7x9qb0003ax8eb4f6gh2t",
  "status": "queued",
  "sourceFilename": "campaign-links.csv",
  "totalCount": 2,
  "createdCount": 0,
  "renderedCount": 0,
  "percent": 0,
  "stalled": false,
  "error": null,
  "downloadUrl": null,
  "createdAt": "2026-08-14T08:00:00.000Z",
  "updatedAt": "2026-08-14T08:00:00.000Z",
  "completedAt": null,
  "failedAt": null
}
```

## Opret fra en CSV-fil

`POST /api/v1/bulk-qr-creations/csv`

Det samme som [Opret fra JSON](#opret-fra-json), men tager rækkerne som en CSV-fil sendt som `multipart/form-data`. Svarer `202 Accepted`.

Filen skal være en `.csv` på højst 1.000.000 bytes. Dens overskriftsrække skal være præcis `name,url` efterfulgt af op til 100 datarækker. Se [CSV-format](https://docs.getqr.com/da/bulk/csv-format.md).

**file** `file` *required*

CSV-filen.

**design** `string` *required*

Designobjektet serialiseret som JSON, f.eks. `{"styles":{"dotsOptions":{"type":"rounded"}}}`. Send `{}` for standarddesignet.

**idempotencyKey** `string` *required*

Din egen nøgle til denne bulk-oprettelse, 8 til 100 tegn.

**sourceFilename** `string`

Navn, der vises i dashboardet og bruges til arkivet, op til 255 tegn. Standard er navnet på den uploadede fil.

```bash cURL theme={null}
curl -X POST "https://getqr.com/api/v1/bulk-qr-creations/csv" \
  -H "Authorization: Bearer $GETQR_API_KEY" \
  -F "file=@campaign-links.csv" \
  -F 'design={"styles":{"dotsOptions":{"type":"rounded"}}}' \
  -F "idempotencyKey=campaign-2026-08-14"
```

```csv campaign-links.csv theme={null}
name,url
Menu,https://example.com/menu
Wine list,example.com/wine
```

```json 202 theme={null}
{
  "id": "cm2k7x9qb0003ax8eb4f6gh2t",
  "status": "queued",
  "sourceFilename": "campaign-links.csv",
  "totalCount": 2,
  "createdCount": 0,
  "renderedCount": 0,
  "percent": 0,
  "stalled": false,
  "error": null,
  "downloadUrl": null,
  "createdAt": "2026-08-14T08:00:00.000Z",
  "updatedAt": "2026-08-14T08:00:00.000Z",
  "completedAt": null,
  "failedAt": null
}
```

## Hent en bulk-oprettelse

`GET /api/v1/bulk-qr-creations/{id}`

Returnerer status og fremskridt for en bulk-oprettelse. Spørg løbende, så længe `status` er `queued`, `processing` eller `packaging`. `downloadUrl` vises, når arkivet er klar.

**id** `string` *required*

Bulk-oprettelsens id. Hent det fra svaret på oprettelsen eller på den aktuelle bulk-oprettelse.

```bash cURL theme={null}
curl "https://getqr.com/api/v1/bulk-qr-creations/cm2k7x9qb0003ax8eb4f6gh2t" \
  -H "Authorization: Bearer $GETQR_API_KEY"
```

```json 200 theme={null}
{
  "id": "cm2k7x9qb0003ax8eb4f6gh2t",
  "status": "completed",
  "sourceFilename": "campaign-links.csv",
  "totalCount": 50,
  "createdCount": 50,
  "renderedCount": 50,
  "percent": 100,
  "stalled": false,
  "error": null,
  "downloadUrl": "/api/v1/bulk-qr-creations/cm2k7x9qb0003ax8eb4f6gh2t/download",
  "createdAt": "2026-08-14T08:00:00.000Z",
  "updatedAt": "2026-08-14T08:02:10.000Z",
  "completedAt": "2026-08-14T08:02:10.000Z",
  "failedAt": null
}
```

## Afbryd en bulk-oprettelse

`DELETE /api/v1/bulk-qr-creations/{id}`

Stopper en igangværende bulk-oprettelse og sletter de QR-koder, den allerede har oprettet. Tilbagerulningen sker under forespørgslen, så svaret normalt har `status` `failed` og `error.code` `cancelled_by_user`. Afbryder du en bulk-oprettelse, der allerede er mislykket, returneres den uændret.

> [!WARNING]
>
> En bulk-oprettelse, der er gennemført, kan ikke afbrydes: Forespørgslen returnerer `400`. Slet i stedet dens QR-koder én ad gangen med [QR-koder](https://docs.getqr.com/da/api/endpoints/qr-codes.md).

**id** `string` *required*

Bulk-oprettelsens id.

```bash cURL theme={null}
curl -X DELETE "https://getqr.com/api/v1/bulk-qr-creations/cm2k7x9qb0003ax8eb4f6gh2t" \
  -H "Authorization: Bearer $GETQR_API_KEY"
```

```json 200 theme={null}
{
  "id": "cm2k7x9qb0003ax8eb4f6gh2t",
  "status": "failed",
  "sourceFilename": "campaign-links.csv",
  "totalCount": 50,
  "createdCount": 18,
  "renderedCount": 12,
  "percent": 26,
  "stalled": false,
  "error": {
    "code": "cancelled_by_user",
    "message": "Bulk QR creation was cancelled."
  },
  "downloadUrl": null,
  "createdAt": "2026-08-14T08:00:00.000Z",
  "updatedAt": "2026-08-14T08:00:40.000Z",
  "completedAt": null,
  "failedAt": "2026-08-14T08:00:40.000Z"
}
```

## Download arkivet

`GET /api/v1/bulk-qr-creations/{id}/download`

Returnerer et ZIP-arkiv med én JPEG på 1024 px pr. QR-kode, navngivet efter dens række: `001-Menu.jpg`, `002-Wine list.jpg` og så videre. Arkivet er navngivet efter `sourceFilename`. Tilgængeligt, når `status` er `completed`. Downloaden afviser bulk-oprettelsen, så [Hent den aktuelle bulk-oprettelse](#hent-den-aktuelle-bulk-oprettelse) holder op med at returnere den.

**id** `string` *required*

Bulk-oprettelsens id.

```bash cURL theme={null}
curl "https://getqr.com/api/v1/bulk-qr-creations/cm2k7x9qb0003ax8eb4f6gh2t/download" \
  -H "Authorization: Bearer $GETQR_API_KEY" \
  --output qr-codes.zip
```

```http 200 theme={null}
HTTP/1.1 200 OK
Content-Type: application/zip
Content-Disposition: attachment; filename="campaign-links-qr-codes.zip"

<binary archive data>
```

## Almindelige problemer

> [accordion] 422 med "contains an invalid HTTP(S) URL"
>
> Beskeden nævner rækken. Hver URL skal være en `http`- eller `https`-adresse med et rigtigt domæne, f.eks. `example.com/menu`. Ret rækken, og send forespørgslen igen.

> [accordion] 422 "CSV headers must be exactly: name,url."
>
> CSV-filens første række skal være `name,url` i den rækkefølge og med små bogstaver, uden andre kolonner.

> [accordion] 422 "This idempotencyKey was already used with a different request body."
>
> Nøgler kan ikke genbruges til en anden batch. Send en ny `idempotencyKey`.

> [accordion] 409 "The bulk QR archive is not ready for download."
>
> Bulk-oprettelsen er ikke gennemført endnu. Bliv ved med at spørge, indtil `status` er `completed`.

> [accordion] 400 "Cannot cancel a finished bulk QR creation."
>
> Bulk-oprettelsen er allerede gennemført, så den kan ikke rulles tilbage.

> [accordion] 403 exceeded\_limit
>
> Dit arbejdsområde er på Single QR-abonnementet, som ikke omfatter bulk-oprettelse. Opgrader abonnementet.

> [accordion] Jeg fik en ældre bulk-oprettelse tilbage i stedet for en ny
>
> En anden bulk-oprettelse kører stadig i dit arbejdsområde, eller du har genbrugt en `idempotencyKey`. Vent, til den er færdig, eller brug en ny nøgle.

## Næste skridt

> [card] [Tilpasning](https://docs.getqr.com/da/api/guides/customization.md)

> [card] [QR-koder](https://docs.getqr.com/da/api/endpoints/qr-codes.md)

> [card] [Bulk-oprettelse i appen](https://docs.getqr.com/da/bulk/overview.md)

> [card] [CSV-format](https://docs.getqr.com/da/bulk/csv-format.md)


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.