> ## 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.

# Masseopprettelse av QR-koder

> Opprett opptil 100 QR-koder på én gang og last dem ned som et ZIP-arkiv.

> [!NOTE]
>
> GetQR API-et er i beta og er tilgjengelig for utvalgte arbeidsområder. Detaljer kan endres før den generelle lanseringen.

En masseopprettelse gjør en liste med navn og URL-er om til Website-QR-koder med ett felles design. Den kjører i bakgrunnen: start den, sjekk fremdriften jevnlig, og last deretter ned ZIP-arkivet.

| Metode | Bane | Beskrivelse |
| - | - | - |
| `GET` | `/api/v1/bulk-qr-creations` | [Hent den gjeldende masseopprettelsen](#hent-den-gjeldende-masseopprettelsen) |
| `POST` | `/api/v1/bulk-qr-creations` | [Opprett fra JSON](#opprett-fra-json) |
| `POST` | `/api/v1/bulk-qr-creations/csv` | [Opprett fra en CSV-fil](#opprett-fra-en-csv-fil) |
| `GET` | `/api/v1/bulk-qr-creations/{id}` | [Hent en masseopprettelse](#hent-en-masseopprettelse) |
| `DELETE` | `/api/v1/bulk-qr-creations/{id}` | [Avbryt en masseopprettelse](#avbryt-en-masseopprettelse) |
| `GET` | `/api/v1/bulk-qr-creations/{id}/download` | [Last ned arkivet](#last-ned-arkivet) |

## Slik fungerer det

**1. Start masseopprettelsen**

Send radene dine med [Opprett fra JSON](#opprett-fra-json) eller [Opprett fra en CSV-fil](#opprett-fra-en-csv-fil). API-et svarer `202` med masseopprettelsen og `id`.

**2. Sjekk fremdriften**

Kall [Hent en masseopprettelse](#hent-en-masseopprettelse) med noen sekunders mellomrom til `status` er `completed` eller `failed`.

**3. Last ned arkivet**

Når `status` er `completed`, kaller du [Last ned arkivet](#last-ned-arkivet) for å få en ZIP med QR-kodebildene.

* **Grense.** Opptil 100 rader per masseopprettelse.
* **Én om gangen.** Bare én masseopprettelse kjører per arbeidsområde. Starter du en ny mens en kjører, returneres den som kjører.
* **Idempotens.** Hver forespørsel krever en `idempotencyKey`. Gjentar du en forespørsel med samme nøkkel og samme body, returneres masseopprettelsen som allerede er startet. Samme nøkkel med en annen body returnerer `422`.
* **Rader.** Hver rad trenger `name` og `url`. Se [Rader](#rader).
* **Abonnement.** Masseopprettelse er ikke tilgjengelig på Single QR-abonnementet: forespørselen returnerer `403 exceeded_limit`.

## Rader

* **Navn.** Blir tittelen på QR-koden. Mellomrom i starten og slutten fjernes, og navnet kortes ned til 40 tegn. Gjentatte navn (uavhengig av store og små bokstaver) får et nummer: `Menu`, `Menu 2`, `Menu 3`.
* **URL.** Blir målet. Den må være en `http`- eller `https`-adresse med et ekte domene, for eksempel `example.com/menu`, og kan ikke inneholde mellomrom. En URL uten skjema får `https://`.
* **Tomme rader.** Rader uten både navn og URL hoppes over. En rad med bare ett av dem avvises.

Hver QR-kode er en `website`-QR-kode med en kortlenke. Se [QR-kodedata per type](https://docs.getqr.com/no/api/guides/qr-types.md).

## Headere

**Authorization** `string` *required*

`Bearer` etterfulgt av API-nøkkelen din. Se [Autentisering](https://docs.getqr.com/no/api/authentication.md).

**Content-Type** `string`

`application/json` for [Opprett fra JSON](#opprett-fra-json), `multipart/form-data` for [Opprett fra en CSV-fil](#opprett-fra-en-csv-fil).

## Masseopprettelsesobjektet

**id** `string`

ID-en til masseopprettelsen, for eksempel `cm2k7x9qb0003ax8eb4f6gh2t`.

**status** `string`

`queued`, `processing`, `packaging` eller `completed`. En mislykket eller avbrutt masseopprettelse går via `rollingBack` til `failed`.

**sourceFilename** `string`

Navnet på kildefilen.

**totalCount** `integer`

Antall rader.

**createdCount** `integer`

QR-koder opprettet så langt.

**renderedCount** `integer`

QR-kodebilder gjengitt så langt.

**percent** `integer`

Samlet fremdrift, 0 til 100. Oppretting tar opptil 40, gjengivelse opptil 90, pakking er 95, og `completed` er 100.

**stalled** `boolean`

`true` når en masseopprettelse som kjører, ikke har hatt fremdrift på 2 minutter. Fortsett å sjekke: [Hent en masseopprettelse](#hent-en-masseopprettelse) starter en masseopprettelse som har stoppet opp, på nytt.

**error** `object | null`

Når `status` er `failed`: `code` og `message`. En avbrutt masseopprettelse har koden `cancelled_by_user`. En mislykket masseopprettelse rulles tilbake, så ingen av QR-kodene beholdes.

**downloadUrl** `string | null`

Banen til [Last ned arkivet](#last-ned-arkivet), når `status` er `completed`.

**createdAt** `string`

Startdato, ISO 8601.

**updatedAt** `string`

Dato for siste oppdatering, ISO 8601.

**completedAt** `string | null`

Dato for fullføring, ISO 8601.

**failedAt** `string | null`

Dato for feil, ISO 8601.

## Hent den gjeldende masseopprettelsen

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

Returnerer masseopprettelsen som fortsatt kjører i arbeidsområdet ditt. Når ingen kjører, returneres den siste avsluttede (`completed` eller `failed`) til den er avvist: det skjer når du laster ned arkivet eller avviser den i dashbordet. Ellers returneres `null`. Bruk den til å fortsette sporingen etter en omstart.

```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
```

## Opprett fra JSON

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

Starter en masseopprettelse fra en liste med rader. Svarer `202 Accepted`. Masseopprettelsen kjører i bakgrunnen.

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

QR-kodene som skal opprettes, opptil 100. Hver rad er `{ "name": "...", "url": "..." }` og tar ingen andre felt. Se [Rader](#rader).

**design** `object` *required*

Designet som brukes på hver QR-kode: `styles`, `frameOptions` og `logoOptions`, alle valgfrie. Send `{}` for standarddesignet. Andre felt avvises. Se [Tilpasning](https://docs.getqr.com/no/api/guides/customization.md).

**sourceFilename** `string` *required*

Navnet som vises i dashbordet og brukes for arkivet, 1 til 255 tegn.

**idempotencyKey** `string` *required*

Din egen nøkkel for denne masseopprettelsen, 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
}
```

## Opprett fra en CSV-fil

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

Samme som [Opprett fra JSON](#opprett-fra-json), men tar radene som en CSV-fil sendt som `multipart/form-data`. Svarer `202 Accepted`.

Filen må være en `.csv` på maksimalt 1 000 000 byte. Overskriftsraden må være nøyaktig `name,url`, etterfulgt av opptil 100 datarader. Se [CSV-format](https://docs.getqr.com/no/bulk/csv-format.md).

**file** `file` *required*

CSV-filen.

**design** `string` *required*

Designobjektet, serialisert som JSON, for eksempel `{"styles":{"dotsOptions":{"type":"rounded"}}}`. Send `{}` for standarddesignet.

**idempotencyKey** `string` *required*

Din egen nøkkel for denne masseopprettelsen, 8 til 100 tegn.

**sourceFilename** `string`

Navnet som vises i dashbordet og brukes for arkivet, opptil 255 tegn. Standard er navnet på den opplastede filen.

```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 masseopprettelse

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

Returnerer status og fremdrift for en masseopprettelse. Sjekk den jevnlig så lenge `status` er `queued`, `processing` eller `packaging`. `downloadUrl` vises når arkivet er klart.

**id** `string` *required*

ID-en til masseopprettelsen. Hent den fra svaret på opprettelsen eller på forespørselen om den gjeldende masseopprettelsen.

```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
}
```

## Avbryt en masseopprettelse

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

Stopper en masseopprettelse som kjører, og sletter QR-kodene den allerede har opprettet. Tilbakerullingen skjer under forespørselen, så svaret har normalt `status` `failed` og `error.code` `cancelled_by_user`. Avbryter du en masseopprettelse som allerede har mislyktes, returneres den uendret.

> [!WARNING]
>
> En fullført masseopprettelse kan ikke avbrytes: forespørselen returnerer `400`. Slett i stedet QR-kodene én etter én med [QR-koder](https://docs.getqr.com/no/api/endpoints/qr-codes.md).

**id** `string` *required*

ID-en til masseopprettelsen.

```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"
}
```

## Last ned arkivet

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

Returnerer et ZIP-arkiv med én JPEG på 1024 px per QR-kode, med navn etter raden: `001-Menu.jpg`, `002-Wine list.jpg` og så videre. Arkivet får navn etter `sourceFilename`. Tilgjengelig når `status` er `completed`. Nedlastingen avviser masseopprettelsen, så [Hent den gjeldende masseopprettelsen](#hent-den-gjeldende-masseopprettelsen) slutter å returnere den.

**id** `string` *required*

ID-en til masseopprettelsen.

```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>
```

## Vanlige problemer

> [accordion] 422 med "contains an invalid HTTP(S) URL"
>
> Meldingen navngir raden. Hver URL må være en `http`- eller `https`-adresse med et ekte domene, for eksempel `example.com/menu`. Rett raden og send forespørselen på nytt.

> [accordion] 422 "CSV headers must be exactly: name,url."
>
> Den første raden i CSV-filen må være `name,url`, i den rekkefølgen og med små bokstaver, uten andre kolonner.

> [accordion] 422 "This idempotencyKey was already used with a different request body."
>
> Nøkler kan ikke gjenbrukes for en annen bunt. Send en ny `idempotencyKey`.

> [accordion] 409 "The bulk QR archive is not ready for download."
>
> Masseopprettelsen er ikke fullført ennå. Fortsett å sjekke til `status` er `completed`.

> [accordion] 400 "Cannot cancel a finished bulk QR creation."
>
> Masseopprettelsen er allerede fullført, så den kan ikke rulles tilbake.

> [accordion] 403 exceeded\_limit
>
> Arbeidsområdet ditt har Single QR-abonnementet, som ikke inkluderer masseopprettelse. Oppgrader abonnementet.

> [accordion] Jeg fikk tilbake en eldre masseopprettelse i stedet for en ny
>
> En annen masseopprettelse kjører fortsatt i arbeidsområdet ditt, eller du har gjenbrukt en `idempotencyKey`. Vent til den er ferdig, eller bruk en ny nøkkel.

## Neste steg

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

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

> [card] [Masseopprettelse i appen](https://docs.getqr.com/no/bulk/overview.md)

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


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