Home
Getting Started

Agent Onboarding

How an AI agent connects to Nitrosend and sends its first email — the MCP path, the headless REST path, and the machine-readable skill file

Nitrosend is built MCP-first, so an AI agent can run the whole email stack — campaigns, flows, contacts, transactional sends, deliverability — as native tools. This page is the human-readable overview. The full, machine-readable onboarding skill lives in a single file your agent can fetch and follow:

Two ways in

MCP (recommended)

Connect the MCP server and the agent gets the full public tool set. Best for Claude, ChatGPT, Cursor, Codex, Gemini, and any MCP client.

Headless REST

For builder stacks with no MCP client (Replit, Lovable, v0, Bolt) or CI runners: sign up, mint a key, and send over plain HTTP.

MCP path

One command (or, in Claude Desktop and Claude.ai, the official Nitrosend connector under Settings → Connectors) plus OAuth sign-in:

claude mcp add --transport http nitrosend https://api.nitrosend.com/mcp

Call nitro_get_status first for account context, then read the nitro://guide resource. Full per-client setup is in the Quickstart and MCP integrations.

Headless path (no dashboard, no MCP client)

Request bodies on this path are top-level JSON fields; only signup nests its fields, under user. PATCH /v1/my/brands/{sid} with { "company_name": "Acme" } sets the company name, while { "brand": { "company_name": "Acme" } } returns 200 and changes nothing.

1

Create an account

POST /v1/signup with { "user": { "email", "password" } }. Returns a 15-day JWT in the Authorization response header.

2

Mint an API key

POST /v1/my/api_keys with that JWT. The response includes the full nskey_live_... secret once, in secret_key. Store it as a secret then. Later reads mask it; reveal it again with GET /v1/my/api_keys/{id}?reveal=true.

3

Activate the reserved sender

Get the brand SID from GET /v1/my/brands, then call POST /v1/my/brands/{sid}/prepare_sending with { "subdomain": "<name>" } (optionally "local_part", which defaults to hello). It reserves <name>.nitrosend.net for the brand, permanently, and materializes its local Domain and sending-identity rows synchronously under Nitrosend's verified shared root. The brand's brand_subdomain.suggested_subdomain, when present, is a safe starting name; if the call returns subdomain_taken, choose another. Without a subdomain, the call derives the name from the company name instead and refuses with brand_identity_required until the whole Brand Kit is complete. Once a name is reserved, repeat calls return it and ignore the body. The sender can send when the response status is ready. It creates no per-brand DNS, DKIM, provider identity, tenant resource, or background job. When no sender is selected, the same transaction selects this sender; otherwise it preserves the existing selection.

4

Send once ready

POST /v1/my/messages with { "channel": "email", "to", "subject", "html" } and an Idempotency-Key header. If the previous step was skipped, an eligible first request performs the company-derived materialization before admission, which needs the complete Brand Kit. If the shared root is unavailable, the API returns retryable hosted_sender_root_unavailable, stores no message, reservation, charge, or provider capability, and the same request is safe to retry.

5

Choose optional production upgrades

A customer-owned sending subdomain builds portable reputation and never consumes the reserved Nitrosend brand-subdomain sender. Paid plans and checkout remain optional; $0 plans need no card.

Info

Node and Python fetch / requests calls work as-is. Only the bare Python-urllib user agent is blocked by the WAF.

To drive the CLI from a runner with no browser, export the key as NITROSEND_API_KEY or store it with nitrosend login --api-key <key>. Plain nitrosend login opens a browser for OAuth.

For the complete reference, always defer to nitrosend.com/skill.md and the REST API docs.