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

# Integrar con Astro

> Agrega cobros y pagos a tu aplicación de Astro.

Instala la Commet Skill para que tu agente integre el SDK actual y valide su trabajo contra el contrato vivo de la API.

```bash theme={null}
npx skills add commet-labs/skills --skill commet
```

<Warning>
  Astro requiere un adaptador SSR para las rutas API. Configura `output: 'server'` o `output: 'hybrid'` en tu `astro.config.mjs`.
</Warning>

<Steps>
  <Step title="Instalar">
    <Tabs>
      <Tab title="pnpm">
        ```bash theme={null}
        pnpm add @commet/node
        ```
      </Tab>

      <Tab title="npm">
        ```bash theme={null}
        npm install @commet/node
        ```
      </Tab>

      <Tab title="yarn">
        ```bash theme={null}
        yarn add @commet/node
        ```
      </Tab>

      <Tab title="bun">
        ```bash theme={null}
        bun add @commet/node
        ```
      </Tab>
    </Tabs>
  </Step>

  <Step title="Configurar">
    ```bash title=".env" theme={null}
    COMMET_API_KEY=ck_sandbox_xxx
    ```

    ```typescript title="src/lib/commet.ts" theme={null}
    import { Commet } from '@commet/node'

    export const commet = new Commet({
      apiKey: import.meta.env.COMMET_API_KEY,
    })
    ```
  </Step>

  <Step title="Suscribir">
    `customers.create` es idempotente — si ya existe un cliente con el mismo `id`, retorna el registro existente.

    ```typescript title="src/pages/api/billing/subscribe.ts" theme={null}
    import type { APIRoute } from 'astro'
    import { commet } from '../../../lib/commet'

    export const POST: APIRoute = async ({ request }) => {
      const { customerId, email } = await request.json()

      await commet.customers.create({ email, id: customerId })

      const subscription = await commet.subscriptions.create({
        customerId,
        planCode: 'pro',
      })

      return Response.json({ checkoutUrl: subscription.checkoutUrl ?? null })
    }
    ```
  </Step>

  <Step title="Verificar Acceso">
    ```typescript title="src/pages/api/billing/access/[customerId].ts" theme={null}
    import type { APIRoute } from 'astro'
    import { commet } from '../../../../lib/commet'

    export const GET: APIRoute = async ({ params }) => {
      const subscription = await commet.subscriptions.getActive({ customerId: params.customerId! })

      if (!subscription) {
        return Response.json({ error: 'no_active_subscription' }, { status: 404 })
      }

      const feature = await commet.featureAccess.get({
        code: 'api_calls',
        customerId: params.customerId!,
      })

      return Response.json({
        status: subscription.status,
        allowed: feature.allowed,
      })
    }
    ```
  </Step>

  <Step title="Trackear Uso">
    ```typescript title="src/pages/api/billing/usage.ts" theme={null}
    import type { APIRoute } from 'astro'
    import { commet } from '../../../lib/commet'

    export const POST: APIRoute = async ({ request }) => {
      const { customerId } = await request.json()

      await commet.usage.track({
        customerId,
        featureCode: 'api_calls',
        value: 1,
      })

      return Response.json({ tracked: true })
    }
    ```

    El uso se agrega y se cobra al final del período.
  </Step>

  <Step title="Portal del Cliente">
    ```typescript title="src/pages/api/billing/portal.ts" theme={null}
    import type { APIRoute } from 'astro'
    import { commet } from '../../../lib/commet'

    export const GET: APIRoute = async ({ redirect }) => {
      const customerId = 'user_123'

      const portal = await commet.portal.getUrl({ customerId })

      return redirect(portal.portalUrl)
    }
    ```
  </Step>
</Steps>

## Relacionado

* [Suscripciones](/docs/es/manage-subscriptions)
* [Trackear Uso](/docs/es/track-usage)
* [Portal del Cliente](/docs/es/customer-portal)
* [Referencia del SDK](/docs/es/sdk-reference)


## Related topics

- [Integrar con Flask](/docs/es/integrate-with-flask.md)
- [Integrar con Java](/docs/es/integrate-with-java.md)
- [Integrar con Django](/docs/es/integrate-with-django.md)
- [Integrar con Encore](/docs/es/integrate-with-encore.md)
- [Integrar con Laravel](/docs/es/integrate-with-laravel.md)


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.