FACTURA-SV
⚠️ Multa por no emitir DTE: desde $817 hasta $3,679 por infracción (Art. 239-A CT). Verifique su obligación →

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.

Base URL: https://api.factura-sv.algoritmos.io/v1
Formato: JSON
Versión: v1.0

Autenticación

FACTURA-SV usa API Keys para autenticar todas las solicitudes. Cada API Key está vinculada a una cuenta y organización.

Seguridad: Nunca exponga su API Key en código del lado del cliente (frontend, apps móviles). Úsela exclusivamente en su servidor backend. Puede rotar las claves desde el Dashboard → Configuración → API.

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.

Header de autenticación HTTP
Authorization: Bearer fsk_live_xxxxxxxxxxxxxxxxxxxxxxxxxx

Base URL y Headers

AmbienteBase URLPrefijo API Key
Producciónhttps://api.factura-sv.algoritmos.io/v1fsk_live_...
Pruebas (Sandbox)https://sandbox.factura-sv.algoritmos.io/v1fsk_test_...

Headers requeridos

Todos los requestsHTTP
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

POST /documents/upload

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ámetroTipoRequeridoDescripción
filebinaryArchivo: PDF, PNG, JPG, TIFF, XML o JSON. Máx 10 MB.
company_idstringNoID de la empresa (si multi-empresa). Default: empresa principal.
auto_processbooleanNoSi true, ejecuta OCR/AI inmediatamente. Default: true.
dte_typestringNoForzar tipo DTE ("01", "03", etc.). Si omitido, se detecta automáticamente.
Request — cURLbash
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"
Response — 201 CreatedJSON
{
  "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"
}

POST /documents/{id}/process

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ámetroTipoRequeridoDescripción
idstringID del documento (path parameter).
forcebooleanNoSi true, reprocesa aunque ya haya sido procesado.
Response — 200 OKJSON
{
  "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"]
  }
}

POST /documents/{id}/transmit

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ámetroTipoRequeridoDescripción
idstringID del documento (path parameter).
environmentstringNo"production" o "test". Default según API Key.
Response — 200 OK (Aceptado por MH)JSON
{
  "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": []
}
Si el MH rechaza el DTE, el status será "rejected" y el campo observaciones contendrá los errores específicos del MH. Tiene 24 horas para corregir y retransmitir.

GET /documents/{id}

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.

Estados posibles del documentoFlujo
"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)

GET /documents

Lista documentos con filtros y paginación. Ideal para alimentar dashboards, reportes y conciliación contable.

Query ParamTipoDescripción
statusstringFiltrar por estado: accepted, rejected, processed, etc.
dte_typestringFiltrar por tipo DTE: 01, 03, 05, etc.
date_fromstringFecha inicio (ISO 8601): 2026-02-01
date_tostringFecha fin (ISO 8601): 2026-02-13
company_idstringFiltrar por empresa
pageintegerPágina (default: 1)
per_pageintegerResultados por página (default: 50, máx: 200)
Response — 200 OKJSON
{
  "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
  }
}

GET /documents/{id}/download

Descarga el DTE en el formato solicitado. Disponible solo para documentos en estado accepted.

Query ParamTipoDescripción
formatstringjson (DTE firmado), pdf (versión imprimible), xml
include_sellobooleanSi true, incluye el Sello de Recepción del MH. Default: true.
Ejemplobash
curl https://api.factura-sv.algoritmos.io/v1/documents/doc_xxx/download?format=json \
  -H "Authorization: Bearer fsk_live_xxx" \
  -o factura_firmada.json

POST /documents/{id}/invalidate

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ámetroTipoRequeridoDescripción
reason_codestringCódigo del CAT-029 (Tipo de Invalidación).
reason_textstringDescripción del motivo de invalidación (mín. 10 caracteres).
responsiblestringQuién solicita: "emisor", "receptor" o "ambos" (CAT-032).
responsible_docstringNIT o DUI del responsable de la solicitud.
Response — 200 OKJSON
{
  "id": "doc_a1b2c3d4e5f6",
  "status": "invalidated",
  "invalidation": {
    "sello_invalidacion": "2026INVXXXXXXXXXX",
    "fecha": "2026-02-13T15:00:00Z",
    "motivo": "Error en datos del receptor"
  }
}
Irreversible: Una vez invalidado, el DTE no puede ser reactivado. Si fue un error, deberá emitir un nuevo DTE. Fuera del plazo de invalidación, use Nota de Crédito (05) o Nota de Débito (06).

Gestión de empresas

Endpoints para gestionar las empresas/contribuyentes vinculados a su cuenta. Configure múltiples empresas desde una sola cuenta.

Listar empresasGET
GET /companies
Crear empresaPOST
POST /companies
Detalle empresaGET
GET /companies/{id}
Actualizar empresaPATCH
PATCH /companies/{id}
POST /companies — BodyJSON
{
  "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.

POST /webhooks — Crear webhookJSON
{
  "url": "https://miempresa.sv/api/factura-webhook",
  "events": [
    "document.processed",
    "document.accepted",
    "document.rejected",
    "document.invalidated"
  ],
  "secret": "whsec_xxxxxxxxx"  // Para verificar firma HMAC-SHA256
}
Payload que recibirá su servidorJSON
{
  "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"
  }
}
Verificación: Cada webhook incluye un header 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.

Estándar
60
requests / minuto
Alto volumen
300
requests / minuto
White-label
600
requests / minuto
Personalizado
Custom
según acuerdo
Response headersHTTP
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.

Formato de error estándarJSON
{
  "error": {
    "code": "VALIDATION_ERROR",
    "message": "El campo receptor.nrc es obligatorio para CCF (03)",
    "details": [
      { "field": "receptor.nrc", "rule": "required" }
    ]
  }
}

HTTP Status Codes

CódigoSignificadoCuándo ocurre
200OKSolicitud exitosa.
201CreatedRecurso creado (documento subido, empresa creada).
400Bad RequestJSON malformado, campos inválidos, archivo corrupto.
401UnauthorizedAPI Key faltante, inválida o expirada.
403ForbiddenAPI Key no tiene permisos para esta operación.
404Not FoundDocumento o empresa no encontrado.
409ConflictDTE ya transmitido, duplicado de código de generación.
422UnprocessableValidación falló (campos DTE, catálogos obsoletos).
429Too Many RequestsRate limit excedido. Espere según Retry-After.
500Internal ErrorError inesperado del servidor.
502Bad GatewayEl MH no respondió (intente de nuevo).
503Service UnavailableMantenimiento programado o MH fuera de servicio.

Códigos de error específicos

CódigoDescripciónSolución
AUTH_INVALID_KEYAPI Key inválida o revocadaVerifique su clave en Dashboard → API.
VALIDATION_ERRORCampos del DTE no pasan validaciónRevise error.details para campos específicos.
CATALOG_OUTDATEDCódigo de catálogo obsoleto (ej: municipio)Actualice al catálogo v1.1. Ver Catálogos MH.
CERT_EXPIREDCertificado de firma .p12 expiradoRenueve en factura.gob.sv. Suba nuevo en Dashboard.
CERT_MISSINGNo hay certificado configurado para la empresaSuba certificado en Dashboard → Empresa → Certificado.
MH_REJECTEDMinisterio de Hacienda rechazó el DTERevise observaciones. Corrija y retransmita en 24h.
MH_TIMEOUTMH no respondió en tiempoReintente. Si persiste, use modo contingencia.
DUPLICATE_DTECódigo de generación ya existeEl UUID debe ser único. Genere nuevo UUID v4.
INVALIDATION_EXPIREDFuera del plazo de invalidaciónEmita Nota de Crédito (05) o Nota de Débito (06).
QUOTA_EXCEEDEDCréditos de DTE agotadosCompre más créditos desde el Dashboard.
FILE_TOO_LARGEArchivo excede 10 MBComprima o reduzca resolución.
OCR_FAILEDNo se pudo extraer datos del documentoVerifique calidad del archivo. Reintente o ingrese manual.

SDKs y librerías

Librerías oficiales para integrar FACTURA-SV en su stack de desarrollo.

🟢 Node.js / TypeScript
npm install @factura-sv/sdk
🐍 Python
pip install factura-sv
Java / Kotlin
io.algoritmos:factura-sv:1.0.0
🔷 C# / .NET
dotnet add package FacturaSV
Quick start — Node.jsJavaScript
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}`);
Quick start — PythonPython
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.

API Starter
$500/mes
Hasta 2,000 DTE/mes · 5 orgs
  • ✓ Sandbox completo
  • ✓ 1 API key · Webhooks estándar
  • ✓ Batch hasta 100 DTEs
  • ✓ Contingencia automática
  • ✓ Setup: $0 (autogestión)
  • ✓ Exceso: $0.06/DTE
★ RECOMENDADO
API Growth
$1,500/mes
Hasta 15,000 DTE/mes · 50 orgs
  • ✓ Multi-tenant completo
  • ✓ 3 API keys · Webhooks HMAC
  • ✓ Soporte prioritario
  • ✓ Dashboard de uso
  • ✓ Setup: $1,500
  • ✓ Exceso: $0.05/DTE
API Scale
$3,500/mes
Hasta 50,000 DTE/mes · Orgs ilimitadas
  • ✓ API keys múltiples
  • ✓ Soporte partner · SLA comercial
  • ✓ Rate limits ampliados
  • ✓ Onboarding técnico guiado
  • ✓ Setup: $3,500
  • ✓ Exceso: $0.04/DTE
Enterprise / White-Label
Cotización personalizada
Desde $10,000 setup + mensualidad según volumen y SLA
  • ✓ Branding avanzado / white-label
  • ✓ Infraestructura dedicada
  • ✓ Soporte enterprise
  • ✓ Personalización marca básica desde $2,500
Solicitar Cotización Técnica →

¿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

🏪 POS / ERP

Su sistema vende, FACTURA-SV emite DTE y devuelve el sello.

🛒 E-commerce

Cuando el cliente paga, se genera el DTE automáticamente por webhook.

📊 Despachos contables

Multiempresa con una sola integración.

🏗️ Software legacy

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.

¿Listo para integrar?

Motor Fiscal API certificado. 177+ endpoints. 11 tipos DTE. Sandbox disponible. Planes desde $500/mes.

Ver Planes API → Swagger Docs → 💬 WhatsApp
🤖
Asistente FACTURA-SV
Facturación electrónica · DTE En línea