Authentication for AI agents
How to let an AI agent confirm who it's talking to, using CorroborateMe's sign-in API. Pro is $5.99 a month or $55 a year.
1. Get an API key
A human can sign in at /login, create a company, and mint a key. A script can call POST /api/agents/bootstrap with company_name and contact_email, then call it again with the emailed code. Billing is required before login links work. Pro is $5.99 a month or $55 a year, or prepaid $5.99 for 30 days. The docs show the bootstrap curl.
2. Ask the person to sign in
This call needs an active Pro plan. Without one it returns 402. POST /api/login-links with the company API key (aa_). Polling and server-sent events work with no extra setup. The default lifetime is 900 seconds.
curl -s -X POST https://corroborateme.com/api/login-links \
-H "Authorization: Bearer aa_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{"state":"job-42"}'The response includes sessionId and loginUrl. Show loginUrl to the person. It opens the hosted sign-in page.
Read who signed in
curl -s https://corroborateme.com/api/login-links/SESSION_ID \
-H "Authorization: Bearer aa_YOUR_KEY"Replace SESSION_ID with sessionId from the create call. status is pending, completed, consumed, or expired. user_id (a cu_ id) and email are present after the person finishes, and null while the link is still pending.
To wait instead of polling, open GET /api/login-links/{id}/events. It streams for about 25 seconds and ends with a pending or done event.
JavaScript
const created = await fetch("https://corroborateme.com/api/login-links", {
method: "POST",
headers: {
Authorization: "Bearer aa_YOUR_KEY",
"Content-Type": "application/json",
},
body: JSON.stringify({ state: "job-42" }),
}).then((r) => r.json());
// created.sessionId, created.loginUrl
// Show loginUrl to the person, then:
const status = await fetch(
"https://corroborateme.com/api/login-links/" + created.sessionId,
{ headers: { Authorization: "Bearer aa_YOUR_KEY" } },
).then((r) => r.json());
// status.status, status.user_id, status.email3. Optional MCP
{
"mcpServers": {
"corroborate-me": {
"url": "https://corroborateme.com/mcp",
"headers": {
"Authorization": "Bearer aa_YOUR_KEY"
}
}
}
}create_login_link accepts state, and returns sessionId and loginUrl. get_login_status takes session_id. Claude, ChatGPT, Cursor, and Grok Bot can use this only if that product can call HTTPS or attach this MCP server. Cursor's local example file is .cursor/mcp.json.example. There is no official plugin for any of those products.
Hosts that discover OAuth themselves can read /.well-known/oauth-protected-resource and /.well-known/mcp.json.
Grok Bot notes: Grok Bot agent sign-in.
Questions
Do I have to use MCP?
No. POST /api/login-links and GET /api/login-links/{id} are enough. MCP is a second way to call the same login-link tools.
Which agents are officially supported?
None as a named partnership. Any client that can send the HTTP requests on this page can use them, including Claude, ChatGPT, Cursor, and Grok Bot.