| Methode | Pfad | Funktion |
|---|---|---|
| POST | /v1/api/giftcards | Gibt eine Karte aus |
| GET | /v1/api/giftcards | Listet die Karten des Unternehmens auf |
| GET | /v1/api/giftcards/{code} | Schlägt eine Karte nach |
| POST | /v1/api/giftcards/{code}/redeem | Löst einen Betrag ein |
| POST | /v1/api/redemptions/{id}/reverse | Kehrt eine Einlösung um |
| POST | /v1/api/giftcards/{code}/resend | Sendet die Karte erneut |
| POST | /v1/api/giftcards/{code}/cancel | Storniert die Karte |
| POST | /v1/api/orders/{id}/refund | Erstattet 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.
| Wo | Name |
|---|---|
| Body | idempotencyKey — die explizite Wahl und die, die gewinnt. |
| Header | Idempotency-Key — der Name, den Stripe zum Standard gemacht hat. |
| Header | X-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.
| Feld | Typ | Erforderlich |
|---|---|---|
| amountOre | Ganzzahl | Erforderlich. Betrag in Ore, mindestens 1. |
| validityMonths | Ganzzahl | Optional. Mindestens 36 — kürzere werden abgelehnt. |
| origin | sold | b2b | comp | Erforderlich. Siehe unten. |
| reference | Text | Optional. Ihre eigene Notiz, z. B. eine Rechnungsnummer. Höchstens 200 Zeichen. |
| idempotencyKey | Text | Optional, 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.
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
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
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.
| Feld | Typ | Erforderlich |
|---|---|---|
| amountOre | Ganzzahl | Erforderlich. Betrag in Ore, mindestens 1. |
| location | Text | Optional. Wo es passierte, z. B. "Vesterbro". Höchstens 120 Zeichen. |
| idempotencyKey | Text | Optional, aber empfohlen. Derselbe Schlüssel zweimal bucht nur einmal ab. Kann auch als Header gesendet werden — siehe Idempotenz. |
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:
{
"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.
| Status | Bedeutet |
|---|---|
| 400 invalid_redeem_request | Der 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_card | Der Code im Pfad ist ein Ticketcode (TKT-…), kein Gutschein. |
| 404 gift_card_not_found | Der Code wird in Ihrem Unternehmen nicht gefunden. |
| 409 card_inactive | Die 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_soon | Das 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_conflict | Der Schlüssel wurde bereits für eine andere Karte verwendet — oder für eine Auszahlung derselben Karte. Siehe Idempotenz. |
| 410 gift_card_expired | Die 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_balance | Der 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_amount | Die 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_whole | Die 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.
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:
{
"id": "red_2c77af90",
"code": "KUV-XXXX-XXXX",
"amountOre": -6400,
"remainingBalanceOre": 50000,
"status": "active"
}| Status | Bedeutet |
|---|---|
| 404 redemption_not_found | Die Buchung wird in Ihrem Unternehmen nicht gefunden. |
| 409 already_reversed | Es wurde bereits rückgängig gemacht. Einmal, niemals zweimal. |
| 409 not_reversible | Die Buchung selbst ist eine Rückgängigmachung oder eine Barauszahlung. |
| 409 card_inactive | Die Karte ist storniert oder während einer Anfechtung eingefroren. |
| 409 order_refunded | Die 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. |