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.
Try it in Postman. The companion collection Spendesk API — Card spend guide runs every request of this page in order, passing IDs from one to the next; it only reads data. Fork it, select the Spendesk Sandbox environment, fill in clientId, clientSecret — and companyId with an organisation-level credential — then follow the ▶️ links below.
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
Try it in Postman: 1.1 List active cards · 1.2 Read a card · 1.3 Why is it blocked? · 1.4 Where is the physical card?
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
Try it in Postman: 2.1 Requests waiting for approval · 2.2 Read a request
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
Try it in Postman: 3.1 Settled card payments · 3.2 The card's settled payments · 3.3 Declined card payments
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.