FISCALISTO / API
Cambios
Lo nuevo en la API, los SDKs y el CLI de Fiscalisto, del más reciente al más antiguo. Nada de lo que ya funciona deja de funcionar sin aviso.
La API se versiona por fecha: cada respuesta dice en el encabezado Fiscalisto-Version en qué versión se escribió, y hoy hay una sola, 2026-10-24. Lo que agregamos (rutas, campos, eventos) llega en la versión que ya usa, sin cambiar nada de lo que existe. Un cambio que no sea compatible será una versión nueva, anunciada aquí y por correo, y su cuenta se queda en la suya hasta que usted la mueva. Ver Versiones.
Reciba cada cambio por correo en Avisos por correo, o en su lector con el RSS https://fiscalisto.com/docs/api/cambios.rss. Las fallas del servicio tienen los suyos en Estado del servicio.
27 de octubre de 2026
- La API está abierta. Cualquier persona puede crear su cuenta API desde el selector de empresa (o desde API de facturación), timbrar en pruebas sin costo y pasar a producción con sus emisores y sus paquetes de timbres. Su cuenta empieza con 20 timbres de producción de regalo. Ver Pruebas y producción.
- Todas las constancias de retenciones con complemento.
POST /v1/retentionsemite ahora las claves 17 y 19 a 24 con su complemento:trust_lease(arrendamiento en fideicomiso),share_sale(enajenación de acciones),prize(premios),trust(fideicomiso no empresarial),retirement_plan(planes de retiro 1.1),mortgage_interest(intereses hipotecarios) yfinancial_derivatives(operaciones con derivados). Las claves 06 (enajenación de acciones) y 15 (remanente distribuible) ya no piden complemento, como dice el SAT. EnGET /v1/sat_catalogs/retention_codessolo la 26 queda consupported: false. En los SDKs 0.1.9. Ver Retenciones. - Lo declarado sin CFDI aparte. Cada cruce de
GET /v1/accounting/cross_checks(y de/cfdi) traedeclared_without_cfdi: lo que la declaración dice que llegó sin factura (ingresos nominales adicionales enisr_income, IVA al 16% de cobros sin factura envat_charged). Solo el resto se compara con sus CFDI, así que un hotel que declara cobros sin factura ya no sale condiffers. En los SDKs 0.1.8. Ver Contabilidad. vat_withheldcuenta las constancias de retenciones. El IVA que le retuvieron en el cruce (GET /v1/accounting/cross_checks) suma también el de las constancias de retenciones que el emisor recibió, como las de las plataformas de hospedaje, en el mes en que se emitió (como se declara). El ISR de esas constancias se acredita en el ISR provisional según el régimen. EnGET /v1/accounting/cross_checks/cfdiaparecen contypewithholding_certificate. Ver Contabilidad. En los SDKs 0.1.7,typedel CFDI del cruce incluyewithholding_certificate.- Documentación. Cada evento tiene su página con el evento completo tal como llega a su webhook, y Tipos de evento aparece arriba de Webhooks y Eventos en la referencia, con cada evento enlazado a su página. Mandar evento de prueba (
POST /v1/webhook_endpoints/{id}/test) manda el objeto de cada evento (una cotización, un ticket, una descarga…) en lugar de una factura. La referencia usa todo el ancho de la pantalla, con el código y la respuesta en una columna más ancha, y Probar ya no se abre fuera de la pantalla. - Listo para agentes de código. Nueva página Fiscalisto para agentes de IA: cómo conectar el servidor MCP de la documentación en Claude Code, Cursor, VS Code y Codex, y la guía de integración en una página en
/docs/api/SKILL.md(una Agent Skill). El MCP tieneget_started(esa guía), busca también en inglés («create invoice», «verify webhook signature»),describe_operationacepta el método del SDK (invoices.create) o palabras,list_operationsacepta la sección en inglés yexplain_errorsugiere el código parecido.describe_operationnombra el objeto que contesta en lugar de repetir sus campos (full: truelos incluye).llms-full.txtescribe los campos de cada objeto una sola vez y pasa de 1.7 a 1.1 MB. - SDKs 0.1.6:
fiscalisto init --agentsdeja además la guía en.claude/skills/fiscalisto/SKILL.md, y la sección deAGENTS.mdapunta al MCP, al servidor de prueba y a verificar webhooks. Cada README tiene «Con agentes de IA». - Cumplimiento SAT en la API. Con la e.firma guardada del emisor,
POST /v1/issuers/{id}/compliance_opinion/refresh,…/tax_status_certificate/refreshy…/sat_mailbox/refreshtraen del SAT la opinión de cumplimiento (32-D), la constancia de situación fiscal y los avisos del buzón tributario (1 timbre por consulta en producción, cada uno una vez cada 10 minutos; regresa si el SAT no contesta). Se leen gratis enGET /v1/issuers/{id}/compliance_opiniony/tax_status_certificate(con/pdf) y enGET /v1/sat_mailbox_messages. NuevoGET /v1/sat_findings: los hallazgos de las facturas del emisor por tipo, sin los revisados. En pruebas se inventan al instante. Ver Cumplimiento SAT. - SDKs 0.1.5: opinión, constancia y buzón (
issuers.complianceOpinion,satMailboxMessages,satFindings…), sucursales (branches), almacenes (warehouses), existencias (products.stock,warehouses.stock), kárdex (stockMovements) y ajustes (stockAdjustments);branchywarehouseen las facturas. La 0.1.4 trajo los filtros de eventos (typecon comodín,delivery_success) yfiscalisto events list --faileden el CLI. - Inventario en la API. Los productos tienen
track_stock,cost,barcodeymin_stock; nuevas rutas/v1/warehouses(con/stock),GET /v1/products/{id}/stock,/v1/stock_movements(el kárdex) y/v1/stock_adjustments. Una factura conproductsaca sus existencias del almacén de su sucursal, o del que digawarehouse, y cada concepto de la factura dice suproduct. Error nuevo:inventory_refused. Ver Inventario. - Sucursales en la API. Nuevas rutas
/v1/branchespara crear, ver, cambiar, archivar y borrar las sucursales de un emisor (cada una con su código postal, su dirección para el PDF y sus series), ybranchenPOST /v1/invoices: la factura sale con elLugarExpedicion, la hora y la serie de esa sucursal, y sus pagos y notas de crédito la siguen. El objeto de factura dice subranch. Errores nuevos:branch_existsybranch_has_invoices. Ver Sucursales. - Errores más claros.
stamp_rate_limitdice cuánto esperar y que repita con la mismaIdempotency-Key;idempotency_key_missingya no habla solo de facturas (también nómina, retenciones y lotes); un webhook conhttp://olocalhostle sugierefiscalisto listen. - CLI.
--helpfunciona en cada comando (fiscalisto invoices create --help);invoices createcon--customerpide--payment-formen lugar del error de la API;issuers getse lee sin--json; los montos en dólares ya no repiten la moneda, y los complementos de pago muestran lo que pagaron en lugar de $0.00. - Panel. Un webhook cuya última entrega falló dice Con errores, y los complementos de pago muestran lo que pagaron.
GET /v1/eventsfiltra como Stripe.typeacepta un comodín por recurso (invoice.*,retention.*) y el nuevodelivery_success=falsedeja los eventos que algún webhook no recibió (true, los que llegaron a todos). Ver Webhooks.- Reenviar es un intento aparte. Un reenvío (en el panel) se manda una vez, ahora, sin empezar otra ronda de reintentos; si llega, los reintentos automáticos que faltaban ya no se mandan.
- Webhooks en el panel, como Stripe. Desarrolladores › Webhooks muestra la lista y el webhook elegido con sus últimos 7 días, sus entregas (filtrables y con enlace propio) y cada intento; Nuevo webhook elige primero los eventos, por recurso y con un ejemplo de cada uno. Un webhook de pruebas ya no pide su contraseña para verlo o agregarlo. El Workbench cambia de alto, se abre en pantalla completa, copia un enlace a lo que está viendo y filtra solicitudes (método, ruta, código de error) y eventos.
26 de octubre de 2026
- Nuevos precios de los paquetes grandes. 10,000 timbres: $4,790 + IVA ($5,556.40 con IVA); 50,000: $22,900 + IVA ($26,564 con IVA); 100,000: $41,900 + IVA ($48,604 con IVA). Los de 500 y 2,000 no cambian, y los paquetes ya comprados conservan sus timbres. Ver Desarrolladores › Timbres.
- Los paquetes de 50,000 y 100,000 timbres se pagan solo por transferencia (SPEI). Los de 500, 2,000 y 10,000 siguen con tarjeta, OXXO o transferencia, y la Recarga automática con tarjeta compra paquetes de hasta 10,000.
- Nuevo
GET /v1/accounting/cross_checks/cfdi: los CFDI que forman lo facturado de una cifra del cruce de un mes (month,key, también las retenciones de nómina y a proveedores), con lo que aporta cada uno y el ajuste de Impuestos, para ver por qué una cifradiffers. Ver Contabilidad. - Facturas en pesos colombianos, florines, rupias y dinares iraquíes con los decimales de c_Moneda.
COP,HUF,IDR,IRR,LBPy otras se timbraban sin decimales (yIQDcon 0 en vez de 3), y el PAC las rechazaba por el rango de los impuestos; ahora van con los decimales del catálogo del SAT. - El motivo de cancelación
04es solo para una factura global (una venta incluida se facturó después a nombre del cliente). En otra factura contestacancellation_failed. - Cancelar una constancia con el motivo
01revisa quesubstitutionsea otra constancia vigente del mismo emisor. - «Probar» en la referencia sin llave funciona solo para quien administra las llaves de la cuenta API (como el panel), y nunca cambia la versión de la API de la cuenta.
- Guías nuevas: Nómina y Constancias de retenciones. La documentación tiene buscador, y cada operación de la referencia dice qué hace.
- SDKs 0.1.3:
fiscalisto inittambién deja listo un proyecto de Go, .NET o Java, yfiscalisto docslee la guía de la API para agentes. GET /v1/quotes?status=ya no corta la lista antes de tiempo. Con muchas cotizaciones, solo revisaba las 500 más recientes y contestabahas_more: falseaunque hubiera más con ese estado; ahora sigue hasta llenar la página.GET /v1/issuerscon una llave limitada a algunos emisores trae páginas completas; antes filtraba después de leer la página y podía contestar una lista vacía conhas_more: true.- Dos
POST /v1/retentions/:id/senda la vez ya no mandan la constancia dos veces: el segundo contestaemail_failed(«se está enviando»). - Una constancia de retenciones que el SAT ya canceló siempre queda cancelada, aunque falle el registro interno del uso.
- Los números de las pólizas (
D-202610-00001) ya no cambian entre consultas cuando dos son del mismo día y tipo. Un CFDI del mes que llega después sí recorre los que siguen: para relacionarlas useuuid. summarylee las declaraciones de RESICO de personas físicas (ingresos percibidos, impuesto mensual, ISR retenido, IVA acreditable del periodo) y más cifras de personas morales tal como las imprime el SAT (IVA retenido, actos al 0% y exentos). Las declaraciones ya guardadas se vuelven a leer de su PDF en la siguiente consulta, sin ir al SAT.- El cruce con las retenciones.
GET /v1/accounting/cross_checkstambién compara, en los meses en que hubo, el ISR retenido por salarios contra los recibos de nómina (isr_withheld_salaries) y el ISR e IVA retenidos a proveedores contra las facturas recibidas (isr_withheld_suppliers,vat_withheld_suppliers). Ver Contabilidad. - Un campo obligatorio vacío dice «no puede estar vacío» (antes «debe tener al menos 1 caracteres»).
- Los webhooks ya no se pierden cuando llegan muchos cambios juntos. Más de 12 eventos a la vez (un lote grande, por ejemplo) no se guardaban, y con muchos destinos que fallaban se dejaban de reintentar las entregas.
- Las listas con
limit=100ya no fallan con muchos registros.GET /v1/invoices?limit=100contestaba500en cuanto el emisor tenía más de 100 facturas (y lo mismo otras listas y los eventos con muchos objetos); ahora contesta la página completa. Las páginas siguientes (starting_after) tardan lo mismo al principio que al final de la lista. - Con
Accept-Language: en, los errores delimity de las fechas (created_gte…) dicen en inglés exactamente qué falló, en vez del mensaje general del código. GET /v1/sat_catalogs/product_keysyunit_keysya no contestancatalog_unavailablepor un fallo de red: el catálogo se lee de los archivos de la propia aplicación.- Las cifras de cada declaración con nombres fijos. Cada
SatDeclarationtraesummary: sus obligaciones (isr,vat,isr_salaries…) con cifras que no cambian de nombre aunque el SAT cambie su formato (tax_base,creditable,withheld,to_pay…),nulldonde no se pudo leer. Ver Las cifras con nombres fijos. - El año de declaraciones mes por mes.
GET /v1/sat_declarations/calendardice por mes qué obligaciones se presentaron, cuáles faltan y cuándo vencen las que siguen.GET /v1/sat_declarationsfiltra también pormonthytype. - Webhooks de declaraciones:
sat_declaration.createdal encontrar una nueva ysat_declaration.updatedal llegar sus archivos o cifras. - Contabilidad completa. Las pólizas (
GET /v1/accounting/journal_entries) ahora incluyen los pagos de los complementos, la nómina y la depreciación de los activos fijos, y traentype(invoice,payment_received,payment_made,payrollodepreciation). Un PUE se registra cobrado o pagado según su forma de pago.uuidytax_idsonnullen la póliza de depreciación. NuevoGET /v1/accounting/financial_statementscon el estado de resultados y el balance general del mes, yGET /v1/accounting/cross_checks, que compara cada mes lo declarado al SAT con lo facturado. Ver Contabilidad. {periodo}en una factura recurrente sigue su frecuencia. En una semanal dice la semana que cubre (2 al 8 de noviembre) y en una de varios meses todos sus meses (1 de noviembre al 31 de diciembre); antes siempre decía el mes de la fecha. En las mensuales no cambia.- Los errores de los campos de una factura llegan en español y con el nombre de la API. Antes algunos llegaban en inglés (
Invalid input: expected number, received string,Too big: expected array to have <=200 items); ahora dicen, por ejemplo,items.0.quantity: debe ser un número, y los campos con formato fijo dicen cuál (dateesAAAA-MM-DDTHH:MM:SSen hora de la Ciudad de México,product_keyson 8 dígitos). currencyse revisa contra c_Moneda. Un código que no existe (XYZ) contesta400conparam: "currency", uno en minúsculas (usd) se guarda en mayúsculas, yexchange_ratedistinto de 1 en pesos (MXN) contesta400; antes se timbraba tal cual.send_email: truesin correo contesta400parameter_missingconparam: "customer.email", como ya hacían los pagos. Antes la factura se timbraba y no se mandaba a nadie. Lo mismo al crear una factura recurrente, dondesend_emailestruepor omisión: sin correo, mandeinvoice.customer.emailosend_email: false.metadatase revisa también en los anticipos, y un error en ella dice la llave (metadata.pedido).- Constancias de retenciones: un periodo que termina después del mes en curso contesta
retention_invalid(la constancia es de lo ya retenido);dividends,interestyforeign_paymentcon otra clave (code14, 16 y 18) contestan400en vez de no timbrarse, ytotals.exemptmayor quetotals.operationdice eso en vez de «los montos no pueden ser negativos». - Recibos de nómina: una fecha que no existe (
2026-02-30) contesta400conparam(antes se leía como el 2 de marzo); un periodo más largo que la periodicidad del empleado (un mes en una nómina semanal) y un periodo que se cruza con otro recibo vigente del empleado contestanpayroll_invalid, para no pagar dos veces los mismos días. Pedir el mismo periodo otra vez sigue contestando el recibo que ya tiene. Los errores de empleados dicenend_date,start_dateointegrated_daily_salarycuando son de ese campo. - Descargas del SAT: la misma descarga pedida otra vez mientras el SAT trabaja en ella contesta esa misma, sin cobrar otro timbre ni gastar las solicitudes idénticas que acepta el SAT.
counterparty_tax_iddebe ser un RFC, y enGET /v1/sat_invoicesdate_gtedespués dedate_ltecontesta400en vez de una lista vacía. - Fechas que no existen. Un día como
2026-02-30contesta400(«no es un día del calendario») en todos los campos y filtros de fecha; antes algunos lo leían como el 2 de marzo. - Un webhook por dirección. Crear un endpoint con la
urlde otro (o cambiarle laurla la de otro) contesta400endpoint_existscon el id del que ya la tiene; antes había dos y cada evento llegaba dos veces, por ejemplo al correr dos veces un script de instalación. - Claves del SAT revisadas antes del PAC. Un
product_keyounit_keyque no está en c_ClaveProdServ o c_ClaveUnidad contesta400con su campo (items.1.product_keyen una factura), en productos y en facturas; un producto aceptaunit_pricecon hasta 6 decimales, como el CFDI, y conunit_keysinunit_nametoma el nombre del catálogo. - Clientes revisados al guardarlos. Un régimen que no es del tipo de persona del RFC (601 a un RFC de 13 caracteres), un régimen o código postal que no está en el catálogo, o un
useque no va con el régimen contestan400con su campo, en vez de guardarse y fallar al facturar. Cambiar solo el correo de un cliente se guarda como antes. - SDKs 0.1.2 en los siete paquetes (npm
fiscalistoy@fiscalisto/react, PyPI, Packagist, NuGet, Go y Maven Central), con todo lo de esta fecha y del 25 de octubre: los códigos de error nuevos (comoendpoint_exists), versiones por fecha,expand[]y errores en inglés. Desde ahora cada SDK se publica solo al cambiar la API. - Un lote no acepta la misma
referencedos veces, para que un pedido no se facture doble: contesta400conparamen la repetida y dice en qué factura del lote ya iba. - Una factura recurrente que no se pudo timbrar dice por qué con el código correcto:
invoice_invalidcuando Fiscalisto la detuvo antes del PAC (un cliente borrado del catálogo, el plan),insufficient_balancesin timbres, einvoice_rejectedsolo cuando la rechazó el PAC o el SAT. - Declaraciones del SAT.
POST /v1/sat_declarations/refreshentra al SAT con la e.firma guardada del emisor y trae las declaraciones que presentó (provisionales, la anual de persona moral y las de Declaraciones y pagos), con su PDF, su acuse, sus cifras y el coeficiente de utilidad. En producción usa 1 timbre por consulta, una vez cada 10 minutos por emisor; listarlas conGET /v1/sat_declarationsy bajar sus archivos es gratis. En pruebas trae declaraciones de ejemplo al instante. Ver Declaraciones del SAT. - Varias notas de crédito o pagos a la misma factura a la vez se atienden en orden. Antes, las que llegaban mientras otra se timbraba recibían
409y un mensaje que culpaba a laIdempotency-Key; ahora esperan su turno (hasta 12 segundos) y se revisan contra el saldo que dejó la anterior. invoice_invalidpara las reglas que Fiscalisto revisa antes del PAC. Un pago que excede el saldo, una nota mayor que lo que queda o una factura cancelada contestabaninvoice_rejected, que es para lo que rechaza el PAC o el SAT.- Por qué no se puede pagar una factura. En vez de «no está abierta para este cliente», el error dice si está cancelada, si es PUE, si es de otro cliente o si ya está pagada.
- La misma solicitud escrita de otra forma es la misma. Con una
Idempotency-Key, el cuerpo se compara como JSON y no byte por byte: el curl con sangría de la guía, un SDK compacto, eljson.dumpsde Python o los campos en otro orden ya no contestanidempotency_key_reused. Los parámetros de la URL también se comparan sin importar su orden. - Una solicitud repetida contesta con el mismo status. Repetir un timbrado ya hecho contesta
201(antes200), un lote202y una cotización ya facturada201, siempre conidempotent-replayed: truey con los mismos avisos (warnings) que la primera vez. - Errores más claros. Un campo obligatorio que falta dice
parameter_missingaunque acepte varias formas,metadatacon otro tipo dice «debe ser un objeto», y un valor enorme (un id de 5,000 caracteres) ya no regresa completo en el mensaje. - Dos cambios al mismo objeto a la vez ya no se pisan. Dos actualizaciones del mismo producto o cliente al mismo tiempo (una cambia
sku, otraunit_price) guardaban solo una; ahora la segunda espera a la primera y se guardan las dos. Si espera más de 15 segundos contesta409request_in_progress. - Un parámetro de la URL que no existe se rechaza.
GET /v1/invoices?statuss=valid(con una s de más) contestaba la lista completa sin filtrar; ahora contesta400parameter_unknowncon el parámetro y los que sí acepta ese endpoint. - Los entornos de prueba no pasan de 25 aunque se creen muchos a la vez.
customeren las listas acepta el id del cliente.GET /v1/invoices,/v1/receivablesy/v1/advancesfiltran porcustomer=RFCocustomer=cus_…, el RFC en mayúsculas o minúsculas. Antes uncus_…contestaba una lista vacía, y un valor que no es RFC ni cliente ahora contesta400en vez de una lista vacía.- Clientes, productos y empleados traen
created_at, como los demás objetos. En los clientes y productos de antes de hoy es la fecha de su último cambio. La lista de empleados sale de la más nueva a la más vieja, como las demás (antes salía en un orden que parecía al azar). - Un SKU es de un solo producto. Crear o cambiar un producto con el SKU de otro contesta
400customer_existsconparam: "sku"y el nombre del que lo tiene, como ya decía la referencia de errores; antes se guardaban dos productos con el mismo SKU. - Repetir un timbrado ya hecho varias veces a la vez contesta la factura a todas. Antes, mientras una repetición contestaba, las demás que llegaban en ese momento recibían
409request_in_progress. - Pruebas acepta 100 solicitudes cada 10 segundos, como producción (antes 25), para que una suite de pruebas en paralelo no se tope antes con el límite. Los timbrados de prueba siguen con su propio límite.
- El texto que contesta la factura es el que se timbró. Saltos de línea, tabuladores y espacios de más en descripciones y nombres se guardan como un espacio, y los caracteres de control se quitan, como ya salían en el XML; antes el JSON y el PDF los conservaban.
npx fiscalisto mockcompara laIdempotency-Keyigual que la API y contesta409cuando la llave ya se usó con otro cuerpo.
25 de octubre de 2026
- Cancelar ya no usa timbres. Cancelar facturas y constancias de retenciones es gratis, en la API y en la app.
- Las descargas del SAT pagan según su tamaño. En producción, una descarga usa 1 timbre por cada 100 CFDI que trae (al menos 1): el primero al pedirla y los demás cuando el SAT dice cuántos tiene, antes de descargarlos. Sin timbres suficientes termina en
failed. Ver Límites. - Paquete de 100,000 timbres. $36,900 + IVA ($42,804 con IVA), unos 37 centavos más IVA por timbre, en Desarrolladores › Timbres.
- Revisar RFC, consultar constancias y descargar del SAT usan timbres. En producción, revisar RFC en las listas del SAT y consultar constancias usan 1 timbre por cada 10, y cada descarga pedida al SAT usa 1. Sin timbres,
402 insufficient_balance. En pruebas sigue sin costo. Ver Límites. - Precio abierto e impuestos locales en productos. Los productos aceptan
open_price(sin precio fijo: cada concepto con él manda suunit_price, o la factura se rechaza conitems.N.unit_price) ylocal_taxes, como el ISH de hospedaje. Una factura con esos productos y sinlocal_taxeslos agrega sola, calculados sobre los conceptos de cada producto. Ver Complementos. - Workbench. En cualquier página de Desarrolladores, la tecla
`abre un panel con el resumen de la cuenta, las solicitudes, los eventos, los webhooks, un inspector de objetos y un shell que llama a la API en pruebas, sin dejar la página. - Inspector de solicitudes. En Desarrolladores › Solicitudes, cada solicitud dice su versión de la API y se ve Como código en curl o en cualquiera de los seis SDKs; las repetidas con la misma
Idempotency-Keydicen Repetida y aparecen junto a la original. - La API sin internet.
npx fiscalisto mockcontesta cada ruta en su computadora con la forma de la API, guarda en memoria lo que crea y repite lo mismo con la mismaIdempotency-Key; en las pruebas de Node,createMock()defiscalisto/mock. Ver CLI. - Errores en inglés. Con
Accept-Language: en(o la opciónlanguagede los SDKs) los mensajes de error llegan en inglés, con el original enmessage_escuando el inglés es general. Ver Errores. - Expandir objetos. Con
expand[]=issuer(orecurring_invoice.last_invoice,data.invoice…) un id llega como el objeto completo en la misma respuesta, enGETy enPOST. En los SDKs de TypeScript, Python y PHP, con la opciónexpand. Ver Expandir objetos. - Versiones por fecha. Cada cuenta queda en la versión de la API del día en que se creó (
api_versionenGET /v1/account) y se mueve solo conPOST /v1/account. Una solicitud puede pedir otra con el encabezadoFiscalisto-Version, y cada endpoint de webhooks puede tener la suya. Los seis SDKs mandan la versión para la que se hicieron. Ver Versiones. - Relojes de prueba.
POST /v1/issuers/{id}/test_clockcongela la hora de un emisor de pruebas yPOST /v1/issuers/{id}/test_clock/advancela adelanta, haciendo día por día lo que habría pasado: facturas recurrentes, cotizaciones que vencen y facturas globales de tickets, con sus webhooks y el eventotest_clock.ready. Los emisores traentest_clock. Ver Pruebas y producción. - Idempotency-Key en todo
POST. Como en Stripe y Resend: con la misma llave, un reintento de crear un cliente, un webhook, una cotización o una factura recurrente, de mandar un correo o de cualquier otroPOSTcontesta lo mismo (idempotent-replayed: true) sin hacerlo dos veces, durante 24 horas. Los SDKs, la CLI y los módulos de n8n, Zapier y Make la ponen solos en cadaPOST, así sus reintentos siempre son seguros. Ver Idempotencia. - Explorador de la API para agentes. El servidor MCP de la documentación (
https://fiscalisto.com/docs/api/mcp) agregalist_operations,describe_operation(con el código del SDK del lenguaje que pida),describe_object,explain_errorycall_api, que prueba una solicitud en modo de pruebas con su llavefk_test_. Ver CLI. - Entornos de prueba.
POST /v1/sandboxesle da a cada persona del equipo su propio modo de pruebas: un emisor de pruebas del SAT y una llavefk_test_que solo ve sus emisores, facturas, webhooks y eventos, con un reinicio que no toca los de nadie más. Emisores, webhooks yGET /v1/account(key.sandbox) agregansandbox. También en Desarrolladores › Llaves. Ver Pruebas y producción. - Contabilidad.
GET /v1/accounting/journal_entriesda una póliza por cada CFDI del mes,GET /v1/accounting/trial_balancela balanza yGET /v1/accounting/accountsel catálogo con el código agrupador del SAT.GET /v1/accounting/electronic_accountingdescarga la contabilidad electrónica (catálogo, balanza y, si el SAT las pide, pólizas) lista para el Buzón Tributario, yGET /v1/accounting/diot/fileel TXT de la DIOT. Ver Contabilidad. - Tiendas en línea.
POST /v1/store_connectionsconecta una tienda de Shopify o una cuenta de Mercado Libre: cada pedido pagado se vuelve un ticket de autofactura, la liga va en el pedido de Shopify, en Mercado Libre se factura sola con los datos fiscales del comprador y el CFDI se sube al pedido. Un pedido cancelado o reembolsado cancela su ticket. Para WooCommerce, el plugin Fiscalisto Autofactura. Ver Tiendas en línea. - Conciliación bancaria.
POST /v1/bank_transactionsrecibe los depósitos de la cuenta del emisor (de la API de su banco o de un estado de cuenta), sin repetir los que ya mandó, y sugiere la factura que pagó cada uno.POST /v1/bank_transactions/{id}/matchla concilia y la factura queda pagada; una PPD se paga conPOST /v1/paymentsybank_transaction, que timbra el complemento y lo concilia. Ver Conciliación bancaria. - Cuentas por cobrar. Cada factura trae
payment_status,amount_dueyamount_paid, que bajan con sus complementos de pago y notas de crédito;GET /v1/receivablesdice cuánto debe cada cliente yGET /v1/invoices?payment_status=openlista lo pendiente. Una PUE conpaid_laterse marca conPOST /v1/invoices/{id}/mark_paid. Eventosinvoice.paideinvoice.partially_paid. Ver Cuentas por cobrar. - Cotizaciones.
POST /v1/quoteshace una cotización con los conceptos de una factura, para un cliente de su catálogo o alguien que aún no le da sus datos fiscales. Su cliente la ve, la acepta, pide cambios o la rechaza en una liga (eventosquote.viewed,quote.accepted,quote.changes_requestedyquote.rejected); conauto_invoicela factura se timbra sola al aceptarla, o conPOST /v1/quotes/{id}/invoice. Ver Cotizaciones. - Facturas recurrentes.
POST /v1/recurring_invoicestimbra sola una factura cada mes, semana o día, a la hora que elija, con{mes}y{año}llenos en cada una y sin repetir nunca un periodo. Cada factura traerecurring_invoice; si un periodo no sale llegarecurring_invoice.failed. Ver Facturas recurrentes. - n8n, Zapier y Make. Conectores para timbrar facturas, registrar tickets, pedir datos fiscales, revisar las listas del SAT y correr flujos con cada evento, sin programar. Ver n8n, Zapier y Make.
- Autofactura.
POST /v1/ticketsregistra cada venta y su comprador se factura solo con el código y el total, en el portal del emisor o dentro de su página confiscalisto.jso@fiscalisto/react; lo que nadie factura entra en la factura global. Eventosticket.invoicedyticket.included_in_global. Ver Autofactura. - Equipo de la cuenta API. Roles para desarrolladores (Desarrollador, Solo lectura) y Desarrolladores › Actividad: quién creó o cambió llaves, webhooks y emisores, y cuándo.
- Límite en cada respuesta. El encabezado
RateLimit-Policydice cuántas solicitudes acepta su cuenta cada 10 segundos. En Desarrolladores › Llaves cada llave muestra sus solicitudes y errores de los últimos 7 días, y Solicitudes se filtra por llave. Ver Límites. - Reiniciar los datos de prueba.
POST /v1/test_data/resetdeja el modo de pruebas como nuevo, con 3 clientes y 3 productos de ejemplo si quiere; también en Desarrolladores › Inicio. Ver Pruebas y producción. - Descargas del SAT.
POST /v1/sat_downloadsle pide al SAT las facturas que un emisor recibió o emitió en un periodo, con la e.firma que guarda conkeep_for_downloads; al terminar llegasat_download.completedy las facturas quedan enGET /v1/sat_invoices, con su XML. En pruebas trae facturas de ejemplo al instante. Ver Descargas del SAT. - Proyectos de inicio. Next.js, Laravel, Django y ASP.NET Core: timbran, descargan el PDF y el XML y verifican los webhooks. Ver SDKs.
- Colección para Postman, Bruno e Insomnia. Todas las rutas con su ejemplo, en
/docs/api/fiscalisto.postman_collection.json, o con su llave de pruebas al crearla en Desarrolladores › Llaves. Ver SDKs. - SDKs de Go y Java.
fiscalisto.com/go(Go 1.23, sin dependencias) ycom.fiscalisto:fiscalisto(Java 17, con Jackson), generados del mismo OpenAPI: structs y clases para cada campo,Idempotency-Keyautomática, listas que se recorren solas y webhooks verificados. Cada página de la referencia trae su ejemplo en Go y en Java. Ver SDKs. - Avisos de cambios y del estado. Este registro por correo (suscribirse) y por RSS (
/docs/api/cambios.rss). En Estado del servicio, Incidentes recientes, avisos por correo cuando algo falla y cuando se resuelve, y/estado.rss. - Llaves de solo lectura y llaves que vencen. Al crear una llave elija Permisos (Solo lectura responde
key_read_onlya lo que cambia algo) y Vence (30 días a 1 año, con aviso por correo 7 días y 1 día antes).GET /v1/accountagregakey.read_onlyykey.expires_at. Ver Autenticación. - Timbres que no se acaban. El evento
balance.lowy un correo cuando quedan pocos timbres (usted elige cuántos) y otra vez al acabarse, y Recarga automática con su tarjeta en Desarrolladores › Timbres.GET /v1/balanceagregalow_balance_atyauto_recharge. Ver Pruebas y producción.
24 de octubre de 2026
- Depurar desde Solicitudes. Cada error trae Cómo arreglarlo; cada solicitud, Copiar como curl, y en pruebas Repetir en pruebas con el cuerpo editable. Los mensajes de validación ahora están en español (
items.0.unit_price: debe ser mayor o igual a 0.). - Códigos de error con nombre.
ErrorCodeen los cuatro SDKs:error.code === ErrorCode.InvoiceRejecteden vez del texto, con la descripción de cada código en su editor. Ver SDKs. - Estado del servicio. fiscalisto.com/estado dice si el timbrado, la API y las listas del SAT funcionan ahora y en los últimos 90 días;
https://fiscalisto.com/estado.jsones lo mismo para sus monitores. Ver Errores. - SDK de .NET.
dotnet add package Fiscalisto: una clase para cada objeto y cada solicitud,await foreachen las listas yFiscalistoClient.Webhooks.Verify. Cada página de la referencia trae su ejemplo en C#. Ver SDKs. - Anticipos.
customer,email_ccymetadatadePOST /v1/advancesse documentan como en las facturas, así que los SDKs ya los revisan. - Documentación para agentes. Servidor MCP en
https://fiscalisto.com/docs/api/mcpy, en cada página, Copiar como Markdown, Abrir en ChatGPT y Abrir en Claude. Si entró a Fiscalisto con su cuenta API, los ejemplos ya traen su llave de pruebas. Ver CLI. - Revisión de su integración. En Desarrolladores › Inicio, lo que dicen sus solicitudes de pruebas antes de pasar a producción: Idempotency-Key, rechazos del SAT y webhooks.
- Alta de emisores por liga.
POST /v1/issuers/{id}/onboarding_linksda una página donde su cliente sube su CSD y firma con su e.firma, sin que esos archivos pasen por su plataforma; al terminar llegaissuer.ready. Ver Emisores. - Datos del cliente.
POST /v1/tax_ids/validaterevisa RFC, nombre, régimen, código postal y uso del CFDI antes de timbrar, y con el idCIF los compara con la constancia en el SAT.POST /v1/customer_data_requestscrea una liga para que su cliente dé sus datos, con el eventocustomer_data_request.completed. Ver Datos fiscales del cliente. - CLI.
npx fiscalisto logininicia sesión por el navegador,initdeja el SDK y la llave en su proyecto,listenle manda los webhooks a su computadora ytriggerlos provoca. Con--json, para agentes. Ver CLI. - Listas del SAT.
GET /v1/sat_lists/{tax_id}yPOST /v1/sat_lists/check(hasta 1,000 RFC) revisan la 69-B, la 69-B Bis y las del artículo 69. Ver Listas del SAT. - Evento de prueba.
POST /v1/webhook_endpoints/{id}/testle manda a un endpoint cualquier evento con un objeto de ejemplo, sin timbrar, y contesta lo que respondió su servidor. Ver Webhooks. - RFC de prueba. Cinco RFC que en pruebas provocan cada rechazo común del SAT (nombre, código postal, régimen, uso del CFDI). Ver Pruebas y producción.
- Probar sin llave. En la referencia, si entró a Fiscalisto con su cuenta API abierta, Probar funciona sin pegar la llave.
- Panel. Desarrolladores tiene Facturas (filtros, PDF, XML y cancelar), Eventos (lo que se mandó y cada entrega, con Reenviar) y la gráfica de Uso de los últimos 30 días.
- SDKs. TypeScript, Python y PHP, generados del documento OpenAPI. Ver SDKs.
- Primera versión de la API: facturas, pagos, notas de crédito, anticipos, nómina, retenciones, lotes, cancelación, emisores, catálogos, webhooks e idempotencia.
n8n, Zapier y Make: facturar sin programar
Timbre facturas, registre tickets para autofactura y reciba los eventos de Fiscalisto en sus flujos de n8n, Zapier o Make, con su llave de la API y sin escribir código.
Autenticación y llaves
Cómo se identifica su sistema con su llave secreta, cómo limitarla a ciertos emisores, a solo lectura o a un plazo, y cómo cambiarla sin cortes.