Registry API live in preview · MCP bridge in early access

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.

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 Code
claude mcp add verapli -- npx -y verapli mcp

The 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.

List providers
curl https://verapli.com/api/v1/registry

MCP 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.

ToolWho can call itWhat it does
registry.searchany agentFind providers by name or category. Returns id, name, category, whether it has gates, and last_verified.
requirementsany agentSteps, gates, official and reported lead times, what to have ready, env var names with format hints and mock advice, terms summary.
termsany agentTerms cards for a provider: severity, “the rules say” or “people report”, source link and date. Not legal advice.
planany agent (providers only) · paired (whole project)Ordered plan — slow gates first — with a readiness checklist and total human minutes.
pairlocal agentAsk the human to pair this agent with this project. Returns pending, approved, denied, expired or revoked.
scanpairedWhich providers and env vars a granted project folder needs, and which are present, missing or placeholders.
readiness.checkpairedRe-run the readiness checks for a plan.
preflightpairedCheck non-secret fields against a provider’s known rejection rules before the human submits.
start_sessionpairedPut a plan in front of the human in the verapli side panel. Returns awaiting_human.
session.statuspairedLong-poll progress events with a cursor: current step, ETA, env var names written.
session.cancelpairedStop guidance. Never changes anything at a provider.
request_humanpairedQueue a request for the human in the panel. Does not fill, click or submit anything.
keys.statuspairedFor each env var: present, missing or placeholder per environment. Never the value.
watch.listpairedPending 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.

Looking up a provider
// 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"
}
Starting a session and waiting
{ "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.

tools/list · free tools
[
  {
    "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.

Preview data. Every entry is marked "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.