SweKit - Swedish validators
Personnummer sueco, orgnr, bankgiro, OCR, cuenta a IBAN y días bancarios como un servidor MCP remoto de solo lectura.
Servidor MCP alojado
npx add-mcp 'https://swekit-api.zenith-ops.workers.dev/mcp'Se instala en Claude Code, Codex, Cursor y más
Documentación
Convenciones
- Los validadores devuelven
{"valid": bool, "errors": [codes]}más los campos analizados. HTTP 200 incluso si el número es inválido; HTTP 400 solo para parámetros faltantes o malformados. - Errores:
{"error":{"code","message"}}. Límite de tasa: HTTP 429 conRetry-After. - Cabecera de respuesta
X-Plan: free | pro | gateway. - Ejemplo POST:
curl -X POST https://swekit-api.zenith-ops.workers.dev/v1/personnummer -H 'content-type: application/json' -d '{"value":"811218-9876"}'
Acceso y límites
Demo anónima: 20 solicitudes/min/IP. Límites superiores: envíe X-API-Key: <license key> (600 solicitudes/min). Los suscriptores del marketplace usan la clave y cuota propias del marketplace. Clave Pro: contacte con el operador; los precios no están publicados.
Ejemplos con curl
curl "https://swekit-api.zenith-ops.workers.dev/v1/personnummer?value=811218-9876"
curl -X POST "https://swekit-api.zenith-ops.workers.dev/v1/personnummer" -H 'content-type: application/json' -d '{"value":"811218-9876"}'
curl -H 'X-API-Key: YOUR_KEY' "https://swekit-api.zenith-ops.workers.dev/v1/account?clearing=7507&account=1211203"
# error response (missing parameter)
curl "https://swekit-api.zenith-ops.workers.dev/v1/orgnr"
{"error":{"code":"missing_parameter","message":"Missing parameter: value"}}
Códigos de error
| HTTP | Código | Significado |
|---|---|---|
| 400 | missing_parameter | No se proporcionó una entrada obligatoria |
| 400 | bad_base | La base OCR no es válida |
| 400 | bad_year | El año debe estar entre 1900 y 2200 |
| 400 | bad_date | La fecha debe tener formato AAAA-MM-DD |
| 400 | bad_input | La entrada de días hábiles no es válida o está fuera de rango |
| 400 | invalid_json | El cuerpo POST no es JSON válido |
| 401 | invalid_api_key | La clave API no es válida o ha caducado |
| 429 | rate_limited | Se superó la cuota por minuto |
| 500 | internal_error | Error inesperado del servidor |
Configuración del cliente MCP
Claude Desktop (claude_desktop_config.json):
{"mcpServers":{"swekit":{"command":"npx","args":["mcp-remote","https://swekit-api.zenith-ops.workers.dev/mcp"]}}}
Cursor:
{"mcpServers":{"swekit":{"url":"https://swekit-api.zenith-ops.workers.dev/mcp"}}}
VS Code (.vscode/mcp.json):
{"servers":{"swekit":{"type":"http","url":"https://swekit-api.zenith-ops.workers.dev/mcp"}}}
Servidor MCP
Endpoint MCP remoto https://swekit-api.zenith-ops.workers.dev/mcp (POST JSON-RPC 2.0: initialize, tools/list, tools/call). Herramientas: validate_personnummer, validate_orgnr, validate_bankgiro, validate_plusgiro, validate_ocr, generate_ocr, swedish_account_to_iban, validate_iban, lookup_clearing_number, swedish_holidays, swedish_date_info, add_business_days, count_business_days.
Semántica que conviene conocer
- Cuentas bancarias: reglas de dígito de control según Bankgirot (tipo 1 variantes 1-2 mod-11; tipo 2 variantes 1/3 mod-10, 2/4 mod-11). Las cuentas Swedbank 8xxx son mod-10 "como regla general" y requieren el 5.º dígito del clearing para IBAN. Plusgiro no se puede convertir a IBAN. Algunas cuentas antiguas no superan los dígitos de control.
- Días hábiles (modo banco): sábados, domingos, festivos públicos más midsommarafton, julafton y nyårsafton no son días hábiles (estos se equiparan a domingos para plazos de pago según la ley sueca). Use
mode=workpara la lógica simple de días laborables menos festivos. Revise sus propios contratos para reglas específicas de la empresa. - Personnummer: la edad y el siglo se deducen del separador (
+= 100+). El género proviene del 9.º dígito (sexo legal registrado). Úselo para validación, no para identificación.
Preguntas frecuentes
¿Un número válido demuestra que existe una cuenta o una persona?
No. La API solo comprueba sintaxis, fechas y dígitos de control; no es un servicio de identidad, titularidad o existencia de cuentas.
¿Se almacenan las solicitudes?
El servicio no almacena ningún dato de las solicitudes. Use POST para números personales para que no aparezcan en URLs ni en registros de acceso.
¿Puedo convertir Plusgiro a IBAN?
No. Las cuentas bancarias suecas se pueden convertir cuando se conoce su rango de clearing; Plusgiro no es un formato de cuenta bancaria.
¿Cuáles son los límites?
El acceso anónimo es de 20 solicitudes/minuto/IP. Una clave Pro válida permite 600 solicitudes/minuto/clave. Clave Pro: contacte con el operador; los precios no están publicados.
Endpoints
GET /v1/personnummer
Validar y analizar un personnummer / samordningsnummer sueco
value | string | Personnummer en cualquier formato común (YYMMDD-NNNC, YYYYMMDDNNNC, con + para 100+). Prefiera POST JSON {"value": "..."} para que el número nunca aparezca en una URL. |
|---|
curl "https://swekit-api.zenith-ops.workers.dev/v1/personnummer?value=811218-9876&at=2026-10-16"
GET /v1/orgnr
Validar organisationsnummer, derivar la forma jurídica y el número de IVA sueco (SE#########01)
value | string | N.º de organización como 556036-0793, 5560360793, SE556036079301 |
|---|
curl "https://swekit-api.zenith-ops.workers.dev/v1/orgnr?value=556036-0793"
GET /v1/bankgiro
Validar número de bankgiro (Luhn) y formatearlo
value | string | 7-8 dígitos, con o sin guion |
|---|
curl "https://swekit-api.zenith-ops.workers.dev/v1/bankgiro?value=5402-9681"
GET /v1/plusgiro
Validar número de plusgiro
value | string | 2-8 dígitos |
|---|
curl "https://swekit-api.zenith-ops.workers.dev/v1/plusgiro?value=4-8"
GET /v1/ocr/validate
Validar una referencia OCR / de pago (dígito de control Luhn, dígito de longitud opcional)
value | string | Dígitos OCR |
|---|
curl "https://swekit-api.zenith-ops.workers.dev/v1/ocr/validate?value=12351"
GET /v1/ocr/generate
Generar una referencia OCR a partir de un número base
base | string | Dígitos, p. ej., número de factura |
|---|---|---|
length_digit | boolean | Añadir dígito de longitud (por defecto false) |
curl "https://swekit-api.zenith-ops.workers.dev/v1/ocr/generate?base=123&length_digit=true"
GET /v1/account
Validar una cuenta bancaria sueca (clearing + cuenta, según reglas de Bankgirot) y convertirla a IBAN
number | string | Dígitos completos de la cuenta (clearing primero), O |
|---|---|---|
clearing | string | Número de clearing (4 dígitos; 5 para Swedbank 8xxx) |
account | string | Número de cuenta sin clearing |
curl "https://swekit-api.zenith-ops.workers.dev/v1/account?clearing=7507&account=1211203"
GET /v1/iban
Validar cualquier IBAN (ISO 13616 mod-97, longitud por país) e identificar bancos suecos
value | string | IBAN, se permiten espacios |
|---|
curl "https://swekit-api.zenith-ops.workers.dev/v1/iban?value=SE45 5000 0000 0583 9825 7466"
GET /v1/bic
Validar formato BIC/SWIFT
value | string | 8 u 11 caracteres |
|---|
curl "https://swekit-api.zenith-ops.workers.dev/v1/bic?value=ESSESESS"
GET /v1/clearing
Buscar banco, BIC, id IBAN y tipo de cuenta para un número de clearing
value | string | Primeros 4 dígitos del número de cuenta |
|---|
curl "https://swekit-api.zenith-ops.workers.dev/v1/clearing?value=8327"
GET /v1/holidays
Festivos públicos suecos y vísperas de un año
year | integer | 1900-2200 (por defecto: año actual) |
|---|
curl "https://swekit-api.zenith-ops.workers.dev/v1/holidays?year=2026"
GET /v1/date
Información sobre una fecha: día de la semana (sv/en), semana ISO, nombres de festivos, estado de día hábil
date | string | AAAA-MM-DD |
|---|---|---|
mode | string | "bank" (por defecto; también excluye midsommarafton, julafton y nyårsafton) o "work" |
curl "https://swekit-api.zenith-ops.workers.dev/v1/date?date=2026-12-24"
GET /v1/business-days/add
Sumar (o restar) N días hábiles a una fecha
date | string | AAAA-MM-DD |
|---|---|---|
days | integer | Positivo o negativo, |n| <= 3650 |
mode | string | bank (por defecto) o work |
curl "https://swekit-api.zenith-ops.workers.dev/v1/business-days/add?date=2026-12-22&days=2"
GET /v1/business-days/between
Contar días hábiles entre dos fechas
from | string | AAAA-MM-DD |
|---|---|---|
to | string | AAAA-MM-DD |
mode | string | bank (por defecto) o work |
curl "https://swekit-api.zenith-ops.workers.dev/v1/business-days/between?from=2026-10-16&to=2026-11-16"
Fuentes de datos
- Bankgirot, Bankernas kontonummer, 2024-02-22.
- Bankinfrastruktur i Sverige AB, página de IBAN y número de cuenta nacional sueco (tabla de clearing, fecha de datos 2026-10-16).
- Festivos: calculados (algoritmo de Pascua de Meeus/Jones/Butcher + reglas legales).