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

# Comprar una Tarjeta de Regalo

> Ejemplo de extremo a extremo: generar un token, comprar una tarjeta de regalo y revelar sus detalles.

Flujo completo que genera un token de acceso de usuario, compra una tarjeta de regalo por el slug del comercio y revela los detalles de canje.

```javascript theme={null}
import { GraphQLClient, gql } from 'graphql-request';
import crypto from 'crypto';

const API_URL = 'https://transactional-graph.staging.fluzapp.com/api/v1/graphql';
const API_KEY = 'your-api-key-here';
const USER_ID = 'user-id-uuid-here';
const ACCOUNT_ID = 'account-id-uuid-here';

const generateUserToken = async (userId, accountId) => {
  const client = new GraphQLClient(API_URL, {
    headers: {
      Authorization: `Basic ${API_KEY}`,
      'Content-Type': 'application/json',
    },
  });

  const GENERATE_USER_ACCESS_TOKEN = gql`
    mutation generateUserAccessToken(
      $userId: UUID!
      $accountId: UUID!
      $scopes: [ScopeType!]!
      $seatId: UUID
    ) {
      generateUserAccessToken(
        userId: $userId
        accountId: $accountId
        scopes: $scopes
        seatId: $seatId
      ) {
        token
        scopes
      }
    }
  `;

  const variables = {
    userId,
    accountId,
    scopes: [
      'LIST_PURCHASES',
      'REVEAL_GIFTCARD',
      'LIST_OFFERS',
      'PURCHASE_GIFTCARD',
      'LIST_PAYMENT',
      'MANAGE_PAYMENT',
      'MAKE_DEPOSIT',
    ],
    seatId: null,
  };

  const res = await client.request(GENERATE_USER_ACCESS_TOKEN, variables);
  return res.generateUserAccessToken.token;
};

const purchaseGiftCard = async (userToken, slug, amount) => {
  const client = new GraphQLClient(API_URL, {
    headers: {
      Authorization: `Bearer ${userToken}`,
      'Content-Type': 'application/json',
    },
  });

  const PURCHASE_GIFT_CARD = gql`
    mutation purchaseGiftCard($input: PurchaseGiftCardInput!) {
      purchaseGiftCard(input: $input) {
        purchaseId
        purchaseDisplayId
        purchaseAmount
        giftCard {
          giftCardId
          status
          createdAt
        }
      }
    }
  `;

  const variables = {
    input: {
      idempotencyKey: crypto.randomUUID(),
      amount,
      merchantSlug: slug,
      minRewardRate: 2.0,
    },
  };

  return client.request(PURCHASE_GIFT_CARD, variables);
};

const revealGiftCard = async (userToken, giftCardId) => {
  const client = new GraphQLClient(API_URL, {
    headers: {
      Authorization: `Bearer ${userToken}`,
      'Content-Type': 'application/json',
    },
  });

  const REVEAL_GIFT_CARD = gql`
    mutation revealGiftCardByGiftCardId($giftCardId: UUID!) {
      revealGiftCardByGiftCardId(giftCardId: $giftCardId) {
        code
        pin
        url
      }
    }
  `;

  return client.request(REVEAL_GIFT_CARD, { giftCardId });
};

(async () => {
  const userToken = await generateUserToken(USER_ID, ACCOUNT_ID);
  const giftCard = await purchaseGiftCard(userToken, 'aero', 10);
  const giftCardId = giftCard.purchaseGiftCard.giftCard.giftCardId;
  const details = await revealGiftCard(userToken, giftCardId);
  console.log('Gift Card Details:', JSON.stringify(details, null, 2));
})();
```

Relacionado: [Comprar Tarjetas de Regalo](/solutions/rewards), [Autenticación](/get-started/api-credentials).
