Spring til indhold

Arrangementer

Fire offentlige kald giver jeres egen hjemmeside de samme aftener, som butikken viser: navn, tider, plakat, line-up, priser, serier og bordpakker. De kræver ingen API-nøgle.

Kaldene ligger under https://api.kuvert.dk/v1/merchants/{slug}, hvor {slug} er butikkens adresse, fx demo-natklubben i shop.kuvert.dk/demo-natklubben. De er offentlige som butikken selv: ingen nøgle, ingen konto og kun det, en gæst også kan se. En aften, der stadig er en kladde, kommer aldrig med.

Kaldene

KaldGiver
GET /v1/merchants/{slug}Butikken og de aftener, der er til salg, i events, den tidligste først. Med ?include=canceled kommer aflyste aftener med, og med ?include=closed aftener, hvor onlinesalget er lukket, men aftenen ikke er slut. Begge kan stå sammen: ?include=canceled,closed.
GET /v1/merchants/{slug}/events/{event}Én aften med alle priser, hvad der er tilbage, og om den kan købes lige nu. {event} er aftenens slug eller id.
GET /v1/merchants/{slug}/seriesDe faste serier, hver med de aftener af serien, der er til salg.
GET /v1/merchants/{slug}/table-nightsDe kommende aftener med bordpakker, og om hver pakke kan bookes lige nu.
GET /v1/merchants/{slug}/events/{event}/planKlubbens kort for én aften med bordpakker: rummene og hvert bord, ledigt eller solgt. Der står intet om, hvem der har købt.

Aftenerne

Butikkens eget kald har aftenerne med i events. Hver aften har navn, tider, sted og plakat og de felter, et program bygges af. Her er et uddrag af svaret med én aften:

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": []
    }
  ]
}
FeltBetyder
id, slugAftenens id og dens læsbare adresse. Aftenens side i butikken er shop.kuvert.dk/{slug}/event/{slug}, med id’et, hvis aftenen ikke har en slug.
startsAt, endsAtHvornår aftenen begynder og slutter. endsAt er null, hvis aftenen ikke siger det.
salesCloseAtHvornår onlinesalget lukker.
bannerUrl, bannerWidth, bannerHeightPlakaten og dens størrelse i pixels, så siden kan holde pladsen til den, før den er hentet. Vis den hel: den er tegnet til at blive set uden beskæring.
status, cancelNotepublished eller canceled, og den besked, I skrev, da aftenen blev aflyst.
series, seriesDateSerien bag aftenen med navn, ugedage (0 er søndag), reglen og en færdig sætning at vise, fx «Hver fredag og lørdag», og hvilken af seriens dage det er. null på en aften, I selv har oprettet.
subtitle, genres, dressCodeUndertitlen, genrerne og dresscoden, som I skrev dem.
lineupNavnene i rækkefølge, hver med name, role og time. time har dato med, så et sæt efter midnat står på den rigtige dag.
doorsAt, lastEntryAtHvornår dørene åbner, og hvornår sidste gæst lukkes ind.
ticketsUrlHvor billetterne sælges, når det er hos en anden, fx arrangøren. Har aftenen egne priser i Kuvert, sælges de her, og feltet bruges ikke.

Én aften

Aftenens eget kald giver det hele: beskrivelsen, aldersgrænsen og alle priser i tiers. onSale siger, om der kan købes lige nu, og refusalCode hvorfor ikke, fx soldOut eller closed. waitlistOpen er true, når gæsten kan skrive sig på ventelisten.

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": []
}
FeltBetyder
priceOrePrisen i øre: 10000 er 100 kr.
availabilityon_sale, not_yet (åbner senere), closed eller sold_out.
remaining, scarcityHvor mange der er tilbage til den pris, og hvad butikken viser om det: tallet (count), «få tilbage» (few) eller ingenting (null). Vis det, scarcity siger, og ikke tallet. remaining er null, når prisen ikke har sit eget antal.
salesOpenAt, salesCloseAt, opensAfterTierIdPrisens eget tidsrum, og den pris, den venter på at blive udsolgt, når billetterne sælges i trin.
tablePackage, picksTable, tableSeats, tablesFreeEn bordpakke: om gæsten vælger bordet på kortet, det mindste og største bord, og hvor mange borde der er ledige.
includedItems, creditPromisedOreDet, der følger med en pakke, og beløbet til baren, hvis der er et.
ageLimitAldersgrænsen ved døren, eller null.

Serier

Holder I den samme aften hver uge, giver serierne jer den som én række: «Hver fredag og lørdag», og de aftener af serien, der er til salg. En serie, hvor alle aftener stadig er kladder, er ikke 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"
        }
      ]
    }
  ]
}

Bordpakker

Sælger I borde til aftenerne, giver dette kald de kommende aftener med deres bordpakker, så siden kan sætte «Book bord» ved hver aften uden at hente hver aftens side. bookable siger, om pakken kan bookes lige 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
        }
      ]
    }
  ]
}

Hold programmet opdateret

Skal jeres side vide det med det samme, når en aften ændrer sig, kan den abonnere på webhooks i stedet for at spørge hvert minut: event.published, når en aften bliver sat til salg, event.updated, når noget offentligt ændrer sig (med navnene på felterne i changedFields), event.canceled og event.unpublished. Hver leverance har hele aftenen i samme form som listen ovenfor, med eventId i stedet for id. Et webhook-endepunkt oprettes under Indstillinger → Webhooks eller med en API-nøgle.

Et eksempel

Det mindste, der virker: hent aftenerne på jeres server, og byg et link til hver aftens side i butikken.

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

Delte aftener

En aften kan deles af flere forretninger, fx en arrangør, der sælger billetterne, og klubben, der sælger bordene. Aftenen hører til værten, men den står i programmet hos dem alle og kan hentes under hver af deres slugs, med samme id og samme slug. Den tælles én gang i hver forretnings liste.

FeltBetyder
hostForretningen, aftenen hører til, med slug og name. Aftenens rigtige adresse er shop.kuvert.dk/{host.slug}/event/{slug}, også når I henter den under jeres egen slug.
cohostsDe andre forretninger, der sælger på aftenen, i den rækkefølge de kom med. En tom liste på en aften, der ikke er delt.
tiers[].sellerHvem der sælger prisen, og som gæsten betaler. Brug den til at vise jeres egne priser for sig eller til at skrive, hvem der sælger hvad.
lineup[].merchantSlugDen optrædendes egen butik på Kuvert, når værten har koblet navnet til den.

GET /v1/merchants/{slug}/appearances giver de aftener, som andre forretninger har booket jer til, enten som medvært eller i line-up'et, i samme form som listen ovenfor plus seller (forretningen, hvis side sælger aftenen) og appearance (cohost eller lineup). Så kan en kunstners side vise de klubaftener, kunstneren spiller, uden at nogen skal skrive dem ind igen. En aften, I selv er medvært på, står også på jeres egen liste ovenfor, så vis kun den ene, eller sorter på appearance.

Webhooks for en delt aften (event.*) går til alle forretninger på aftenen. order.paid og ticket.issued går kun til den, der solgte, og har seller, host og cohosts med, så jeres system kan skelne jeres eget salg fra partnerens.

Var siden nyttig?