Kit Snippets API
The Snippets API from Kit — 2 operation(s) for snippets.
Operations 4
Each operation below carries the questions people ask an LLM about it and the instructions they give an agent to run it. Generated by API Evangelist overlay
The Snippets API from Kit — 2 operation(s) for snippets.
Each operation below carries the questions people ask an LLM about it and the instructions they give an agent to run it. Generated by API Evangelist overlay
Every API here is available over the APIs.io API and to AI agents over MCP.
One button, every client — Claude, Cursor, VS Code and the rest.
https://apis.io/mcp
find_apisBrowse and filter every API in the catalog.get_api_artifactsOne API's artifacts, grouped by type.get_openapiThe primary OpenAPI for this API.find_similar_apisAPIs that look like this one.apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.resolveTurn a domain, URL or GitHub org into the provider it belongs to.find_cohortsEvery scored population of providers in the catalog.curl "https://apis.io/api/v1/apis/convertkit:convertkit-snippets-api"
curl "https://apis.io/api/v1/apis?limit=25"
Calls without X-API-Key need no key. Calls with it need a paid plan — get a key.
Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.
A second provider on the same verified email joins the account you already have.
openapi: 3.2.0
info:
title: Kit Snippets API
version: '4.0'
servers:
- url: https://api.kit.com
tags:
- name: Snippets
paths:
/v4/snippets:
get:
summary: List snippets
description: 'Returns every snippet on the account. Each snippet''s `key` is the identifier used in Liquid — `{{ snippet.key }}` — when creating a broadcast or sequence email. See Create a snippet for how snippets work end-to-end.
**Tip:** the heavier `content` and `document` fields are omitted by default to keep responses fast. Pass `include_content=true` when you need the body — for example, to render a preview or audit Liquid usage.
Filter the result with `snippet_type` (`inline` or `block`) and `archived` (defaults to `false`, set `true` to list only archived snippets).'
tags:
- Snippets
security:
- API Key: []
- OAuth2: []
parameters:
- name: after
description: To fetch next page of results, use `?after=<end_cursor>`
in: query
required: false
schema: {}
- name: archived
description: When `true`, returns only archived snippets. Defaults to `false`.
in: query
required: false
schema: {}
- name: before
description: To fetch previous page of results, use `?before=<start_cursor>`
in: query
required: false
schema: {}
- name: include_content
description: When `true`, includes both the `content` and `document` fields for each snippet in the response. Defaults to `false`.
in: query
required: false
schema:
type: boolean
example: true
- name: include_total_count
description: Set to `true` to include the `total_count` in the response. This option can cause slow responses; if paging through results, request it only on the first page and reuse the value for subsequent pages.
in: query
required: false
schema:
type: boolean
example: false
- name: per_page
description: Number of results per page. Default 500, maximum 1000.
in: query
required: false
schema: {}
- name: snippet_type
description: Filter snippets by type. Use `inline` for text snippets or `block` for rich-text block snippets.
in: query
required: false
schema: {}
responses:
'200':
description: Returns a paginated list of all snippets for your account
content:
application/json:
schema:
type: object
properties:
snippets:
type: array
items:
type: object
properties:
id:
type: integer
name:
type: string
snippet_type:
type: string
archived:
type: boolean
key:
type: string
created_at:
type: string
updated_at:
type: string
content:
type: string
document:
type: object
properties:
id:
type: integer
value: {}
value_html:
type: string
value_plain: {}
version:
type: integer
required:
- id
- value
- value_html
- value_plain
- version
required:
- id
- name
- snippet_type
- archived
- key
- created_at
- updated_at
- content
- document
pagination:
type: object
properties:
has_previous_page:
type: boolean
has_next_page:
type: boolean
start_cursor:
type: string
end_cursor:
type: string
per_page:
type: integer
required:
- has_previous_page
- has_next_page
- start_cursor
- end_cursor
- per_page
required:
- snippets
- pagination
example:
snippets:
- id: 5
name: Welcome message
snippet_type: inline
archived: false
key: welcome-message
created_at: '2023-02-17T11:43:55Z'
updated_at: '2023-02-17T11:43:55Z'
content: Hello {{ subscriber.first_name }}
document:
id: 152
value: null
value_html: content
value_plain: null
version: 1
pagination:
has_previous_page: false
has_next_page: false
start_cursor: WzVd
end_cursor: WzVd
per_page: 500
'401':
description: Returns a 401 if the token and/or account cannot be authenticated
content:
application/json:
schema:
type: object
properties:
errors:
type: array
items:
type: string
required:
- errors
example:
errors:
- The access token is invalid
x-mcp:
enabled: true
operationId: getV4Snippets
x-operation-id-source: derived
post:
summary: Create a snippet
description: 'Snippets are reusable pieces of email content you can drop into a broadcast or sequence email using Liquid: `{{ snippet.key }}`. Update the snippet once and every email that references it picks up the new content on next send.
There are two `snippet_type`s. **`inline`** snippets store plain-text content (with Liquid variable support like `{{ subscriber.first_name }}`) in the `content` field. **`block`** snippets store rich-text HTML — text, lists, images, buttons — in `document_attributes.value_html`. A snippet''s type is fixed at creation: it cannot be changed via Update a snippet.
The response includes a `key` field. That''s the identifier you use in Liquid — for example, a snippet returned with `"key": "welcome-message"` is referenced inside a broadcast as `{{ snippet.welcome-message }}`. Keys are derived from the snippet name on creation.
**Note:** the API rejects circular references — a snippet cannot reference itself, directly or transitively — with a `422` validation error.
For end-user context on how creators build and edit snippets in the Kit UI, see the help articles on content snippets and code snippets for custom templates.'
tags:
- Snippets
security:
- API Key: []
- OAuth2: []
parameters: []
responses:
'201':
description: Creates a new snippet
content:
application/json:
schema:
type: object
properties:
snippet:
type: object
properties:
id:
type: integer
name:
type: string
snippet_type:
type: string
archived:
type: boolean
key:
type: string
created_at:
type: string
updated_at:
type: string
content:
type: string
document:
type: object
properties:
id:
type: integer
value: {}
value_html: {}
value_plain: {}
version:
type: integer
required:
- id
- value
- value_html
- value_plain
- version
required:
- id
- name
- snippet_type
- archived
- key
- created_at
- updated_at
- content
- document
required:
- snippet
example:
snippet:
id: 31
name: Cat Fact of the Day
snippet_type: inline
archived: false
key: cat-fact-of-the-day
created_at: '2026-06-11T16:16:17Z'
updated_at: '2026-06-11T16:16:17Z'
content: Did you know, {{ subscriber.first_name }}? Cats can rotate their ears 180 degrees.
document:
id: 178
value: null
value_html: null
value_plain: null
version: 1
'401':
description: Returns a 401 if the token and/or account cannot be authenticated
content:
application/json:
schema:
type: object
properties:
errors:
type: array
items:
type: string
required:
- errors
example:
errors:
- The access token is invalid
'422':
description: Returns a 422 with an error message when one or more of the parameters were invalid
content:
application/json:
schema:
type: object
properties:
errors:
type: array
items:
type: string
required:
- errors
example:
errors:
- name can't be blank
requestBody:
content:
application/json:
schema:
oneOf:
- title: Inline snippet
type: object
properties:
name:
type: string
description: Name of the snippet
snippet_type:
type: string
enum:
- inline
description: Must be 'inline'
content:
type: string
description: Liquid-enabled text content for the snippet
required:
- name
- snippet_type
- content
- title: Block snippet
type: object
properties:
name:
type: string
description: Name of the snippet
snippet_type:
type: string
enum:
- block
description: Must be 'block'
document_attributes:
type: object
description: Rich-text document for the snippet
properties:
value_html:
type: string
description: HTML content for the block snippet
required:
- value_html
required:
- name
- snippet_type
- document_attributes
example:
name: Cat Fact of the Day
snippet_type: inline
content: Did you know, {{ subscriber.first_name }}? Cats can rotate their ears 180 degrees.
x-mcp:
enabled: true
operationId: postV4Snippets
x-operation-id-source: derived
/v4/snippets/{id}:
get:
summary: Get a snippet
description: 'Fetches a single snippet by `id`. Unlike List snippets, this endpoint **always returns the full `content` and `document`** — no `include_content` flag needed.
Use this when you have an `id` (e.g. stored from a prior create call) and need the current `key` and body — for example, to preview the resolved HTML or confirm a snippet still exists before referencing it as `{{ snippet.key }}` in a broadcast or sequence email. See Create a snippet for the snippet model.'
tags:
- Snippets
security:
- API Key: []
- OAuth2: []
parameters:
- name: id
in: path
required: true
schema:
type: integer
example: 25
responses:
'200':
description: Returns the snippet details
content:
application/json:
schema:
type: object
properties:
snippet:
type: object
properties:
id:
type: integer
name:
type: string
snippet_type:
type: string
archived:
type: boolean
key:
type: string
created_at:
type: string
updated_at:
type: string
content:
type: string
document:
type: object
properties:
id:
type: integer
value: {}
value_html:
type: string
value_plain: {}
version:
type: integer
required:
- id
- value
- value_html
- value_plain
- version
required:
- id
- name
- snippet_type
- archived
- key
- created_at
- updated_at
- content
- document
required:
- snippet
example:
snippet:
id: 24
name: Welcome message
snippet_type: inline
archived: false
key: welcome-message
created_at: '2023-02-17T11:43:55Z'
updated_at: '2023-02-17T11:43:55Z'
content: Hello {{ subscriber.first_name }}
document:
id: 171
value: null
value_html: content
value_plain: null
version: 1
'401':
description: Returns a 401 if the token and/or account cannot be authenticated
content:
application/json:
schema:
type: object
properties:
errors:
type: array
items:
type: string
required:
- errors
example:
errors:
- The access token is invalid
'404':
description: Returns a 404 when the provided id does not exist
content:
application/json:
schema:
type: object
properties:
errors:
type: array
items:
type: string
required:
- errors
example:
errors:
- Not Found
x-mcp:
enabled: true
operationId: getV4SnippetsById
x-operation-id-source: derived
put:
summary: Update a snippet
description: 'Rename a snippet, replace its body, or archive/restore it. Updates apply on the next send of any email that references the snippet via `{{ snippet.key }}` — there''s no per-email versioning, so a content change ripples to every broadcast or sequence email using that key.
The request body must match the existing `snippet_type`. For an **`inline`** snippet, send `content` (and optionally `name`, `archived`). For a **`block`** snippet, send `document_attributes.value_html` (and optionally `name`, `archived`). Pass `archived: true` to archive, `false` to restore.
**Warning:** `snippet_type` is immutable. Sending a different value, or sending the body shape for the wrong type, returns a `422` with `snippet_type cannot be changed`.
See Create a snippet for the full snippet model and how `key` ties into Liquid.'
tags:
- Snippets
security:
- API Key: []
- OAuth2: []
parameters:
- name: id
in: path
required: true
schema:
type: integer
example: 60
responses:
'200':
description: Updates the snippet and returns its details
content:
application/json:
schema:
type: object
properties:
snippet:
type: object
properties:
id:
type: integer
name:
type: string
snippet_type:
type: string
archived:
type: boolean
key:
type: string
created_at:
type: string
updated_at:
type: string
content:
type: string
document:
type: object
properties:
id:
type: integer
value: {}
value_html:
type: string
value_plain: {}
version:
type: integer
required:
- id
- value
- value_html
- value_plain
- version
required:
- id
- name
- snippet_type
- archived
- key
- created_at
- updated_at
- content
- document
required:
- snippet
example:
snippet:
id: 59
name: Dog Fact of the Day
snippet_type: inline
archived: false
key: welcome-message
created_at: '2023-02-17T11:43:55Z'
updated_at: '2026-06-11T16:16:22Z'
content: Hello {{ subscriber.first_name }}
document:
id: 206
value: null
value_html: content
value_plain: null
version: 1
'401':
description: Returns a 401 if the token and/or account cannot be authenticated
content:
application/json:
schema:
type: object
properties:
errors:
type: array
items:
type: string
required:
- errors
example:
errors:
- The access token is invalid
'404':
description: Returns a 404 when the provided id does not exist
content:
application/json:
schema:
type: object
properties:
errors:
type: array
items:
type: string
required:
- errors
example:
errors:
- Not Found
'422':
description: Returns a 422 with an error message when one or more of the parameters were invalid
content:
application/json:
schema:
type: object
properties:
errors:
type: array
items:
type: string
required:
- errors
example:
errors:
- snippet_type cannot be changed
requestBody:
content:
application/json:
schema:
oneOf:
- title: Inline snippet
type: object
properties:
name:
type: string
description: New name for the snippet
snippet_type:
type: string
description: Cannot be changed — must match the existing type if provided
archived:
type: boolean
description: Pass `true` to archive or `false` to restore the snippet
content:
type: string
description: New Liquid-enabled text content
- title: Block snippet
type: object
properties:
name:
type: string
description: New name for the snippet
snippet_type:
type: string
description: Cannot be changed — must match the existing type if provided
archived:
type: boolean
description: Pass `true` to archive or `false` to restore the snippet
document_attributes:
type: object
description: Updated rich-text document
properties:
value_html:
type: string
description: New HTML content for the block snippet
required:
- value_html
example:
name: Dog Fact of the Day
x-mcp:
enabled: true
operationId: putV4SnippetsById
x-operation-id-source: derived
components:
securitySchemes:
API_Key:
description: Authenticate API requests via an API Key
type: apiKey
in: header
name: X-Kit-Api-Key
OAuth2:
description: Authenticate API requests via an OAuth token
type: oauth2
flows:
authorizationCode:
authorizationUrl: https://api.kit.com/v4/oauth/authorize
tokenUrl: https://api.kit.com/v4/oauth/token
refreshUrl: https://api.kit.com/v4/oauth/token
scopes:
read: Read access to Kit API v4
write: Write access to Kit API v4
x-mint:
mcp:
enabled: true