Manage issued card transactions beta
Authorization statuses
Whenever a card is used at a merchant, Moov processes the authorization request to check that the cardholder has enough funds to cover the cost of that particular transaction. The outcomes of an authorization request can be tracked through the card authorization API.
Understanding the status of each authorization helps you to address any issues that may arise:
| Status | Description |
|---|---|
pending |
The authorization has been approved, and funds are temporarily held pending final settlement |
declined |
The request was declined, possibly due to reasons like insufficient funds or an inactive card |
canceled |
The authorization was reversed by the merchant before final settlement |
cleared |
The transaction has been captured by the merchant and funds have moved |
expired |
The authorization expired before being settled by the merchant |
Track authorization by stage
Moov provides detailed tracking of each stage of the card authorization process, which can be accessed through the authorization events endpoint.
This endpoint returns an array of authorization events that have occurred, potentially leading to updates of the authorizedAmount and accompanying amount being held as pending on the wallet balance.
Here's a summary of the different types of authorization events we capture:
| Event type | Description |
|---|---|
authorization |
A new transaction authorization has been requested |
reversal |
Some amount of the authorization has been reversed |
authorization-advice |
The message type identifier of the initial ISO |
authorization-expiration |
Authorization hold expired, releasing the held funds |
clearing |
The merchant has captured the whole or a partial amount of the authorization |
authorization-incremental |
Request for increasing the initially authorized amount |
See below for an example of an authorization event:
[
{
"amount": "-14.89",
"createdOn": "2026-03-24T14:15:22Z",
"eventID": "ec7e1848-dc80-4ab0-8827-dd7fc0737b43",
"eventType": "authorization",
"result": "approved"
},
{
"amount": "-14.89",
"createdOn": "2026-03-26T14:15:22Z",
"eventID": "dc856489-de10-4816-b3cf-842639f4e2bc",
"eventType": "clearing",
"result": "approved"
}
]
View completed card transactions
To view all completed card transactions associated with a particular account, use the card transactions endpoint and include your customer's accountID. An example response is below:
[
{
"cardTransactionID": "string",
"issuedCardID": "string",
"fundingWalletID": "string",
"amount": "-14.89",
"authorizationID": "string",
"authorizedOn": "2016-08-24T14:15:22Z",
"merchantData": {
"networkID": "string",
"name": "Whole Body Fitness",
"city": "San Francisco",
"country": "US",
"postalCode": "94107",
"state": "CA",
"mcc": "7298"
},
"createdOn": "2016-08-24T14:15:22Z"
}
]
View card activity
All activities related to card issuing, such as authorizations and transactions, directly affect the balance of the associated Moov wallet. Each action creates a corresponding wallet transaction, providing a clear trail of funds movement. To learn more, read our wallet transactions guide.
issuing-auth-hold: Funds are reserved on the wallet balance due to an approved authorization. Any incremental authorizations result in additional wallet transactions reflecting the amount of the increment.issuing-auth-release: Held funds are released back to the wallet due to an authorization reversal, expiration, or when the authorization is cleared.issuing-transaction: Reflects funds moving out of the wallet from a cleared authorization, a refund, or a force post.
Each wallet transaction includes identifiers linking it directly to the issuing activity.
| transactionType | sourceType | sourceID |
|---|---|---|
issuing-auth-hold |
issuing-authorization |
authorizationID |
issuing-auth-release |
issuing-authorization |
authorizationID |
issuing-transaction |
issuing-transaction |
cardTransactionID |
Use the list spending card activity endpoint (supported with API v2026.10.00 and higher) to check and query a card's activity record for all settled and pending transactions.
Update an issued card
To update an issued card, use the update spending card endpoint. You can change the card's state, nickname, metadata, billingAddress, and spend controls. Each control you send replaces that control in full. Send null to remove a control. Once a card is closed, it cannot be updated.
Authorizations can only be approved while the card is active:
| State | Meaning |
|---|---|
active |
The card is operational and authorizations can be approved. |
frozen |
The card is temporarily suspended and authorizations cannot be approved. Set the state back to active to reactivate it. A card can move between frozen and active as often as needed. |
closed |
The card is permanently deactivated. A card is closed by request or when it expires, and cannot be reopened. |
For example, to freeze a card:
curl -X PATCH "https://api.moov.io/issuing/{accountID}/cards/{issuedCardID}" \
-H "Authorization: Bearer {token}" \
-H "X-Moov-Version: v2026.07.00" \
-d '{
"state": "frozen"
}'
const result = await moov.cardIssuing.update({
accountID: "44db31bc-2813-424b-9b8c-2d3f5f1300e3",
issuedCardID: "69ca2a7e-7bbc-4176-9d0c-2a1aa7143006",
updateIssuedCard: {
metadata: {
"optional": "metadata",
},
billingAddress: {
addressLine1: "123 Main Street",
addressLine2: "Apt 302",
city: "Boulder",
stateOrProvince: "CO",
postalCode: "80301",
country: "US",
},
controls: {
velocityLimits: [
{
amount: 10000,
interval: "daily",
},
],
},
},
});
res = moov.card_issuing.update(account_id="44db31bc-2813-424b-9b8c-2d3f5f1300e3", issued_card_id="69ca2a7e-7bbc-4176-9d0c-2a1aa7143006", metadata={
"optional": "metadata",
}, billing_address={
"address_line1": "123 Main Street",
"address_line2": "Apt 302",
"city": "Boulder",
"state_or_province": "CO",
"postal_code": "80301",
"country": "US",
}, controls=components.UpdateIssuingControls(
velocity_limits=[
components.IssuingVelocityLimit(
amount=10000,
interval=components.IssuingIntervalLimit.DAILY,
),
],
))
res = s.card_issuing.update(account_id: '44db31bc-2813-424b-9b8c-2d3f5f1300e3', issued_card_id: '69ca2a7e-7bbc-4176-9d0c-2a1aa7143006', update_issued_card: Models::Components::UpdateIssuedCard.new(
metadata: {
'optional' => 'metadata',
},
billing_address: Models::Components::BillingAddress.new(
address_line1: '123 Main Street',
address_line2: 'Apt 302',
city: 'Boulder',
state_or_province: 'CO',
postal_code: '80301',
country: 'US'
),
controls: Models::Components::UpdateIssuingControls.new(
velocity_limits: [
Models::Components::IssuingVelocityLimit.new(
amount: 10_000,
interval: Models::Components::IssuingIntervalLimit::DAILY
),
]
)
))
UpdateIssuedCardResponse res = sdk.cardIssuing().update()
.accountID("44db31bc-2813-424b-9b8c-2d3f5f1300e3")
.issuedCardID("69ca2a7e-7bbc-4176-9d0c-2a1aa7143006")
.updateIssuedCard(UpdateIssuedCard.builder()
.metadata(Map.ofEntries(
Map.entry("optional", "metadata")))
.billingAddress(BillingAddress.builder()
.addressLine1("123 Main Street")
.addressLine2("Apt 302")
.city("Boulder")
.stateOrProvince("CO")
.postalCode("80301")
.country("US")
.build())
.controls(UpdateIssuingControls.builder()
.velocityLimits(List.of(
IssuingVelocityLimit.builder()
.interval(IssuingIntervalLimit.DAILY)
.amount(10000L)
.build()))
.build())
.build())
.call();
var res = await sdk.CardIssuing.UpdateAsync(
accountID: "44db31bc-2813-424b-9b8c-2d3f5f1300e3",
issuedCardID: "69ca2a7e-7bbc-4176-9d0c-2a1aa7143006",
body: new UpdateIssuedCard() {
Metadata = new Dictionary<string, string>() {
{ "optional", "metadata" },
},
BillingAddress = new BillingAddress() {
AddressLine1 = "123 Main Street",
AddressLine2 = "Apt 302",
City = "Boulder",
StateOrProvince = "CO",
PostalCode = "80301",
Country = "US",
},
Controls = new UpdateIssuingControls() {
VelocityLimits = new List<IssuingVelocityLimit>() {
new IssuingVelocityLimit() {
Amount = 10000,
Interval = IssuingIntervalLimit.Daily,
},
},
},
}
);
$updateIssuedCard = new Components\UpdateIssuedCard(
metadata: [
'optional' => 'metadata',
],
billingAddress: new Components\BillingAddress(
addressLine1: '123 Main Street',
addressLine2: 'Apt 302',
city: 'Boulder',
stateOrProvince: 'CO',
postalCode: '80301',
country: 'US',
),
controls: new Components\UpdateIssuingControls(
velocityLimits: [
new Components\IssuingVelocityLimit(
amount: 10000,
interval: Components\IssuingIntervalLimit::Daily,
),
],
),
);
$response = $sdk->cardIssuing->update(
accountID: '44db31bc-2813-424b-9b8c-2d3f5f1300e3',
issuedCardID: '69ca2a7e-7bbc-4176-9d0c-2a1aa7143006',
updateIssuedCard: $updateIssuedCard
);
Get PCI details
If you've provided Moov with a PCI attestation, you can use the PCI endpoint to retrieve an issued card with PAN, CVV, and expiration.