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.
  • 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.
  • 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, plus Zapier and n8n for workflows without code.
  • 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.
  • 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.

GuidesMCP server

MCP server

Point an assistant at Rasket and it can set your account up and run it — add and verify a domain, wire a webhook, write a template, send, and follow what happened — on your behalf, without anyone pasting an API key into a desktop app. That is a trust decision before it is an integration, so this page starts there.

The boundary

A connected app never gets a key. It gets an OAuth access token, issued for one team, carrying only the scopes you approved on the consent screen, and you can revoke it from Settings → Team → Authorized apps at any moment.

The scopes you approve decide which tools exist. A grant without domains:write is not a server that refuses create_domain — it is a server that does not have one.

Two scopes reach further than their names suggest, so read them before approving. emails:read can cancel a scheduled send, because cancelling only ever prevents mail. team:write can turn AI assist on, which decides whether content you ask about is sent to the AI provider. A client connected without a toolset asks for both.

What it may never do

These are not tools that refuse. They are tools that do not exist.

  • Mint, change or revoke an API key, or manage the grants it is itself using.
  • Change your plan, your billing, or who is on your team.
  • Delete a domain, a template, a segment, a campaign or an automation.
  • Remove a suppression — an unsubscribe stays an unsubscribe, whoever is asking.
  • Regenerate a domain's DKIM keys, rotate a webhook's signing secret, or take a registrar credential.

No scope reaches them either, so there is no consent screen anywhere that could hand them over. Two deletions are tools: delete_webhook and delete_contact, which erases a person for good. Both need a write scope, and both are marked destructive, so your client asks you before each one. See Authentication for how the scopes and the API-key permissions relate.

Seven toolsets

79 tools, grouped so a client can load only the ones it needs. Every call goes through the same service the dashboard and the API use, so every rule applies unchanged. A refusal comes back as a tool result marked isError, carrying the error name the API would have answered with — so the assistant can read it and tell you which address unsubscribed, rather than reporting that something broke.

Every paged list takes limit (at most 25) and after. An html body over 4 KB is left out of what a tool returns, and a sent or received message's HTML is never returned at all.

Setup · setup · 26

Add and verify a domain, name the sender, wire webhooks, write templates.

The setup toolset
ToolScopeWhat it does
get_teamteam:readThe team's plan, sender identity, AI assist and single sign-on status.
update_teamteam:writeSet the sender name and postal address a campaign needs, or turn AI assist on or off.
list_domainsdomains:readYour domains, their region and whether they may send.
get_domain_statusdomains:readOne domain: every DNS record, its status, and why a failing one failed.
get_domain_recordsdomains:readThe records to publish at the DNS host, exactly as it needs them.
create_domaindomains:writeAdd a domain; the answer carries the records to publish.
verify_domaindomains:writeLook the records up now rather than at the next scheduled check.
update_domaindomains:writeChange tracking, TLS or a domain's capabilities.
claim_domaindomains:writeStart a claim on a name another team verified. It completes by itself once the TXT record resolves.
list_webhookswebhooks:readYour endpoints and the events each receives.
get_webhookwebhooks:readOne endpoint, with its status and delivery health.
list_webhook_eventswebhooks:readThe events created for one endpoint, with their delivery state.
list_parked_eventswebhooks:readThe events held while an endpoint was disabled.
create_webhookwebhooks:writeAdd an endpoint. The answer carries its signing secret, once.
update_webhookwebhooks:writeChange an endpoint's URL or events, or enable or disable it.
delete_webhookwebhooks:writeDelete an endpoint. Its past events stay readable.
replay_webhook_eventwebhooks:writeDeliver one past event to its endpoint again.
deliver_parked_eventswebhooks:writeDeliver the events parked on an endpoint, oldest first.
list_templatestemplates:readTemplates with their alias and status, to send by name.
get_templatetemplates:readOne template, its variables and whether it is published.
preview_templatetemplates:readRender a template with values filled in. Nothing is sent.
list_starterstemplates:readThe starter templates a new template can be copied from.
get_startertemplates:readOne starter in full, with the variables a copy declares.
create_templatetemplates:writeWrite a new template draft, from scratch or from a starter.
update_templatetemplates:writeChange a template's draft.
publish_templatetemplates:writePublish the draft, so a send can name it.

Send · send · 11

Send one message, follow what happened to it, and read what came in.

The send toolset
ToolScopeWhat it does
send_emailemails:sendSend one message from a verified domain. Every sending rule applies unchanged.
get_emailemails:readOne message: its recipients, what happened to each, and the event timeline.
list_emailsemails:readA page of sent mail, newest first, with an optional search.
list_email_eventsemails:readEvery event of one message, with what each one recorded.
cancel_emailemails:readCancel a scheduled message before it leaves.
get_email_metricsemails:readDelivery, bounce, complaint, open and click rates over a window.
list_received_emailsemails:readInbound mail, newest first.
get_received_emailemails:readOne inbound message, its text capped at 4 KB and never its HTML.
list_suppressionssuppressions:readThe addresses you will not send to, and why.
add_suppressionsuppressions:writeSuppress up to 100 addresses at once.
list_logslogs:readYour API request logs, tool calls included.

Audience · audience · 20

Contacts and their properties, imports, segments, and the topics people chose.

The audience toolset
ToolScopeWhat it does
list_contactscontacts:readA page of contacts.
get_contactcontacts:readOne contact, by id or by address.
list_contact_propertiescontacts:readThe properties a contact may carry.
get_importcontacts:readHow a contact import is getting on.
create_contactcontacts:writeAdd a contact. An address you already hold is updated, not duplicated.
update_contactcontacts:writeChange a contact's name, address, properties or consent.
delete_contactcontacts:writeErase a contact for good. Unsubscribing is the gentler option.
create_contact_propertycontacts:writeDeclare a property before a contact can carry it.
import_contactscontacts:writeImport a CSV of up to 512 KiB, given inline.
list_segmentssegments:readYour segments.
get_segmentsegments:readOne segment and the filter that defines it.
preview_segmentsegments:readCount who a filter matches, before a segment is saved with it.
create_segmentsegments:writeDefine an audience by filter, by hand, or both.
update_segmentsegments:writeRename a segment.
add_contact_to_segmentsegments:writePut one contact in a segment.
remove_contact_from_segmentsegments:writeTake one contact out of a segment. The contact is untouched.
list_topicstopics:readThe subscription topics you offer.
create_topictopics:writeOffer a new topic.
update_topictopics:writeRename a topic, or change its description or visibility.
set_contact_topicstopics:writeRecord which topics one contact opted into or out of.

Marketing · marketing · 17

Campaigns (the broadcasts tools and scopes), automations, and the custom events that start them.

The marketing toolset
ToolScopeWhat it does
list_broadcastsbroadcasts:readYour campaigns and their status.
get_broadcastbroadcasts:readOne campaign, with HTML over 4 KB left out.
get_broadcast_reportbroadcasts:readHow a sent campaign performed, and its most-clicked links.
create_broadcastbroadcasts:writeDraft a campaign to a segment. It stays a draft.
update_broadcastbroadcasts:writeChange a draft.
preview_broadcastbroadcasts:writeWho a draft would reach, its subject and sender, and the token a send needs.
send_broadcastbroadcasts:writeSend a previewed draft now, or schedule it.
cancel_broadcastbroadcasts:writeCancel a scheduled campaign.
list_automationsautomations:readYour automations and whether each is enabled.
get_automationautomations:readOne automation and the graph of its current version.
list_automation_runsautomations:readThe contacts an automation has run for.
create_automationautomations:writeCreate a workflow. It is disabled until you enable it.
update_automationautomations:writeRename, enable or disable an automation, or publish a new version of its graph.
stop_automationautomations:writeDisable an automation and cancel its runs in flight.
list_eventsevents:readThe custom events you have defined.
create_eventevents:writeDefine a custom event an automation can start from.
send_eventevents:sendRecord that an event happened for one contact.

Insight · insight · 0

Reserved. It holds no tool of its own yet: email metrics are in send, a campaign's report is in marketing.

Billing · billing · 1

Read-only. Nothing here buys, changes or cancels anything.

The billing toolset
ToolScopeWhat it does
get_billingbilling:readYour plan, usage, add-ons and payment state.

AI · ai · 3

AI assist, once the team has turned it on. Each call uses AI credits.

The ai toolset
ToolScopeWhat it does
suggest_subject_linesai:useSubject lines for a draft.
draft_emailai:useA first draft of an email body from a brief.
diagnose_emailai:useWhat happened to one message, and what to do about it.

create_webhook is the one tool that returns a secret: the endpoint's signing secret, once, because your endpoint cannot verify a delivery without it. It is your outbound secret, not a credential into Rasket. A claim started with claim_domain transfers the name by itself once its TXT record resolves, unless the current owner sent or verified recently.

Every tool says whether it only reads, whether it can overwrite, remove or send, and whether it reaches anyone outside your account. Clients use those hints to ask you before anything that changes or sends. A campaign goes out in three steps: the agent drafts it, calls preview_broadcast to show you the segment, how many subscribed contacts it holds, the subject and the sender, and only then calls send_broadcast with the confirm_token the preview returned. The token is for that draft as it stood, for one hour; an edit means a new preview.

Calling a tool this connection was not given answers with the scope it needs, or the toolset to add, so the agent can ask you for exactly that.

Start with describe_setup

describe_setup needs no scope and is registered whatever the toolset filter says, so it is always the first call an agent can make. It returns the setup recipe — the same steps as the Agents guide — with each step's tool, and a plan marking which steps this connection's scopes allow and which scopes are missing. With format: "json" it returns only the plan:

{
  "steps": [
    { "id": "create_key", "title": "Create an API key", "tool": null, "scope": null, "allowed": false, "reason": "No tool creates an API key: …" },
    { "id": "add_domain", "title": "Add a domain", "tool": "create_domain", "scope": "domains:write", "allowed": true, "reason": null },
    …
    { "id": "send_broadcast", "title": "Send a broadcast", "tool": "send_broadcast", "scope": "broadcasts:write", "allowed": false, "reason": "Needs the broadcasts:write scope." }
  ],
  "missing_scopes": ["broadcasts:write", "automations:write"]
}

An agent that finds a scope missing should ask you to reconnect with it before starting, rather than stopping halfway through.

Budgets, because an assistant is chatty

Four limits, counted per connected app, on top of your team's ten requests a second. They are deliberately low: an assistant is a person's hands, not a pipeline.

The limits on a connected app
BudgetWindowWhat counts
60 tool callsper minuteEvery call that reaches a tool, including one that comes back as an error — the cost is the call.
100 sendsper rolling hoursend_email calls we accepted. Your plan's own quota still applies.
3 broadcastsper rolling hoursend_broadcast calls that queued or scheduled a campaign.
5 importsper rolling hourimport_contacts calls that started an import.

Over any of them, the call answers JSON-RPC error -32000 with a retryAfter in seconds. A refused call is not itself a tool call, so it does not hold the window open; a JSON-RPC batch is not accepted at all: it is refused with -32600 before any tool runs and costs nothing. Each accepted send, campaign and import is also written to your audit log as mcp.email_sent, mcp.broadcast_sent or mcp.contacts_imported, naming the connected app.

Keeping an assistant in check

An assistant acts for you, so it should act the way you would. Five things keep it there, and every one of them works today.

  • Your client asks first. Every tool says whether it reads, changes or sends, and Claude and ChatGPT use that to ask you before anything that changes or sends. Keep asking on for send_email and send_broadcast.
  • A campaign needs your go-ahead. create_broadcast only drafts it, preview_broadcast shows you who it reaches, and send_broadcast runs only with the token that preview returned. You can still cancel_broadcast a scheduled one.
  • Ask only for the scopes you need. Without a toolset, a client asks you to approve every scope its tools use. With one, it asks only for that toolset's scopes, and a tool whose scope you did not approve does not exist for that connection.
  • Load only the toolsets you need. Connect with ?toolset=setup,send and the audience and marketing tools are not there at all.
  • Everything is on the record. Every call is in your Logs, the budgets above cap a busy assistant, and you can revoke the app from Settings → Team → Authorized apps at any moment.

Connect

The server is at https://api.rasket.com/mcp. Every client signs in the same way: it opens a browser, you sign in to Rasket, pick the team and approve the scopes. No API key is involved. Rasket for Claude shows what to ask for once you are connected.

claude.ai

  1. Open Customize, then Connectors.
  2. Choose +, then Add custom connector. Name it Rasket and paste https://api.rasket.com/mcp. Leave the advanced settings empty.
  3. Choose Connect, sign in to Rasket, pick the team and approve.
  4. In a chat, turn Rasket on from the + menu under Connectors.

On a Team or Enterprise plan an owner adds the connector once, under Organization settings → Connectors. Each member then connects it with their own Rasket account.

Claude Desktop

Claude Desktop uses the connectors on your claude.ai account. Add Rasket on claude.ai as above, then choose Connect in Desktop if it asks you to sign in.

Claude Code

One command. The client does the rest.

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

Then run /mcp in a session and choose Rasket to sign in.

ChatGPT

  1. Open Settings, then Apps & Connectors, then Advanced settings, and turn on Developer mode.
  2. Create a connector. Name it Rasket, paste https://api.rasket.com/mcp and choose OAuth.
  3. Sign in to Rasket, pick the team and approve.
  4. In a chat, turn Rasket on from the developer mode tools.

Developer mode needs a paid ChatGPT plan. ChatGPT moves these menus from time to time; the setting is always under Apps.

Other clients

Clients that take JSON take the same endpoint:

{
  "mcpServers": {
    "rasket": {
      "type": "http",
      "url": "https://api.rasket.com/mcp"
    }
  }
}

Only some toolsets

To load only some toolsets, name them in toolset, separated by commas, and the client asks you to approve only the scopes their tools use. Leave it out for all seven and every scope. A tool outside the named toolsets is not registered: it is missing from tools/list, a call to it is answered with the toolset to add, and that call counts against no budget. An unknown toolset name is JSON-RPC error -32602 before any tool runs.

claude mcp add --transport http rasket "https://api.rasket.com/mcp?toolset=setup,send"

In claude.ai or ChatGPT, paste the URL with the same ?toolset= on the end.

What happens when you connect

There is nothing else to configure. The first unauthenticated call is answered with a 401 whose WWW-Authenticate header names our protected-resource document, so the client discovers the authorization server, registers itself, and opens a browser for your approval. The same header names the scopes to ask for: every scope the tools use, or only the named toolsets'. You pick the team; it exchanges its code for a token.

An older connection may hold only the scopes setting up needs, and then has fewer tools than this page lists. Disconnect Rasket in your client and connect it again to approve the rest.

Every request to /api/v1 needs a User-Agent, and this one needs an Accept listing both application/json and text/event-stream. Every MCP client sends both already.

Nothing is remembered

The server is stateless. Each request builds a server, answers, and forgets: no session id, no stream, nothing kept between calls. GET on the endpoint is 405 — there is no stream to open — and DELETE is a 204 that does nothing, because there is no session to end.

Every tool call is logged like any other API request. It appears in your Logs with source of mcp, the tool it ran, and the connected app that ran it, so a send an assistant made is as traceable as one your own code made.