---
title: "Reprint (re-issue) a card"
method: POST
path: "/v1/vendor_cards/{vendor_card_id}/reprint"
tags: ["Vendor card"]
---

# Reprint (re-issue) a card

`POST /v1/vendor_cards/{vendor_card_id}/reprint`

Re-issues a card, producing a new `VendorCard` (for example after a physical
card is lost or damaged). Authorized for admins or the cardholder.

Flow:
- The card's vendor must support re-issuing (`can_reprint?`), otherwise `412`.
- Shipping fields (`recipient_name`, `shipping_address`, `contact_phone`) are
  only valid for **physical** cards; sending them for a virtual card returns
  `422`.
- If the card is not already canceled, it is first canceled for reprint; if the
  cancellation cannot complete, the endpoint returns `412`.
- On success the newly issued card is returned.

The request body is optional; provide shipping details to redirect the
reprinted physical card.

## Path parameters

- `vendor_card_id` string, required

## Parameters

- `#/paths/~1v1~1merchants/get/parameters/0` — unresolved $ref

## Request body

- VendorCardReprint — Payload to re-issue (reprint) a card. All fields are optional. Shipping fields (`recipient_name`, `shipping_address`, `contact_phone`) apply to **physical** cards only — sending them for a virtual card returns `422`.
  - `recipient_name` string — Recipient full name for the reprinted physical card.
  - `contact_phone` string — Contact phone for the shipment.
  - `shipping_address` object — Shipping address for the reprinted physical card.
    - `street` string
    - `number` string
    - `municipality_id` integer
    - `complement` string

## Response `200`

The newly issued (reprinted) vendor card.

- VendorCard
  - `id` string — Card id. Cardda card ids are vendor-prefixed base64-encoded strings (e.g. `Q2FyZDoxMDIwNjQ5Mw==`), not UUIDs.
  - `user_id` string — Firebase user id of the cardholder (not a UUID).
  - `company_id` string, uuid
  - `type` 'AptoCard' | 'BrexCard' | 'Cards::Increase::Card' | 'Cards::Plh::Card' | 'DivvyCard' | 'Issuing::Relay::Card' | 'Issuing::Slash::Card' | 'MercuryCard' | 'MeshCard' | 'PomeloCard' | 'StripeCard' — Single Table Inheritance discriminator (issuing vendor / STI sub-class). A persisted column, so it always serializes into the row for **every** caller.
  - `name` string
  - `last4` string
  - `status` 'active' | 'inactive' | 'pending' | 'canceled'
  - `status_preference` string
  - `migrated` boolean
  - `usage` integer, nullable
  - `limit_amount` MoneyAmount, nullable — Monetary amount. All numeric fields are serialized as strings to preserve precision (BigDecimal).
    - `amount` string — Amount in the main currency unit (e.g., '3000.0' for 3,000 CLP, '176.0' for 176 USD).
    - `formatted` string — Human-readable formatted amount including currency symbol.
    - `cents` string — Amount in the currency's smallest subunit. For CLP (no subunits) this equals the main amount; for USD this is 100× the main amount.
    - `currency_iso` string — ISO 4217 currency code.
  - `limit_interval` 'daily' | 'weekly' | 'monthly' | 'yearly' | 'all_time' | 'per_authorization' — Current spending limit interval.
  - `limit_amount_preference` MoneyAmount, nullable — Monetary amount. All numeric fields are serialized as strings to preserve precision (BigDecimal).
    - `amount` string — Amount in the main currency unit (e.g., '3000.0' for 3,000 CLP, '176.0' for 176 USD).
    - `formatted` string — Human-readable formatted amount including currency symbol.
    - `cents` string — Amount in the currency's smallest subunit. For CLP (no subunits) this equals the main amount; for USD this is 100× the main amount.
    - `currency_iso` string — ISO 4217 currency code.
  - `limit_interval_preference` 'daily' | 'weekly' | 'monthly' | 'yearly' | 'all_time' | 'per_authorization', nullable — Requested spending limit interval.
  - `allocated_amount` MoneyAmount, nullable — Monetary amount. All numeric fields are serialized as strings to preserve precision (BigDecimal).
    - `amount` string — Amount in the main currency unit (e.g., '3000.0' for 3,000 CLP, '176.0' for 176 USD).
    - `formatted` string — Human-readable formatted amount including currency symbol.
    - `cents` string — Amount in the currency's smallest subunit. For CLP (no subunits) this equals the main amount; for USD this is 100× the main amount.
    - `currency_iso` string — ISO 4217 currency code.
  - `allocated_amount_preference` MoneyAmount, nullable — Monetary amount. All numeric fields are serialized as strings to preserve precision (BigDecimal).
    - `amount` string — Amount in the main currency unit (e.g., '3000.0' for 3,000 CLP, '176.0' for 176 USD).
    - `formatted` string — Human-readable formatted amount including currency symbol.
    - `cents` string — Amount in the currency's smallest subunit. For CLP (no subunits) this equals the main amount; for USD this is 100× the main amount.
    - `currency_iso` string — ISO 4217 currency code.
  - `allocation_interval_preference` 'daily' | 'weekly' | 'monthly' | 'yearly', nullable — Interval at which recurring allocations are applied.
  - `allocation_priority_preference` 'low' | 'mid' | 'high' | 'max', nullable — Priority level for fund allocation across multiple cards.
  - `recurring_allocation_amount_cents` integer, nullable — Recurring allocation amount in cents.
  - `remaining_balance` string, nullable — Actual amount the card can spend right now, as a decimal string in the card's currency (not cents). This is the minimum between the user's spending limit and the company's available balance.
  - `spent` integer
  - `company_expendable_balance_in_limit_currency` string, nullable — Company funds this card can still draw, expressed in the card's `limit_currency`, as a decimal string (a BigDecimal serialized to JSON, not a number). **Show-only** — returned by `GET /v1/vendor_cards/{id}` only, and only when the caller can read the company balance (`policy(company).balance?`). Absent from the list endpoint.
  - `spent_in_interval_with_limit_currency` number, float — Amount spent in the current limit interval, converted to the card's `limit_currency`. Always a number (defaults to `0.0`); never `null`. **Show-only** — returned by `GET /v1/vendor_cards/{id}` only.
  - `vendor_max_spending_limits` unknown
  - `vendor_max_allocation` MoneyAmount, nullable — Monetary amount. All numeric fields are serialized as strings to preserve precision (BigDecimal).
    - `amount` string — Amount in the main currency unit (e.g., '3000.0' for 3,000 CLP, '176.0' for 176 USD).
    - `formatted` string — Human-readable formatted amount including currency symbol.
    - `cents` string — Amount in the currency's smallest subunit. For CLP (no subunits) this equals the main amount; for USD this is 100× the main amount.
    - `currency_iso` string — ISO 4217 currency code.
  - `non_sensitive_information` object, nullable — Non-sensitive cardholder/configuration attributes (`user_name`, `user_identifier`, `country`, `address`, `postal_code`, `restricted_merchants`, `phone`). Empty object when unavailable. **Show-only** — returned by `GET /v1/vendor_cards/{id}` only.
  - `last_allocation_transaction_status` string, nullable — Status of the most recent allocation transaction on this card. **Show-only** — returned by `GET /v1/vendor_cards/{id}` only.
  - `last_allocation_transaction_created_at` string, date-time, nullable — Creation timestamp of the most recent allocation transaction. **Show-only** — returned by `GET /v1/vendor_cards/{id}` only.
  - `allocation_priority_stats` object, nullable — Total recurring allocation (cents) per priority group across the company's active cards (e.g. `{ "low": 5000000, "mid": 3000000 }`), or `null` for card types that don't compute it. **Show-only** — returned by `GET /v1/vendor_cards/{id}` only.
  - `preference_restricted_spendable` string, nullable — Amount the card can still spend before hitting its configured spending limit, as a decimal string in the card's currency (not cents). Calculated as the spending limit minus amount already spent in the current interval. Unlike `remaining_balance`, this does not consider the company's available funds.
  - `spent_in_interval` number, float
  - `spent_in_vendor_interval` number, float
  - `fees_in_vendor_interval` number, float
  - `created_at` string, date-time
  - `updated_at` string, date-time

## Other responses

- `400` — Bad Request — reprint failed. `{ "error_code": "vendor_cards/reprint_failed" }`.
- `401` — Unauthorized
- `404` — Vendor card not found (or not visible to the caller).
- `412` — Precondition Failed — card type does not support re-issuing, or the card could not be canceled for reprint.
- `422` — Unprocessable Entity — shipping fields sent for a virtual card, or validation failed on the new card. Body: `{ "message": ..., "errors": {...} }`.

---

[API](https://skmtc.net/cardda/apis/banking-api.md) · [All operations](https://skmtc.net/cardda/apis/banking-api/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/cardda/banking-api/revisions/ff1aeb3fda8b/schema)
