Event reference
Every type we send today. Treat the list as open: ignore a type you do not recognise and return 2xx.
A purchase produces at least two events: card.authorized when it is authorised, then a card.transaction for each later leg, whether it clears, reverses or refunds. They all carry the same transaction_id. A decline stands alone. See Receiving events for signature verification and retries.
A virtual card was created for you and recorded against your account
card_idstringpartner_refstring | nulllast4string | nullcard_holder_namestring- Arrives once per card. A retry that replays an existing card under the same idempotency key emits nothing.
{
"id": "0f4c2c1e-9a3d-4a67-8b21-5b8e3d1c7a90",
"type": "card.issued",
"created_at": "2026-08-22T00:32:35.412Z",
"data": {
"card_id": "7Kd2mQ4rTz9XbW1sYh6vN0pLcE3fJa8u",
"partner_ref": "user_8812",
"last4": "4417",
"card_holder_name": "MARIA GONZALEZ"
}
}Money moved from your float onto one of your cards
card_idstringpartner_refstring | nullamount_requested_usdnumberfee_usdnumbercredited_usdnumberpartner_balance_usdnumber- A top-up whose processor call fails ambiguously emits nothing, so the absence of this event does not prove the card was not funded.
{
"id": "6b1a08d3-2f4c-4d19-9f77-c0a1e2b4d556",
"type": "card.topped_up",
"created_at": "2026-08-22T09:14:02.087Z",
"data": {
"card_id": "7Kd2mQ4rTz9XbW1sYh6vN0pLcE3fJa8u",
"partner_ref": "user_8812",
"amount_requested_usd": 250,
"fee_usd": 0,
"credited_usd": 250,
"partner_balance_usd": 18750.25
}
}A purchase was authorized and its amount, fee included, was charged to the card. The merchant can still settle a different amount
card_idstringpartner_refstring | nulltransaction_idstring | nulleventstringstatusstringis_pendingbooleandelivery_statusstringmerchantstring | nullmcc_codestring | nullmcc_categorystring | nullmerchant_countrystring | nullamount_usdnumber | nulloriginal_amountnumber | nulloriginal_currencystring | nullbill_currencystring | nullexchange_ratenumber | nullfee_usdnumberfee_breakdownobjectdecline_reasonobject | nulloccurred_atstring | null- This is the first event for one purchase. Every later leg arrives as
card.transaction, and they all carry the sametransaction_id. - Settlement is slow: the median gap to the settled event is around 22 hours. Show the purchase as pending with this event's
amount_usdandfee_usdstraight away. When a settlement arrives with the sameoriginal_amount, keep those figures as the charge. If a settlement arrives first, do not book its figures: wait for this event.
{
"id": "c74e1b6a-3d55-4b8f-9a2e-1c6d0f5a8b41",
"type": "card.authorized",
"created_at": "2026-08-22T14:07:54.118Z",
"data": {
"card_id": "7Kd2mQ4rTz9XbW1sYh6vN0pLcE3fJa8u",
"partner_ref": "user_8812",
"transaction_id": "tid_01a09a51-2b3c-7d4e-8f5a-6b7c8d9e0f1a",
"event": "authorized",
"status": "pending",
"is_pending": true,
"delivery_status": "success",
"merchant": "CORNER CAFE",
"mcc_code": "5814",
"mcc_category": "Fast Food Restaurants",
"merchant_country": "USA",
"amount_usd": 25.5,
"original_amount": 25,
"original_currency": "USD",
"bill_currency": "USD",
"exchange_rate": 1.02,
"fee_usd": 0.5,
"fee_breakdown": { "fx_usd": 0.5, "atm_usd": 0 },
"decline_reason": null,
"occurred_at": "2026-08-22T14:07:51.906Z"
}
}A purchase settled, or a refund or reversal posted. A settlement does not repeat the fee taken at authorization, so its amount is not the total charged
card_idstringpartner_refstring | nulltransaction_idstring | nulleventstringstatusstringis_pendingbooleandelivery_statusstringmerchantstring | nullmcc_codestring | nullmcc_categorystring | nullmerchant_countrystring | nullamount_usdnumber | nulloriginal_amountnumber | nulloriginal_currencystring | nullbill_currencystring | nullexchange_ratenumber | nullfee_usdnumberfee_breakdownobjectdecline_reasonobject | nulloccurred_atstring | null- This is the second event for a purchase that already arrived as
card.authorized. Pair them ontransaction_idand tell them apart bystatus. - A refund or reversal is its own
card.transactionsharing the originaltransaction_id, so one transaction can produce three or more events. Key your ledger on the eventidfor deduplication and ontransaction_idfor grouping. - A settlement does not repeat the fee taken at authorization: its
fee_usdis normally0. Keep the authorization'samount_usdandfee_usdas the charge whileoriginal_amountis unchanged. If it changed, treat the charge as open and reconcile it with us bytransaction_id.
{
"id": "e1907c22-4a6b-49d8-b0f3-5d2c8e7a1140",
"type": "card.transaction",
"created_at": "2026-08-23T12:41:19.006Z",
"data": {
"card_id": "7Kd2mQ4rTz9XbW1sYh6vN0pLcE3fJa8u",
"partner_ref": "user_8812",
"transaction_id": "tid_01a09a51-2b3c-7d4e-8f5a-6b7c8d9e0f1a",
"event": "cleared",
"status": "settled",
"is_pending": false,
"delivery_status": "success",
"merchant": "CORNER CAFE",
"mcc_code": "5814",
"mcc_category": "Fast Food Restaurants",
"merchant_country": "USA",
"amount_usd": 25,
"original_amount": 25,
"original_currency": "USD",
"bill_currency": "USD",
"exchange_rate": 1,
"fee_usd": 0,
"fee_breakdown": { "fx_usd": 0, "atm_usd": 0 },
"decline_reason": null,
"occurred_at": "2026-08-23T12:41:17.882Z"
}
}A purchase was declined at the point of sale
card_idstringpartner_refstring | nulltransaction_idstring | nulleventstringstatusstringis_pendingbooleandelivery_statusstringmerchantstring | nullmcc_codestring | nullmcc_categorystring | nullmerchant_countrystring | nullamount_usdnumber | nulloriginal_amountnumber | nulloriginal_currencystring | nullbill_currencystring | nullexchange_ratenumber | nullfee_usdnumberfee_breakdownobjectdecline_reasonobject | nulloccurred_atstring | null- A decline stands alone. It never pairs with a
card.authorizedor acard.transaction. decline_reason.card_blockedmeans the card is unusable until we unblock it. Stop retrying and contact us.
{
"id": "3c8d5f10-b7a2-4e69-8c11-9f0e2d4a6b73",
"type": "card.declined",
"created_at": "2026-08-22T18:22:41.503Z",
"data": {
"card_id": "7Kd2mQ4rTz9XbW1sYh6vN0pLcE3fJa8u",
"partner_ref": "user_8812",
"transaction_id": "tid_01a0b3e1-77c2-7d04-8e5f-6a1b2c3d4e5f",
"event": "declined",
"status": "settled",
"is_pending": false,
"delivery_status": "success",
"merchant": "STEAMGAMES.COM",
"mcc_code": "5816",
"mcc_category": "Digital Goods: Games",
"merchant_country": "LU",
"amount_usd": 59.99,
"original_amount": 59.99,
"original_currency": "USD",
"bill_currency": "USD",
"exchange_rate": 1,
"fee_usd": 0,
"fee_breakdown": { "fx_usd": 0, "atm_usd": 0 },
"decline_reason": {
"code": "insufficient_card_balance",
"message": "The card balance did not cover the purchase.",
"retryable": false,
"card_blocked": false
},
"occurred_at": "2026-08-22T18:22:40.115Z"
}
}A 3DS one-time code for one of your cards, for you to deliver to the cardholder
card_idstringpartner_refstring | nullcodestring | nullauto_approvedbooleanmerchantstring | nullmerchant_countrystring | nullamountnumber | nullcurrencystring | nulloccurred_atstring | null- Time critical. Acknowledge it immediately and deliver the code to your cardholder: a failed first attempt costs at least a minute of backoff, by which point the challenge has usually expired.
- Sent for every card: 3DS codes are delivered by webhook only, never by text message. Keep your webhook registered and fast.
{
"id": "7d0b3a99-1e42-4c07-a5f8-6b3d9c2e0417",
"type": "card.3ds_challenge",
"created_at": "2026-08-22T15:03:11.271Z",
"data": {
"card_id": "7Kd2mQ4rTz9XbW1sYh6vN0pLcE3fJa8u",
"partner_ref": "user_8812",
"code": "481902",
"merchant": "BOOKING.COM",
"merchant_country": "NL",
"amount": 412.5,
"currency": "EUR",
"occurred_at": "2026-08-22T15:03:10.804Z"
}
}A card was closed and any balance left on it returned to your float
card_idstringpartner_refstring | nullreturned_usdnumber- Closing does not return card allowance. Your lifetime issuance count still includes the closed card.
{
"id": "a2d9f7b1-55c8-4e02-8a3b-71f4c9e0d233",
"type": "card.closed",
"created_at": "2026-08-22T11:40:55.900Z",
"data": {
"card_id": "7Kd2mQ4rTz9XbW1sYh6vN0pLcE3fJa8u",
"partner_ref": "user_8812",
"returned_usd": 12.34
}
}A crypto payment matched one of your deposit quotes and the card was credited (quote-matched variant)
deposit_idstringcard_idstringcredited_usdnumbertx_hashstringpartner_refstring | nullassetstringamount_receivednumberfee_usdnumberktap_fee_usdnumberpartner_fee_usdnumber- Two payload shapes ship under this type. Tell them apart by presence:
deposit_idmarks one,partner_refwithassetmarks the other. Read every field defensively.
{
"id": "b58c1d7e-90a3-4f21-b6c4-2e7f8a3d0159",
"type": "deposit.credited",
"created_at": "2026-08-22T20:11:44.630Z",
"data": {
"deposit_id": "41f6d2c8-7b09-4a35-9e18-c3d5b0a7f264",
"card_id": "7Kd2mQ4rTz9XbW1sYh6vN0pLcE3fJa8u",
"credited_usd": 98.4,
"tx_hash": "0x9c1f3a7d4e2b6058ab77c0d9e3f1425a6b8c0d2e4f6a8b1c3d5e7f9012345678"
}
}Your spendable float fell below the low-balance threshold
available_usdnumberbalance_usdnumberthreshold_usdnumbermessagestring- About your account, not a card. It carries no
card_idand nopartner_ref. - Sent once when your available balance (
available_usd) falls below the threshold, not repeated while it stays there. It comes again, with a new event id, only after your available balance has recovered to a fifth above the threshold and fallen below it again.
{
"id": "5a1e8c73-2b90-4f16-8d47-e0c9b3f5a218",
"type": "float.low",
"created_at": "2026-08-22T07:00:19.442Z",
"data": {
"available_usd": 412.8,
"balance_usd": 50412.8,
"threshold_usd": 500,
"message": "Your balance is running low. Send funds to avoid card top-ups being declined."
}
}A transaction hash you submitted with POST /funding was credited to your balance
funding_idstringnetworkstringtx_hashstringtokenstringamount_usdnumberfee_usdnumbercredited_usdnumberbalance_usdnumber- Sent once per submission, when it becomes
credited.funding_idis theidthat POST /funding returned. A submission we close ascreditedwith reasoncredited_separatelyafter a review sends none: those funds were already credited to your balance by other means. A reversal sends none either. Itsamount_usdis the amount credited before the load fee: normally the amount sent, but after a review no more than reached us, so it can be belowamount_usdon GET /funding/{fundingId}. - About your account, not a card. It carries no
card_idand nopartner_ref. balance_usdis your balance straight after the credit. A top-up is checked againstfloat.available_usdon GET /me, which a limit can hold below it.
{
"id": "6f3b8d2a-9c14-4e70-b5a8-1d7e3c9f2b46",
"type": "float.credited",
"created_at": "2026-09-23T10:17:40.618Z",
"data": {
"funding_id": "3b9e6f1a-7c42-4d85-a1e0-5f2c8d9b4e63",
"network": "POLYGON",
"tx_hash": "0x4a7e2c9d1b8f3e6a5c0d7b2e9f4a1c8d3e6b0f5a2d9c7e4b1a8f6d3c0e5b2a91",
"token": "USDC",
"amount_usd": 2500.25,
"fee_usd": 25.0025,
"credited_usd": 2475.2475,
"balance_usd": 12475.2475
}
}Money moved off one of your cards back into your balance
card_idstringpartner_refstring | nullamount_usdnumberpartner_balance_usdnumber- Money left the card and returned to your balance. Pairs with a
POST /cards/{id}/unloadyou made; there is no processor-initiated unload.
{
"id": "8c1d2e3f-4a5b-6c7d-8e9f-0a1b2c3d4e5f",
"type": "card.unloaded",
"created_at": "2026-08-24T10:15:00.000Z",
"data": {
"card_id": "7Kd2mQ4rTz9XbW1sYh6vN0pLcE3fJa8u",
"partner_ref": "your-user-8842",
"amount_usd": 50,
"partner_balance_usd": 9995
}
}A card's status changed, whether you changed it or we did
card_idstringpartner_refstring | nullstatusstringreasonstringaction_requiredstring | nulloccurred_atstring | null- One stream for every status change, whether you made it (freeze, unfreeze) or we did (velocity block).
reasontells you which. - A
BLOCKEDcard cannot be restored through the API.action_required: "contact_support"means exactly that.
{
"id": "3e2a1b0c-9d8e-7f6a-5b4c-3d2e1f0a9b8c",
"type": "card.status_changed",
"created_at": "2026-08-24T10:20:00.000Z",
"data": {
"card_id": "7Kd2mQ4rTz9XbW1sYh6vN0pLcE3fJa8u",
"partner_ref": "your-user-8842",
"status": "BLOCKED",
"reason": "velocity",
"action_required": "contact_support",
"occurred_at": "2026-08-24T10:19:58.412Z"
}
}Something arriving that is not described here, or an event you expected and did not get: email dev@ktap.io with the delivery id and the time in UTC.