Docs

Zevor checks whether a business in the UK, Australia or New Zealand is real and licensed for a purpose, using official registers. The REST API, the MCP server and the search on this site run the same check and return the same answer.

1. Get a key

Get a key with your email address. It is shown once. Then set it in your shell:

Shell
export KEY=<your key>

2. Run a check

curl
curl -X POST https://www.zevor.dev/v1/check \
  -H "Authorization: Bearer $KEY" \
  -H "Content-Type: application/json" \
  -d '{"query": "Barclays", "purpose": "pay_supplier", "country": "GB"}'

Fields: query (business name), purpose, and optionally country (GB, AU or NZ; inferred from the identifier or postcode if missing), postcode and identifier (company number, ACN, ABN or NZBN). Send query or identifier.

Purposes

Response

decision is proceed, review or stop. Every reason and every register has a source URL and a checked-at time. When the match is unclear the decision is review with candidates; retry with a candidate’s identifier. The response to the curl above (illustrative check ID and scores):

Response (200)
{
  "check_id": "chk_sample_barclays",
  "decision": "review",
  "confidence": 0.62,
  "entity": null,
  "candidates": [
    {
      "jurisdiction": "GB",
      "identifier": "00048839",
      "identifier_type": "company_number",
      "name": "BARCLAYS PLC",
      "status": "active",
      "incorporated_on": null,
      "postcode": "E14 5HP",
      "score": 0.62
    },
    {
      "jurisdiction": "GB",
      "identifier": "01026167",
      "identifier_type": "company_number",
      "name": "BARCLAYS BANK PLC",
      "status": "active",
      "incorporated_on": null,
      "postcode": "E14 5HP",
      "score": 0.55
    },
    {
      "jurisdiction": "GB",
      "identifier": "09740322",
      "identifier_type": "company_number",
      "name": "BARCLAYS BANK UK PLC",
      "status": "active",
      "incorporated_on": null,
      "postcode": "E14 5HP",
      "score": 0.52
    }
  ],
  "reasons": [
    {
      "code": "AMBIGUOUS_MATCH",
      "message": "More than one company on the Companies House register could be this business; the 3 closest are listed. Add a postcode or identifier, or confirm which one.",
      "source_url": null
    }
  ],
  "registers": [],
  "attribution": [
    "Contains public sector information licensed under the Open Government Licence v3.0"
  ],
  "disclaimer": "Automated assessment with sources. Not legal or financial advice."
}

Other endpoints: GET /v1/entity/{jurisdiction}/{identifier} returns the register record with no decision; GET /v1/checks/{check_id} returns a stored check made with your key.

3. Connect an agent (MCP)

The MCP server is at https://www.zevor.dev/mcp (Streamable HTTP). It works without a key at lower limits; a key raises them and puts the checks in your audit log. Each tool returns the same JSON as its REST endpoint.

Tools

ToolWhat it doesREST
check_businessChecks one business for a purpose and returns proceed, review or stop with reasons and sources.POST /v1/check
get_entityReturns one register record by identifier, with no decision.GET /v1/entity/{jurisdiction}/{identifier}
verify_invoiceCompares an invoice's supplier fields with the register (no bank account or sort code numbers).POST /v1/invoice-check
check_suppliersChecks up to 25 suppliers for one purpose; each counts as one check.POST /v1/check-batch
review_invoicesReviews up to 20 invoices before a person decides on them: each supplier is checked, and the batch is checked for duplicates, purchase order amounts and due dates. Each invoice gets a state: ready_for_approval, needs_review, on_hold or verification_incomplete.POST /v1/review-invoices
export_xero_billsTurns the ready_for_approval invoices of a review_invoices result into a CSV for Xero's bills import, and lists the rest with their reasons. Nothing is sent to Xero; the agent asks you for the account code and tax rate.POST /v1/export/xero-bills
list_monitorsLists the businesses this key is monitoring, with the last status, decision and check of each, and the most it can have.GET /v1/monitors Needs a key.
add_monitorMonitors a business by identifier and country (purpose defaults to general). Runs one check, which is the baseline the daily re-check compares against.POST /v1/monitors Needs a key.
remove_monitorStops monitoring a business by its monitor ID. Past changes stay readable.DELETE /v1/monitors/{id} Needs a key.
monitor_eventsWhat the daily re-check saw change (register status or decision), before and after, newest first, with the check that saw it.GET /v1/monitors/events Needs a key.

review_invoices: ready_for_approval means the checks passed; a person still decides whether to pay. Never send bank account or sort code numbers; send bank_details_changed: true instead. Invoice numbers and amounts are not stored.

Claude Code

Claude Code
claude mcp add --transport http projectx https://www.zevor.dev/mcp \
  --header "Authorization: Bearer $KEY"

Claude (claude.ai and Claude Desktop)

Settings → Connectors → Add custom connector, and enter https://www.zevor.dev/mcp.

Other MCP clients

MCP config (JSON)
{
  "mcpServers": {
    "projectx": {
      "type": "http",
      "url": "https://www.zevor.dev/mcp",
      "headers": {
        "Authorization": "Bearer $KEY"
      }
    }
  }
}

Setup prompt for your agent

Paste this into your agent’s instructions so it calls the check before acting:

Agent prompt
Before you pay, onboard or recommend a business in the UK, Australia or New Zealand, verify it with Zevor.

- MCP: connect to https://www.zevor.dev/mcp (Streamable HTTP) and call check_business(query, purpose, country?, postcode?, identifier?).
- REST: POST https://www.zevor.dev/v1/check with "Authorization: Bearer $KEY" and JSON {query, purpose, country?, postcode?, identifier?}.
- purpose is one of: pay_supplier, onboard_seller, financial_services, food_business, charity, general.

Act on "decision": proceed → continue; review → ask me, showing the reasons and candidates; stop → do not continue, and tell me the reasons.
If you get review with candidates, retry with the candidate's identifier or a postcode.
On an error, follow its "fix" field; retry only if "retryable" is true.

4. Monitors (preview)

Watch a business and read what changed. Use the MCP tools list_monitors, add_monitor, remove_monitor and monitor_events, their REST endpoints, or the console’s Monitors page. Monitors belong to a key, so the tools need one; without a key they return UNAUTHORISED. Each key can have 100 active monitors, re-checked at most once a day; every re-check is an ordinary check in your audit log.

curl
curl -X POST https://www.zevor.dev/v1/monitors \
  -H "Authorization: Bearer $KEY" \
  -H "Content-Type: application/json" \
  -d '{"identifier": "00445790", "country": "GB"}'

Errors

Errors are RFC 9457 problem details (MCP: isError: true with the same fields): code, detail with the values that failed, fix, retryable, side_effects and request_id. A failure is never HTTP 200.

CodeHTTPRetryableFix
INVALID_REQUEST400NoCorrect the field named in `detail` and send the request again.
UNKNOWN_PURPOSE400NoSet `purpose` to one of: pay_supplier, onboard_seller, financial_services, food_business, charity, general.
COUNTRY_REQUIRED400NoAdd `country` (GB, AU or NZ), or a postcode or identifier that shows the country.
UNAUTHORISED401NoSend `Authorization: Bearer <key>` with an active key. A signed-in account creates keys in the console, at /console/keys.
NOT_FOUND404NoCheck the identifier in the URL. Check IDs are only visible to the key that made the check.
METHOD_NOT_ALLOWED405NoSend a POST: the server is stateless, so it opens no event stream (GET) and keeps no session to end (DELETE).
PAYLOAD_TOO_LARGE413NoSend a JSON body under 16 KB: one check per request, or split a batch into smaller ones.
MONITOR_LIMIT_REACHED409NoRemove a monitor (remove_monitor, or DELETE /v1/monitors/{id}), then add this one.
RATE_LIMITED429YesWait for `retry_after_seconds` (also sent as the Retry-After header), then send the same request again.
INTERNAL503YesSend the same request again after a few seconds. If it keeps failing, contact support with the request_id.

Limits

Free tier: 60 checks a minute per key. Over the limit returns 429 with Retry-After. A register that does not answer is marked unavailable and the decision becomes review; the check itself still succeeds.