Antes de comenzar con el flujo técnico, necesitas contar con credenciales y llaves tanto de la empresa proveedora como del Ministerio de Hacienda. Aquí te dejo los pasos previos y luego, manos a la obra con ejemplos prácticos en Postman.
Pasos previos imprescindibles
- Contactar a la empresa (Xalachi/FECR): solicita la creación de tu usuario en la plataforma y obtén tu secret_key (asignado por la empresa). Este valor identifica tu integración y será requerido en las llamadas de la API.
- Credenciales y llaves de Hacienda: en el portal ATV gestiona tus usuarios/contraseñas. Descarga e instala tus llaves criptográficas (
.p12
/.pfx
) y ten a mano el PIN del certificado; lo usarás para firmar los comprobantes.
Variables recomendadas en Postman (Environment):
base_url
(ej.http://localhost:8078/cr_api-staging
o tu URL pública)secret_key
codigo_certificado
(identificador que usa tu backend para el .p12/.pfx)pin
(PIN del certificado)usuario_hacienda
,contrasena_hacienda
client_id
(api-stag
en sandbox,api-prod
en producción)- (opcionales durante el flujo)
clave
,consecutivo
,comprobante_xml_base64
,comprobante_xml_firmado_base64
Manos a la obra (ejemplos Postman)
Nota: Los ejemplos usan {{base_url}}
y variables del Environment. Si tu backend WR (clásico) no usa la ruta /wr
, ajusta la URL conforme a tu instalación.
1) Obtener Token (WR clásico)
Método: POST URL: {{base_url}}/wr
Body → form-data
w=token
r=gettoken
grant_type=password
client_id={{client_id}}
username={{usuario_hacienda}}
password={{contrasena_hacienda}}
Respuesta esperada: JSON con access_token
(vida ~300s) y refresh_token
(~36000s).
2) Refresh Token (WR clásico)
Método: POST URL: {{base_url}}/wr
Body → form-data
w=token
r=refresh
grant_type=refresh_token
client_id={{client_id}}
refresh_token={{refresh_token}}
3) Generar Clave y Consecutivo (WR clásico)
Método: POST URL: {{base_url}}/wr
Body → form-data
w=clave
r=clave
tipoDocumento=FE
tipoCedula=fisico
cedula=105610581
codigoPais=506
consecutivo=0000000001
situacion=normal
codigoSeguridad=12345678
sucursal=001
terminal=00001
Respuesta esperada: clave
(50) y consecutivo
(20). Guarda estos valores en variables del Environment.
4) Generar XML (REST)
Método: POST URL: {{base_url}}/xml_invoice
Body → form-data
secret_key={{secret_key}}
tipo_documento=FE
clave={{clave}}
consecutivo={{consecutivo}}
emisor_tipo=01
emisor_numero=105610581
fecha_emision=2025-09-15T10:00:00-06:00
detalle_json={"lineas":[{"cantidad":1,"unidadMedida":"Sp","detalle":"Servicio","precioUnitario":1000,"montoTotal":1000,"montoTotalLinea":1000}]}
Respuesta esperada: JSON con comprobante_xml
(base64 sin firmar). Asignar a {{comprobante_xml_base64}}
.
5) Firmar XML (REST)
Método: POST URL: {{base_url}}/xml_sign
Body → form-data
secret_key={{secret_key}}
codigo_certificado={{codigo_certificado}}
pin={{pin}}
comprobante_xml={{comprobante_xml_base64}}
Respuesta esperada: JSON con comprobante_xml_firmado
(base64). Asignar a {{comprobante_xml_firmado_base64}}
.
6) Enviar a Hacienda (REST)
Método: POST URL: {{base_url}}/send_hacienda
Body → form-data
secret_key={{secret_key}}
comprobante_xml_firmado={{comprobante_xml_firmado_base64}}
Respuesta esperada: MH debe aceptar el documento (normalmente HTTP 202) y devolver acuse. Si ves 403, revisa token/credenciales o reutilización de clave.
7) Consultar Estado (REST)
Método: GET URL: {{base_url}}/consult_hacienda
Params o form-data (según tu backend):
secret_key={{secret_key}}
usuario_hacienda={{usuario_hacienda}}
contrasena_hacienda={{contrasena_hacienda}}
clave={{clave}}
Respuesta esperada: estado de la clave (procesando/aceptado/rechazado) y, cuando aplica, el XML respuesta de MH.
Buenas prácticas
- Separa sandbox de producción usando dos Environments en Postman; cambia
client_id
(api-stag
vsapi-prod
) ybase_url
según corresponda. - Resguarda tu secret_key, certificados y PIN. Usa variables de tipo “secret” en Postman cuando sea posible.
- Versiona tus colecciones y guarda evidencias (respuestas MH) por cada envío.