Agent bootstrap — use Notify without the dashboard
Sign up or recover a Notify API key via email OTP from ChatGPT, Claude, Codex, Lovable, or MCP — then add domains, retrieve DNS records, and send.
Agents can create a Notify account and get a full_access API key without opening the dashboard. The only human step for signup is pasting a one-time email code into the chat. DNS still happens at your hosting provider — Notify returns the records; you (or a DNS-capable agent) publish them.
Flow
POST /api/agent/bootstrap/start—{ email, intent: "signup" | "recover", acceptTerms: true }- User pastes the 6-digit code from email
POST /api/agent/bootstrap/confirm— returnsapi_keyonce → store asx-api-key/NOTIFY_API_KEY(not in chat logs)POST /api/email/domains— readdnsRecords(type/name/value) and show them to the user- User adds records at Cloudflare / Vercel / Route 53 / etc.
POST /api/email/domains/{domain}/check— when verified, production send unlocks and the pre-verify send cap liftsPOST /api/email/sendwithfromon the verified domain
intent: "recover" rotates or issues a key for an existing account (Free: rotates the single key; Paid: creates an additional Agent key).
MCP (Cursor / Claude Code)
{
"mcpServers": {
"notify": {
"command": "npx",
"args": ["-y", "notifycx-mcp"],
"env": {}
}
}
}
- Call
bootstrap_start/bootstrap_confirm(noNOTIFY_API_KEYyet) - Put the returned
api_keyinto MCPenv.NOTIFY_API_KEY - Use
add_domain→ showdnsRecords→check_domain→send_email
HTTPS (ChatGPT Actions / Claude Actions / Lovable)
Import OpenAPI. Auth for send/domains is the x-api-key header (not Bearer). Bootstrap paths need no auth.
Keep the API key on the server (Lovable / Actions secrets) — never in browser bundles.
SDK
import Notify from 'notifycx';
await Notify.bootstrapStart({
email: 'you@example.com',
intent: 'signup',
acceptTerms: true
});
const confirmed = await Notify.bootstrapConfirm({
email: 'you@example.com',
code: '123456',
intent: 'signup'
});
const notify = new Notify({ apiKey: confirmed.data.api_key });
const domain = await notify.addDomain({ domain: 'example.com', dnsProvider: 'cloudflare' });
// Show domain.data.dnsRecords to the user, then:
await notify.checkDomain('example.com');
Security notes
- OTP replaces reCAPTCHA on this path (email ownership + rate limits)
- Terms acceptance required (
acceptTerms: true) - Kill switch:
AGENT_BOOTSTRAP_ENABLED=false - Dashboard signup is unchanged