Skip to main content

📄 Guide

Issuing always starts with a virtual card: POST /open-api-corp/card/v1/apply returns an cardApplyId on acceptance; risk checks and card creation run fully asynchronously, with the final state pushed via the webhooks CARD_CREATED / CARD_REJECTED and GET /open-api-corp/card/v1/query-apply as the polling fallback. Once the card is created, use the cardId for single-card and list queries. For where this chain sits among the card pages, see Managing cards.

Applying for a virtual card

Request parameters

The four cardProfileId types and their subjectType pairing

A card type is the combination of two orthogonal dimensions: the holder (who the card is issued to) × the balance mode (which account the money comes from). For the full card-type introduction see Overview · Card types.
Per regulatory requirements, a company card must designate a current employee of the company as its custodian. The custodian is who gets contacted when something is wrong with the card, and who completes verification when a purchase triggers a 3DS challenge.

Binding rules with ruleIds

Every rule in ruleIds must simultaneously: exist, belong to the same company, and be ACTIVE; a rule that configures amount limits must share at least one currency with the card’s settlement currencies. The array must not contain duplicates — carrying the same rule twice is rejected outright (it is not silently deduplicated), so deduplicate before submitting.
Any failing entry rejects the whole request (an early rejection before acceptance — no cardApplyId is produced); there is no partial success. After issuance you can still adjust the targets through the velocity endpoints — see Setting spend limits.

Request examples

Response data and example

Error codes

Related webhooks: CARD_CREATED / CARD_REJECTED.

Querying application progress

The only request parameter is cardApplyId (String, required, ≤20; the card application ID). Response data:
Error code: APPLY_NOT_FOUND — the application does not exist (or does not belong to your partnership).

Querying a single card

The only request parameter is cardId (String, required, ≤20; the card ID). Response data:
Error code: CARD_INVALID — the card does not exist / does not belong to your partnership / is not ACTIVE.

Listing cards

A paginated query over the cards under your partnership; all filters are optional: Response data: the paging envelope is page (current page, Integer), pageSize (page size, Integer), total (total count) and result (the cards); each element of result carries exactly the same fields as the single-card query response above (cardId / panFirst6 / panLast4 / organizationId / subjectType / subjectId / cardProfileId / cardNetwork / cardProfileId / currency / status).

Next steps