Zum Inhalt springen
Dokumentation

API

Gutschein

Acht Endpunkte decken den gesamten Lebenszyklus der Karte über die API ab: Ausstellen, Auflisten, Nachschlagen, Einlösen, Umkehren, Erneut senden, Stornieren und Erstatten.

MethodePfadFunktion
POST/v1/api/giftcardsGibt eine Karte aus
GET/v1/api/giftcardsListet die Karten des Unternehmens auf
GET/v1/api/giftcards/{code}Schlägt eine Karte nach
POST/v1/api/giftcards/{code}/redeemLöst einen Betrag ein
POST/v1/api/redemptions/{id}/reverseKehrt eine Einlösung um
POST/v1/api/giftcards/{code}/resendSendet die Karte erneut
POST/v1/api/giftcards/{code}/cancelStorniert die Karte
POST/v1/api/orders/{id}/refundErstattet eine bezahlte Bestellung

Stornierungen können nicht rückgängig gemacht werden — es gibt keine Reaktivierung, da eine Karte, die getötet und später stumm wiederbelebt wurde, eine Verpflichtung ist, der niemand zugestimmt hat. Erstatten ist der einzige Endpunkt, der Geld bewegt: Stripe sendet den Betrag an die Karte zurück, die bezahlt hat, und an keinen anderen Ort.

Probieren Sie es hier auf der Seite aus

Die untenstehende Konsole führt dieselben Schemata und dieselbe Einlösungsregel wie die API aus, für eine Karte, die nur in Ihrem Browser existiert. Bearbeiten Sie den Body und sehen Sie, welchen Status Ihr eigener Aufruf bekommen würde.

Die Konsole

Gutschein
KUV-DLT2-9GPW
Guthaben
500,00 kr.
Status
active

Anfrage

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

Authorization: Bearer pk_test_…

Kein Text. Der Code ist im Pfad.

Antwort

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

Das Guthaben wird aus den Buchungen berechnet, nicht aus einem Feld gelesen — deshalb stimmt es immer mit den Einlösungen überein.

Antwort 200 OK. Das Guthaben wird aus den Buchungen berechnet, nicht aus einem Feld gelesen — deshalb stimmt es immer mit den Einlösungen überein.

Die Konsole nimmt keine Verbindung ins Internet auf — sie führt die gleichen Schemata und die gleiche Einlösungsregel wie die API gegen einen Gutschein aus, der es nur in Ihrem Browser gibt. Statuscodes und Fehlertexte sind daher die, die Ihre eigene Integration bekommt.

Idempotenz

Ausstellen und Einlösen können beide einen Schlüssel tragen, der den Aufruf sicher wiederholbar macht. Derselbe Schlüssel zweimal antwortet mit dem Ergebnis des ERSTEN Mal — dieselbe Karte, dieselbe Buchung — anstatt zweimal auszustellen oder zu belastigen. Die beiden Verben erkennen jedoch nicht dasselbe: Bei EINLÖSEN antworten wir 409 idempotency_key_conflict, wenn der Schlüssel bereits für eine andere Karte oder eine Auszahlung verwendet wurde, anstatt falsch zu liefern. Bei AUSSTELLEN vergleichen wir den Aufruf nicht — wenn Sie einen Schlüssel mit einem anderen Betrag wiederverwenden, erhalten Sie 201 und die Daten der ERSTEN Karte zurück, ohne Fehler. Verwenden Sie einen Schlüssel pro Karte.

Der Schlüssel kann an drei Stellen stehen. Wir lesen idempotencyKey zuerst im Body, sonst den Header Idempotency-Key und dann X-Request-Guid. Der Body gewinnt, wenn beides vorhanden ist.

WoName
BodyidempotencyKey — die explizite Wahl und die, die gewinnt.
HeaderIdempotency-Key — der Name, den Stripe zum Standard gemacht hat.
HeaderX-Request-Guid — damit eine Integration, die von Lifepeaks umzieht, ohne Umschreiben funktioniert.

Geben Sie eine Karte aus

Gibt eine Karte außerhalb des Zahlungsflusses aus — verkauft aus Ihrem eigenen System, einer Firma in Rechnung gestellt oder als Hausgeschenk gegeben.

FeldTypErforderlich
amountOreGanzzahlErforderlich. Betrag in Ore, mindestens 1.
validityMonthsGanzzahlOptional. Mindestens 36 — kürzere werden abgelehnt.
originsold | b2b | compErforderlich. Siehe unten.
referenceTextOptional. Ihre eigene Notiz, z. B. eine Rechnungsnummer. Höchstens 200 Zeichen.
idempotencyKeyTextOptional, aber empfohlen. Derselbe Schlüssel zweimal gibt nur eine Karte aus. Kann auch als Header gesendet werden — siehe Idempotenz.

origin ist hier erforderlich, wo es im Dashboard optional ist. Ein System gibt aus, ohne dass jemand zuschaut, und die Wahl begleitet die Karte den Rest ihres Lebens: sold bedeutet, dass ein Kunde dafür bezahlt hat, und dann trägt die Karte das Recht des Kunden, das Restguthaben in bar ausbezahlt zu bekommen. b2b und comp tun das nicht.

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

Antwortet 201 mit der Karte unter giftCard. Der Betrag ist in Ore — 50000 ist 500,00 kr.

Karten auflisten

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

Antwortet 200 mit den Karten des Unternehmens unter giftCards.

Schlagen Sie eine Karte nach

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

Antwortet 200 mit der Karte unter giftCard oder 404, wenn der Code nicht in Ihrem Unternehmen gefunden wird.

Einlösen

Zieht einen Betrag vom Guthaben der Karte ab. Der Code steht im Pfad, der Betrag im Body.

FeldTypErforderlich
amountOreGanzzahlErforderlich. Betrag in Ore, mindestens 1.
locationTextOptional. Wo es passierte, z. B. "Vesterbro". Höchstens 120 Zeichen.
idempotencyKeyTextOptional, aber empfohlen. Derselbe Schlüssel zweimal bucht nur einmal ab. Kann auch als Header gesendet werden — siehe Idempotenz.
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"
  }'

Antwortet 200 mit dem Ergebnis der Einlösung:

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

Speichern Sie id. Es ist die Buchung und das Einzige, das diese spezifische Einlösung rückgängig machen kann.

status ist der Zustand der Karte nach der Einlösung — einer von active, redeemed, expired, void, disputed. Wenn das Guthaben aufgebraucht ist, wechselt es zu redeemed.

Wenn es nicht funktioniert, ist die Antwort eine davon. Sie sind für das Kassenterminal nicht gleich: einige sind etwas, das der Gast wissen sollte, und einige sind etwas, für das das Unternehmen angerufen werden sollte.

StatusBedeutet
400 invalid_redeem_requestDer Body entspricht nicht dem, was die Einlösung erfordert — normalerweise ein Betrag, der keine ganze Anzahl von Ore ist oder Null ist.
400 not_a_gift_cardDer Code im Pfad ist ein Ticketcode (TKT-…), kein Gutschein.
404 gift_card_not_foundDer Code wird in Ihrem Unternehmen nicht gefunden.
409 card_inactiveDie Karte ist nicht aktiv: aufgebraucht, storniert, abgelaufen oder während einer Anfechtung eingefroren. Es wird nicht von selbst gelöst — das Unternehmen muss kontaktiert werden.
409 redeem_too_soonDas Unternehmen hat eine Einlösungsverzögerung eingestellt, und sie ist noch nicht abgelaufen. Die Karte funktioniert einwandfrei; sie kann nur noch nicht verwendet werden. Versuchen Sie es später erneut.
409 idempotency_key_conflictDer Schlüssel wurde bereits für eine andere Karte verwendet — oder für eine Auszahlung derselben Karte. Siehe Idempotenz.
410 gift_card_expiredDie Karte ist noch als aktiv eingestuft, aber das Gültigkeitsdatum ist verstrichen. Im Gegensatz zu card_inactive war es die Zeit und nicht eine Entscheidung, die die Karte geschlossen hat.
422 insufficient_balanceDer Betrag ist größer als das Guthaben. Wir belasten niemals einen Teilbetrag aus uns selbst — schlagen Sie die Karte nach, belasten Sie das Guthaben und nehmen Sie den Rest anders.
422 invalid_amountDie eigene Antwort der Einlösungsregel auf einen illegalen Betrag. Das Schema erfasst es normalerweise bereits als 400 invalid_redeem_request, daher sollte ein Client beide lesen können.
422 punch_amount_not_wholeDie Karte ist eine Klippekort, und der Betrag ist keine ganze Anzahl von Klipps. Mit der Zahl stimmt nichts — es ist die falsche Art von Karte dafür. Rufen Sie die Karte ab, lesen Sie punchValueOre und senden Sie diesen Wert oder ein Vielfaches davon. Eine Klippekort, auf der weniger als ein Klipp übrig bleibt, ist Geld, das weder die Kasse noch der Kunde erreichen kann.

Machen Sie eine Einlösung rückgängig

Legt den Betrag auf die Karte zurück. Dies geschieht als neue Buchung mit negativem Betrag, die auf die zeigt, die sie rückgängig macht — nichts wird gelöscht und beide Zeilen bleiben in der Kartenverlauf. War die Karte ganz aufgebraucht, wird sie wieder aktiv.

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

Antwortet 200 mit der Buchung, die den Betrag zurücklegte:

JSON
{
  "id": "red_2c77af90",
  "code": "KUV-XXXX-XXXX",
  "amountOre": -6400,
  "remainingBalanceOre": 50000,
  "status": "active"
}
StatusBedeutet
404 redemption_not_foundDie Buchung wird in Ihrem Unternehmen nicht gefunden.
409 already_reversedEs wurde bereits rückgängig gemacht. Einmal, niemals zweimal.
409 not_reversibleDie Buchung selbst ist eine Rückgängigmachung oder eine Barauszahlung.
409 card_inactiveDie Karte ist storniert oder während einer Anfechtung eingefroren.
409 order_refundedDie Bestellung hinter der Karte wurde erstattet. Der Käufer hat das Geld bereits zurückbekommen, daher würde eine Rückgängigmachung ihm den Wert zweimal geben.