curl --request GET \
--url https://api.kit.com/v4/posts \
--header 'X-Kit-Api-Key: <api-key>'require 'uri'
require 'net/http'
url = URI("https://api.kit.com/v4/posts")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["X-Kit-Api-Key"] = '<api-key>'
response = http.request(request)
puts response.read_bodyconst options = {method: 'GET', headers: {'X-Kit-Api-Key': '<api-key>'}};
fetch('https://api.kit.com/v4/posts', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.kit.com/v4/posts"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("X-Kit-Api-Key", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.kit.com/v4/posts",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"X-Kit-Api-Key: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}import requests
url = "https://api.kit.com/v4/posts"
headers = {"X-Kit-Api-Key": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text){
"posts": [
{
"id": 3,
"publication_id": 127,
"created_at": "2026-07-28T03:01:00Z",
"title": "Draft Post",
"slug": null,
"description": null,
"meta_description": null,
"status": "draft",
"published_at": null,
"sent_at": null,
"thumbnail_alt": null,
"thumbnail_url": null,
"is_paid": false,
"public_url": null
},
{
"id": 2,
"publication_id": 126,
"created_at": "2026-07-28T03:01:00Z",
"title": "Email and Web Post",
"slug": "email-and-web-post",
"description": null,
"meta_description": null,
"status": "published",
"published_at": "2026-07-26T03:01:00Z",
"sent_at": "2026-07-28T03:01:00Z",
"thumbnail_alt": null,
"thumbnail_url": null,
"is_paid": false,
"public_url": "https://asdf.kit.com/posts/email-and-web-post"
},
{
"id": 1,
"publication_id": 125,
"created_at": "2026-07-28T03:01:00Z",
"title": "Web Only Post",
"slug": "web-only-post",
"description": null,
"meta_description": null,
"status": "published",
"published_at": "2026-07-27T03:01:00Z",
"sent_at": null,
"thumbnail_alt": null,
"thumbnail_url": null,
"is_paid": false,
"public_url": "https://asdf.kit.com/posts/web-only-post"
}
],
"pagination": {
"has_previous_page": false,
"has_next_page": false,
"start_cursor": "WzNd",
"end_cursor": "WzFd",
"per_page": 500
}
}List posts
Returns a cursor-paginated list of the account’s posts — content published to the creator’s Kit site and/or sent by email — with each post’s status (e.g. draft, scheduled, published), slug, public_url, is_paid flag, and timestamps for publishing and sending.
Post bodies are omitted by default; set include_content=true to embed the content HTML on each post (this significantly increases response size and latency for large collections — prefer Get a post for a single body). A post that was also sent as a broadcast shares its publication_id with the matching broadcast from List broadcasts.
curl --request GET \
--url https://api.kit.com/v4/posts \
--header 'X-Kit-Api-Key: <api-key>'require 'uri'
require 'net/http'
url = URI("https://api.kit.com/v4/posts")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["X-Kit-Api-Key"] = '<api-key>'
response = http.request(request)
puts response.read_bodyconst options = {method: 'GET', headers: {'X-Kit-Api-Key': '<api-key>'}};
fetch('https://api.kit.com/v4/posts', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.kit.com/v4/posts"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("X-Kit-Api-Key", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.kit.com/v4/posts",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"X-Kit-Api-Key: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}import requests
url = "https://api.kit.com/v4/posts"
headers = {"X-Kit-Api-Key": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text){
"posts": [
{
"id": 3,
"publication_id": 127,
"created_at": "2026-07-28T03:01:00Z",
"title": "Draft Post",
"slug": null,
"description": null,
"meta_description": null,
"status": "draft",
"published_at": null,
"sent_at": null,
"thumbnail_alt": null,
"thumbnail_url": null,
"is_paid": false,
"public_url": null
},
{
"id": 2,
"publication_id": 126,
"created_at": "2026-07-28T03:01:00Z",
"title": "Email and Web Post",
"slug": "email-and-web-post",
"description": null,
"meta_description": null,
"status": "published",
"published_at": "2026-07-26T03:01:00Z",
"sent_at": "2026-07-28T03:01:00Z",
"thumbnail_alt": null,
"thumbnail_url": null,
"is_paid": false,
"public_url": "https://asdf.kit.com/posts/email-and-web-post"
},
{
"id": 1,
"publication_id": 125,
"created_at": "2026-07-28T03:01:00Z",
"title": "Web Only Post",
"slug": "web-only-post",
"description": null,
"meta_description": null,
"status": "published",
"published_at": "2026-07-27T03:01:00Z",
"sent_at": null,
"thumbnail_alt": null,
"thumbnail_url": null,
"is_paid": false,
"public_url": "https://asdf.kit.com/posts/web-only-post"
}
],
"pagination": {
"has_previous_page": false,
"has_next_page": false,
"start_cursor": "WzNd",
"end_cursor": "WzFd",
"per_page": 500
}
}Authorizations
Authenticate API requests via an API Key
Query Parameters
To fetch next page of results, use ?after=<end_cursor>
To fetch previous page of results, use ?before=<start_cursor>
To include the content field on each post in the response, use true. Omitted by default because it significantly increases response size and latency for large collections.
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.
Number of results per page. Default 500, maximum 1000.
Was this page helpful?