For agents and the developers who run them
Your agent can find out exactly what a provider needs, plan a whole project, start the slow gates early and know the moment a key is in .env.local — without ever seeing the key, and without ever pressing submit.
If you are an agent, start here
Everything below is also available in machine-readable form. No authentication, CORS open, JSON or plain text.
Two doors
Local agents · MCP Early access
A local MCP server and CLI that talks to the verapli extension in your browser through Chrome Native Messaging. For Claude Code, Cursor, Codex, Goose and other MCP clients. Rolling out to Founding Members first.
claude mcp add verapli -- npx -y verapli mcpThe package name and command are what we’re shipping to early access; they may change before general availability. We’ll email you the exact command with your invite.
Any agent · public API Live · preview
Read-only, free and open (CORS *). Any agent that can make an HTTP request — including cloud agents — can read provider requirements today.
curl https://verapli.com/api/v1/registryMCP tools (v1.0)
No tool returns a secret value or an identity value. No tool submits, pays, accepts terms, fills a page or clicks. Unpaired agents can call only registry.search, requirements, terms, plan (providers only) and pair.
| Tool | Who can call it | What it does |
|---|---|---|
registry.search | any agent | Find providers by name or category. Returns id, name, category, whether it has gates, and last_verified. |
requirements | any agent | Steps, gates, official and reported lead times, what to have ready, env var names with format hints and mock advice, terms summary. |
terms | any agent | Terms cards for a provider: severity, “the rules say” or “people report”, source link and date. Not legal advice. |
plan | any agent (providers only) · paired (whole project) | Ordered plan — slow gates first — with a readiness checklist and total human minutes. |
pair | local agent | Ask the human to pair this agent with this project. Returns pending, approved, denied, expired or revoked. |
scan | paired | Which providers and env vars a granted project folder needs, and which are present, missing or placeholders. |
readiness.check | paired | Re-run the readiness checks for a plan. |
preflight | paired | Check non-secret fields against a provider’s known rejection rules before the human submits. |
start_session | paired | Put a plan in front of the human in the verapli side panel. Returns awaiting_human. |
session.status | paired | Long-poll progress events with a cursor: current step, ETA, env var names written. |
session.cancel | paired | Stop guidance. Never changes anything at a provider. |
request_human | paired | Queue a request for the human in the panel. Does not fill, click or submit anything. |
keys.status | paired | For each env var: present, missing or placeholder per environment. Never the value. |
watch.list | paired | Pending reviews, official and reported waits, next check and renewal dates. |
Errors use fixed codes: pairing_required, pairing_pending, pairing_revoked, extension_not_running, folder_not_granted, plan_required, licence_required, policy_denied, not_covered, rate_limited.
// MCP tool call
{ "tool": "requirements", "arguments": { "provider_id": "meta/whatsapp" } }
// result (abridged)
{
"steps": [
{ "id": "business_verification", "gate": "human", "human_minutes": 15,
"lead_time": { "official": "[to verify]", "reported": "days to months (sourced reports)" } }
],
"env_vars": [
{ "name": "WHATSAPP_TOKEN", "format_hint": "opaque token", "mock_advice": "use a stub client until keys.status says present" }
],
"next_call": "plan"
}{ "tool": "start_session", "arguments": { "plan_id": "pl_…", "reason": "WhatsApp booking bot needs a token" } }
→ { "session_id": "se_…", "status": "awaiting_human" }
{ "tool": "session.status", "arguments": { "session_id": "se_…", "wait_seconds": 60 } }
→ { "state": "waiting_on_provider", "events": [{ "type": "submitted", "provider_id": "meta/whatsapp" }],
"keys_written": ["OPENAI_API_KEY", "SUPABASE_URL"], "cursor": "c_…" }
{ "tool": "keys.status", "arguments": { "project_id": "pr_…" } }
→ [{ "env_var": "WHATSAPP_TOKEN", "environments": { "local": "missing" } }]Tool schemas (free tools, draft)
The input schemas for the tools any agent can call without pairing, in MCP tools/list shape. Draft until the bridge reaches v1.0; the bridge itself is the source of truth.
[
{
"name": "registry.search",
"description": "Find providers by name or category. Read-only. Never returns secrets.",
"inputSchema": {
"type": "object",
"properties": {
"query": { "type": "string", "description": "Provider name or keyword, e.g. 'whatsapp'" },
"category": { "type": "string", "description": "Optional category, e.g. 'messaging'" }
},
"required": ["query"]
}
},
{
"name": "requirements",
"description": "Steps, human gates, lead times, what to have ready and env var names for one provider.",
"inputSchema": {
"type": "object",
"properties": {
"provider_id": { "type": "string", "description": "Registry id, e.g. 'meta/whatsapp'" }
},
"required": ["provider_id"]
}
},
{
"name": "plan",
"description": "Ordered plan for a set of providers, slow gates first, with a readiness checklist.",
"inputSchema": {
"type": "object",
"properties": {
"provider_ids": { "type": "array", "items": { "type": "string" }, "minItems": 1 },
"country": { "type": "string", "description": "ISO 3166-1 alpha-2, e.g. 'GB'" },
"entity": { "type": "string", "enum": ["company", "sole_trader", "individual"] }
},
"required": ["provider_ids"]
}
}
]Public registry API
Base URL https://verapli.com/api/v1. No authentication. JSON only. Responses are cacheable for five minutes. Rate limit: about 600 requests per hour per IP, with short bursts allowed; over the limit you get 429 with {"error":"rate_limited"} and a Retry-After header.
"status": "preview" and "last_verified": null until it has been through our human verification and signing process. Facts include source links; anything not yet checked says [to verify]. Don’t build anything critical on preview data.Full description: /api/v1/openapi.json (OpenAPI 3.1).
List providers
curl https://verapli.com/api/v1/registry
{
"registry_version": "preview-2026-10-24",
"status": "preview",
"disclaimer": "Preview data. …",
"providers": [
{ "provider": "meta/whatsapp", "display_name": "WhatsApp Business Platform (Cloud API)",
"category": "messaging", "status": "preview", "last_verified": null,
"has_gates": true, "href": "https://verapli.com/api/v1/registry/meta/whatsapp" }
]
}Get one provider
curl https://verapli.com/api/v1/registry/twilio-a2p-10dlc
{
"registry_version": "preview-2026-10-24",
"provider": "twilio-a2p-10dlc",
"steps": ["…"],
"gates": [{ "gate": "Campaign review", "human_only": true }],
"lead_times": [{ "what": "Campaign review", "official": "[to verify]", "reported": "[to verify]" }],
"have_ready": ["A live website with real content (not only a form)", "…"],
"env_vars": ["TWILIO_ACCOUNT_SID", "TWILIO_AUTH_TOKEN", "TWILIO_MESSAGING_SERVICE_SID"],
"facts": [{ "text": "A campaign is rejected if the website is only a form, with too little public business context (error 30920).",
"kind": "rules_say", "source_url": "https://www.twilio.com/docs/api/errors/30920" }]
}Unknown provider: 404 with {"error":"not_covered"}. Providers in the preview today: meta/whatsapp, google-oauth-verification, twilio-a2p-10dlc, openai, anthropic, stripe, supabase.
Pairing and the safety model
These are the design commitments the early-access bridge is built and tested against. We’ll publish independent review results when we have them.
Agents are untrusted
Any agent can read the public registry. To do anything with your projects, an agent must be paired — per agent and per project — and you approve it in the verapli panel. The agent’s self-reported name is shown as “unverified”.
Pairings you control
Pairings are listed in the panel, can be revoked at any time, and expire when unused.
Agents ask, you decide
start_session and request_human put a request in your panel. Nothing happens at a provider until you open it, read it and press submit yourself.
No secrets, ever
Tool outputs have no fields for secrets or identity values, and every output passes the same outbound scan as network traffic. The bridge’s contract tests are designed to plant canary keys and fail if one ever appears.
Audited
Every agent call is written to a local audit log with the agent, project, tool and result.
Rate-limited
Agent calls are rate-limited per agent, so a looping agent can’t flood your panel.