First-party app
Kit

Kit

Manage Kit (formerly ConvertKit) subscribers, tags, forms, sequences, broadcasts, and custom fields via the Kit API v4.

stable MarketingEmail

About

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.

App id
io.w6w.kit
Version
0.1.3
Author
w6w
Licence
MIT
Categories
Marketing · Email

Overview

Kit (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.

Build with Kit

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-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-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

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-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-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-tag

Create a tag. Idempotent on name, matched case-insensitively — an existing name returns the existing tag rather than a duplicate.

Get Account

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

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

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

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-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

List forms and landing pages, one cursor page at a time. Defaults to `active` forms.

List Sequences

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

List subscribers, one cursor page at a time. Defaults to `active` only — widen with `status`, or look a single subscriber up by exact `emailAddress`.

List Tags

list-tags

List the account's tags, one cursor page at a time.

Remove Tag From Subscriber

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

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-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>"
      }
    }
  ]
}

Here are some of the things you can do

  • Add Subscriber To Form

    perform
    add-subscriber-to-form
  • Add Subscriber To Sequence

    perform
    add-subscriber-to-sequence
  • Create Broadcast

    perform
    create-broadcast
  • Create Custom Field

    perform
    create-custom-field
  • Create Subscriber

    perform
    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.

Install
npm install @w6w/sdk
yarn add @w6w/sdk
pnpm add @w6w/sdk
deno add npm:@w6w/sdk
Code
import { 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);
Install the CLI
npm install -g @w6w/cli
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.

What the agent gets

Credentials it can't read

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.

A tool surface scoped to the caller

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.

A durable workflow in one call

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.

Health-aware discovery

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).

Request MCP access

Health checks

Kit declares its own checks, so its health is a property of the app rather than something the host guesses at.

service

Kit platform status

Atlassian Statuspage rollup for status.kit.com, with per-component detail (API, Email sending, Application, Integrations). Unauthenticated and unsigned.

quota

API rate-limit headroom