Incluida en todos los planes
API de Magifactura
Crea tickets y facturas CFDI 4.0 desde tu punto de venta, tu ERP, tu tienda en línea o un agente de IA. JSON sobre HTTPS, nombres de campos del SAT (rfc, usoCfdi, formaPago) y mensajes en español. URL base: https://magifactura.com/api/v1. Especificación OpenAPI: /api/v1/openapi.json.
Inicio rápido
- Entra a Magifactura y abre Ajustes → API (menú de tu organización → API). Crea una clave de prueba; empieza con
mf_test_. - Guárdala en la variable
MAGIFACTURA_API_KEYy prueba que funciona:
curl https://magifactura.com/api/v1/me \
-H "Authorization: Bearer $MAGIFACTURA_API_KEY"3. Timbra tu primera factura. Envía receptor, conceptos y formaPago (opcional si configuraste una por defecto en Preferencias); el resto toma valores por defecto.
curl https://magifactura.com/api/v1/facturas \
-H "Authorization: Bearer $MAGIFACTURA_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: pedido-1042" \
-d '{
"receptor": {
"rfc": "EKU9003173C9",
"nombre": "ESCUELA KEMPER URGATE",
"cp": "42501",
"regimen": "601",
"usoCfdi": "G03"
},
"conceptos": [
{
"descripcion": "Consultoría",
"claveProdServ": "80111600",
"precio": 1000
}
],
"formaPago": "03"
}'// Node 18+ con ES modules (archivo .mjs)
const res = await fetch('https://magifactura.com/api/v1/facturas', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.MAGIFACTURA_API_KEY}`,
'Content-Type': 'application/json',
'Idempotency-Key': 'pedido-1043'
},
body: JSON.stringify({
"receptor": {
"rfc": "EKU9003173C9",
"nombre": "ESCUELA KEMPER URGATE",
"cp": "42501",
"regimen": "601",
"usoCfdi": "G03"
},
"conceptos": [
{
"descripcion": "Consultoría",
"claveProdServ": "80111600",
"precio": 1000
}
],
"formaPago": "03"
})
});
const factura = await res.json();
console.log(factura.uuid, factura.pdfUrl);import os, requests
res = requests.post(
"https://magifactura.com/api/v1/facturas",
headers={
"Authorization": f"Bearer {os.environ['MAGIFACTURA_API_KEY']}",
"Idempotency-Key": "pedido-1044",
},
json={
"receptor": {
"rfc": "EKU9003173C9",
"nombre": "ESCUELA KEMPER URGATE",
"cp": "42501",
"regimen": "601",
"usoCfdi": "G03"
},
"conceptos": [
{
"descripcion": "Consultoría",
"claveProdServ": "80111600",
"precio": 1000
}
],
"formaPago": "03"
},
)
factura = res.json()
print(factura["uuid"], factura["pdfUrl"])Respuesta 201:
{
"id": "3f2b8c1e-5d0a-4c7e-9b1a-2e6f0c9d4a71",
"uuid": "7A1C0F55-9B44-4E1E-9A55-0D2B5C9E1F01",
"status": "timbrada",
"modo": "test",
"serie": null,
"folio": null,
"fecha": "2026-10-04T18:00:00.000Z",
"receptor": {
"clienteId": "9d1b7c2a-4e5f-4a6b-8c7d-0e1f2a3b4c5d",
"rfc": "EKU9003173C9",
"nombre": "ESCUELA KEMPER URGATE",
"usoCfdi": "G03"
},
"formaPago": "03",
"metodoPago": "PUE",
"moneda": "MXN",
"subtotal": 1000,
"descuento": 0,
"total": 1160,
"error": null,
"xmlUrl": "https://magifactura.com/api/v1/facturas/3f2b8c1e-5d0a-4c7e-9b1a-2e6f0c9d4a71/xml",
"pdfUrl": "https://magifactura.com/api/v1/facturas/3f2b8c1e-5d0a-4c7e-9b1a-2e6f0c9d4a71/pdf",
"conceptos": [
{
"descripcion": "Consultoría",
"claveProdServ": "80111600",
"claveUnidad": "E48",
"cantidad": 1,
"precio": 1000,
"descuento": 0,
"tasaIva": "16"
}
],
"cancelacion": null
}¿Vendes en mostrador? Registra un ticket ahora y factúralo después con POST /tickets/{id}/facturar:
{
"conceptos": [
{
"descripcion": "Café americano",
"cantidad": 2,
"precio": 45
},
{
"descripcion": "Pan dulce",
"precio": 30
}
],
"formaPago": "01",
"folio": "T-1042"
}Autenticación y permisos
Envía tu clave en cada solicitud: Authorization: Bearer mf_live_…. Las claves son de la organización (no de una persona), se muestran una sola vez y se revocan al instante desde Ajustes → API. Cada clave tiene permisos; una operación sin permiso responde 403 sin_permiso.
| Permiso | Permite |
|---|---|
| invoices:read | Ver facturas |
| invoices:write | Crear, timbrar y enviar facturas |
| invoices:cancel | Cancelar facturas ante el SAT |
| tickets:read | Ver tickets |
| tickets:write | Crear y cancelar tickets |
| clients:read | Ver clientes |
| clients:write | Crear y editar clientes |
| products:read | Ver productos |
| products:write | Crear, editar y borrar productos |
| settings:read | Ver datos de la organización y preferencias |
| settings:write | Cambiar preferencias de la API |
Atajos al crear una clave: Completo (todos), Solo tickets (POS) (tickets:read, tickets:write, clients:read, products:read) y Solo lectura. Solo administradores pueden crear claves. Nunca pongas una clave en código que corre en el navegador: la API no acepta llamadas desde páginas web.
Modo prueba
Las claves mf_test_ timbran en el sandbox del PAC con el RFC de prueba del SAT (EKU9003173C9): no generan CFDI reales (cancelarlas también ocurre en el sandbox) ni cuentan en tus reportes, y los documentos de prueba no aparecen en tu panel. Las respuestas traen "modo": "test". El envío por correo no está disponible en modo prueba. Ojo: los clientes, productos y preferencias que crees o cambies con una clave de prueba son los reales de tu organización. Cuando todo funcione, cambia a una clave mf_live_.
Reintentos seguros
Envía Idempotency-Key en cada POST (1 a 100 caracteres: letras, números, - _ : .), por ejemplo el número de pedido. Si se corta la conexión, repite la solicitud con la misma clave y el mismo cuerpo: recibes la respuesta original (con el header Idempotent-Replayed: true) y nunca se timbra dos veces. La clave dura 24 horas. Si la factura queda en pendiente (202), el timbrado no se pudo confirmar: consulta la factura antes de reintentar. Usa una clave distinta por cada pedido o factura; repetir una clave con otro cuerpo responde 409.
Errores
Todos los errores tienen la misma forma:
{
"error": {
"code": "validacion",
"message": "receptor.rfc: RFC inválido (12 o 13 caracteres, p. ej. EKU9003173C9)",
"field": "receptor.rfc"
}
}| code | HTTP | Significa |
|---|---|---|
| validacion | 400 | Un campo falta o es inválido. field dice cuál y details trae la lista completa. |
| no_autenticado | 401 | Falta el header Authorization o la clave es inválida, está revocada o vencida. |
| sin_permiso | 403 | La credencial no tiene el permiso de esa operación. |
| no_encontrado | 404 | No existe, es de otra organización o de otro modo (prueba vs. producción). |
| conflicto | 409 | El estado no lo permite (p. ej. cancelar una factura ya cancelada). |
| idempotency_conflict | 409 | Esa Idempotency-Key ya se usó con otro cuerpo. |
| idempotency_en_proceso | 409 | La solicitud original con esa clave sigue en proceso. |
| rechazo_sat | 422 | El PAC o el SAT rechazó el comprobante; el mensaje trae su código (p. ej. CFDI40212). |
| no_timbrable | 422 | Faltan datos de tu organización para timbrar (p. ej. CSD). |
| rate_limit | 429 | Demasiadas solicitudes; espera los segundos de Retry-After. |
| error_envio | 502 | No se pudo enviar el correo. |
| error_interno | 500 | Error de nuestro lado; reintenta con la misma Idempotency-Key. |
Límites
120 solicitudes por minuto y 30 timbrados o cancelaciones por minuto, por credencial. Cada respuesta autenticada trae RateLimit-Limit, RateLimit-Remaining y RateLimit-Reset; al pasarte recibes 429 con Retry-After.
Paginación
Los listados devuelven { "data": [...], "nextCursor": "…" }, los más recientes primero. Pide más con ?cursor=<nextCursor>; ?limit= va de 1 a 100 (50 por defecto). Cuando nextCursor es null, no hay más.
Agentes de IA (MCP)
Conecta Claude, ChatGPT u otro agente compatible con MCP para crear facturas y tickets conversando. URL del servidor: https://magifactura.com/api/mcp. En Claude o ChatGPT agrégalo como conector personalizado con esa URL; te pediremos iniciar sesión, elegir la organización y aprobar los permisos. Las acciones que timbran, cancelan o envían piden tu confirmación antes de ejecutarse.
En Claude Code, con una clave de API:
claude mcp add --transport http magifactura https://magifactura.com/api/mcp \
--header "Authorization: Bearer $MAGIFACTURA_API_KEY"Herramientas:
crear_facturacrear_ticketfacturar_ticketbuscar_facturasobtener_facturacancelar_facturaenviar_facturabuscar_clientescrear_clientebuscar_productoscrear_productoobtener_organizacionactualizar_preferenciasconsultar_catalogoquien_soy
Referencia
Generada de la misma especificación que valida cada solicitud.
Cuenta
Qué organización, modo y permisos tiene tu credencial.
get/api/v1/me
Ver la credencial actual
Cualquier credencial válida. Úsalo para probar tu clave: devuelve la organización, el modo (live/test) y los permisos.
200 — La credencial
| Campo | Tipo | Descripción |
|---|---|---|
| organizacionobligatorio | object | |
| organizacion.idobligatorio | string | |
| organizacion.nombreobligatorio | string | |
| organizacion.slugobligatorio | string | |
| modoobligatorio | string | live: producción; test: modo prueba (sandbox del PAC)Valores: live, test |
| scopesobligatorio | string[] | |
| credencialobligatorio | object | |
| credencial.tipoobligatorio | string | Valores: clave, oauth |
| credencial.idobligatorio | string | |
| credencial.nombreobligatorio | string | null |
Errores: 401, 429, 500. Ver Errores.
Facturas
Crear y timbrar CFDI 4.0, consultarlos, descargarlos, cancelarlos y enviarlos.
post/api/v1/facturas
Crear y timbrar una factura
Permiso requerido: invoices:write. Solo receptor y conceptos son obligatorios; formaPago también si no tienes una por defecto. Un RFC nuevo crea el cliente. Con una clave de prueba se timbra en el sandbox con el RFC de prueba del SAT.
| Campo | Tipo | Descripción |
|---|---|---|
| Idempotency-Key (header) | string | Recomendado en todo POST. 1 a 100 caracteres (letras, números, - _ : .). La misma clave con el mismo cuerpo devuelve la respuesta original sin repetir la operación (24 h). |
| Campo | Tipo | Descripción |
|---|---|---|
| receptorobligatorio | object | Envía clienteId o rfc (solo uno) |
| receptor.clienteId | string | Cliente existente |
| receptor.rfc | string | RFC; si ya existe se usan sus datos guardados, si es nuevo se crea el cliente |
| receptor.nombre | string | Razón social (RFC nuevo) o nombre para XAXX010101000 individual |
| receptor.cp | string | Código postal (5 dígitos) |
| receptor.regimen | string | Régimen fiscal SAT (c_RegimenFiscal), p. ej. 601 |
| receptor.usoCfdi | string | Uso del CFDI (c_UsoCFDI)Valores: G01, G02, G03, I01, I02, I03, I04, I08, D01, D04, S01, CP01 |
| conceptosobligatorio | object[] | De 1 a 500 conceptos |
| conceptos[].descripcionobligatorio | string | Descripción del concepto (sin |) |
| conceptos[].claveProdServobligatorio | string | Clave de producto o servicio SAT (8 dígitos); en tickets por defecto 01010101 |
| conceptos[].claveUnidad | string | Clave de unidad SAT; por defecto E48Por defecto: E48 |
| conceptos[].cantidad | number | Cantidad; por defecto 1Por defecto: 1 |
| conceptos[].precioobligatorio | number | Valor unitario antes de impuestos |
| conceptos[].descuento | number | Descuento en pesos para la línea; por defecto 0Por defecto: 0 |
| conceptos[].tasaIva | string | Tasa de IVA trasladado: 16, 8 (región fronteriza), 0 o exentoValores: 16, 8, 0, exentoPor defecto: 16 |
| conceptos[].retIva | string | IVA retenido (%): 10.6667 o 4Valores: 10.6667, 4 |
| conceptos[].retIsr | string | ISR retenido (%): 10, 1.25 o 20Valores: 10, 1.25, 20 |
| conceptos[].cuentaPredial | string | Número de cuenta predial; obligatorio en arrendamiento (claves 8013…) |
| conceptos[].noIdentificacion | string | Número de identificación (SKU o folio del ticket) |
| formaPago | string | Obligatoria si no configuraste una por defecto en /organizacion/preferenciasValores: 01, 02, 03, 04, 28, 99 |
| metodoPago | string | Por defecto la de tus preferencias o PUEValores: PUE, PPD |
| serie | string | Serie interna (máx. 25) |
| folio | string | Folio interno (máx. 40) |
| moneda | string | MXN por defecto; USD o EUR requieren tipoCambioValores: MXN, USD, EURPor defecto: MXN |
| tipoCambio | number | Tipo de cambio a MXN (obligatorio si moneda no es MXN) |
| condicionesDePago | string | Condiciones de pago (texto libre) |
| regimenFiscalEmisor | string | Régimen del emisor para esta factura; por defecto el principal |
| informacionGlobal | object | Solo para factura global a XAXX010101000 sin nombre |
| informacionGlobal.periodicidadobligatorio | string | Periodicidad SAT: 01 diaria, 02 semanal, 03 quincenal, 04 mensual, 05 bimestralValores: 01, 02, 03, 04, 05 |
| informacionGlobal.mesesobligatorio | string | Mes (01–12) o bimestre SAT (13–18) |
| informacionGlobal.añoobligatorio | integer | Año del periodo |
201 — Factura timbrada
| Campo | Tipo | Descripción |
|---|---|---|
| idobligatorio | string | |
| uuidobligatorio | string | null | Folio fiscal del SAT; null hasta que se timbra |
| statusobligatorio | string | pendiente: no se pudo confirmar el timbrado, verifica antes de reintentarValores: borrador, pendiente, timbrada, cancelada, error |
| modoobligatorio | string | live: producción; test: modo prueba (sandbox del PAC)Valores: live, test |
| serieobligatorio | string | null | |
| folioobligatorio | string | null | |
| fechaobligatorio | string | Fecha y hora ISO 8601 (UTC) |
| receptorobligatorio | object | |
| receptor.clienteIdobligatorio | string | null | |
| receptor.rfcobligatorio | string | |
| receptor.nombreobligatorio | string | |
| receptor.usoCfdiobligatorio | string | |
| formaPagoobligatorio | string | null | |
| metodoPagoobligatorio | string | null | |
| monedaobligatorio | string | |
| subtotalobligatorio | number | |
| descuentoobligatorio | number | |
| totalobligatorio | number | |
| errorobligatorio | string | null | Mensaje del PAC o del SAT cuando status es error o pendiente |
| xmlUrlobligatorio | string | null | |
| pdfUrlobligatorio | string | null | |
| conceptos | object[] | Solo en el detalle y al crear |
| conceptos[].descripcionobligatorio | string | |
| conceptos[].claveProdServobligatorio | string | null | |
| conceptos[].claveUnidadobligatorio | string | null | |
| conceptos[].cantidadobligatorio | number | |
| conceptos[].precioobligatorio | number | Valor unitario antes de impuestos |
| conceptos[].descuentoobligatorio | number | |
| conceptos[].tasaIvaobligatorio | string | Valores: 16, 8, 0, exento |
| conceptos[].retIva | string | Tasa de IVA retenido (%) |
| conceptos[].retIsr | string | Tasa de ISR retenido (%) |
| conceptos[].cuentaPredial | string | |
| conceptos[].noIdentificacion | string | |
| cancelacion | object | null | |
| cancelacion.motivoobligatorio | string | |
| cancelacion.fechaobligatorio | string | |
| cancelacion.enProcesoobligatorio | boolean | El receptor debe aceptar la cancelación |
202 — Timbrado sin confirmar (`status: pendiente`): verifica antes de reintentar
| Campo | Tipo | Descripción |
|---|---|---|
| idobligatorio | string | |
| uuidobligatorio | string | null | Folio fiscal del SAT; null hasta que se timbra |
| statusobligatorio | string | pendiente: no se pudo confirmar el timbrado, verifica antes de reintentarValores: borrador, pendiente, timbrada, cancelada, error |
| modoobligatorio | string | live: producción; test: modo prueba (sandbox del PAC)Valores: live, test |
| serieobligatorio | string | null | |
| folioobligatorio | string | null | |
| fechaobligatorio | string | Fecha y hora ISO 8601 (UTC) |
| receptorobligatorio | object | |
| receptor.clienteIdobligatorio | string | null | |
| receptor.rfcobligatorio | string | |
| receptor.nombreobligatorio | string | |
| receptor.usoCfdiobligatorio | string | |
| formaPagoobligatorio | string | null | |
| metodoPagoobligatorio | string | null | |
| monedaobligatorio | string | |
| subtotalobligatorio | number | |
| descuentoobligatorio | number | |
| totalobligatorio | number | |
| errorobligatorio | string | null | Mensaje del PAC o del SAT cuando status es error o pendiente |
| xmlUrlobligatorio | string | null | |
| pdfUrlobligatorio | string | null | |
| conceptos | object[] | Solo en el detalle y al crear |
| conceptos[].descripcionobligatorio | string | |
| conceptos[].claveProdServobligatorio | string | null | |
| conceptos[].claveUnidadobligatorio | string | null | |
| conceptos[].cantidadobligatorio | number | |
| conceptos[].precioobligatorio | number | Valor unitario antes de impuestos |
| conceptos[].descuentoobligatorio | number | |
| conceptos[].tasaIvaobligatorio | string | Valores: 16, 8, 0, exento |
| conceptos[].retIva | string | Tasa de IVA retenido (%) |
| conceptos[].retIsr | string | Tasa de ISR retenido (%) |
| conceptos[].cuentaPredial | string | |
| conceptos[].noIdentificacion | string | |
| cancelacion | object | null | |
| cancelacion.motivoobligatorio | string | |
| cancelacion.fechaobligatorio | string | |
| cancelacion.enProcesoobligatorio | boolean | El receptor debe aceptar la cancelación |
Errores: 400, 401, 403, 404, 409, 422, 429, 500. Ver Errores.
get/api/v1/facturas
Listar facturas
Permiso requerido: invoices:read. Más recientes primero. Paginación por cursor.
| Campo | Tipo | Descripción |
|---|---|---|
| limit | integer | Resultados por página (1–100, por defecto 50) |
| cursor | string | Valor de nextCursor de la página anterior |
| status | string | Filtra por estado |
| desde | string | Fecha AAAA-MM-DD (hora de la Ciudad de México) |
| hasta | string | Fecha AAAA-MM-DD (hora de la Ciudad de México) |
| rfc | string | RFC del receptor |
| q | string | Busca en nombre del receptor, folio o UUID |
200 — Una página de facturas
| Campo | Tipo | Descripción |
|---|---|---|
| dataobligatorio | object[] | |
| data[].idobligatorio | string | |
| data[].uuidobligatorio | string | null | Folio fiscal del SAT; null hasta que se timbra |
| data[].statusobligatorio | string | pendiente: no se pudo confirmar el timbrado, verifica antes de reintentarValores: borrador, pendiente, timbrada, cancelada, error |
| data[].modoobligatorio | string | live: producción; test: modo prueba (sandbox del PAC)Valores: live, test |
| data[].serieobligatorio | string | null | |
| data[].folioobligatorio | string | null | |
| data[].fechaobligatorio | string | Fecha y hora ISO 8601 (UTC) |
| data[].receptorobligatorio | object | |
| data[].formaPagoobligatorio | string | null | |
| data[].metodoPagoobligatorio | string | null | |
| data[].monedaobligatorio | string | |
| data[].subtotalobligatorio | number | |
| data[].descuentoobligatorio | number | |
| data[].totalobligatorio | number | |
| data[].errorobligatorio | string | null | Mensaje del PAC o del SAT cuando status es error o pendiente |
| data[].xmlUrlobligatorio | string | null | |
| data[].pdfUrlobligatorio | string | null | |
| data[].conceptos | object[] | Solo en el detalle y al crear |
| data[].cancelacion | object | null | |
| nextCursorobligatorio | string | null | Pásalo como ?cursor= para la siguiente página; null si no hay más |
Errores: 400, 401, 403, 429, 500. Ver Errores.
get/api/v1/facturas/{id}
Ver una factura
Permiso requerido: invoices:read.
| Campo | Tipo | Descripción |
|---|---|---|
| id (ruta)obligatorio | string | ID del recurso |
200 — La factura con sus conceptos
| Campo | Tipo | Descripción |
|---|---|---|
| idobligatorio | string | |
| uuidobligatorio | string | null | Folio fiscal del SAT; null hasta que se timbra |
| statusobligatorio | string | pendiente: no se pudo confirmar el timbrado, verifica antes de reintentarValores: borrador, pendiente, timbrada, cancelada, error |
| modoobligatorio | string | live: producción; test: modo prueba (sandbox del PAC)Valores: live, test |
| serieobligatorio | string | null | |
| folioobligatorio | string | null | |
| fechaobligatorio | string | Fecha y hora ISO 8601 (UTC) |
| receptorobligatorio | object | |
| receptor.clienteIdobligatorio | string | null | |
| receptor.rfcobligatorio | string | |
| receptor.nombreobligatorio | string | |
| receptor.usoCfdiobligatorio | string | |
| formaPagoobligatorio | string | null | |
| metodoPagoobligatorio | string | null | |
| monedaobligatorio | string | |
| subtotalobligatorio | number | |
| descuentoobligatorio | number | |
| totalobligatorio | number | |
| errorobligatorio | string | null | Mensaje del PAC o del SAT cuando status es error o pendiente |
| xmlUrlobligatorio | string | null | |
| pdfUrlobligatorio | string | null | |
| conceptos | object[] | Solo en el detalle y al crear |
| conceptos[].descripcionobligatorio | string | |
| conceptos[].claveProdServobligatorio | string | null | |
| conceptos[].claveUnidadobligatorio | string | null | |
| conceptos[].cantidadobligatorio | number | |
| conceptos[].precioobligatorio | number | Valor unitario antes de impuestos |
| conceptos[].descuentoobligatorio | number | |
| conceptos[].tasaIvaobligatorio | string | Valores: 16, 8, 0, exento |
| conceptos[].retIva | string | Tasa de IVA retenido (%) |
| conceptos[].retIsr | string | Tasa de ISR retenido (%) |
| conceptos[].cuentaPredial | string | |
| conceptos[].noIdentificacion | string | |
| cancelacion | object | null | |
| cancelacion.motivoobligatorio | string | |
| cancelacion.fechaobligatorio | string | |
| cancelacion.enProcesoobligatorio | boolean | El receptor debe aceptar la cancelación |
Errores: 401, 403, 404, 429, 500. Ver Errores.
get/api/v1/facturas/{id}/xml
Descargar el XML timbrado
Permiso requerido: invoices:read.
| Campo | Tipo | Descripción |
|---|---|---|
| id (ruta)obligatorio | string | ID del recurso |
200 — XML del CFDI (application/xml)
Errores: 401, 403, 404, 409, 429, 500. Ver Errores.
get/api/v1/facturas/{id}/pdf
Descargar el PDF
Permiso requerido: invoices:read.
| Campo | Tipo | Descripción |
|---|---|---|
| id (ruta)obligatorio | string | ID del recurso |
200 — Representación impresa (application/pdf)
Errores: 401, 403, 404, 409, 429, 500. Ver Errores.
post/api/v1/facturas/{id}/cancelar
Cancelar ante el SAT
Permiso requerido: invoices:cancel. Si el receptor debe aceptar, la factura sigue timbrada con cancelacion.enProceso: true.
| Campo | Tipo | Descripción |
|---|---|---|
| id (ruta)obligatorio | string | ID del recurso |
| Idempotency-Key (header) | string | Recomendado en todo POST. 1 a 100 caracteres (letras, números, - _ : .). La misma clave con el mismo cuerpo devuelve la respuesta original sin repetir la operación (24 h). |
| Campo | Tipo | Descripción |
|---|---|---|
| motivoobligatorio | string | Motivo SAT: 01 con relación (requiere folioSustitucion), 02 sin relación, 03 no se realizó la operación, 04 operación nominativa en factura globalValores: 01, 02, 03, 04 |
| folioSustitucion | string | UUID de la factura que sustituye (motivo 01) |
200 — La factura cancelada o en proceso de cancelación
| Campo | Tipo | Descripción |
|---|---|---|
| idobligatorio | string | |
| uuidobligatorio | string | null | Folio fiscal del SAT; null hasta que se timbra |
| statusobligatorio | string | pendiente: no se pudo confirmar el timbrado, verifica antes de reintentarValores: borrador, pendiente, timbrada, cancelada, error |
| modoobligatorio | string | live: producción; test: modo prueba (sandbox del PAC)Valores: live, test |
| serieobligatorio | string | null | |
| folioobligatorio | string | null | |
| fechaobligatorio | string | Fecha y hora ISO 8601 (UTC) |
| receptorobligatorio | object | |
| receptor.clienteIdobligatorio | string | null | |
| receptor.rfcobligatorio | string | |
| receptor.nombreobligatorio | string | |
| receptor.usoCfdiobligatorio | string | |
| formaPagoobligatorio | string | null | |
| metodoPagoobligatorio | string | null | |
| monedaobligatorio | string | |
| subtotalobligatorio | number | |
| descuentoobligatorio | number | |
| totalobligatorio | number | |
| errorobligatorio | string | null | Mensaje del PAC o del SAT cuando status es error o pendiente |
| xmlUrlobligatorio | string | null | |
| pdfUrlobligatorio | string | null | |
| conceptos | object[] | Solo en el detalle y al crear |
| conceptos[].descripcionobligatorio | string | |
| conceptos[].claveProdServobligatorio | string | null | |
| conceptos[].claveUnidadobligatorio | string | null | |
| conceptos[].cantidadobligatorio | number | |
| conceptos[].precioobligatorio | number | Valor unitario antes de impuestos |
| conceptos[].descuentoobligatorio | number | |
| conceptos[].tasaIvaobligatorio | string | Valores: 16, 8, 0, exento |
| conceptos[].retIva | string | Tasa de IVA retenido (%) |
| conceptos[].retIsr | string | Tasa de ISR retenido (%) |
| conceptos[].cuentaPredial | string | |
| conceptos[].noIdentificacion | string | |
| cancelacion | object | null | |
| cancelacion.motivoobligatorio | string | |
| cancelacion.fechaobligatorio | string | |
| cancelacion.enProcesoobligatorio | boolean | El receptor debe aceptar la cancelación |
Errores: 400, 401, 403, 404, 409, 422, 429, 500. Ver Errores.
post/api/v1/facturas/{id}/enviar
Enviar por correo (PDF y XML)
Permiso requerido: invoices:write. No disponible en modo prueba.
| Campo | Tipo | Descripción |
|---|---|---|
| id (ruta)obligatorio | string | ID del recurso |
| Idempotency-Key (header) | string | Recomendado en todo POST. 1 a 100 caracteres (letras, números, - _ : .). La misma clave con el mismo cuerpo devuelve la respuesta original sin repetir la operación (24 h). |
| Campo | Tipo | Descripción |
|---|---|---|
| string | Por defecto el correo de facturas del cliente |
200 — Enviado
| Campo | Tipo | Descripción |
|---|---|---|
| enviadoobligatorio | boolean | Valores: true |
| paraobligatorio | string |
Errores: 400, 401, 403, 404, 409, 429, 500, 502. Ver Errores.
get/api/v1/facturas/{id}/estatus-sat
Consultar el estatus en el SAT
Permiso requerido: invoices:read.
| Campo | Tipo | Descripción |
|---|---|---|
| id (ruta)obligatorio | string | ID del recurso |
200 — Estatus según el servicio de consulta del SAT
| Campo | Tipo | Descripción |
|---|---|---|
| disponibleobligatorio | boolean | false para facturas de prueba |
| estadoobligatorio | string | null | Vigente, Cancelado o No encontrado |
| esCancelableobligatorio | string | null | |
| estatusCancelacionobligatorio | string | null | |
| mensaje | string |
Errores: 401, 403, 404, 409, 429, 500. Ver Errores.
Tickets
Notas de venta que tus clientes pueden facturar después.
post/api/v1/tickets
Crear un ticket
Permiso requerido: tickets:write. Los totales los calcula el servidor a partir de los conceptos.
| Campo | Tipo | Descripción |
|---|---|---|
| Idempotency-Key (header) | string | Recomendado en todo POST. 1 a 100 caracteres (letras, números, - _ : .). La misma clave con el mismo cuerpo devuelve la respuesta original sin repetir la operación (24 h). |
| Campo | Tipo | Descripción |
|---|---|---|
| conceptosobligatorio | object[] | |
| conceptos[].descripcionobligatorio | string | Descripción del concepto (sin |) |
| conceptos[].claveProdServ | string | Clave de producto o servicio SAT (8 dígitos); por defecto 01010101Por defecto: 01010101 |
| conceptos[].claveUnidad | string | Clave de unidad SAT; por defecto E48Por defecto: E48 |
| conceptos[].cantidad | number | Cantidad; por defecto 1Por defecto: 1 |
| conceptos[].precioobligatorio | number | Valor unitario antes de impuestos |
| conceptos[].descuento | number | Descuento en pesos para la línea; por defecto 0Por defecto: 0 |
| conceptos[].tasaIva | string | Tasa de IVA trasladado: 16, 8 (región fronteriza), 0 o exentoValores: 16, 8, 0, exentoPor defecto: 16 |
| conceptos[].retIva | string | IVA retenido (%): 10.6667 o 4Valores: 10.6667, 4 |
| conceptos[].retIsr | string | ISR retenido (%): 10, 1.25 o 20Valores: 10, 1.25, 20 |
| conceptos[].cuentaPredial | string | Número de cuenta predial; obligatorio en arrendamiento (claves 8013…) |
| conceptos[].noIdentificacion | string | Número de identificación (SKU o folio del ticket) |
| receptor | object | Opcional: cliente o RFC y nombre que verá el ticket |
| receptor.clienteId | string | |
| receptor.rfc | string | RFC (12 caracteres persona moral, 13 persona física) |
| receptor.nombre | string | |
| formaPago | string | Forma de pago SAT (c_FormaPago)Valores: 01, 02, 03, 04, 28, 99 |
| serie | string | |
| folio | string | |
| fecha | string | Fecha de venta ISO 8601; por defecto ahora |
201 — Ticket creado
| Campo | Tipo | Descripción |
|---|---|---|
| idobligatorio | string | |
| statusobligatorio | string | Valores: activo, cancelado, facturado |
| modoobligatorio | string | live: producción; test: modo prueba (sandbox del PAC)Valores: live, test |
| serieobligatorio | string | null | |
| folioobligatorio | string | null | |
| fechaobligatorio | string | Fecha y hora ISO 8601 (UTC) |
| receptorobligatorio | object | null | |
| receptor.clienteIdobligatorio | string | null | |
| receptor.rfcobligatorio | string | null | |
| receptor.nombreobligatorio | string | null | |
| formaPagoobligatorio | string | null | |
| monedaobligatorio | string | |
| subtotalobligatorio | number | |
| descuentoobligatorio | number | |
| totalobligatorio | number | Calculado por el servidor a partir de los conceptos |
| conceptosobligatorio | object[] | |
| conceptos[].descripcionobligatorio | string | |
| conceptos[].claveProdServobligatorio | string | null | |
| conceptos[].claveUnidadobligatorio | string | null | |
| conceptos[].cantidadobligatorio | number | |
| conceptos[].precioobligatorio | number | Valor unitario antes de impuestos |
| conceptos[].descuentoobligatorio | number | |
| conceptos[].tasaIvaobligatorio | string | Valores: 16, 8, 0, exento |
| conceptos[].retIva | string | Tasa de IVA retenido (%) |
| conceptos[].retIsr | string | Tasa de ISR retenido (%) |
| conceptos[].cuentaPredial | string | |
| conceptos[].noIdentificacion | string | |
| facturaIdobligatorio | string | null | Factura generada a partir del ticket |
Errores: 400, 401, 403, 404, 429, 500. Ver Errores.
get/api/v1/tickets
Listar tickets
Permiso requerido: tickets:read.
| Campo | Tipo | Descripción |
|---|---|---|
| limit | integer | Resultados por página (1–100, por defecto 50) |
| cursor | string | Valor de nextCursor de la página anterior |
| status | string | |
| desde | string | Fecha AAAA-MM-DD (hora de la Ciudad de México) |
| hasta | string | Fecha AAAA-MM-DD (hora de la Ciudad de México) |
200 — Una página de tickets
| Campo | Tipo | Descripción |
|---|---|---|
| dataobligatorio | object[] | |
| data[].idobligatorio | string | |
| data[].statusobligatorio | string | Valores: activo, cancelado, facturado |
| data[].modoobligatorio | string | live: producción; test: modo prueba (sandbox del PAC)Valores: live, test |
| data[].serieobligatorio | string | null | |
| data[].folioobligatorio | string | null | |
| data[].fechaobligatorio | string | Fecha y hora ISO 8601 (UTC) |
| data[].receptorobligatorio | object | null | |
| data[].formaPagoobligatorio | string | null | |
| data[].monedaobligatorio | string | |
| data[].subtotalobligatorio | number | |
| data[].descuentoobligatorio | number | |
| data[].totalobligatorio | number | Calculado por el servidor a partir de los conceptos |
| data[].conceptosobligatorio | object[] | |
| data[].facturaIdobligatorio | string | null | Factura generada a partir del ticket |
| nextCursorobligatorio | string | null | Pásalo como ?cursor= para la siguiente página; null si no hay más |
Errores: 400, 401, 403, 429, 500. Ver Errores.
get/api/v1/tickets/{id}
Ver un ticket
Permiso requerido: tickets:read.
| Campo | Tipo | Descripción |
|---|---|---|
| id (ruta)obligatorio | string | ID del recurso |
200 — El ticket
| Campo | Tipo | Descripción |
|---|---|---|
| idobligatorio | string | |
| statusobligatorio | string | Valores: activo, cancelado, facturado |
| modoobligatorio | string | live: producción; test: modo prueba (sandbox del PAC)Valores: live, test |
| serieobligatorio | string | null | |
| folioobligatorio | string | null | |
| fechaobligatorio | string | Fecha y hora ISO 8601 (UTC) |
| receptorobligatorio | object | null | |
| receptor.clienteIdobligatorio | string | null | |
| receptor.rfcobligatorio | string | null | |
| receptor.nombreobligatorio | string | null | |
| formaPagoobligatorio | string | null | |
| monedaobligatorio | string | |
| subtotalobligatorio | number | |
| descuentoobligatorio | number | |
| totalobligatorio | number | Calculado por el servidor a partir de los conceptos |
| conceptosobligatorio | object[] | |
| conceptos[].descripcionobligatorio | string | |
| conceptos[].claveProdServobligatorio | string | null | |
| conceptos[].claveUnidadobligatorio | string | null | |
| conceptos[].cantidadobligatorio | number | |
| conceptos[].precioobligatorio | number | Valor unitario antes de impuestos |
| conceptos[].descuentoobligatorio | number | |
| conceptos[].tasaIvaobligatorio | string | Valores: 16, 8, 0, exento |
| conceptos[].retIva | string | Tasa de IVA retenido (%) |
| conceptos[].retIsr | string | Tasa de ISR retenido (%) |
| conceptos[].cuentaPredial | string | |
| conceptos[].noIdentificacion | string | |
| facturaIdobligatorio | string | null | Factura generada a partir del ticket |
Errores: 401, 403, 404, 429, 500. Ver Errores.
post/api/v1/tickets/{id}/cancelar
Cancelar un ticket
Permiso requerido: tickets:write.
| Campo | Tipo | Descripción |
|---|---|---|
| id (ruta)obligatorio | string | ID del recurso |
| Idempotency-Key (header) | string | Recomendado en todo POST. 1 a 100 caracteres (letras, números, - _ : .). La misma clave con el mismo cuerpo devuelve la respuesta original sin repetir la operación (24 h). |
200 — Ticket cancelado
| Campo | Tipo | Descripción |
|---|---|---|
| idobligatorio | string | |
| statusobligatorio | string | Valores: activo, cancelado, facturado |
| modoobligatorio | string | live: producción; test: modo prueba (sandbox del PAC)Valores: live, test |
| serieobligatorio | string | null | |
| folioobligatorio | string | null | |
| fechaobligatorio | string | Fecha y hora ISO 8601 (UTC) |
| receptorobligatorio | object | null | |
| receptor.clienteIdobligatorio | string | null | |
| receptor.rfcobligatorio | string | null | |
| receptor.nombreobligatorio | string | null | |
| formaPagoobligatorio | string | null | |
| monedaobligatorio | string | |
| subtotalobligatorio | number | |
| descuentoobligatorio | number | |
| totalobligatorio | number | Calculado por el servidor a partir de los conceptos |
| conceptosobligatorio | object[] | |
| conceptos[].descripcionobligatorio | string | |
| conceptos[].claveProdServobligatorio | string | null | |
| conceptos[].claveUnidadobligatorio | string | null | |
| conceptos[].cantidadobligatorio | number | |
| conceptos[].precioobligatorio | number | Valor unitario antes de impuestos |
| conceptos[].descuentoobligatorio | number | |
| conceptos[].tasaIvaobligatorio | string | Valores: 16, 8, 0, exento |
| conceptos[].retIva | string | Tasa de IVA retenido (%) |
| conceptos[].retIsr | string | Tasa de ISR retenido (%) |
| conceptos[].cuentaPredial | string | |
| conceptos[].noIdentificacion | string | |
| facturaIdobligatorio | string | null | Factura generada a partir del ticket |
Errores: 401, 403, 404, 409, 429, 500. Ver Errores.
post/api/v1/tickets/{id}/facturar
Facturar un ticket
Permiso requerido: invoices:write y tickets:write. Timbra una factura con los conceptos del ticket; el ticket pasa a facturado.
| Campo | Tipo | Descripción |
|---|---|---|
| id (ruta)obligatorio | string | ID del recurso |
| Idempotency-Key (header) | string | Recomendado en todo POST. 1 a 100 caracteres (letras, números, - _ : .). La misma clave con el mismo cuerpo devuelve la respuesta original sin repetir la operación (24 h). |
| Campo | Tipo | Descripción |
|---|---|---|
| receptorobligatorio | object | Receptor de la factura |
| receptor.clienteId | string | Cliente existente |
| receptor.rfc | string | RFC; si ya existe se usan sus datos guardados, si es nuevo se crea el cliente |
| receptor.nombre | string | Razón social (RFC nuevo) o nombre para XAXX010101000 individual |
| receptor.cp | string | Código postal (5 dígitos) |
| receptor.regimen | string | Régimen fiscal SAT (c_RegimenFiscal), p. ej. 601 |
| receptor.usoCfdi | string | Uso del CFDI (c_UsoCFDI)Valores: G01, G02, G03, I01, I02, I03, I04, I08, D01, D04, S01, CP01 |
| formaPago | string | Forma de pago SAT (c_FormaPago)Valores: 01, 02, 03, 04, 28, 99 |
| metodoPago | string | PUE: una exhibición; PPD: parcialidades o diferidoValores: PUE, PPD |
| serie | string | |
| folio | string |
201 — Factura timbrada
| Campo | Tipo | Descripción |
|---|---|---|
| idobligatorio | string | |
| uuidobligatorio | string | null | Folio fiscal del SAT; null hasta que se timbra |
| statusobligatorio | string | pendiente: no se pudo confirmar el timbrado, verifica antes de reintentarValores: borrador, pendiente, timbrada, cancelada, error |
| modoobligatorio | string | live: producción; test: modo prueba (sandbox del PAC)Valores: live, test |
| serieobligatorio | string | null | |
| folioobligatorio | string | null | |
| fechaobligatorio | string | Fecha y hora ISO 8601 (UTC) |
| receptorobligatorio | object | |
| receptor.clienteIdobligatorio | string | null | |
| receptor.rfcobligatorio | string | |
| receptor.nombreobligatorio | string | |
| receptor.usoCfdiobligatorio | string | |
| formaPagoobligatorio | string | null | |
| metodoPagoobligatorio | string | null | |
| monedaobligatorio | string | |
| subtotalobligatorio | number | |
| descuentoobligatorio | number | |
| totalobligatorio | number | |
| errorobligatorio | string | null | Mensaje del PAC o del SAT cuando status es error o pendiente |
| xmlUrlobligatorio | string | null | |
| pdfUrlobligatorio | string | null | |
| conceptos | object[] | Solo en el detalle y al crear |
| conceptos[].descripcionobligatorio | string | |
| conceptos[].claveProdServobligatorio | string | null | |
| conceptos[].claveUnidadobligatorio | string | null | |
| conceptos[].cantidadobligatorio | number | |
| conceptos[].precioobligatorio | number | Valor unitario antes de impuestos |
| conceptos[].descuentoobligatorio | number | |
| conceptos[].tasaIvaobligatorio | string | Valores: 16, 8, 0, exento |
| conceptos[].retIva | string | Tasa de IVA retenido (%) |
| conceptos[].retIsr | string | Tasa de ISR retenido (%) |
| conceptos[].cuentaPredial | string | |
| conceptos[].noIdentificacion | string | |
| cancelacion | object | null | |
| cancelacion.motivoobligatorio | string | |
| cancelacion.fechaobligatorio | string | |
| cancelacion.enProcesoobligatorio | boolean | El receptor debe aceptar la cancelación |
202 — Timbrado sin confirmar (`status: pendiente`)
| Campo | Tipo | Descripción |
|---|---|---|
| idobligatorio | string | |
| uuidobligatorio | string | null | Folio fiscal del SAT; null hasta que se timbra |
| statusobligatorio | string | pendiente: no se pudo confirmar el timbrado, verifica antes de reintentarValores: borrador, pendiente, timbrada, cancelada, error |
| modoobligatorio | string | live: producción; test: modo prueba (sandbox del PAC)Valores: live, test |
| serieobligatorio | string | null | |
| folioobligatorio | string | null | |
| fechaobligatorio | string | Fecha y hora ISO 8601 (UTC) |
| receptorobligatorio | object | |
| receptor.clienteIdobligatorio | string | null | |
| receptor.rfcobligatorio | string | |
| receptor.nombreobligatorio | string | |
| receptor.usoCfdiobligatorio | string | |
| formaPagoobligatorio | string | null | |
| metodoPagoobligatorio | string | null | |
| monedaobligatorio | string | |
| subtotalobligatorio | number | |
| descuentoobligatorio | number | |
| totalobligatorio | number | |
| errorobligatorio | string | null | Mensaje del PAC o del SAT cuando status es error o pendiente |
| xmlUrlobligatorio | string | null | |
| pdfUrlobligatorio | string | null | |
| conceptos | object[] | Solo en el detalle y al crear |
| conceptos[].descripcionobligatorio | string | |
| conceptos[].claveProdServobligatorio | string | null | |
| conceptos[].claveUnidadobligatorio | string | null | |
| conceptos[].cantidadobligatorio | number | |
| conceptos[].precioobligatorio | number | Valor unitario antes de impuestos |
| conceptos[].descuentoobligatorio | number | |
| conceptos[].tasaIvaobligatorio | string | Valores: 16, 8, 0, exento |
| conceptos[].retIva | string | Tasa de IVA retenido (%) |
| conceptos[].retIsr | string | Tasa de ISR retenido (%) |
| conceptos[].cuentaPredial | string | |
| conceptos[].noIdentificacion | string | |
| cancelacion | object | null | |
| cancelacion.motivoobligatorio | string | |
| cancelacion.fechaobligatorio | string | |
| cancelacion.enProcesoobligatorio | boolean | El receptor debe aceptar la cancelación |
Errores: 400, 401, 403, 404, 409, 422, 429, 500. Ver Errores.
Clientes
Receptores de tus facturas.
get/api/v1/clientes
Listar clientes
Permiso requerido: clients:read.
| Campo | Tipo | Descripción |
|---|---|---|
| limit | integer | Resultados por página (1–100, por defecto 50) |
| cursor | string | Valor de nextCursor de la página anterior |
| rfc | string | RFC (12 caracteres persona moral, 13 persona física) |
| q | string |
200 — Una página de clientes
| Campo | Tipo | Descripción |
|---|---|---|
| dataobligatorio | object[] | |
| data[].idobligatorio | string | |
| data[].rfcobligatorio | string | |
| data[].nombreobligatorio | string | |
| data[].cpobligatorio | string | null | |
| data[].regimenobligatorio | string | null | |
| data[].emailobligatorio | string | null | Correo al que se envían sus facturas |
| data[].publicoEnGeneralobligatorio | boolean | |
| data[].editableobligatorio | boolean | false si sus datos vienen de una constancia del SAT o es Público en General |
| data[].creadoEnobligatorio | string | Fecha y hora ISO 8601 (UTC) |
| nextCursorobligatorio | string | null | Pásalo como ?cursor= para la siguiente página; null si no hay más |
Errores: 400, 401, 403, 429, 500. Ver Errores.
post/api/v1/clientes
Agregar un cliente
Permiso requerido: clients:write. Si el RFC ya existe se usan sus datos guardados y responde 200.
| Campo | Tipo | Descripción |
|---|---|---|
| Idempotency-Key (header) | string | Recomendado en todo POST. 1 a 100 caracteres (letras, números, - _ : .). La misma clave con el mismo cuerpo devuelve la respuesta original sin repetir la operación (24 h). |
| Campo | Tipo | Descripción |
|---|---|---|
| rfcobligatorio | string | RFC (12 caracteres persona moral, 13 persona física) |
| nombre | string | Razón social (solo para un RFC nuevo) |
| cp | string | Código postal (5 dígitos) |
| regimen | string | Régimen fiscal SAT (c_RegimenFiscal), p. ej. 601 |
| string | Correo electrónico |
200 — El RFC ya era cliente
| Campo | Tipo | Descripción |
|---|---|---|
| creadoobligatorio | boolean | false si el RFC ya era cliente de tu organización |
| clienteobligatorio | object | |
| cliente.idobligatorio | string | |
| cliente.rfcobligatorio | string | |
| cliente.nombreobligatorio | string | |
| cliente.cpobligatorio | string | null | |
| cliente.regimenobligatorio | string | null | |
| cliente.emailobligatorio | string | null | Correo al que se envían sus facturas |
| cliente.publicoEnGeneralobligatorio | boolean | |
| cliente.editableobligatorio | boolean | false si sus datos vienen de una constancia del SAT o es Público en General |
| cliente.creadoEnobligatorio | string | Fecha y hora ISO 8601 (UTC) |
201 — Cliente nuevo
| Campo | Tipo | Descripción |
|---|---|---|
| creadoobligatorio | boolean | false si el RFC ya era cliente de tu organización |
| clienteobligatorio | object | |
| cliente.idobligatorio | string | |
| cliente.rfcobligatorio | string | |
| cliente.nombreobligatorio | string | |
| cliente.cpobligatorio | string | null | |
| cliente.regimenobligatorio | string | null | |
| cliente.emailobligatorio | string | null | Correo al que se envían sus facturas |
| cliente.publicoEnGeneralobligatorio | boolean | |
| cliente.editableobligatorio | boolean | false si sus datos vienen de una constancia del SAT o es Público en General |
| cliente.creadoEnobligatorio | string | Fecha y hora ISO 8601 (UTC) |
Errores: 400, 401, 403, 429, 500. Ver Errores.
get/api/v1/clientes/{id}
Ver un cliente
Permiso requerido: clients:read.
| Campo | Tipo | Descripción |
|---|---|---|
| id (ruta)obligatorio | string | ID del recurso |
200 — El cliente
| Campo | Tipo | Descripción |
|---|---|---|
| idobligatorio | string | |
| rfcobligatorio | string | |
| nombreobligatorio | string | |
| cpobligatorio | string | null | |
| regimenobligatorio | string | null | |
| emailobligatorio | string | null | Correo al que se envían sus facturas |
| publicoEnGeneralobligatorio | boolean | |
| editableobligatorio | boolean | false si sus datos vienen de una constancia del SAT o es Público en General |
| creadoEnobligatorio | string | Fecha y hora ISO 8601 (UTC) |
Errores: 401, 403, 404, 429, 500. Ver Errores.
patch/api/v1/clientes/{id}
Actualizar un cliente
Permiso requerido: clients:write.
| Campo | Tipo | Descripción |
|---|---|---|
| id (ruta)obligatorio | string | ID del recurso |
| Campo | Tipo | Descripción |
|---|---|---|
| string | null | null para borrarlo | |
| nombre | string | |
| cp | string | Código postal (5 dígitos) |
| regimen | string | Régimen fiscal SAT (c_RegimenFiscal), p. ej. 601 |
200 — El cliente actualizado
| Campo | Tipo | Descripción |
|---|---|---|
| idobligatorio | string | |
| rfcobligatorio | string | |
| nombreobligatorio | string | |
| cpobligatorio | string | null | |
| regimenobligatorio | string | null | |
| emailobligatorio | string | null | Correo al que se envían sus facturas |
| publicoEnGeneralobligatorio | boolean | |
| editableobligatorio | boolean | false si sus datos vienen de una constancia del SAT o es Público en General |
| creadoEnobligatorio | string | Fecha y hora ISO 8601 (UTC) |
Errores: 400, 401, 403, 404, 409, 429, 500. Ver Errores.
Productos
Tu catálogo de productos y servicios.
get/api/v1/productos
Listar productos
Permiso requerido: products:read.
| Campo | Tipo | Descripción |
|---|---|---|
| limit | integer | Resultados por página (1–100, por defecto 50) |
| cursor | string | Valor de nextCursor de la página anterior |
| q | string |
200 — Una página de productos
| Campo | Tipo | Descripción |
|---|---|---|
| dataobligatorio | object[] | |
| data[].idobligatorio | string | |
| data[].descripcionobligatorio | string | |
| data[].nombreobligatorio | string | null | |
| data[].claveProdServobligatorio | string | |
| data[].claveUnidadobligatorio | string | |
| data[].precioobligatorio | number | |
| data[].skuobligatorio | string | null | |
| data[].cuentaPredialobligatorio | string | null | |
| data[].tasaIvaobligatorio | string | null | |
| data[].retIvaobligatorio | string | null | |
| data[].retIsrobligatorio | string | null | |
| data[].creadoEnobligatorio | string | Fecha y hora ISO 8601 (UTC) |
| nextCursorobligatorio | string | null | Pásalo como ?cursor= para la siguiente página; null si no hay más |
Errores: 400, 401, 403, 429, 500. Ver Errores.
post/api/v1/productos
Crear un producto
Permiso requerido: products:write.
| Campo | Tipo | Descripción |
|---|---|---|
| Idempotency-Key (header) | string | Recomendado en todo POST. 1 a 100 caracteres (letras, números, - _ : .). La misma clave con el mismo cuerpo devuelve la respuesta original sin repetir la operación (24 h). |
| Campo | Tipo | Descripción |
|---|---|---|
| descripcionobligatorio | string | Descripción que irá en la factura (sin |) |
| nombre | string | Nombre interno (no sale en la factura) |
| claveProdServobligatorio | string | Clave de producto o servicio SAT (8 dígitos) |
| claveUnidadobligatorio | string | Clave de unidad SAT, p. ej. E48 o H87 |
| precioobligatorio | number | Precio unitario antes de impuestos, máximo 2 decimales |
| sku | string | SKU o número de identificación interno |
| cuentaPredial | string | Número de cuenta predial (arrendamiento) |
| tasaIva | string | Tasa de IVA: 16, 8, 0 o exento; por defecto 16Valores: 16, 8, 0, exentoPor defecto: 16 |
| retIva | string | IVA retenido (%): 10.6667 o 4Valores: 10.6667, 4 |
| retIsr | string | ISR retenido (%): 10, 1.25 o 20Valores: 10, 1.25, 20 |
201 — Producto creado
| Campo | Tipo | Descripción |
|---|---|---|
| idobligatorio | string | |
| descripcionobligatorio | string | |
| nombreobligatorio | string | null | |
| claveProdServobligatorio | string | |
| claveUnidadobligatorio | string | |
| precioobligatorio | number | |
| skuobligatorio | string | null | |
| cuentaPredialobligatorio | string | null | |
| tasaIvaobligatorio | string | null | |
| retIvaobligatorio | string | null | |
| retIsrobligatorio | string | null | |
| creadoEnobligatorio | string | Fecha y hora ISO 8601 (UTC) |
Errores: 400, 401, 403, 429, 500. Ver Errores.
get/api/v1/productos/{id}
Ver un producto
Permiso requerido: products:read.
| Campo | Tipo | Descripción |
|---|---|---|
| id (ruta)obligatorio | string | ID del recurso |
200 — El producto
| Campo | Tipo | Descripción |
|---|---|---|
| idobligatorio | string | |
| descripcionobligatorio | string | |
| nombreobligatorio | string | null | |
| claveProdServobligatorio | string | |
| claveUnidadobligatorio | string | |
| precioobligatorio | number | |
| skuobligatorio | string | null | |
| cuentaPredialobligatorio | string | null | |
| tasaIvaobligatorio | string | null | |
| retIvaobligatorio | string | null | |
| retIsrobligatorio | string | null | |
| creadoEnobligatorio | string | Fecha y hora ISO 8601 (UTC) |
Errores: 401, 403, 404, 429, 500. Ver Errores.
patch/api/v1/productos/{id}
Actualizar un producto
Permiso requerido: products:write.
| Campo | Tipo | Descripción |
|---|---|---|
| id (ruta)obligatorio | string | ID del recurso |
| Campo | Tipo | Descripción |
|---|---|---|
| descripcion | string | Descripción que irá en la factura (sin |) |
| nombre | string | Nombre interno (no sale en la factura) |
| claveProdServ | string | Clave de producto o servicio SAT (8 dígitos) |
| claveUnidad | string | Clave de unidad SAT, p. ej. E48 o H87 |
| precio | number | Precio unitario antes de impuestos, máximo 2 decimales |
| sku | string | SKU o número de identificación interno |
| cuentaPredial | string | Número de cuenta predial (arrendamiento) |
| tasaIva | string | Tasa de IVA trasladado: 16, 8 (región fronteriza), 0 o exentoValores: 16, 8, 0, exento |
| retIva | string | IVA retenido (%): 10.6667 o 4Valores: 10.6667, 4 |
| retIsr | string | ISR retenido (%): 10, 1.25 o 20Valores: 10, 1.25, 20 |
200 — El producto actualizado
| Campo | Tipo | Descripción |
|---|---|---|
| idobligatorio | string | |
| descripcionobligatorio | string | |
| nombreobligatorio | string | null | |
| claveProdServobligatorio | string | |
| claveUnidadobligatorio | string | |
| precioobligatorio | number | |
| skuobligatorio | string | null | |
| cuentaPredialobligatorio | string | null | |
| tasaIvaobligatorio | string | null | |
| retIvaobligatorio | string | null | |
| retIsrobligatorio | string | null | |
| creadoEnobligatorio | string | Fecha y hora ISO 8601 (UTC) |
Errores: 400, 401, 403, 404, 429, 500. Ver Errores.
delete/api/v1/productos/{id}
Eliminar un producto
Permiso requerido: products:write.
| Campo | Tipo | Descripción |
|---|---|---|
| id (ruta)obligatorio | string | ID del recurso |
204 — Eliminado
Errores: 401, 403, 404, 429, 500. Ver Errores.
Organización
Datos fiscales del emisor y valores por defecto de la API.
get/api/v1/organizacion
Ver los datos de la organización
Permiso requerido: settings:read. RFC y regímenes del emisor y estado del CSD.
200 — La organización
| Campo | Tipo | Descripción |
|---|---|---|
| idobligatorio | string | |
| nombreobligatorio | string | |
| slugobligatorio | string | |
| modoobligatorio | string | live: producción; test: modo prueba (sandbox del PAC)Valores: live, test |
| emisorobligatorio | object | null | |
| emisor.rfcobligatorio | string | |
| emisor.razonSocialobligatorio | string | |
| emisor.cpobligatorio | string | null | |
| emisor.regimenesobligatorio | object[] | |
| csdobligatorio | object | |
| csd.estadoobligatorio | string | Valores: activo, vencido, sin_csd |
| csd.vigenteHastaobligatorio | string | null | |
| emisorPrueba | object | Solo con claves de prueba: el emisor con el que se timbra en el sandbox |
| emisorPrueba.rfcobligatorio | string | |
| emisorPrueba.nombreobligatorio | string | |
| emisorPrueba.regimenFiscalobligatorio | string | |
| emisorPrueba.cpobligatorio | string |
Errores: 401, 403, 429, 500. Ver Errores.
get/api/v1/organizacion/preferencias
Ver los valores por defecto de la API
Permiso requerido: settings:read.
200 — Preferencias
| Campo | Tipo | Descripción |
|---|---|---|
| formaPagoobligatorio | string | null | |
| metodoPagoobligatorio | string | null | |
| usoCfdiobligatorio | string | null | |
| serieobligatorio | string | null |
Errores: 401, 403, 429, 500. Ver Errores.
patch/api/v1/organizacion/preferencias
Cambiar los valores por defecto de la API
Permiso requerido: settings:write. Se usan cuando una factura no envía forma de pago, método de pago, uso del CFDI o serie.
| Campo | Tipo | Descripción |
|---|---|---|
| formaPago | string | null | null para borrar el valor por defectoValores: 01, 02, 03, 04, 28, 99 |
| metodoPago | string | null | null para borrar el valor por defectoValores: PUE, PPD |
| usoCfdi | string | null | null para borrar el valor por defectoValores: G01, G02, G03, I01, I02, I03, I04, I08, D01, D04, S01, CP01 |
| serie | string | null | null para borrar el valor por defecto |
200 — Preferencias guardadas
| Campo | Tipo | Descripción |
|---|---|---|
| formaPagoobligatorio | string | null | |
| metodoPagoobligatorio | string | null | |
| usoCfdiobligatorio | string | null | |
| serieobligatorio | string | null |
Errores: 400, 401, 403, 429, 500. Ver Errores.
Catálogos SAT
Claves válidas para llenar los campos.
get/api/v1/catalogos/{nombre}
Consultar un catálogo SAT
Cualquier credencial válida.
| Campo | Tipo | Descripción |
|---|---|---|
| nombre (ruta)obligatorio | string | Catálogo |
200 — Claves y descripciones
| Campo | Tipo | Descripción |
|---|---|---|
| dataobligatorio | object[] | |
| data[].claveobligatorio | string | |
| data[].descripcionobligatorio | string |
Errores: 401, 404, 429, 500. Ver Errores.
¿Dudas o necesitas un permiso que no está? Escríbenos desde el chat o déjanos tus datos.