# Cruzar lo declarado con lo facturado

`GET https://api.fiscalisto.com/v1/accounting/cross_checks`

Cada mes ya vencido del año: el IVA trasladado, acreditable y retenido y los ingresos para ISR que el emisor declaró (de GET /v1/sat_declarations, después de POST /v1/sat_declarations/refresh) contra lo que dicen sus CFDI. Hasta $2 de diferencia es redondeo (las declaraciones van en pesos enteros). Una cifra que la declaración no trae en un renglón reconocible es unreadable con declared null, nunca 0. También el IVA a favor y el régimen con que factura. Gratis: no consulta al SAT.

## Parámetros

| Nombre | Dónde | Obligatorio | Descripción |
| --- | --- | --- | --- |
| `year` | consulta |  | El ejercicio. Por omisión, el actual. |
| `issuer` | consulta |  | El emisor (iss_…). Puede omitirse si la llave o la cuenta tienen uno solo. |

## Con el SDK de TypeScript

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

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

const crossChecks = await fiscalisto.accounting.crossChecks();
```

## Con el SDK de Python

```python
from fiscalisto import Fiscalisto

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

cross_checks = fiscalisto.accounting.cross_checks()
```

## Con el SDK de PHP

```php
<?php

use Fiscalisto\Fiscalisto;

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

$crossChecks = $fiscalisto->accounting->crossChecks();
```

## Con el SDK de .NET

```csharp
using Fiscalisto;

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

var crossChecks = await fiscalisto.Accounting.CrossChecksAsync();
```

## 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()

	crossChecks, err := client.Accounting.CrossChecks(ctx, nil)
	if err != nil {
		log.Fatal(err)
	}
	fmt.Printf("%+v\n", *crossChecks)
}
```

## Con el SDK de Java

```java
import com.fiscalisto.FiscalistoClient;

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

var crossChecks = fiscalisto.accounting().crossChecks();
System.out.println(crossChecks);
```

## Respuesta 200

Correcto.

Un objeto `CrossChecks`:

| Campo | Tipo | Siempre viene | Descripción |
| --- | --- | --- | --- |
| `object` | `"cross_checks"` | sí | Qué tipo de objeto es («invoice», «customer»…). |
| `livemode` | boolean | sí | true en producción (llaves fk_live_), false en pruebas (fk_test_). Lo de pruebas no vale ante el SAT. |
| `issuer` | string | sí | El emisor. |
| `year` | integer | sí | El ejercicio. (de -9007199254740991 a 9007199254740991) |
| `months` | arreglo de objeto | sí | Cada mes cuya declaración mensual ya venció (el día 17 del mes siguiente), con sus cruces. Un mes con complementaria toma, por impuesto, la más reciente que lo trae. |
| `months[].month` | string | sí | El mes (AAAA-MM). |
| `months[].status` | `matches`, `differs`, `not_filed`, `unreadable` | sí | El peor de sus cruces: differs (no coincide), unreadable (una cifra no se pudo leer), not_filed (sin declaración mensual) o matches. |
| `months[].checks` | arreglo de objeto | sí | Un cruce por cifra. |
| `months[].checks[].key` | `vat_charged`, `vat_creditable`, `vat_withheld`, `isr_income`, `isr_withheld_salaries`, `isr_withheld_suppliers`, `vat_withheld_suppliers` | sí | Qué cifra: vat_charged (IVA trasladado), vat_creditable (IVA acreditable), vat_withheld (IVA que le retuvieron), isr_income (ingresos para ISR: nominales en persona moral, cobrados en los demás) y, solo en los meses en que retuvo, isr_withheld_salaries (ISR retenido por salarios y asimilados, contra sus recibos de nómina), isr_withheld_suppliers (ISR retenido por honorarios y arrendamiento, contra las facturas recibidas que pagó) o vat_withheld_suppliers (IVA retenido a proveedores). |
| `months[].checks[].status` | `matches`, `differs`, `not_filed`, `unreadable` | sí | matches (hasta $2 de diferencia), differs, not_filed (no hay declaración del mes, o en una retención ninguna declaración del mes la trae) o unreadable (la declaración no trae la cifra en un renglón reconocible). |
| `months[].checks[].declared` | number o null | sí | Lo declarado, en pesos; null si no hay declaración o no se pudo leer. |
| `months[].checks[].declared_without_cfdi` | number | sí | De declared, lo que la propia declaración dice que no salió de facturas: en isr_income los ingresos nominales adicionales (cobrado sin factura, intereses) y en vat_charged el IVA al 16% por encima de la precarga del SAT. Se compara aparte; 0 si no hay. |
| `months[].checks[].invoiced` | number | sí | Lo que dicen los CFDI del mes, con los mismos cálculos de Impuestos. |
| `months[].checks[].difference` | number o null | sí | declared menos declared_without_cfdi menos invoiced; null si declared es null. |
| `months[].checks[].operation_number` | string o null | sí | El número de operación de la declaración de donde salió la cifra. |
| `vat_balance_in_favor` | objeto | sí | El IVA a favor que muestran las declaraciones del año y lo que meses posteriores acreditaron. Una estimación con las declaraciones leídas, no la cuenta del SAT. |
| `vat_balance_in_favor.periods` | arreglo de objeto | sí | Cada mes con IVA a favor. |
| `vat_balance_in_favor.periods[].month` | string | sí | El mes cuya declaración muestra el IVA a favor. |
| `vat_balance_in_favor.periods[].amount` | number | sí | El IVA a favor de ese mes. |
| `vat_balance_in_favor.periods[].operation_number` | string | sí | El número de operación de esa declaración. |
| `vat_balance_in_favor.total` | number | sí | La suma del IVA a favor del año. |
| `vat_balance_in_favor.credited` | number | sí | Lo que las declaraciones del año acreditaron de saldos a favor de periodos anteriores. |
| `vat_balance_in_favor.remaining` | number | sí | total menos credited, nunca menos de 0: lo que quedaría por acreditar o pedir en devolución. |
| `tax_regimes` | objeto | sí | Los regímenes del emisor (registered, de su constancia) y con cuáles facturó en el año. |
| `tax_regimes.registered` | arreglo de string | sí | Los regímenes de su constancia (c_RegimenFiscal), capturados en la app. |
| `tax_regimes.invoiced` | arreglo de objeto | sí | Cada régimen con que facturó en el año (RegimenFiscal del emisor). |
| `tax_regimes.invoiced[].tax_regime` | string | sí | El régimen (c_RegimenFiscal). |
| `tax_regimes.invoiced[].invoices` | integer | sí | Cuántos CFDI lo llevan (ingreso, egreso y pago, sin cancelados). (de -9007199254740991 a 9007199254740991) |
| `tax_regimes.invoiced[].first_date` | string | sí | La fecha del primero (AAAA-MM-DD). |
| `tax_regimes.invoiced[].last_date` | string | sí | La fecha del último (AAAA-MM-DD). |
| `tax_regimes.invoiced[].registered` | boolean o null | sí | Si el régimen está en su constancia; null si no se capturaron los regímenes de la constancia. |

```json
{
  "object": "cross_checks",
  "livemode": false,
  "issuer": "iss_OufpKqnrvx9p",
  "year": 2026,
  "months": [
    {
      "month": "2026-09",
      "status": "differs",
      "checks": [
        {
          "key": "vat_charged",
          "status": "differs",
          "declared": 16000,
          "declared_without_cfdi": 0,
          "invoiced": 17600,
          "difference": -1600,
          "operation_number": "260930001234"
        },
        {
          "key": "vat_creditable",
          "status": "matches",
          "declared": 4800,
          "declared_without_cfdi": 0,
          "invoiced": 4800.4,
          "difference": -0.4,
          "operation_number": "260930001234"
        },
        {
          "key": "vat_withheld",
          "status": "matches",
          "declared": 0,
          "declared_without_cfdi": 0,
          "invoiced": 0,
          "difference": 0,
          "operation_number": "260930001234"
        },
        {
          "key": "isr_income",
          "status": "unreadable",
          "declared": null,
          "declared_without_cfdi": 0,
          "invoiced": 110000,
          "difference": null,
          "operation_number": "260930001234"
        },
        {
          "key": "isr_withheld_salaries",
          "status": "matches",
          "declared": 8450,
          "declared_without_cfdi": 0,
          "invoiced": 8449.6,
          "difference": 0.4,
          "operation_number": "260930001234"
        }
      ]
    }
  ],
  "vat_balance_in_favor": {
    "periods": [
      {
        "month": "2026-02",
        "amount": 3000,
        "operation_number": "260317004567"
      }
    ],
    "total": 3000,
    "credited": 1200,
    "remaining": 1800
  },
  "tax_regimes": {
    "registered": [
      "601"
    ],
    "invoiced": [
      {
        "tax_regime": "601",
        "invoices": 214,
        "first_date": "2026-01-03",
        "last_date": "2026-10-24",
        "registered": true
      }
    ]
  }
}
```

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