API Reference
REST API para integrar FACTURA-SV con su sistema contable, ERP o aplicación. Suba documentos, procese con OCR/AI, transmita al MH y consulte el estado de sus DTEs.
Autenticación
FACTURA-SV usa API Keys para autenticar todas las solicitudes. Cada API Key está vinculada a una cuenta y organización.
Obtener su API Key
Inicie sesión en el Dashboard de FACTURA-SV, vaya a Configuración → API y genere una nueva clave. Se genera en formato fsk_live_... para producción o fsk_test_... para pruebas.
Authorization: Bearer fsk_live_xxxxxxxxxxxxxxxxxxxxxxxxxx
Base URL y Headers
| Ambiente | Base URL | Prefijo API Key |
|---|---|---|
| Producción | https://api.factura-sv.algoritmos.io/v1 | fsk_live_... |
| Pruebas (Sandbox) | https://sandbox.factura-sv.algoritmos.io/v1 | fsk_test_... |
Headers requeridos
Authorization: Bearer fsk_live_xxx Content-Type: application/json // o multipart/form-data para uploads Accept: application/json X-Company-Id: comp_xxxx // opcional — si gestiona múltiples empresas
Sube un documento (PDF, imagen, XML o JSON) para ser procesado. El sistema aplica OCR/AI para extraer los datos del DTE automáticamente.
Parámetros (multipart/form-data)
| Parámetro | Tipo | Requerido | Descripción |
|---|---|---|---|
| file | binary | Sí | Archivo: PDF, PNG, JPG, TIFF, XML o JSON. Máx 10 MB. |
| company_id | string | No | ID de la empresa (si multi-empresa). Default: empresa principal. |
| auto_process | boolean | No | Si true, ejecuta OCR/AI inmediatamente. Default: true. |
| dte_type | string | No | Forzar tipo DTE ("01", "03", etc.). Si omitido, se detecta automáticamente. |
curl -X POST https://api.factura-sv.algoritmos.io/v1/documents/upload \ -H "Authorization: Bearer fsk_live_xxx" \ -F "file=@factura_001.pdf" \ -F "auto_process=true" \ -F "dte_type=03"
{ "id": "doc_a1b2c3d4e5f6", "status": "processing", "filename": "factura_001.pdf", "dte_type": "03", "file_size": 245780, "created_at": "2026-02-13T14:30:00Z", "company_id": "comp_default" }
Inicia o reinicia el procesamiento OCR/AI de un documento ya subido. Útil si se subió con auto_process=false o si se desea reprocesar con correcciones.
| Parámetro | Tipo | Requerido | Descripción |
|---|---|---|---|
| id | string | Sí | ID del documento (path parameter). |
| force | boolean | No | Si true, reprocesa aunque ya haya sido procesado. |
{ "id": "doc_a1b2c3d4e5f6", "status": "processed", "dte_type": "03", "extracted_data": { "emisor": { "nombre": "Empresa ABC", "nit": "0614-..." }, "receptor": { "nombre": "Cliente XYZ", "nrc": "12345-6" }, "items": [ /* array de líneas extraídas */ ], "total": 1130.00, "confidence": 0.97 }, "validation": { "is_valid": true, "errors": [], "warnings": ["Campo receptor.telefono vacío"] } }
Firma digitalmente el DTE con el certificado .p12 del contribuyente y lo transmite al Ministerio de Hacienda para obtener el Sello de Recepción. El documento debe estar en estado processed y sin errores de validación.
| Parámetro | Tipo | Requerido | Descripción |
|---|---|---|---|
| id | string | Sí | ID del documento (path parameter). |
| environment | string | No | "production" o "test". Default según API Key. |
{ "id": "doc_a1b2c3d4e5f6", "status": "accepted", "sello_recepcion": "2026XXXXXXXXXXXXXXXXXX", "codigo_generacion": "A1B2C3D4-E5F6-7890-ABCD-EF1234567890", "numero_control": "DTE-03-M001-P001-000000000000042", "fecha_transmision": "2026-02-13T14:32:15Z", "observaciones": [] }
status será "rejected" y el campo observaciones contendrá los errores específicos del MH. Tiene 24 horas para corregir y retransmitir.Obtiene el estado actual y todos los datos de un documento. Incluye los datos extraídos, estado de transmisión, sello de recepción y metadatos.
"uploaded" → Archivo recibido, sin procesar "processing" → OCR/AI en ejecución "processed" → Datos extraídos, listo para revisión "transmitting"→ Enviando al MH "accepted" → ✅ Aceptado por MH (Sello de Recepción otorgado) "rejected" → ❌ Rechazado por MH (ver observaciones) "invalidated" → Documento invalidado "error" → Error en procesamiento (OCR falló, formato inválido)
Lista documentos con filtros y paginación. Ideal para alimentar dashboards, reportes y conciliación contable.
| Query Param | Tipo | Descripción |
|---|---|---|
| status | string | Filtrar por estado: accepted, rejected, processed, etc. |
| dte_type | string | Filtrar por tipo DTE: 01, 03, 05, etc. |
| date_from | string | Fecha inicio (ISO 8601): 2026-02-01 |
| date_to | string | Fecha fin (ISO 8601): 2026-02-13 |
| company_id | string | Filtrar por empresa |
| page | integer | Página (default: 1) |
| per_page | integer | Resultados por página (default: 50, máx: 200) |
{ "data": [ { "id": "doc_xxx", "status": "accepted", "dte_type": "03", ... }, { "id": "doc_yyy", "status": "accepted", "dte_type": "01", ... } ], "pagination": { "page": 1, "per_page": 50, "total": 1247, "total_pages": 25 } }
Descarga el DTE en el formato solicitado. Disponible solo para documentos en estado accepted.
| Query Param | Tipo | Descripción |
|---|---|---|
| format | string | json (DTE firmado), pdf (versión imprimible), xml |
| include_sello | boolean | Si true, incluye el Sello de Recepción del MH. Default: true. |
curl https://api.factura-sv.algoritmos.io/v1/documents/doc_xxx/download?format=json \
-H "Authorization: Bearer fsk_live_xxx" \
-o factura_firmada.json
Solicita la invalidación de un DTE previamente transmitido y aceptado. Debe estar dentro del plazo de invalidación vigente (ver Tipos de DTE).
| Parámetro | Tipo | Requerido | Descripción |
|---|---|---|---|
| reason_code | string | Sí | Código del CAT-029 (Tipo de Invalidación). |
| reason_text | string | Sí | Descripción del motivo de invalidación (mín. 10 caracteres). |
| responsible | string | Sí | Quién solicita: "emisor", "receptor" o "ambos" (CAT-032). |
| responsible_doc | string | Sí | NIT o DUI del responsable de la solicitud. |
{ "id": "doc_a1b2c3d4e5f6", "status": "invalidated", "invalidation": { "sello_invalidacion": "2026INVXXXXXXXXXX", "fecha": "2026-02-13T15:00:00Z", "motivo": "Error en datos del receptor" } }
Gestión de empresas
Endpoints para gestionar las empresas/contribuyentes vinculados a su cuenta. Configure múltiples empresas desde una sola cuenta.
GET /companiesPOST /companiesGET /companies/{id}PATCH /companies/{id}{ "name": "Mi Empresa S.A. de C.V.", "nit": "0614-123456-789-0", "nrc": "123456-7", "economic_activity": "62010", // CAT-019 "establishment_code": "M001", "pos_code": "P001", "address": { "department": "06", // CAT-012: San Salvador "municipality": "14", // CAT-013: San Salvador "complement": "Col. Escalón, Calle La Reforma #123" }, "phone": "2222-3333", "email": "[email protected]" }
Webhooks
Reciba notificaciones en tiempo real cuando cambie el estado de un documento. Configure webhooks desde el Dashboard o vía API.
{ "url": "https://miempresa.sv/api/factura-webhook", "events": [ "document.processed", "document.accepted", "document.rejected", "document.invalidated" ], "secret": "whsec_xxxxxxxxx" // Para verificar firma HMAC-SHA256 }
{ "event": "document.accepted", "timestamp": "2026-02-13T14:32:15Z", "data": { "id": "doc_a1b2c3d4e5f6", "status": "accepted", "sello_recepcion": "2026XXXX...", "dte_type": "03", "company_id": "comp_xxx" } }
X-Factura-Signature con HMAC-SHA256 del payload usando su secret. Valide la firma antes de procesar. Reintentos: 3 intentos con backoff exponencial (1min, 5min, 30min).Rate Limits
Los límites de tasa se asignan por organización. Las respuestas incluyen headers X-RateLimit-Limit, X-RateLimit-Remaining y X-RateLimit-Reset.
X-RateLimit-Limit: 300 X-RateLimit-Remaining: 287 X-RateLimit-Reset: 1739456000 // Unix timestamp Retry-After: 42 // Solo cuando se excede (429)
Códigos de error
Todos los errores siguen el mismo formato de respuesta con error.code, error.message y opcionalmente error.details.
{ "error": { "code": "VALIDATION_ERROR", "message": "El campo receptor.nrc es obligatorio para CCF (03)", "details": [ { "field": "receptor.nrc", "rule": "required" } ] } }
HTTP Status Codes
| Código | Significado | Cuándo ocurre |
|---|---|---|
| 200 | OK | Solicitud exitosa. |
| 201 | Created | Recurso creado (documento subido, empresa creada). |
| 400 | Bad Request | JSON malformado, campos inválidos, archivo corrupto. |
| 401 | Unauthorized | API Key faltante, inválida o expirada. |
| 403 | Forbidden | API Key no tiene permisos para esta operación. |
| 404 | Not Found | Documento o empresa no encontrado. |
| 409 | Conflict | DTE ya transmitido, duplicado de código de generación. |
| 422 | Unprocessable | Validación falló (campos DTE, catálogos obsoletos). |
| 429 | Too Many Requests | Rate limit excedido. Espere según Retry-After. |
| 500 | Internal Error | Error inesperado del servidor. |
| 502 | Bad Gateway | El MH no respondió (intente de nuevo). |
| 503 | Service Unavailable | Mantenimiento programado o MH fuera de servicio. |
Códigos de error específicos
| Código | Descripción | Solución |
|---|---|---|
AUTH_INVALID_KEY | API Key inválida o revocada | Verifique su clave en Dashboard → API. |
VALIDATION_ERROR | Campos del DTE no pasan validación | Revise error.details para campos específicos. |
CATALOG_OUTDATED | Código de catálogo obsoleto (ej: municipio) | Actualice al catálogo v1.1. Ver Catálogos MH. |
CERT_EXPIRED | Certificado de firma .p12 expirado | Renueve en factura.gob.sv. Suba nuevo en Dashboard. |
CERT_MISSING | No hay certificado configurado para la empresa | Suba certificado en Dashboard → Empresa → Certificado. |
MH_REJECTED | Ministerio de Hacienda rechazó el DTE | Revise observaciones. Corrija y retransmita en 24h. |
MH_TIMEOUT | MH no respondió en tiempo | Reintente. Si persiste, use modo contingencia. |
DUPLICATE_DTE | Código de generación ya existe | El UUID debe ser único. Genere nuevo UUID v4. |
INVALIDATION_EXPIRED | Fuera del plazo de invalidación | Emita Nota de Crédito (05) o Nota de Débito (06). |
QUOTA_EXCEEDED | Créditos de DTE agotados | Compre más créditos desde el Dashboard. |
FILE_TOO_LARGE | Archivo excede 10 MB | Comprima o reduzca resolución. |
OCR_FAILED | No se pudo extraer datos del documento | Verifique calidad del archivo. Reintente o ingrese manual. |
SDKs y librerías
Librerías oficiales para integrar FACTURA-SV en su stack de desarrollo.
npm install @factura-sv/sdk
pip install factura-sv
io.algoritmos:factura-sv:1.0.0
dotnet add package FacturaSV
import { FacturaSV } from '@factura-sv/sdk'; const client = new FacturaSV({ apiKey: 'fsk_live_xxx' }); // Subir y procesar un documento const doc = await client.documents.upload({ file: fs.createReadStream('factura.pdf'), dteType: '03' }); // Transmitir al Ministerio de Hacienda const result = await client.documents.transmit(doc.id); console.log(`Sello: ${result.sello_recepcion}`);
from factura_sv import FacturaSV client = FacturaSV(api_key="fsk_live_xxx") # Subir y procesar doc = client.documents.upload( file="factura.pdf", dte_type="03" ) # Transmitir al MH result = client.documents.transmit(doc.id) print(f"Sello: {result.sello_recepcion}")
Motor Fiscal API para Software
Integre facturación electrónica certificada en su ERP, POS, e-commerce o sistema administrativo. Su sistema envía JSON — nosotros firmamos, transmitimos al MH, generamos PDF y retornamos el sello en ~1.5 segundos.
- ✓ Sandbox completo
- ✓ 1 API key · Webhooks estándar
- ✓ Batch hasta 100 DTEs
- ✓ Contingencia automática
- ✓ Setup: $0 (autogestión)
- ✓ Exceso: $0.06/DTE
- ✓ Multi-tenant completo
- ✓ 3 API keys · Webhooks HMAC
- ✓ Soporte prioritario
- ✓ Dashboard de uso
- ✓ Setup: $1,500
- ✓ Exceso: $0.05/DTE
- ✓ API keys múltiples
- ✓ Soporte partner · SLA comercial
- ✓ Rate limits ampliados
- ✓ Onboarding técnico guiado
- ✓ Setup: $3,500
- ✓ Exceso: $0.04/DTE
- ✓ Branding avanzado / white-label
- ✓ Infraestructura dedicada
- ✓ Soporte enterprise
- ✓ Personalización marca básica desde $2,500
¿Por qué nuestra API cuesta más que una API común?
FACTURA-SV no vende una API genérica. Vende infraestructura fiscal crítica: conectada con autoridad tributaria, con reglas no documentadas resueltas, con contingencia automática, firma digital, PDFs verificables, soporte multi-tenant, webhooks y resiliencia multi-cloud.
Casos de Uso
Su sistema vende, FACTURA-SV emite DTE y devuelve el sello.
Cuando el cliente paga, se genera el DTE automáticamente por webhook.
Multiempresa con una sola integración.
Conecte su sistema actual sin reescribir la parte fiscal.
Nota: Los planes API son independientes del modelo de créditos para negocios finales. Si busca facturar directamente desde el navegador, use nuestros créditos prepagados.
