Developers
Each business on Neruva is one canonical identity. The pages, the JSON, the schema.org data and the MCP tools are all generated from it, so they never disagree.
Read
GET /api/businesses?q=penetration+testing&category=Cybersecurity&limit=50&offset=0
GET /api/businesses/{id} the whole identity
GET /api/businesses/{id}/services
GET /api/businesses/{id}/trust claim and verification state, per-field states
GET /api/businesses/{id}/actions what you can do with this business
GET /llms-full.txt every listed profile, one line each
GET /health {"ok": true} when the service is up
Search needs every query word to match (name, category, services, industries, areas, description). If no profile matches all of them, you get profiles that match some, with "match": "partial". Responses carry total, limit, offset and a next link.
Every field comes back as {"value", "state", "source": {"url", "date", "asserted_by"}}.
state:verified,owner_confirmed,sourced,stale(sourced or confirmed more than 180 days ago) orunknown.asserted_by:public_source(the company's own website, atsource.url),owner(the claimed business) orneruva(our own research, such as category and city, or a check we ran).
Treat sourced facts as what the company's website said on that date, not as confirmed. The schema.org data on each profile page carries the same states as additionalProperty entries (neruva:state:<field>) plus isBasedOn and dateModified.
Act
Only claimed businesses that turned on booking list an action. Unclaimed profiles return an empty list: the business hasn't agreed to take requests through Neruva.
GET /api/businesses/{id}/availability?start=&end= ISO 8601 with offset, up to 14 days
POST /api/businesses/{id}/consultation-request
{
"start": "2026-10-06T10:00:00-04:00",
"customer": {"name": "Pat Buyer", "email": "pat@buyer.example"},
"company": "Buyer Co",
"answers": {"Company size?": "120 staff"},
"customer_confirmed": true,
"agent": {"name": "your-assistant"}
}
Set customer_confirmed only after the person has said yes to this business and this time. Never invent contact details. Writes are limited to 10 per 10 minutes per client address (429 rate_limited after that). Availability for a business without a bookable action returns 409 not_available. Every error is {"error": {"code", "message"}}.
MCP
The same operations are available as MCP tools at https://neruva.io/mcp (streamable HTTP).