Prueba con una ruta, un campo o un código HTTP.
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.
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.
Tu primera petición
Obtén un token y úsalo para ejecutar tu primera operación FEL.
/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. |
{
"email": "dev@tuempresa.com",
"password": "tu_password",
"device_name": "produccion"
}
/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. |
{
"nit": "1234567",
"token_fel": "TOKEN_FEL_DEL_CLIENTE",
"nit_receptor": "CF"
}
Autenticación
/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. |
{
"email": "dev@tuempresa.com",
"password": "tu_password",
"device_name": "produccion"
}
Cabecera general
Envía un token Bearer válido en todas las operaciones FEL:
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. |
No almacenes tokens en código fuente ni los expongas en el navegador.
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.
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
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.
- Genera una clave nueva para una operación nueva.
- Persiste la clave antes de enviar el
POST. - Si ocurre un timeout, corte de red o no se recibe respuesta, reenvía la misma clave con el mismo payload. No generes otra.
- Conserva la clave después del éxito; nunca la reutilices para otro cliente, inscripción o pago.
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. |
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. |
/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.
{
"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
}
}
/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.
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. |
{
"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.
/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. |
{
"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.
/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. |
{
"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.
{
"success": false,
"data": null,
"error": {
"code": "idempotency_conflict",
"message": "La clave de idempotencia ya fue usada con otra solicitud."
}
}
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. |
/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. |
{
"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 }
]
}
/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. |
{
"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"
}
/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. |
"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.nit_receptor y cui_receptor. Para DPI/CUI, el sistema asigna
TipoEspecial="CUI" internamente.{
"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"
}
{
"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 }
]
}
{
"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
}
{
"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
}
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. |
nit, token_fel, identificación, nombre y dirección del receptor, establecimiento, items, fecha_emision y descargar_pdf. No se envía tipo_documento.Nota de 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. |
{
"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
| 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. |
{
"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
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
| 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. |
{
"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
| 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. |
{
"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" }
]
}
/agencia-virtual/anular-documento
Anula un documento emitido utilizando su número de autorización.
| 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. |
"descargar_pdf": true.resultado_indeterminado: true. Consulta el estado del DTE antes
de reintentar; no envíes otra anulación a ciegas.{
"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
}
{
"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
}
{
"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"
}
}
{
"success": true,
"message": "El documento no se puede anular porque no esta vigente",
"data": {
"estado": "I"
},
"error": null
}
/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. |
nit_receptor y cui_receptor. El alias
/agencia-virtual/nombre-receptor-cui sigue disponible.{
"nit": "1234567",
"token_fel": "TOKEN_FEL_DEL_CLIENTE",
"nit_receptor": "5487981"
}
{
"nit": "1234567",
"token_fel": "TOKEN_FEL_DEL_CLIENTE",
"cui_receptor": "1234567890101"
}
{
"success": true,
"message": "Nombre obtenido correctamente",
"data": {
"nit": "5487981",
"cui": "",
"nombre": "CLIENTE DE EJEMPLO",
"encontrado": true
},
"error": null
}
/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. |
{
"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"
}
{
"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
}
/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. |
{
"nit": "1234567",
"token_fel": "TOKEN_FEL_DEL_CLIENTE",
"nit_receptor": "CF",
"numero_autorizacion": "UUID-DEL-DOCUMENTO"
}
{
"success": true,
"message": "XML obtenido correctamente",
"data": {
"xml": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>..."
},
"error": null
}
/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. |
{
"nit": "1234567",
"token_fel": "TOKEN_FEL_DEL_CLIENTE",
"nit_receptor": "CF",
"numero_autorizacion": "UUID-DEL-DOCUMENTO"
}
{
"success": true,
"message": "JSON obtenido correctamente",
"data": {
"json": {
"dte:GTDocumento": {
"@attributes": {
"Version": "0.1"
}
}
}
},
"error": null
}
/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. |
{
"nit": "1234567",
"token_fel": "TOKEN_FEL_DEL_CLIENTE",
"nit_receptor": "CF",
"numero_autorizacion": "UUID-DEL-DOCUMENTO"
}
{
"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
}
Escríbenos a info@apifelcore.com o abre una conversación por WhatsApp.