Cards in terminal states (lost, stolen, expired, cancelled)

Explains why lost, stolen, expired or cancelled cards never appear in the card list, and how to read one specific card.

โ†“ Download skill (.md)
77/100ยท๐Ÿ“† MonthlyยทIntermediateControllerFinance Analyst
CardsCompliancelist_cards

๐ŸŽฏ Skill purpose

Explains why lost, stolen, expired or cancelled cards never appear in the card list, and how to read one specific card.

๐Ÿ“Š What it produces

List of out-of-service cards with status, owner, and last activity date.

โšก Benefit

Before

No consolidated view of inactive cards โ€” multiple manual filters required.

After

Complete out-of-service card table in one query, ready for security reporting.



# Instructions

## Use case

Identify cards in a terminal state for security workflows (blocking lost/stolen cards) or cleanup (expired or cancelled cards).

## Full card lifecycle

```
PRE (pre-active)
  โ†“
ACT (active) โ†โ†’ BLO (blocked)
                    โ†“
                  REA (reactivated) โ†’ ACT

Terminal states โ€” IRREVERSIBLE:
  LOS  โ€” Lost
  STO  โ€” Stolen
  DAM  โ€” Damaged
  EXP  โ€” Expired (reached expiry date)
  CAN  โ€” Cancelled (manually cancelled)
  ABO  โ€” Aborted

Other code: CMD โ€” legacy code, returned with the label "Unknown" (not listed as terminal)
  CBL  โ€” Hidden (disabled; not listed among terminal states by the server)
```

## Pitfall โ€” one status per call

`list_cards.status` is a **plain string** (not an array). Warning: `list_cards` NEVER returns Lost, Stolen, Damaged, Expired or Cancelled cards โ€” filtering on those statuses returns an empty list, which must not be read as "no such cards". Those cards can only be read by ID with `get_card`. The calls below therefore return an empty list for LOS, STO, EXP and CAN:

```json
// Only these filters can return cards through list_cards
{ "companyId": "<COMPANY_ID>", "status": "Blocked", "pageSize": 100 }
{ "companyId": "<COMPANY_ID>", "status": "Hidden", "pageSize": 100 }
```

โ†’ For a lost, stolen, damaged, expired or cancelled card, you need its ID and a `get_card` call: there is no way to list them. An empty list on those statuses never means "no such card".

## Distinguishing terminal vs non-terminal

| Status | Terminal? | Can return to ACT? | Use case |
|--------|-----------|-------------------|----------|
| ACT | No | โ€” | Current |
| BLO | No | Yes (via REA) | Temporarily blocked |
| REA | No | โ€” | Reactivated after BLO |
| PRE | No | Yes | Awaiting activation |
| LOS | **Yes** | โŒ No | Loss declaration |
| STO | **Yes** | โŒ No | Theft declaration |
| DAM | **Yes** | โŒ No | Physically damaged card |
| EXP | **Yes** | โŒ No | Expiry date reached |
| CAN | **Yes** | โŒ No | Manual cancellation |
| CMD | **Yes** | โŒ No | Compromise detected |
| CBL | **Yes** | โŒ No | Disabled/hidden |

## Data available on a terminal card

Cards in a terminal state return the same fields as ACT cards:
```json
{
  "id": "...",
  "type": "Subscription card",
  "status": "Cancelled",
  "lastFourDigits": "1234",
  "expiryDate": "2025-12-31T23:59:59.000Z",
  "owner": { "id": "<userId>", "label": "<name>" },
  "currency": "EUR",
  "availableBalance": { ... },   // potential residual balance
  "spendingLimit": { ... }
}
```

If `availableBalance > 0` on a cancelled or expired card, a refund may be pending.

## Limitations observed on this account

- `status: "EXP"` โ†’ 0 results โ€” expected behaviour: `list_cards` never returns Lost, Stolen, Damaged, Expired or Cancelled cards; read them by ID with `get_card`
- `status: "CAN"`, `status: "BLO"`, etc. โ†’ not tested on this account due to an MCP connection instability

## PAN and CVV never returned

The full card number (PAN) and the CVV are never returned by the MCP โ€” only the last 4 digits (`lastFourDigits`). This is a security limitation by design.

## Example user prompts

- "Are there any lost or stolen cards active on the account?"
- "Show me all cards cancelled this quarter"
- "Which expired cards still have a positive balance?"

How to install this skill

/
  1. 1
    Download the file s30-cartes-statuts-terminaux.md using the button above.
  2. 2
    Place the file in the .claude/ directory of your project (or ~/.claude/ for a global install).
    cp s30-cartes-statuts-terminaux.md .claude/s30-cartes-statuts-terminaux.md
  3. 3
    Use in Claude Code โ€” the skill is automatically discovered. Describe your need in natural language and Claude will apply the skill instructions.
๐Ÿ’ก Make sure the Spendesk MCP is configured in your .claude/settings.json with the tools list_cards.

Similar skills

โ˜… Top
95/100ยท๐Ÿ” Ad hocยทExpert

Audit what the MCP covers

Probes all available MCP tools, re-evaluates coverage of 50 persona use cases, detects new fields or tools, and regenerates the gap analysis report.

CFOControllerAP Manager
90/100ยท๐Ÿ“… WeeklyยทBeginner

Card requests via get_requests

Explains how to use get_requests for card requests and why expense reimbursements don't appear there. Avoids a frequent source of confusion between two distinct workflows.

ControllerFinance Analyst
90/100ยท๐Ÿ” Ad hocยทIntermediate

Active vs archived cost centers

Distinguishes active cost centers from archived ones with correct use of get_cost_centers. Avoids the counter-intuitive isArchived vs isActive naming convention pitfall.

ControllerFinance Analyst

Interested in AI Agent services or Custom Integrations?