Contabilidad y reportes
El módulo de Contabilidad agrupa varios submódulos —plan de cuentas, libro diario, libro IVA, reportes, conciliación bancaria, calendario y cierre fiscal, retenciones y percepciones— accesibles de forma programática desde la API.
Introducción
El módulo de Contabilidad agrupa varios submódulos independientes. La mayoría de ellos exponen endpoints específicos de su dominio (cierre de libros, declaraciones, conciliación, reportes) y no el patrón CRUD genérico de otros recursos. Las excepciones son el plan de cuentas y el libro diario, que sí siguen un CRUD estándar.
Todos los submódulos de Contabilidad se autentican con el scope accounting: accounting:read para consultar y accounting:write para crear o modificar. El recurso de Estadísticas usa un scope propio, stats:read, y es de solo lectura.
Los endpoints se sirven bajo la URL base https://api.yo-facturo.com y cada submódulo tiene su propio prefijo, indicado abajo en la línea «Endpoint base».
Plan de cuentas
CRUD de las cuentas contables que componen el plan de cuentas. Cada cuenta tiene un código, un tipo y una posición jerárquica que permite armar el árbol contable. Soporta cargar un plan de cuentas argentino por defecto y consultar el saldo de cada cuenta.
Endpoint base: /api/v1/accounting/accounts
Scope: accounting:read / accounting:write
Campos
Body de POST /api/v1/accounting/accounts/:
| Campo | Tipo | Requerido | Notas |
|---|---|---|---|
code | string | Sí | Código de la cuenta. Entre 1 y 20 caracteres. |
name | string | Sí | Nombre de la cuenta. Entre 1 y 200 caracteres. |
account_type | string | Sí | Tipo de cuenta. Valores admitidos: asset, liability, equity, revenue, expense. |
parent_code | string | No | Código de la cuenta padre, para armar la jerarquía. |
level | integer | No | Nivel jerárquico de la cuenta. Entre 1 y 5. |
is_detail | boolean | No | Indica si la cuenta es imputable (de detalle). |
description | string | No | Descripción de la cuenta. Hasta 500 caracteres. |
afip_code | string | No | Código AFIP asociado a la cuenta. |
Petición
{
"code": "1.1.01",
"name": "Caja",
"account_type": "asset",
"parent_code": "1.1",
"level": 3,
"is_detail": true,
"description": "Dinero en efectivo disponible"
}Respuesta
{
"success": true,
"data": {
"_id": "66f1a2b3c4d5e6f7a8b9c0d1",
"code": "1.1.01",
"name": "Caja",
"account_type": "asset",
"parent_code": "1.1",
"level": 3,
"is_detail": true,
"is_active": true,
"balance": 0.0
}
}Libro diario
CRUD de asientos contables. Cada asiento se compone de al menos dos líneas que imputan cuentas al debe y al haber. Los asientos se crean en estado de borrador y luego pueden asentarse (post) para actualizar los saldos de las cuentas, o revertirse mediante un contrasiento.
Endpoint base: /api/v1/accounting/journal
Scope: accounting:read / accounting:write
Campos
Body de POST /api/v1/accounting/journal/:
| Campo | Tipo | Requerido | Notas |
|---|---|---|---|
date | string | No | Fecha del asiento. |
description | string | Sí | Descripción o glosa del asiento. Entre 1 y 500 caracteres. |
lines | array | Sí | Líneas del asiento. Mínimo 2 líneas. Cada línea es un objeto con los campos de la tabla siguiente. |
reference_type | string | No | Tipo de documento que originó el asiento. |
reference_id | string | No | ID del documento que originó el asiento. |
Cada elemento del array lines tiene estos campos:
| Campo | Tipo | Requerido | Notas |
|---|---|---|---|
account_code | string | Sí | Código de la cuenta contable imputada. |
account_name | string | No | Nombre de la cuenta imputada. |
debit | number | No | Importe al debe. Mínimo 0. |
credit | number | No | Importe al haber. Mínimo 0. |
description | string | No | Descripción de la línea. |
Petición
{
"date": "2026-05-21",
"description": "Venta de mercadería en efectivo",
"lines": [
{
"account_code": "1.1.01",
"account_name": "Caja",
"debit": 12100.00,
"credit": 0.00
},
{
"account_code": "4.1.01",
"account_name": "Ventas",
"debit": 0.00,
"credit": 10000.00
},
{
"account_code": "2.1.05",
"account_name": "IVA Débito Fiscal",
"debit": 0.00,
"credit": 2100.00
}
],
"reference_type": "invoice",
"reference_id": "66f1a2b3c4d5e6f7a8b9c0d1"
}Respuesta
{
"success": true,
"data": {
"_id": "66f1a2b3c4d5e6f7a8b9c0e2",
"date": "2026-05-21",
"description": "Venta de mercadería en efectivo",
"lines": [
{ "account_code": "1.1.01", "debit": 12100.00, "credit": 0.00 },
{ "account_code": "4.1.01", "debit": 0.00, "credit": 10000.00 },
{ "account_code": "2.1.05", "debit": 0.00, "credit": 2100.00 }
],
"total_debit": 12100.00,
"total_credit": 12100.00,
"status": "draft"
}
}Libro IVA
Gestión de los libros de IVA compras y ventas, la administración de impuestos y la generación de la declaración jurada de IVA. Los libros se arman por período, pueden cerrarse y reabrirse, y exportarse para su presentación.
Endpoint base: /api/v1/iva
Scope: accounting:read / accounting:write
Este submódulo expone endpoints específicos de su dominio. Estos son los principales:
| Método | Endpoint | Descripción |
|---|---|---|
GET | /config/ | Obtener la configuración de IVA de la cuenta |
PUT | /config/ | Actualizar la configuración de IVA |
GET | /books/{period}/{book_type}/ | Obtener un libro de IVA (compras o ventas) de un período |
GET | /books/{book_id}/entries/ | Listar las entradas de un libro de IVA |
POST | /books/{book_id}/entries/ | Agregar una entrada manual a un libro de IVA |
PUT | /entries/{entry_id}/ | Editar una entrada de un libro de IVA |
DELETE | /entries/{entry_id}/ | Eliminar una entrada de un libro de IVA |
POST | /books/{period}/close/ | Cerrar el libro de IVA de un período |
POST | /books/{period}/reopen/ | Reabrir un libro de IVA cerrado |
GET | /summary/{period}/ | Resumen de IVA del período |
POST | /summary/{period}/calculate/ | Recalcular el resumen de IVA del período |
GET | /declaration/{period}/ | Declaración jurada de IVA del período |
GET | /export/{period}/{book_type}/ | Exportar un libro de IVA del período |
Reportes contables
Reportes contables generados a partir del plan de cuentas y los asientos del libro diario: balance de sumas y saldos, estado de resultados, balance general, libro mayor y flujo de efectivo.
Endpoint base: /api/v1/accounting/reports
Scope: accounting:read
Este submódulo expone endpoints específicos de su dominio, todos de solo lectura:
| Método | Endpoint | Descripción |
|---|---|---|
GET | /trial-balance/ | Balance de sumas y saldos |
GET | /income-statement/ | Estado de resultados |
GET | /balance-sheet/ | Balance general (estado de situación patrimonial) |
GET | /general-ledger/ | Libro mayor general |
GET | /account-ledger/{account_code}/ | Mayor de una cuenta puntual |
GET | /daily-journal/{date}/ | Libro diario de una fecha |
GET | /cash-flow/ | Estado de flujo de efectivo |
Conciliación bancaria
Importación de extractos bancarios y conciliación de sus movimientos contra los registros contables. Soporta conciliación automática y conciliación manual movimiento por movimiento.
Endpoint base: /api/v1/accounting/bank
Scope: accounting:read / accounting:write
Este submódulo expone endpoints específicos de su dominio. Estos son los principales:
| Método | Endpoint | Descripción |
|---|---|---|
GET | /statements/ | Listar los extractos bancarios importados |
GET | /statements/{statement_id}/ | Obtener un extracto bancario |
POST | /import/ | Importar un extracto bancario |
POST | /auto-match/{statement_id}/ | Conciliar automáticamente un extracto |
POST | /manual-match/ | Conciliar manualmente un movimiento |
Calendario fiscal
Seguimiento de los vencimientos fiscales: lista de obligaciones, vencimientos próximos y marcado de obligaciones como cumplidas. Permite cargar un set de vencimientos por defecto.
Endpoint base: /api/v1/accounting/fiscal-calendar
Scope: accounting:read / accounting:write
Este submódulo expone endpoints específicos de su dominio. Estos son los principales:
| Método | Endpoint | Descripción |
|---|---|---|
GET | / | Listar los vencimientos fiscales |
GET | /upcoming/ | Vencimientos fiscales próximos |
POST | /seed/ | Cargar los vencimientos fiscales por defecto |
POST | /{deadline_id}/complete/ | Marcar un vencimiento como cumplido |
Cierre fiscal
Cierre del ejercicio contable. Permite listar los ejercicios fiscales, calcular el resultado del ejercicio antes de cerrarlo y ejecutar el cierre definitivo del año.
Endpoint base: /api/v1/accounting/fiscal-close
Scope: accounting:read / accounting:write
Este submódulo expone endpoints específicos de su dominio. Estos son los principales:
| Método | Endpoint | Descripción |
|---|---|---|
GET | /years/ | Listar los ejercicios fiscales |
GET | /calculate/{year}/ | Calcular el resultado del ejercicio antes de cerrar |
POST | /close/{year}/ | Cerrar el ejercicio fiscal |
Retenciones y percepciones
Administración de regímenes de retención y percepción, cálculo y aplicación de retenciones y percepciones, emisión de certificados y generación de declaraciones juradas del período.
Endpoint base: /api/v1/accounting/retenciones-percepciones
Scope: accounting:read / accounting:write
Este submódulo expone endpoints específicos de su dominio. Estos son los principales:
| Método | Endpoint | Descripción |
|---|---|---|
GET | /config/ | Obtener la configuración de retenciones y percepciones |
PUT | /config/ | Actualizar la configuración |
GET | /regimes/ | Listar los regímenes de retención y percepción |
POST | /regimes/ | Crear un régimen |
GET | /retenciones/ | Listar las retenciones |
POST | /retenciones/calculate/ | Calcular una retención |
POST | /retenciones/apply/ | Aplicar una retención |
GET | /percepciones/ | Listar las percepciones |
POST | /percepciones/calculate/ | Calcular una percepción |
GET | /certificates/ | Listar los certificados emitidos |
POST | /certificates/ | Emitir un certificado |
GET | /ddjj/{period}/ | Declaración jurada del período |
Datos fiscales
Datos fiscales del contribuyente por sistema de facturación. Permite cargar y mantener los datos del contribuyente, elegir el sistema de facturación activo, gestionar el certificado y verificar la delegación de servicios y los puntos de venta ante AFIP.
Endpoint base: /api/v1/bill/tax_info
Scope: accounting:read / accounting:write
Este submódulo expone endpoints específicos de su dominio. Estos son los principales:
| Método | Endpoint | Descripción |
|---|---|---|
GET | /taxpayer/ | Obtener los datos fiscales del contribuyente |
GET | /taxpayer/systems/ | Listar los sistemas de facturación soportados |
GET | /taxpayer/{billing_system}/ | Obtener los datos fiscales de un sistema de facturación |
POST | /taxpayer/{billing_system}/ | Cargar los datos fiscales de un sistema de facturación |
PUT | /taxpayer/{billing_system}/ | Actualizar los datos fiscales de un sistema |
DELETE | /taxpayer/{billing_system}/ | Eliminar los datos fiscales de un sistema |
PATCH | /taxpayer/active-system/ | Cambiar el sistema de facturación activo |
POST | /verify-delegation/ | Verificar la delegación de servicios ante AFIP |
POST | /verify-punto-venta/ | Verificar un punto de venta habilitado |
Multi-CUIT (identidades fiscales adicionales)
CRUD de CUITs adicionales para cuentas que facturan bajo más de una identidad fiscal (por ejemplo, varias razones sociales o sucursales con CUIT propio). El CUIT primario de la cuenta nunca se administra acá: sigue viviendo en Datos fiscales y el flujo normal de facturación lo sigue usando exactamente igual si no elegís uno adicional explícitamente.
Este recurso está detrás del widget multi-taxpayer: si la cuenta no lo tiene activo, los seis endpoints responden 403 aunque el token tenga el scope correcto. Sin el widget activo, la facturación sigue funcionando con normalidad usando solo el CUIT primario.
Endpoint base: /api/v1/widgets/multi-taxpayer/taxpayers
Scope: accounting:read / accounting:write
Campos
Body de POST /taxpayers/. Cada campo tiene un alias en español (terminología AFIP), aceptado indistintamente:
| Campo | Tipo | Requerido | Notas |
|---|---|---|---|
tax_id | string | Sí | Alias: numero_documento. El CUIT del contribuyente adicional. No puede repetir el del primario ni el de otro adicional, y es inmutable tras el alta. |
tax_condition | string | No | Alias: condicion_iva. Uno de: responsable_inscripto, monotributo, exento, no_alcanzado. Por defecto responsable_inscripto. |
punto_venta | string | No | Punto de venta AFIP habilitado para este CUIT adicional. |
business_name | string | No | Alias: razon_social. Razón social del contribuyente adicional. |
first_name | string | No | Alias: nombre. Nombre, si es persona física. |
last_name | string | No | Alias: apellido. Apellido, si es persona física. |
afip_environment | string | No | "testing" o "production". Por defecto hereda el del contribuyente primario. |
certificates | array | No | Array de certificados AFIP. Puede omitirse en el alta y cargarse después. |
Endpoints
Relativos a /api/v1/widgets/multi-taxpayer/taxpayers. No hay operaciones masivas ni DELETE en cascada: borrar un CUIT adicional no toca los comprobantes ya emitidos con él, solo desactiva la posibilidad de emitir nuevos bajo esa identidad.
| Método | Endpoint | Descripción |
|---|---|---|
GET | / | Listar los CUITs adicionales de la cuenta (sin el primario) |
GET | /all/ | Listar el primario + los adicionales en un solo array |
GET | /{id}/ | Obtener un CUIT adicional por su ID |
POST | / | Dar de alta un CUIT adicional |
PUT | /{id}/ | Actualizar un CUIT adicional (no permite cambiar el CUIT) |
DELETE | /{id}/ | Eliminar un CUIT adicional |
Petición
POST /api/v1/widgets/multi-taxpayer/taxpayers/
{
"tax_id": "30712345679",
"tax_condition": "responsable_inscripto",
"punto_venta": "2",
"business_name": "Sucursal Norte S.A.",
"afip_environment": "production"
}Respuesta
{
"success": true,
"message": "Taxpayer adicional creado exitosamente",
"data": {
"success": true,
"message": "Taxpayer adicional creado exitosamente",
"taxpayer": {
"id": "5b6c7d8e-9f0a-4b1c-8d2e-3f4a5b6c7d8e",
"tax_id": "30712345679",
"tax_condition": "responsable_inscripto",
"punto_venta": "2",
"business_name": "Sucursal Norte S.A.",
"afip_environment": "production"
}
}
}GET /all/ es la lista pensada para armar un selector: devuelve el primario y los adicionales juntos, cada uno con el flag is_primary:
curl "https://api.yo-facturo.com/api/v1/widgets/multi-taxpayer/taxpayers/all/" \ -H "X-API-Key: TU_TOKEN"
{
"success": true,
"data": {
"items": [
{
"id": "1a2b3c4d-5e6f-4a7b-8c9d-0e1f2a3b4c5d",
"tax_id": "30709876543",
"business_name": "Mi Empresa S.A.",
"afip_environment": "production",
"is_primary": true
},
{
"id": "5b6c7d8e-9f0a-4b1c-8d2e-3f4a5b6c7d8e",
"tax_id": "30712345679",
"business_name": "Sucursal Norte S.A.",
"afip_environment": "production",
"is_primary": false
}
],
"count": 2
}
}Reglas de impuestos
CRUD de reglas de impuestos reutilizables (alícuotas de IVA y otros impuestos) para componer el precio de tus productos. Cada regla tiene un país, una categoría y una alícuota, y puede marcarse como la regla por defecto de su combinación país + categoría. Incluye un endpoint para cargar de una vez las alícuotas de IVA habituales de un país.
Endpoint base: /api/v1/bill/tax_info/tax-rules
Scope: accounting:read / accounting:write
Campos
Body de POST /api/v1/bill/tax_info/tax-rules/:
| Campo | Tipo | Requerido | Notas |
|---|---|---|---|
name | string | Sí | Nombre de la regla. Entre 1 y 200 caracteres. |
rate | número | Sí | Alícuota, en porcentaje. Entre 0 y 100. |
country | string | Sí | Código de país de 2 letras (AR, UY, MX, CO, BR, BO, PE, ...). Se guarda en mayúsculas. |
category | string | No | Una de: iva, internal, provincial, municipal, other. Por defecto iva. |
type | string | No | Único valor admitido: percentage (por defecto). |
description | string | No | Descripción de la regla. Hasta 500 caracteres. |
is_default | boolean | No | Marca esta regla como la alícuota por defecto para su país+categoría (desmarca cualquier otra que lo fuera). |
display_order | entero | No | Orden de visualización. Entero mayor o igual a 0. |
Endpoints
Relativos a /api/v1/bill/tax_info/tax-rules. GET / y GET /by-country/{country}/ devuelven, por defecto, solo las reglas activas (is_active: true); para incluir las desactivadas, pasá ?is_active=false explícitamente a GET /.
| Método | Endpoint | Descripción |
|---|---|---|
GET | / | Listar las reglas de impuestos (filtros: country, category, is_active) |
GET | /{rule_id}/ | Obtener una regla de impuesto |
POST | / | Crear una regla de impuesto |
PUT | /{rule_id}/ | Actualizar una regla de impuesto |
DELETE | /{rule_id}/ | Baja lógica de una regla (la desactiva, is_active: false) |
GET | /by-country/{country}/ | Listar las reglas activas de un país (código de 2 letras) |
POST | /seed/{country}/ | Cargar las alícuotas de IVA por defecto de un país (idempotente) |
Petición
POST /api/v1/bill/tax_info/tax-rules/
{
"name": "IVA 21%",
"rate": 21,
"country": "AR",
"category": "iva",
"is_default": true,
"display_order": 1
}Respuesta
{
"success": true,
"data": {
"id": "9c1d2e3f-4a5b-4c6d-8e7f-1a2b3c4d5e6f",
"name": "IVA 21%",
"rate": 21.0,
"country": "AR",
"category": "iva",
"type": "percentage",
"description": "",
"is_default": true,
"is_active": true,
"display_order": 1
}
}GET /by-country/{country}/ —código de 2 letras— trae solo las reglas activas de ese país:
curl "https://api.yo-facturo.com/api/v1/bill/tax_info/tax-rules/by-country/AR/" \ -H "X-API-Key: TU_TOKEN"
POST /seed/{country}/ carga las alícuotas de IVA por defecto del país (AR, UY, MX, CO, BR, BO o PE). Es todo o nada por país: si ya existe cualquier regla para ese país, no inserta nada y devuelve seeded: 0 con un mensaje avisando que ya existían — no hay manera de sembrar solo las que faltan.
curl -X POST "https://api.yo-facturo.com/api/v1/bill/tax_info/tax-rules/seed/AR/" \ -H "X-API-Key: TU_TOKEN"
{
"success": true,
"data": {
"message": "Tax rules already exist for AR",
"seeded": 0
}
}Estadísticas
Métricas del negocio: indicadores del panel principal, estadísticas de actividad y métricas de transacciones. Es un recurso de solo lectura.
Endpoint base: /api/v1/stats
Scope: stats:read (solo lectura)
Endpoints principales de Estadísticas:
| Método | Endpoint | Descripción |
|---|---|---|
GET | /dashboard/ | Métricas del panel principal del negocio |
GET | /activity/ | Estadísticas de actividad |
POST | /transactions/ | Métricas de transacciones |