curl --request POST \
--url https://api.global.direct.reap.global/2026-07-13/cards \
--header 'Content-Type: application/json' \
--header 'x-api-key: <api-key>' \
--data '
{
"type": "virtual",
"title": "<string>",
"cardholderId": "<string>",
"category": "<string>",
"isRevolving": true,
"expiresAt": "2023-12-25",
"spendControl": {},
"restriction": {
"time": {
"start": "<string>",
"end": "<string>"
}
},
"message": "<string>"
}
'const options = {
method: 'POST',
headers: {'x-api-key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
type: 'virtual',
title: '<string>',
cardholderId: '<string>',
category: '<string>',
isRevolving: true,
expiresAt: '2023-12-25',
spendControl: {},
restriction: {time: {start: '<string>', end: '<string>'}},
message: '<string>'
})
};
fetch('https://api.global.direct.reap.global/2026-07-13/cards', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://api.global.direct.reap.global/2026-07-13/cards"
payload = {
"type": "virtual",
"title": "<string>",
"cardholderId": "<string>",
"category": "<string>",
"isRevolving": True,
"expiresAt": "2023-12-25",
"spendControl": {},
"restriction": { "time": {
"start": "<string>",
"end": "<string>"
} },
"message": "<string>"
}
headers = {
"x-api-key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text){
"id": "3db05d6f-97a9-4c06-a578-087b14b4f859",
"type": "virtual",
"status": "active",
"title": "Travel card",
"last4": "4242",
"expiresAt": "2028-08-31",
"isRevolving": false,
"planType": "topUp",
"category": "travel",
"cardholder": {
"userId": "user_01JZ2Q1J4Y8P7M6N5K3H2G1F0E",
"name": "Ada Lovelace",
"email": "ada@example.com"
},
"spendCap": {
"amount": "5000.00",
"currency": "USD"
},
"spentAmount": {
"amount": "0.00",
"currency": "USD"
},
"spendControl": {
"limits": {
"transaction": {
"amount": "1000.00",
"currency": "USD"
},
"monthly": {
"amount": "5000.00",
"currency": "USD"
}
},
"spent": {
"monthly": {
"amount": "0.00",
"currency": "USD"
}
},
"atm": {
"dailyWithdrawal": {
"amount": "500.00",
"currency": "USD"
},
"dailyFrequency": 3
}
},
"restriction": {
"time": {
"start": "09:00",
"end": "18:00"
}
},
"createdAt": "2026-07-13T08:00:00.000Z",
"updatedAt": "2026-07-13T08:00:00.000Z"
}Create card
Required API-key scope: cards:write.
Creates a virtual card for an approved team member, with the funding plan, budget, spending limits and usage hours you choose. It returns 201 with the card when it’s ready (or with status: pending while it’s still being set up), or 202 if your business uses approvals and the request is waiting for an approver. Send an Idempotency-Key header so retries never create duplicate cards, and see Issue cards to your team for the full flow. See Cards.
curl --request POST \
--url https://api.global.direct.reap.global/2026-07-13/cards \
--header 'Content-Type: application/json' \
--header 'x-api-key: <api-key>' \
--data '
{
"type": "virtual",
"title": "<string>",
"cardholderId": "<string>",
"category": "<string>",
"isRevolving": true,
"expiresAt": "2023-12-25",
"spendControl": {},
"restriction": {
"time": {
"start": "<string>",
"end": "<string>"
}
},
"message": "<string>"
}
'const options = {
method: 'POST',
headers: {'x-api-key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
type: 'virtual',
title: '<string>',
cardholderId: '<string>',
category: '<string>',
isRevolving: true,
expiresAt: '2023-12-25',
spendControl: {},
restriction: {time: {start: '<string>', end: '<string>'}},
message: '<string>'
})
};
fetch('https://api.global.direct.reap.global/2026-07-13/cards', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://api.global.direct.reap.global/2026-07-13/cards"
payload = {
"type": "virtual",
"title": "<string>",
"cardholderId": "<string>",
"category": "<string>",
"isRevolving": True,
"expiresAt": "2023-12-25",
"spendControl": {},
"restriction": { "time": {
"start": "<string>",
"end": "<string>"
} },
"message": "<string>"
}
headers = {
"x-api-key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text){
"id": "3db05d6f-97a9-4c06-a578-087b14b4f859",
"type": "virtual",
"status": "active",
"title": "Travel card",
"last4": "4242",
"expiresAt": "2028-08-31",
"isRevolving": false,
"planType": "topUp",
"category": "travel",
"cardholder": {
"userId": "user_01JZ2Q1J4Y8P7M6N5K3H2G1F0E",
"name": "Ada Lovelace",
"email": "ada@example.com"
},
"spendCap": {
"amount": "5000.00",
"currency": "USD"
},
"spentAmount": {
"amount": "0.00",
"currency": "USD"
},
"spendControl": {
"limits": {
"transaction": {
"amount": "1000.00",
"currency": "USD"
},
"monthly": {
"amount": "5000.00",
"currency": "USD"
}
},
"spent": {
"monthly": {
"amount": "0.00",
"currency": "USD"
}
},
"atm": {
"dailyWithdrawal": {
"amount": "500.00",
"currency": "USD"
},
"dailyFrequency": 3
}
},
"restriction": {
"time": {
"start": "09:00",
"end": "18:00"
}
},
"createdAt": "2026-07-13T08:00:00.000Z",
"updatedAt": "2026-07-13T08:00:00.000Z"
}202 with status: "pendingApproval" instead of a card. See How do I set up approval workflows for my team? in the Help Center.Authorizations
Enter your API key
Headers
A unique value you choose for each new card, for example new-card-{userId}. Sending the same key again with the same body returns the original result instead of creating a second card; reusing it with a different body returns IDEMPOTENCY_KEY_REUSED.
Body
The kind of card to create. Only virtual cards can be created through the API.
"virtual"A nickname for the card, up to 255 characters, shown in the dashboard and returned by the API. Say who or what the card is for, for example Ada – Marketing tools.
255\SThe userId of the team member who will hold the card, from List team members. The team member must have inviteStatus approved, or the request fails with CARDHOLDER_NOT_FOUND.
The ID of the card category, from List card categories. It labels what the card is for and doesn't limit where it can be used.
1How the card is funded: subscription (the default) draws on your shared credit within the card's limits, and topUp gives the card its own fixed budget, set in spendCap.
subscription, topUp Whether the card draws from your business's shared revolving budget. Leave it out or set it to false for top-up cards.
The date you want the card to expire (YYYY-MM-DD). Leave it out to use the standard expiry date.
^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))$The fixed budget for a top-up card, for example 500.00 USD. It's required when planType is topUp, and the card declines card transactions once it's used up.
Show child attributes
Show child attributes
Spending limits to put on the card: per card transaction, or per day, week, month, year or lifetime. Set only the ones you need.
Show child attributes
Show child attributes
The hours of the day when the card can be used, in UTC. Leave it out to allow use at any time.
Show child attributes
Show child attributes
An optional note saved with the card request, up to 255 characters, for example to explain the request to an approver.
255Response
Card created. You usually get the full card back; if it's still being set up, you get { id, status: pending } instead, and can fetch the URL in the Location header until the card is ready.
- Option 1
- Option 2
The card's unique ID. Use it with Retrieve a card, Freeze card and the other card endpoints.
Whether this is a virtual or a physical card.
virtual, physical Where the card is in its lifecycle: pending (a physical card not yet activated), active (ready to use), frozen (paused, can be unfrozen), inactive (not usable for another reason, such as a restricted or blocked card), expiring (a physical card within 90 days of its expiry date), expired or terminated (permanently closed).
pending, active, frozen, inactive, expiring, expired, terminated The card's nickname, set when the card was created or renamed with Edit card details.
The last four digits of the card number. To see the full card details, use Reveal card details.
The date the card expires (YYYY-MM-DD).
^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))$Whether the card draws from your business's shared revolving budget. It's always false for top-up cards.
How the card is funded: subscription (draws on shared credit within its limits), topUp (has its own fixed budget in spendCap) or physical (a physical card plan).
physical, subscription, topUp The display name of the card category chosen when the card was created, for example travel. It describes what the card is for and is different from each card transaction's category. To create a card with this category, pass its id from List card categories.
The team member the card belongs to.
Show child attributes
Show child attributes
The fixed budget set aside for the card; for top-up cards, this is how much the card can spend in total. Change it with Update spend control. Null if the card has no fixed budget.
Show child attributes
Show child attributes
How much has been spent on the card since it was created. For top-up cards, compare it with spendCap to see how much budget is left.
Show child attributes
Show child attributes
The card's spending limits, plus how much has been spent in each period so far.
Show child attributes
Show child attributes
Rules on when the card can be used. Change them with Update card usage restriction.
Show child attributes
Show child attributes
When the card was created, in UTC.
^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$When the card's details, limits or status last changed, in UTC.
^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$