Follow your company's cards, the spend requests behind them, and the card payments — settled and declined.
Spendesk cards are created from approved spend requests, and every payment made with them is recorded as a transaction — settled, or declined. Through the API you can:
- follow the cards — balances, limits, subscription budgets, who holds them, why one is blocked;
- follow the requests behind them — what is waiting for approval, and who has to approve it;
- follow card payments — settled transactions for reconciliation, declined ones to help cardholders.
ExperimentalCard, request and transaction endpoints are experimental: they may still change. Request access from your CSM or at [email protected] — see Getting access.
Before you start
- Scopes:
experimental:card:readfor cards,experimental:request:readfor requests,experimental:transaction:readfor transactions. All these endpoints only read data. - With an organisation-level key, send the
X-Company-Idheader on every call — see Organisation-level access.
How it fits together
- An employee asks for a card with a spend request — a single purchase, a subscription, a multi-use card, or a top-up.
- Once approved, the request becomes a card.
- Each payment with the card is a transaction: settled when it goes through, declined when it does not.
- Settled payments then become payables, prepared and exported like any other spend — see What is Spend Data?.
Amounts are not in the same unit everywhere
Endpoint Fields Unit Cards availableBalance,spendingLimit,subscriptionBudget.*,request.amountMajor units — 375is 375.00 EURRequests requestedAmountSmallest unit — 25000is 250.00 EURRequests minAmount,maxAmountfiltersMajor units, in the company's currency Transactions amountBilled,amountDeclared,fxFeeAmountSmallest unit — 15000is 150.00 EUR
1. Cards
Get Cards lists the company's cards, 30 per page, filtered by type (single_purchase, subscription, physical, multi_use), status, userId (the holder), or creation date (createdAfter, createdBefore, as YYYY-MM-DD):
curl -G https://public-api.spendesk.com/v1/cards \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
--data-urlencode "type=subscription" \
--data-urlencode "status=Active"The status filter is case-sensitive and takes the values the cards return — Active or Blocked, not active.
Each card carries:
| Field | Meaning |
|---|---|
type, status | The kind of card, and whether it can be used |
owner | The cardholder (id, label) |
availableBalance, spendingLimit, currency | What can still be spent, and the card's limit |
recurrence, subscriptionBudget | For subscriptions: how often it renews, and its declared, spent and available budget |
supplier, costCenter | Where the spend goes, when the card is tied to them |
request | The request the card comes from: id, label, and the amount declared |
lastSuccessfulPaymentTime | The last settled payment — null means the card has never been used |
expiryDate, multiUseCardExpiryDate | The expiry printed on the card, and for a multi-use card the end date chosen by the requester |
blockingReason | The main reason the card is blocked |
Get a Card returns one card by ID.
- Why is a card blocked? Get a Card Blocking History lists every block, past and active, with its
initiator(user,support,scheduledDeactivation,automatic,controlRule,internal);endedAtisnullwhile it is active. A card can be blocked without a reason in either place — a single-purchase card after its payment, for example — so don't rely on them alone. - Where is a physical card? Get a Card Order returns the shipping
state(to_pickup,to_ship,shipped), tracking link and dates. It returns404when the card was never physically ordered.
2. Requests
Get Requests lists spend requests, 30 per page, filtered by type, state (pending, approved, refused, cancelled…), requesterId, supplierId, creation date, or amount (minAmount, maxAmount, in major units). Add withApproval=true to see the approval chain:
curl -G https://public-api.spendesk.com/v1/requests \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
--data-urlencode "state=pending" \
--data-urlencode "withApproval=true"{
"approval": {
"isAutoApproved": false,
"autoApprovalReason": null,
"steps": [
{
"state": "current",
"approvers": [{ "type": "user", "userId": "pmhsuj1ddcy562", "actingUserId": null, "isDelegated": false }],
"decision": null
}
]
}
}The step whose state is current is the one being waited on; its approvers are who has to act. Get Users turns their IDs into names. Each request also has an appUrl that opens it in Spendesk. Get a Request returns one request.
3. Card transactions
Settled and declined payments come from two endpoints that do not work the same way:
| Get Successful Transactions | Get Failed Transactions | |
|---|---|---|
| Pagination | 30 per page | None: every match in one call |
| Default period | All | The last 30 days — pass startDate to go further back |
createdAt | When the payment settled | When the decline was recorded |
merchantName | The linked supplier's name | The raw card-network descriptor |
| Currencies | amountBilled and fxFeeAmount in the company's account currency — they can be totalled | Each amount in the transaction's own currency |
| Also | supplier | reason, reasonCode, remediation, user, cardBalanceAtTransaction |
Both filter by startDate, endDate (YYYY-MM-DD, end day included), userId and cardId:
curl -G https://public-api.spendesk.com/v1/transactions/successful \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
--data-urlencode "startDate=2026-08-01" \
--data-urlencode "endDate=2026-08-31"- For a full view of a period, call both endpoints and merge the results.
- Never add up amounts in different currencies:
amountDeclaredis in the merchant's currency, which varies from one payment to the next. - Helping a cardholder with a declined payment:
reasonsays why,remediationwhat to do next. - The older
GET /v1/transactionsendpoint is deprecated: use the two above.
With an AI assistant
Connected through the Spendesk MCP server, an assistant can answer these questions for you:
How many spend requests are waiting for approval, how long have they been waiting, and who requested them?
Which card payments were declined last month, and why?
Good to know
- Cards and transactions are not the accounting record. For bookkeeping, use payables — see What is Spend Data? and Exporting accounting data.
- Check the unit of every amount — the table in How it fits together.
- Data may be cached for a short period: a payment or request made a moment ago may appear a little later.
Last checked against the Spendesk demo environment on 29 September 2026.