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

  1. POST /api/agent/bootstrap/start — { email, intent: "signup" | "recover", acceptTerms: true }
  2. User pastes the 6-digit code from email
  3. POST /api/agent/bootstrap/confirm — returns api_key once → store as x-api-key / NOTIFY_API_KEY (not in chat logs)
  4. POST /api/email/domains — read dnsRecords (type / name / value) and show them to the user
  5. User adds records at Cloudflare / Vercel / Route 53 / etc.
  6. POST /api/email/domains/{domain}/check — when verified, production send unlocks and the pre-verify send cap lifts
  7. POST /api/email/send with from on 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": {}
    }
  }
}
  1. Call bootstrap_start / bootstrap_confirm (no NOTIFY_API_KEY yet)
  2. Put the returned api_key into MCP env.NOTIFY_API_KEY
  3. Use add_domain → show dnsRecords → 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

Related