Card types
You choose
type once, at creation, and it is fixed. A PHYSICAL card is a single card that works digitally right away, exactly like a virtual card, and can additionally be shipped as plastic. You do not create a separate virtual card for it, and there is no separate card ID for its digital and physical forms. Pick VIRTUAL for a digital-only card, PHYSICAL when the cardholder also needs plastic.Card statuses
status tracks the card’s own state. It does not reflect the state of the account the card is issued on: a restricted account declines every authorization while its cards stay ACTIVE. Read both values when showing a cardholder whether a card can be used.
Freeze and block are separate
A freeze and a block are two independent states a card can be in, and a card can be in both at once.status reports the block when both are set, so a frozen card that is then blocked reports BLOCKED, and the boolean frozen field is how you know the freeze is still there. Lifting the block returns that card to FROZEN, not to ACTIVE.
Each state is lifted on its own, in any order. Unfreezing a blocked card is allowed and clears the freeze; the card stays BLOCKED and goes to ACTIVE when the block lifts.
Expose freeze in your app as a cardholder-facing switch. Reserve block for cases where you want the card stopped and a deliberate decision made before it is used again.
Either state stops the card everywhere. A physical card stops working at the terminal and the ATM alongside online payments, and so does the card in any mobile wallet it has been added to.
Blocked cards
blockReason.type names the cause and blockLiftable tells you what you can do about it, so you never need to hardcode a list of reasons.
When
blockLiftable is false, Unblock returns 409 CARD_BLOCK_NOT_LIFTABLE and the block stays in place. Surface that to your support team rather than retrying.
Blocking a card that is already blocked never weakens the block: a card blocked by Reap keeps that reason and stays non-liftable even if you call Block on it afterwards.
For a card blocked because fraud was confirmed, prefer deleting the card and issuing a new one over unblocking it. The card number is compromised, and unblocking puts the same number back into circulation.
status is also independent of where a physical card is in production or delivery. A physical card is ACTIVE and usable online from creation, while its production and shipping progress is tracked separately on the physicalCardStatus field (and through shipment webhooks). So a physical card that is still in transit reports status: ACTIVE with a physicalCardStatus such as IN_TRANSIT. See Physical card shipping.
Simulating card statuses in sandbox
In sandbox, use Simulate card status to force a card into a status that is otherwise hard to trigger. Reap also emits aCARD_STATUS_UPDATED webhook with the new status.
The main use cases are statuses you cannot reach through standard endpoints:
BLOCKED: simulates a block placed by Reap, which in production needs a real fraud or compliance trigger. Defaults toSUSPECTED_FRAUD_PIN, which you can lift. PassblockReason: OTHERto produce a block you cannot lift and exercise the409 CARD_BLOCK_NOT_LIFTABLEpath.EXPIRED: simulates a card reaching its expiry date without waiting for it.
FROZEN and ACTIVE are also accepted here, but you can reach those through the standard Freeze and Unfreeze endpoints, and a CLIENT_REQUESTED block through Block.
Issue your first card
Before issuing a card, the user must have
application.status: APPROVED and the account must be ACTIVE. See the KYC overview if you haven’t onboarded the user yet.1
Create a card
Call Create a card with the user’s ID, account ID, and
type.VIRTUAL: the card is created withstatus: ACTIVEand is ready to use immediately.PHYSICAL: available for digital use immediately. The physical card is mailed to the cardholder and must be activated on arrival.
cardDesignId to pick a design from those assigned to your project (List card designs); omit it to use the project default. The card returns the design it was issued with as cardDesignId.2
Display card details
The PAN, CVV, and expiry date are never returned by the API. To show them to the cardholder, call Create reveal session from your backend. It returns a short-lived
revealUrl. Pass this to your frontend and load it in an <iframe> or WebView.See Displaying Card Details for the full integration guide.3
Handle card status changes
Reap sends a
CARD_STATUS_UPDATED webhook whenever a card’s status changes. Listen for this event to keep your UI and internal records in sync.Key statuses to handle:FROZEN: the cardholder or your app froze the cardBLOCKED: readblockReason.typefor the cause andblockLiftablefor whether you can lift itEXPIRED: card has reached its expiration date
4
Set a PIN (optional)
If your card program includes ATM withdrawals or chip-and-PIN transactions, call Update PIN before the cardholder uses the card at a terminal. See Update PIN for PIN requirements.
Fraud monitoring
When fraud monitoring flags a transaction, or when a cardholder reports a past transaction as fraud, use Fraud Alerts to confirm or decline. Confirming or reporting blocks the card and emitsCARD_STATUS_UPDATED with blockReason.type: FRAUD_ALERT_CONFIRMED.