# Evenemang

<https://kuvert.dk/sv/dokumentation/api/arrangementer>

Fyra öppna anrop ger er egen webbplats samma kvällar som butiken visar: namn, tider, affisch, line-up, priser, serier och bordspaket. De kräver ingen API-nyckel.

Anropen ligger under https://api.kuvert.dk/v1/merchants/{slug}, där {slug} är butikens adress, t.ex. demo-natklubben i shop.kuvert.dk/demo-natklubben. De är öppna som butiken själv: ingen nyckel, inget konto och bara det som en gäst också kan se. En kväll som fortfarande är ett utkast kommer aldrig med.

> **Viktigt:** Anropa dem från er server, t.ex. från ett WordPress-plugin eller ett byggsteg, och inte från webbläsarens JavaScript på er egen sida. API:et tillåter bara Kuverts egna domäner i webbläsaren, så en fetch från en annan domän stoppas av webbläsaren.

> **Anmärkning:** Spara gärna svaret en minut eller två, men inte i timmar. Priser och platser ändras medan det säljs, så låt biljettknappen gå till butiken, där siffrorna alltid stämmer.

## Anropen

| Anrop | Ger |
| --- | --- |
| `GET /v1/merchants/{slug}` | Butiken och kvällarna som säljs, i `events`, den tidigaste först. Med `?include=canceled` kommer inställda kvällar med, och med `?include=closed` kvällar där onlineförsäljningen har stängt men kvällen inte är slut. Båda kan stå tillsammans: `?include=canceled,closed`. |
| `GET /v1/merchants/{slug}/events/{event}` | En kväll med alla priser, vad som finns kvar och om den kan köpas just nu. {event} är kvällens slug eller id. |
| `GET /v1/merchants/{slug}/series` | De fasta serierna, var och en med de kvällar i serien som säljs. |
| `GET /v1/merchants/{slug}/table-nights` | De kommande kvällarna med bordspaket, och om varje paket kan bokas just nu. |
| `GET /v1/merchants/{slug}/events/{event}/plan` | Klubbens karta för en kväll med bordspaket: rummen och varje bord, ledigt eller sålt. Det står inget om vem som har köpt. |

## Kvällarna

Butikens eget anrop har kvällarna med i `events`. Varje kväll har namn, tider, plats och affisch och de fält som ett program byggs av. Här är ett utdrag ur svaret med en kväll:

```json
{
  "events": [
    {
      "id": "evt_65694ef606f6483083d368ec040601e2",
      "slug": "klubnat-2026-10-17",
      "name": "Klubnat",
      "startsAt": "2026-10-17T21:00:00.000Z",
      "endsAt": "2026-10-18T03:00:00.000Z",
      "venue": "Natklubben, Vejle",
      "bannerUrl": null,
      "bannerWidth": null,
      "bannerHeight": null,
      "salesCloseAt": "2026-10-18T00:00:00.000Z",
      "status": "published",
      "cancelNote": null,
      "series": {
        "id": "ser_216c1567afbb42368340cb9b11146a90",
        "name": "Klubnat",
        "weekdays": [
          5,
          6
        ],
        "isRecurring": true,
        "recurrence": {
          "kind": "weekly",
          "weekdays": [
            5,
            6
          ]
        },
        "description": "Hver fredag og lørdag"
      },
      "seriesDate": "2026-10-17",
      "subtitle": "Husets DJs på to gulve",
      "lineup": [
        {
          "name": "Kasper Ø",
          "role": "warm-up",
          "time": "2026-10-17T21:00:00.000Z"
        },
        {
          "name": "Selma Rask",
          "role": "resident",
          "time": "2026-10-17T23:00:00.000Z"
        }
      ],
      "genres": [
        "House",
        "Hiphop",
        "Top 40"
      ],
      "doorsAt": "2026-10-17T21:00:00.000Z",
      "lastEntryAt": "2026-10-18T01:00:00.000Z",
      "dressCode": "Ingen sportstøj",
      "ticketsUrl": null,
      "host": {
        "slug": "demo-natklubben",
        "name": "Natklubben"
      },
      "cohosts": []
    }
  ]
}
```

| Fält | Betyder |
| --- | --- |
| `id, slug` | Kvällens id och dess läsbara adress. Kvällens sida i butiken är shop.kuvert.dk/{slug}/event/{slug}, med id:t om kvällen inte har någon slug. |
| `startsAt, endsAt` | När kvällen börjar och slutar. `endsAt` är `null` om kvällen inte anger det. |
| `salesCloseAt` | När onlineförsäljningen stänger. |
| `bannerUrl, bannerWidth, bannerHeight` | Affischen och dess storlek i pixlar, så att sidan kan hålla platsen åt den innan den har hämtats. Visa den hel: den är gjord för att ses utan beskärning. |
| `status, cancelNote` | `published` eller `canceled`, och meddelandet ni skrev när kvällen ställdes in. |
| `series, seriesDate` | Serien bakom kvällen med namn, veckodagar (0 är söndag), regeln och en färdig mening att visa, t.ex. «Hver fredag og lørdag», och vilken av seriens dagar det är. `null` på en kväll som ni själva har skapat. |
| `subtitle, genres, dressCode` | Underrubriken, genrerna och klädkoden, som ni skrev dem. |
| `lineup` | Namnen i ordning, vart och ett med `name`, `role` och `time`. `time` har datum med, så att ett set efter midnatt hamnar på rätt dag. |
| `doorsAt, lastEntryAt` | När dörrarna öppnar, och när den sista gästen släpps in. |
| `ticketsUrl` | Var biljetterna säljs när någon annan säljer dem, t.ex. arrangören. Har kvällen egna priser i Kuvert säljs de här, och fältet används inte. |

> **Anmärkning:** Alla tider är i UTC. 21:00Z är klockan 23.00 i dansk sommartid och klockan 22.00 på vintern, så räkna om till Europe/Copenhagen innan ni visar dem.

## En kväll

Kvällens eget anrop ger allt: beskrivningen, åldersgränsen och alla priser i `tiers`. `onSale` säger om det går att köpa just nu, och `refusalCode` varför inte, t.ex. `soldOut` eller `closed`. `waitlistOpen` är `true` när gästen kan skriva upp sig på väntelistan.

```json
{
  "id": "evt_65694ef606f6483083d368ec040601e2",
  "slug": "klubnat-2026-10-17",
  "name": "Klubnat",
  "startsAt": "2026-10-17T21:00:00.000Z",
  "endsAt": "2026-10-18T03:00:00.000Z",
  "venue": "Natklubben, Vejle",
  "bannerUrl": null,
  "bannerWidth": null,
  "bannerHeight": null,
  "description": "Gratis før midnat på gæstelisten, entré ved døren derefter. Borde med flasker hele natten.",
  "ageLimit": 18,
  "tiers": [
    {
      "id": "etr_e5e5766ded1e456599d7e8925f68bff9",
      "name": "Entré",
      "description": "Spring billetkøen over. Gælder hele natten.",
      "priceOre": 10000,
      "availability": "on_sale",
      "remaining": null,
      "scarcity": null,
      "salesOpenAt": null,
      "salesCloseAt": null,
      "seatsPerTicket": 1,
      "seatsChosenByGuest": false,
      "creditPromisedOre": null,
      "tablePackage": false,
      "includedItems": [],
      "minSeats": 1,
      "arriveBy": null,
      "seller": {
        "slug": "demo-natklubben",
        "name": "Natklubben"
      }
    },
    {
      "id": "etr_773b122865f0469e81c06781c4befa63",
      "name": "Flaske",
      "description": null,
      "priceOre": 240000,
      "availability": "on_sale",
      "remaining": 10,
      "scarcity": null,
      "salesOpenAt": null,
      "salesCloseAt": null,
      "seatsPerTicket": 10,
      "seatsChosenByGuest": true,
      "creditPromisedOre": null,
      "tablePackage": true,
      "picksTable": true,
      "tableSeats": {
        "min": 4,
        "max": 10
      },
      "tablesFree": 10,
      "includedItems": [
        "1 × Absolut Vodka 70 cl",
        "6 × Red Bull",
        "Entré for hele bordet"
      ],
      "minSeats": 1,
      "arriveBy": "2026-10-17T22:30:00.000Z",
      "seller": {
        "slug": "demo-natklubben",
        "name": "Natklubben"
      }
    }
  ],
  "minQuantity": 1,
  "salesCloseAt": "2026-10-18T00:00:00.000Z",
  "pickups": [],
  "remaining": 350,
  "onSale": true,
  "refusal": null,
  "refusalCode": null,
  "refusalCount": null,
  "waitlistOpen": false,
  "questions": [],
  "status": "published",
  "cancelNote": null,
  "series": {
    "id": "ser_216c1567afbb42368340cb9b11146a90",
    "name": "Klubnat",
    "weekdays": [
      5,
      6
    ],
    "isRecurring": true,
    "recurrence": {
      "kind": "weekly",
      "weekdays": [
        5,
        6
      ]
    },
    "description": "Hver fredag og lørdag"
  },
  "seriesDate": "2026-10-17",
  "subtitle": "Husets DJs på to gulve",
  "lineup": [
    {
      "name": "Kasper Ø",
      "role": "warm-up",
      "time": "2026-10-17T21:00:00.000Z"
    },
    {
      "name": "Selma Rask",
      "role": "resident",
      "time": "2026-10-17T23:00:00.000Z"
    }
  ],
  "genres": [
    "House",
    "Hiphop",
    "Top 40"
  ],
  "doorsAt": "2026-10-17T21:00:00.000Z",
  "lastEntryAt": "2026-10-18T01:00:00.000Z",
  "dressCode": "Ingen sportstøj",
  "ticketsUrl": null,
  "host": {
    "slug": "demo-natklubben",
    "name": "Natklubben"
  },
  "cohosts": []
}
```

| Fält | Betyder |
| --- | --- |
| `priceOre` | Priset i öre: 10000 är 100 Dkr. |
| `availability` | `on_sale`, `not_yet` (öppnar senare), `closed` eller `sold_out`. |
| `remaining, scarcity` | Hur många som finns kvar till det priset, och vad butiken visar om det: antalet (`count`), «få kvar» (`few`) eller ingenting (`null`). Visa det som `scarcity` säger, inte antalet. `remaining` är `null` när priset inte har något eget antal. |
| `salesOpenAt, salesCloseAt, opensAfterTierId` | Prisets eget tidsfönster, och det pris som det väntar på ska bli slutsålt när biljetterna säljs i steg. |
| `tablePackage, picksTable, tableSeats, tablesFree` | Ett bordspaket: om gästen väljer bordet på kartan, det minsta och största bordet, och hur många bord som är lediga. |
| `includedItems, creditPromisedOre` | Det som ingår i ett paket, och barkrediten om det finns en. |
| `ageLimit` | Åldersgränsen i dörren, eller `null`. |

## Serier

Har ni samma kväll varje vecka ger serierna er den som en rad: «Hver fredag og lørdag», och de kvällar i serien som säljs. En serie där alla kvällar fortfarande är utkast är inte med.

```json
{
  "series": [
    {
      "id": "ser_216c1567afbb42368340cb9b11146a90",
      "name": "Klubnat",
      "weekdays": [
        5,
        6
      ],
      "isRecurring": true,
      "recurrence": {
        "kind": "weekly",
        "weekdays": [
          5,
          6
        ]
      },
      "description": "Hver fredag og lørdag",
      "nights": [
        {
          "id": "evt_65694ef606f6483083d368ec040601e2",
          "slug": "klubnat-2026-10-17",
          "name": "Klubnat",
          "startsAt": "2026-10-17T21:00:00.000Z",
          "seriesDate": "2026-10-17"
        },
        {
          "id": "evt_0ba0fd9fb19c42cd80f4ebc11879b462",
          "slug": "klubnat-2026-10-23",
          "name": "Klubnat",
          "startsAt": "2026-10-23T21:00:00.000Z",
          "seriesDate": "2026-10-23"
        }
      ]
    }
  ]
}
```

## Bordspaket

Säljer ni bord till kvällarna ger det här anropet de kommande kvällarna med sina bordspaket, så att sidan kan sätta «Book bord» vid varje kväll utan att hämta varje kvälls sida. `bookable` säger om paketet kan bokas just nu.

```json
{
  "nights": [
    {
      "id": "evt_65694ef606f6483083d368ec040601e2",
      "slug": "klubnat-2026-10-17",
      "name": "Klubnat",
      "startsAt": "2026-10-17T21:00:00.000Z",
      "endsAt": "2026-10-18T03:00:00.000Z",
      "venue": "Natklubben, Vejle",
      "bannerUrl": null,
      "bannerWidth": null,
      "bannerHeight": null,
      "ageLimit": 18,
      "onSale": true,
      "packages": [
        {
          "id": "etr_773b122865f0469e81c06781c4befa63",
          "name": "Flaske",
          "description": null,
          "priceOre": 240000,
          "availability": "on_sale",
          "remaining": 10,
          "scarcity": null,
          "salesOpenAt": null,
          "salesCloseAt": null,
          "seatsPerTicket": 10,
          "seatsChosenByGuest": true,
          "creditPromisedOre": null,
          "tablePackage": true,
          "picksTable": true,
          "tableSeats": {
            "min": 4,
            "max": 10
          },
          "tablesFree": 10,
          "includedItems": [
            "1 × Absolut Vodka 70 cl",
            "6 × Red Bull",
            "Entré for hele bordet"
          ],
          "minSeats": 1,
          "arriveBy": "2026-10-17T22:30:00.000Z",
          "seller": {
            "slug": "demo-natklubben",
            "name": "Natklubben"
          },
          "bookable": true
        }
      ]
    }
  ]
}
```

## Håll programmet uppdaterat

Behöver er sida veta direkt när en kväll ändras kan den prenumerera på webhooks i stället för att fråga varje minut: event.published när en kväll börjar säljas, event.updated när något offentligt ändras (med namnen på fälten i `changedFields`), event.canceled och event.unpublished. Varje leverans har hela kvällen i samma form som listan ovan, med `eventId` i stället för `id`. En webhook-slutpunkt skapas under Inställningar → Webhooks eller med en API-nyckel.

## Ett exempel

Det minsta som fungerar: hämta kvällarna på er server, och bygg en länk till varje kvälls sida i butiken.

```javascript
const res = await fetch('https://api.kuvert.dk/v1/merchants/demo-natklubben')
const { events } = await res.json()

for (const night of events) {
  const link = `https://shop.kuvert.dk/demo-natklubben/event/${night.slug ?? night.id}`
  console.log(night.name, night.startsAt, night.status, link)
}
```

- [Webhooks och signaturer](https://kuvert.dk/sv/dokumentation/api/webhooks)
- [Biljetter: programmet på er egen webbplats](https://kuvert.dk/sv/dokumentation/billetter#hjemmeside)
- [Inbäddning: en köpknapp vid varje kväll](https://kuvert.dk/sv/dokumentation/indlejring)

## Delade kvällar

En kväll kan delas av flera företag, t.ex. en arrangör som säljer biljetterna och klubben som säljer borden. Kvällen tillhör värden, men den finns i allas program och kan hämtas under var och en av deras slugs, med samma id och samma slug. Den räknas en gång i varje företags lista.

| Fält | Betyder |
| --- | --- |
| `host` | Företaget som kvällen tillhör, med `slug` och `name`. Kvällens riktiga adress är shop.kuvert.dk/{host.slug}/event/{slug}, även när ni hämtar den under er egen slug. |
| `cohosts` | De andra företagen som säljer på kvällen, i den ordning de kom med. En tom lista på en kväll som inte är delad. |
| `tiers[].seller` | Vem som säljer priset och som gästen betalar. Använd det för att visa era egna priser för sig eller för att skriva vem som säljer vad. |
| `lineup[].merchantSlug` | Den uppträdandes egen butik på Kuvert, när värden har kopplat namnet till den. |

GET /v1/merchants/{slug}/appearances ger de kvällar som andra företag har bokat er till, antingen som medvärd eller i line-upen, i samma form som listan ovan plus `seller` (företaget vars sida säljer kvällen) och `appearance` (`cohost` eller `lineup`). Då kan en artists sida visa de klubbkvällar artisten spelar på utan att någon behöver skriva in dem igen. En kväll som ni själva är medvärd för står också på er egen lista ovan, så visa bara den ena, eller filtrera på `appearance`.

Webhooks för en delad kväll (event.*) går till alla företag på kvällen. order.paid och ticket.issued går bara till den som sålde och har `seller`, `host` och `cohosts` med, så att ert system kan skilja er egen försäljning från partnerns.

- [Dela en kväll med ett annat företag](https://kuvert.dk/sv/dokumentation/del-en-aften)
