Search the docs

Find a page, a section, or an endpoint.

Inbox quickstart

A key, an address and a sent message, in about five minutes.

An address is a resource. Mail arriving is an HTTP request. Everything here works on a free account.

You already have an address. Signing up gives you one on our shared domain, with a welcome message in it — no DNS, no card, nothing to wait for. Use it for everything below.

A domain of your own is an upgrade rather than a first step: it is what makes mail come from you, and it is its own page when you want it.

Get a key

Keys are created in Developers → API keys inside the app. A key is shown once; afterwards the list holds a prefix and nothing else, so store it where you store the rest of your secrets.

export PIDGEON_API_KEY=pgn_live_…

Install a client

cURL needs nothing. The TypeScript client runs on Node 18 or later, and the Python one on Python 3.11 or later; both are generated from the same API, so an operation has the same name in each.

# Nothing to install.

Ask what you own

The shortest call that proves the key works. It lists the addresses on the account, which is also how you find the id you will need later — including the one signup gave you.

curl https://pidgeon.ai/api/v1/identities -H "Authorization: Bearer $PIDGEON_API_KEY"

Ask what is left before sending

Before the first send, ask what stands in the way. It checks everything a send would — the key's level, test mode, the domain's DNS, the address, the account's daily allowance — without sending, and lists the steps in order.

curl https://pidgeon.ai/api/v1/agent/setup -H "Authorization: Bearer $PIDGEON_API_KEY"

ready_to_send is true when nothing is left. Otherwise next is the first step not done, and every step says who does it: owner: "agent" is your code (create an address, wait out a limit until resets_at), and owner: "person" is somebody with access to the account (publish the DNS records the step lists, return a signup code, make a key that can send). how says what to do, in words you can pass to that person. Add identity_id to ask about one address; without it, the answer is about the address nearest to sending, and addresses lists the rest. A key only hears about the addresses it reaches.

Send one

from has to be an address this account owns — the one signup gave you, or one on a domain you have since verified. Everything else is what you would expect.

curl https://pidgeon.ai/api/v1/messages -H "Authorization: Bearer $PIDGEON_API_KEY" -H "Content-Type: application/json" -d '{
  "from": "hello@yourdomain.com",
  "to": "someone@example.com",
  "subject": "First one",
  "text": "It works."
}'

A 201 comes back with the message id and the thread it landed in. Recipients that fail the send guard are returned in rejected rather than raised — one bad address does not lose the other four.

Then receive one

Sending is the half most APIs do. Webhooks are the other half, and they are the reason this product exists: mail arriving at hello@yourdomain.com becomes an HTTP request to your code within seconds, with nothing to poll.

That is the next page, and it is the one worth reading.