Skip to main content
Nuvion lets you issue two types of virtual cards on behalf of your entities: disposable single-use cards for one-off payments, and reusable virtual cards with configurable spending controls at the transaction, daily, and billing-cycle level. Both card types are funded from an existing entity account and can be reassigned, frozen, unfrozen, or soft-deleted at any time.

Card types

TypeDescriptionUse case
disposableSingle-use virtual card. Automatically blocked after the first successful transaction.Ad-hoc vendor payments, one-time subscriptions
virtualReusable card with optional spending controls (limits by amount, transaction count, MCC).Employee expense cards, recurring vendor payments
physicalPhysical card issued and mailed to the cardholder. Managed via the same card endpoints.Consumer wallets, debit card programs

Card statuses

StatusDescription
activeCard is in good standing and can be used for transactions.
blockedCard is frozen or has been soft-deleted. No new transactions are authorized.
fraudCard has been flagged for suspected fraud. Contact support to resolve.

Create a disposable card

Issues a single-use virtual card funded from the specified account. The card is automatically blocked after its first successful transaction.
curl -X POST https://api.nuvion.dev/disposable-cards \
  -H "Authorization: Bearer $NUVION_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "account_id": "acc_01HXYZ5678EFGHIJKLMNOP",
    "card_name": "Alex Travel Card",
    "cardholder": {
      "email": "alex.johnson@example.com",
      "first_name": "Alex",
      "last_name": "Johnson",
      "phone_number": "+12125550198"
    },
    "currency": "USD",
    "amount": 10000,
    "expiration_month": "12",
    "expiration_year": "27"
  }'
account_id
string
required
The ID of the account to fund the card from. Must be 26 characters.
card_name
string
required
A display name for the card. Used to identify the card in listings and the dashboard.
cardholder
object
required
Details of the cardholder to associate with this card.
currency
string
required
The ISO 4217 currency code for the card. Must be 3 characters (e.g. USD).
amount
number
required
The amount to load onto the card in the smallest currency unit. 10000 = $100.00 USD.
expiration_month
string
required
The card expiration month in MM format (e.g. "12").
expiration_year
string
required
The card expiration year in YY format (e.g. "27").
metadata
object
Arbitrary key-value pairs you can attach to the card for your own reference. Not used by Nuvion.
{
  "message": "Virtual card created successfully",
  "status": "success",
  "data": {
    "status": "active",
    "id": "crd_01HXYZ9012ABCD",
    "name": "Alex Travel Card",
    "number": "4111111111111234",
    "expiration_month": "12",
    "expiration_year": "27",
    "cvv": "123",
    "individual_controls": {},
    "individual_mcc_controls": [],
    "mcc_group_controls": []
  }
}
status
string
Card status. One of active, blocked, or fraud.
id
string
Unique identifier for the card.
name
string
The display name assigned to the card.
number
string
The full card number (PAN). Treat as sensitive — never log or store.
expiration_month
string
Card expiration month (MM).
expiration_year
string
Card expiration year (YY).
cvv
string
Card verification value. Treat as sensitive — never log or store.
individual_controls
object
Spending controls applied to this card. Empty object for disposable cards.
individual_mcc_controls
array
MCC-specific spending controls. Empty array for disposable cards.
mcc_group_controls
array
MCC group spending controls. Empty array for disposable cards.
Error codes: 400 Bad Request, 401 Unauthorized, 404 Not Found, 429 Too Many Requests (includes retry_after, limit_type, current_count, limit), 500 Internal Server Error.

Create a virtual card

Issues a reusable virtual card with optional spending controls. Controls can restrict by transaction amount, daily limits, billing cycle totals, and specific merchant category codes (MCCs).
curl -X POST https://api.nuvion.dev/virtual-cards \
  -H "Authorization: Bearer $NUVION_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "account_id": "acc_01HXYZ5678EFGHIJKLMNOP",
    "card_name": "Alex Travel Card",
    "currency": "USD",
    "amount": 10000,
    "cardholder": {
      "email": "alex.johnson@example.com",
      "first_name": "Alex",
      "last_name": "Johnson",
      "phone_number": "+12125550198"
    },
    "individual_controls": {
      "billing_cycle": "Weekly",
      "billing_cycle_day": "Sunday",
      "daily_amount_limit": 50000,
      "daily_transaction_count": 10,
      "transaction_amount_limit": 20000
    }
  }'
account_id
string
required
The ID of the account to fund the card from. Must be 26 characters.
card_name
string
required
A display name for the card.
currency
string
required
The ISO 4217 currency code for the card (e.g. USD). Must be 3 characters.
amount
number
required
The amount to load onto the card in the smallest currency unit. 10000 = $100.00 USD.
cardholder
object
required
Details of the cardholder to associate with this card.
set_alert_service_flag
boolean
When true, enables transaction alerts for this card. Defaults to false.
metadata
object
Arbitrary key-value pairs for your own reference.
individual_controls
object
General spending controls applied to this card. All fields are optional.
individual_mcc_controls
array
Per-MCC spending controls. Each entry targets a specific merchant category code.
mcc_group_controls
array
Spending controls applied to a named group of MCCs.
{
  "message": "Ghost card created successfully",
  "status": "success",
  "data": {
    "status": "active",
    "id": "crd_01HXYZ9012ABCD",
    "name": "Alex Travel Card",
    "number": "4111111111111234",
    "expiration_month": "12",
    "expiration_year": "27",
    "cvv": "123",
    "individual_controls": {
      "billing_cycle": "Weekly",
      "billing_cycle_day": "Sunday",
      "cycle_transaction_count": 0,
      "daily_amount_limit": 50000,
      "daily_transaction_count": 10,
      "transaction_amount_limit": 20000
    },
    "individual_mcc_controls": [],
    "mcc_group_controls": [],
    "created": 1735725600000
  }
}
status
string
Card status. One of active, blocked, or fraud.
id
string
Unique identifier for the card.
name
string
The display name assigned to the card.
number
string
The full card number (PAN). Treat as sensitive.
expiration_month
string
Card expiration month (MM).
expiration_year
string
Card expiration year (YY).
cvv
string
Card verification value. Treat as sensitive.
individual_controls
object
The resolved spending controls on this card.
individual_mcc_controls
array
Resolved per-MCC controls. Each entry includes all limit fields plus mcc and open.
mcc_group_controls
array
Resolved MCC group controls. Each entry includes group_name, open, and applicable limit fields.
created
number
Unix timestamp in milliseconds when the card was created.
Error codes: 400 Bad Request, 401 Unauthorized, 404 Not Found, 429 Too Many Requests, 500 Internal Server Error.

List cards

Returns a paginated list of cards for an entity. Soft-deleted cards are excluded. Frozen and blocked cards are included.
If account_id is omitted, this endpoint returns all cards across all accounts for the authenticated entity.
curl -G https://api.nuvion.dev/cards \
  -H "Authorization: Bearer $NUVION_API_KEY" \
  --data-urlencode "account_id=acc_01HXYZ5678EFGHIJKLMNOP" \
  --data-urlencode "limit=20"
account_id
string
Filter cards by account. Must be 26 characters. If omitted, returns all cards for the entity.
limit
number
Number of cards to return per page. Default 20, maximum 100.
cursor
string
Cursor for forward pagination. Use the next_cursor value from the previous response.
prev_cursor
string
Cursor for backward pagination. Use the prev_cursor value from the previous response.
{
  "data": {
    "cards": [
      {
        "id": "crd_01HXYZ9012ABCD",
        "name": "Alex Travel Card",
        "status": "active",
        "created": "2026-01-01T10:00:00.000Z"
      }
    ],
    "pagination": {
      "has_next": false,
      "has_previous": false,
      "next_cursor": null,
      "prev_cursor": null
    }
  }
}
data.cards
array
Array of card summary objects.
data.pagination
object
Pagination metadata.
Error codes: 400 Bad Request, 401 Unauthorized, 403 Forbidden, 500 Internal Server Error (includes error_code, retry_recommended, support_reference).

Get card details

Returns full details for a single card, including sensitive card credentials, all spending controls, and real-time usage tracking (amount used, on hold, and remaining balance per limit dimension).
curl https://api.nuvion.dev/card-details/crd_01HXYZ9012ABCD \
  -H "Authorization: Bearer $NUVION_API_KEY"
{
  "data": {
    "status": "active",
    "id": "crd_01HXYZ9012ABCD",
    "type": "virtual",
    "first_name": "Alex",
    "last_name": "Johnson",
    "number": "4111111111111234",
    "expiration_month": "12",
    "expiration_year": "27",
    "cvv": "123",
    "individual_controls": {
      "billing_cycle": "Weekly",
      "billing_cycle_day": "Sunday",
      "cycle_transaction_count": 20,
      "daily_amount_limit": 50000,
      "daily_transaction_count": 10,
      "transaction_amount_limit": 20000,
      "amount_used": 5000,
      "amount_hold": 0,
      "amount_balance": 5000,
      "daily_transaction_count_used": 1,
      "daily_transaction_count_hold": 0,
      "daily_transaction_count_balance": 9,
      "daily_amount_limit_used": 5000,
      "daily_amount_limit_hold": 0,
      "daily_amount_limit_balance": 45000,
      "cycle_transaction_count_used": 1,
      "cycle_transaction_count_hold": 0,
      "cycle_transaction_count_balance": 19
    },
    "individual_mcc_controls": [],
    "mcc_group_controls": [],
    "billing": {
      "address_line_1": "350 Fifth Avenue",
      "address_line_2": "Suite 4100",
      "city": "New York",
      "state": "NY",
      "postal_code": "10001"
    },
    "shipping": null
  }
}
data.status
string
Card status. One of active, blocked, or fraud.
data.id
string
Unique identifier for the card.
data.type
string
Card type. One of disposable, virtual, or physical.
data.first_name
string
Cardholder’s first name.
data.last_name
string
Cardholder’s last name.
data.number
string
The full card number (PAN). Treat as sensitive.
data.expiration_month
string
Card expiration month (MM).
data.expiration_year
string
Card expiration year (YY).
data.cvv
string
Card verification value. Treat as sensitive.
data.individual_controls
object
Spending controls and real-time usage tracking for this card.
data.individual_mcc_controls
array
Per-MCC controls with usage tracking. Each entry includes all limit fields, _used, _hold, and _balance tracking fields, plus mcc and open.
data.mcc_group_controls
array
MCC group controls. Each entry includes group_name, open, and applicable limit and usage fields.
data.billing
object
The billing address on file for this card.
data.shipping
object
The shipping address for physical cards. null for virtual and disposable cards.
Error codes: 400 Bad Request, 401 Unauthorized, 403 Forbidden, 422 Unprocessable Entity, 500 Internal Server Error.

Get card transactions

Returns a paginated list of transactions made with a specific card.
curl https://api.nuvion.dev/card-transactions/crd_01HXYZ9012ABCD \
  -H "Authorization: Bearer $NUVION_API_KEY"
{
  "data": {
    "payments": [
      {
        "_id": "txn_01HXYZ3456WXYZ",
        "amount": 5000,
        "currency": "USD",
        "unique_reference": "TXN-2026-0001",
        "account_id": "acc_01HXYZ5678EFGHIJKLMNOP",
        "entity_id": "ent_01HXYZ1234ABCD",
        "counterparty_id": "cpt_01HXYZ7890EFGH",
        "status": "completed",
        "status_reason": null,
        "narration": "Online purchase",
        "type": "debit",
        "payment_type": "card",
        "applicable_fee": 0,
        "initiator": {
          "type": "card",
          "id": "usr_01HXYZ1111AAAA",
          "name": "Alex Johnson",
          "card_id": "crd_01HXYZ9012ABCD"
        },
        "recipient": {
          "name": "Acme Corp",
          "address": {
            "city": "San Francisco",
            "state": "CA",
            "postal_code": "94105",
            "country": "US"
          }
        },
        "meta": {
          "provider_code": "00"
        },
        "deleted": false,
        "created": 1735725600000,
        "updated": 1735725600000,
        "version": 1
      }
    ],
    "pagination": {
      "order": "desc",
      "has_next": false,
      "limit": 20,
      "has_previous": false,
      "next_cursor": null,
      "previous_cursor": null
    }
  }
}
data.payments
array
Array of card transaction objects.
data.pagination
object
Pagination metadata.
Error codes: 400 Bad Request, 401 Unauthorized, 403 Forbidden, 422 Unprocessable Entity, 500 Internal Server Error.

Manage a card

Freeze a card

Sets the card status to blocked. All authorization requests are declined while the card is frozen. The card record and spending history are preserved.
curl -X PATCH https://api.nuvion.dev/card-details/crd_01HXYZ9012ABCD/freeze \
  -H "Authorization: Bearer $NUVION_API_KEY"
{
  "data": {
    "status": "blocked",
    "updated": 1735725600000
  }
}
Error codes: 400 Bad Request, 401 Unauthorized, 500 Internal Server Error.

Unfreeze a card

Restores a frozen card to active status. Subsequent authorization requests are processed normally.
curl -X PATCH https://api.nuvion.dev/card-details/crd_01HXYZ9012ABCD/unfreeze \
  -H "Authorization: Bearer $NUVION_API_KEY"
{
  "data": {
    "status": "active",
    "updated": 1735725600000
  }
}
Error codes: 400 Bad Request, 401 Unauthorized, 500 Internal Server Error.

Reassign card to a different account

Moves the card to a different account. If the target account’s currency differs from the card’s transaction currency, Nuvion automatically applies FX conversion at the prevailing rate.
If the target account operates in a different currency, FX conversion is applied automatically. Review your platform’s FX rate agreement before reassigning cross-currency cards.
curl -X PATCH https://api.nuvion.dev/cards/crd_01HXYZ9012ABCD/account \
  -H "Authorization: Bearer $NUVION_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "account_id": "acc_01HXYZ5678EFGHIJKLMNOP"
  }'
account_id
string
required
The ID of the account to reassign the card to. Must be 26 characters. Returns 409 Conflict if the card is already assigned to this account.
{
  "data": {
    "card_id": "crd_01HXYZ9012ABCD",
    "account_id": "acc_01HXYZ5678EFGHIJKLMNOP"
  }
}
Error codes: 400 Bad Request, 401 Unauthorized, 404 Not Found, 409 Conflict (card already assigned to this account), 500 Internal Server Error.

Delete a card

Soft-deletes the card. The card is immediately blocked and removed from all card listings. The underlying record is retained for audit and transaction history purposes.
Deletion is not reversible. A deleted card cannot be reactivated. Issue a new card if the cardholder needs continued access.
curl -X DELETE https://api.nuvion.dev/card-details/crd_01HXYZ9012ABCD \
  -H "Authorization: Bearer $NUVION_API_KEY"
{
  "data": {
    "status": "blocked",
    "deleted": 1735725600000
  }
}
Error codes: 400 Bad Request, 401 Unauthorized, 500 Internal Server Error.

What’s next

Accounts

Understand how accounts are structured and how to fund a card from an entity account.

Accept a Payment

Accept inbound payments into entity accounts before loading cards.

Errors

Full reference for error codes, error object schema, and resolution guidance.