Following card spend

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.
📘

Experimental

Card, 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:read for cards, experimental:request:read for requests, experimental:transaction:read for transactions. All these endpoints only read data.
  • With an organisation-level key, send the X-Company-Id header on every call — see Organisation-level access.

How it fits together

  1. An employee asks for a card with a spend request — a single purchase, a subscription, a multi-use card, or a top-up.
  2. Once approved, the request becomes a card.
  3. Each payment with the card is a transaction: settled when it goes through, declined when it does not.
  4. 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

EndpointFieldsUnit
CardsavailableBalance, spendingLimit, subscriptionBudget.*, request.amountMajor units — 375 is 375.00 EUR
RequestsrequestedAmountSmallest unit — 25000 is 250.00 EUR
RequestsminAmount, maxAmount filtersMajor units, in the company's currency
TransactionsamountBilled, amountDeclared, fxFeeAmountSmallest unit — 15000 is 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:

FieldMeaning
type, statusThe kind of card, and whether it can be used
ownerThe cardholder (id, label)
availableBalance, spendingLimit, currencyWhat can still be spent, and the card's limit
recurrence, subscriptionBudgetFor subscriptions: how often it renews, and its declared, spent and available budget
supplier, costCenterWhere the spend goes, when the card is tied to them
requestThe request the card comes from: id, label, and the amount declared
lastSuccessfulPaymentTimeThe last settled payment — null means the card has never been used
expiryDate, multiUseCardExpiryDateThe expiry printed on the card, and for a multi-use card the end date chosen by the requester
blockingReasonThe 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); endedAt is null while 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 returns 404 when 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 TransactionsGet Failed Transactions
Pagination30 per pageNone: every match in one call
Default periodAllThe last 30 days — pass startDate to go further back
createdAtWhen the payment settledWhen the decline was recorded
merchantNameThe linked supplier's nameThe raw card-network descriptor
CurrenciesamountBilled and fxFeeAmount in the company's account currency — they can be totalledEach amount in the transaction's own currency
Alsosupplierreason, 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: amountDeclared is in the merchant's currency, which varies from one payment to the next.
  • Helping a cardholder with a declined payment: reason says why, remediation what to do next.
  • The older GET /v1/transactions endpoint 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

Last checked against the Spendesk demo environment on 29 September 2026.