Manage Kit (formerly ConvertKit) subscribers, tags, forms, sequences, broadcasts, and custom fields via the Kit API v4.
Kit ships in the w6w first-party pack. It declares 18 actions, 2 health checks, and the host runs its code in a sandbox that never sees the credential.
io.w6w.kitKit (formerly ConvertKit) brings a creator’s email list into a workflow: adding and updating the people on it, applying tags for segmentation, feeding them into signup forms and automated sequences, sending one-off broadcasts, and tracking whatever custom data points a creator keeps on each subscriber, on Kit’s current v4 API. Subscriber actions create, read, list and update people on a list, while tag actions create tags and apply or remove them from a subscriber.
Form and sequence actions add an existing subscriber into a signup form’s funnel or an automated email sequence — though Kit requires the subscriber to already exist, so creating one comes first in any workflow that needs both. Broadcast actions list, read and create the one-off emails sent to a list, and custom field actions manage the extra data points a creator tracks about each subscriber.
Three routes to the same 18 actions. The Workflow tab is generated from Kit'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.
add-subscriber-to-form Add an existing subscriber to a form by email address. Kit requires the subscriber to exist already — create them with Create Subscriber first, or this returns 404.
add-subscriber-to-sequence Add an existing subscriber to a sequence by email address. Kit requires the subscriber to exist already — create them with Create Subscriber first, or this returns 404.
create-broadcast Draft or schedule a broadcast. Omit `sendAt` to save a draft; supply an ISO 8601 `sendAt` to schedule it. Targeting is optional and defaults to every subscriber.
create-custom-field Create a custom field. The label must be unique to the account; Kit derives the `key` from it (ASCII, lowercased, underscored) and that key is what Create/Update Subscriber use under `fields`.
create-subscriber Create a subscriber. Behaves as an upsert — an existing email address has its first name updated rather than being duplicated. Kit does not support changing `state` through this endpoint once the subscriber exists.
create-tag Create a tag. Idempotent on name, matched case-insensitively — an existing name returns the existing tag rather than a duplicate.
get-account Return the authenticated account and user: id, name, plan type, primary email, timezone, and the account's sending addresses with verification and DMARC status.
get-broadcast Return one broadcast's full record: subject, HTML content, preview text, targeting, email template, send schedule and web-publishing details. Engagement stats are not included.
get-subscriber Return one subscriber by id: first name, email address, state, creation date, and custom field values under `fields`. To look up by email instead, use List Subscribers with `emailAddress`.
list-broadcasts List broadcasts with their content, targeting and publishing settings, one cursor page at a time. Delivery and engagement stats are not included in this response.
list-custom-fields List the account's custom fields, one cursor page at a time. Each carries the `key` that Create Subscriber and Update Subscriber expect under `fields`.
list-forms List forms and landing pages, one cursor page at a time. Defaults to `active` forms.
list-sequences List the account's sequences with their schedule defaults and the `active` / `repeat` / `hold` toggles, one cursor page at a time.
list-subscribers List subscribers, one cursor page at a time. Defaults to `active` only — widen with `status`, or look a single subscriber up by exact `emailAddress`.
remove-tag-from-subscriber Remove a tag from a subscriber by subscriber id. The subscriber stays in the account and keeps their other tags. Returns no content.
tag-subscriber Apply a tag to an existing subscriber by email address. Returns 200 when the subscriber already carries the tag, so re-tagging is safe. The subscriber must already exist.
update-subscriber Update a subscriber's email address, first name, and custom field values. Kit requires `emailAddress` on every update. A maximum of 140 custom fields may be set at a time.
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 Kit's real ids.
{
"manifestVersion": "2",
"name": "kit-example",
"steps": [
{
"id": "add-subscriber-to-form",
"uses": {
"app": "io.w6w.kit",
"action": "add-subscriber-to-form",
"connection": "conn_YOUR_CONNECTION_ID"
},
"with": {
"formId": "<formId>",
"emailAddress": "<emailAddress>"
}
}
]
}add-subscriber-to-form add-subscriber-to-sequence create-broadcast create-custom-field create-subscriber +13 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 Kit, 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 Kit. 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: "create-subscriber",
payload: {
emailAddress: "<value>",
// firstName: "<value>",
// state: "<value>",
// fields: "<value>",
},
});
if (isActionRun(envelope)) console.log(envelope.value); npm install -g @w6w/cli w6w run conn_YOUR_CONNECTION_ID --action create-subscriber --payload '{"emailAddress":"<value>"}' Give an AI agent Kit — without giving it Kit'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.kit#add-subscriber-to-form",
"input": {
"formId": "<formId>",
"emailAddress": "<emailAddress>"
}
}
}
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 Kit 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.
Kit'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. Kit itself is MIT, and the runtime that executes it is source-available (FSL).
Kit declares its own checks, so its health is a property of the app rather than something the host guesses at.
Atlassian Statuspage rollup for status.kit.com, with per-component detail (API, Email sending, Application, Integrations). Unauthenticated and unsigned.