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

# Massskapande av QR-koder

> Skapa upp till 100 QR-koder på en gång och ladda ned dem som ett ZIP-arkiv.

> [!NOTE]
>
> GetQR:s API är i beta och finns för utvalda arbetsytor. Detaljer kan ändras före den allmänna lanseringen.

Ett massskapande gör om en lista med namn och URL:er till Website-QR-koder med en gemensam design. Det körs i bakgrunden: starta det, följ förloppet och ladda sedan ned ZIP-arkivet.

| Metod | Sökväg | Beskrivning |
| - | - | - |
| `GET` | `/api/v1/bulk-qr-creations` | [Hämta det aktuella massskapandet](#hämta-det-aktuella-massskapandet) |
| `POST` | `/api/v1/bulk-qr-creations` | [Skapa från JSON](#skapa-från-json) |
| `POST` | `/api/v1/bulk-qr-creations/csv` | [Skapa från en CSV-fil](#skapa-från-en-csv-fil) |
| `GET` | `/api/v1/bulk-qr-creations/{id}` | [Hämta ett massskapande](#hämta-ett-massskapande) |
| `DELETE` | `/api/v1/bulk-qr-creations/{id}` | [Avbryt ett massskapande](#avbryt-ett-massskapande) |
| `GET` | `/api/v1/bulk-qr-creations/{id}/download` | [Ladda ned arkivet](#ladda-ned-arkivet) |

## Så fungerar det

**1. Starta massskapandet**

Skicka dina rader med [Skapa från JSON](#skapa-från-json) eller [Skapa från en CSV-fil](#skapa-från-en-csv-fil). API:et svarar `202` med massskapandet och dess `id`.

**2. Följ förloppet**

Anropa [Hämta ett massskapande](#hämta-ett-massskapande) med några sekunders mellanrum tills `status` är `completed` eller `failed`.

**3. Ladda ned arkivet**

När `status` är `completed` anropar du [Ladda ned arkivet](#ladda-ned-arkivet) för att få en ZIP-fil med QR-kodbilderna.

* **Gräns.** Högst 100 rader per massskapande.
* **Ett i taget.** Bara ett massskapande körs per arbetsyta. Om du startar ett till medan ett körs returneras det som körs.
* **Idempotens.** Varje begäran behöver en `idempotencyKey`. Om du upprepar en begäran med samma nyckel och samma body returneras massskapandet som redan har startats. Samma nyckel med en annan body returnerar `422`.
* **Rader.** Varje rad behöver ett `name` och en `url`. Se [Rader](#rader).
* **Abonnemang.** Massskapande finns inte på abonnemanget Single QR: begäran returnerar `403 exceeded_limit`.

## Rader

* **Namn.** Blir QR-kodens titel. Trimmas och kortas till 40 tecken. Upprepade namn (oavsett skiftläge) får ett nummer: `Menu`, `Menu 2`, `Menu 3`.
* **URL.** Blir målet. Den måste vara en `http`- eller `https`-adress med en riktig domän, som `example.com/menu`, och får inte innehålla mellanslag. En URL utan schema får `https://`.
* **Tomma rader.** Rader som saknar både namn och URL hoppas över. En rad med bara det ena av dem avvisas.

Varje QR-kod är en `website`-QR-kod med en kort länk. Se [QR-typer](https://docs.getqr.com/sv/api/guides/qr-types.md).

## Huvuden

**Authorization** `string` *required*

`Bearer` följt av din API-nyckel. Se [Autentisering](https://docs.getqr.com/sv/api/authentication.md).

**Content-Type** `string`

`application/json` för [Skapa från JSON](#skapa-från-json), `multipart/form-data` för [Skapa från en CSV-fil](#skapa-från-en-csv-fil).

## Objektet för massskapande

**id** `string`

Massskapandets id, till exempel `cm2k7x9qb0003ax8eb4f6gh2t`.

**status** `string`

`queued`, `processing`, `packaging` eller `completed`. Ett misslyckat eller avbrutet massskapande går via `rollingBack` till `failed`.

**sourceFilename** `string`

Källfilens namn.

**totalCount** `integer`

Antal rader.

**createdCount** `integer`

QR-koder som har skapats hittills.

**renderedCount** `integer`

QR-kodbilder som har renderats hittills.

**percent** `integer`

Totalt förlopp, 0 till 100. Skapandet tar upp till 40, renderingen upp till 90, paketeringen är 95 och `completed` är 100.

**stalled** `boolean`

`true` när ett pågående massskapande inte har gjort framsteg på 2 minuter. Fortsätt att fråga: [Hämta ett massskapande](#hämta-ett-massskapande) startar om ett massskapande som har stannat.

**error** `object | null`

När `status` är `failed`: `code` och `message`. Ett avbrutet massskapande har koden `cancelled_by_user`. Ett misslyckat massskapande rullas tillbaka, så ingen av dess QR-koder behålls.

**downloadUrl** `string | null`

Sökvägen till [Ladda ned arkivet](#ladda-ned-arkivet), när `status` är `completed`.

**createdAt** `string`

Startdatum, ISO 8601.

**updatedAt** `string`

Datum för senaste uppdatering, ISO 8601.

**completedAt** `string | null`

Datum då det slutfördes, ISO 8601.

**failedAt** `string | null`

Datum då det misslyckades, ISO 8601.

## Hämta det aktuella massskapandet

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

Returnerar det massskapande som fortfarande körs i din arbetsyta. När inget körs returneras det senast avslutade (`completed` eller `failed`) tills det har stängts: det gör du genom att ladda ned dess arkiv eller stänga det i instrumentpanelen. Annars returneras `null`. Använd det för att återuppta bevakningen efter 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
```

## Skapa från JSON

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

Startar ett massskapande från en lista med rader. Svarar `202 Accepted`. Massskapandet körs i bakgrunden.

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

QR-koder som ska skapas, högst 100. Varje rad är `{ "name": "...", "url": "..." }` och tar inga andra fält. Se [Rader](#rader).

**design** `object` *required*

Design som tillämpas på varje QR-kod: `styles`, `frameOptions` och `logoOptions`, alla valfria. Skicka `{}` för standarddesignen. Andra fält avvisas. Se [Anpassning](https://docs.getqr.com/sv/api/guides/customization.md).

**sourceFilename** `string` *required*

Namn som visas i instrumentpanelen och används för arkivet, 1 till 255 tecken.

**idempotencyKey** `string` *required*

Din egen nyckel för det här massskapandet, 8 till 100 tecken.

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

## Skapa från en CSV-fil

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

Samma som [Skapa från JSON](#skapa-från-json), men tar raderna som en CSV-fil som skickas som `multipart/form-data`. Svarar `202 Accepted`.

Filen måste vara en `.csv` på högst 1 000 000 byte. Rubrikraden måste vara exakt `name,url`, följd av högst 100 datarader. Se [CSV-format](https://docs.getqr.com/sv/bulk/csv-format.md).

**file** `file` *required*

CSV-filen.

**design** `string` *required*

Designobjektet, serialiserat som JSON, till exempel `{"styles":{"dotsOptions":{"type":"rounded"}}}`. Skicka `{}` för standarddesignen.

**idempotencyKey** `string` *required*

Din egen nyckel för det här massskapandet, 8 till 100 tecken.

**sourceFilename** `string`

Namn som visas i instrumentpanelen och används för arkivet, högst 255 tecken. Standard är namnet på den uppladdade 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
}
```

## Hämta ett massskapande

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

Returnerar status och förlopp för ett massskapande. Fråga regelbundet medan `status` är `queued`, `processing` eller `packaging`. `downloadUrl` visas när arkivet är klart.

**id** `string` *required*

Massskapandets id. Hämta det från svaret när du skapar eller hämtar det aktuella massskapandet.

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

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

Stoppar ett pågående massskapande och tar bort de QR-koder som det redan har skapat. Återställningen körs under begäran, så svaret har normalt `status` `failed` och `error.code` `cancelled_by_user`. Om du avbryter ett massskapande som redan har misslyckats returneras det oförändrat.

> [!WARNING]
>
> Ett massskapande som har slutförts kan inte avbrytas: begäran returnerar `400`. Ta i stället bort dess QR-koder en i taget med [QR-koder](https://docs.getqr.com/sv/api/endpoints/qr-codes.md).

**id** `string` *required*

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

## Ladda ned arkivet

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

Returnerar ett ZIP-arkiv med en JPEG på 1024 px per QR-kod, namngiven efter sin rad: `001-Menu.jpg`, `002-Wine list.jpg` och så vidare. Arkivet namnges efter `sourceFilename`. Tillgängligt när `status` är `completed`. Nedladdningen stänger massskapandet, så [Hämta det aktuella massskapandet](#hämta-det-aktuella-massskapandet) slutar returnera det.

**id** `string` *required*

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

## Vanliga problem

> [accordion] 422 med "contains an invalid HTTP(S) URL"
>
> Meddelandet anger raden. Varje URL måste vara en `http`- eller `https`-adress med en riktig domän, som `example.com/menu`. Rätta raden och skicka begäran igen.

> [accordion] 422 "CSV headers must be exactly: name,url."
>
> Den första raden i CSV-filen måste vara `name,url`, i den ordningen och med gemener, utan andra kolumner.

> [accordion] 422 "This idempotencyKey was already used with a different request body."
>
> Nycklar kan inte återanvändas för en annan batch. Skicka en ny `idempotencyKey`.

> [accordion] 409 "The bulk QR archive is not ready for download."
>
> Massskapandet är inte slutfört än. Fortsätt att fråga tills `status` är `completed`.

> [accordion] 400 "Cannot cancel a finished bulk QR creation."
>
> Massskapandet är redan slutfört, så det kan inte rullas tillbaka.

> [accordion] 403 exceeded\_limit
>
> Din arbetsyta har abonnemanget Single QR, som inte omfattar massskapande. Uppgradera abonnemanget.

> [accordion] Jag fick tillbaka ett äldre massskapande i stället för ett nytt
>
> Ett annat massskapande körs fortfarande i din arbetsyta, eller så återanvände du en `idempotencyKey`. Vänta tills det är klart, eller använd en ny nyckel.

## Nästa steg

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

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

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

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


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