Token Lifecycle Management
Every token state change, who can trigger it, and the rule that keeps token status aligned with card status.
A token has a life: created, activated, possibly suspended and resumed, eventually deleted or replaced. Its expiry is normally tied to the expiry of the PAN it was provisioned from.
Managing that life is your responsibility, and it is the part of tokenization most often under-scoped. Provisioning is a project. Lifecycle is forever.
States and transitions
stateDiagram-v2
[*] --> Unmapped: provisioning starts
Unmapped --> Active: digitization.complete
Unmapped --> [*]: Digitization_Exception
Active --> Suspended: StopToken
Suspended --> Active: UnStopToken
Active --> Deleted: DeleteToken
Suspended --> Deleted: DeleteToken
Active --> Active: Replacement
Active --> Deleted: Deleted_from_device
Who can change a token's state
Two directions, and you need to handle both.
You call us
| Action | Endpoint | Use when |
|---|---|---|
| Activate | /token/activate | A token was provisioned but needs cardholder authentication before it can be used, and you have completed that authentication |
| Suspend | /token/stop | Temporarily block the token |
| Resume | /token/unstop | Undo a suspension |
| Delete | /token/delete | Permanently remove the token |
All four take card_id. token_reference is the Token Unique Reference you stored from digitization.complete.
Stop and unstop can operate on the whole card. On/token/stopand/token/unstop,token_referenceis optional. Omit it and the action applies to every token on the card. That is usually what you want when a card is lost: one call, every device.On
/token/delete,token_referenceis required. Deletion is per token.
We call you
UnDosTres notifies you of every state change with an AdministrativeMessage, whoever triggered it.
messageName | Means |
|---|---|
digitization.event.Stopped | The token was suspended |
digitization.event.Digitized | A suspended token was resumed |
digitization.event.Deleted_from_device | The cardholder removed the token from that device's wallet |
digitization.event.Deleted | The token was removed entirely |
digitization.event.Replacement | The token was re-digitized or replaced, for example when the expiry date changed |
All five carry the same KLV set: 254 digitized pan, 255 wallet id, 910 device id, 911 pan expiry, 912 masked FPAN, 913 Token Unique Reference, 915 token requestor id, 923 event type, 924 event reason code. All five expect resultCode back.
You will receive events you did not trigger. A cardholder deleting a card from their phone generatesdigitization.event.Deleted_from_devicewith no API call from you. If your token store only updates when you call an endpoint, it will drift out of sync within days of launch. Update state on the callback, not on your own request.
Reason codes
/token/stop, /token/unstop and /token/delete all take a reason:
| Code | Reason |
|---|---|
| 1 | Card lost |
| 2 | Card stolen |
| 3 | Pending query |
| 4 | Card consolidation |
| 5 | Card inactive |
| 6 | PIN tries exceeded |
| 7 | Suspected fraud |
| 8 | Card replaced |
| 9 | Card re-issued |
| 10 | Card schedule stop |
| 11 | Offline PIN tries exceeded |
When unstopping, use the same reason you used to stop.
/token/activate uses a different, shorter set:
| Code | Meaning |
|---|---|
A | Cardholder successfully authenticated prior to activation |
C | Cardholder successfully authenticated with a customer service agent |
Use C when a call centre agent did the authentication. It is what distinguishes an agent-assisted activation in any later review, so it is worth getting right rather than defaulting everything to A.
All four endpoints accept an optional free-text comment, up to 500 characters. Use it. When someone investigates a token six months from now, "Cardholder reported lost, case INC-4471" is worth a great deal more than an empty field.
The rule that matters most
Map your card statuses onto token statuses, and enforce it automatically.
You have your own card lifecycle, with whatever statuses your business uses. Tokens have three practical states: active, temporarily suspended, and deleted. Every card status you support needs a defined token consequence.
The one that causes real harm if missed:
If a card is permanently closed, its tokens must be deleted. A closed card whose tokens are still active leaves a live payment credential sitting in a cardholder's phone. Deleting the card in your system does nothing to the wallet on its own. You must call/token/deletefor each token, or/token/stopwithout atoken_referenceif the closure may be reversed.
A suggested mapping to adapt:
| Your card status | Token action |
|---|---|
| Active | Tokens active |
| Temporarily blocked by the cardholder | /token/stop, no token_reference |
| Unblocked | /token/unstop |
| Reported lost or stolen | /token/stop reason 1 or 2, then /token/delete once confirmed |
| Suspected fraud | /token/stop reason 7 |
| Expired and reissued | See below. Do not delete |
| Permanently closed | /token/delete for every token |
Review your account statuses too, not just card statuses. If closing an account closes its cards, the token consequence has to follow.
Card renewal and replacement
When a card is renewed or replaced, the token does not have to be re-provisioned. The token-to-PAN mapping is updated behind the scenes, and the cardholder keeps paying with their phone without touching anything. The wallet may show updated last-four digits.
You will see digitization.event.Replacement when this happens.
Do not delete tokens on renewal. Deleting them forces every cardholder to re-add their card to every wallet, which is a support incident and an avoidable drop in wallet activity.
Visibility
Two read endpoints, and the difference matters:
| Endpoint | Returns |
|---|---|
| ListActiveTokens | Only tokens currently active on the card |
| ListAllTokens | Every token ever created on the card, plus provisioning_status_code and provisioning_status_description |
Use ListActiveTokens for anything a cardholder sees, such as "your card is in 2 wallets". Use ListAllTokens for support and investigation, because it is the only one that shows failed and deleted attempts.
Neither is a substitute for your own token store. Store what arrives on the callbacks; use these to reconcile.
Related
- Use Cases and Runbook — the situation-to-action lookup
- Manual Provisioning
- Tokenization Overview — token states explained
Updated about 2 hours ago

