HTTP API

Live company-registry data from 30 national governments over plain HTTPS. REST and RPC routes share one auth pipeline; every response is tier-redacted and 60-second fresh from the upstream registry.

Looking for the AI / MCP server? See /docs. Looking for the web search? Use the home-page search box.

Quick start

Free tier — 30 req/min per user. Grab a token from /account.

$ curl https://openregistry.sophymarine.com/api/v1/companies/GB/00185647     -H 'Authorization: Bearer or_pat_…'
{
  "queried_at": "2026-05-17T12:30:00+01:00 (Europe/London)",
  "jurisdiction": "GB",
  "company_id": "00185647",
  "company_name": "J SAINSBURY PLC",
  "status": "active",
  "incorporation_date": "1922-11-10",
  "registered_address": "33 Charterhouse Street, London, EC1M 6HA",
  "jurisdiction_data": { ... }
}

The queried_at timestamp is when we hit the registry. The unified top-level fields are normalized across countries; the raw upstream payload comes back verbatim under jurisdiction_data so nothing is hidden.

Try it

Fires a real request from your browser against this server. No data leaves the page; nothing is logged differently than a normal API call.

Request curl https://openregistry.sophymarine.com/api/v1/companies?q=tesco&jurisdiction=GB&limit=3
Response
// click Run query to fire

Two URL shapes, same dispatch

Pick whichever fits your client:

Both routes share the same auth, the same rate limits, and the same response envelope. Pick one per project; mixing is fine.

REST endpoints

MethodPathBacking toolWhat it returns
GET /api/v1/jurisdictions list_jurisdictions Cross-country tool-support matrix.
GET /api/v1/jurisdictions/{cc} list_jurisdictions Full schema + ID format + quirks for one country.
GET /api/v1/companies?q=&jurisdiction= search_companies Search company names in one national registry.
GET /api/v1/companies/{jur}/{id} get_company_profile Unified profile + raw `jurisdiction_data`.
GET /api/v1/companies/{jur}/{id}/officers get_officers Directors / corporate officers, live.
GET /api/v1/companies/{jur}/{id}/shareholders get_shareholders Latest shareholder filing (where exposed).
GET /api/v1/companies/{jur}/{id}/filings list_filings Filing history with `document_id` for download.
GET /api/v1/officers?q=&jurisdiction= search_officers Cross-company person search by name.
GET /api/v1/documents/{jur}/{id} get_document_metadata Document size, format, page count.
GET /api/v1/documents/{jur}/{id}/content fetch_document Raw bytes (Content-Type: application/pdf etc.). 302 for large files.
GET /api/v1/documents/{jur}/{id}/navigation get_document_navigation PDF outline + per-page text preview.

Common workflow: search → profile → officers → filings → document

$ B=https://openregistry.sophymarine.com
$ T='Authorization: Bearer or_pat_…'   # /account

# 1. Find the company by name
$ curl -H "$T" "$B/api/v1/companies?q=sainsbury&jurisdiction=GB&limit=2"

# 2. Pull the profile by the registry ID
$ curl -H "$T" "$B/api/v1/companies/GB/00185647"

# 3. Pull officers + shareholders + recent filings
$ curl -H "$T" "$B/api/v1/companies/GB/00185647/officers"
$ curl -H "$T" "$B/api/v1/companies/GB/00185647/shareholders"
$ curl -H "$T" "$B/api/v1/companies/GB/00185647/filings?limit=10"

# 4. Download a specific filing PDF
$ curl -H "$T" -o accounts.pdf \
    "$B/api/v1/documents/GB/<document_id_from_step_3>/content?max_bytes=20000000"

RPC endpoints

One endpoint per MCP tool. Pass arguments as query parameters on GET, or a JSON body on POST.

MethodPathTool
GET / POST /api/v1/rpc/list_jurisdictions list_jurisdictions
GET / POST /api/v1/rpc/search_companies search_companies
GET / POST /api/v1/rpc/search_officers search_officers
GET / POST /api/v1/rpc/get_company_profile get_company_profile
GET / POST /api/v1/rpc/get_officers get_officers
GET / POST /api/v1/rpc/get_shareholders get_shareholders
GET / POST /api/v1/rpc/list_filings list_filings
GET / POST /api/v1/rpc/get_document_metadata get_document_metadata
GET / POST /api/v1/rpc/fetch_document fetch_document
GET / POST /api/v1/rpc/get_document_navigation get_document_navigation
# GET form — args in query string
$ curl -H 'Authorization: Bearer or_pat_…' \
    "https://openregistry.sophymarine.com/api/v1/rpc/search_companies?jurisdiction=NO&query=equinor&limit=2"

# POST form — args in JSON body
$ curl -X POST https://openregistry.sophymarine.com/api/v1/rpc/get_officers \
    -H 'Authorization: Bearer or_pat_…' \
    -H 'Content-Type: application/json' \
    -d '{"jurisdiction":"GB","company_id":"00185647"}'

Per-tool argument schemas: see /docs for each tool's input fields.

Authentication

Two modes, both supported on every endpoint:

Invalid tokens get 401 with a WWW-Authenticate hint.

Tier-redaction strips a small set of source-URL fields below Enterprise; the underlying company data (jurisdiction_data) is identical across tiers. We do not modify or summarise the registry's payload.

# Personal Access Token (your tier's per-user rate limit)
$ curl https://openregistry.sophymarine.com/api/v1/companies/GB/00185647 \
    -H 'Authorization: Bearer or_pat_AbCdEf...wxyz'

Rate limits

BucketTierLimit
Per-user (authenticated)free30 / minute
Per-user (authenticated)pro180 / minute
Per-user (authenticated)max900 / minute
Per-user (authenticated)enterprise3000 / minute
Per-country (upstream cap)GB 100 / min, NL 15 / min, default 20 / min

Per-country caps are shared across all tiers — that's our commitment to the upstream registries. Hitting one returns 429 with Retry-After. The per-tier limits are on top: an Enterprise user gets 3000 rpm total, distributed however they want across countries.

Error envelope

Every error response is JSON with a stable shape:

{
  "error": "rate_limit_exceeded",
  "message": "Per-user rate limit (30 rpm) exceeded. Retry in 12s.",
  "retry_after_seconds": 12,
  "tier": "free"
}
Statuserror codeWhen
400variousBad arguments (missing required field, invalid jurisdiction code, etc.)
401invalid_tokenBearer token present but failed validation (expired, wrong aud, unknown kid).
402paid_tier_requiredEndpoint covers a paid jurisdiction (e.g. KY) and the caller is on a free tier.
404not_foundUnknown route, unknown company, or tool not exposed on this surface.
405method_not_allowedREST endpoint accepts only GET; RPC accepts GET or POST.
429rate_limit_exceededOne of the three buckets full. Retry-After header attached.
501not_supportedCountry's adapter doesn't expose this tool (e.g. IE has no get_officers).
502upstream_errorGovernment registry returned an error or timed out.
503jurisdiction_unavailableAdapter not configured / credentials missing on this deployment.

CORS & client conventions

All routes return Access-Control-Allow-Origin: *. Use directly from the browser, server-side, or any HTTP client.

Tips:

See also