# Plus addresses

Give each source its own address on one inbox. No change to plan prices.

## One inbox, one address per source

A plus address is not a new inbox. Mail to username+tag@domain is stored in the inbox username@domain when no inbox already uses that exact address. The same lookup works on cooperemail.com and on a customer domain. Give each store, school, or signup its own tag, then filter and wait on that tag. Quotas, API keys, and owners stay the ones on the base inbox. A plus address does not use an extra inbox slot.

The tag is everything after the first + in the local part, lowercased. It must be 1 to 64 characters: letters, digits, and . _ -. Any other tag is not delivered (HTTP 404 inbox_not_found), the same as an unknown address. An empty tag (username+@domain) is delivered with alias null. An exact inbox at the plus address wins, and that message has alias null. Reserved names such as hello and postmaster gain this routing only when that address is already a real inbox. A paused inbox drops the mail with inbox_paused.

## List mail for one tag

Each inbound message has alias, the first matching tag in recipient order, and aliases, every tag on that delivery. Outbound alias is null. A message that arrived via a tag also has the label alias: plus that tag, so the existing labels filter still matches. GET /api/v1/inboxes/{id}/messages?alias=orders returns that tag. alias=none returns mail with no tag. A bad tag is HTTP 400 invalid_alias with param alias. One message addressed to username+a and username+b is stored once.

```bash
curl -s "https://cooperemail.com/api/v1/inboxes/$INBOX/messages?alias=orders" \
  -H "Authorization: Bearer $COOPER_API_KEY"
```

## Wait for the code from one signup

GET /api/v1/inboxes/{id}/wait-for-code and GET /api/v1/inboxes/{id}/wait accept the same alias. A newer code on another tag does not match. alias=none waits for mail with no tag. MCP cooper_wait_for_code, cooper_wait_for_message, and cooper_list_messages (including wait_seconds) take alias. The link in a wait-for-code response is untrusted and is not opened.

```bash
curl -s "https://cooperemail.com/api/v1/inboxes/$INBOX/wait-for-code?wait=55&alias=orders" \
  -H "Authorization: Bearer $COOPER_API_KEY"
```

## File mail from one tag

An inbox rule can require alias. It is an exact tag, combined with the other conditions using AND. The same checks apply as the other condition fields. A tag that is not 1 to 64 characters of letters, digits, and . _ - is HTTP 400 invalid_rule.

```bash
curl -s -X POST "https://cooperemail.com/api/v1/inboxes/$INBOX/rules" \
  -H "Authorization: Bearer $COOPER_API_KEY" \
  -H "content-type: application/json" \
  -d '{"name":"Orders","conditions":{"alias":"orders"},"actions":{"add_labels":["orders"]}}'
```

## What a plus address does not do

Inbox JSON includes read-only alias_format, username+{tag}@domain. A reply to mail that arrived at a plus address still sends From the inbox address. Allow lists, block lists, require_sender_auth, screening, suppressions, rules, and auto-forward follow the base inbox. A plus address cannot reach an inbox on another domain. Tags do not change Free, Starter, or Pro.

Operator: Avatar 8 LLC (ops@avatar33.com).
