Documentation Index
Fetch the complete documentation index at: https://developers.kit.com/llms.txt
Use this file to discover all available pages before exploring further.
🔧 POST /oauth/revoke now performs full partner-side cleanup
When a partner revokes a Kit-issued OAuth token, Kit now tears down the linked install state in the same request:- Any partner credentials Kit had stored for that account are queued for deletion.
- The Kit-side installation record is marked uninstalled, so the app no longer appears as installed for that account.
/oauth/revoke as a clean teardown signal can now rely on it as a single call.The HTTP contract of /oauth/revoke is unchanged; both the request and the success response remain identical.Full reference: OAuth token revocation🚀 Broadcast status field and ?status= filter on broadcast list endpoints
Every V4 broadcast response now includes a status field with one of draft, scheduled, sending, completed, or aborted. This removes the need to infer broadcast state from a mix of send_at, published_at, and other fields.GET /v4/broadcasts and GET /v4/broadcasts/stats also accept a new optional ?status= query parameter that filters to broadcasts in the given lifecycle state. Passing an unknown value returns 422 Unprocessable Entity with the list of accepted statuses. Omitting status preserves existing behaviour.Full reference: List broadcasts · Get stats for a list of broadcasts🚀 slim query parameter on /v4/subscribers and /v4/forms/:form_id/subscribers
Two more list endpoints now accept ?slim=true, extending the slim mode introduced for GET /v4/broadcasts and GET /v4/tags/:tag_id/subscribers on May 20. In slim mode, the fields object (custom field values) is omitted from each subscriber record and the underlying query skips the custom field join entirely, making large list responses noticeably faster.Default behaviour is unchanged — pass slim=true explicitly to opt in. On /v4/subscribers, slim composes with the existing include= parameter — the requested includes still resolve, slim only skips the fields block. /v4/forms/:form_id/subscribers doesn’t accept include=.Full reference: List subscribers · List subscribers for a form🚀 New subscriber_state filter on /v4/subscribers/filter
POST /v4/subscribers/filter accepts a new filter type: subscriber_state. Provide a states array of one or more lifecycle values — active, inactive, bounced, cancelled, or complained — and the filter returns subscribers whose current state matches any value in the array.subscriber_state composes with engagement, subscribed, and tags filters in the same request. since / before and any don’t apply to this type and are ignored when present.Most workflows want states: ["active"] — that mirrors the default scope of most other subscriber-facing queries in Kit.Full reference: Filter subscribers based on engagement🔧 OAuth refresh token rotation
Refresh tokens are now single-use. Each call toPOST /oauth/token with grant_type=refresh_token issues a new refresh token and revokes the previous one. Reusing an old refresh token returns invalid_grant.This affects every OAuth client connected to Kit — including App Store integrations and MCP clients. If you store the refresh token from the original authorisation flow and reuse it across multiple sessions, update your client to store and use the latest refresh token from each refresh response instead. Mainstream OAuth clients handle rotation natively; custom integrations that cache refresh tokens will need a small update.🔧 OAuth consent screen — DCR response now RFC 7591-aligned
Public OAuth clients (Dynamic Client Registration withconfidential: false) no longer receive client_secret or client_secret_expires_at in the DCR registration response. The token_endpoint_auth_method field is now none for public clients. The .well-known/oauth-authorization-server discovery document now advertises token_endpoint_auth_methods_supported: ["client_secret_post", "none"]. Existing well-formed DCR clients work without changes — this aligns the response with what the server already accepted.Full reference: OAuth refresh token flow🚀 New fields on V4 sequence responses
GET /v4/sequences and GET /v4/sequences/{id} now return two new fields: email_count and subscriber_count. email_count reflects published email templates only (drafts don’t count); subscriber_count reflects active subscribers. Both are available to all V4 callers (API key and OAuth) — no changes required on your end.🚀 New slim query parameter on heavy list endpoints
GET /v4/broadcasts and GET /v4/tags/:tag_id/subscribers now accept ?slim=true to skip expensive fields and database queries. For broadcasts, slim mode omits content, public_url, email_address, email_template, and subscriber_filter. For tag subscribers, it omits custom field values. Default behaviour is unchanged — pass slim=true explicitly to opt in.Full reference: List broadcasts · List subscribers for a tag · Get a sequence🚀 Visual Automation templates for all app developers
App developers can now build, submit, and publish Visual Automation templates directly from the developer portal — pre-built automations that creators preview and adopt the moment they install your app.- Templates move through Draft → In review → Approved → Published states, managed from your app’s Templates tab.
- Template review runs alongside app review — bundled with app review for unpublished apps, template-only for published apps.
- Editing a published template’s name, description, feature labels, or source automation auto-unpublishes it and sends it back for re-review. The last-approved version stays live for creators until re-approval.
- Deleting a template removes it from your catalogue; creators who’ve already adopted it keep their working copy.
- Once a creator adopts a published template, the automation editor is locked — they can see it but can’t change it.
🚀 Dynamic content blocks and Visual Automation context are now available to all developers
Two related capabilities are out of limited release and available to every Kit app developer.Dynamic content blocks — content block plugins that return a Liquid template instead of static HTML, so the rendered output is personalized per subscriber at send time. Configure your event plugin’s Sample data JSON on the Context card, link a content block to it viarelated_plugin_id, and reference subscriber data in Liquid as {{ automation.<app>.<event>.* }}. Full guide: Dynamic content blocks.Visual Automation context — event plugins can now attach an optional context object to each event, and Kit makes that context available everywhere downstream:- In sequence email Liquid (body, button URLs, links):
{{ automation.<app>.<event>.<field> }}. - On dynamic content block previews and per-subscriber renders.
- On action plugin request bodies as
subscribers[].context.apps.<app>.<event>.*— your action endpoint receives the same context your event plugin (or another app’s event plugin) attached upstream, with no extra lookup.
🚀 GET /v4/broadcasts/stats — enriched response and date filtering
GET /v4/broadcasts/stats now returns subject and send_at on every row by default. This eliminates the need for a follow-up GET /v4/broadcasts/:id call per row when building subject-line or send-time analyses.The endpoint also accepts two new optional query parameters:sent_after— filter to broadcasts sent after this ISO 8601 datetimesent_before— filter to broadcasts sent before this ISO 8601 datetime
per_page / after continues to work as documented.Plan gating: this endpoint requires a Pro plan or special developer authorisation. Requests from free accounts return 403.Full reference: /api-reference/broadcasts/get-stats-for-a-list-of-broadcasts🚀 Sequence Emails CRUD API
Full CRUD for the individual emails inside a sequence is now available on the V4 API:GET /v4/sequences/:sequence_id/emails— list emails in send order.contentis omitted by default; passinclude_content=trueto include it.GET /v4/sequences/:sequence_id/emails/:id— fetch a single email, always with full content.POST /v4/sequences/:sequence_id/emails— create an email (published: falseby default so it doesn’t go out until you flip it).PUT /v4/sequences/:sequence_id/emails/:id— update subject, content, timing, send days, position, or publish state.DELETE /v4/sequences/:sequence_id/emails/:id— remove an email; subscribers already queued for it will skip it.
delay_unit: "days" follows the sequence schedule, delay_unit: "hours" bypasses it and fires once the delay elapses (checked every 15 minutes). Per-email send_days overrides the sequence-level schedule (days mode only) — pass send_days: null to revert to inheriting it.Snippets are referenced inside content via {{ snippet.<key> }} and resolve at send time, so editing a snippet automatically updates every email referencing it without re-publishing.Full reference: /api-reference/sequence-emails/list-sequence-emails · /api-reference/sequence-emails/get-a-sequence-email · /api-reference/sequence-emails/create-a-sequence-email · /api-reference/sequence-emails/update-a-sequence-email · /api-reference/sequence-emails/delete-a-sequence-email🚀 GET /v4/subscribers now supports opt-in enrichment via include=
GET /v4/subscribers now accepts an include= query parameter that returns additional fields alongside the base subscriber record. Pass a comma-separated list of any of the following values:include=attribution— referrer, UTM parameters, and Kit source data per subscriberinclude=tags— array of{id, name}tag objectsinclude=location— city, state, country, lat, and lnginclude=canceled_at— ISO 8601 cancellation timestamp; requiresstatus=cancelled(returns422otherwise)
include=tags,location,canceled_at). Omitting include= leaves existing response shape and performance unchanged. Invalid values return 422 with the full list of accepted options.Full reference: /api-reference/subscribers/list-subscribers🚀 Snippets CRUD API
Snippets are now available on the V4 API:GET /v4/snippets— list snippets, withsnippet_typeandarchivedfilters.contentanddocumentare omitted by default — passinclude_content=trueto include them.GET /v4/snippets/:id— fetch a single snippet (always includes content).POST /v4/snippets— create a snippet.PUT /v4/snippets/:id— rename, update content, or archive/restore (passarchived: true/falsein the body).
content, and block snippets store rich HTML in document_attributes[value_html]. A snippet’s type is set on creation and cannot be changed via PUT.Each response includes a key field — that’s the identifier used to reference a snippet from a broadcast or sequence email via Liquid ({{ snippet.key }}). The API also rejects circular references (a snippet nesting itself) with a clear validation error.Full reference: /api-reference/snippets/list-snippets · /api-reference/snippets/get-a-snippet · /api-reference/snippets/create-a-snippet · /api-reference/snippets/update-a-snippet🚀 Help Text Hyperlinks
You can now use markdown formatting in the help field of all plugin component library. The following formatting is supported:- Hyperlinks: link text
- Bold: bold
- Italic: italic
🚀 Newsletter posts on the V4 API
Two new read-only endpoints expose newsletter posts on the V4 API — including drafts and web-only posts that weren’t reachable through broadcasts:GET /v4/posts— cursor-paginated list (up to 1000 per page). Passinclude_content=trueto return the full HTML body (off by default to keep responses small).GET /v4/posts/{id}— fetch a single post, always includescontent.
id, publication_id, title, slug, description, status, published_at, sent_at, thumbnail_url, is_paid, and public_url. Use publication_id to join a post back to its broadcast via GET /v4/broadcasts. Supports API key and OAuth2.Full reference: /api-reference/posts/list-posts · /api-reference/posts/get-a-post🚀 Sending addresses on the Account endpoint
TheGET /v4/account response now includes a sending_addresses array listing every sending address configured on the account. Each entry contains email_address, from_name, status, is_default, is_verified, and is_dmarc_configured. These addresses can be used when creating or updating any email via the API. Unverified addresses are included and marked with is_verified: false.Full reference: /api-reference/accounts/get-current-account🚀 Sequences CRUD API
Full CRUD support for sequences is now available on the V4 API. Five endpoints shipped:GET /v4/sequences— expanded to return the full sequence object (13 fields includingsend_days,time_zone,email_address,exclude_subscriber_sources)GET /v4/sequences/:id— fetch a single sequence by IDPOST /v4/sequences— create a sequence programmaticallyPUT /v4/sequences/:id— update sequence settingsDELETE /v4/sequences/:id— soft delete with background cleanup
🚀 Broadcast date filtering
GET /v4/broadcasts now supports sent_after and sent_before query parameters for server-side date filtering. Use both together to define a date range, or omit both to preserve existing unfiltered behaviour. Filters are applied before pagination, so page sizes and cursor behaviour remain consistent. Invalid date values return 422 with descriptive error messages.This enables incremental sync patterns — instead of fetching your full broadcast history and filtering client-side, call GET /v4/broadcasts?sent_after=2026-04-16 to retrieve only what’s changed since your last run.Full reference: developers.kit.com/api-reference/broadcasts/list-broadcasts🚀 Default values now supported across all plugin settings components
All plugin settings components now support an optionaldefault property that pre-fills the setting value when a creator first adds the component. Previously only available on Radio Group, Slider, Toggle, and Textarea, it is now also supported on:- Color Picker (string)
- Text Input (string)
- Numerical Input (number)
- Font Picker (object with
fontFamilyandfontWeight) - Select Input (string)
- Date Picker (string, UTC ISO8601)
default continue working unchanged.🔧 Going-live checklist prompt added to app submission
The Submit for Approval modal now displays a pre-submission checklist when you click “Submit for approval” in the Distribution tab, with a direct link to the going-live checklist. No changes to the submission API or review process.🚀 App Store Search
The Kit App Store now has free-text search. Creators can search by app name, category, or description with real-time debounced results and fuzzy/partial matching. The category filter has moved into a dropdown co-located with the search input. No API changes — this is an in-product UI feature available atapp.kit.com under Automate > Apps. See the App Store overview and app details page for context on the App Store surface.🔧 Purchases endpoints now return subscriber_id
The List Purchases and Get Purchase endpoints now includesubscriber_id in the response, eliminating the need for an extra API call to map a purchase to a subscriber.🚀 Kit Developer Docs MCP server
Connect your AI coding agent directly to Kit’s developer documentation using the Kit Developer Docs MCP server. Supported clients can query the full API reference on demand, make live API calls on your behalf, and spin up local OAuth servers for testing.🚀 Custom Field Webhooks & Bulk Updates
- Introduced 3 new webhook events for custom fields:
custom_field.field_created,custom_field.field_deleted, andcustom_field.field_value_updated, enabling real-time sync with third-party apps. - Added a bulk update endpoint (
POST /v4/bulk/custom_fields/subscribers) to update multiple custom field values for multiple subscribers in a single API call. - Learn more about webhooks and bulk updates.
🚀 Transparent color option now available in color picker
The color picker component now supports anallow_transparent property that displays a “Transparent” toggle, allowing creators to set colors to transparent.🚀 App Settings now live in Kit App Store
Developers can now set an external “App Settings” URL in their app settings, allowing Creators to be able to customize their app setup post-installation, reducing account bloat by controlling data creation and sync. Read about best practices of how to implement this here.🔧 Improved Kit App Store Sorting
- Default sorting now highlights the most popular apps by all-time installations.
- Introduced a “Trending” category for apps gaining traction across our creators.
- Renamed “Last added” to “Newest” for clarity.
🚀 New API endpoints: “List stats for a subscriber” and “Filter subscribers based on engagement”
Developers can now use Kit’s API to filter subscribers by events likeopened, clicked, sent, delivered, and subscribed with customizable date ranges and event counts. Explore the API to enhance subscriber engagement tracking. Additionally, the List stats endpoint now supports specifying date ranges for subscriber engagement data. Learn more.🚀 Automation nodes app plugin environment launched
Developers can now integrate third-party apps with Kit Visual Automations using action and event nodes. This opens up powerful new ways for developers to build with Kit, and for creators to automate their workflows.- Event nodes trigger automations on conditions like “call booked” or “survey completed”.
- Action nodes perform tasks in external systems such as “send an SMS” or “enroll a subscriber in a course”.
- Apps like Shopify, Thinkific, and Calendly are already utilizing these nodes.
🚀 Dynamic return URLs for app installations
Developers can now redirect users back to specific pages after completing an app install using thereturn_to query parameter in installation flows, enabling smoother integration experiences that originate from partner sites.📖 Developer changelog now live

- Emoji categories: 🚀 Added, 🔧 Changed, 🐛 Fixed, ⚠️ Breaking Changes
- RSS subscription: Never miss an update with the RSS feed button
- Smart filtering: Filter by product area including Kit App Store, Plugins, API, Authentication, and more
- Copy functionality: Easily share updates with the copy page feature
🚀 New subscriber stats endpoint available
Get comprehensive engagement metrics for individual subscribers including sends, opens, clicks, bounce rates, and timestamps via the new subscriber stats API endpoint.🚀 New plugin components and dependency support now available
- New plugin components: Radio Group, Slider, Textarea, Toggle, Numerical Input
- New plugin capabilities: Group, Dependencies
- Plugin enhancements: Transparency and weights in Font Picker, a11y improvements across all components
🔧 Kit App Store and app management UX improvements
- Entire app cards now clickable with streamlined navigation and consistent button hierarchy
- New install button directly on Build tab for faster app testing workflows
- In app settings (
https://app.kit.com/apps/:app_id/auth), API and Plugin Authentication separated into distinct sections with clearer plugin type display
🚀 App Versioning now available for seamless authentication updates
Developers can now ensure creators have access to their latest functionality through app versioning:- Apps automatically create new versions when authentication requirements change
- Creators receive smart notifications and can update permissions without reinstalling
- Plugin-level scope control with cumulative permission tracking across all plugins
🔧 OAuth flow now starts from api.kit.com
Kit’s OAuth flow is now initiated fromapi.kit.com/v4/oauth for consistency with other API endpoints, replacing the previous app.kit.com requirement.🚀 Direct app installation URLs now available
Developers can now drive app installations directly from their websites usinghttps://app.kit.com/apps/:app_id/install?k_app_id=k_:app_id without requiring users to first visit Kit App Store.🔧 App icons now display consistently across the Kit App Store
App thumbnails now display as uniform squares (60x60px on detail pages, 40x40px elsewhere) with proper cropping and centering, ensuring professional appearance regardless of original image dimensions.🚀 Plugin deletion now available for developers
Developers can now permanently delete plugins from their Kit apps to better manage their plugin inventory.🚀 Brand new developer documentation platform
We’ve completely rebuilt our developer documentation from the ground up, centralizing all developer resources in one comprehensive hub at developers.kit.com.Key improvements include:
- Unified resource center: All guides, tutorials, and API documentation now live in one carefully structured location
- Updated content: Every piece of documentation has been refreshed and expanded, from app creation guides to OAuth implementation tutorials
- Enhanced navigation: Improved site structure makes finding relevant information faster and more intuitive
🚀 New interactive features
API Sandbox
- Test Kit’s V4 API directly in the documentation
- Input your API key and make live requests without leaving the docs
- Perfect for rapid prototyping and testing
Advanced Search & AI Support
- Full-text search across all documentation
- Built-in “Ask AI” functionality for instant answers
- Industry-standard llms.txt and llms-full.txt support for AI integrations
🔧 Developer experience improvements
- Dark mode support: Documentation now adapts to your preferred viewing mode
- SEO optimized: Better discoverability for developers searching for Kit integration help
- Quick action CTAs: Streamlined paths to sign up, join the developer community, and contact support
- Mobile responsive: Optimized experience across all devices