Cargar certificado
Asocia el certificado digital (.crt) a tus credenciales de facturación electrónica registradas en tu cuenta de Lumen. Úsalo en el onboarding del emisor, justo después de configurar credenciales, para dejar la configuración en READY y poder emitir DTE.
En lugar de subir el certificado a un almacén propio y entender como el certificado se asocia con el firmador que otorga Hacienda, solo le envías a Lumen el archivo .crt con el configId; Lumen lo valida, lo guarda de forma segura y deja todo listo para que sea utilizado por el firmador de Lumen al momento de emitir un DTE.
Método: POST
Endpoint
Section titled “Endpoint”https://api-sandbox.lumendte.com/v1/tax-compliance/{configId}/certificatehttps://api.lumendte.com/v1/tax-compliance/{configId}/certificateconfigId es el UUID que recibiste al configurar credenciales. El body que debes enviar es multipart/form-data (no JSON).
Payload
Section titled “Payload”| Campo | Tipo | Descripción |
|---|---|---|
certificateFile | file (binary) | Archivo del certificado digital de la empresa emisora. Debe tener extensión .crt |
Ejemplo de Solicitud
Section titled “Ejemplo de Solicitud”curl -X POST https://api-sandbox.lumendte.com/v1/tax-compliance/28adc4f9-31bc-45fe-a817-e36404145276/certificate \ -H "Accept: application/json" \ -H "Authorization: Bearer tu_access_token" \ -F "certificateFile=@./certificado.crt"const axios = require("axios");const FormData = require("form-data");const fs = require("fs");
const form = new FormData();form.append("certificateFile", fs.createReadStream("./certificado.crt"));
const config = { method: "post", url: "https://api-sandbox.lumendte.com/v1/tax-compliance/28adc4f9-31bc-45fe-a817-e36404145276/certificate", headers: { Accept: "application/json", Authorization: "Bearer tu_access_token", ...form.getHeaders(), }, data: form,};
axios(config) .then((response) => { console.log("Certificado cargado:", response.data.status); }) .catch((error) => { console.error( "Error en la solicitud:", error.response ? error.response.data : error.message, ); });import requests
with open('./certificado.crt', 'rb') as certificate_file: response = requests.post( 'https://api-sandbox.lumendte.com/v1/tax-compliance/28adc4f9-31bc-45fe-a817-e36404145276/certificate', headers={ 'Accept': 'application/json', 'Authorization': 'Bearer tu_access_token', }, files={ 'certificateFile': ('certificado.crt', certificate_file, 'application/x-x509-ca-cert'), }, )
if response.ok: data = response.json() print('Certificado cargado:', data['status'])else: print('Error en la solicitud:', response.text)Response Success
Section titled “Response Success”Status: 200 OK
Con status: READY la configuración queda lista para emitir DTEs. certificateName se deriva del NIT de la empresa emisora.
{ "configId": "28adc4f9-31bc-45fe-a817-e36404145276", "environment": "SANDBOX", "certificateName": "06142803901234.crt", "status": "READY", "updatedAt": "2026-08-07T20:15:00.000Z"}Ejemplo de errores
Section titled “Ejemplo de errores”400 — Extensión inválida
Section titled “400 — Extensión inválida”El archivo no tiene extensión .crt.
{ "errorCode": "INVALID_CERTIFICATE_FILE", "message": "certificateFile must have a .crt extension", "error": "Bad Request", "statusCode": 400}Fix: Asegurate de que estes enviando el archivo con extensión .crt.
404 — Configuración no encontrada
Section titled “404 — Configuración no encontrada”No existe una configuración de cumplimiento con ese configId bajo tu cuenta.
{ "errorCode": "COMPANY_CREDENTIAL_NOT_FOUND", "message": "Compliance configuration with configId 28adc4f9-31bc-45fe-a817-e36404145276 was not found", "error": "Not Found", "statusCode": 404}Fix: Usa el configId del 201 de configurar credenciales y verifica que el token corresponda al mismo tenant.