---
title: "Request an API key for a person, by email"
method: POST
path: "/api/agent_signup"
tags: ["Agent signup"]
---

# Request an API key for a person, by email

`POST /api/agent_signup`

## Request

- Base URL: `https://app.pedra.ai`
- URL: `https://app.pedra.ai/api/agent_signup`
- Auth: none required

No apiKey needed. Emails the person a confirmation link (valid 30 minutes). A new account says what they do (role), picks a language and chooses a password there and clicks "Create account and allow"; an existing account clicks "Allow"; they can also decline. Nothing is created until they click. Then poll /api/agent_signup_status every `pollAfterSeconds` (5 s) for up to ~30 minutes. The response is the same whether or not the email already has an account. Abuse protections: inbox confirmation required, disposable email domains refused, rate limits (3/hour per email, 10/day per IP, plus a global daily cap). For agents with no browser in the loop (Claude Code, scripts, the local MCP server); ChatGPT and Claude connectors use OAuth instead.

## Request body

- object
  - `email` string, email, required: The email of the person the agent works for.
  - `agentName` string: Shown in the email and on the confirmation page, e.g. "Claude Code".

## Response `200`

Confirmation email sent.

- object
  - `requestId` string
  - `status` 'pending'
  - `expiresAt` string, date-time
  - `pollAfterSeconds` integer
  - `message` string

## Other responses

- `400`: Invalid email address, or a disposable email domain (`code: "disposable_email"`).
- `405`: Wrong HTTP method.
- `429`: Too many requests for this email, this IP, or overall.
- `500`: The confirmation email could not be sent.
- `503`: Agent signup is unavailable; the person can sign up at app.pedra.ai and copy a key from Settings → API.

---

[API](https://skmtc.dev/pedra/apis/pedra-api.md) · [All operations](https://skmtc.dev/pedra/apis/pedra-api/llms.txt) · [OpenAPI document](https://skmtc.dev/pedra/apis/pedra-api/revisions/87b2e76912c8?raw)
