API

Documentación para desarrolladores

Scope: accounting

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/:

CampoTipoRequeridoNotas
codestringCódigo de la cuenta. Entre 1 y 20 caracteres.
namestringNombre de la cuenta. Entre 1 y 200 caracteres.
account_typestringTipo de cuenta. Valores admitidos: asset, liability, equity, revenue, expense.
parent_codestringNoCódigo de la cuenta padre, para armar la jerarquía.
levelintegerNoNivel jerárquico de la cuenta. Entre 1 y 5.
is_detailbooleanNoIndica si la cuenta es imputable (de detalle).
descriptionstringNoDescripción de la cuenta. Hasta 500 caracteres.
afip_codestringNoCó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/:

CampoTipoRequeridoNotas
datestringNoFecha del asiento.
descriptionstringDescripción o glosa del asiento. Entre 1 y 500 caracteres.
linesarrayLíneas del asiento. Mínimo 2 líneas. Cada línea es un objeto con los campos de la tabla siguiente.
reference_typestringNoTipo de documento que originó el asiento.
reference_idstringNoID del documento que originó el asiento.

Cada elemento del array lines tiene estos campos:

CampoTipoRequeridoNotas
account_codestringCódigo de la cuenta contable imputada.
account_namestringNoNombre de la cuenta imputada.
debitnumberNoImporte al debe. Mínimo 0.
creditnumberNoImporte al haber. Mínimo 0.
descriptionstringNoDescripció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étodoEndpointDescripció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étodoEndpointDescripció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étodoEndpointDescripció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étodoEndpointDescripció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étodoEndpointDescripció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étodoEndpointDescripció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étodoEndpointDescripció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:

CampoTipoRequeridoNotas
tax_idstringAlias: 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_conditionstringNoAlias: condicion_iva. Uno de: responsable_inscripto, monotributo, exento, no_alcanzado. Por defecto responsable_inscripto.
punto_ventastringNoPunto de venta AFIP habilitado para este CUIT adicional.
business_namestringNoAlias: razon_social. Razón social del contribuyente adicional.
first_namestringNoAlias: nombre. Nombre, si es persona física.
last_namestringNoAlias: apellido. Apellido, si es persona física.
afip_environmentstringNo"testing" o "production". Por defecto hereda el del contribuyente primario.
certificatesarrayNoArray 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étodoEndpointDescripció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/:

CampoTipoRequeridoNotas
namestringNombre de la regla. Entre 1 y 200 caracteres.
ratenúmeroAlícuota, en porcentaje. Entre 0 y 100.
countrystringCódigo de país de 2 letras (AR, UY, MX, CO, BR, BO, PE, ...). Se guarda en mayúsculas.
categorystringNoUna de: iva, internal, provincial, municipal, other. Por defecto iva.
typestringNoÚnico valor admitido: percentage (por defecto).
descriptionstringNoDescripción de la regla. Hasta 500 caracteres.
is_defaultbooleanNoMarca esta regla como la alícuota por defecto para su país+categoría (desmarca cualquier otra que lo fuera).
display_orderenteroNoOrden 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étodoEndpointDescripció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étodoEndpointDescripción
GET/dashboard/Métricas del panel principal del negocio
GET/activity/Estadísticas de actividad
POST/transactions/Métricas de transacciones