List posts
curl --request GET \
--url https://app.getkavio.app/api/posts \
--header 'Authorization: Bearer <token>'import requests
url = "https://app.getkavio.app/api/posts"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://app.getkavio.app/api/posts', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://app.getkavio.app/api/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 => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://app.getkavio.app/api/posts"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://app.getkavio.app/api/posts")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.getkavio.app/api/posts")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"data": [
{
"id": "<string>",
"content": "<string>",
"media": [
{}
],
"status": "<string>",
"scheduled_at": "<string>",
"published_at": "<string>",
"platforms": [
{
"id": "<string>",
"platform": "<string>",
"content_type": "<string>",
"status": "<string>",
"enabled": true,
"platform_url": "<string>",
"published_at": "<string>",
"error_message": "<string>",
"display_name": "<string>",
"display_username": "<string>",
"display_avatar": "<string>",
"social_account": {}
}
],
"labels": [
{}
],
"created_at": "<string>",
"updated_at": "<string>"
}
]
}Posts
List posts
List all posts for the current workspace, paginated 15 per page.
GET
/
posts
List posts
curl --request GET \
--url https://app.getkavio.app/api/posts \
--header 'Authorization: Bearer <token>'import requests
url = "https://app.getkavio.app/api/posts"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://app.getkavio.app/api/posts', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://app.getkavio.app/api/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 => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://app.getkavio.app/api/posts"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://app.getkavio.app/api/posts")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.getkavio.app/api/posts")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"data": [
{
"id": "<string>",
"content": "<string>",
"media": [
{}
],
"status": "<string>",
"scheduled_at": "<string>",
"published_at": "<string>",
"platforms": [
{
"id": "<string>",
"platform": "<string>",
"content_type": "<string>",
"status": "<string>",
"enabled": true,
"platform_url": "<string>",
"published_at": "<string>",
"error_message": "<string>",
"display_name": "<string>",
"display_username": "<string>",
"display_avatar": "<string>",
"social_account": {}
}
],
"labels": [
{}
],
"created_at": "<string>",
"updated_at": "<string>"
}
]
}Request
integer
Page number for pagination. Defaults to
1.Response
Returns posts ordered byscheduled_at descending (latest first), 15 per page.
array
Show child attributes
Show child attributes
string
UUID of the post.
string
The post text body. May be
null for drafts.array
Media items attached to the post. Each item has
id, path, url,
type (image | video), mime_type, original_filename. Empty array
if none.string
One of:
draft, scheduled, publishing, published,
partially_published, failed.string
Scheduled publish time in
Y-m-d H:i:s format. May be null for
unscheduled drafts.string
Publish completion time in
Y-m-d H:i:s format. null until fully
published.array
One entry per
post_platform (one social account targeted by this post).Show child attributes
Show child attributes
string
UUID of the post_platform row. Use this in
PUT /posts/{post} to
enable/disable platforms.string
Platform identifier — e.g.
linkedin, linkedin-page, x,
facebook, instagram, instagram-facebook, tiktok, youtube,
threads, pinterest, bluesky, mastodon.string
Format used for this platform — e.g.
linkedin_post,
instagram_reel. See GET /content-types.string
Per-platform publish status:
pending, publishing, published, or
failed.boolean
Whether this platform will be published to.
string
Public URL of the published post.
null until published successfully.string
Per-platform publish time in
Y-m-d H:i:s format. null until
published.string
Error reason from the last failed publish attempt.
null on success.string
Snapshot of the social account’s display name (preserved if the
account is later disconnected).
string
Snapshot of the username/handle.
string
Snapshot URL of the avatar.
object
The connected social account. Fields:
id, platform,
display_name, username, is_active, status (connected |
disconnected | token_expired).array
Workspace labels attached to the post. Each item has
id, name,
color, created_at, updated_at.string
Creation timestamp in
Y-m-d H:i:s format.string
Last update timestamp in
Y-m-d H:i:s format.curl -X GET https://app.getkavio.app/api/posts \
-H "Authorization: Bearer YOUR_API_KEY"
{
"data": [
{
"id": "9f1a2b3c-4d5e-6f7a-8b9c-0d1e2f3a4b5c",
"content": "Excited to announce our new feature!",
"media": [],
"status": "scheduled",
"scheduled_at": "2025-01-15 10:00:00",
"published_at": null,
"platforms": [
{
"id": "a1b2c3d4-e5f6-7a8b-9c0d-1e2f3a4b5c6d",
"platform": "linkedin",
"content_type": "linkedin_post",
"status": "pending",
"enabled": true,
"platform_url": null,
"published_at": null,
"error_message": null,
"display_name": "John Doe",
"display_username": "johndoe",
"display_avatar": "https://media.licdn.com/.../avatar.jpg",
"social_account": {
"id": "b2c3d4e5-f6a7-8b9c-0d1e-2f3a4b5c6d7e",
"platform": "linkedin",
"display_name": "John Doe",
"username": "johndoe",
"is_active": true,
"status": "connected"
}
}
],
"labels": [],
"created_at": "2025-01-14 09:00:00",
"updated_at": "2025-01-14 09:00:00"
}
],
"links": {
"first": "https://app.getkavio.app/api/posts?page=1",
"last": "https://app.getkavio.app/api/posts?page=1",
"prev": null,
"next": null
},
"meta": {
"current_page": 1,
"from": 1,
"to": 1,
"last_page": 1,
"per_page": 15,
"total": 1,
"path": "https://app.getkavio.app/api/posts",
"links": [
{
"url": null,
"label": "« Previous",
"page": null,
"active": false
},
{
"url": "https://app.getkavio.app/api/posts?page=1",
"label": "1",
"page": 1,
"active": true
},
{ "url": null, "label": "Next »", "page": null, "active": false }
]
}
}

