Manage Acumbamail email marketing: subscriber lists, subscribers, campaigns, templates, transactional email, SMS and list webhooks.
Acumbamail ships in the w6w first-party pack. It declares 32 actions, 2 health checks, and the host runs its code in a sandbox that never sees the credential.
io.w6w.acumbamailAcumbamail is an email and SMS marketing platform. This app drives its REST API from a workflow.
Create and delete subscriber lists, read their stats and fields, add merge fields; add, batch-add, search, unsubscribe and delete subscribers; create and send campaigns and read their totals, openers, clickers, links and ISP/browser/OS breakdowns; create and duplicate templates; send a transactional email or SMS; and configure a list’s event webhook.
Acumbamail’s API is a flat set of named functions (https://acumbamail.com/api/1/{function}/) authenticated by a per-account auth token; the vendor documents several functions with per-minute request limits, and answers 429 past them.
Three routes to the same 32 actions. The Workflow tab is generated from Acumbamail's own manifest and carries its real ids, so it is copy-pasteable; the Code and CLI examples are the same call for any action on any app, so every app-specific value in them is a blank you fill in.
campaign-browser-stats-get Openers of a campaign split by browser (limit: 10 requests per minute).
campaign-clicks-list Subscribers who clicked a campaign, with the click date (limit: 10 requests per minute).
campaign-create Create a campaign and send it (immediately, or at Send date when scheduled). Returns the campaign ID, or the vendor error text if it could not be sent. Not safe to retry.
campaign-isp-stats-get Opened emails of a campaign split by ISP (limit: 10 requests per minute).
campaign-links-get Every URL in a campaign and who clicked each (limit: 10 requests per minute).
campaign-openers-list Subscribers who opened a campaign, with the date (limit: 10 requests per minute).
campaign-os-stats-get Openers of a campaign split by operating system (limit: 10 requests per minute).
campaign-totals-get Delivered, opened, unopened, hard/soft bounces, complaints, unsubscribes, total sent and unique clicks (limit: 10 requests per minute).
campaigns-list Names and IDs of campaigns, optionally filtered by date range and status (limit: 10 requests per minute).
email-send Send one transactional email, with either an HTML body or a template. Not safe to retry (each call sends a message).
list-fields-get Every field of a list: identifier, merge tag, name, type, options (for list-type fields) and visibility.
list-get-all Return every subscriber list in the account, indexed by list ID (limit: 5 requests per second).
list-stats-get Name, creation date, subscriber/unsubscribe/bounce/complaint counts and average opens, unique clicks and bounces over the last 20 sent campaigns (limit: 10 requests per minute).
list-subscriber-stats-get What each subscriber of a list did with each campaign they received, 100 subscribers per block (limit: 10 requests per minute).
list-webhook-configure Set a list's event webhook (limit: 10 requests per minute). Returns the webhook ID.
merge-fields-get The merge tags of a list mapped to their field type (limit: 10 requests per minute).
merge-tag-add Add a column (merge field) to a list (limit: 10 requests per minute). Adding an existing name is not documented, so this is not marked safe to retry.
sms-send Send one or more SMS messages in one call. Returns per-message status in send order. Not safe to retry.
stats-by-date-get Grouped statistics of the campaigns sent to a list within a date range (limit: 10 requests per minute).
subscriber-add Add (or, with Update existing, modify) a subscriber on a list. Returns the subscriber ID, or {email, id} with Complete JSON.
subscriber-details-get Advanced data about one subscriber of one list (limit: 5 requests per second).
subscriber-search Find a subscriber by email across every list they belong to, with their advanced data (limit: 10 requests per minute).
subscriber-unsubscribe Mark a subscriber of a list as unsubscribed (keeps the record).
subscribers-batch-add Add up to 1000 subscribers to a list in one call (limit: 5 requests per second). Returns one entry per subscriber: the new ID or its error.
subscribers-list Subscribers of a list, indexed by email, in blocks of up to 10,000 (limit: 10 requests per minute).
template-create Create a template, or update one when Template ID is given. Returns the template ID (empty if not created). Not marked safe to retry as a create.
template-duplicate Copy a template under a new name; returns the new template ID. Each call creates another copy.
templates-list Templates with their ID, name and availability (limit: 1 request per second).
A workflow step names the app and the action, and the editor fills in the
connection when you pick one. This is the Step shape from the
workflow spec, carrying Acumbamail's real ids.
{
"manifestVersion": "2",
"name": "acumbamail-example",
"steps": [
{
"id": "campaign-browser-stats-get",
"uses": {
"app": "io.w6w.acumbamail",
"action": "campaign-browser-stats-get",
"connection": "conn_YOUR_CONNECTION_ID"
},
"with": {
"campaign_id": "<campaign_id>"
}
}
]
}campaign-browser-stats-get campaign-clicks-list campaign-create campaign-info-get campaign-isp-stats-get +27 more actions available
Every app-specific value here is a blank you have to fill in. An
app action is reached through the connection that authenticates it, so the
address is a connection id, not the app id — and connections belong to your account,
so a public page cannot know yours. Create one for Acumbamail, then fill in
the three blanks: conn_YOUR_CONNECTION_ID, the action key, and the
parameters that action declares. The call itself is real — the shape is transcribed
from the studio's own snippet builder, which prints the same kind of blanks — but
nothing in it is specific to Acumbamail. The Workflow tab is where this app's
real ids are.
npm install @w6w/sdkyarn add @w6w/sdkpnpm add @w6w/sdkdeno add npm:@w6w/sdkimport { W6wClient, isActionRun } from "@w6w/sdk";
// Reads W6W_BASE_URL and W6W_TOKEN from the environment when omitted.
const client = new W6wClient();
const envelope = await client.run({
urn: "conn_YOUR_CONNECTION_ID",
action: "campaign-browser-stats-get",
payload: {
campaign_id: "<value>",
},
});
if (isActionRun(envelope)) console.log(envelope.value); npm install -g @w6w/cli w6w run conn_YOUR_CONNECTION_ID --action campaign-browser-stats-get --payload '{"campaign_id":"<value>"}' Give an AI agent Acumbamail — without giving it Acumbamail's credentials. One MCP endpoint exposes every app, function and workflow the caller is entitled to, as tools it can discover and run. Access is granted per team while we onboard.
One tool call{
"name": "w6w_invoke",
"arguments": {
"ref": "app:io.w6w.acumbamail#campaign-browser-stats-get",
"input": {
"campaign_id": "<campaign_id>"
}
}
}
Every tool names its target with a single ref. The
app: form above doesn't name a connection at all — the
host resolves which of the caller's Acumbamail connections to sign
with, and refuses rather than guesses when the answer is ambiguous.
The token is attached host-side, at the moment of the call. It is never a tool argument, never in the model's context, and never in a transcript — so a prompt injection has nothing to exfiltrate.
Tools are derived per end user from what that person has actually connected and is entitled to — not one shared bot identity carrying the union of everyone's access.
Multi-step work runs on the workflow engine and returns a run handle the agent can poll — retries, branching and state survive the conversation that started them.
Acumbamail's declared health checks are on the surface too, so an agent can tell "the vendor is down" from "your credential expired" before it burns a retry on either.
The MCP surface is part of the hosted platform. Acumbamail itself is MIT, and the runtime that executes it is source-available (FSL).
Acumbamail declares its own checks, so its health is a property of the app rather than something the host guesses at.