# Listar facturas recurrentes

`GET https://api.fiscalisto.com/v1/recurring_invoices`

Las más recientes primero.

## Parámetros

| Nombre | Dónde | Obligatorio | Descripción |
| --- | --- | --- | --- |
| `limit` | consulta |  | Cuántos por página, de 1 a 100. Por omisión 10. |
| `starting_after` | consulta |  | El id del último de la página anterior, para la siguiente. |
| `issuer` | consulta |  | El emisor (iss_…). Puede omitirse si la llave o la cuenta tienen uno solo. |
| `status` | consulta |  | active o paused. |

## Con el SDK de TypeScript

```ts
import { Fiscalisto } from "fiscalisto";

// La llave viene de FISCALISTO_API_KEY.
const fiscalisto = new Fiscalisto();

for await (const item of fiscalisto.recurringInvoices.list()) {
  console.log(item.id);
}
```

## Con el SDK de Python

```python
from fiscalisto import Fiscalisto

# La llave viene de FISCALISTO_API_KEY.
fiscalisto = Fiscalisto()

for item in fiscalisto.recurring_invoices.list():
    print(item["id"])
```

## Con el SDK de PHP

```php
<?php

use Fiscalisto\Fiscalisto;

// La llave viene de FISCALISTO_API_KEY.
$fiscalisto = new Fiscalisto();

foreach ($fiscalisto->recurringInvoices->list() as $item) {
    echo $item['id'], "\n";
}
```

## Con el SDK de .NET

```csharp
using Fiscalisto;

// La llave viene de FISCALISTO_API_KEY.
var fiscalisto = new FiscalistoClient();

await foreach (var item in fiscalisto.RecurringInvoices.ListAutoPagingAsync())
    Console.WriteLine(item.Id);
```

## Con el SDK de Go

```go
package main

import (
	"context"
	"fmt"
	"log"

	fiscalisto "fiscalisto.com/go"
)

func main() {
	// La llave viene de FISCALISTO_API_KEY.
	client, err := fiscalisto.NewClient("")
	if err != nil {
		log.Fatal(err)
	}
	ctx := context.Background()

	for item, err := range client.RecurringInvoices.ListAutoPaging(ctx, nil) {
		if err != nil {
			log.Fatal(err)
		}
		fmt.Println(item.ID)
	}
}
```

## Con el SDK de Java

```java
import com.fiscalisto.FiscalistoClient;

// La llave viene de FISCALISTO_API_KEY.
var fiscalisto = new FiscalistoClient();

for (var item : fiscalisto.recurringInvoices().listAutoPaging()) {
    System.out.println(item.getId());
}
```

## Respuesta 200

Correcto.

Un objeto `RecurringInvoiceList`:

| Campo | Tipo | Siempre viene | Descripción |
| --- | --- | --- | --- |
| `object` | `"list"` | sí | Qué tipo de objeto es («invoice», «customer»…). |
| `data` | arreglo de objeto | sí | Los objetos de esta página. |
| `data[].id` | string | sí | Identificador del objeto, con su prefijo (iss_, inv_, ret_, cus_, prd_, emp_, bat_, brn_, whs_, stm_, adj_, evt_, whe_). |
| `data[].livemode` | boolean | sí | true en producción (llaves fk_live_), false en pruebas (fk_test_). Lo de pruebas no vale ante el SAT. |
| `data[].object` | `"recurring_invoice"` | sí | Qué tipo de objeto es («invoice», «customer»…). |
| `data[].issuer` | string | sí | El emisor (iss_…). |
| `data[].name` | string | sí | Para reconocerla. |
| `data[].status` | `active`, `paused` | sí | active (timbra en cada fecha) o paused. |
| `data[].schedule` | objeto | sí | Cada cuánto: frequency (monthly, weekly o daily), interval, day_of_month (con monthly; "last" es el último del mes), y la hora (hour, en time_zone) en que se timbra. |
| `data[].schedule.frequency` | `monthly`, `weekly`, `daily` | sí | monthly: cada interval meses en day_of_month. weekly o daily: cada interval semanas o días. |
| `data[].schedule.interval` | integer | sí | Cada cuántos meses, semanas o días. (de -9007199254740991 a 9007199254740991) |
| `data[].schedule.day_of_month` | integer o `"last"` o null | sí | Con monthly: el día del mes, del 1 al 28, o "last" (el último). null con weekly o daily. |
| `data[].schedule.hour` | integer | sí | La hora (0 a 23) en que se timbra, en time_zone. (de -9007199254740991 a 9007199254740991) |
| `data[].schedule.time_zone` | string | sí | La zona de esa hora (America/Mexico_City, America/Cancun…). |
| `data[].next_invoice_on` | string | sí | La fecha (AAAA-MM-DD) de la siguiente factura. |
| `data[].last_invoiced_on` | string o null | sí | La fecha del último periodo que timbró, o null si aún no timbra ninguna. |
| `data[].last_invoice` | string o null | sí | La última factura (inv_…) que timbró, o null. |
| `data[].last_error` | objeto o null | sí | Por qué no se pudo timbrar la última vez (sin timbres, el cliente borrado, el SAT la rechazó…), o null. Se vuelve a intentar a la siguiente hora del día siguiente; también llega recurring_invoice.failed. |
| `data[].last_error.message` | string o null | sí | Qué pasó. |
| `data[].send_email` | boolean | sí | Si cada factura se manda al correo del cliente. |
| `data[].catch_up` | `all`, `latest` | sí | Si quedaron periodos sin timbrar: all los timbra todos, latest solo el más reciente. |
| `data[].customer` | objeto | sí | A quién se factura. |
| `data[].customer.tax_id` | string | sí | RFC (Rfc), 12 caracteres una persona moral y 13 una física. |
| `data[].customer.legal_name` | string o null | sí | Nombre o razón social tal como está en la constancia de situación fiscal, sin el régimen de capital (sin «S.A. de C.V.»). |
| `data[].currency` | string | sí | La moneda de la factura. |
| `data[].items` | arreglo de objeto | sí | Los conceptos, con description tal como se guardó ({mes}, {año}… se llenan en cada factura). |
| `data[].items[].description` | string | sí | Descripción del concepto (Descripcion), hasta 1,000 caracteres. |
| `data[].items[].product_key` | string | sí | Clave del producto o servicio (ClaveProdServ), 8 dígitos de c_ClaveProdServ. Búsquela con GET /v1/sat_catalogs/product_keys?q=… |
| `data[].items[].quantity` | number |  | Cantidad (Cantidad). Por omisión 1. |
| `data[].items[].unit_key` | string |  | Clave de unidad (ClaveUnidad) de c_ClaveUnidad: E48 unidad de servicio (por omisión), H87 pieza, ACT actividad… |
| `data[].items[].unit_price` | number | sí | Precio unitario antes de impuestos (ValorUnitario). |
| `data[].total` | number o null | sí | El total de cada factura con los precios de hoy. |
| `data[].created_at` | string (date-time) o null | sí | Cuándo se creó. |
| `has_more` | boolean | sí | true si hay más: pida la siguiente con starting_after igual al id del último. |
| `url` | string | sí | La ruta de esta lista. |

```json
{
  "object": "list",
  "data": [
    {
      "id": "rin_OufpKqnrvx9p7Hq2mZr1XyT5uBcW8sKdLx",
      "object": "recurring_invoice",
      "livemode": false,
      "issuer": "iss_OufpKqnrvx9p",
      "name": "Renta oficina 3",
      "status": "active",
      "schedule": {
        "frequency": "monthly",
        "interval": 1,
        "day_of_month": 1,
        "hour": 7,
        "time_zone": "America/Mexico_City"
      },
      "next_invoice_on": "2026-11-01",
      "last_invoiced_on": "2026-10-01",
      "last_invoice": "inv_OufpKqnrvx9p6hW1yQbT3mZr8sKdLx0VeN",
      "last_error": null,
      "send_email": true,
      "catch_up": "all",
      "customer": {
        "tax_id": "ICV060329BY0",
        "legal_name": "INMOBILIARIA CVA"
      },
      "currency": "MXN",
      "items": [
        {
          "description": "Renta de oficina de {mes} {año}",
          "product_key": "80131500",
          "quantity": 1,
          "unit_key": "E48",
          "unit_price": 15000
        }
      ],
      "total": 17400,
      "created_at": "2026-09-28T11:02:14-06:00"
    }
  ],
  "has_more": false,
  "url": "/v1/recurring_invoices"
}
```

## Errores

Puede responder 400, 401, 403, 404, 429, 500 con el cuerpo de error de siempre; cada código está en https://fiscalisto.com/docs/api/errores.md.
