> ## 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.

# Test Virtual Card Offers

> Ready-to-use offer IDs for issuing virtual cards in the staging environment, plus how to discover offers dynamically.

Use these offer IDs to issue virtual cards in the **staging** environment. Every virtual card is created against an *offer*, which determines the card program (network, BIN, and rewards). The offer IDs below are enabled for staging and can be passed straight to `createVirtualCard`.

<Warning>
  **Complete KYC first**

  Virtual cards can only be issued on an account that has completed identity verification. Until the account — and, for a business, its beneficial owners — passes KYC/KYB, `getVirtualCardOffers` may return empty and `createVirtualCard` will fail. Run verification before you test. See [User KYC Verification](/features/user-kyc-verification) for how to submit it, and pull test identities from [Testing KYC Flows](/test-kyc-flows).
</Warning>

<Note>
  **Staging only**

  These offer IDs are accepted only on the staging endpoint (`https://transactional-graph.staging.fluzapp.com/api/v1/graphql`). They will be rejected in production, where you must retrieve a live offer ID from [Get Virtual Card Offers](/features/get-virtual-card-offers).
</Note>

## Staging offer IDs

| Offer ID                               | Program                                        | Network    |
| -------------------------------------- | ---------------------------------------------- | ---------- |
| `5b22153c-7c1e-4a66-9d2c-e786da7e9393` | Virtual Card - Mastercard Prepaid              | Mastercard |
| `e5d209d2-97b2-4636-9531-b3a459e34651` | Brand Locked Virtual Card - Mastercard Prepaid | Mastercard |
| `0a6f66ec-a615-47cb-a850-ef971f7054b8` | Single Load Virtual Card - Mastercard Prepaid  | Mastercard |
| `490032ad-2e67-4ef0-92ff-cd7071332716` | Reloadable Virtual Card - Mastercard Prepaid   | Mastercard |

## Which offer should you choose?

Each program issues a Mastercard prepaid card, but they differ in where the card can be spent and how it's funded. Pick the one that matches the behavior you want to test:

<AccordionGroup>
  <Accordion title="Virtual Card" icon="credit-card">
    The general-purpose program — a standard multi-use prepaid card that can be spent anywhere Mastercard is accepted, within the spend limits you set. Start here if you just want to run the happy path end to end.
  </Accordion>

  <Accordion title="Brand Locked Virtual Card" icon="store">
    A card restricted to a single merchant or brand. Transactions at any other merchant are declined. Use this to test merchant-restricted spend controls — for example, a card that only works at one vendor.
  </Accordion>

  <Accordion title="Single Load Virtual Card" icon="banknote">
    A card funded once, at creation. The balance is loaded up front and spent down — it can't be topped up afterward. Use this to test fixed-value, disposable card flows like one-off vendor payments or payouts.
  </Accordion>

  <Accordion title="Reloadable Virtual Card" icon="refresh-ccw">
    A card whose balance can be topped up after creation. Use this to test long-lived cards that get refunded repeatedly — recurring allowances, team cards, or ongoing subscription spend.
  </Accordion>
</AccordionGroup>

## Recommended flow

Rather than hard-coding an offer ID, we recommend discovering offers at runtime — the returned list reflects exactly what your account is entitled to. It's a quick two-call sequence.

<Steps>
  <Step title="List available offers">
    Call `getVirtualCardOffers` and grab an `offer_id` from the response.
  </Step>

  <Step title="Create the card">
    Pass that `offer_id` to `createVirtualCard`. A successful response returns a `virtual_card_id` with a status of `ACTIVE`.
  </Step>
</Steps>

<CodeGroup>
  ```graphql Step 1 — Get offers theme={null}
  query {
    getVirtualCardOffers(input: {}) {
      offer_id
      program_name
      bank_name
      rewardValue
    }
  }
  ```

  ```graphql Step 2 — Create a card theme={null}
  mutation {
    createVirtualCard(input: {
      offerId: "5b22153c-7c1e-4a66-9d2c-e786da7e9393"
      spendLimit: 5.00
      idempotencyKey: "<any unique string>"
    }) {
      virtual_card_id
      status
      initial_amount
    }
  }
  ```
</CodeGroup>

<Tip>
  Keep `spendLimit` at or below your available balance — the card is funded from your Fluz balance, so a higher limit fails with an insufficient-balance error. A \$5 test is the safest first attempt. You can omit the billing address on your first card to keep the happy path simple; add one later with [Add Virtual Card Address](/features/add-virtual-card-address).
</Tip>

## Next steps

<CardGroup cols={2}>
  <Card title="Create Virtual Card" icon="credit-card" href="/features/create-virtual-cards">
    The full `createVirtualCard` reference — inputs, funding, and the card lifecycle.
  </Card>

  <Card title="Testing KYC flows" icon="id-card" href="/test-kyc-flows">
    Test identities that return each verification outcome — approved, declined, and duplicate.
  </Card>
</CardGroup>

**Want to learn more?** Contact us at [partnerships@fluz.app](mailto:partnerships@fluz.app). Speak with our experts for more info or to request a demo.
