| Metod | Sökväg | Gör |
|---|---|---|
| POST | /v1/api/giftcards | Utfärdar ett kort |
| GET | /v1/api/giftcards | Listar företagets kort |
| GET | /v1/api/giftcards/{code} | Slår upp ett kort |
| POST | /v1/api/giftcards/{code}/redeem | Löser in ett belopp |
| POST | /v1/api/redemptions/{id}/reverse | Ångrar en inlösen |
| POST | /v1/api/giftcards/{code}/resend | Skickar kortet igen |
| POST | /v1/api/giftcards/{code}/cancel | Annullerar 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.
| Var | Namn |
|---|---|
| Bodyn | idempotencyKey — det explicita valet, och det som vinner. |
| Header | Idempotency-Key — namnet som Stripe gjort till standard. |
| Header | X-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ält | Typ | Krav |
|---|---|---|
| amountOre | heltal | Obligatorisk. Belopp i öre, minst 1. |
| validityMonths | heltal | Valfritt. Minst 36 — kortare avvisas. |
| origin | sold | b2b | comp | Obligatorisk. Se nedan. |
| reference | text | Valfritt. Din egen anteckning, t.ex. ett fakturanummer. Högst 200 tecken. |
| idempotencyKey | text | Valfritt, 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.
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
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
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ält | Typ | Krav |
|---|---|---|
| amountOre | heltal | Obligatorisk. Belopp i öre, minst 1. |
| location | text | Valfritt. Var det hände, t.ex. "Vesterbro". Högst 120 tecken. |
| idempotencyKey | text | Valfritt, men rekommenderat. Samma nyckel två gånger drar bara en gång. Kan också skickas som header — se Idempotens. |
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:
{
"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.
| Status | Betyder |
|---|---|
| 400 invalid_redeem_request | Bodyn 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_card | Koden i sökvägen är en biljettskod (TKT-…), inte ett presentkort. |
| 404 gift_card_not_found | Koden finns inte på ditt företag. |
| 409 card_inactive | Kortet ä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_soon | Fö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_conflict | Nyckeln är redan använd på ett annat kort — eller på en utbetalning av samma kort. Se Idempotens. |
| 410 gift_card_expired | Kortet 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_balance | Beloppet ä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_amount | Inlö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_whole | Kortet ä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.
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:
{
"id": "red_2c77af90",
"code": "KUV-XXXX-XXXX",
"amountOre": -6400,
"remainingBalanceOre": 50000,
"status": "active"
}| Status | Betyder |
|---|---|
| 404 redemption_not_found | Posteringen finns inte på ditt företag. |
| 409 already_reversed | Den är ångråd tidigare. En gång, aldrig två. |
| 409 not_reversible | Posteringen är själv en ångran eller en kontant utbetalning. |
| 409 card_inactive | Kortet är annullerat eller fryst under en invänd. |
| 409 order_refunded | Beställningen bakom kortet är återbetald. Köparen har redan fått pengarna tillbaka, så en ångran skulle ge dem värdet två gånger. |