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.
| 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. |
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:
{
"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. |
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.
{
"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. |
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.
{
"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"
}
]
}
]
}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.
{
"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
}
]
}
]
}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.
Det minsta som fungerar: hämta kvällarna på er server, och bygg en länk till varje kvälls sida i butiken.
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
- Biljetter: programmet på er egen webbplats
- Inbäddning: en köpknapp vid varje kväll
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.
Var sidan till hjälp?