Skip to content
Esc
  • OverviewGuidesWhat exists today, and where to start.
  • QuickstartGuidesKey, domain, first send — in that order.
  • AuthenticationGuidesBearer keys, the mandatory User-Agent, and what each refusal means.
  • ErrorsGuidesThe whole vocabulary, with the status each name carries.
  • IdempotencyGuidesRetry a send without sending it twice.
  • PaginationGuidesCursors are item IDs, not page numbers.
  • Rate limitsGuidesTen a second per team, and the headers that tell you where you are.
  • EventsGuidesEvery event a webhook can carry, with one real payload each.
  • DomainsGuidesThe records, where they go at each registrar, and what the page does while you wait.
  • TrackingGuidesOpens and clicks: one record, two toggles, and what an open really means.
  • TemplatesGuidesFifty-seven starters sorted by goal, and how to keep a campaign as a template.
  • ReceivingGuidesInbound mail, and the Inbox: a webhook fires, you read it, you answer it.
  • InboxGuidesChannels, personal mailboxes and seats: who sees what, and where a reply goes.
  • Mail appsGuidesComing soon: your Rasket address in Apple Mail, Outlook and the Gmail app.
  • Inbox APIGuidesOpen, read and answer support conversations from your app, with the same key.
  • Support inbox in your appGuidesA Contact us form that opens a conversation your team answers, in five minutes.
  • Replies to your emailsGuidesOne field on a send, and the customer's reply opens a conversation.
  • Let an agent triageGuidesAn AI agent reads, notes and drafts over MCP; a person sends.
  • Node SDKGuidesThe rasket package: typed from the API's own document, retries only what is safe.
  • Python SDKGuidesThe rasket package on PyPI: the Node client's methods, in snake_case, over httpx.
  • MCP serverGuidesConnect Claude, ChatGPT or any MCP client: your scopes, no key.
  • AI assistGuidesSubject lines, drafts and diagnosis — in the dashboard and over the API, off until you allow it.
  • AgentsGuidesLet an AI agent set Rasket up: the skill, the rules file, MCP, and the recipe they share.
  • OAuthGuidesLet another app act for a team: register, authorize with PKCE, exchange, refresh.
  • Single sign-onGuidesOIDC login for your team, a domain proved by DNS, enforcement and break-glass.
  • IntegrationsGuidesVercel, Netlify and Cloudflare, Zapier and n8n, a WordPress plugin, and Notion contacts.
  • SMTPGuidesSend from anything that speaks SMTP: settings, setup guides, limits and replies.
  • ZapierGuidesSend email, add contacts and react to email events from a Zap, with no code.
  • n8nGuidesThe Rasket node and trigger for n8n workflows: install, connect, every operation.
  • VercelGuidesAdd Rasket on Vercel: a Sending key in each project as RASKET_API_KEY, no copying.
  • WordPressGuidesThe Rasket plugin: every email your site sends, through Rasket, with a safe fallback.
  • NotionGuidesTurn a Notion database of people into contacts in a segment, once or every hour.
  • Migrating to RasketGuidesBring contacts, unsubscribes, lists and templates from Mailchimp, Klaviyo and more.
  • EmailsAPI referenceSend, batch, retrieve, list, reschedule, cancel, attachments.
  • DomainsAPI referenceAdd a domain, publish its records, verify it.
  • API keysAPI referenceCreate, list, rename and revoke credentials.
  • WebhooksAPI referencePayloads, signature verification, retries and replay.
  • SuppressionsAPI referenceAddresses we will not send to, and why.
  • LogsAPI referenceEvery request made with this team's credentials.
  • MetricsAPI referenceDelivery, bounce, complaint and engagement counts.
  • TemplatesAPI referenceVersioned email content with typed variables, addressed by ID or alias.
  • ContactsAPI referenceYour audience: contacts, their typed properties, segments and topic choices.
  • SegmentsAPI referenceAudiences defined by a filter, by hand, or both.
  • TopicsAPI referenceWhat contacts subscribe to, and the preference page's list.
  • CampaignsAPI referenceCampaigns, at /broadcasts: one message to a segment, from draft to results.
  • ImportsAPI referenceCSV uploads: column mapping, conflicts and counts.
  • AutomationsAPI referenceWorkflows that run per contact: the graph, its versions, and every run.
  • Custom eventsAPI referenceThe names your product fires, and what starts a workflow.
  • ReceivingAPI referenceMail sent to you: the message, its attachments, its raw source.
  • OAuthAPI referenceClient registration, the token endpoint, and the grants a team has given.
  • TeamAPI referenceThe team a credential belongs to: its plan, sender identity, AI flag and members.
  • BillingAPI referencePlan, usage, invoices and add-ons, and the hosted pages where a customer pays.
  • AI helpersAPI referenceSubject lines, a first draft, and why an email did what it did.
  • InboxAPI referenceChannels, conversations, messages, notes and search in your support inbox.

GuidesReplies to your emails

Turn replies to your emails into support conversations

Receipts, order updates and account notices get answered. Add one field to the emails your app already sends, and every reply opens a conversation in your support channel, linked to the email it answers.

Using an AI coding agent? Give it this.

Route replies to this app's emails into our Rasket support inbox.
Read the Markdown of Rasket's guide first: /docs/inbox-api/replies.md on the Rasket website.
1. Find every place this app calls POST /emails (or rasket.emails.send) for an email a customer might answer: receipts, order updates, account notices.
2. Add inbox: "support@yourdomain.com" to each of those sends. Remove reply_to from them: the two cannot be sent together.
3. Leave password resets and sign-in links alone; nobody should answer those.
4. Do not change anything else about the sends. Show me the diff.

1. Add inbox to a send

Name a shared channel by its full address or its ID. Any key that may send can do this, because it routes mail in and reads nothing: no Inbox access is needed.

curl -X POST "https://api.rasket.com/emails" \
  -H "Authorization: Bearer $RASKET_API_KEY" \
  -H "User-Agent: acme-billing/1.0" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: receipt-8412-october" \
  -d '{
  "from": "Lumen <billing@lumen.app>",
  "to": ["priya@harborcoffee.co"],
  "subject": "Your Lumen receipt — October",
  "html": "<p>Thanks for your payment of $49.</p>",
  "inbox": "support@lumen.app"
}'
  • The email goes out with Reply-To: support@lumen.app. Don't send reply_to as well.
  • It works the same on every email in a batch.
  • A restricted channel needs a key limited to it. Personal mailboxes can't be named.

2. The customer replies

The reply opens a conversation in that channel, or joins the one already open for that email. Your team sees which email it answers. In the dashboard, the sent email shows Replies go to with the channel, and then Customer replied with a link to the conversation.

3. Find the conversation from your app

Read the email back. Once the customer has replied, it carries the conversation's ID; until then conversation_id is null.

curl -X GET "https://api.rasket.com/emails/4ef9a417-02e9-4d39-ad75-9611e0fcc33c" \
  -H "Authorization: Bearer $RASKET_API_KEY" \
  -H "User-Agent: acme-billing/1.0"
{
  "inbox": {
    "channel_id": "0192f6a8-3c1e-7a40-9b2d-5e8f1a6c4d20",
    "conversation_id": "0192f8e1-7a40-7c55-b1e3-0f0a3b6d2e91"
  }
}

Or list the open conversations in the channel with a key that has Inbox access Read:

curl -X GET "https://api.rasket.com/inbox/conversations?status=open&limit=20" \
  -H "Authorization: Bearer $RASKET_API_KEY" \
  -H "User-Agent: acme-billing/1.0"

4. Hear about it

Turn on inbox.conversation.created and inbox.message.received on a webhook endpoint. Both name the conversation and carry no message text. They are on Events.

A reply counts as received mail, which is free. Your team's answer from the Inbox is a send, like any other email.

If something goes wrong

Common problems
AnswerWhat to do
422 validation_errorinbox and reply_to were both sent. Keep inbox: it sets Reply-To for you.
422The channel is unknown, your project has no Inbox yet, or the channel is restricted and the key is not limited to it. Write the full address, such as support@lumen.app — a bare support is ambiguous across your domains.
The reply did not arriveOpen the sent email in the dashboard. If it has no Replies go to line, the send did not name the channel; read it back with GET /emails/{email_id} to check.