PostHog MCP Server
Official PostHog MCP Server for product analytics, feature flags, experiments, and more.
Email infrastructure for AI agents: send, read replies as threads, campaigns, per-key limits.
使っているAIアプリを選んで、設定をコピーしてください。
チェック 5/5 合格 · 質問内容は提供元のサーバー(mcp.sendraven.ai)を通ります · ✓ コマンド確認済み 2026年11月13日
まず:どの AI を使っていますか?
使っているアプリを選ぶと、下に手順が表示されます。
Claude につなげます · 約 2 分
キー不要、インストール不要 · claude.ai かデスクトップアプリで一度設定すれば、チャットで使えます · 無料アカウントは 1 つまで · Team/Enterprise はオーナー(Owner)が追加
CustomizeConnectors
ここからコピーして Claude の同じ名前の欄に貼り付け、Continue を押します
Sendraven MCPhttps://mcp.sendraven.ai/mcpClaude が検出したサインイン設定の画面で Continue を押す · Authentication は作者の説明どおり(Sign in now・Sign in when needed・No sign in)を選び Add を押します
+ConnectorsSendraven MCP
Sendraven MCP を使って、私に何ができるか教えて、1 つやってみせて✓ Claude が Sendraven MCP を使っていると言うか、回答に Sendraven MCP のツール名が出れば接続成功です
メニュー名は 2026年11月11日 に Anthropic のヘルプページで確認 · アプリのバージョンにより画面が少し違うことがあります
ChatGPT との接続はプランしだい
フル MCP:Web 版 ChatGPT の Business・Enterprise・Edu · Pro:読み取り/取得の権限で接続、データを変えるツールは使えないことがあります · Plus:公式ドキュメントで未確認。プラグイン画面にカスタム MCP を追加する項目があれば試せます · Web のみ
Plugins+Add custom MCP server
名前を入れ、Connection にアドレスを貼り付け、注意事項にチェックして Create as a plugin を押します
Sendraven MCPhttps://mcp.sendraven.ai/mcp新しいチャットを開き、入力前にプラグインの一覧から Sendraven MCP を選びます
Sendraven MCP を使って、私に何ができるか教えて、1 つやってみせて✓ ChatGPT が Sendraven MCP を使っていると言うか、回答に Sendraven MCP のツール名が出れば接続成功です
メニュー名は 2026年11月11日 に OpenAI のヘルプページで確認 · アプリのバージョンにより画面が少し違うことがあります
Claude Code につなげます · 約 2 分
キー不要、インストール不要
Mac:Command+スペースで Terminal と入力 · Windows:PowerShell を開く
claude mcp add --transport http --scope user sendraven https://mcp.sendraven.ai/mcpSendraven MCP が一覧にあり、接続済みと表示されれば OK です
Sendraven MCP を使って、私に何ができるか教えて、1 つやってみせて✓ Claude Code が Sendraven MCP を使っていると言うか、回答に Sendraven MCP のツール名が出れば接続成功です
メニュー名は 2026年11月11日 に Anthropic のヘルプページで確認 · アプリのバージョンにより画面が少し違うことがあります
Cursor につなげます · 約 2 分
キー不要、インストール不要
Sendraven MCP を使って、私に何ができるか教えて、1 つやってみせて✓ Cursor が Sendraven MCP を使っていると言うか、回答に Sendraven MCP のツール名が出れば接続成功です
メニュー名は 2026年11月11日 に Cursor のヘルプページで確認 · アプリのバージョンにより画面が少し違うことがあります
VS Code につなげます · 約 2 分
キー不要、インストール不要
Sendraven MCP を使って、私に何ができるか教えて、1 つやってみせて✓ VS Code が Sendraven MCP を使っていると言うか、回答に Sendraven MCP のツール名が出れば接続成功です
メニュー名は 2026年11月11日 に VS Code のヘルプページで確認 · アプリのバージョンにより画面が少し違うことがあります
Windsurf、Zed、Gemini CLI など MCP を使える他のアプリは追加方法がそれぞれ違います。アプリ一覧で確認してください
Web 経由でつなぐアプリ用のアドレス
https://mcp.sendraven.ai/mcpJSON 設定は下の「開発者向け」にあります
Claude Code
claude mcp add --transport http --scope user sendraven https://mcp.sendraven.ai/mcpCursor (~/.cursor/mcp.json)
{
"mcpServers": {
"sendraven": {
"url": "https://mcp.sendraven.ai/mcp"
}
}
}VS Code (mcp.json)
{
"servers": {
"sendraven": {
"type": "http",
"url": "https://mcp.sendraven.ai/mcp"
}
}
}Claude Code
claude mcp add --scope user sendraven --env SENDRAVEN_API_KEY=your-value -- npx -y @sendraven/mcpClaude Desktop (claude_desktop_config.json)
{
"mcpServers": {
"sendraven": {
"command": "npx",
"args": [
"-y",
"@sendraven/mcp"
],
"env": {
"SENDRAVEN_API_KEY": "your-value"
}
}
}
}Cursor (~/.cursor/mcp.json)
{
"mcpServers": {
"sendraven": {
"command": "npx",
"args": [
"-y",
"@sendraven/mcp"
],
"env": {
"SENDRAVEN_API_KEY": "your-value"
}
}
}
}VS Code (mcp.json)
{
"servers": {
"sendraven": {
"type": "stdio",
"command": "npx",
"args": [
"-y",
"@sendraven/mcp"
],
"env": {
"SENDRAVEN_API_KEY": "your-value"
}
}
}
}SENDRAVEN_API_KEY 秘密 必須 envこの設定は、作者のレジストリ登録情報から作成しています。READMEと違う場合は、READMEに従ってください。
npm: @sendraven/mcpこのサーバーのつなぎ方と、各アプリの公式ドキュメントに基づきます。2026年11月10日に確認。
インターネット経由でつなげるアプリ
ClaudeChatGPTGooseLM StudioMsty StudioCherry StudioCursorVS Code + GitHub CopilotVisual StudioWindsurf (Devin Desktop)ZedKiroClineContinueJetBrains AI AssistantClaude CodeCodex CLIGemini CLIOpenCodenodecodeWarpLibreChatOpen WebUIRaycast
パソコン上で動かせるアプリ
ClaudeGooseLM StudioMsty StudioCherry StudioCursorVS Code + GitHub CopilotVisual StudioWindsurf (Devin Desktop)ZedKiroClineContinueJetBrains AI AssistantClaude CodeCodex CLIGemini CLIOpenCodenodecodeWarpLibreChatRaycast
ツールの名前と説明は、サーバーが2026年11月13日に返したそのままの内容です。書いたのは作者で、私たちではありません。プレーンテキストとして表示しています。
send_emailSend a transactional email, immediately or scheduled. scheduled_at takes a relative phrase like 'in 3 days' or an ISO timestamp. The From domain must already be verified. Every accepted send answers with the same fields: id, status, thread_id, scheduled_at, skipped, reason and ap
list_emailsList messages newest first with their delivery status, including held, scheduled, skipped and failed ones and the mail campaigns and automations sent. Filter by status, recipient or tag. Paged: at most 100 per call; while has_more is true, next_cursor passed back as cursor with t
get_emailFetch one message with its full event timeline (send, delivery, bounce, complaint, open, click). The timeline shows why an email didn't arrive.
cancel_scheduled_emailCancel a scheduled email before it sends. Only works while status is 'scheduled': a message that has already started sending, or is in any other state, answers 409 invalid_state naming its status; a retry answers the same, and get_email shows where it stands. An unknown id answer
update_email_tagsAdd or remove tags on an email already sent, scheduled or held, to refile it for the tag filters of list_emails and list_threads. Removals apply first, then additions, so one call swaps a tag: remove_tags [{name:'recovery_case'}] (no value: every tag with that name) with add_tags
list_sending_domainsList sending domains with their verification status and the DNS records each one needs. Each record shows what is currently published, so this diagnoses a stuck verification. mail_from says whether SES has adopted the bounce. subdomain as the Return-Path: pending while SES polls
add_sending_domainRegister a sending domain and get back the DNS records to publish. It takes the domain mail is sent from — mail. and news. are provisioned beneath it and the right one is chosen per message, so a marketing complaint spike can never affect password reset delivery. subdomains names
verify_sending_domainRe-check a domain's DNS records now instead of waiting for the background monitor. Also restarts bounce-path (mail_from) verification when SES gave up before the MX record existed.
set_utm_tagsTurn UTM tags on or off for a sending domain, and set what they say. When on, every link in that domain's marketing HTML gets utm_source (default 'newsletter'), utm_medium (default 'email') and utm_campaign (the campaign's name or the automation's slug). A link that already has a
list_suppressionsList addresses we refuse to mail and why (hard_bounce, complaint, unsubscribe, manual, list_hygiene), newest first, each with its scope. When someone reports not receiving email, this shows whether the address is suppressed. email returns one address's suppressions directly; scan
add_suppressionStop sending to an address. Scope 'marketing' leaves transactional mail working; the default is 'all'. Reason 'unsubscribe' is a real opt-out: it also cancels the person's queued scheduled sends and ends their automation enrolments, which is what a person who asked to stop expect
remove_suppressionRemove a suppression so the address can be mailed again. A hard bounce means the address was rejected by the receiving server, and re-sending raises the bounce rate that AWS enforces on. The scope must match the stored one: removed: false means nothing was suppressed in that scop
create_broadcastCreate a campaign as a draft. Nothing is sent: preview_broadcast reports its reach and send_broadcast sends it. identity_id must be a marketing sending domain (see list_sending_domains; risk_class 'marketing'). topic_key must name an existing topic (list_topics); an unknown one i
get_broadcastOne campaign, with a 'progress' object while it is sending, paused or testing: how many addresses are still pending, sent, failed, or skipped because the person opted out after the campaign started. This is what tells a paused campaign that is still making progress from one that
get_broadcast_metricsHow a campaign did: sent, delivered, bounced, complained, unique opens and clicks, and open_rate and click_rate over delivered (null until something is delivered). Opens and clicks count only people: a security gateway that followed every link, or a mailbox that loaded every imag
list_broadcastsList campaigns, newest first, with their status. Paged: at most 100 per call; while has_more is true, next_cursor passed back as cursor returns the next page. Each row is the campaign object get_broadcast returns, live progress and A/B results included, without its html, which on
preview_broadcastHow many contacts a campaign would reach, and whether the reputation gate would allow it. It is the only way to see the size of a campaign without starting it. For an A/B test it also reports the sample size and per-variant count against the 100-per-variant floor; a send below th
send_broadcastSend a draft or scheduled campaign now, or schedule it with scheduled_at. This mails every contact in the segment and cannot be undone once started; preview_broadcast shows the count beforehand. Marketing mail must carry a postal address: a workspace without one is refused with 4
pick_broadcast_winnerDecide an A/B test now instead of waiting for decide_at. 'variant' names the winning key; without it the metric decides on the figures so far. The rest of the audience is then sent to the winner and cannot be redirected. Only a campaign in status 'testing' can be decided; anythin
resume_broadcastContinue a paused campaign now. It mails only the addresses still pending — the audience was frozen when the campaign started and everyone already reached is marked — so calling this twice cannot double-send. Only works on a paused campaign; anything else answers 409 invalid_stat
list_threadsList email conversations. awaiting_reply=true returns only the threads where someone has written in and no answer has been sent, which is what needs a response. A reply held for approval or scheduled does not count as sent: such a thread stays in that list with pending_reply true
get_threadRead a conversation as a chronological transcript of outbound and inbound messages. Inbound `text` already has quoted history and signatures stripped; `raw_text` holds the untrimmed body, for when the stripped version looks wrong. sender_authenticated says whether the sender is w
reply_to_messageReply to a message, keeping it on the same conversation. Sets the threading headers so the recipient's mail client shows it as part of the existing exchange rather than a new one, which send_email does not do. It is a send, so it answers exactly as send_email does and meets the s
mark_thread_handledClear a conversation's awaiting_reply flag without sending anything, for when the last inbound message needs no answer — a "thanks, all sorted" — so it stops appearing in list_threads with awaiting_reply=true. A reply sent only to clear the flag mails a person for bookkeeping; th
list_templatesList stored email templates and the variables each one needs. Unlike HTML composed at send time, templates carry the workspace's reviewed subject, copy and styling. They do not carry the unsubscribe footer: that is added at send time to marketing mail, whether or not it came from
render_templateRender a template with values, without sending, showing how the copy reads before it mails a real person. A missing variable answers 422 missing_variables with the list in `missing`; an unknown slug answers 404. Returns subject, html and text; text is null when the template has n
send_template_emailSend an email built from a stored template. Variable values are HTML-escaped on substitution, so they are safe to fill from user-supplied text. Nothing is sent when a value is missing: 422 missing_variables lists the names in `missing`, and a call with those filled in goes throug
list_mediaThe workspace's hosted images, newest first, each with id, filename, content_type, size, width, height and the url to use in an . Look here before uploading a logo the workspace probably already has. At most 100 per call; while has_more is true, next_cursor passed back as cursor
upload_mediaHost an image for use in email HTML: a logo or photo in a template, a campaign or an automation step. Returns a media object whose url goes in an ; it is served from the workspace's own tracking domain (https://link. /media/...), and the url is public to anyone who has it. Images
delete_mediaDelete a hosted image by id (from list_media). Its url stops working within minutes everywhere it is used: in email already delivered, and in any template, campaign or automation step that still references it, where it shows as a broken image. Nothing checks for references, and i
list_pending_approvalsList messages held for human approval, with their full content. A key configured to require approval drafts rather than sends; a person releases it. A send that returned status 'pending_approval' is waiting here, and retrying the send does not release it. Oldest first, each with
decide_approvalApprove or reject a held message. Approving releases it: it sends now, or at its scheduled_at when the draft was scheduled for later. If every recipient unsubscribed or was suppressed while it waited, nothing is sent and the answer says skipped: true with a reason (both always pr
list_automationsList multi-step email sequences and how many people are currently in each, with the id each one is enrolled by. Newest first, at most 100 per call; while has_more is true, next_cursor passed back as cursor returns the next page. A 'paused' automation holds its people on their cur
get_automationFetch one automation: its status, trigger, steps (each with the id and condition update_automation needs passed back), exit rules and how many people are in each state. The same object list_automations returns, for a caller that already holds the id. People themselves are listed
get_automation_metricsHow each step of an automation is doing: per current step, its step_id, position, sent, delivered, opened and clicked. Opens and clicks are unique people, counted only after link scanners are ruled out, so they are lower than raw hit counts and reflect readers. Use it to see wher
list_automation_enrollmentsThe people in one automation, newest enrolment first: each row has the email, status, current_step, next_due_at and, for a cancelled one, cancel_reason. It answers 'is this person still on the sequence?', 'who is waiting on step 2?' and 'why did this sequence stop for them?', whi
create_automationDefine a multi-step sequence as a draft; nothing is sent until it is activated, from the dashboard or with set_automation_status. Unlike several separately scheduled emails, it ends on its own when the person unsubscribes, replies, bounces, opts out of its topic, or their tags sa
update_automationChange a sequence's steps, the rules that take someone out of it (topic_key, exit_tags, required_tags, exit_on_reply), its reply_to, its reenrollment, or its default_variables (replaces the whole set; {} clears it). The trigger is fixed once created. steps replaces every step and
set_automation_statusActivate, pause or return an automation to draft. A new automation is a draft and sends nothing until it is set to 'active'. Pausing ('paused' or 'draft') holds everyone on their current step: nobody is sent a step and nobody new is enrolled, but nobody's sequence ends, and setti
delete_automationDelete an automation for good and cancel every active enrolment in it, so nobody is sent another step. Answers enrollments_canceled. It cannot be undone: to stop it for a while and continue everyone later, use set_automation_status with paused instead. Mail already sent and its h
enroll_in_automationPut someone into a multi-step sequence. Unlike several separately scheduled emails, the sequence stops on its own if they unsubscribe (from everything or from the automation's topic), reply, hard bounce, gain one of its exit tags, or lose one of its required tags, which would oth
emit_eventEmit a named event, starting every automation that waits on it — for example 'trial_started' or 'invoice_overdue'. The configured sequences decide what happens, rather than the caller naming an automation. Returns automations_started; 0 means nothing was waiting on that name or t
list_conversion_goalsList conversion goals: the event names counted as a conversion, each with its credit window in days. An emit_event call with one of these names is credited to the last email the person clicked inside that window; any other name is an ordinary event.
create_conversion_goalStart counting an event as a conversion, such as 'subscription_started' or 'purchase'. Counts only events emitted after this call; it does not go back over earlier ones. Use the exact name the app already passes to emit_event. A name that is already a goal answers 409 conflict, a
get_conversion_metricsAttributed conversions, converters and revenue per currency. Pass broadcast_id for a campaign, broken down per A/B variant with its sent count and rate, or automation_id for a sequence, broken down per step. The figures are attributed, not causal: each conversion counts for the l
list_topicsList subscription topics — the categories a person can opt out of individually. Marketing mail sent under a topic lets recipients unsubscribe from that kind alone rather than from everything.
get_email_preferencesWhat one person has chosen to receive. It shows whether someone who isn't getting a particular kind of email opted out of it — an opt-out looks identical to a delivery failure from the outside.
set_email_preferencesSet which topics a person receives, recording what they asked for — silently re-subscribing someone who opted out is what generates spam complaints. Every key must be an existing topic from list_topics: one unknown key refuses the whole call with 422 unknown_topic and nothing is
list_audiencesList contact lists, newest first, with each one's id and contact_count. Paged: at most 100 per call; while has_more is true, more lists are on later pages, returned when next_cursor is passed back as cursor.
add_contactAdd someone to an audience. A contact exists once per workspace and can be on any number of audiences, so adding an address that already exists joins them to this list rather than creating a second copy. status records that the person opted out elsewhere — it writes the suppressi
import_contactsImport up to 5,000 contacts into an audience in one call, with names, tags, custom properties and subscription status. This is the migration tool: the previous provider's unsubscribed, bounced and complained lists, imported with the matching status before the first campaign, keep
get_contactFetch one contact by id, with their audience memberships, custom properties and engagement dates.
update_contactUpdate a contact. Attributes are merged, so sending one field does not clear the rest. unsubscribed: true is a real opt-out: it suppresses the address for marketing, cancels their pending sends and ends their automation enrolments. unsubscribed: false lifts a marketing unsubscrib
list_segmentsList saved audience filters. A campaign created with a segment id, rather than a filter described inline, shares one definition that can be reused and counted.
list_tagsEvery tag in use in the workspace, with how many contacts carry each. Tags are free-form, so this is the only way to know what exists before applying one.
count_segmentHow many contacts a segment currently matches. A filter that matches nobody shows up here as 0, before any campaign is built around it or sent. Engagement windows and date conditions (e.g. attributes.trial_ends_at within_next_days 3) are measured from the moment of the call, so t
get_email_metricsDelivery and engagement over a window, for the whole workspace or narrowed to one campaign (broadcast_id) or one tag. Open and click rates are over delivered, not sent — a low open rate with a high bounce rate is a deliverability problem, not an engagement one. Filtered, each day
list_scheduled_emailsMessages queued to send later but not yet sent, newest first; cancel_scheduled_email cancels one. At most 100 per call; while has_more is true, next_cursor passed back as cursor returns the next page.
suppress_manyStop sending to many addresses at once — the path for importing another provider's unsubscribe list before a first campaign. Without it, everyone who already opted out there gets mailed again here. The defaults differ from add_suppression: scope 'marketing' and reason 'list_hygie
list_webhooksThe workspace's webhook endpoints: each with id, url, the events it receives and whether it is enabled. Read-only: endpoints are added and changed in the dashboard, because a tool that could point one at a new URL would let an agent route the workspace's mail events to itself. Us
誰でも見られる情報をチェックしており、コードは読んでいません。当てはまらない項目は数に入れていません。 · 2026年11月13日にチェック
質問、コツの共有、使えないことの報告ができます。「役に立った」の多い順です。
まだレビューはありません
レジストリでこのカテゴリにある有効なすべてのサーバーと比較しています。スターは、公開者がリポジトリの所有者である場合だけ数えます。
当てはまる基本チェック5項目のうち5項目に合格しました。コードは読んでいません。キーやトークンを追加する前に、サーバーがどんなアクセスを求めているかを確認し、必要な権限だけを持つキーを使ってください。
入力が必要なもの:SENDRAVEN_API_KEY
どちらでも使えます。パソコンにインストールしても、クラウド版につないでもかまいません。
GitHubリポジトリの最終更新は昨日、最新バージョン(0.4.32)がレジストリに届いたのは昨日です。
Claude Desktop、Claude Code、Cursor、VS CodeなどのMCP対応アプリで使えます。URL で接続するので、リモート MCP を受け付けるアプリでも使えます。例:Web 版 ChatGPT(Business 以上はフル MCP、Pro は読み取りのみ)。
同じカテゴリには:PostHog MCP Server, Openshorts, Google Ads + Meta Ads + SEO/GEO MCP
同じカテゴリで、ほかの作者が作ったサーバー。スターの多い順。
カードの見方:↓ 週あたりのダウンロードi★ GitHubスターi3つの柱:レビュー · チェック · 利用状況i更新=最新バージョンをレジストリに公開した日i
Official PostHog MCP Server for product analytics, feature flags, experiments, and more.
Turn long videos into viral vertical shorts and publish them to TikTok, Instagram and YouTube.
Google Ads, Meta Ads, Google Analytics (GA4) & Search Console MCP server by Ryze AI
作者のリポジトリから書かれたとおりにコピーしたものです。PopNx MCPは内容を確認・推奨していません。HTML、画像、スクリプトは取り除いています。リンクはこのサイトの外へ移動します。
The SendRaven MCP server. Send email, read replies as threads, run campaigns and automations, and decide approvals, from any client that speaks the Model Context Protocol.
SendRaven is email infrastructure for AI agents. Agents use it over REST or MCP to run real email conversations: sending, reading replies as threads, and running campaigns and automations, within limits and approvals set on the API key. It is priced per email sent, never per contact.
Claude Code, remote server, signs in with OAuth on first use:
claude mcp add --transport http sendraven https://mcp.sendraven.ai/mcp
Cursor, Claude Desktop, and other clients with a JSON config:
{
"mcpServers": { "sendraven": { "url": "https://mcp.sendraven.ai/mcp" } } }
Any client, as a local process. Create an API key under Developers in the dashboard, then:
claude mcp add sendraven -e SENDRAVEN_API_KEY=sk_live_… -- npx -y @sendraven/mcp
{
"mcpServers": { "sendraven": { "command": "npx", "args": ["-y", "@sendraven/mcp"], "env": { "SENDRAVEN_API_KEY": "sk_live_…" } } } }
Remote server with a key instead of OAuth, for an agent running unattended:
{
"mcpServers": { "sendraven": { "url": "https://mcp.sendraven.ai/mcp", "headers": { "Authorization": "Bearer sk_live_…" } } } }
Give an agent's key a daily send limit, a recipient allowlist, or an approval hold. The tools respect all three, campaigns included: a key with an approval hold or an allowlist cannot start a campaign, and a key with a daily limit can start one only if its recipients fit what is left of the day. See Limits for agents.
send_email returns pending_approval with an id. Report that it awaits a person; do not retry.get_usage reports plan, usage and remaining, so an agent can say "you are near your limit" before a batch.send_broadcast mails an audience; run preview_broadcast first. remove_suppression lets us mail an address that bounced or complained. Neither is a way to fix a failed send.decide_approval answers 403 when the client signed in with OAuth, when the key drafted the message, and when the key has any guardrail. Use the dashboard, or a key without guardrails.idempotency_key_reused and nothing is sent.HTTP 422 no_verified_identity, and a missing template variable lists the names in missing. Types mean the same thing on every tool; see Errors.63 tools, generated from the server's registry.
| Tool | What it does |
|---|---|
send_email | Send a transactional email, immediately or scheduled. scheduled_at takes a relative phrase like 'in 3 days' or an ISO timestamp. The From domain must already be verified. Every accepted send answers with the same fields: id, status, thread_id, scheduled_at, skipped, reason and approval_id. skipped: true (status 'rejected', with reason) means every recipient was suppressed or opted out and nothing was sent; a retry answers the same. status 'pending_approval' (with approval_id) means a person must release it; a retry does not release it. Otherwise skipped is false and reason and approval_id are null. idempotency_key makes a retry of the identical message safe; it matches only the identical message. Refusals, by type: 422 no_verified_identity (the From domain has no verified sending domain; a retry answers the same until it is added and verified); 422 invalid_request (a bad field, or more than 50 recipients across to, cc and bcc, which fit as separate messages or a campaign); 422 unknown_topic; 422 invalid_schedule; 403 recipient_not_allowed (this key's allowlist); 429 daily_limit (this key's daily cap; it resets tomorrow, and a retry today answers the same); four billing refusals, all 402 and none retryable — plan_limit_reached (the Free plan's 3,000 emails a month are spent; a person has to activate paid sending), payment_method_required (the workspace has never had a payment method verified, so no outbound email leaves it at all, including on Free; only a person can add one, in the dashboard), billing_past_due (the payment failed for good) and budget_exceeded (the workspace's own spend ceiling; by default it stops marketing and lets transactional through); 422 workspace_suspended and 422 no_postal_address (a person has to act). 502 ses_error is the provider, and a later retry with the same idempotency_key is safe. get_usage shows which of these applies before a send, and apart from ses_error none clears by repeating the call. |
list_emails | List messages newest first with their delivery status, including held, scheduled, skipped and failed ones and the mail campaigns and automations sent. Filter by status, recipient or tag. Paged: at most 100 per call; while has_more is true, next_cursor passed back as cursor with the same filters returns the next page. An unknown status is refused with 422 invalid_request rather than answering an empty log. |
get_email | Fetch one message with its full event timeline (send, delivery, bounce, complaint, open, click). The timeline shows why an email didn't arrive. |
cancel_scheduled_email | Cancel a scheduled email before it sends. Only works while status is 'scheduled': a message that has already started sending, or is in any other state, answers 409 invalid_state naming its status; a retry answers the same, and get_email shows where it stands. An unknown id answers 404 not_found. |
update_email_tags | Add or remove tags on an email already sent, scheduled or held, to refile it for the tag filters of list_emails and list_threads. Removals apply first, then additions, so one call swaps a tag: remove_tags [{name:'recovery_case'}] (no value: every tag with that name) with add_tags [{name:'category', value:'billing-recovery'}]. The thread and the dashboard's tag suggestions follow. Changes only what SendRaven stores, not what the provider already saw. Safe to repeat. Answers the email as get_email does. broadcast_id, set on campaign mail, cannot be changed (422 invalid_request), nor can a message end with more than 10 tags. An unknown id answers 404 not_found. |
list_sending_domains | List sending domains with their verification status and the DNS records each one needs. Each record shows what is currently published, so this diagnoses a stuck verification. mail_from says whether SES has adopted the bounce. subdomain as the Return-Path: pending while SES polls for its MX record, then active. SES polls for 72 hours from when the domain was added, not from when the MX appears, and then marks it failed; publishing the MX later and calling verify_sending_domain restarts it. A verified domain sends fine meanwhile; only SPF alignment waits. |
add_sending_domain | Register a sending domain and get back the DNS records to publish. It takes the domain mail is sent from — mail. and news. are provisioned beneath it and the right one is chosen per message, so a marketing complaint spike can never affect password reset delivery. subdomains names the pair differently (tx. and promo.), still one domain. risk_class provisions one identity on the domain exactly as given instead; it cannot be combined with subdomains. Two records come back marked optional: an inbound MX so replies land in threads, and a link. CNAME that turns on click tracking on the customer's own name once its certificate is issued. Adding a domain that already exists returns it rather than a duplicate. A public suffix such as co.uk or github.io is not a domain anyone can send from and is refused with 422 invalid_request; the domain registered under it, e.g. example.co.uk, is accepted. Passing mail.example.co.uk or news.example.co.uk is read as example.co.uk. A plan with no room for another domain answers 402 plan_limit_reached; a retry answers the same until a person upgrades or removes a domain. |
verify_sending_domain | Re-check a domain's DNS records now instead of waiting for the background monitor. Also restarts bounce-path (mail_from) verification when SES gave up before the MX record existed. |
set_utm_tags | Turn UTM tags on or off for a sending domain, and set what they say. When on, every link in that domain's marketing HTML gets utm_source (default 'newsletter'), utm_medium (default 'email') and utm_campaign (the campaign's name or the automation's slug). A link that already has any utm_ parameter is left as written, and unsubscribe links are never touched. Fields left out keep their value; a null source or medium restores the default. Answers the domain. |
list_suppressions | List addresses we refuse to mail and why (hard_bounce, complaint, unsubscribe, manual, list_hygiene), newest first, each with its scope. When someone reports not receiving email, this shows whether the address is suppressed. email returns one address's suppressions directly; scanning pages instead is how the wrong suppression gets cleared. At most 100 per call; while has_more is true, next_cursor passed back as cursor returns the next page. |
add_suppression | Stop sending to an address. Scope 'marketing' leaves transactional mail working; the default is 'all'. Reason 'unsubscribe' is a real opt-out: it also cancels the person's queued scheduled sends and ends their automation enrolments, which is what a person who asked to stop expects and 'manual' does not do. A hard bounce or complaint already on file is never replaced; the response is the stored suppression (id, email, reason, scope, detail, created_at), so its reason says which one stands. |
remove_suppression | Remove a suppression so the address can be mailed again. A hard bounce means the address was rejected by the receiving server, and re-sending raises the bounce rate that AWS enforces on. The scope must match the stored one: removed: false means nothing was suppressed in that scope (an address suppressed for 'marketing' is not lifted by 'all'); list_suppressions with email shows the scope that is stored. |
| create_broadcast | Create a campaign as a draft. Nothing is sent: preview_broadcast reports its reach and send_broadcast sends it. identity_id must be a marketing sending domain (see list_sending_domains; risk_class 'marketing'). topic_key must name an existing topic (list_topics); an unknown one is refused with 422 unknown_topic, since it would count everyone as opted out. A segment_id must filter the same audience as audience_id. An A/B test takes 2 to 10 'variants' that differ in subject, from_name or send_at, and optionally 'ab_test'. A subject or from-name test sends sample_share of the audience (default 0.2) split evenly across the variants, waits decide_after_minutes (default 240) after the sample is out, picks the variant with the best unique open rate (or click rate with metric 'click'), and sends the rest to it. Each variant needs at least 100 recipients in the sample or the send is refused — preview_broadcast shows the number. Metric 'click' only works once the domain has click tracking; until then every variant shows zero clicks and the first variant wins by default. The response's web_version_url is a public page of the campaign (one URL, no recipient's unsubscribe link) to share on a