Skip to main content
API access is available only in Live. Issuance requires approved verification and an enabled card integration. The Sandbox console can be used to explore the flow without real funds. Publishing this guide does not activate credentials or card issuance.

Standard pricing

Card issuance costs 2 USD, with no additional fee on the initial card balance. The minimum initial balance is 10 USD. Funding 10 USD therefore requires 12 USD from the company balance. Individual company tariffs may differ. Always request a quote; its amount is the balance added to the card, fixedFee is the issuance charge, percentageFee is zero for card funding, and total is the amount reserved from the company account.

Before you start

After verification, select Live and create an API key in Developers with holders:write, holders:read, services:read, cards:read, cards:write, and operations:read. Keep the key on your server. The production address is https://business.planewallet.org. Set PLANE_API_BASE to that base URL and PLANE_API_KEY to your key. All examples below run from your backend.

1. Fund the card account

Use the Live console’s card-account funding flow. Check the account balance before submitting a card issuance. Direct invoice API access requires its separately enabled funding capability; see Funding.

2. Create a cardholder

Save the returned id as HOLDER_ID. Complete the holder’s billing profile and verification before issuance. An external ID must be unique within your company and environment. Holder creation does not use an idempotency header: after an uncertain response, look up the holder before creating another.

3. Select a product and quote

Read GET /api/v1/products. Choose a product with kind: "card" and the issue capability. Respect its minimum and maximum. Replace CARD_PRODUCT_ID below with the returned product ID.
The response separates amount, fee, and total. Copy total exactly into expectedTotal. Do not hardcode a fee; company pricing can differ.

4. Submit once

Replace HOLDER_ID and QUOTED_TOTAL before sending. Persist the idempotency key and returned operation id in your database. Retrying an uncertain request must use the same key and body.

5. Confirm the result

Read GET /api/v1/operations/{id} until the status becomes completed or failed, or handle an operation.completed webhook. A completed issuance contains result.cardId. Retrieve the masked card through GET /api/v1/cards. queued, processing, and provider_pending are not successful issuance. manual_review requires reconciliation; do not create a replacement order. See operation lifecycle and card details. The separate card-account deposit fee is 1.5% of the amount credited and includes the issuer deduction. A whole-dollar deposit nominal of 100 USD produces 99 USD of credit, with a 1.49 USD total fee and 100.49 USDT wallet debit before TRX network fees. It is not charged again when moving account funds to a card. See Funding.