AnalySATAnalySAT/ API Docs
API v3 — REST / JSON

Documentación de la API de Analysat

Integra tus sistemas con Analysat para automatizar consultas de empresas, cuentas bancarias, transacciones y facturación SAT en tiempo real.

Empresas (RFC)
Cuentas bancarias
Transacciones
Facturas SAT
Descargas XML/PDF
Reportes Excel

URL base

Todas las solicitudes deben dirigirse a la siguiente URL base:

https://b2b.analysat.com/api_v3/<ENDPOINT>

Autenticación

La API usa HTTP Basic Auth. Incluye tus llaves en cada solicitud usando la cabecera Authorization.

Usuario

API_KEY_PUBLICA

Contraseña

API_KEY_PRIVADA

Ejemplo con cURL

curl -u <API_KEY_PUBLICA>:<API_KEY_PRIVADA> \
  "https://b2b.analysat.com/api_v3/companies/get_companies"

Puedes consultar o generar tus llaves en app.analysat.com/integrations/api-keys.


Empresas

GET/companies/get_companies

Obtener empresas

Retorna la lista de todas las empresas (RFCs) asociadas al usuario autenticado. No requiere parámetros adicionales.

Ejemplo cURL

curl -X GET -u <API_KEY_PUBLICA>:<API_KEY_PRIVADA> \
  "https://b2b.analysat.com/api_v3/companies/get_companies"

Respuesta (200)

[
  {
    "id": 1234,
    "razon_social": "EMPRESA EJEMPLO SA DE CV",
    "rfc": "ABC121212ABC",
    "vencimiento_ciec": "2025-01-01",
    "vencimiento_fiel": "2025-02-10",
    "error_304": false,
    "fechas_descarga_pendientes": null,
    "ultima_actualizacion": "2025-01-05 14:30:45"
  }
]

Cuentas

GET/accounts/get_accounts

Obtener cuentas bancarias

Retorna la lista de cuentas bancarias de una empresa específica identificada por su RFC.

Parámetros de consulta

ParámetroTipoRequeridoDescripción
rfcstringRFC de la empresa cuyos datos se desean consultar.

Ejemplo cURL

curl -X GET -u <API_KEY_PUBLICA>:<API_KEY_PRIVADA> \
  "https://b2b.analysat.com/api_v3/accounts/get_accounts?rfc=ABC121212ABC"

Respuesta (200)

[
  {
    "_id": 714,
    "debito_credito": "Debito",
    "moneda": "MXN",
    "nombre_banco": "BBVA Personal",
    "nombre_cuenta": "BBVA",
    "numero_cuenta": "154742342",
    "tipo_cuenta": "Banco",
    "tipo_persona": "Personal",
    "saldo_actual": 224848.44
  },
  {
    "_id": 753,
    "debito_credito": "Crédito",
    "moneda": "MXN",
    "nombre_banco": "American Express",
    "nombre_cuenta": "The Gold Card",
    "numero_cuenta": "XXX-71001",
    "tipo_cuenta": "Tarjeta de crédito",
    "tipo_persona": "Personal",
    "saldo_actual": -11330.99
  }
]

Transacciones

GET/transactions/get_transactions

Obtener transacciones

Retorna transacciones bancarias paginadas de una empresa. Soporta múltiples filtros por fecha, tipo, monto y estado de conciliación.

Parámetros de consulta

ParámetroTipoRequeridoDescripción
rfcstringRFC de la empresa.
fecha_inicialstringFecha de inicio en formato YYYY-MM-DD.
fecha_finalstringFecha de fin en formato YYYY-MM-DD.
paginaintNoNúmero de página. Por defecto: 1.
tipo_pagostringNo"Abono" o "Cargo".
excelstringNo"si" para descargar como Excel (movimientos.xlsx).
include_tax_detailsstringNo"si" para agregar campos de IVA y retenciones calculados.
forma_pagostringNoEj: "Transferencia electrónica de fondos".
monedastringNoEj: "MXN".
id_bancointNoID de la cuenta bancaria.
pago_idintNoID de una transacción específica.
status_conciliacionstringNo"Conciliados" o "No conciliados".
identificadostringNo"Todos", "Identificados" o "No identificados".
monto_inicialnumberNoMonto mínimo de la transacción.
monto_finalnumberNoMonto máximo de la transacción.
descripcionstringNoFiltro por texto en la descripción.
cliente_proveedor_idintNoID del cliente o proveedor.
etiquetas_pagosstringNoEtiquetas separadas por comas.
filtro_etiquetastringNo"Se encuentra en" o "No se encuentra en".
order_bystringNoCampo por el que ordenar los resultados.
order_by_typestringNo"asc" o "desc".

Ejemplo cURL

curl -X GET -u <API_KEY_PUBLICA>:<API_KEY_PRIVADA> \
  "https://b2b.analysat.com/api_v3/transactions/get_transactions?rfc=ABC121212ABC&fecha_inicial=2024-01-01&fecha_final=2024-01-31"

Respuesta (200)

{
  "mas_paginas": false,
  "time_elapsed": 0.475,
  "resultados": [
    {
      "_id": 1212,
      "fecha": "2024-01-15T06:00:00",
      "tipo_pago": "Abono",
      "monto_total": 5800.00,
      "moneda": "MXN",
      "forma_pago": "Transferencia electrónica de fondos",
      "nombre_cuenta": "BBVA Empresa",
      "nombre_banco": "BBVA",
      "descripcion": "SPEI RECIBIDO",
      "cliente_proveedor": "PROVEEDOR EJEMPLO SA",
      "movimiento_identificado": true,
      "documentos_relacionados": [],
      "etiquetas": null
    }
  ]
}
POST/transactions/reconciliate_payment

Conciliar pago

Asocia una transacción bancaria con una o más facturas (documentos relacionados).

Cuerpo (JSON)

ParámetroTipoRequeridoDescripción
rfcstringRFC de la empresa.
pago_idintID de la transacción bancaria a conciliar.
documentos_relacionadosarrayLista de objetos { "id_factura": "UUID_FACTURAS EMITIDAS", "monto": 1000.00 }.
tipo_cambionumberNoTipo de cambio. Por defecto: 1.
conciliacion_destringNoReferencia descriptiva de la conciliación.
cliente_proveedor_idintNoID del cliente o proveedor a asociar.

Ejemplo cURL

curl -X POST -u <API_KEY_PUBLICA>:<API_KEY_PRIVADA> \
  -H "Content-Type: application/json" \
  -d '{
    "rfc": "ABC121212ABC",
    "pago_id": 1212,
    "documentos_relacionados": [
      { "id_factura": "UUID-1_FACTURAS EMITIDAS", "monto": 5800.00 }
    ]
  }' \
  "https://b2b.analysat.com/api_v3/transactions/reconciliate_payment"

Respuesta (200)

{ "ok": true, "message": "Pago conciliado correctamente" }
POST/transactions/unreconciliate_payment

Desconciliar pago

Elimina la conciliación entre una transacción y sus documentos relacionados. No es posible desconciliar pagos con complementos de pago vigentes.

Cuerpo (JSON)

ParámetroTipoRequeridoDescripción
rfcstringRFC de la empresa.
pago_idintID de la transacción.
doc_rel_pago_idsarrayNoLista de IDs de doc_rel_pagos a eliminar. Requerido si no se envía id_factura.
id_facturastringNoID compuesto de factura (ej: "UUID_FACTURAS EMITIDAS"). Requerido si no se envía doc_rel_pago_ids.

Respuesta (200)

{ "ok": true, "message": "Conciliación eliminada", "deleted_ids": [42, 43] }
POST/transactions/update_payment

Actualizar pago

Modifica los metadatos de una transacción bancaria existente. La suma de documentos relacionados no puede superar el monto total.

Cuerpo (JSON)

ParámetroTipoRequeridoDescripción
rfcstringRFC de la empresa.
pago_idintID de la transacción a actualizar.
fecha_pagostringNoNueva fecha del pago (YYYY-MM-DD).
forma_pagostringNoNueva forma de pago.
descripcionstringNoNueva descripción.
referenciastringNoNueva referencia.
monto_totalnumberNoNuevo monto total.
tipo_cambionumberNoNuevo tipo de cambio.
cliente_proveedor_idintNoID del cliente o proveedor a asociar.
ids_eliminadosarrayNoIDs de doc_rel_pagos a eliminar en esta actualización.

Respuesta (200)

{ "ok": true, "message": "Pago actualizado correctamente", "pago": { "_id": 1212, "..." } }
POST/transactions/stamp_payment_complement

Timbrar complemento de pago

Genera y timbra ante el SAT el CFDI Complemento de Pago para uno o más pagos previamente conciliados. Requiere folios fiscales configurados en la empresa y timbres/crédito disponibles en la cuenta.

Cuerpo (JSON)

ParámetroTipoRequeridoDescripción
rfcstringRFC de la empresa.
pago_idsarrayLista de IDs de pagos a timbrar. También se acepta un único entero, que será envuelto en una lista.
emailsarrayNoLista de correos a los que se enviará el complemento timbrado.

Ejemplo cURL

curl -X POST -u <API_KEY_PUBLICA>:<API_KEY_PRIVADA> \
  -H "Content-Type: application/json" \
  -d '{
    "rfc": "ABC121212ABC",
    "pago_ids": [1212, 1213],
    "emails": ["[email protected]"]
  }' \
  "https://b2b.analysat.com/api_v3/transactions/stamp_payment_complement"

Respuesta (200)

{ "ok": true, "message": "Complemento de pago timbrado correctamente", "pago_ids": [1212, 1213] }

Facturas

GET/invoices/get_invoices

Obtener facturas

Retorna facturas emitidas o recibidas con paginación. Soporta filtros por fecha, tipo de comprobante, status, conciliación y más.

Parámetros de consulta

ParámetroTipoRequeridoDescripción
rfcstringRFC del contribuyente.
fechainicialstringFecha inicial (YYYY-MM-DD).
fechafinalstringFecha final (YYYY-MM-DD).
emitidas_recibidasstring"FACTURAS EMITIDAS" o "FACTURAS RECIBIDAS".
tipo_de_comprobantestring"I" (Ingreso), "E" (Egreso), "P" (Pago), "N" (Nómina) o "T" (Traslado).
statusstring"Vigente" o "Cancelado".
paginaintNoNúmero de página. Por defecto: 1.
excelstringNo"si" para exportar a Excel (facturas.xlsx).
qstringNoBúsqueda de texto libre (RFC, nombre, folio, UUID).
status_aprobacionstringNo"Aprobadas", "No aprobadas" o "Todas" (solo FACTURAS RECIBIDAS tipo I).
status_conciliacionstringNo"Conciliadas" o "No conciliadas".
cliente_proveedor_idintNoID del cliente o proveedor.
default_vencimientointNoDías de vencimiento por defecto para clientes sin configuración.

Ejemplo cURL

curl -X GET -u <API_KEY_PUBLICA>:<API_KEY_PRIVADA> \
  "https://b2b.analysat.com/api_v3/invoices/get_invoices?rfc=ABC121212ABC&fechainicial=2024-01-01&fechafinal=2024-01-31&emitidas_recibidas=FACTURAS%20EMITIDAS&tipo_de_comprobante=I&status=Vigente"

Respuesta (200)

{
  "mas_paginas": false,
  "time_elapsed": 0.558,
  "resultados": [
    {
      "_id": "UUID-FACTURA_FACTURAS EMITIDAS",
      "fecha_convertida": "2024-01-12T14:00:59",
      "fecha_vencimiento": "2024-01-22T14:00:59",
      "rfc": "CLIENTE-RFC-123",
      "nombre": "CLIENTE EJEMPLO SA DE CV",
      "folio": "167",
      "moneda": "MXN",
      "metodo_pago": "PUE",
      "tipo_comprobante": "I",
      "total": 8120.00,
      "subtotal": 7000.00,
      "impuestos_trasladados": 1120.00,
      "impuestos_retenidos": null,
      "total_pagado": null,
      "por_pagar_cobrar": 8120.00,
      "etiquetas": null,
      "aprobada_en": null
    }
  ]
}
GET/invoices/download_invoice

Descargar factura (PDF / XML)

Retorna el archivo PDF o XML de una factura específica.

Parámetros de consulta

ParámetroTipoRequeridoDescripción
rfcstringRFC de la empresa.
id_facturastringID compuesto de la factura (ej: "UUID_FACTURAS EMITIDAS").
formatostringNo"pdf" o "xml". Por defecto: "pdf".

Ejemplo cURL

curl -X GET -u <API_KEY_PUBLICA>:<API_KEY_PRIVADA> \
  "https://b2b.analysat.com/api_v3/invoices/download_invoice?rfc=ABC121212ABC&id_factura=UUID_FACTURAS%20EMITIDAS&formato=pdf" \
  --output factura.pdf
POST/invoices/create_invoice

Crear factura

Timbra un CFDI enviándolo directamente al SAT vía Facturapi. Retorna el UUID, fecha de creación y URLs de PDF y XML.

Cuerpo — haz clic en los campos azules para expandir

ParámetroTipoRequeridoDescripción
rfc
stringRFC del emisor (la empresa en AnalySAT).
request_
objectDatos del CFDI a timbrar.
emitidas_recibidas
stringNo"FACTURAS EMITIDAS" (defecto) o "FACTURAS RECIBIDAS".
factura_timbrada
booleanNotrue timbra ante el SAT (defecto). false genera recibo sin timbrar.
id_cliente
intNoID del cliente. Requerido para I/E si no incluyes customer en request_.
id_empleado
intNoID del empleado. Requerido para tipo N si no incluyes customer en request_.
codigo_postal
stringNoCP del lugar de expedición. Sobreescribe el del cliente si se envía.
id_almacen
intNoID del almacén para movimiento de inventario automático.
cobrar_factura
booleanNotrue para cobrar vía Stripe Connect tras timbrar.
payment_method_id
stringNoID del método de pago Stripe. Requerido si cobrar_factura = true.

Ejemplo cURL — Factura tipo I

curl -X POST -u <API_KEY_PUBLICA>:<API_KEY_PRIVADA> \
  -H "Content-Type: application/json" \
  -d '{
    "rfc": "ABC121212ABC",
    "id_cliente": 42,
    "factura_timbrada": true,
    "request_": {
      "type": "I",
      "payment_form": "03",
      "payment_method": "PUE",
      "use": "G03",
      "currency": "MXN",
      "series": "A",
      "items": [
        {
          "quantity": 2,
          "discount": 0,
          "product": {
            "description": "Servicio de consultoria tecnologica",
            "product_key": "81161500",
            "unit_key": "E48",
            "price": 5000.00,
            "tax_included": false,
            "sku": "CONS-001",
            "taxes": [{ "type": "IVA", "rate": 0.16, "factor": "Tasa", "withholding": false }]
          }
        }
      ]
    }
  }' \
  "https://b2b.analysat.com/api_v3/invoices/create_invoice"

Respuesta (201)

{
  "id_factura": "FDA12345-ABCD-1234-EFGH-1234567890AB_FACTURAS EMITIDAS",
  "uuid": "FDA12345-ABCD-1234-EFGH-1234567890AB",
  "fecha_creacion": "2024-01-15T10:30:00",
  "message": "Invoice created successfully",
  "pdf_url": "https://...",
  "xml_url": "https://..."
}
POST/invoices/create_preinvoice

Crear pre-factura (recibo)

Genera un CFDI de prueba usando el entorno sandbox de Facturapi (no se timbra ante el SAT). Útil para validar el layout antes del timbrado real.

El cuerpo usa exactamente el mismo esquema que create_invoice. Consulta las tablas de estructura de request_ en el endpoint anterior.

Cuerpo (JSON) — nivel superior

ParámetroTipoRequeridoDescripción
rfcstringRFC del emisor.
request_objectDatos del CFDI. Mismo esquema que create_invoice.
id_clienteintNoID del cliente. Requerido para tipo "I" o "E" si no incluyes customer en request_.
id_empleadointNoID del empleado. Requerido para tipo "N" si no incluyes customer en request_.
codigo_postalstringNoCódigo postal del lugar de expedición.

Respuesta (201)

{
  "message": "Pre-factura creada correctamente",
  "fecha_creacion": "2024-01-15T10:30:00",
  "pdf": "https://...",
  "xml": "https://..."
}
POST/invoices/cancel_invoice

Cancelar factura

Cancela una o varias facturas con el motivo SAT correspondiente. Las cancelaciones en lote son asíncronas y retornan HTTP 202.

Cuerpo (JSON)

ParámetroTipoRequeridoDescripción
rfcstringRFC de la empresa emisora.
id_facturastring | arrayID de la factura o lista de IDs a cancelar.
motivestringMotivo SAT: "01" (sustitución), "02", "03" o "04".
substitutionstringNoUUID de la factura sustituta. Requerido cuando motive = "01".

Respuestas

// Cancelación individual (200)
{ "ok": true, "message": "Factura cancelada", "id_factura": "UUID_FACTURAS EMITIDAS" }

// Cancelación en lote — procesamiento asíncrono (202)
{ "ok": true, "message": "Solicitud de cancelación en proceso" }
GET/invoices/download_cancellation_receipt

Descargar acuse de cancelación

Descarga el acuse de cancelación de una factura en formato PDF o XML.

Parámetros de consulta

ParámetroTipoRequeridoDescripción
rfcstringRFC de la empresa.
id_facturastringID compuesto de la factura cancelada.
formatostringNo"pdf" o "xml". Por defecto: "pdf".

Ejemplo cURL

curl -X GET -u <API_KEY_PUBLICA>:<API_KEY_PRIVADA> \
  "https://b2b.analysat.com/api_v3/invoices/download_cancellation_receipt?rfc=ABC121212ABC&id_factura=UUID_FACTURAS%20EMITIDAS&formato=xml" \
  --output acuse.xml
POST/invoices/replace_receipt_with_invoice

Reemplazar recibo con factura

Vincula un recibo no timbrado con una factura timbrada vigente. Actualiza los pagos conciliados y cancela el recibo.

Cuerpo (JSON)

ParámetroTipoRequeridoDescripción
rfcstringRFC de la empresa.
id_recibostringID del recibo a reemplazar (debe ser tipo I, no timbrado y no cancelado).
id_facturastringID de la factura timbrada destino (debe ser tipo I, vigente).

Respuesta (200)

{
  "ok": true,
  "message": "Recibo reemplazado correctamente",
  "pagos_actualizados": 2,
  "id_recibo_cancelado": "UUID-RECIBO_FACTURAS EMITIDAS",
  "id_factura_destino": "UUID-FACTURA_FACTURAS EMITIDAS"
}

Descargas

POST/downloads/create_download

Crear solicitud de descarga

Inicia una descarga masiva de facturas XML/PDF del SAT para un periodo determinado. Retorna un id_solicitud para consultar el estado.

Este endpoint recibe los datos como multipart/form-data, no JSON. Usa la bandera -F en cURL.

Parámetros (form-data)

ParámetroTipoRequeridoDescripción
rfcstringRFC del contribuyente.
fecha_inicialdateFecha inicial (YYYY-MM-DD).
fecha_finaldateFecha final (YYYY-MM-DD).
statusstringNo"Vigentes" o "Canceladas". Por defecto: "Todas".
formatostringNo"XML" o "PDF". Por defecto: "XML".
emitidas_recibidasstringNo"FACTURAS EMITIDAS", "FACTURAS RECIBIDAS" o "FACTURAS EMITIDAS Y RECIBIDAS" (defecto).
tipo_comprobantestringNo"Ingreso", "Egreso", "Pago", "Nomina", "Traslado" o "Todas" (defecto).

Ejemplo cURL

curl -X POST -u <API_KEY_PUBLICA>:<API_KEY_PRIVADA> \
  -F "rfc=ABC121212ABC" \
  -F "fecha_inicial=2024-01-01" \
  -F "fecha_final=2024-01-31" \
  -F "status=Vigentes" \
  -F "emitidas_recibidas=FACTURAS RECIBIDAS" \
  "https://b2b.analysat.com/api_v3/downloads/create_download"

Respuesta (200)

{ "id_solicitud": "123456789" }
GET/downloads/get_download

Obtener descarga

Consulta el estado de una solicitud de descarga. Si está lista, retorna una URL prefirmada de S3 con validez de 60 segundos.

Parámetros de consulta

ParámetroTipoRequeridoDescripción
idstringID de la solicitud obtenido de create_download.
rfcstringRFC de la empresa.

Ejemplo cURL

curl -X GET -u <API_KEY_PUBLICA>:<API_KEY_PRIVADA> \
  "https://b2b.analysat.com/api_v3/downloads/get_download?id=123456789&rfc=ABC121212ABC"

Respuestas posibles

// Descarga lista (200)
{
  "download_url": "https://s3.amazonaws.com/.../facturas.zip?...",
  "expiry_seconds": 60,
  "id_solicitud": "123456789"
}

// Aún procesando (200)
{ "message": "Esta solicitud se encuentra en proceso de descarga" }

// No encontrada (400)
{ "message": "No se encontro la solicitud" }

// Sin resultados (400)
{ "message": "No se encontraron facturas que coincidan con estos filtros" }

Reportes

GET/reports/download_report

Descargar reporte

Genera y descarga un reporte Excel (.xlsx) pre-calculado. Retorna una URL prefirmada de S3 con validez de 60 segundos.

Parámetros de consulta

ParámetroTipoRequeridoDescripción
rfcstringRFC del contribuyente.
reportstringNombre del reporte. Usa "Accounting 1" para el reporte contable principal.
yearstringAño del reporte (ej: "2024").
versionstringNo"live" (por defecto) u otra versión del reporte.

Ejemplo cURL

curl -X GET -u <API_KEY_PUBLICA>:<API_KEY_PRIVADA> \
  "https://b2b.analysat.com/api_v3/reports/download_report?rfc=ABC121212ABC&report=Accounting%201&year=2024"

Respuesta (200)

{
  "download_url": "https://s3.amazonaws.com/.../reporte.xlsx?...",
  "expiry_seconds": 60,
  "report_name": "Accounting 1"
}

Webhooks

Los webhooks permiten que Analysat notifique a tu sistema en tiempo real cuando ocurren cambios en facturas y pagos de tus empresas. En lugar de hacer polling a la API, configura una URL y recibirás las notificaciones de forma automática.

¿Cómo funcionan?

Cuando se produce un evento (por ejemplo, una factura nueva), Analysat agrupa los cambios pendientes y los envía en una sola solicitud POST a la URL de tu endpoint. El sistema reintenta automáticamente con backoff exponencial hasta 8 veces si tu servidor no responde con un código 2xx.

Eventos disponibles

EventoDescripción
factura.createdSe creó una nueva factura.
factura.updatedSe actualizó una factura existente.
factura.deletedSe eliminó o canceló una factura.
pago.createdSe registró un nuevo pago (transacción bancaria).
pago.updatedSe modificó un pago existente.
pago.deletedSe eliminó un pago.

Estructura del payload

Cada entrega agrupa uno o más eventos del mismo ciclo de procesamiento. El cuerpo de la solicitud tiene la siguiente forma:

{
  "delivery_type": "batch",
  "id_empresa": 1234,
  "delivery_id": 42,
  "event_ids": [101, 102],
  "events": [
    {
      "id": 101,
      "type": "factura.created",
      "resource_type": "factura",
      "resource_id": "5678",
      "payload": {
        "id": "5678",
        "id_empresa": 1234,
        "op": "INSERT"
      },
      "created_at": "2024-01-15T10:30:00",
      "compressed_event_ids": [101]
    }
  ]
}

Verificación de firma

Cada solicitud incluye las siguientes cabeceras para que puedas verificar su autenticidad:

CabeceraDescripción
X-Analysat-Webhook-IdID numérico de la entrega.
X-Analysat-Webhook-TimestampUnix timestamp (segundos) del momento del envío.
X-Analysat-Webhook-SignatureHMAC-SHA256 con formato sha256=<hex>. Firmado sobre "<timestamp>.<body>".

Para validar la firma, concatena el timestamp y el cuerpo JSON exacto separados por un punto, calcula el HMAC-SHA256 con tu secreto y compáralo con el valor de la cabecera:

import hmac, hashlib

def verify_signature(secret: str, timestamp: str, body: bytes, signature_header: str) -> bool:
    message = f"{timestamp}.{body.decode('utf-8')}".encode("utf-8")
    expected = "sha256=" + hmac.new(secret.encode("utf-8"), message, hashlib.sha256).hexdigest()
    return hmac.compare_digest(expected, signature_header)
Los webhooks se configuran directamente desde la plataforma en app.analysat.com/integrations/webhooks. Ahí puedes crear endpoints, seleccionar los eventos que deseas escuchar y rotar el secreto de firma.