Guía de Amable Conti
API
Integra comprobantes, ventas, compras, reportes Z y notas mediante la API de Amable Conti.
La API v1 permite registrar documentos en Amable Conti desde otros sistemas. Cada solicitud utiliza las mismas validaciones contables, fiscales y de permisos que la interfaz web.
El flujo habitual de una integración es:
- Crear una clave de API y seleccionar las empresas y acciones permitidas.
- Consultar los catálogos para obtener los IDs requeridos.
- Enviar el documento al endpoint correspondiente.
- Procesar la respuesta o corregir los errores informados.
Primeros pasos
URL base
Todas las rutas de esta guía parten de una empresa autorizada:
https://www.amableconti.com/api/v1/empresas/{empresaId}Las solicitudes que incluyen un cuerpo deben usar Content-Type: application/json.
Autenticación
- Abre Configuración > Claves de API (
/configuracion/api-keys). - Crea una clave y selecciona al menos una empresa, las acciones permitidas y un vencimiento: 30 días, 90 días, 1 año o sin vencimiento.
- Guarda la clave cuando se muestre. La clave completa solo aparece una vez.
- Usa el ID de una empresa autorizada en la URL y envía la clave en la cabecera
x-api-keyde cada solicitud.
curl 'https://www.amableconti.com/api/v1/empresas/123/cuentas' \
-H 'x-api-key: ac_live_REEMPLAZAR'Cada clave admite un subconjunto de las empresas y permisos de su propietario. Solo puedes delegar permisos que ya posees. Una solicitud se autoriza si la empresa indicada pertenece a la clave y tanto la clave como su propietario conservan el permiso requerido.
La selección de cada empresa conserva el ejercicio que estaba activo al configurar la clave. Para cambiar empresas, ejercicios vinculados o permisos, edita la clave desde Configuración > Claves de API. Revocar desactiva inmediatamente las nuevas operaciones.
Guarda la clave ac_live_… en un gestor de secretos o una variable de entorno del servidor. No la incluyas en repositorios, registros, capturas ni código que se ejecute en el navegador. Si se expone, revócala y crea otra.
Cada clave admite hasta 120 solicitudes por minuto.
Ante un 429, espera antes de reintentar y aplica una pausa incremental. No repitas una creación sin determinar primero si la solicitud anterior alcanzó a completarse, porque la API no ofrece una clave de idempotencia general.
Referencia rápida
Crear documentos
| Método | Ruta | Resultado |
|---|---|---|
POST | /api/v1/empresas/{empresaId}/comprobantes | Comprobante contable manual |
POST | /api/v1/empresas/{empresaId}/ventas | Factura de venta |
POST | /api/v1/empresas/{empresaId}/compras | Factura de compra |
POST | /api/v1/empresas/{empresaId}/reportes-z | Reporte Z de venta |
POST | /api/v1/empresas/{empresaId}/notas-credito | Nota de crédito de compra o venta |
POST | /api/v1/empresas/{empresaId}/notas-debito | Nota de débito de compra o venta |
La ruta determina el tipoDocumento; no debes enviarlo en el cuerpo.
Consultar catálogos
| Método | Ruta | Permite obtener |
|---|---|---|
GET | /api/v1/empresas/{empresaId}/cuentas | cuentaId, cuentaDeudoraId y cuentaAcreedoraId |
GET | /api/v1/empresas/{empresaId}/auxiliares | auxiliarId y su tipo |
GET | /api/v1/empresas/{empresaId}/centros-costo | centroCostoId y sucursalId |
GET | /api/v1/empresas/{empresaId}/etiquetas-comprobante | IDs para comprobanteEtiqueta |
GET | /api/v1/empresas/{empresaId}/etiquetas-creativa | IDs para etiquetas en ventas y compras |
GET | /api/v1/empresas/{empresaId}/metodos-pago | metodoPagoId y su origen, compra o venta |
GET | /api/v1/empresas/{empresaId}/series | serieId |
GET | /api/v1/empresas/{empresaId}/documentos-afectables | documentoAfectadoId y su origen, compra o venta |
Todos los catálogos responden con la forma { "data": [...] }. Por ejemplo, GET /api/v1/empresas/123/cuentas puede devolver:
{
"data": [
{
"id": 120,
"codigo": "1-1-2-01",
"nombre": "Clientes",
"naturaleza": "activo",
"type": "Regular",
"monedaId": null,
"auxiliar": false,
"centroCosto": false
}
]
}Convenciones de datos
Fechas
Envía las fechas como cadenas ISO 8601 con zona horaria:
2026-08-20T10:00:00-04:00Montos
Envía los montos como números o cadenas con un máximo de dos decimales. La API reconoce automáticamente el punto o la coma decimal y los separadores de miles: 1000.01, "1000.01", "1.000,01" y "1,000.01" representan el mismo monto.
IDs y datos calculados
- Los IDs de auxiliares, cuentas, métodos de pago y demás referencias deben existir en la empresa asociada a la clave.
- No envíes
ivaIdniimpuestoMonedaId. Amable Conti infiere la alícuota vigente a partir defechaDocumento,basey el total del impuesto. - No envíes monedas ni
registroMoneda. En los comprobantes, Amable Conti calcula los importes de todas las monedas operativas usandofechay la configuración de la empresa.
Auxiliares
El tipo de auxiliar debe corresponder con el documento:
| Documento | Tipos de auxiliar admitidos |
|---|---|
| Venta | Cliente o Ambos |
| Compra | Proveedor o Ambos |
| Reporte Z | MaquinaFiscal |
Permisos
Para crear un documento Aprobado, el propietario de la clave necesita permiso de creación en documentos aprobados. Para crear un Borrador, necesita el permiso equivalente de borradores.
Campos compartidos
Las ventas, compras, reportes Z y notas comparten los siguientes campos:
| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
auxiliarId | number | Sí | Auxiliar compatible con el tipo de documento. |
fechaDocumento | ISO datetime | Sí | Fecha de emisión. No puede ser futura. |
fechaValidez | ISO datetime | Sí | Fecha contable. No puede ser futura ni anterior a fechaDocumento. |
estatus | string | Sí | Aprobado, Borrador o Papelera. |
tipoTransaccion | string | Sí | Registro o Anulacion. |
iva | array | Sí | Líneas de IVA. Debe incluir al menos una. |
contabilizar | boolean | No | Indica si se genera el comprobante. Por defecto es true. |
contabilizacion | string | Condicional | Inmediata o InmediataDetallada. Requerida en compras y al contabilizar ventas aprobadas. |
cuentaDeudoraId | number | Condicional | Cuenta deudora. Requerida al contabilizar con Inmediata. |
cuentaAcreedoraId | number | Condicional | Cuenta acreedora. Requerida al contabilizar un documento aprobado. |
metodosPago | array | Condicional | Líneas del asiento. Requeridas al contabilizar con InmediataDetallada. |
descripcionAsiento | string | No | Descripción personalizada del comprobante. |
sucursalId | number | No | Sucursal o centro de costo asociado. |
etiquetas | number[] | No | IDs obtenidos del recurso etiquetas-creativa de la misma empresa. |
Asiento detallado
Ventas, compras y reportes Z admiten contabilización inmediata detallada. Envía contabilizacion: "InmediataDetallada" y una o más líneas en metodosPago. Cada metodoPagoId se obtiene de GET /api/v1/empresas/{empresaId}/metodos-pago y debe corresponder al origen del documento, venta o compra.
| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
metodoPagoId | number | Sí | Método de registro del mismo origen y empresa. |
monto | number o string | Sí | Importe de la línea. |
montoExtranjero | number o string | Condicional | Requerido cuando la cuenta del método es de tipo Extranjera. |
referencia | string | No | Referencia de la línea del asiento, máximo 191 caracteres. |
centroCostoId | number | Condicional | Requerido cuando la cuenta del método utiliza centro de costo. |
En ventas y reportes Z, la suma de metodosPago[].monto debe ser igual al total del documento, incluido el IGTF y descontadas las retenciones incluidas. En compras, debe ser igual a la suma de las bases de las líneas de IVA. Amable Conti genera las líneas fiscales y la contrapartida en cuentaAcreedoraId. Por ejemplo, una venta con total 116.00 puede incluir este fragmento:
{
"contabilizar": true,
"contabilizacion": "InmediataDetallada",
"cuentaAcreedoraId": 450,
"metodosPago": [
{
"metodoPagoId": 12,
"monto": "70.00",
"referencia": "TRANSFERENCIA-1042"
},
{
"metodoPagoId": 15,
"monto": "46.00",
"centroCostoId": 8
}
]
}No envíes cuentaDeudoraId para sustituir las líneas detalladas. Esa cuenta pertenece al flujo Inmediata; en InmediataDetallada, las cuentas deudoras provienen de los métodos de registro.
IVA
Cada elemento de iva incluye la base imponible, el IVA y el total correspondiente:
{
"base": "100.00",
"totalIva": "16.00",
"total": "116.00"
}IGTF
El objeto impuestoMoneda es opcional y permite registrar IGTF:
{
"base": "116.00",
"totalImpuesto": "3.48",
"total": "119.48"
}Comprobantes
Crear un comprobante manual
POST /api/v1/empresas/{empresaId}/comprobantes
Este endpoint solo crea comprobantes de origen Manual en el período vinculado a la clave. No admite origen ni registroId. El número es opcional; si se omite, Amable Conti genera uno.
| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
numero | string o null | No | Número único dentro del período. |
fecha | ISO datetime | Sí | Fecha dentro del período y no futura. |
descripcion | string o null | No | Descripción general. |
estatus | string | Sí | Aprobado, Borrador, Revision o Papelera. |
comprobanteEtiqueta | number[] | No | IDs obtenidos de etiquetas-comprobante para la misma empresa. |
registros | array | Sí | Al menos dos líneas contables. |
Cada elemento de registros admite:
| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
cuentaId | number | Sí | Cuenta de movimiento obtenida de cuentas para la misma empresa. |
debe | number o string | Condicional | Monto. Es excluyente con haber. |
haber | number o string | Condicional | Monto. Es excluyente con debe. |
descripcion | string o null | No | Descripción de la línea. |
fechaRef | ISO datetime o null | No | Fecha de referencia de la línea. |
referencia | string o null | No | Referencia de la línea. |
auxiliarId | number o null | Condicional | Requerido si la cuenta usa auxiliar. |
centroCostoId | number o null | Condicional | Requerido si la cuenta usa centro de costo. |
cantidadExtranjera | number, string o null | Condicional | Requerido para una cuenta de tipo Extranjera. |
Un comprobante Aprobado debe balancear Debe y Haber. Las cuentas de orden se balancean por separado.
En este ejemplo se usa el formato decimal con coma:
{
"numero": "42",
"fecha": "2026-08-20T10:00:00-04:00",
"descripcion": "Venta sector privado",
"estatus": "Aprobado",
"registros": [
{
"cuentaId": 120,
"descripcion": "Clientes",
"debe": "10.000,00"
},
{
"cuentaId": 450,
"descripcion": "Ventas sector privado",
"haber": "10.000,00"
}
]
}Ventas
Crear una venta
POST /api/v1/empresas/{empresaId}/ventas
Además de los campos compartidos, una venta admite:
| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
numeroControl | string o null | Sí | Se normaliza a dígitos; puede ser null. |
numeroDocumento | string | No | Número de factura. |
serieId | number | No | Serie configurada en la empresa. |
isVentaTercero | boolean | No | Por defecto es false. |
Ejemplo de borrador sin contabilización:
{
"auxiliarId": 125,
"fechaDocumento": "2026-08-20T10:00:00-04:00",
"fechaValidez": "2026-08-20T10:00:00-04:00",
"estatus": "Borrador",
"tipoTransaccion": "Registro",
"numeroControl": "00-000123",
"numeroDocumento": "4580",
"contabilizar": false,
"iva": [
{
"base": "100.00",
"totalIva": "16.00",
"total": "116.00"
}
]
}Compras
Crear una compra
POST /api/v1/empresas/{empresaId}/compras
Además de los campos compartidos, una compra admite:
| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
numeroDocumentoCompra | string | Sí | Número de factura o nota del proveedor. |
numeroControl | string o null | Condicional | Requerido si no se envía numeroMaquinaFiscal. |
numeroMaquinaFiscal | string o null | Condicional | Requerido si no se envía numeroControl. |
serieString | string o null | No | Serie del documento del proveedor. |
creditoFiscal | string | Sí | Deducible, Prorrateable o NoDeducible. |
tipoCompra | string | Sí | Interna o Importacion. |
contabilizacion | string | Sí | Inmediata o InmediataDetallada. |
{
"auxiliarId": 210,
"fechaDocumento": "2026-08-20T10:00:00-04:00",
"fechaValidez": "2026-08-20T10:00:00-04:00",
"estatus": "Borrador",
"tipoTransaccion": "Registro",
"numeroDocumentoCompra": "FAC-9001",
"numeroControl": "00-000900",
"serieString": "A",
"creditoFiscal": "Deducible",
"tipoCompra": "Interna",
"contabilizar": false,
"contabilizacion": "Inmediata",
"iva": [
{
"base": "100.00",
"totalIva": "16.00",
"total": "116.00"
}
]
}Reportes Z
Crear un reporte Z
POST /api/v1/empresas/{empresaId}/reportes-z
Además de los campos compartidos, un reporte Z admite:
| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
numeroReporteZ | string | Sí | Número del reporte Z. |
numeroPrimeraFactura | string | No | Primera factura incluida. |
numeroUltimaFactura | string | No | Última factura incluida. |
cantidadDeFacturas | string | No | Cantidad de facturas. Si es "0", se omite el rango. |
cantidadDePagosIGTF | string | No | Cantidad de pagos sujetos a IGTF. |
{
"auxiliarId": 340,
"fechaDocumento": "2026-08-20T23:00:00-04:00",
"fechaValidez": "2026-08-20T23:00:00-04:00",
"estatus": "Borrador",
"tipoTransaccion": "Registro",
"numeroReporteZ": "000154",
"numeroPrimeraFactura": "1000",
"numeroUltimaFactura": "1025",
"cantidadDeFacturas": "26",
"contabilizar": false,
"iva": [
{
"base": "2,500.00",
"totalIva": "400.00",
"total": "2,900.00"
}
]
}Notas de crédito y débito
Crear una nota
POST /api/v1/empresas/{empresaId}/notas-creditoPOST /api/v1/empresas/{empresaId}/notas-debito
Ambas rutas requieren los campos compartidos y los siguientes campos:
| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
origen | string | Sí | venta o compra. |
documentoAfectadoId | number | Sí | ID del documento original del mismo origen y empresa. |
Una nota no puede tener una fecha anterior a la del documento afectado. Una nota de crédito tampoco puede exceder el saldo disponible del documento original.
Nota con origen en venta
Envía los campos de una venta y usa numeroDocumento como número de la nota:
{
"origen": "venta",
"documentoAfectadoId": 8001,
"auxiliarId": 125,
"fechaDocumento": "2026-08-21T10:00:00-04:00",
"fechaValidez": "2026-08-21T10:00:00-04:00",
"estatus": "Borrador",
"tipoTransaccion": "Registro",
"numeroControl": "00-000124",
"numeroDocumento": "81",
"contabilizar": false,
"iva": [
{
"base": "10.00",
"totalIva": "1.60",
"total": "11.60"
}
]
}Nota con origen en compra
Envía los campos de una compra y usa numeroDocumentoCompra como número de la nota:
{
"origen": "compra",
"documentoAfectadoId": 8100,
"auxiliarId": 210,
"fechaDocumento": "2026-08-21T10:00:00-04:00",
"fechaValidez": "2026-08-21T10:00:00-04:00",
"estatus": "Borrador",
"tipoTransaccion": "Registro",
"numeroDocumentoCompra": "NC-44",
"numeroControl": "00-000901",
"creditoFiscal": "Deducible",
"tipoCompra": "Interna",
"contabilizar": false,
"contabilizacion": "Inmediata",
"iva": [
{
"base": "10.00",
"totalIva": "1.60",
"total": "11.60"
}
]
}Respuestas
Creación exitosa
Una creación exitosa responde con 201 Created.
Para ventas, compras, reportes Z y notas, la respuesta tiene esta forma:
{
"id": 9120,
"origen": "venta",
"tipoDocumento": "Factura"
}Para un comprobante manual:
{
"id": 9121,
"origen": "Manual",
"tipoDocumento": "Comprobante"
}Errores
| Estado | Código | Significado |
|---|---|---|
400 | INVALID_JSON | El cuerpo no es un objeto JSON. |
400 | VALIDATION_ERROR | Faltan campos o tienen un formato inválido. |
401 | UNAUTHORIZED | La clave falta, es inválida, está vencida o fue revocada. |
403 | INVALID_SCOPE | El usuario ya no tiene acceso a la empresa asociada. |
403 | FORBIDDEN | El usuario no tiene permiso para crear ese documento. |
422 | DOCUMENT_ERROR | Una regla fiscal, contable o de duplicados impidió la creación. |
429 | RATE_LIMIT_EXCEEDED | La clave excedió 120 solicitudes en un minuto. |
500 | INTERNAL_ERROR | Error inesperado del servidor. |
Ejemplo de un error de validación:
{
"code": "VALIDATION_ERROR",
"error": "El cuerpo de la solicitud no es válido.",
"details": {
"fechaDocumento": {
"_errors": ["Invalid input"]
}
}
}