Hoppa till innehållet
Dokumentation

API

Presentkort

Åtta slutpunkter täcker hela kortets liv genom API:et: utfärda, lista, slå upp, lös in, ångra, omskicka, annullera och återbetala.

MetodSökvägGör
POST/v1/api/giftcardsUtfärdar ett kort
GET/v1/api/giftcardsListar företagets kort
GET/v1/api/giftcards/{code}Slår upp ett kort
POST/v1/api/giftcards/{code}/redeemLöser in ett belopp
POST/v1/api/redemptions/{id}/reverseÅngrar en inlösen
POST/v1/api/giftcards/{code}/resendSkickar kortet igen
POST/v1/api/giftcards/{code}/cancelAnnullerar kortet
POST/v1/api/orders/{id}/refundÅterbetalar en betald order

Annullera kan inte ångras — det finns ingen reaktivering, för ett kort som slogs ut och sedan tyst återupplivades är en förpliktelse som ingen har sagt ja till. Återbetala är den enda slutpunkten som förflyttar pengar: Stripe skickar beloppet tillbaka till kortet som betalade, och ingen andra ställen.

Prova det här på sidan

Konsolen nedan kör samma scheman och samma inlösningsregel som API:t, mot ett kort som bara finns i din browser. Redigera bodyn, och se vilken status ditt eget anrop skulle få.

Konsolen

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

Förfrågan

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

Authorization: Bearer pk_test_…

Ingen kropp. Koden står i sökvägen.

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

Saldot räknas ut från posteringarna, det läses inte av ett fält — därför stämmer det alltid med inlösningarna.

Svar 200 OK. Saldot räknas ut från posteringarna, det läses inte av ett fält — därför stämmer det alltid med inlösningarna.

Konsolen gör inga anrop till nätet — den kör samma scheman och samma inlösenregel som API:et, mot ett presentkort som bara finns i din webbläsare. Statuskoder och feltexter är därför de som din egen integration får.

Idempotens

Utfärda och lösa in kan båda bära en nyckel som gör anropet säkert att upprepa. Samma nyckel två gånger svarar med resultatet av det FÖRSTA anropet — samma kort, samma postering — istället för att utfärda eller dra två gånger. De två verben detekterar dock inte samma sak: vid LÖSA IN svarar vi 409 idempotency_key_conflict, om nyckeln redan är använd på ett annat kort eller på en utbetalning, istället för att missa. Vid UTFÄRDA jämför vi inte anropet — återanvänder du en nyckel med ett annat belopp, får du 201 och det FÖRSTA kortets data tillbaka, utan fel. Använd en nyckel per kort.

Nyckeln kan stå på tre platser. Vi läser idempotencyKey i bodyn först, och annars headern Idempotency-Key och sedan X-Request-Guid. Bodyn vinner, när det finns både och.

VarNamn
BodynidempotencyKey — det explicita valet, och det som vinner.
HeaderIdempotency-Key — namnet som Stripe gjort till standard.
HeaderX-Request-Guid — så en integration som flyttar från Lifepeaks fungerar utan att skrivas om.

Utfärda ett kort

Utfärdar ett kort utanför betalningsflödet — sålt från ditt eget system, fakturerat till ett företag, eller givet gratis.

FältTypKrav
amountOreheltalObligatorisk. Belopp i öre, minst 1.
validityMonthsheltalValfritt. Minst 36 — kortare avvisas.
originsold | b2b | compObligatorisk. Se nedan.
referencetextValfritt. Din egen anteckning, t.ex. ett fakturanummer. Högst 200 tecken.
idempotencyKeytextValfritt, men rekommenderat. Samma nyckel två gånger utfärdar bara ett kort. Kan också skickas som header — se Idempotens.

origin är obligatorisk här, där det är valfritt i kontrollpanelen. Ett system utfärdar utan att någon tittar, och valet följer kortet resten av dess livslängd: sold betyder att en kund har betalat för det, och då bär kortet kundens rätt att få restbeloppet utbetalt kontant. b2b och comp gör inte.

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"
  }'

Svarar 201 med kortet under giftCard. Beloppet är i öre — 50000 är 500,00 kr.

Lista kort

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

Svarar 200 med företagets kort under giftCards.

Slå upp ett kort

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

Svarar 200 med kortet under giftCard, eller 404 om koden inte finns på ditt företag.

Lösa in

Drar ett belopp från kortets saldo. Koden står i sökvägen, beloppet i bodyn.

FältTypKrav
amountOreheltalObligatorisk. Belopp i öre, minst 1.
locationtextValfritt. Var det hände, t.ex. "Vesterbro". Högst 120 tecken.
idempotencyKeytextValfritt, men rekommenderat. Samma nyckel två gånger drar bara en gång. Kan också skickas 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"
  }'

Svarar 200 med resultatet av inlösningen:

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

Spara id. Det är posteringen, och det är det enda som kan ångra just denna inlösning.

status är kortets status efter inlösningen — en av active, redeemed, expired, void, disputed. Om saldot är förbrukat, ändras det till redeemed.

Om det inte går igenom, är svaret en av dessa. De är inte samma för kassan: några är något gästen bör veta, och några är något företaget bör ringas om.

StatusBetyder
400 invalid_redeem_requestBodyn matchar inte det som inlösning kräver — typiskt ett belopp som inte är ett helt antal öre, eller som är noll.
400 not_a_gift_cardKoden i sökvägen är en biljettskod (TKT-…), inte ett presentkort.
404 gift_card_not_foundKoden finns inte på ditt företag.
409 card_inactiveKortet är inte aktivt: förbrukat, annullerat, satt till utgånget eller fryst under en invänd. Det går inte över av sig självt — företaget bör kontaktas.
409 redeem_too_soonFöretaget har satt en inlösningsfördröjning, och den är inte utgångsen än. Kortet har inget fel; det kan bara inte användas än. Försök igen senare.
409 idempotency_key_conflictNyckeln är redan använd på ett annat kort — eller på en utbetalning av samma kort. Se Idempotens.
410 gift_card_expiredKortet står fortfarande som aktivt, men utgångsdatumet har passerat. Till skillnad från card_inactive är det tiden och inte ett beslut som har stängt kortet.
422 insufficient_balanceBeloppet är större än saldot. Vi drar aldrig ett partiellt belopp själva — slå upp kortet, dra saldot, och ta resten på annat sätt.
422 invalid_amountInlösningsregelns eget svar på ett olagligt belopp. Schemat fångar det normalt redan som 400 invalid_redeem_request, så en klient bör kunna läsa båda.
422 punch_amount_not_wholeKortet är ett klippkort och beloppet är inte ett helt antal klipp. Det är inget fel på talet — det är fel sorts kort för det. Slå upp kortet, läs punchValueOre och skicka det värdet eller en multipel av det. Ett klippkort som blir kvar med mindre än ett klipp är pengar som varken kassan eller kunden kan nå.

Ångra en inlösning

Lägger beloppet tillbaka på kortet. Det sker som en ny postering med negativt belopp som pekar på den den ångrar — ingenting raderas, och båda raderna står kvar i kortets historik. Om kortet var helt förbrukat blir det aktivt igen.

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

Svarar 200 med posteringen som la beloppet tillbaka:

JSON
{
  "id": "red_2c77af90",
  "code": "KUV-XXXX-XXXX",
  "amountOre": -6400,
  "remainingBalanceOre": 50000,
  "status": "active"
}
StatusBetyder
404 redemption_not_foundPosteringen finns inte på ditt företag.
409 already_reversedDen är ångråd tidigare. En gång, aldrig två.
409 not_reversiblePosteringen är själv en ångran eller en kontant utbetalning.
409 card_inactiveKortet är annullerat eller fryst under en invänd.
409 order_refundedBeställningen bakom kortet är återbetald. Köparen har redan fått pengarna tillbaka, så en ångran skulle ge dem värdet två gånger.