Z Zise Developers 简体中文

Card details (first four and last four digits; never the full card number)

GET /v1/cards/{id} scope: cards:read
On behalf of a member · x-on-behalf-of required

⚠ balance, available_balance, and limits.* are integer strings in the smallest unit. Divide by 10^card_scale to obtain the amount; see the introduction.

available_balance is the available amount after subtracting authorized but unsettled holds. The compatibility field balance has the same value and can be used directly as the Available balance on the card. Do not subtract transaction amounts again in the client. For example, with 12.00 USD originally on the card and a 0.15 USD authorization hold, both fields return "11850000" (card_scale: 6, meaning 11.85 USD), without waiting for settlement. Authorization reversal releases the hold; settlement converts it into a final debit without deducting it twice. Read this endpoint again after transaction status changes. Settlement timing depends on the issuer's and merchant's processing.

limits_updatable indicates whether per-transaction, daily, and monthly limits can be changed. Do not show editing controls when it is false.

⚠ A 0 in limits means no user-defined limit, not a zero limit. All three values are 0 for new cards, and the product-level limits apply. Interpreting 0 as This card cannot be used would misrepresent every new card.

Display unrecognized status values unchanged. Key points: freezing / unfreezing are two transitional states, ending in frozen and active respectively. Merging them caused the production incident where unfreezing was followed by invalid card status and top-up failures. risk_frozen is imposed by our risk controls; neither merchants nor members can unfreeze it. Do not show a button that will always fail.

Path Parameters

FieldTypeRequiredDescription
id string Required Card ID. Accepted with or without the crd_ prefix.
FieldTypeRequiredDescription
x-on-behalf-of string Required The member on whose behalf to call.

Response

200OK. status values: pending · unactivated · active · freezing · unfreezing · frozen · suspended (suspended by operations; restored by operations) · risk_frozen · lost · reissuing · expired · closing · closed · replaced (the original card's terminal state after replacement, deliberately distinct from closed).
{
  "id": "crd_9f2c1b7a-3d51-4a2e-9c08-6b1f0d4e77aa",
  "product_id": "cpd_1",
  "status": "active",
  "form_factor": "virtual",
  "currency": "USD",
  "masked_pan": "5240********7890",
  "bin": "5240",
  "nickname": "日常订阅",
  "balance": "25000000",
  "available_balance": "25000000",
  "card_scale": 6,
  "expiry": "8/2029",
  "cvv_blocked": false,
  "limits_updatable": true,
  "limits": {
    "single": "0",
    "daily": "0",
    "monthly": "0"
  },
  "created_at": "2026-08-01T02:11:43.000Z",
  "updated_at": "2026-08-09T11:02:07.000Z"
}
404not_found: the card does not exist or does not belong to this member/merchant (the same response in both cases).
Request
curl -X GET 'https://api.zinfra.vip/v1/cards/{id}' \
  -H 'x-auth-token: Bearer $TOKEN' \
  -H 'x-on-behalf-of: $MEMBER_ID'
const res = await fetch("https://api.zinfra.vip/v1/cards/{id}", {
  method: "GET",
  headers: {
    "x-auth-token": "Bearer $TOKEN",
    "x-on-behalf-of": "$MEMBER_ID",
  },
});
// Keep monetary amounts as strings, never numbers.
const data = await res.json();
import requests

res = requests.get(
    "https://api.zinfra.vip/v1/cards/{id}",
    headers={
        "x-auth-token": "Bearer $TOKEN",
        "x-on-behalf-of": "$MEMBER_ID",
    },
)
# Use Decimal(str(...)) for amounts, not float.
data = res.json()
req, _ := http.NewRequest("GET", "https://api.zinfra.vip/v1/cards/{id}",
    nil)
req.Header.Set("x-auth-token", "Bearer $TOKEN")
req.Header.Set("x-on-behalf-of", "$MEMBER_ID")
res, err := http.DefaultClient.Do(req)
// Decode amount fields as string, not float64.
HttpRequest req = HttpRequest.newBuilder()
    .uri(URI.create("https://api.zinfra.vip/v1/cards/{id}"))
    .header("x-auth-token", "Bearer $TOKEN")
    .header("x-on-behalf-of", "$MEMBER_ID")
    .method("GET", HttpRequest.BodyPublishers.noBody())
    .build();
// Use String / BigDecimal for amounts, not double.
$ch = curl_init('https://api.zinfra.vip/v1/cards/{id}');
curl_setopt_array($ch, [
  CURLOPT_CUSTOMREQUEST => 'GET',
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_HTTPHEADER => [
    'x-auth-token: Bearer $TOKEN',
    'x-on-behalf-of: $MEMBER_ID',
  ],
]);
$res = curl_exec($ch);
// Use bcmath / strings for amounts, not floatval.
200
{
  "id": "crd_9f2c1b7a-3d51-4a2e-9c08-6b1f0d4e77aa",
  "product_id": "cpd_1",
  "status": "active",
  "form_factor": "virtual",
  "currency": "USD",
  "masked_pan": "5240********7890",
  "bin": "5240",
  "nickname": "日常订阅",
  "balance": "25000000",
  "available_balance": "25000000",
  "card_scale": 6,
  "expiry": "8/2029",
  "cvv_blocked": false,
  "limits_updatable": true,
  "limits": {
    "single": "0",
    "daily": "0",
    "monthly": "0"
  },
  "created_at": "2026-08-01T02:11:43.000Z",
  "updated_at": "2026-08-09T11:02:07.000Z"
}