Beta v0.2. We process publicly available data from official Slovak state registers only. PrivacyObject / eraseContact
Developer documentation

ORSF API knowledge base

Open data on 800k+ Slovak companies via REST API and an MCP server. Public read access — no API key, no signup. Auth-gated only for person-level data and force-refresh actions.

Base URLhttps://api.orsf.sk
LicenseCC-BY 4.0

Overview

ORSF (Otvorený register slovenských firiem — Open Register of Slovak Companies) aggregates 14 Slovak state registers into a single REST API and a queryable dataset. Three access modes:

  • REST API — JSON over HTTPS, anonymous read on public endpoints
  • MCP server — for AI agents (Claude, Cursor, Zed); one-line install
  • CLInpx @orsf/cli for shell-based exploration

All data is sourced from official public registers and carries lineage (source + fetchedAt per record). License: CC-BY 4.0 — attribute ORSF in your application.

60-second quickstart

Three commands, no auth, no keys.

bash1. Look up a company by ID
curl https://api.orsf.sk/v1/companies/55609830
bash2. Fulltext search
curl 'https://api.orsf.sk/v1/search?q=8888'
bash3. Aggregate stats
curl https://api.orsf.sk/v1/stats/summary

Want to try without leaving this page? Jump to the Live playground.

Authentication

Most endpoints are public. Authentication is required only for person-level data and write actions:

AuthEndpointsWhy
Public/v1/companies, /v1/search, /v1/stats/*, /v1/labels, /v1/openapi.jsonNames, addresses, financials are publicly available in source registers.
Required/v1/persons/*, /v1/companies/{ico}/graph, /v1/persons/{id}/graphDirector/officer data — GDPR Art. 6(1)(f) limits mass profiling.
RequiredPOST /v1/companies/{ico}/refreshTriggers source-register fetch — costly, abuse-prevention.

Sign in via POST /api/auth/sign-in/email. Server returns a session cookie:

http
Set-Cookie: __Secure-orsf.session_token=...; Path=/; HttpOnly; Secure; SameSite=Lax

Pass the cookie on subsequent requests. There are no API keys or bearer tokens currently — sessions are the only auth method.

Live playground

Pick an endpoint, set a parameter, hit Run request. Requests go straight to https://api.orsf.sk from your browser.

Full company record by national ID (IČO). Public.

Request URLhttps://api.orsf.sk/v1/companies/55609830

Endpoints

Full reference. See OpenAPI 3.1 spec for the machine-readable form.

Fulltext search over company names + IČO fast-path (numeric query → direct lookup).

ParamTypeDefaultDescription
qstring (2-100 chars)Search query. Numeric (6-8 digits) triggers fast IČO path.
limitint20Max 50.
offsetint0Max 1000.
kindenumcompany | sole_trader | other (legacy SK still accepted).
legalForm, register, status, regionstring[]Multi-value filters (repeat param for multiple values).
isVatPayerbooleantrue / false
establishedYearMin, ...MaxintYear range filter.
bashExample
curl 'https://api.orsf.sk/v1/search?q=poistovna&register=Obchodný%20register&limit=5'

GET /v1/companies/{ico}public

Full company record — identity, address, financial statements, business activities, VAT registration.

roles array is empty for anonymous (rolesLocked: true); sign in to see directors/officers.

bashExample
curl https://api.orsf.sk/v1/companies/55609830 | jq '.name, .nationalId, .statusCode'

GET /v1/companies/{ico}/graphauth

Connection graph (Sigma.js / graphology compatible). Nodes + edges for company ↔ persons ↔ other companies. Depth 1-3.

GET /v1/persons/{id}auth

Person record with all known company roles. id is internal UUID returned from /v1/companies/{ico}.roles[].person.id.

GET /v1/stats/summarypublic

Aggregate counts (companies, filings, persons). Cached 5 min, approximate counts (within ~5%).

GET /v1/stats/districtspublic

Companies per NUTS LAU1 district. ?includeAll=true to include sole traders + non-business orgs.

GET /v1/labels?locale=en|skpublic

Localized human labels for enum codes. Fetch once at app startup, cache. Returns:

jsonResponse (truncated)
{
  "locale": "en",
  "status": { "active": "Active", "dissolved": "Dissolved", ... },
  "register": { "commercial": "Commercial Register", ... },
  "kind": { "company": "Company", "sole_trader": "Sole trader", "other": "Other" }
}

Field naming

Every Slovak field name in our responses has an English canonical alias. New clients should use the English form; legacy Slovak names will work forever. Full convention at docs/api-conventions.md.

Legacy (Slovak)Canonical (English)Notes
iconationalIdCompany national ID — 8 digits in SK/CZ.
dictaxIdTax identification number.
icdphvatIdVAT registration ID with country prefix.
pscpostalCodePostal code (PSČ).
okresdistrictCodeNUTS LAU1 code.
krajregionCodeNUTS-3 code.
obecmunicipalityCodeNUTS LAU2 code.
velkostsizeCodeOrganization size (Statistics Office).
druhVlastnictvaownershipTypeOwnership category code.
konsolidovanaconsolidatedConsolidated reporting flag.

Enum codes

Enum-like fields expose three forms: raw (from source), xxxCode (stable English machine code), and a localizable label via /v1/labels.

statusCode

CodeRaw valuesLabel (en)
activeaktívnaActive
dissolvedzrušenáDissolved
suspendedpozastavenáSuspended
deletedvymazanáDeleted
unknown(other / null)Unknown

registerCode

CodeRaw valuesLabel (en)
commercialObchodný registerCommercial Register
tradeŽivnostenský registerTrade Register
other(other categories)Other Register

Errors

JSON error shape (Fastify default + our additions):

json
{
  "statusCode": 404,
  "error": "Not Found",
  "message": "Company with ID 12345678 not found."
}

Common status codes

CodeMeaning
200OK
400Bad Request — validation failed
401Unauthorized — sign in required
404Not Found — record absent
429Too Many Requests — rate-limited; check Retry-After
500Server Error — log includes reqId for support
502 / 503Upstream register or Meilisearch unavailable

Rate limits

EndpointLimitNotes
Search, company detail60 req / min / IPSoft limit; backed off via 429
Graph endpoints20 req / min / IPJoins are heavier
POST /refresh5 req / min / IP + 60s per-IČO cooldownTriggers source-register fetch

Need higher limits for legitimate bulk use? Email [email protected].

MCP server (for AI agents)

The Model Context Protocol server exposes ORSF as tool-calls for LLM agents. Works with Claude Code, Claude Desktop, Cursor, Continue, Windsurf, and any MCP-compatible client.

Claude Code

bash
claude mcp add orsf -- npx -y @orsf/mcp-server

Claude Desktop / Cursor / Windsurf

Add to ~/Library/Application Support/Claude/claude_desktop_config.json (or platform equivalent):

json
{
  "mcpServers": {
    "orsf": {
      "command": "npx",
      "args": ["-y", "@orsf/mcp-server"]
    }
  }
}

Available tools

  • search_companies — fulltext + filters
  • get_company — full record by IČO
  • get_company_graph — connection graph
  • get_person — by UUID (auth required)
  • get_person_graph — person-centric graph (auth required)
  • get_stats — aggregate counters

MCP server is open-source on GitHub. Runs locally; never sends prompts to any third party — only ORSF JSON API.

CLI tool

Shell-based access without writing code:

bash
npx @orsf/cli search "poistovna"
npx @orsf/cli company 55609830
npx @orsf/cli graph 55609830 --depth 2

Same data as REST API. Output is pretty-printed JSON or table form (with --format=table).

Pagination

List endpoints support limit + offset (offset-based pagination).

bash
# First page
curl 'https://api.orsf.sk/v1/search?q=sro&limit=20&offset=0'

# Next page
curl 'https://api.orsf.sk/v1/search?q=sro&limit=20&offset=20'

Maximum offset is 1000 — for deeper paginations, narrow the search with filters (region, year, legal form). Cursor-based pagination is on the roadmap for larger datasets.

Versioning

URL-based versioning (/v1/...). Breaking changes will introduce/v2/... with a long overlap window. Field aliases (e.g., iconationalId) are added next to legacy keys and never remove the old form.

Subscribe to changes:

  • Watch the GitHub repo
  • OpenAPI spec is the source of truth — diff /v1/openapi.json over time

Status & SLA

Live status: status.orsf.sk. ORSF is a beta service — best-effort availability, no SLA. For production use cases requiring an SLA, contact us.

Issues, feature requests, abuse reports: [email protected].

Glossary

IČO
Identifikačné číslo organizácie — 8-digit company national ID, used in SK and CZ.
DIČ
Daňové identifikačné číslo — tax identification number.
IČ DPH / VAT ID
VAT registration ID, prefixed with country code (e.g., SK2122034970).
RPO
Register právnických osôb — Register of Legal Entities (Statistical Office of SR).
RUZ
Register účtovných závierok — Register of Financial Statements (Ministry of Finance).
ORSR
Obchodný register SR — Slovak Commercial Register (Ministry of Justice).
ZRSR
Živnostenský register — Trade Register (Ministry of Interior).
NUTS
Nomenclature of Territorial Units for Statistics. ORSF uses NUTS-3 (regionCode) and LAU1 (districtCode).