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 con Retry-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

HTTPCódigoSignificado
400missing_parameterNo se proporcionó una entrada obligatoria
400bad_baseLa base OCR no es válida
400bad_yearEl año debe estar entre 1900 y 2200
400bad_dateLa fecha debe tener formato AAAA-MM-DD
400bad_inputLa entrada de días hábiles no es válida o está fuera de rango
400invalid_jsonEl cuerpo POST no es JSON válido
401invalid_api_keyLa clave API no es válida o ha caducado
429rate_limitedSe superó la cuota por minuto
500internal_errorError 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=work para 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

valuestringPersonnummer 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)

valuestringN.º 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

valuestring7-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

valuestring2-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)

valuestringDí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

basestringDígitos, p. ej., número de factura
length_digitbooleanAñ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

numberstringDígitos completos de la cuenta (clearing primero), O
clearingstringNúmero de clearing (4 dígitos; 5 para Swedbank 8xxx)
accountstringNú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

valuestringIBAN, 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

valuestring8 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

valuestringPrimeros 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

yearinteger1900-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

datestringAAAA-MM-DD
modestring"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

datestringAAAA-MM-DD
daysintegerPositivo o negativo, |n| <= 3650
modestringbank (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

fromstringAAAA-MM-DD
tostringAAAA-MM-DD
modestringbank (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).