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.

GuidesSupport inbox in your app

Add a support inbox to your app in 5 minutes

When someone fills in your Contact us form, open a conversation in your Support channel. Your team answers it in Rasket Inbox, and the reply arrives in the customer's mail.

Using an AI coding agent? Give it this.

Add a support inbox to this app using Rasket's Inbox API.
Read the Markdown of Rasket's guide first: /docs/inbox-api/support-inbox.md on the Rasket website.
1. RASKET_API_KEY holds a Rasket API key whose Inbox access is "Open conversations only" (or "Read and reply"). Never print or log it.
2. Where users submit the Contact us form, call POST /inbox/conversations with channel "support@yourdomain.com", from {email, name} of the user, the form's subject and message as text, external_id "ticket_<your id>", and a few metadata strings such as user_id and plan.
3. Send an Idempotency-Key header made from your own ticket id, so a retry never opens a second conversation.
4. On 200 or 201, show the user "Thanks — we'll reply by email."
5. On 403 inbox_not_set_up or invalid_permission, log it and show a mailto:support@yourdomain.com link instead.

Before you start

  1. A shared channel in Rasket Inbox, such as support@ on your domain. Settings → Developers in the Inbox lists your channels and their IDs.
  2. Somewhere in your server code that handles the form.

1. Make a key

In the dashboard, open API keys → Create API key. Set Inbox access to Open conversations only and limit it to your Support channel. A key like this can open conversations and can't read anything back, so it is safe on a form backend. Only a team admin can give a key Inbox access.

2. Open a conversation

Call this where your form is submitted. from is the person who wrote in: replies go to that address.

curl -X POST "https://api.rasket.com/inbox/conversations" \
  -H "Authorization: Bearer $RASKET_API_KEY" \
  -H "User-Agent: acme-billing/1.0" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: contact-58213" \
  -d '{
  "channel": "support@lumen.app",
  "from": {
    "email": "priya@harborcoffee.co",
    "name": "Priya Raman"
  },
  "subject": "Can I move my plan to annual?",
  "text": "Hi! We love Lumen. Can we switch to yearly billing?",
  "external_id": "ticket_58213",
  "metadata": {
    "user_id": "usr_8412",
    "plan": "Team"
  }
}'

You get back 201 and the new conversation. It is in Rasket Inbox straight away, marked as sent by your app, with your metadata beside it.

{
  "object": "inbox_conversation",
  "id": "0192f8e1-7a40-7c55-b1e3-0f0a3b6d2e91",
  "channel": {
    "id": "0192f6a8-3c1e-7a40-9b2d-5e8f1a6c4d20",
    "address": "support@lumen.app"
  },
  "status": "open",
  "origin": "app",
  "external_id": "ticket_58213",
  "message_id": "0192f8e1-7a52-7d10-8c44-91a0b2c3d4e5",
  "created": true
}

Sending the same external_id again adds the new message to the same conversation and reopens it, so a follow-up from your app stays in one thread. Nothing else joins two conversations — not the sender, not the subject. Send an Idempotency-Key made from your own ticket ID, so a retry never opens a second one.

3. Bring email replies home too

Add inbox to the emails you already send. Replies to them open conversations in that channel, linked to the email. The replies guide has the details.

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"
}'

4. Hear when your team replies

Add a webhook endpoint in the dashboard and turn on inbox.reply.sent. Check the signature as the webhooks reference shows, then mark your ticket answered. The event names the conversation and carries no message text:

{
  "type": "inbox.reply.sent",
  "created_at": "2026-09-09T10:16:44.902Z",
  "data": {
    "conversation_id": "0199d3a4-7a40-7c55-b1e3-0f0a3b6d2e91",
    "channel": {
      "id": "0199d3a4-1b20-7a11-9e02-4c6d8e0f1a22",
      "address": "support@acme.example"
    },
    "origin": "email",
    "actor": {
      "type": "member",
      "id": "0199d3a4-2c31-7b22-8f13-5d7e9f102b33",
      "name": "Dana Park"
    },
    "subject": "Order #1042 arrived damaged",
    "status": "pending",
    "assignee": {
      "user_id": "0199d3a4-2c31-7b22-8f13-5d7e9f102b33",
      "name": "Dana Park"
    },
    "message_id": "0199d3a4-7a52-7d10-8c44-91b2e6f0aa03",
    "email_id": "4ef9a417-02e9-4d39-ad75-9611e0fcc33c"
  }
}

To find your own ticket, read the conversation with a key that has Inbox access Read and take its external_id:

curl -X GET "https://api.rasket.com/inbox/conversations/0192f8e1-7a40-7c55-b1e3-0f0a3b6d2e91" \
  -H "Authorization: Bearer $RASKET_API_KEY" \
  -H "User-Agent: acme-billing/1.0"

Only a team admin, or a key with no channel limit, can subscribe an endpoint to Inbox events. A restricted channel's events go to no endpoint.

If something goes wrong

Common refusals
AnswerWhat to do
403 invalid_permissionThe key has no Inbox access, or only Read. Edit it in the dashboard under API keys.
403 inbox_not_set_upYour project has no channel yet. Create one in Rasket Inbox, under Settings → Mailboxes.
404 not_foundThe channel doesn't exist, or the key isn't allowed to use it — a key limited to other channels, or a restricted channel.
422 validation_errorUsually no text or html, a body over 256 KB, more than 20 metadata keys, or an attachment that isn't base64.
422 invalid_parameterThe external_id belongs to a conversation in another channel.
429 rate_limit_exceededThe key opened 500 conversations or messages in the last hour. Wait and retry with the same Idempotency-Key.

Every refusal is on Errors, and every call is on the Inbox API reference.