Kardlane
Integrate

Failure reasons

A short reason you can show your customer when a card is rejected.

Every trade.failed carries failure: { kind, message }. The message is written from what the vendor actually reported — “Card already redeemed”, “Zombie card (blocked)”, “Card balance is $0” — with any card code or PIN removed, so you can show it to your customer as-is.

kindTypical message
already_redeemedCard already redeemed
duplicateCard already used
invalidInvalid card or code
wrong_cardCard doesn’t match the type, value or country submitted
unreadableCard images weren’t clear enough to redeem
blockedCard is blocked (zombie card)
otherCard could not be redeemed

Use kind for your own logic and message for people. Escalations where the agent read a failure carry the same object in review.failure.