> ## Documentation Index
> Fetch the complete documentation index at: https://docs.fluz.app/llms.txt
> Use this file to discover all available pages before exploring further.

# getCardProvisioningUrl

> Returns a short URL that, when opened on the end-user's mobile device, launches the Fluz App Clip (iOS) or Fluz app (Android) and adds the specified virtual card to Apple Pay / Google Pay.

Returns a short URL that, when opened on the end-user's mobile device,
launches the Fluz App Clip (iOS) or Fluz app (Android) and adds the
specified virtual card to Apple Pay / Google Pay.

Typical flow:

1. Developer creates a virtual card for a user via `createVirtualCard`
   and keeps the returned `virtualCardId`.
2. Developer calls `getCardProvisioningUrl` with that `virtualCardId`.
3. Developer surfaces the returned URL to the user (QR code, SMS, email,
   in-app button — anything that ends up on the user's mobile device).
4. User opens the URL within \`expiresAt\`. The App Clip / app handles
   the wallet provisioning.

Each URL targets exactly one card. To provision several cards, call this
once per card with each card's `virtualCardId`.

`offerId` remains supported for the single-card case. It resolves only
while the account holds at most one active card on that offer; beyond that
it cannot identify a card and the query fails rather than picking one.

Each call returns a fresh URL. The URL is opaque — it carries no credentials
in plaintext; user identity is exchanged server-side via a short-lived lookup
record (5-minute TTL). Treat the URL as a bearer secret: claiming it does not
immediately invalidate it, so it stays redeemable for a short grace window
after first use. Deliver it over a private channel and don't log or cache it.

Requires the \`CREATE\_VIRTUALCARD\` scope.

Possible errors:

* `Arguments.INVALID` — id is not a valid UUID, or both/neither selector was supplied.
* `VirtualCard.CARD_NOT_FOUND` — no such card on the caller's account.
* `VirtualCard.CARD_NOT_ACTIVE` — the card exists but is not ACTIVE.
* `VirtualCard.AMBIGUOUS_CARD_SELECTION` — offerId matches several active cards; pass virtualCardId.
* `VirtualCard.OFFER_NOT_FOUND` — the card's offer doesn't exist or is inactive.
* `VirtualCard.OFFER_NOT_ACCESSIBLE` — account lacks campaign access for the card's offer.
* \`VirtualCard.OFFER\_NOT\_TOKENIZATION\_ELIGIBLE\` — offer's card program does not support wallet provisioning.
* \`Auth.USER\_REVOKED\_DEVELOPER\_ACCESS\` — user has revoked OAuth access for this developer application.
* \`Auth.INVALID\_SCOPE\` — caller's token does not have CREATE\_VIRTUALCARD.
* \`Generic.EXTERNAL\_SERVICE\_ERROR\` — transient downstream failure; retry is safe.

```graphql theme={null}
query {
  getCardProvisioningUrl(
    input: GetCardProvisioningUrlInput!
  ): CardProvisioningUrl!
}
```

## Arguments

<ParamField body="input" type="GetCardProvisioningUrlInput!" required>
  *No description provided in the schema yet.*
</ParamField>

## Returns

[`CardProvisioningUrl!`](/api-reference/types/card-provisioning-url)
