# Contabilidad

> Las pólizas, la balanza de comprobación, los estados financieros, el catálogo de cuentas, la contabilidad electrónica para el SAT y la DIOT de cada emisor, armadas de sus CFDI.

Con las facturas que el emisor timbró y las que recibió (de las [descargas del SAT](https://fiscalisto.com/docs/api/descargas-del-sat)), Fiscalisto arma su contabilidad de cada mes: las pólizas de sus CFDI, sus pagos, su nómina y la depreciación de sus activos; la balanza; el estado de resultados y el balance general; el catálogo de cuentas con el código agrupador del SAT; los XML de la contabilidad electrónica y la DIOT. No incluye movimientos de banco sin CFDI ni provisiones.

## Pólizas

```bash tab="cURL"
curl "https://api.fiscalisto.com/v1/accounting/journal_entries?month=2026-10" \
  -H "Authorization: Bearer $FISCALISTO_API_KEY"
```

```ts tab="TypeScript"
import { Fiscalisto } from "fiscalisto";

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

for await (const item of fiscalisto.accounting.journalEntries({ month: "2026-10" })) {
  console.log(item.id);
}
```

```python tab="Python"
from fiscalisto import Fiscalisto

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

for item in fiscalisto.accounting.journal_entries({"month": "2026-10"}):
    print(item["id"])
```

```php tab="PHP"
<?php

use Fiscalisto\Fiscalisto;

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

foreach ($fiscalisto->accounting->journalEntries(['month' => '2026-10']) as $item) {
    echo $item['id'], "\n";
}
```

```go tab="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.Accounting.JournalEntriesAutoPaging(ctx, &fiscalisto.ListJournalEntriesParams{Month: "2026-10"}) {
		if err != nil {
			log.Fatal(err)
		}
		fmt.Println(item.ID)
	}
}
```

```java tab="Java"
import com.fiscalisto.FiscalistoClient;
import com.fiscalisto.model.ListJournalEntriesParams;

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

for (var item : fiscalisto.accounting().journalEntriesAutoPaging(new ListJournalEntriesParams().setMonth("2026-10"))) {
    System.out.println(item.getId());
}
```

```csharp tab="C#"
using Fiscalisto;

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

await foreach (var item in fiscalisto.Accounting.JournalEntriesAutoPagingAsync(new ListJournalEntriesParams { Month = "2026-10" }))
    Console.WriteLine(item.Id);
```

Las pólizas de diario del mes (`D-202610-00001`…), en orden de fecha, con sus cargos y abonos en pesos, que siempre cuadran. `type` dice de qué es cada una:

| `type` | De qué | Cargo | Abono |
| --- | --- | --- | --- |
| `invoice` | Factura emitida | Clientes (o Caja o Bancos si es PUE), retenciones que le hicieron | Ventas, IVA trasladado (cobrado si es PUE, no cobrado si es PPD) |
| `invoice` | Factura recibida | El gasto de su categoría (o el activo fijo, usos I01 a I08), IVA acreditable | Proveedores (o Caja o Bancos si es PUE), retenciones por pagar |
| `invoice` | Nota de crédito | Al revés que la factura | |
| `payment_received` | Pago de un complemento que emitió | Bancos, pérdida cambiaria | Clientes, utilidad cambiaria; el IVA pasa de no cobrado a cobrado |
| `payment_made` | Pago de un complemento que recibió | Proveedores | Bancos; el IVA pasa de pendiente a pagado |
| `payroll` | Recibo de nómina | Sueldos y otros pagos | ISR retenido, otras retenciones, Bancos por el neto |
| `depreciation` | La depreciación del mes | Depreciación de cada tipo de activo | Su depreciación acumulada |

Un PUE se registra cobrado o pagado según su forma de pago: efectivo en Caja, transferencia, cheque o tarjeta en Bancos, y una recibida pagada con tarjeta de crédito en Tarjetas de crédito por pagar. La depreciación es en línea recta con las tasas del artículo 34 de la LISR, desde el mes siguiente al inicio de uso, sin INPC.

Cada póliza dice de qué documento sale (`uuid`, e `invoice` si es un CFDI que timbró este emisor); la de depreciación no tiene `uuid` ni `tax_id`. Un CFDI en otra moneda se registra con su tipo de cambio; sin él, no se registra. Hasta 1,000 pólizas por página con `limit`, y la siguiente con `starting_after`. El número de una póliza es su lugar en el mes: un CFDI de ese mes que llega después (por ejemplo, en una descarga del SAT) recorre los que siguen, así que para relacionar una póliza con su documento use `uuid`, no `id`.

## Balanza y catálogo

`GET /v1/accounting/trial_balance?month=2026-10` da el saldo inicial, los cargos, los abonos y el saldo final de cada cuenta. Los saldos iniciales se acumulan desde el primer CFDI, o desde los saldos iniciales que capture en **Estados financieros** de la app (las cuentas de resultados, desde enero), y los resultados de cada año anterior se cierran a capital, así que cargos y abonos siempre suman lo mismo.

## Estados financieros

```bash tab="cURL"
curl "https://api.fiscalisto.com/v1/accounting/financial_statements?month=2026-10" \
  -H "Authorization: Bearer $FISCALISTO_API_KEY"
```

```ts tab="TypeScript"
import { Fiscalisto } from "fiscalisto";

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

const financialStatements = await fiscalisto.accounting.financialStatements({ month: "2026-10" });
```

```python tab="Python"
from fiscalisto import Fiscalisto

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

financial_statements = fiscalisto.accounting.financial_statements({"month": "2026-10"})
```

```php tab="PHP"
<?php

use Fiscalisto\Fiscalisto;

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

$financialStatements = $fiscalisto->accounting->financialStatements(['month' => '2026-10']);
```

```go tab="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()

	financialStatements, err := client.Accounting.FinancialStatements(ctx, &fiscalisto.GetFinancialStatementsParams{Month: "2026-10"})
	if err != nil {
		log.Fatal(err)
	}
	fmt.Printf("%+v\n", *financialStatements)
}
```

```java tab="Java"
import com.fiscalisto.FiscalistoClient;
import com.fiscalisto.model.GetFinancialStatementsParams;

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

var financialStatements = fiscalisto.accounting().financialStatements(new GetFinancialStatementsParams().setMonth("2026-10"));
System.out.println(financialStatements);
```

```csharp tab="C#"
using Fiscalisto;

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

var financialStatements = await fiscalisto.Accounting.FinancialStatementsAsync(new GetFinancialStatementsParams { Month = "2026-10" });
```

El estado de resultados del mes y del año hasta ese mes (`income_statement`), y el balance general al cierre del mes (`balance_sheet`), leídos de la misma balanza. Cada sección del estado de resultados (`ingresos`, `costos`, `gastos`, `financiamiento`, `otros`) suma en positivo lo que aumenta la utilidad y en negativo lo que la reduce, y se agrupa por el primer nivel del código agrupador con sus cuentas. En el balance, `difference` es activo menos pasivo y capital: 0 cuando los libros cuadran. `missing_invoices` cuenta los pagos de facturas que no están en Fiscalisto y no se registraron.

## Cruce con lo declarado

```bash tab="cURL"
curl "https://api.fiscalisto.com/v1/accounting/cross_checks?year=2026" \
  -H "Authorization: Bearer $FISCALISTO_API_KEY"
```

```ts tab="TypeScript"
import { Fiscalisto } from "fiscalisto";

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

const crossChecks = await fiscalisto.accounting.crossChecks({ year: 2026 });
```

```python tab="Python"
from fiscalisto import Fiscalisto

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

cross_checks = fiscalisto.accounting.cross_checks({"year": 2026})
```

```php tab="PHP"
<?php

use Fiscalisto\Fiscalisto;

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

$crossChecks = $fiscalisto->accounting->crossChecks(['year' => 2026]);
```

```go tab="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, &fiscalisto.GetCrossChecksParams{
		Year: fiscalisto.Int64(2026),
	})
	if err != nil {
		log.Fatal(err)
	}
	fmt.Printf("%+v\n", *crossChecks)
}
```

```java tab="Java"
import com.fiscalisto.FiscalistoClient;
import com.fiscalisto.model.GetCrossChecksParams;

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

var crossChecks = fiscalisto.accounting().crossChecks(new GetCrossChecksParams().setYear(2026));
System.out.println(crossChecks);
```

```csharp tab="C#"
using Fiscalisto;

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

var crossChecks = await fiscalisto.Accounting.CrossChecksAsync(new GetCrossChecksParams { Year = 2026 });
```

Cada mes del año cuya declaración mensual ya venció (el día 17 del mes siguiente) compara lo que el emisor declaró con lo que dicen sus CFDI: `vat_charged` (IVA trasladado), `vat_creditable` (IVA acreditable), `vat_withheld` (IVA que le retuvieron, de sus facturas emitidas y de las constancias de retenciones que recibió) e `isr_income` (ingresos para ISR). En los meses en que el emisor retuvo, también sus retenciones: `isr_withheld_salaries` (ISR por salarios y asimilados contra sus recibos de nómina, por fecha de pago), `isr_withheld_suppliers` (ISR por honorarios y arrendamiento contra las facturas recibidas que pagó) y `vat_withheld_suppliers` (IVA retenido a proveedores). Si la declaración del mes no trae una retención que sus CFDI sí tienen, `declared` es 0 y el cruce `differs`. Lo declarado sale de sus [declaraciones del SAT](https://fiscalisto.com/docs/api/declaraciones-del-sat), así que pida antes `POST /v1/sat_declarations/refresh`; este cruce no consulta al SAT y no cuesta timbres.

Cada cruce dice `matches` (hasta $2 de diferencia, el redondeo de las declaraciones en pesos enteros), `differs`, `not_filed` (no hay declaración de ese mes) o `unreadable` (la declaración no trae la cifra en un renglón reconocible: `declared` es `null`, nunca 0). Un mes con complementaria toma, por impuesto, la más reciente que lo trae. Cuando la declaración dice aparte lo que llegó sin CFDI (en `isr_income`, los ingresos nominales adicionales; en `vat_charged`, el IVA al 16% por encima del que el SAT precargó de sus facturas), eso viene en `declared_without_cfdi` y solo el resto se compara: `difference` es `declared` menos `declared_without_cfdi` menos `invoiced`. `vat_balance_in_favor` suma el IVA a favor del año y lo que se acreditó después, y `tax_regimes` dice con qué régimen facturó y si está en su constancia.

### Los CFDI de una cifra

```bash tab="cURL"
curl "https://api.fiscalisto.com/v1/accounting/cross_checks/cfdi?month=2026-09&key=vat_creditable" \
  -H "Authorization: Bearer $FISCALISTO_API_KEY"
```

```ts tab="TypeScript"
import { Fiscalisto } from "fiscalisto";

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

const crossCheckCfdi = await fiscalisto.accounting.crossCheckCfdi({ month: "2026-09", key: "vat_creditable" });
```

```python tab="Python"
from fiscalisto import Fiscalisto

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

cross_check_cfdi = fiscalisto.accounting.cross_check_cfdi({"month": "2026-09", "key": "vat_creditable"})
```

```php tab="PHP"
<?php

use Fiscalisto\Fiscalisto;

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

$crossCheckCfdi = $fiscalisto->accounting->crossCheckCfdi([
    'month' => '2026-09',
    'key' => 'vat_creditable',
]);
```

```go tab="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()

	crossCheckCFDI, err := client.Accounting.CrossCheckCFDI(ctx, &fiscalisto.GetCrossCheckCfdiParams{
		Month: "2026-09",
		Key:   "vat_creditable",
	})
	if err != nil {
		log.Fatal(err)
	}
	fmt.Printf("%+v\n", *crossCheckCFDI)
}
```

```java tab="Java"
import com.fiscalisto.FiscalistoClient;
import com.fiscalisto.model.GetCrossCheckCfdiParams;

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

var crossCheckCfdi = fiscalisto.accounting().crossCheckCfdi(new GetCrossCheckCfdiParams()
        .setMonth("2026-09")
        .setKey("vat_creditable"));
System.out.println(crossCheckCfdi);
```

```csharp tab="C#"
using Fiscalisto;

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

var crossCheckCfdi = await fiscalisto.Accounting.CrossCheckCfdiAsync(new GetCrossCheckCfdiParams
{
    Month = "2026-09",
    Key = "vat_creditable",
});
```

Para ver por qué una cifra `differs`, `GET /v1/accounting/cross_checks/cfdi` con el mes (`month`, cuya declaración ya venció) y la cifra (`key`: `vat_charged`, `vat_creditable`, `vat_withheld`, `isr_income`, `isr_withheld_salaries`, `isr_withheld_suppliers` o `vat_withheld_suppliers`) da los CFDI que forman lo facturado (`invoiced`), con los mismos cálculos de Impuestos y de mayor a menor. Cada uno trae su `uuid`, la contraparte (`tax_id`, `name`), la fecha y lo que aporta (`amount`). En `isr_withheld_salaries` son los recibos de nómina del mes (por fecha de pago) con el ISR retenido a cada empleado, y en las retenciones a proveedores las facturas recibidas que pagó en el mes. `type` es `invoice` (factura PUE, en su mes), `credit_note` (nota de crédito: resta), `payment` (lo que se pagó en el mes de una factura PPD; `uuid` es el de la factura) o `withholding_certificate` (en `vat_withheld`, una constancia de retenciones que recibió, como las de plataformas de hospedaje, en el mes en que se emitió; `uuid` es el de la constancia). La suma de `cfdi` más `adjustment` es `invoiced`. `adjustment` es lo que Impuestos agrega sobre los CFDI: en `vat_creditable`, la proporción de gastos comunes, el IVA retenido enterado del mes anterior y las importaciones. Trae también `status`, `declared` y `difference` de esa cifra, como el cruce del año. Tampoco consulta al SAT ni cuesta timbres.

## Catálogo

`GET /v1/accounting/accounts` es el catálogo de cuentas, cada una con su código agrupador del Anexo 24.

## Contabilidad electrónica

```bash tab="cURL"
curl "https://api.fiscalisto.com/v1/accounting/electronic_accounting?month=2026-10" \
  -H "Authorization: Bearer $FISCALISTO_API_KEY" -o contabilidad.zip
```

```ts tab="TypeScript"
import { writeFile } from "node:fs/promises";
import { Fiscalisto } from "fiscalisto";

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

await writeFile("contabilidad.zip", await fiscalisto.accounting.electronicAccounting({ month: "2026-10" }));
```

```python tab="Python"
from fiscalisto import Fiscalisto

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

with open("contabilidad.zip", "w", encoding="utf-8") as f:
    f.write(fiscalisto.accounting.electronic_accounting({"month": "2026-10"}))
```

```php tab="PHP"
<?php

use Fiscalisto\Fiscalisto;

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

file_put_contents('contabilidad.zip', $fiscalisto->accounting->electronicAccounting(['month' => '2026-10']));
```

```go tab="Go"
package main

import (
	"context"
	"log"
	"os"

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

	xml, err := client.Accounting.ElectronicAccounting(ctx, &fiscalisto.GetElectronicAccountingParams{Month: "2026-10"})
	if err != nil {
		log.Fatal(err)
	}
	if err := os.WriteFile("contabilidad.zip", []byte(xml), 0o644); err != nil {
		log.Fatal(err)
	}
}
```

```java tab="Java"
import com.fiscalisto.FiscalistoClient;
import com.fiscalisto.model.GetElectronicAccountingParams;
import java.nio.file.Files;
import java.nio.file.Path;

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

Files.writeString(Path.of("contabilidad.zip"), fiscalisto.accounting().electronicAccounting(new GetElectronicAccountingParams().setMonth("2026-10")));
```

```csharp tab="C#"
using Fiscalisto;

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

await File.WriteAllTextAsync("contabilidad.zip", await fiscalisto.Accounting.ElectronicAccountingAsync(new GetElectronicAccountingParams { Month = "2026-10" }));
```

Un ZIP con el catálogo (`CT`) y la balanza (`BN`) en el formato 1.3 del Anexo 24, cada uno en su ZIP con el nombre que espera el Buzón Tributario (`RFC` + año + mes + tipo).

- Una balanza que corrige otra ya enviada: `type=complementary` y el día en que se modificó en `modified_on` (sale `BC`).
- Las pólizas (`PL`) se entregan cuando el SAT las pide: agregue `journal_request` con el motivo (`AF` acto de fiscalización o `FC` fiscalización compulsa, con `order_number`; `DE` devolución o `CO` compensación, con `procedure_number`).

## DIOT

`GET /v1/accounting/diot?month=2026-09` dice lo efectivamente pagado a cada proveedor en el mes (facturas PUE y complementos de pago que recibió), con sus notas de crédito como devoluciones, una línea por proveedor y tipo de operación. `blacklisted` marca a los proveedores en la lista 69-B definitiva, y `warnings` lo que conviene revisar.

`GET /v1/accounting/diot/file?month=2026-09` es el archivo TXT de carga masiva de la DIOT 2025, listo para la plataforma del SAT. Con `group_small_suppliers=true` junta en una línea global a los proveedores de hasta $50,000 en el mes, mientras no pasen del 10 % de lo pagado (regla 4.5.2 de la RMF). Un mes sin pagos a proveedores responde `diot_empty`: esa DIOT se presenta sin operaciones desde el portal del SAT.

La DIOT sale de las facturas recibidas: pida antes las del mes con [POST /v1/sat_downloads](https://fiscalisto.com/docs/api/descargas-del-sat). Se arma desde enero de 2025, con el formato de ese año.
