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:
export KEY=<your key>
2. Run a check
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
pay_supplier: Pay a supplieronboard_seller: Onboard a sellerfinancial_services: Financial servicesfood_business: Food businesscharity: Charitygeneral: General check
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):
{
"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
| Tool | What it does | REST |
|---|---|---|
check_business | Checks one business for a purpose and returns proceed, review or stop with reasons and sources. | POST /v1/check |
get_entity | Returns one register record by identifier, with no decision. | GET /v1/entity/{jurisdiction}/{identifier} |
verify_invoice | Compares an invoice's supplier fields with the register (no bank account or sort code numbers). | POST /v1/invoice-check |
check_suppliers | Checks up to 25 suppliers for one purpose; each counts as one check. | POST /v1/check-batch |
review_invoices | Reviews 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_bills | Turns 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_monitors | Lists 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_monitor | Monitors 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_monitor | Stops monitoring a business by its monitor ID. Past changes stay readable. | DELETE /v1/monitors/{id} Needs a key. |
monitor_events | What 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 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
{
"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:
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.
GET /v1/monitors(list_monitors): Lists the businesses this key is monitoring, with the last status, decision and check of each, and the most it can have.POST /v1/monitors(add_monitor): Monitors a business by identifier and country (purpose defaults to general). Runs one check, which is the baseline the daily re-check compares against.DELETE /v1/monitors/{id}(remove_monitor): Stops monitoring a business by its monitor ID. Past changes stay readable.GET /v1/monitors/events(monitor_events): What the daily re-check saw change (register status or decision), before and after, newest first, with the check that saw it.
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.
| Code | HTTP | Retryable | Fix |
|---|---|---|---|
INVALID_REQUEST | 400 | No | Correct the field named in `detail` and send the request again. |
UNKNOWN_PURPOSE | 400 | No | Set `purpose` to one of: pay_supplier, onboard_seller, financial_services, food_business, charity, general. |
COUNTRY_REQUIRED | 400 | No | Add `country` (GB, AU or NZ), or a postcode or identifier that shows the country. |
UNAUTHORISED | 401 | No | Send `Authorization: Bearer <key>` with an active key. A signed-in account creates keys in the console, at /console/keys. |
NOT_FOUND | 404 | No | Check the identifier in the URL. Check IDs are only visible to the key that made the check. |
METHOD_NOT_ALLOWED | 405 | No | Send a POST: the server is stateless, so it opens no event stream (GET) and keeps no session to end (DELETE). |
PAYLOAD_TOO_LARGE | 413 | No | Send a JSON body under 16 KB: one check per request, or split a batch into smaller ones. |
MONITOR_LIMIT_REACHED | 409 | No | Remove a monitor (remove_monitor, or DELETE /v1/monitors/{id}), then add this one. |
RATE_LIMITED | 429 | Yes | Wait for `retry_after_seconds` (also sent as the Retry-After header), then send the same request again. |
INTERNAL | 503 | Yes | Send 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.