Manage Action Network people, tags, petitions, events, forms, fundraising pages, advocacy campaigns and mass email, and record signatures, RSVPs, submissions, donations and outreaches.
Action Network ships in the w6w first-party pack. It declares 70 actions, 3 health checks, and the host runs its code in a sandbox that never sees the credential.
io.w6w.actionnetworkAction Network is the online organizing platform used by progressive groups, campaigns and unions. This app reads and writes its v2 API (OSDI, HAL+JSON): it creates and updates people (with tags and custom fields), tags and untags them, and manages petitions, events, forms, fundraising pages, advocacy (letter and call) campaigns and event campaigns.
It records what people do on those pages, creating or updating the person in the same call: petition signatures, event RSVPs and check-ins, form submissions, donations and outreaches. It lists and reads the saved queries, email wrappers and lists behind mass email, and creates, edits, schedules, sends and stops messages.
Health checks verify the API key and whether the public API entry point is answering. Action Network publishes no status page or rate-limit signal, and both are declared as such. Surveys, unique ID lists, list items and custom-field metadata are not covered.
Three routes to the same 70 actions. The Workflow tab is generated from Action Network'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.
advocacy-campaign-create Create a advocacy campaign through the API. A letter (email) or call (phone) campaign that outreaches are recorded against.
advocacy-campaign-list List advocacy campaigns visible to the API key, 25 per page, with an optional OData filter.
advocacy-campaign-update Change fields on a advocacy campaign. Only the fields you set are sent; nothing is removed unless you clear it.
attendance-get Fetch one attendance by id, under its event or under the person. Give exactly one of the two.
attendance-list List attendances: people who RSVPed to an event. Scope by event or by person. Give exactly one of the two.
attendance-record Record that a person RSVPed to an event, creating or updating the person in the same call. A person RSVPs once; recording again replaces the earlier RSVP.
campaign-list List campaigns: a campaign page created in Action Network's interface. The API only reads them.
donation-get Fetch one donation by id, under its fundraising page or under the person. Give exactly one of the two (or neither, for the account-wide route).
donation-list List donations: people who donated. Scope by fundraising page or by person. With neither id it lists every one on the account.
donation-record Record a donation made elsewhere against a fundraising page, creating or updating the donor in the same call. Moves no money. Donations are not deduplicated, so recording twice records two.
embed-get Get the copy-and-paste JavaScript that embeds an action's page on any website, in six style variants. Only actions created in Action Network's own interface have one.
event-campaign-create Create a event campaign through the API. Groups events under one heading; add events with Create Event in Event Campaign.
event-campaign-event-create Create an event under an event campaign. Events in a campaign with vetting enabled start as pending_approval.
event-campaign-list List event campaigns visible to the API key, 25 per page, with an optional OData filter.
event-campaign-update Change fields on a event campaign. Only the fields you set are sent; nothing is removed unless you clear it.
event-create Create a event through the API. API-created events have no public page, send no autoresponse or reminders and have no manage page; they appear in targeting once they have an RSVP.
event-list List events visible to the API key, 25 per page, with an optional OData filter.
event-update Change fields on a event. Only the fields you set are sent; nothing is removed unless you clear it.
form-create Create a form through the API. API-created forms have no public page; submissions are recorded through the API.
form-update Change fields on a form. Only the fields you set are sent; nothing is removed unless you clear it.
fundraising-page-create Create a fundraising page through the API. An API-created page takes no payments itself; donations are recorded against it with Record Donation.
fundraising-page-list List fundraising pages visible to the API key, 25 per page, with an optional OData filter.
fundraising-page-update Change fields on a fundraising page. Only the fields you set are sent; nothing is removed unless you clear it.
list-list List lists: a list: the report or email audience behind a mass email. Read-only.
message-cancel-schedule Cancel a scheduled message so it will not send at its scheduled time.
message-create Create a message through the API. Creating starts targeting at once, so the message sits in `calculating` until it returns to `draft`; poll Get Message. The vendor allows ONE create per 30 seconds and rejects faster ones with a rate-limit error.
message-list List messages visible to the API key, 25 per page, with an optional OData filter.
message-schedule Schedule a draft message to send at a future UTC time. It must have subject, body, from and reply-to, be in draft status, and target at least one person; wait for targeting to finish after creating it.
message-send Send a draft message to its targeted list NOW. It must have subject, body, from and reply-to, be in draft status, and target at least one person. This emails real people and cannot be undone once sent.
message-stop-send Stop a message that is partway through sending. Anything already delivered stays delivered.
message-update Change fields on a message. Only the fields you set are sent; nothing is removed unless you clear it.
outreach-get Fetch one outreach by id, under its advocacy campaign or under the person. Give exactly one of the two.
outreach-list List outreaches: people who wrote or called a target. Scope by advocacy campaign or by person. Give exactly one of the two.
outreach-record Record that a person wrote or called a target on an advocacy campaign, creating or updating the person in the same call. Takes one target.
person-list List the people on the list tied to the API key, in every subscription status. 25 per page; the vendor omits total counts and does not order by newest.
person-signup Create a person, or update the one matching the email or phone, and optionally tag them. Matching is by email address and phone number; a new person is subscribed to the key's list unless you pass a status.
person-update Change fields on a person by id. Only the fields you set are sent. Changing an email to one that already belongs to another person is silently ignored and the unchanged person comes back.
petition-create Create a petition through the API. API-created petitions have no public page on actionnetwork.org, send no autoresponse and have no manage page; they appear in targeting once they have a signature.
petition-list List petitions visible to the API key, 25 per page, with an optional OData filter.
petition-update Change fields on a petition. Only the fields you set are sent; nothing is removed unless you clear it.
query-list List queries: a saved targeting query. Read-only; ids go into Create Message targets.
signature-get Fetch one signature by id, under its petition or under the person. Give exactly one of the two.
signature-list List signatures: people who signed a petition. Scope by petition or by person. Give exactly one of the two.
signature-record Record that a person signed a petition, creating or updating the person in the same call. A person signs a petition once; recording again replaces the earlier signature. Does not send an autoresponse unless asked.
submission-get Fetch one submission by id, under its form or under the person. Give exactly one of the two.
submission-list List submissions: people who submitted a form. Scope by form or by person. Give exactly one of the two.
submission-record Record that a person submitted a form, creating or updating the person in the same call. Use tags and custom fields to carry what they submitted; a submission has no fields of its own.
tag-create Create a tag by name. Names are unique: creating an existing name returns the existing tag. PUT and DELETE on tags are not allowed by the vendor. Group API keys only.
tag-list List the group's tags, 25 per page. Tags exist only for group API keys; a personal key is refused.
tagging-create Put an existing tag on an existing person. A person carries a tag once; tagging again replaces the old tagging. To tag by name while creating or updating a person, use Create or Update Person instead.
tagging-delete Delete a tagging, removing the tag from that person. Needs the tagging id (from List Taggings), not the person id. To untag by name, use Create or Update Person with Remove tags.
tagging-list List the taggings on a tag, one per tagged person, 25 per page. A tagging carries its own id (needed to remove the tag) but only a link to the person.
wrapper-list List wrappers: an email wrapper (header and footer HTML) applied to mass emails. Read-only; ids go into Create Message.
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 Action Network's real ids.
{
"manifestVersion": "2",
"name": "actionnetwork-example",
"steps": [
{
"id": "advocacy-campaign-create",
"uses": {
"app": "io.w6w.actionnetwork",
"action": "advocacy-campaign-create",
"connection": "conn_YOUR_CONNECTION_ID"
},
"with": {
"originSystem": "<originSystem>",
"title": "<title>"
}
}
]
}advocacy-campaign-create advocacy-campaign-get advocacy-campaign-list advocacy-campaign-update attendance-get +65 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 Action Network, 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 Action Network. 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: "advocacy-campaign-create",
payload: {
originSystem: "<value>",
title: "<value>",
// name: "<value>",
// description: "<value>",
// browserUrl: "<value>",
// tagList: "<value>",
// type: "<value>",
// targets: "<value>",
},
});
if (isActionRun(envelope)) console.log(envelope.value); npm install -g @w6w/cli w6w run conn_YOUR_CONNECTION_ID --action advocacy-campaign-create --payload '{"originSystem":"<value>","title":"<value>"}' Give an AI agent Action Network — without giving it Action Network'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.actionnetwork#advocacy-campaign-create",
"input": {
"originSystem": "<originSystem>",
"title": "<title>"
}
}
}
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 Action Network 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.
Action Network'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. Action Network itself is MIT, and the runtime that executes it is source-available (FSL).
Action Network declares its own checks, so its health is a property of the app rather than something the host guesses at.
Unauthenticated GET of the public API entry point (/api/v2/). A 200 HAL document naming Action Network and linking osdi:people is the healthy answer; credential validity is the `auth:api-key` check's job.