curl --request POST \
--url https://sg.sandbox.api.reap.global/cards/ \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--header 'Idempotency-Key: <idempotency-key>' \
--header 'Reap-Version: <reap-version>' \
--data '
{
"userId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"accountId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"type": "VIRTUAL",
"3dsChallengeMethod": "SMS",
"cardDesignId": "<string>"
}
'const options = {
method: 'POST',
headers: {
'Reap-Version': '<reap-version>',
'Idempotency-Key': '<idempotency-key>',
Authorization: 'Bearer <token>',
'Content-Type': 'application/json'
},
body: JSON.stringify({
userId: '3c90c3cc-0d44-4b50-8888-8dd25736052a',
accountId: '3c90c3cc-0d44-4b50-8888-8dd25736052a',
type: 'VIRTUAL',
'3dsChallengeMethod': 'SMS',
cardDesignId: '<string>'
})
};
fetch('https://sg.sandbox.api.reap.global/cards/', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://sg.sandbox.api.reap.global/cards/"
payload = {
"userId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"accountId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"type": "VIRTUAL",
"3dsChallengeMethod": "SMS",
"cardDesignId": "<string>"
}
headers = {
"Reap-Version": "<reap-version>",
"Idempotency-Key": "<idempotency-key>",
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text){
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"accountId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"userId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"type": "VIRTUAL",
"cardDesignId": "<string>",
"status": "ACTIVE",
"blockReason": {
"type": "CLIENT_REQUESTED",
"message": "<string>"
},
"blockLiftable": true,
"frozen": true,
"cardholderName": "<string>",
"last4": "<string>",
"3dsChallengeMethod": "SMS",
"physicalCardStatus": "NOT_ORDERED",
"createdAt": "<string>",
"updatedAt": "<string>"
}{
"error": {
"code": "USER_APPLICATION_NOT_APPROVED",
"message": "<string>",
"detail": {}
}
}{
"error": {
"code": "CARD_USER_NOT_FOUND",
"message": "<string>",
"detail": {}
}
}{
"error": {
"code": "CARD_QUOTA_EXCEEDED",
"message": "<string>",
"detail": {}
}
}{
"error": {
"code": "VALIDATION_FAILED",
"message": "<string>",
"detail": {}
}
}Create card
Creates a new virtual or physical card for a user. User must have approved application; account must be active. The phone number used for OTP verification is taken from the user record; the card is issued against the user’s verified identity.
curl --request POST \
--url https://sg.sandbox.api.reap.global/cards/ \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--header 'Idempotency-Key: <idempotency-key>' \
--header 'Reap-Version: <reap-version>' \
--data '
{
"userId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"accountId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"type": "VIRTUAL",
"3dsChallengeMethod": "SMS",
"cardDesignId": "<string>"
}
'const options = {
method: 'POST',
headers: {
'Reap-Version': '<reap-version>',
'Idempotency-Key': '<idempotency-key>',
Authorization: 'Bearer <token>',
'Content-Type': 'application/json'
},
body: JSON.stringify({
userId: '3c90c3cc-0d44-4b50-8888-8dd25736052a',
accountId: '3c90c3cc-0d44-4b50-8888-8dd25736052a',
type: 'VIRTUAL',
'3dsChallengeMethod': 'SMS',
cardDesignId: '<string>'
})
};
fetch('https://sg.sandbox.api.reap.global/cards/', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://sg.sandbox.api.reap.global/cards/"
payload = {
"userId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"accountId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"type": "VIRTUAL",
"3dsChallengeMethod": "SMS",
"cardDesignId": "<string>"
}
headers = {
"Reap-Version": "<reap-version>",
"Idempotency-Key": "<idempotency-key>",
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text){
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"accountId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"userId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"type": "VIRTUAL",
"cardDesignId": "<string>",
"status": "ACTIVE",
"blockReason": {
"type": "CLIENT_REQUESTED",
"message": "<string>"
},
"blockLiftable": true,
"frozen": true,
"cardholderName": "<string>",
"last4": "<string>",
"3dsChallengeMethod": "SMS",
"physicalCardStatus": "NOT_ORDERED",
"createdAt": "<string>",
"updatedAt": "<string>"
}{
"error": {
"code": "USER_APPLICATION_NOT_APPROVED",
"message": "<string>",
"detail": {}
}
}{
"error": {
"code": "CARD_USER_NOT_FOUND",
"message": "<string>",
"detail": {}
}
}{
"error": {
"code": "CARD_QUOTA_EXCEEDED",
"message": "<string>",
"detail": {}
}
}{
"error": {
"code": "VALIDATION_FAILED",
"message": "<string>",
"detail": {}
}
}Authorizations
API key as Bearer token
Headers
API version (YYYY-MM-DD)
2025-02-14 "2025-02-14"
Unique key for safely retrying this request. Up to 255 characters; we recommend a UUIDv4. The first request executes and its response is cached; subsequent requests with the same key replay the cached response (24h retention).
1 - 255Body
Request body for creating a new card
ID of the user to create the card for
ID of the account to link the card to
Card type (VIRTUAL or PHYSICAL)
VIRTUAL, PHYSICAL "VIRTUAL"
3DS challenge verification method. Defaults to SMS if not specified.
SMS, WEBHOOK "SMS"
Card design to use. Defaults to the project default design when not specified. Throws error when default is not configured and no value is passed here.
Response
Card resource
Unique card identifier
ID of the account the card belongs to
ID of the user the card belongs to
Card type (VIRTUAL or PHYSICAL)
VIRTUAL, PHYSICAL "VIRTUAL"
Design the card was issued with. For a physical card this is the design on the card record, which can differ from the one produced: the plastic is made from the design chosen on the shipment, returned as cardDesignId per card on the shipment endpoints.
Current card status
ACTIVE, FROZEN, BLOCKED, EXPIRED "ACTIVE"
Block reason details (only present when status is BLOCKED)
Show child attributes
Show child attributes
Whether the current block can be lifted with the unblock endpoint. false for blocks that need Reap support, and for a card that holds no block.
Whether the card is frozen. A block hides a freeze from status, so a card that is BLOCKED with frozen: true returns to FROZEN once the block lifts.
Cardholder name displayed on card
Last 4 digits of the card number. Use reveal endpoint for full details.
3DS challenge verification method
SMS, WEBHOOK "SMS"
Physical lifecycle of the card (production + shipping + activation rollup). Defaults to NOT_ORDERED for newly created physical cards. null for virtual cards, which have no physical lifecycle.
NOT_ORDERED, REQUESTED, IN_PRODUCTION, PRODUCTION_COMPLETED, IN_TRANSIT, OUT_FOR_DELIVERY, DELIVERED, ACTIVATED, CANCELED, DELIVERY_FAILED, EXCEPTION "NOT_ORDERED"
ISO 8601 timestamp of creation
ISO 8601 timestamp of last update