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

# Emitir 100 tarjetas a la vez

> Crea una orden masiva de tarjetas virtuales, hazle polling hasta completarla y maneja fallas parciales: el patrón de emisión programática a escala.

Este Quickstart emite 100 tarjetas virtuales en una sola solicitud. Harás una orden masiva asíncrona, harás polling de su estado a medida que se crean las tarjetas y recuperarás los detalles completos de las tarjetas: el mismo patrón ya sea que emitas 10 tarjetas o 10,000.

<Info>
  **Requisitos previos**

  * Una **cuenta de Fluz con una aplicación de staging**: pasos 1–2 de cualquier quickstart, o ve a [Prepara tus cuentas](/get-started/prepare-accounts) y [Credenciales de API](/get-started/api-credentials).
  * Un token con el scope **`CREATE_VIRTUALCARD`**.
  * Suficiente saldo disponible para cubrir la orden: 100 tarjetas × el límite de gasto que definas. Cada mutación necesita una `idempotencyKey` única: consulta [Idempotencia](/concepts/idempotency).
</Info>

## El flujo completo

<Steps>
  <Step title="Realiza la orden masiva" icon="layers">
    Una llamada a `createVirtualCardBulkOrder` crea las 100 tarjetas. Cada elemento en `orderItems` es una configuración de tarjeta con una `quantity`; aquí, 100 tarjetas de desembolso de un solo uso idénticas:

    <CodeGroup>
      ```graphql Mutation theme={null}
          mutation createVirtualCardBulkOrder($input: CreateVirtualCardBulkOrderInput!) {
            createVirtualCardBulkOrder(input: $input) {
              orderId
              orderStatus
            }
          }
      ```

      ```json Variables theme={null}
          {
            "input": {
              "idempotencyKey": "9f2a1c30-7b8d-4e1f-a6c2-5d3e8f901b2c",
              "offerId": "592c394e-26cc-44ac-a145-a5f81301fe77",
              "orderItems": [
                {
                  "quantity": 100,
                  "spendLimit": 25.00,
                  "lockCardNextUse": true,
                  "cardNickname": "July payout batch",
                  "primaryFundingSource": "FLUZ_BALANCE"
                }
              ]
            }
          }
      ```

      ```json Response theme={null}
          {
            "data": {
              "createVirtualCardBulkOrder": {
                "orderId": "ZTBhYTg2YmQt...",
                "orderStatus": "PENDING"
              }
            }
          }
      ```
    </CodeGroup>

    El `offerId` aplica a **todas** las tarjetas de la orden; mezcla configuraciones agregando más entradas en `orderItems` (p. ej., 80 × $25 de un solo uso más 20 × $100 mensuales). `lockCardNextUse: true` hace que cada tarjeta se autodestruya después de su primer cargo: el patrón estándar de desembolso.

    <Note>
      Las órdenes masivas son **asíncronas**: la respuesta es un `orderId` y `PENDING`, no las tarjetas. Guarda el `orderId`; es tu identificador para todo lo que sigue.
    </Note>
  </Step>

  <Step title="Haz polling hasta completar" icon="list-checks">
    Sigue el progreso con `getVirtualCardBulkOrderStatus`. Las tarjetas se van poblando de forma incremental mientras la orden está `PENDING`:

    <CodeGroup>
      ```graphql Query theme={null}
          query getVirtualCardBulkOrderStatus($input: GetVirtualCardBulkOrderStatusInput!) {
            getVirtualCardBulkOrderStatus(input: $input) {
              orderId
              orderStatus
              successfulCardCreations
              failedCardCreations
              totalCards
              virtualCards {
                virtualCardId
                cardNumber
                expiryMMYY
                cvv
                cardHolderName
              }
            }
          }
      ```

      ```json Variables theme={null}
          { "input": { "orderId": "<ORDER_ID_FROM_STEP_1>" } }
      ```
    </CodeGroup>

    Haz polling con backoff hasta que `orderStatus` sea `COMPLETED` (o `FAILED`); mientras esté pendiente, `successfulCardCreations` sube hacia `totalCards` y `virtualCards` se va llenando.

    <Warning>
      La respuesta contiene **PAN completos, CVVs y fechas de vencimiento en texto plano**. Trátala como datos sensibles del tarjetahabiente: solo TLS, nunca la registres en logs, muéstrala únicamente a usuarios autorizados.
    </Warning>
  </Step>

  <Step title="Maneja fallas parciales" icon="triangle-alert">
    Una orden masiva puede tener éxito parcial: `successfulCardCreations: 98, failedCardCreations: 2` en una orden completada significa 98 tarjetas reales y utilizables y 2 que necesitan reintento. Concílialo comparando los conteos con `totalCards`, luego vuelve a emitir solo la diferencia, con una **nueva** `idempotencyKey`, ya que es una nueva orden:

    ```json theme={null}
        {
          "input": {
            "idempotencyKey": "<NEW_UUID>",
            "offerId": "592c394e-26cc-44ac-a145-a5f81301fe77",
            "orderItems": [{ "quantity": 2, "spendLimit": 25.00, "lockCardNextUse": true }]
          }
        }
    ```

    Las fallas persistentes usualmente se deben a límites del programa o a fondos: revisa [Códigos de error de tarjeta virtual](/features/virtual-card-error-codes) y tu saldo disponible.
  </Step>
</Steps>

## Listo 🎉

Cien tarjetas configuradas desde una sola solicitud, con un loop de polling listo para producción tal como está. A continuación:

<CardGroup cols={2}>
  <Card title="Obtener transacciones de tarjetas virtuales" icon="receipt" href="/features/get-virtual-card-transactions">
    Monitorea el gasto en todo el lote: hasta 10 tarjetas por consulta, o a nivel de cuenta por fecha.
  </Card>

  <Card title="Enviar tarjetas a destinatarios" icon="send" href="/quickstart/send-a-card">
    ¿Distribuyes a personas fuera de tu organización? Los enlaces de canje alojados se encargan del onboarding por ti.
  </Card>
</CardGroup>

<Note>
  **¿Quieres saber más?** Contáctanos en [support@fluz.app](mailto:support@fluz.app) para hablar con nuestros expertos o solicitar una demo.
</Note>
