Drop Verdacert into any AI agent in 5 minutes
A certified-translation tool, callable from any agent runtime. MCP for Claude Desktop / Cursor, REST for everything else, and a typed Vercel AI SDK tool you can drop straight into your codebase. Auth is a single bearer token; sandbox tokens are free and exercise the full state machine in under two minutes.
Looking for the full developer docs? Head to verdacert.com/docs — per-endpoint reference, every error code, webhook signature recipes in TS / Python / Go, and offline JWS verification walkthroughs.
1. Get a sandbox token (60 seconds, no waitlist)
Self-serve at verdacert.com/onboarding. Sign in with your email, name your firm, mint a sandbox key — done. Live keys unlock the moment you add a default payment method; no human-approval gate.
# Tokens look like: vc_sandbox_p7q8r… # free, synthetic flow vc_live_abc123… # real orders, real money
2. Pick your integration shape
MCP — Claude Desktop, Cursor, agentic frameworks
Verdacert ships a streamable-HTTP MCP server with seven tools: get_capabilities, quote, submit, get_status, get_result, refund, verify_certificate. Point any MCP client at https://verdacert.com/api/mcp with your bearer token.
Claude Desktop config
Add to ~/Library/Application Support/Claude/claude_desktop_config.json (or the equivalent on your OS):
{
"mcpServers": {
"verdacert": {
"url": "https://verdacert.com/api/mcp",
"headers": {
"Authorization": "Bearer vc_sandbox_…"
}
}
}
}Cursor MCP config
Settings → MCP → Add new MCP server. Same JSON as above.
Programmatic JSON-RPC (any HTTP client)
curl https://verdacert.com/api/mcp \
-H 'Authorization: Bearer vc_sandbox_…' \
-H 'Accept: application/json, text/event-stream' \
-H 'Content-Type: application/json' \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/list","params":{}}'Vercel AI SDK
One import gives you all seven tools, typed and ready to drop into your generateText / streamText / agent call. Published as @verdacert/ai-sdk-tools.
Install
pnpm add @verdacert/ai-sdk-tools ai zod # or: npm i @verdacert/ai-sdk-tools ai zod
Use (with Vercel AI Gateway — recommended)
import { generateText, isStepCount } from "ai";
import { createVerdacertTools } from "@verdacert/ai-sdk-tools";
const tools = createVerdacertTools({
apiKey: process.env.VERDACERT_API_KEY!,
});
const { text } = await generateText({
// Provider-string model. Routes through AI Gateway automatically
// when AI_GATEWAY_API_KEY is set (auto-injected on Vercel).
model: "anthropic/claude-sonnet-4",
tools,
stopWhen: isStepCount(20), // multi-step agent loop
prompt:
"Quote a 3-page Farsi birth certificate for USCIS. Show me the price.",
});Tools exported: getCapabilities, quote, submit, getStatus, getResult, refund, verifyCertificate. Each is a plain AI SDK Tool — destructure if you only want a subset. Errors throw VerdacertHttpError with the structured error envelope and request id from the server.
Why AI Gateway? Same pricing as the underlying provider, multi-provider failover, observability, and the same model id works across hosts. On Vercel deployments, AI_GATEWAY_API_KEY is auto-injected. If you'd rather call the provider directly, swap model: "anthropic/claude-sonnet-4" for model: anthropic("claude-sonnet-4-20250514") from @ai-sdk/anthropic.
Prefer not to add a dependency? The package is a thin wrapper around the REST API; see the REST section above to call it directly. The MCP server at https://verdacert.com/api/mcp is also an option for tool-using clients that speak MCP.
OpenAI tool use
Same shape as the AI SDK — define the tool with a JSON schema and execute via REST. Sketch:
const tools = [
{
type: "function",
function: {
name: "verdacert_quote",
description: "Quote a Verdacert certified translation.",
parameters: {
type: "object",
properties: {
sourceLanguage: { type: "string" },
useCase: { type: "string" },
pageCount: { type: "integer", minimum: 1 },
speedTier: { type: "string", enum: ["standard","express","rush"] }
},
required: ["sourceLanguage","useCase","pageCount","speedTier"]
}
}
}
];
// Inside your tool_call handler:
async function verdacert_quote(args) {
const res = await fetch("https://verdacert.com/api/v1/quote", {
method: "POST",
headers: {
"content-type": "application/json",
Authorization: `Bearer ${process.env.VERDACERT_API_KEY}`
},
body: JSON.stringify(args)
});
return res.json();
}Plain REST
Every endpoint at-a-glance:
| Method | Path | Purpose |
|---|---|---|
| GET | /api/v1/capabilities | Live enums (languages, doc types, tiers, add-ons). |
| POST | /api/v1/quote | Price + ETA. Returns quoteId. |
| POST | /api/v1/submit | Create a job. Returns jobId. |
| GET | /api/v1/status/{jobId} | Poll job state + progress. |
| GET | /api/v1/result/{jobId} | Artifacts + JWS once ready. |
| GET | /api/v1/verify/{certId} | Public — no auth. Returns JWS + decoded payload. |
| GET | /.well-known/jwks.json | Public — JWKS for Ed25519 signature verification. |
| POST | /api/mcp | MCP streamable-HTTP endpoint. |
| GET | /api/v1/openapi.yaml | OpenAPI 3.1 spec — feed to Stainless / Speakeasy / Postman. |
See it working — reference agent
A complete working AI agent that prepares Verdacert translations for an immigration case file lives at examples/immigration-paralegal in the open-source repo. Two integration paths:
- No code: drop the included
claude-desktop-config.jsoninto Claude Desktop, paste a case description, and watch Claude call our six MCP tools in sequence. - Programmatic:~300 lines of TypeScript using the Anthropic SDK + tool-calling. Fork it, swap the case-intake source for your own product's data model, and ship.
# Programmatic path: git clone https://github.com/mitrakmt/verdacert.git cd verdacert/examples/immigration-paralegal pnpm install cp .env.example .env # add VERDACERT_API_KEY + ANTHROPIC_API_KEY pnpm start # uses the sample I-130 case # … or supply your own case file: pnpm start path/to/case.md
3. Verify a certificate
Every result carries a JWS receipt signed with Ed25519. Fetch the public key once, cache for an hour, verify the JWS locally — no need to call us:
# JWKS (public keys) curl https://verdacert.com/.well-known/jwks.json # Single-cert JSON (also includes the JWS) curl https://verdacert.com/api/v1/verify/<certificateId> # Human-readable verification page (also linked from every PDF QR) https://verdacert.com/verify/<certificateId>
4. Webhooks (optional)
Skip polling. Provide a webhook URL when minting your key (or per-call via submit({ webhookUrl })) and Verdacert will POST state-change events. Payloads are HMAC-signed Stripe-style:
POST <your webhook URL>
content-type: application/json
x-verdacert-event: order.ready
x-verdacert-event-id: evt_…
x-verdacert-signature: t=<unix>,v1=<hex_hmac_sha256>
{
"id": "evt_…",
"type": "order.ready",
"createdAt": "2026-05-22T18:00:00.000Z",
"data": {
"jobId": "…",
"orderNumber": "VC-2026-…",
"status": "ready",
"apiKeyId": "…",
"externalEndUserId": "your-user-id",
"promisedDeliveryAt": "2026-05-23T18:00:00.000Z"
}
}Verify v1 by recomputing HMAC-SHA256(t + "." + body, webhookSecret) in constant time. Reject events older than ~5 minutes.
5. Get a sandbox key + smoke test
Email hello@verdacert.com for a sandbox token. Quickest validation:
# 1. Capabilities
curl -H "Authorization: Bearer vc_sandbox_…" \
https://verdacert.com/api/v1/capabilities
# 2. Quote
curl -X POST https://verdacert.com/api/v1/quote \
-H "Authorization: Bearer vc_sandbox_…" \
-H "Content-Type: application/json" \
-d '{
"sourceLanguage":"fa","useCase":"uscis",
"pageCount":2,"speedTier":"standard"
}'
# 3. Submit (echo the quote input back)
# 4. Poll /api/v1/status/<jobId> until status === "ready"
# 5. Fetch /api/v1/result/<jobId>The full sandbox lifecycle (paid → processing → in_review → ready) completes in ~2 minutes; Review-and-Certify in ~90 seconds.
Questions, partnerships, rev-share
hello@verdacert.com· ship a working integration and we'll backfill a co-marketed launch.
Or place a one-off order →