Documentación · API v1

Documentación de la API FEL para Guatemala

Autentica tu aplicación, ejecuta operaciones FEL y recupera documentos con peticiones JSON sobre HTTPS.

Ctrl K

Introducción

Contrato de integración

Las operaciones públicas de Agencia Virtual utilizan el método POST, reciben datos en JSON y requieren autenticación Bearer.

Si comienzas una integración, consulta qué es FEL en Guatemala y la guía para integrar API FEL con tu ERP o POS.

Base URL
https://apifelcore.com/api

Dos tokens, funciones diferentes

Credencial Ubicación Función
Bearer token Header Authorization Autentica al usuario. Su vigencia depende de dónde fue creado.
token_fel Body JSON Identifica las credenciales FEL cifradas del cliente.

No envíes contraseñas SAT o FEL en query strings, rutas, logs o repositorios.

Tiempos de respuesta

Las rutas de Agencia Virtual y /v1/integrador/* incluyen Server-Timing en respuestas exitosas y errores. Los valores están en milisegundos y también pueden leerse desde JavaScript mediante CORS.

Server-Timing: total;dur=2400, apifelcore;dur=350.0, sat;dur=2050.0;desc="SAT + red"

sat acumula las transferencias HTTP a SAT, incluida la red; apifelcore es el resto del tramo medido, incluidas pausas locales. Ambos suman total. No mide exclusivamente el procesamiento interno de SAT, ni incluye la conexión del consumidor, el arranque previo al middleware o el envío final de la respuesta.

En el panel, el histórico con duración conocida se reparte 50/50 y aparece como Estimado 50/50. Las solicitudes nuevas y este encabezado usan mediciones reales. Estos tiempos son calculados por el servidor; no se envían como parámetros de entrada.

Quickstart

Tu primera petición

Obtén un token y úsalo para ejecutar tu primera operación FEL.

POST

/login

Genera un token Bearer válido durante 24 horas.

Campo Requisito Tipo Descripción
email Requerido string Correo electrónico del usuario.
password Requerido string Contraseña del usuario.
device_name Opcional string Nombre de la integración. Predeterminado: external-app.
JSON body
{
  "email": "dev@tuempresa.com",
  "password": "tu_password",
  "device_name": "produccion"
}
POST

/agencia-virtual/nombre-receptor

Consulta el nombre registrado de un receptor mediante su NIT.

Campo Requisito Tipo Descripción
nit Requerido string NIT del emisor asociado al token FEL.
token_fel Requerido string Token FEL cifrado del cliente.
nit_receptor Requerido string NIT que se consultará en SAT.
JSON body
{
  "nit": "1234567",
  "token_fel": "TOKEN_FEL_DEL_CLIENTE",
  "nit_receptor": "CF"
}
Seguridad

Autenticación

POST

/login

Genera un token Bearer válido durante 24 horas.

Campo Requisito Tipo Descripción
email Requerido string Correo electrónico del usuario.
password Requerido string Contraseña del usuario.
device_name Opcional string Nombre de la integración. Predeterminado: external-app.
JSON body
{
  "email": "dev@tuempresa.com",
  "password": "tu_password",
  "device_name": "produccion"
}

Cabecera general

Envía un token Bearer válido en todas las operaciones FEL:

HTTP header
Authorization: Bearer TU_TOKEN
Accept: application/json
Content-Type: application/json

Vigencia según el origen

Origen Vigencia Uso recomendado
Gestor de tokens dentro de la plataforma Sin vencimiento automático Integraciones permanentes administradas desde el portal.
POST /api/login 24 horas desde su creación Sesiones e integraciones que renuevan credenciales por API.
Importante: un token sin vencimiento automático permanece válido hasta que sea revocado manualmente dentro de la plataforma. Los tokens generados por API deben renovarse cada 24 horas.

No almacenes tokens en código fuente ni los expongas en el navegador.

API v1 · Integradores

Alta de clientes, planes y boletas

El contrato /v1/integrador usa el token Bearer administrable del portal. El usuario debe tener rol INTEGRATOR y un único integrador asociado.

Idempotencia obligatoria: cada POST requiere Idempotency-Key: UUID. La misma clave y payload reproduce el recurso; la misma clave con otro payload responde 409. Todas las respuestas incluyen X-Correlation-ID.

Cabecera general de los POST

HTTP header
Authorization: Bearer TU_TOKEN_ADMINISTRABLE
Accept: application/json
Content-Type: application/json
Idempotency-Key: 018f3b59-4e31-7bcb-b9cc-10d6f6522d77

Cómo crear y reutilizar Idempotency-Key

La clave la genera el backend del integrador antes de iniciar cada operación nueva; la plataforma no la entrega. Usa un UUID aleatorio, guárdalo junto con el payload y el identificador local de la operación, y no lo derives del NIT, correo ni otros datos predecibles.

  1. Genera una clave nueva para una operación nueva.
  2. Persiste la clave antes de enviar el POST.
  3. Si ocurre un timeout, corte de red o no se recibe respuesta, reenvía la misma clave con el mismo payload. No generes otra.
  4. Conserva la clave después del éxito; nunca la reutilices para otro cliente, inscripción o pago.
Generar UUID
JavaScript / Node.js
const idempotencyKey = crypto.randomUUID();

PHP / Laravel
$idempotencyKey = (string) \Illuminate\Support\Str::uuid();

PowerShell (pruebas manuales)
$idempotencyKey = [guid]::NewGuid().ToString()
Situación Acción correcta
Primera solicitud Generar un UUID y enviarlo en el header Idempotency-Key.
Timeout o respuesta perdida Consultar GET /operaciones/{idempotency_key} o repetir el mismo POST con la misma clave y payload.
succeeded La misma solicitud devuelve el recurso existente sin duplicarlo.
processing o sat_validated Esperar o reintentar con la misma clave; nunca crear otra para esa operación.
failed Revisar la causa. Si corresponde iniciar otro intento controlado, usar una clave nueva.
uncertain No reintentar con una clave nueva. Consultar la operación hasta resolver el resultado SAT.
Misma clave con payload diferente La plataforma rechaza la solicitud con 409 idempotency_conflict.
No confundir: Idempotency-Key la genera el integrador para impedir duplicados. X-Correlation-ID lo genera la plataforma para rastrear una solicitud específica; no sustituye la clave idempotente.

Flujo

Método Ruta Uso
GET /v1/integrador/catalogos Modo de receptor de factura, planes y cuentas bancarias.
GET /v1/integrador/clientes Lista clientes propios con plan vigente, consumo y solicitudes disponibles.
POST /v1/integrador/clientes Valida SAT/FEL y guarda cliente, establecimientos e inscripción.
GET /v1/integrador/clientes/{cliente_id} Consulta al cliente propio y su plan vigente, sin credenciales ni token_fel.
POST /v1/integrador/clientes/{cliente_id}/inscripciones Solicita un plan enviando solo plan_id.
GET /v1/integrador/inscripciones/{inscripcion_id} Polling de estado, saldos y boletas.
POST /v1/integrador/inscripciones/{inscripcion_id}/boletas Presenta un pago total o parcial.
GET /v1/integrador/operaciones/{idempotency_key} Consulta operaciones en curso o inciertas.
GET

/v1/integrador/clientes

Lista únicamente los clientes del integrador autenticado. Acepta page y per_page; el valor predeterminado es 25 y el máximo es 100. Cada cliente incluye el inscripcion_id, plan vigente, solicitudes utilizadas, solicitudes disponibles y sus fechas. plan_vigente es null cuando el cliente no tiene un ciclo vigente. Se incluyen planes contratados desde el portal o desde la API.

Respuesta 200
{
  "success": true,
  "data": [
    {
      "id": 1042,
      "nombre": "Cliente de ejemplo",
      "nit": "12345678",
      "plan_vigente": {
        "inscripcion_id": 2054,
        "plan": {
          "id": 3,
          "nombre": "EMPRENDEDOR"
        },
        "solicitudes_utilizadas": 13,
        "solicitudes_disponibles": 431,
        "fecha_inicio": "2026-10-01",
        "fecha_fin": "2026-10-31"
      }
    }
  ],
  "error": null,
  "meta": {
    "current_page": 1,
    "last_page": 1,
    "per_page": 25,
    "total": 1
  }
}
POST

/v1/integrador/clientes

Único paso: consulta SAT, valida FEL con un DTE de prueba, genera el token y guarda el cliente, todos los establecimientos y el plan seleccionado. El nombre SAT solo se devuelve cuando el registro termina correctamente.

Facturación y correos: consulta primero GET /v1/integrador/catalogos. preferencias_facturacion devuelve los predeterminados. Puedes elegir cliente, integrador u otro como receptor fiscal; para otro envía nit_receptor_otro, que será verificado en SAT. Configura por separado correos_plan para factura, pagos, vencimientos y avisos. Cada dato sin elección propia hereda la configuración actual del integrador; las elecciones distintas se guardan para el cliente. modo_receptor_factura permanece por compatibilidad.
Campo Requisito Tipo Descripción
nit Requerido string NIT del cliente, máximo 20 caracteres.
password_sat Requerido string Contraseña de Agencia Virtual SAT.
password_fel Requerido string Contraseña FEL del cliente.
email Requerido string Correo electrónico del cliente.
telefono Requerido string Teléfono de 8 dígitos.
plan_id Requerido integer ID de un plan disponible en catálogos.
establecimiento_numero Opcional string Número del establecimiento. Si se omite, usa el primer establecimiento devuelto por SAT.
external_id Opcional string Identificador del cliente en el sistema del integrador, máximo 100 caracteres.
receptor_factura Opcional string cliente, integrador u otro.
nit_receptor_otro Condicional string Obligatorio con receptor_factura=otro; el nombre fiscal lo obtiene SAT.
correos_plan Opcional object Claves factura, pagos, vencimientos y avisos. Cada una acepta destinatario = integrador, cliente u otro; para otro, correo_otro es obligatorio.
JSON body
{
  "nit": "1234567-8",
  "password_sat": "CREDENCIAL_SAT",
  "password_fel": "CREDENCIAL_FEL",
  "email": "cliente@ejemplo.com",
  "telefono": "55551234",
  "plan_id": 2,
  "external_id": "cliente-1042",
  "receptor_factura": "cliente",
  "correos_plan": {
    "factura": { "destinatario": "cliente" },
    "pagos": { "destinatario": "integrador" }
  }
}

La respuesta incluye el cliente, su nombre SAT, token_fel y inscripcion. PREPAGO inicia con un máximo de 15 solicitudes hasta que las boletas aprobadas completen el precio; después habilita el cupo total. FREE y POSTPAGO usan su cupo normal. Las contraseñas no se devuelven. La contraseña del usuario cliente es aleatoria y puede recuperarse mediante restablecimiento.

POST

/v1/integrador/clientes/{cliente_id}/inscripciones

Solicita la inscripción de un plan para un cliente propio.

Campo Requisito Tipo Descripción
plan_id Requerido integer ID de un plan disponible en catálogos.
JSON body
{
  "plan_id": 2
}

Precio, límites, fechas, modalidad, receptor_factura y estado se calculan en el servidor. El receptor queda congelado para el ciclo. PREPAGO inicia en uso_limitado con un máximo de 15 solicitudes hasta completar y aprobar el pago; FREE y POSTPAGO inician en aprobado. La respuesta agrega estado_vigencia (pendiente, vigente o finalizado), origen_ciclo, solicitudes_utilizadas y solicitudes_disponibles. Si hay un plan vigente, una compra pagada queda pendiente: fecha_inicio y fecha_fin son estimadas y se recalculan a la fecha de activación y 30 días después. Si el mismo NIT se registra después de borrar el cliente, solicitar FREE restaura las fechas y consumo del ciclo anterior; origen_ciclo será restauracion. FREE se renueva después del vencimiento y el scheduler procesa esa renovación automáticamente. Un conflicto FREE o una segunda inscripción pendiente responde 409 subscription_conflict.

POST

/v1/integrador/inscripciones/{inscripcion_id}/boletas

Presenta una boleta de pago total o parcial.

Campo Requisito Tipo Descripción
banco_cuenta_id Requerido integer ID de una cuenta bancaria disponible.
referencia Requerido string Referencia bancaria, máximo 100 caracteres.
valor Requerido number Monto de Q0.01 a Q999,999.99, con máximo 2 decimales y sin superar el saldo disponible para boletas.
deposito_comprobante Requerido string Base64 puro o Data URI de JPG, JPEG, PNG, WebP o PDF; máximo 4 MB decodificados.
JSON + Base64
{
  "banco_cuenta_id": 1,
  "referencia": "DEP-92812",
  "valor": "75.50",
  "deposito_comprobante": "data:image/jpeg;base64,/9j/4AAQSkZJRgABAQ..."
}

deposito_comprobante acepta Base64 puro o un Data URI. La plataforma decodifica los bytes, detecta el MIME real y adjunta el archivo a Media Library; el Base64 no se persiste en operaciones ni se devuelve. Formatos: JPG, JPEG, PNG, WebP o PDF; máximo 4 MB decodificados. La boleta no tiene URL pública y cargarla no activa la vigencia. DEV/SUPERADMIN la aprueba o rechaza; la aprobación cambia el estado de pago, pero un ciclo pendiente espera a que el vigente venza o agote sus solicitudes. Las boletas pendientes cuentan para impedir sobrepago.

Las boletas pendientes o aprobadas no pueden repetir cuenta bancaria y referencia dentro del mismo plan; se ignoran mayúsculas y espacios exteriores. El intento responde 409 payment_conflict, incluso con otra clave idempotente. Los ciclos reemplazados no reciben pagos ni generan bloqueo por deuda. Las boletas aprobadas o rechazadas conservan sus datos; si una boleta fue rechazada, puede presentar otra con una nueva clave idempotente. Completar un PREPAGO habilita su cupo total, conserva el consumo y las fechas originales y no adelanta un ciclo pendiente.

Polling y estados inciertos

Consulta GET /v1/integrador/operaciones/{idempotency_key}. Estados: processing, sat_validated, succeeded, failed y uncertain. Si el estado es uncertain, no envíes otra clave para el mismo NIT: el sistema bloquea otra emisión/anulación de prueba hasta resolver el resultado.

Envoltura uniforme
{
  "success": false,
  "data": null,
  "error": {
    "code": "idempotency_conflict",
    "message": "La clave de idempotencia ya fue usada con otra solicitud."
  }
}
Respuestas

Errores frecuentes

Estado Significado Acción recomendada
400 Datos inválidos o NIT inconsistente. Revisa el body y la relación entre NIT y token FEL.
401 Token Bearer ausente, inválido, revocado o vencido. Si fue creado por API, genera uno nuevo; si fue creado en la plataforma, comprueba que no haya sido revocado.
403 Plan inactivo o límite alcanzado. Revisa el plan del cliente en el portal.
404 Documento o receptor no encontrado. Valida identificadores y vuelve a consultar.
422 Error de validación. Corrige los campos indicados en la respuesta.
500 Error interno o del servicio externo. Conserva el contexto y contacta soporte si persiste.
504 Resultado SAT indeterminado. Consulta el DTE antes de reintentar una emisión o anulación.
Reintentos: no reintentes automáticamente una emisión si no conoces su resultado. Primero consulta el documento o solicita asistencia para evitar duplicados.
Operación 01
POST

/agencia-virtual/emitir-factura

Emite FACT para régimen general o FPEQ para pequeño contribuyente. La ruta determina el tipo; no envíes periodos, abono ni fecha_fin.

Campo Requisito Tipo Descripción
nit Requerido string NIT del emisor asociado al token FEL.
token_fel Requerido string Token FEL cifrado del cliente.
nit_receptor Requerido solo uno string NIT o CF. No enviar junto con cui_receptor. CF solo se permite cuando el total es menor de Q2,500.00.
cui_receptor Requerido solo uno string DPI/CUI de 13 dígitos. No enviar junto con nit_receptor.
nombre_receptor Requerido string Nombre fiscal del receptor.
direccion_receptor Requerido string Dirección del receptor.
establecimiento Requerido integer Número del establecimiento.
items Requerido array Entre 1 y 100 líneas de detalle.
items[].cantidad Requerido number Cantidad entre 0.01 y 999999.99.
items[].descripcion Requerido string Descripción, máximo 255 caracteres.
items[].precio Requerido number Precio entre 0 y 999999.99.
items[].tipo Requerido string B para bien o S para servicio.
correo_receptor Opcional string Correo electrónico del receptor.
municipio_receptor Opcional string Municipio del receptor. Predeterminado: GUATEMALA.
departamento_receptor Opcional string Departamento del receptor. Predeterminado: GUATEMALA.
pais Opcional string Código del país. Predeterminado: GT.
codigo_postal Opcional integer Código postal del receptor. Predeterminado: 1.
items[].descuento Opcional number Descuento entre 0 y 999999.99. Predeterminado: 0.
fecha_emision Opcional date Fecha entre cinco días atrás y el último día del mes actual. Vacía usa fecha y hora actuales.
descargar_pdf Opcional boolean Predeterminado: false. Permite recibir el PDF inmediatamente.
JSON
{
  "nit": "1234567",
  "token_fel": "TOKEN_FEL_DEL_CLIENTE",
  "nit_receptor": "CF",
  "nombre_receptor": "Consumidor Final",
  "direccion_receptor": "Ciudad de Guatemala",
  "establecimiento": 1,
  "items": [
    { "cantidad": 1, "descripcion": "Servicio", "precio": 100, "tipo": "S", "descuento": 0 }
  ]
}
Contrato común: conserva autenticación, tenant, plan, identificación NIT/CUI, fecha de emisión, PDF opcional, respuestas y manejo de timeout del endpoint anterior.
Operación 02
POST

/agencia-virtual/emitir-factura-cambiaria

Emite FCAM para régimen general o FCAP para pequeño contribuyente. Requiere entre 1 y 12 periodos y una fecha_fin posterior al día actual.

Campo Requisito Tipo Descripción
nit Requerido string NIT del emisor asociado al token FEL.
token_fel Requerido string Token FEL cifrado del cliente.
nit_receptor Requerido solo uno string NIT o CF. No enviar junto con cui_receptor. CF solo se permite cuando el total es menor de Q2,500.00.
cui_receptor Requerido solo uno string DPI/CUI de 13 dígitos. No enviar junto con nit_receptor.
nombre_receptor Requerido string Nombre fiscal del receptor.
direccion_receptor Requerido string Dirección del receptor.
establecimiento Requerido integer Número del establecimiento.
items Requerido array Entre 1 y 100 líneas de detalle.
items[].cantidad Requerido number Cantidad entre 0.01 y 999999.99.
items[].descripcion Requerido string Descripción, máximo 255 caracteres.
items[].precio Requerido number Precio entre 0 y 999999.99.
items[].tipo Requerido string B para bien o S para servicio.
periodos Requerido integer Períodos de crédito entre 1 y 12.
fecha_fin Requerido date Fecha posterior al día actual, formato YYYY-MM-DD.
abono Opcional number Abono inicial entre 0 y 999999.99. Predeterminado: 0.
correo_receptor Opcional string Correo electrónico del receptor.
municipio_receptor Opcional string Municipio del receptor. Predeterminado: GUATEMALA.
departamento_receptor Opcional string Departamento del receptor. Predeterminado: GUATEMALA.
pais Opcional string Código del país. Predeterminado: GT.
codigo_postal Opcional integer Código postal del receptor. Predeterminado: 1.
items[].descuento Opcional number Descuento entre 0 y 999999.99. Predeterminado: 0.
fecha_emision Opcional date Fecha entre cinco días atrás y el último día del mes actual. Vacía usa fecha y hora actuales.
descargar_pdf Opcional boolean Predeterminado: false. Permite recibir el PDF inmediatamente.
JSON
{
  "nit": "1234567",
  "token_fel": "TOKEN_FEL_DEL_CLIENTE",
  "nit_receptor": "1234567",
  "nombre_receptor": "CLIENTE DE EJEMPLO",
  "direccion_receptor": "Ciudad de Guatemala",
  "establecimiento": 1,
  "items": [
    { "cantidad": 1, "descripcion": "Servicio", "precio": 100, "tipo": "S", "descuento": 0 }
  ],
  "periodos": 1,
  "abono": 0,
  "fecha_fin": "2099-12-31"
}
Endpoint compatible
POST

/agencia-virtual/emitir-documento

Conservado para clientes existentes. Infiere factura normal o cambiaria según periodos; se retirará en una versión futura. Las integraciones nuevas deben usar una de las dos rutas específicas.

Campo Requisito Tipo Descripción
nit Requerido string NIT del emisor asociado al token FEL.
token_fel Requerido string Token FEL cifrado del cliente.
nit_receptor Requerido solo uno string NIT o CF. No enviar junto con cui_receptor. CF solo se permite cuando el total es menor de Q2,500.00.
cui_receptor Requerido solo uno string DPI/CUI de 13 dígitos. No enviar junto con nit_receptor.
nombre_receptor Requerido string Nombre fiscal del receptor.
direccion_receptor Requerido string Dirección del receptor.
establecimiento Requerido integer Número del establecimiento.
items Requerido array Entre 1 y 100 líneas de detalle.
items[].cantidad Requerido number Cantidad entre 0.01 y 999999.99.
items[].descripcion Requerido string Descripción, máximo 255 caracteres.
items[].precio Requerido number Precio entre 0 y 999999.99.
items[].tipo Requerido string B para bien o S para servicio.
correo_receptor Opcional string Correo electrónico del receptor.
municipio_receptor Opcional string Municipio del receptor. Predeterminado: GUATEMALA.
departamento_receptor Opcional string Departamento del receptor. Predeterminado: GUATEMALA.
pais Opcional string Código del país. Predeterminado: GT.
codigo_postal Opcional integer Código postal del receptor. Predeterminado: 1.
items[].descuento Opcional number Descuento entre 0 y 999999.99. Predeterminado: 0.
periodos Opcional integer Períodos de crédito entre 0 y 12.
abono Opcional number Abono inicial entre 0 y 999999.99.
fecha_fin Opcional date Fecha posterior al día actual, formato YYYY-MM-DD.
fecha_emision Opcional date Fecha entre cinco dias atras y el ultimo dia del mes actual. Vacia usa fecha y hora actuales.
descargar_pdf Opcional boolean Predeterminado: false. Si se omite o es false, devuelve data.pdf: null; conserva XML y autorización.
PDF opcional: omite el campo o envía "descargar_pdf": false para emitir sin descargarlo. Envía "descargar_pdf": true para recibirlo inmediatamente. También puede obtenerse después mediante POST /api/agencia-virtual/descargar-pdf.
Consumidor final: una solicitud con CF y total de Q2,500.00 o superior consume una solicitud del plan, se rechaza con HTTP 400 y no se envía a SAT.
Identificación: envía exactamente uno entre nit_receptor y cui_receptor. Para DPI/CUI, el sistema asigna TipoEspecial="CUI" internamente.
JSON
{
  "nit": "1234567",
  "token_fel": "TOKEN_FEL_DEL_CLIENTE",
  "nit_receptor": "CF",
  "nombre_receptor": "Consumidor Final",
  "direccion_receptor": "Ciudad de Guatemala",
  "establecimiento": 1,
  "items": [
    { "cantidad": 1, "descripcion": "Servicio", "precio": 100, "tipo": "S", "descuento": 0 }
  ],
  "fecha_emision": "2026-08-20"
}
JSON con DPI/CUI
{
  "nit": "1234567",
  "token_fel": "TOKEN_FEL_DEL_CLIENTE",
  "cui_receptor": "1234567890101",
  "nombre_receptor": "CLIENTE DE EJEMPLO",
  "direccion_receptor": "Ciudad de Guatemala",
  "establecimiento": 1,
  "items": [
    { "cantidad": 1, "descripcion": "Servicio", "precio": 100, "tipo": "S", "descuento": 0 }
  ]
}
Response · HTTP 200
{
  "success": true,
  "message": "Documento emitido correctamente",
  "data": {
    "fase_id": 1,
    "numero_autorizacion": "UUID-DEL-DOCUMENTO",
    "serie": "ABC123",
    "numero": "123456789",
    "fecha_emision": "2026-07-28T10:30:00-06:00",
    "fecha_certificacion": "2026-07-28T10:30:05-06:00",
    "numero_acceso": "123456789",
    "xml": "XML_DEL_DOCUMENTO",
    "pdf": null,
    "estado": "EMITIDO"
  },
  "error": null
}
Response · HTTP 400
{
  "success": false,
  "message": "No se permite facturar con CF cuando el monto es Q2,500.00 o superior; debe proporcionar un NIT válido.",
  "data": null,
  "error": null
}
DTE adicionales

Notas y recibo de anticipo

Estos endpoints conservan autenticación, establecimiento, plan, respuesta y PDF opcional de /emitir-documento. Envía exactamente uno entre nit_receptor y cui_receptor.

Endpoint DTE Régimen Receptor Detalle específico
/agencia-virtual/emitir-nota-abono NABN PEQ o GEN NIT, CUI o CF tipo_nota: rebaja_inventario o vendedor_intermediario. Sin impuestos.
/agencia-virtual/emitir-nota-credito NCRE GEN NIT o CUI referencia FEL requerida.
/agencia-virtual/emitir-nota-debito NDEB GEN NIT o CUI referencia FEL requerida.
/agencia-virtual/emitir-nota-envio NEV PEQ o GEN NIT o CUI Solo bienes y traslado requerido. Sin impuestos.
/agencia-virtual/emitir-recibo-anticipo RANT GEN NIT o CUI Solo servicios. SAT valida actividad y personería.
Campos comunes: nit, token_fel, identificación, nombre y dirección del receptor, establecimiento, items, fecha_emision y descargar_pdf. No se envía tipo_documento.
Notas de crédito y débito: cada nota referencia un único UUID vigente de tipo FACT o FCAM. SAT valida documento, emisor, receptor, moneda y valores. No se admite régimen antiguo.
Timeout: un HTTP 504 deja el resultado indeterminado. Consulta el DTE antes de reintentar para evitar duplicados.

Nota de Abono

POST/agencia-virtual/emitir-nota-abono

tipo_nota acepta rebaja_inventario (Documento de rebaja de inventarios) o vendedor_intermediario (Vendedor intermediario de productos agropecuarios, artesanales y productos reciclados).

Campo Requisito Tipo Descripción
nit Requerido string NIT del emisor asociado al token FEL.
token_fel Requerido string Token FEL cifrado del cliente.
nit_receptor Requerido solo uno string NIT o CF. No enviar junto con cui_receptor. CF solo se permite cuando el total es menor de Q2,500.00.
cui_receptor Requerido solo uno string DPI/CUI de 13 dígitos. No enviar junto con nit_receptor.
nombre_receptor Requerido string Nombre fiscal del receptor.
direccion_receptor Requerido string Dirección del receptor.
establecimiento Requerido integer Número del establecimiento.
items Requerido array Entre 1 y 100 líneas de detalle.
items[].cantidad Requerido number Cantidad entre 0.01 y 999999.99.
items[].descripcion Requerido string Descripción, máximo 255 caracteres.
items[].precio Requerido number Precio entre 0 y 999999.99.
items[].tipo Requerido string B para bien o S para servicio.
tipo_nota Requerido string rebaja_inventario o vendedor_intermediario.
correo_receptor Opcional string Correo electrónico del receptor.
municipio_receptor Opcional string Municipio del receptor. Predeterminado: GUATEMALA.
departamento_receptor Opcional string Departamento del receptor. Predeterminado: GUATEMALA.
pais Opcional string Código del país. Predeterminado: GT.
codigo_postal Opcional integer Código postal del receptor. Predeterminado: 1.
items[].descuento Opcional number Descuento entre 0 y 999999.99. Predeterminado: 0.
fecha_emision Opcional date Fecha entre cinco días atrás y el último día del mes actual. Vacía usa fecha y hora actuales.
descargar_pdf Opcional boolean Predeterminado: false. Permite recibir el PDF inmediatamente.
JSON
{
  "nit": "1234567",
  "token_fel": "TOKEN_FEL_DEL_CLIENTE",
  "nit_receptor": "CF",
  "nombre_receptor": "CONSUMIDOR FINAL",
  "direccion_receptor": "Ciudad",
  "establecimiento": 1,
  "tipo_nota": "rebaja_inventario",
  "items": [
    { "cantidad": 1, "descripcion": "Ajuste", "precio": 100, "tipo": "B" }
  ]
}

Nota de Crédito

POST/agencia-virtual/emitir-nota-credito
Campo Requisito Tipo Descripción
nit Requerido string NIT del emisor asociado al token FEL.
token_fel Requerido string Token FEL cifrado del cliente.
nit_receptor Requerido solo uno string NIT del receptor. No admite CF ni puede enviarse junto con cui_receptor.
cui_receptor Requerido solo uno string DPI/CUI de 13 dígitos. No enviar junto con nit_receptor.
nombre_receptor Requerido string Nombre fiscal del receptor.
direccion_receptor Requerido string Dirección del receptor.
establecimiento Requerido integer Número del establecimiento.
items Requerido array Entre 1 y 100 líneas de detalle.
items[].cantidad Requerido number Cantidad entre 0.01 y 999999.99.
items[].descripcion Requerido string Descripción, máximo 255 caracteres.
items[].precio Requerido number Precio entre 0 y 999999.99.
items[].tipo Requerido string B para bien o S para servicio.
referencia Requerido object Datos del único documento FEL de origen.
referencia.numero_autorizacion Requerido string UUID vigente del documento FACT o FCAM de origen.
referencia.fecha_emision Requerido date Fecha de emisión del documento origen, formato YYYY-MM-DD.
referencia.serie Requerido string Serie del documento origen, máximo 20 caracteres.
referencia.numero Requerido string Número del documento origen, máximo 100 caracteres.
referencia.motivo_ajuste Opcional string Motivo del ajuste, máximo 200 caracteres.
correo_receptor Opcional string Correo electrónico del receptor.
municipio_receptor Opcional string Municipio del receptor. Predeterminado: GUATEMALA.
departamento_receptor Opcional string Departamento del receptor. Predeterminado: GUATEMALA.
pais Opcional string Código del país. Predeterminado: GT.
codigo_postal Opcional integer Código postal del receptor. Predeterminado: 1.
items[].descuento Opcional number Descuento entre 0 y 999999.99. Predeterminado: 0.
fecha_emision Opcional date Fecha entre cinco días atrás y el último día del mes actual. Vacía usa fecha y hora actuales.
descargar_pdf Opcional boolean Predeterminado: false. Permite recibir el PDF inmediatamente.
JSON
{
  "nit": "1234567",
  "token_fel": "TOKEN_FEL_DEL_CLIENTE",
  "nit_receptor": "5487981",
  "nombre_receptor": "RECEPTOR DE EJEMPLO",
  "direccion_receptor": "Ciudad",
  "establecimiento": 1,
  "items": [
    { "cantidad": 1, "descripcion": "Rebaja", "precio": 112, "tipo": "S" }
  ],
  "referencia": {
    "numero_autorizacion": "AAAAAAAA-BBBB-4CCC-8DDD-EEEEEEEEEEEE",
    "fecha_emision": "2026-09-01",
    "serie": "AAAA",
    "numero": "123456789",
    "motivo_ajuste": "Ajuste de precio"
  }
}

Nota de Débito

POST/agencia-virtual/emitir-nota-debito

Usa el mismo contrato de Nota de Crédito; cambia únicamente el endpoint y el sentido del ajuste.

Campo Requisito Tipo Descripción
nit Requerido string NIT del emisor asociado al token FEL.
token_fel Requerido string Token FEL cifrado del cliente.
nit_receptor Requerido solo uno string NIT del receptor. No admite CF ni puede enviarse junto con cui_receptor.
cui_receptor Requerido solo uno string DPI/CUI de 13 dígitos. No enviar junto con nit_receptor.
nombre_receptor Requerido string Nombre fiscal del receptor.
direccion_receptor Requerido string Dirección del receptor.
establecimiento Requerido integer Número del establecimiento.
items Requerido array Entre 1 y 100 líneas de detalle.
items[].cantidad Requerido number Cantidad entre 0.01 y 999999.99.
items[].descripcion Requerido string Descripción, máximo 255 caracteres.
items[].precio Requerido number Precio entre 0 y 999999.99.
items[].tipo Requerido string B para bien o S para servicio.
referencia Requerido object Datos del único documento FEL de origen.
referencia.numero_autorizacion Requerido string UUID vigente del documento FACT o FCAM de origen.
referencia.fecha_emision Requerido date Fecha de emisión del documento origen, formato YYYY-MM-DD.
referencia.serie Requerido string Serie del documento origen, máximo 20 caracteres.
referencia.numero Requerido string Número del documento origen, máximo 100 caracteres.
referencia.motivo_ajuste Opcional string Motivo del ajuste, máximo 200 caracteres.
correo_receptor Opcional string Correo electrónico del receptor.
municipio_receptor Opcional string Municipio del receptor. Predeterminado: GUATEMALA.
departamento_receptor Opcional string Departamento del receptor. Predeterminado: GUATEMALA.
pais Opcional string Código del país. Predeterminado: GT.
codigo_postal Opcional integer Código postal del receptor. Predeterminado: 1.
items[].descuento Opcional number Descuento entre 0 y 999999.99. Predeterminado: 0.
fecha_emision Opcional date Fecha entre cinco días atrás y el último día del mes actual. Vacía usa fecha y hora actuales.
descargar_pdf Opcional boolean Predeterminado: false. Permite recibir el PDF inmediatamente.

Nota de Envío

POST/agencia-virtual/emitir-nota-envio
Campo Requisito Tipo Descripción
nit Requerido string NIT del emisor asociado al token FEL.
token_fel Requerido string Token FEL cifrado del cliente.
nit_receptor Requerido solo uno string NIT del receptor. No admite CF ni puede enviarse junto con cui_receptor.
cui_receptor Requerido solo uno string DPI/CUI de 13 dígitos. No enviar junto con nit_receptor.
nombre_receptor Requerido string Nombre fiscal del receptor.
direccion_receptor Requerido string Dirección del receptor.
establecimiento Requerido integer Número del establecimiento.
items Requerido array Entre 1 y 100 líneas de detalle.
items[].cantidad Requerido number Cantidad entre 0.01 y 999999.99.
items[].descripcion Requerido string Descripción, máximo 255 caracteres.
items[].precio Requerido number Precio entre 0 y 999999.99.
items[].tipo Requerido string Debe ser B para bien.
traslado Requerido object Datos obligatorios del traslado de mercancías.
traslado.id_transportista Requerido string Identificación del transportista según el tipo de documento.
traslado.tipo_documento_transportista Requerido string CUI, NIT o Extranjero.
traslado.nombre_transportista Requerido string Nombre del transportista, máximo 50 caracteres.
traslado.placa Requerido string Placa del vehículo, máximo 10 caracteres.
traslado.direccion_procedencia Requerido string Dirección de procedencia, máximo 120 caracteres.
traslado.nit_cui_consignatario Requerido string NIT o CUI del consignatario, máximo 13 caracteres.
traslado.nombre_consignatario Requerido string Nombre del consignatario, máximo 50 caracteres.
traslado.direccion_destino Requerido string Dirección de destino, máximo 500 caracteres.
traslado.motivo Requerido string Motivo del traslado, máximo 500 caracteres.
correo_receptor Opcional string Correo electrónico del receptor.
municipio_receptor Opcional string Municipio del receptor. Predeterminado: GUATEMALA.
departamento_receptor Opcional string Departamento del receptor. Predeterminado: GUATEMALA.
pais Opcional string Código del país. Predeterminado: GT.
codigo_postal Opcional integer Código postal del receptor. Predeterminado: 1.
items[].descuento Opcional number Descuento entre 0 y 999999.99. Predeterminado: 0.
fecha_emision Opcional date Fecha entre cinco días atrás y el último día del mes actual. Vacía usa fecha y hora actuales.
descargar_pdf Opcional boolean Predeterminado: false. Permite recibir el PDF inmediatamente.
JSON
{
  "nit": "1234567",
  "token_fel": "TOKEN_FEL_DEL_CLIENTE",
  "cui_receptor": "1234567890101",
  "nombre_receptor": "RECEPTOR DE EJEMPLO",
  "direccion_receptor": "Ciudad",
  "establecimiento": 1,
  "items": [
    { "cantidad": 1, "descripcion": "Mercancía", "precio": 100, "tipo": "B" }
  ],
  "traslado": {
    "id_transportista": "5487981",
    "tipo_documento_transportista": "NIT",
    "nombre_transportista": "TRANSPORTISTA DE EJEMPLO",
    "placa": "P123ABC",
    "direccion_procedencia": "Bodega central",
    "nit_cui_consignatario": "1234567",
    "nombre_consignatario": "CONSIGNATARIO DE EJEMPLO",
    "direccion_destino": "Bodega destino",
    "motivo": "Traslado de mercancía"
  }
}

Recibo de Anticipo

POST/agencia-virtual/emitir-recibo-anticipo
Campo Requisito Tipo Descripción
nit Requerido string NIT del emisor asociado al token FEL.
token_fel Requerido string Token FEL cifrado del cliente.
nit_receptor Requerido solo uno string NIT del receptor. No admite CF ni puede enviarse junto con cui_receptor.
cui_receptor Requerido solo uno string DPI/CUI de 13 dígitos. No enviar junto con nit_receptor.
nombre_receptor Requerido string Nombre fiscal del receptor.
direccion_receptor Requerido string Dirección del receptor.
establecimiento Requerido integer Número del establecimiento.
items Requerido array Entre 1 y 100 líneas de detalle.
items[].cantidad Requerido number Cantidad entre 0.01 y 999999.99.
items[].descripcion Requerido string Descripción, máximo 255 caracteres.
items[].precio Requerido number Precio entre 0 y 999999.99.
items[].tipo Requerido string Debe ser S para servicio.
correo_receptor Opcional string Correo electrónico del receptor.
municipio_receptor Opcional string Municipio del receptor. Predeterminado: GUATEMALA.
departamento_receptor Opcional string Departamento del receptor. Predeterminado: GUATEMALA.
pais Opcional string Código del país. Predeterminado: GT.
codigo_postal Opcional integer Código postal del receptor. Predeterminado: 1.
items[].descuento Opcional number Descuento entre 0 y 999999.99. Predeterminado: 0.
fecha_emision Opcional date Fecha entre cinco días atrás y el último día del mes actual. Vacía usa fecha y hora actuales.
descargar_pdf Opcional boolean Predeterminado: false. Permite recibir el PDF inmediatamente.
JSON
{
  "nit": "1234567",
  "token_fel": "TOKEN_FEL_DEL_CLIENTE",
  "nit_receptor": "5487981",
  "nombre_receptor": "RECEPTOR DE EJEMPLO",
  "direccion_receptor": "Ciudad",
  "establecimiento": 1,
  "items": [
    { "cantidad": 1, "descripcion": "Anticipo de servicio", "precio": 500, "tipo": "S" }
  ]
}
Operación 02
POST

/agencia-virtual/anular-documento

Anula un documento emitido utilizando su número de autorización.

Consumo: la respuesta válida de SAT consume una solicitud, incluso cuando informa que el documento ya no está vigente. Ese estado responde HTTP 200; no se registra como error.
Campo Requisito Tipo Descripción
nit Requerido string NIT del emisor asociado al token FEL.
token_fel Requerido string Token FEL cifrado del cliente.
numero_autorizacion Requerido string UUID del documento, máximo 255 caracteres.
nit_receptor Requerido string NIT del receptor o CF, máximo 20 caracteres.
observacion Opcional string Motivo de anulación, máximo 255 caracteres.
nombre_receptor Opcional string Nombre fiscal del receptor, máximo 255 caracteres.
descargar_pdf Opcional boolean Predeterminado: false. Envía true para incluir el PDF; una anulación confirmada devuelve su XML.
XML incluido: cuando SAT confirma la anulación, la respuesta devuelve su XML firmado dentro de esta misma petición. El PDF solo se descarga cuando envías "descargar_pdf": true.
Timeout seguro: si SAT no confirma el resultado, la API responde HTTP 504 con resultado_indeterminado: true. Consulta el estado del DTE antes de reintentar; no envíes otra anulación a ciegas.
JSON
{
  "nit": "1234567",
  "token_fel": "TOKEN_FEL_DEL_CLIENTE",
  "numero_autorizacion": "UUID-DEL-DOCUMENTO",
  "nit_receptor": "CF",
  "observacion": "Anulación solicitada por el cliente",
  "descargar_pdf": false
}
Response · HTTP 200
{
  "success": true,
  "message": "Documento anulado correctamente",
  "data": {
    "fase_id": 1,
    "fecha_hora_respuesta": "2026-07-28T10:35:00-06:00",
    "estado": "ANULADO",
    "mensaje": "Documento anulado exitosamente",
    "xml": "XML_ANULACION_FIRMADO",
    "pdf": null
  },
  "error": null
}
Response · HTTP 504 · Resultado indeterminado
{
  "success": false,
  "message": "SAT no respondio a tiempo; consulte el DTE antes de reintentar.",
  "data": null,
  "error": {
    "step": "anulacion_dte",
    "timeout": true,
    "resultado_indeterminado": true,
    "estado_consultado": "V"
  }
}
Response · HTTP 200 · Documento no vigente
{
  "success": true,
  "message": "El documento no se puede anular porque no esta vigente",
  "data": {
    "estado": "I"
  },
  "error": null
}
Operación 03
POST

/agencia-virtual/nombre-receptor

Consulta el nombre registrado de un receptor mediante su NIT o DPI/CUI.

Campo Requisito Tipo Descripción
nit Requerido string NIT del emisor asociado al token FEL.
token_fel Requerido string Token FEL cifrado del cliente.
nit_receptor Requerido solo uno string NIT que se consultará en SAT. No enviar junto con cui_receptor.
cui_receptor Requerido solo uno string DPI/CUI de 13 dígitos. No enviar junto con nit_receptor.
Regla: envía exactamente uno entre nit_receptor y cui_receptor. El alias /agencia-virtual/nombre-receptor-cui sigue disponible.
JSON
{
  "nit": "1234567",
  "token_fel": "TOKEN_FEL_DEL_CLIENTE",
  "nit_receptor": "5487981"
}
JSON con DPI/CUI
{
  "nit": "1234567",
  "token_fel": "TOKEN_FEL_DEL_CLIENTE",
  "cui_receptor": "1234567890101"
}
Response · HTTP 200
{
  "success": true,
  "message": "Nombre obtenido correctamente",
  "data": {
    "nit": "5487981",
    "cui": "",
    "nombre": "CLIENTE DE EJEMPLO",
    "encontrado": true
  },
  "error": null
}
Operación 04
POST

/agencia-virtual/consultar-documentos

Consulta documentos emitidos o recibidos dentro de un rango de fechas. Si falta nit, token_fel o tipo_operacion, o el tipo de operación no es válido, devuelve HTTP 422 antes de consultar SAT y sin consumir solicitudes del plan.

Campo Requisito Tipo Descripción
nit Requerido string NIT del emisor asociado al token FEL.
token_fel Requerido string Token FEL cifrado del cliente.
tipo_operacion Requerido string EMITIDOS, RECIBIDOS, E o R.
fecha_inicio Opcional string Fecha inicial en formato DD-MM-YYYY.
fecha_fin Opcional string Fecha final en formato DD-MM-YYYY.
tipo_documento Opcional string FACT, FPEQ, FCAM, FCAP, NABN, NCRE, NDEB, NEV o RANT.
estado_dte Opcional string VIGENTE, ANULADO, V o I. Predeterminado: V.
nit_receptor Opcional string Filtra por NIT del receptor o CF.
JSON
{
  "nit": "1234567",
  "token_fel": "TOKEN_FEL_DEL_CLIENTE",
  "tipo_operacion": "EMITIDOS",
  "fecha_inicio": "01-01-2026",
  "fecha_fin": "31-01-2026",
  "tipo_documento": "FACT",
  "estado_dte": "VIGENTE",
  "nit_receptor": "CF"
}
Response · HTTP 200
{
  "success": true,
  "message": "Documentos obtenidos correctamente",
  "data": [
    {
      "numero_autorizacion": "UUID-DEL-DOCUMENTO",
      "fecha_emision": "2026-01-15T10:30:00-06:00",
      "tipo_documento": "FACT",
      "serie": "ABC123",
      "numero_documento": "123456789",
      "estado": "VIGENTE",
      "nit_emisor": "1234567",
      "nombre_emisor": "EMPRESA EMISORA",
      "nit_receptor": "CF",
      "nombre_receptor": "CONSUMIDOR FINAL",
      "monto": 100,
      "moneda": "GTQ",
      "fecha_anulacion": null,
      "total_iva": 10.71
    }
  ],
  "error": null
}
Operación 05
POST

/agencia-virtual/descargar-xml

Obtiene el XML de un documento mediante su receptor y número de autorización. Si se emitió con CUI, envía ese CUI en nit_receptor.

Campo Requisito Tipo Descripción
nit Requerido string NIT del emisor asociado al token FEL.
token_fel Requerido string Token FEL cifrado del cliente.
nit_receptor Requerido string NIT, CUI de 13 dígitos o CF usado al emitir el documento.
numero_autorizacion Requerido string UUID del documento.
JSON
{
  "nit": "1234567",
  "token_fel": "TOKEN_FEL_DEL_CLIENTE",
  "nit_receptor": "CF",
  "numero_autorizacion": "UUID-DEL-DOCUMENTO"
}
Response · HTTP 200
{
  "success": true,
  "message": "XML obtenido correctamente",
  "data": {
    "xml": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>..."
  },
  "error": null
}
Operación 06
POST

/agencia-virtual/json

Obtiene el contenido del XML convertido a una estructura JSON.

Campo Requisito Tipo Descripción
nit Requerido string NIT del emisor asociado al token FEL.
token_fel Requerido string Token FEL cifrado del cliente.
nit_receptor Requerido string NIT del receptor o CF.
numero_autorizacion Requerido string UUID del documento.
JSON
{
  "nit": "1234567",
  "token_fel": "TOKEN_FEL_DEL_CLIENTE",
  "nit_receptor": "CF",
  "numero_autorizacion": "UUID-DEL-DOCUMENTO"
}
Response · HTTP 200
{
  "success": true,
  "message": "JSON obtenido correctamente",
  "data": {
    "json": {
      "dte:GTDocumento": {
        "@attributes": {
          "Version": "0.1"
        }
      }
    }
  },
  "error": null
}
Operación 07
POST

/agencia-virtual/descargar-pdf

Genera la representación PDF y devuelve su URL de descarga junto con el contenido base64.

Campo Requisito Tipo Descripción
nit Requerido string NIT del emisor asociado al token FEL.
token_fel Requerido string Token FEL cifrado del cliente.
nit_receptor Requerido string NIT del receptor o CF.
numero_autorizacion Requerido string UUID del documento.
JSON
{
  "nit": "1234567",
  "token_fel": "TOKEN_FEL_DEL_CLIENTE",
  "nit_receptor": "CF",
  "numero_autorizacion": "UUID-DEL-DOCUMENTO"
}
Response · HTTP 200
{
  "success": true,
  "message": "PDF generado correctamente",
  "data": {
    "file_name": "UUID-DEL-DOCUMENTO.pdf",
    "url_download": "https://apifelcore.com/storage/UUID-DEL-DOCUMENTO.pdf", //Valido por 1 mes
    "base64": "PDF_EN_BASE64"
  },
  "error": null
}
¿Necesitas ayuda con la integración?
Escríbenos a info@apifelcore.com o abre una conversación por WhatsApp.