ESTANDAR ABIERTO

FSV1 — Estandar de Identidad Fiscal Digital

Especificacion publica del formato de Tarjeta Fiscal Digital para El Salvador. Libre de implementar sin licencia. Compatible con cualquier software.

Resumen

Prefijo

FSV1:

Codificacion

base64url(JSON-UTF8)

Encriptacion

Ninguna (estandar abierto)

Pais

El Salvador (SV)

Campos

CampoTipoRequeridoDescripcion
vintSiVersion del formato (siempre 1)
tipo_docstringSiTipo documento: 36=NIT, 13=DUI, 37=Pasaporte
nitstringSiNIT/DUI solo digitos (14 para NIT, 9 para DUI)
nrcstringNumero de Registro de Contribuyente
nombrestringSiNombre completo o razon social
nombre_comercialstringNombre comercial
cod_actividadstringCodigo actividad economica (CAT-019 MH)
desc_actividadstringDescripcion de la actividad
deptostringCodigo departamento (01-14, CAT-012 MH)
munistringCodigo municipio (CAT-013 MH)
dirstringDireccion complemento
telstringTelefono
emailstringCorreo electronico

Como generar un QR FSV1

  1. Construir objeto JSON con campos requeridos + opcionales
  2. Minificar JSON (sin espacios)
  3. Codificar en base64url
  4. Prepend FSV1:
  5. Generar codigo QR con el string resultante

Como leer un QR FSV1

  1. Escanear QR y obtener string
  2. Verificar que empieza con FSV1:
  3. Remover el prefijo y decodificar base64url
  4. Parsear como JSON UTF-8
  5. Validar campos requeridos: v, tipo_doc, nit, nombre

Ejemplos de codigo

Python

import json, base64

def decode_fsv1(qr_string: str) -> dict:
    """Decodifica un QR fiscal FSV1."""
    assert qr_string.startswith("FSV1:"), "No es FSV1"
    b64 = qr_string[5:]
    json_str = base64.urlsafe_b64decode(b64).decode("utf-8")
    return json.loads(json_str)

def encode_fsv1(data: dict) -> str:
    """Codifica datos fiscales a FSV1."""
    json_str = json.dumps(data, ensure_ascii=False, separators=(',',':'))
    b64 = base64.urlsafe_b64encode(json_str.encode("utf-8")).decode()
    return f"FSV1:{b64}"

# Ejemplo
fiscal = {
    "v": 1,
    "tipo_doc": "36",
    "nit": "06140101901023",
    "nombre": "Empresa Ejemplo S.A."
}
qr = encode_fsv1(fiscal)
print(qr)  # FSV1:eyJ2IjoxLC...
print(decode_fsv1(qr))  # {v: 1, tipo_doc: "36", ...}

JavaScript

function decodeFSV1(qrString) {
  if (!qrString.startsWith("FSV1:")) throw new Error("No es FSV1");
  const b64 = qrString.slice(5);
  // base64url → base64
  const base64 = b64.replace(/-/g, '+').replace(/_/g, '/');
  const json = atob(base64);
  return JSON.parse(json);
}

function encodeFSV1(data) {
  const json = JSON.stringify(data);
  const b64 = btoa(json)
    .replace(/\+/g, '-').replace(/\//g, '_').replace(/=+$/, '');
  return "FSV1:" + b64;
}

// Ejemplo
const fiscal = {
  v: 1, tipo_doc: "36",
  nit: "06140101901023",
  nombre: "Empresa Ejemplo S.A."
};
const qr = encodeFSV1(fiscal);
console.log(decodeFSV1(qr));

cURL — API de consulta

# Buscar por NIT
curl "https://factura-sv-api-production.up.railway.app/api/v1/fiscal-id/lookup?nit=06140101901023"

# Decodificar QR
curl -X POST "https://factura-sv-api-production.up.railway.app/api/v1/fiscal-id/decode" \
  -H "Content-Type: application/json" \
  -d '{"qr_string": "FSV1:eyJ2IjoxLC..."}'

# Generar tarjeta
curl -X POST "https://factura-sv-api-production.up.railway.app/api/v1/fiscal-id/generate" \
  -H "Content-Type: application/json" \
  -d '{
    "nit": "06140101901023",
    "nombre": "Empresa Ejemplo S.A.",
    "tipo_documento": "36"
  }'

# Especificacion completa
curl "https://factura-sv-api-production.up.railway.app/api/v1/fiscal-id/spec"

API Endpoints

GET
/api/v1/fiscal-id/spec

Especificacion del estandar

POST
/api/v1/fiscal-id/generate

Generar Tarjeta Fiscal Digital

POST
/api/v1/fiscal-id/decode

Decodificar QR fiscal

GET
/api/v1/fiscal-id/lookup?nit=

Buscar por NIT en directorio

GET
/api/v1/fiscal-id/search?q=

Buscar por nombre o NIT parcial

POST
/api/v1/fiscal-id/resolve-for-dte

Resolver receptor para DTE(requiere auth)

Licencia

FSV1 es un estandar abierto. Cualquier persona o empresa puede implementarlo sin licencia, sin costo, y sin restricciones. El objetivo es crear una infraestructura de identidad fiscal universal para El Salvador.