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

# Descarga de facturas y portal del cliente

> Da a tus clientes acceso de autoservicio a sus facturas Verifactu: con el portal del cliente alojado o listando las facturas directamente con la API.

Stripe Billing incluye su propio portal de clientes, pero las facturas que muestra son las de Stripe, no facturas Verifactu con validez legal en España. Un cliente que solo tiene acceso a ese portal no puede descargar sus facturas con validez fiscal.

Finseed te permite dar a cada cliente acceso de autoservicio a las facturas Verifactu que generamos a partir de sus pagos o facturas de Stripe. Hay dos formas de hacerlo, según cuánto control quieras sobre la experiencia.

## Dos formas de hacerlo

Elige según dónde quieras que el cliente vea sus facturas:

* **Portal del cliente.** Una página alojada por Finseed. Generas un enlace firmado desde tu servidor y se lo envías al cliente; al abrirlo, ve la lista de sus facturas y descarga cada una en PDF. No tienes que construir ninguna interfaz. Es la opción más rápida de implementar.
* **Listar las facturas con la API.** Integras las facturas en tu propia interfaz: tu área de cliente, tu aplicación o un email. Tu servidor pide a la API las facturas de cada cliente y un enlace de descarga para cada una, y tú decides cómo y dónde mostrarlas.

A continuación se detalla cada opción.

## Antes de empezar

La llamada a la API se autentica con una clave API. Si aún no tienes una, créala antes de continuar:

1. Ve a **Configuración > Claves API**.
2. Pulsa **Nueva clave** y dale un nombre descriptivo.
3. Copia la clave en el momento. Solo se muestra una vez.

La clave está limitada a un entorno: una clave de test (`ev_test_…`) solo ve clientes de test y una clave de producción (`ev_live_…`) solo ve clientes reales. Haz siempre las llamadas desde tu servidor y guarda la clave como un secreto, nunca en código del lado del cliente. El proceso completo está en [Claves API](/docs/general/claves-api).

## Portal del cliente

El portal del cliente es una página alojada en Finseed desde la que cada cliente ve y descarga sus facturas Verifactu, sin credenciales ni contraseñas. Tú generas el enlace, se lo entregas y caduca al cabo de una hora.

1. **Identifica al cliente por su id de Stripe.** El `external_customer_id` que pide la API es el id del cliente en Stripe (`cus_…`), el mismo que ya usas en tu integración.
2. **Genera el enlace desde tu servidor.** Llama a [`POST /v1/customer_portal/sessions`](/docs/api-reference/customer-portal/create-a-customer-portal-session) con ese id y tu clave API, y obtén la URL del portal.
3. **Entrega el enlace al cliente.** Sustituye el enlace al portal de Stripe, o añádelo junto a él, en el email de confirmación, tu área de cliente o donde lo muestres hoy.

```bash theme={null}
curl https://api.finseed.es/v1/customer_portal/sessions \
  -X POST \
  -H "Authorization: Bearer ev_live_…" \
  -H "Content-Type: application/json" \
  -d '{ "external_customer_id": "cus_9aZ" }'
```

La respuesta incluye la URL del portal y su fecha de caducidad:

```json theme={null}
{
  "url": "https://www.finseed.es/app/customer-portal/eyJ…",
  "expires_at": "2026-06-01T10:30:00Z"
}
```

Genera el enlace siempre bajo demanda, nunca lo almacenes como URL permanente. El flujo completo, lo que ve el cliente y las consideraciones de seguridad están en la [guía del portal del cliente](/docs/general/portal-clientes).

Si tu entorno tiene más de una integración, añade también `integration_id` para indicar a qué integración pertenece el cliente; con una sola integración puedes omitirlo. Los detalles están en la [guía del portal del cliente](/docs/general/portal-clientes).

## Listar las facturas con la API

Si prefieres mostrar las facturas dentro de tu propia interfaz, pídelas a la API y obtén un enlace de descarga para cada una. Todo ocurre entre tu servidor y Finseed, con tu clave API.

1. **Lista las facturas del cliente.** Llama a [`GET /v1/invoices`](/docs/api-reference/invoices/list-invoices) filtrando por `external_customer_id`, el id del cliente en Stripe (`cus_…`). La respuesta trae una página con el número, la fecha, el estado y los importes de cada factura.
2. **Obtén el enlace de descarga.** Para cada factura, llama a [`GET /v1/invoices/{id}/download`](/docs/api-reference/download-invoice). Recibirás un `download_url` firmado, válido durante 24 horas, que puedes entregar al navegador para descargar el PDF.

```bash theme={null}
curl 'https://api.finseed.es/v1/invoices?external_customer_id=cus_9aZ' \
  -H "Authorization: Bearer ev_live_…"
```

La lista viene paginada por cursor: sigue el campo `next_url` de la respuesta para recorrer el resto de páginas. Los detalles están en [Pagination](/docs/api-reference/pagination).

Tu clave API ve todas las facturas de tu entorno, no solo las de un cliente. Antes de mostrar una factura a un usuario que ha iniciado sesión, comprueba en tu aplicación que esa factura le pertenece.

## Facturas anteriores de Stripe

Cuando empiezas a usar Finseed ya tienes un historial de facturas que solo existían en Stripe. Por defecto, el portal de Finseed también muestra a cada cliente esas facturas anteriores de Stripe, las que emitiste antes de empezar a emitir facturas Verifactu con Finseed. Así el cliente mantiene en un único sitio todo su historial: las facturas antiguas de Stripe y las nuevas facturas Verifactu.

Las dos aparecen en la misma lista. El cliente ve un listado único de sus facturas, sin una sección aparte de Stripe y sin saber qué sistema generó cada una.

Solo mostramos las facturas anteriores. En cuanto emitimos la factura Verifactu oficial de una factura de Stripe, el portal solo muestra la factura Verifactu, nunca las dos a la vez. En concreto, mostramos las facturas de Stripe con fecha anterior a la primera factura que Finseed emitió para esa integración.

Al pulsar en una factura anterior, el cliente descarga el PDF original de Stripe. Si ese PDF no está disponible, abrimos la página de la factura alojada por Stripe, donde el cliente puede descargarla.

Esta opción está activada por defecto. Puedes desactivarla por cada integración de Stripe. En la aplicación, entra en los ajustes de la integración, abre **Configuración de Stripe** y desactiva la opción para mostrar las facturas anteriores de Stripe en el portal de clientes. Si la desactivas, el portal muestra solo las facturas Verifactu. Esta opción solo aparece en las integraciones de tipo Stripe Invoices, no en las de Stripe Payments.

## Genera el código con IA

Pega este prompt en tu asistente de código para implementar cualquiera de las dos formas:

<Prompt icon="paperclip" description="Copia este prompt en tu asistente de código para dar a tus clientes de Stripe acceso a sus facturas Verifactu." actions={["copy", "chatgpt", "claude"]}>
  ```text theme={null}
  Tengo una integración con Stripe y quiero dar a mis clientes acceso de autoservicio a sus facturas Verifactu de Finseed. Hay dos formas; pregúntame cuál prefiero antes de escribir código.

  1) Portal del cliente (página alojada por Finseed)
     Endpoint: POST https://api.finseed.es/v1/customer_portal/sessions
     Cuerpo de la petición: { "external_customer_id": "<id del cliente en Stripe, p. ej. cus_9aZ>" }
     Campo "integration_id": obligatorio solo si el entorno tiene más de una integración (indica a qué integración pertenece el cliente). Con una sola integración se omite. Si falta cuando es necesario, la API responde 409 customer_ambiguous.
     Respuesta 200: { "url": "https://www.finseed.es/app/customer-portal/...", "expires_at": "<ISO 8601>" }
     Entrega la url al cliente. Caduca una hora después de generarse; genérala bajo demanda y no la almacenes.

  2) Listar las facturas en mi propia interfaz
     Listar facturas del cliente: GET https://api.finseed.es/v1/invoices?external_customer_id=<id del cliente en Stripe>
     Descargar el PDF de una factura: GET https://api.finseed.es/v1/invoices/<id de la factura>/download
     La descarga responde { "download_url": "...", "expires_at": "<ISO 8601>" } y el enlace es válido 24 horas.
     La lista viene paginada por cursor: sigue next_url para recorrer todas las páginas.

  Autenticación (en ambas formas): cabecera "Authorization: Bearer <EV_API_KEY>". Haz siempre las llamadas desde el servidor y nunca expongas la clave en el cliente. Antes de mostrar una factura a un usuario, comprueba que le pertenece.

  Toma el id del cliente de Stripe (cus_...) y úsalo como external_customer_id.

  Documentación: https://www.finseed.es/docs/stripe/portal-clientes
  Referencia de la API: https://www.finseed.es/docs/api-reference/overview
  ```
</Prompt>
