Gå til innhold
Dokumentasjon

API

Gavekort

Åtte endepunkter dekker hele kortets liv gjennom API'et: utsted, list, slå opp, innløs, omgjør, gjenfs, kanseller og refunder.

MetodeStiGjør
POST/v1/api/giftcardsUtsteder et kort
GET/v1/api/giftcardsLister bedriftens kort
GET/v1/api/giftcards/{code}Slår ett kort opp
POST/v1/api/giftcards/{code}/redeemInnløser et beløp
POST/v1/api/redemptions/{id}/reverseAngre en innløsning
POST/v1/api/giftcards/{code}/resendSender kortet igjen
POST/v1/api/giftcards/{code}/cancelKansellerer kortet
POST/v1/api/orders/{id}/refundRefunderer en betalt ordre

Kanseller kan ikke omgjøres — det finnes ingen reaktivering fordi et kort som ble slått ihjel og siden stille gjenopplivet, er en forpliktelse ingen har sagt ja til. Refunder er det eneste endepunktet som flytter penger: Stripe sender beløpet tilbake til det kortet som betalte, og ingen andre steder hen.

Prøv det her på siden

Konsollen herunder kjører de samme skjemaene og samme innløsningsregel som API'et, mot et kort som bare finnes i nettleseren din. Rett i kroppen, og se hvilken status ditt eget kall ville fått.

Konsollen

Kort
KUV-DLT2-9GPW
Saldo
500,00 kr.
Status
active

Forespørsel

GET /v1/api/giftcards/KUV-DLT2-9GPW

Authorization: Bearer pk_test_…

Ingen kropp. Koden er i stien.

Svar

200 OK

{
  "giftCard": {
    "id": "gc_3n8qk2vh",
    "code": "KUV-DLT2-9GPW",
    "orderId": null,
    "status": "active",
    "initialOre": 50000,
    "balanceOre": 50000,
    "expiresAt": "2029-01-15T12:00:00.000Z",
    "merchantSlug": "cafe-noir",
    "origin": "b2b",
    "reference": "Faktura 2026-114",
    "punchValueOre": null,
    "noCashClaim": false,
    "productName": null
  }
}

Saldoen blir regnet ut fra posteringene, ikke lest fra et felt — det er derfor den alltid stemmer med innløsningene.

Svar 200 OK. Saldoen blir regnet ut fra posteringene, ikke lest fra et felt — det er derfor den alltid stemmer med innløsningene.

Konsollen ringer ikke ut på nettet — den kjører de samme skjemaene og den samme innløsningsregelen som API-en, mot et kort som bare finnes i nettleseren din. Statuskoder og feilmeldinger er derfor dem din egen integrasjon får.

Idempotens

Utsted og innløs kan begge bære en nøkkel som gjør kaltet trygt å gjenta. Samme nøkkel to ganger svarer med resultatet av den FØRSTE gangen — samme kort, samme postering — i stedet for å utstede eller trekke to ganger. De to verbene oppdager imidlertid ikke det samme: ved INNLØS svarer vi 409 idempotency_key_conflict hvis nøkkelen allerede er brukt på et annet kort eller på en utbetaling, i stedet for å treffe feil. Ved UTSTED sammenligner vi ikke kaltet — gjenbruker du en nøkkel med et annet beløp, får du 201 og det FØRSTE kortets data tilbake, uten feil. Bruk én nøkkel pr. kort.

Nøkkelen kan stå tre steder. Vi leser idempotencyKey i kroppen først, og ellers headeren Idempotency-Key og deretter X-Request-Guid. Kroppen vinner når det er både og.

HvorNavn
KroppenidempotencyKey — det eksplisitte valget, og det som vinner.
HeaderIdempotency-Key — navnet Stripe har gjort til standard.
HeaderX-Request-Guid — slik at en integrasjon som flytter fra Lifepeaks, virker uten å bli skrevet om.

Utsted et kort

Utsteder et kort utenfor betalingsflowet — solgt fra ditt eget system, fakturert til en bedrift, eller gitt med på huset.

FeltTypeKrav
amountOreheltallPåkrevd. Beløp i øre, minst 1.
validityMonthsheltallValgfritt. Minst 36 — kortere avvises.
originsold | b2b | compPåkrevd. Se herunder.
referencetekstValgfritt. Din egen notat, for eksempel et fakturanummer. Høyst 200 tegn.
idempotencyKeytekstValgfritt, men anbefalt. Samme nøkkel to ganger utsteder bare ett kort. Kan også sendes som header — se Idempotens.

origin er påkrevd her, hvor det er valgfritt i dashbordet. Et system utsteder uten at noen ser på, og valget følger kortet resten av dets levetid: sold betyr at en kunde har betalt for det, og så bærer kortet kundens rett til å få restbeløpet utbetalt kontant. b2b og comp gjør ikke.

Terminal
curl -X POST https://api.kuvert.dk/v1/api/giftcards \
  -H "Authorization: Bearer pk_live_..." \
  -H "Content-Type: application/json" \
  -d '{
    "amountOre": 50000,
    "origin": "b2b",
    "reference": "Faktura 2026-114"
  }'

Svarer 201 med kortet under giftCard. Beløpet er i øre — 50000 er 500,00 kr.

List kort

Terminal
curl https://api.kuvert.dk/v1/api/giftcards \
  -H "Authorization: Bearer pk_live_..."

Svarer 200 med bedriftens kort under giftCards.

Slå et kort opp

Terminal
curl https://api.kuvert.dk/v1/api/giftcards/KUV-XXXX-XXXX \
  -H "Authorization: Bearer pk_live_..."

Svarer 200 med kortet under giftCard, eller 404 hvis koden ikke finnes på din bedrift.

Innløs

Trekker et beløp fra kortets saldo. Koden står i stien, beløpet i kroppen.

FeltTypeKrav
amountOreheltalPåkrevd. Beløp i øre, minst 1.
locationtekstFrivillig. Hvor det skjedde, f.eks. «Vesterbro». Høyst 120 tegn.
idempotencyKeytekstValgfritt, men anbefalt. Samme nøkkel to ganger trekker bare én gang. Kan også sendes som header — se Idempotens.
Terminal
curl -X POST https://api.kuvert.dk/v1/api/giftcards/KUV-XXXX-XXXX/redeem \
  -H "Authorization: Bearer pk_live_..." \
  -H "Content-Type: application/json" \
  -d '{
    "amountOre": 6400,
    "location": "Vesterbro",
    "idempotencyKey": "pos-terminal-3-1753440000"
  }'

Svarer 200 med resultatet av innløsningen:

JSON
{
  "id": "red_8f21c0b4",
  "code": "KUV-XXXX-XXXX",
  "amountOre": 6400,
  "remainingBalanceOre": 43600,
  "status": "active"
}

Gem id. Det er posteringen, og det er det eneste som kan angre nettopp denne innløsningen.

status er kortets tilstand etter innløsningen — en av active, redeemed, expired, void, disputed. Er saldoen brukt opp, skifter den til redeemed.

Går det ikke igjennom, er svaret én av disse. De er ikke like for kassen: noen er noe gjesten skal ha vite, og noen er noe bedriften skal ringes opp om.

StatusBetyr
400 invalid_redeem_requestKroppen matcher ikke det innløsning krever — typisk et beløp som ikke er et helt antall øre, eller som er null.
400 not_a_gift_cardKoden i stien er en billettkode (TKT-…), ikke et gavekort.
404 gift_card_not_foundKoden finnes ikke på din bedrift.
409 card_inactiveKortet er ikke aktivt: brukt opp, annullert, satt til utløpt eller fryst under en innsigelse. Det går ikke over av seg selv — bedriften skal kontaktes.
409 redeem_too_soonBedriften har satt en innløsningsforsinkelse, og den er ikke utløpt ennå. Kortet feiler ingenting; det kan bare ikke brukes ennå. Prøv igjen senere.
409 idempotency_key_conflictNøkkelen er allerede brukt på et annet kort — eller på en utbetaling av det samme kortet. Se Idempotens.
410 gift_card_expiredKortet står stadig som aktivt, men gyldighetssdatoen er passert. Til forskjell fra card_inactive er det tiden og ikke en beslutning som har lukket kortet.
422 insufficient_balanceBeløpet er større enn saldoen. Vi trekker aldri et delvis beløp av oss selv — slå kortet opp, træ saldoen, og ta resten på annen måte.
422 invalid_amountInnløsningsregelen sitt eget svar på et ulovlig beløp. Skjemaet fanger det normalt allerede som 400 invalid_redeem_request, så en klient bør kunne lese begge.
422 punch_amount_not_wholeKortet er et klippekort, og beløpet er ikke et helt antall klipp. Det er ikke noe galt med tallet — det er den gale slags kort til det. Slå kortet opp, les punchValueOre, og send den verdi eller et multiplum av den. Et klippekort som står igjen med en rest under ett klipp, er penger hverken kassen eller kunden kan nå.

Angre en innløsning

Legger beløpet tilbake på kortet. Det skjer som en ny postering med negativt beløp som peker på den som den angrer — ingenting slettes, og begge linjer blir stående i kortets historie. Var kortet brukt helt opp, blir det aktivt igjen.

Terminal
curl -X POST https://api.kuvert.dk/v1/api/redemptions/red_8f21c0b4/reverse \
  -H "Authorization: Bearer pk_live_..."

Svarer 200 med posteringen som la beløpet tilbake:

JSON
{
  "id": "red_2c77af90",
  "code": "KUV-XXXX-XXXX",
  "amountOre": -6400,
  "remainingBalanceOre": 50000,
  "status": "active"
}
StatusBetyr
404 redemption_not_foundPosteringen finnes ikke på din bedrift.
409 already_reversedDen er angret før. Én gang, aldri to.
409 not_reversiblePosteringen er selv en angring eller en kontant utbetaling.
409 card_inactiveKortet er annullert eller fryst under en innsigelse.
409 order_refundedOrdren bak kortet er refundert. Kjøperen har allerede fått pengene tilbake, så en angring ville gi dem verdien to ganger.