curl --request GET \
--url https://api.mymarky.ai/api/businesses/{business_id}/posts \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.mymarky.ai/api/businesses/{business_id}/posts"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.mymarky.ai/api/businesses/{business_id}/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://api.mymarky.ai/api/businesses/{business_id}/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://api.mymarky.ai/api/businesses/{business_id}/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://api.mymarky.ai/api/businesses/{business_id}/posts")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.mymarky.ai/api/businesses/{business_id}/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{
"items": [
{
"id": "<string>",
"business_id": "<string>",
"created_at": "<string>",
"url": "<string>",
"scheduled_posts_url": "<string>",
"caption": "<string>",
"status": "<string>",
"media_urls": [
"<string>"
],
"media_details": [
{
"id": "<string>",
"url": "<string>",
"type": "<string>",
"description": "<string>",
"transcript": "<string>",
"duration": 123
}
],
"design_id": "<string>",
"cover_media_id": "<string>",
"video_cover_timestamp_ms": 123,
"link": "<string>",
"restrict_publish_to": [
"<string>"
],
"restrict_publish_to_integration_ids": [
"<string>"
],
"scheduled_publish_time": "<string>",
"published_at": "<string>",
"metadata": {},
"platform_overrides": [
{
"platform": "<string>",
"caption": "<string>",
"media_urls": [
"<string>"
],
"title": "<string>",
"link": "<string>",
"first_comment": "<string>"
}
],
"publish_results": [
{
"platform": "<string>",
"status": "<string>",
"publish_id": "<string>",
"post_url": "<string>",
"error_type": "<string>",
"error_message": "<string>",
"integration_id": "<string>",
"updated_at": "<string>"
}
],
"queue": {
"queue_id": "<string>",
"position": 123,
"estimated_publish_time": "<string>"
},
"repeating_cron": "<string>",
"updated_at": "<string>"
}
],
"next": "<string>"
}{
"type": "<string>",
"title": "<string>",
"status": 123,
"detail": "<string>",
"code": "<string>",
"instance": "<string>",
"request_id": "<string>",
"param": "<string>"
}{
"type": "<string>",
"title": "<string>",
"status": 123,
"detail": "<string>",
"code": "<string>",
"instance": "<string>",
"request_id": "<string>",
"param": "<string>"
}{
"type": "<string>",
"title": "<string>",
"status": 123,
"detail": "<string>",
"code": "<string>",
"instance": "<string>",
"request_id": "<string>",
"param": "<string>"
}{
"type": "<string>",
"title": "<string>",
"status": 123,
"detail": "<string>",
"code": "<string>",
"instance": "<string>",
"request_id": "<string>",
"param": "<string>"
}{
"type": "<string>",
"title": "<string>",
"status": 123,
"detail": "<string>",
"code": "<string>",
"instance": "<string>",
"request_id": "<string>",
"param": "<string>"
}{
"type": "<string>",
"title": "<string>",
"status": 123,
"detail": "<string>",
"code": "<string>",
"instance": "<string>",
"request_id": "<string>",
"param": "<string>"
}{
"type": "<string>",
"title": "<string>",
"status": 123,
"detail": "<string>",
"code": "<string>",
"instance": "<string>",
"request_id": "<string>",
"param": "<string>"
}List posts
List posts for a business, newest first. Use cursor for pagination.
Pass view=summary for a lightweight payload (caption preview + media
fingerprint, no publish_results/overrides/queue) when auditing or de-duping a
big history — a full-view page of 100 posts can be too large for an agent’s
tool budget.
Errors: 400 invalid_value: The business_id is not a valid UUID. 401 authentication_required: API key or token is missing, invalid, or revoked. 403 permission_denied: Your plan does not include API access, or this business is not in your org. 404 resource_not_found: No business with that ID exists. 429 rate_limit_exceeded: You sent too many requests this minute.
curl --request GET \
--url https://api.mymarky.ai/api/businesses/{business_id}/posts \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.mymarky.ai/api/businesses/{business_id}/posts"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.mymarky.ai/api/businesses/{business_id}/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://api.mymarky.ai/api/businesses/{business_id}/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://api.mymarky.ai/api/businesses/{business_id}/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://api.mymarky.ai/api/businesses/{business_id}/posts")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.mymarky.ai/api/businesses/{business_id}/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{
"items": [
{
"id": "<string>",
"business_id": "<string>",
"created_at": "<string>",
"url": "<string>",
"scheduled_posts_url": "<string>",
"caption": "<string>",
"status": "<string>",
"media_urls": [
"<string>"
],
"media_details": [
{
"id": "<string>",
"url": "<string>",
"type": "<string>",
"description": "<string>",
"transcript": "<string>",
"duration": 123
}
],
"design_id": "<string>",
"cover_media_id": "<string>",
"video_cover_timestamp_ms": 123,
"link": "<string>",
"restrict_publish_to": [
"<string>"
],
"restrict_publish_to_integration_ids": [
"<string>"
],
"scheduled_publish_time": "<string>",
"published_at": "<string>",
"metadata": {},
"platform_overrides": [
{
"platform": "<string>",
"caption": "<string>",
"media_urls": [
"<string>"
],
"title": "<string>",
"link": "<string>",
"first_comment": "<string>"
}
],
"publish_results": [
{
"platform": "<string>",
"status": "<string>",
"publish_id": "<string>",
"post_url": "<string>",
"error_type": "<string>",
"error_message": "<string>",
"integration_id": "<string>",
"updated_at": "<string>"
}
],
"queue": {
"queue_id": "<string>",
"position": 123,
"estimated_publish_time": "<string>"
},
"repeating_cron": "<string>",
"updated_at": "<string>"
}
],
"next": "<string>"
}{
"type": "<string>",
"title": "<string>",
"status": 123,
"detail": "<string>",
"code": "<string>",
"instance": "<string>",
"request_id": "<string>",
"param": "<string>"
}{
"type": "<string>",
"title": "<string>",
"status": 123,
"detail": "<string>",
"code": "<string>",
"instance": "<string>",
"request_id": "<string>",
"param": "<string>"
}{
"type": "<string>",
"title": "<string>",
"status": 123,
"detail": "<string>",
"code": "<string>",
"instance": "<string>",
"request_id": "<string>",
"param": "<string>"
}{
"type": "<string>",
"title": "<string>",
"status": 123,
"detail": "<string>",
"code": "<string>",
"instance": "<string>",
"request_id": "<string>",
"param": "<string>"
}{
"type": "<string>",
"title": "<string>",
"status": 123,
"detail": "<string>",
"code": "<string>",
"instance": "<string>",
"request_id": "<string>",
"param": "<string>"
}{
"type": "<string>",
"title": "<string>",
"status": 123,
"detail": "<string>",
"code": "<string>",
"instance": "<string>",
"request_id": "<string>",
"param": "<string>"
}{
"type": "<string>",
"title": "<string>",
"status": 123,
"detail": "<string>",
"code": "<string>",
"instance": "<string>",
"request_id": "<string>",
"param": "<string>"
}Authorizations
Bearer an mk_live_ API key. A key is ORG-SCOPED: it grants full access to every resource in that organization, with no per-endpoint scoping (see the uid pseudo-permission on each operation). Manage keys at https://app.mymarky.ai.
Headers
Opt into a dated API version. Omit to stay on the floor (2026-04-08) forever — unpinned clients never break. Pin to a newer date (e.g. 2026-08-06) to receive the newest response shapes. Unknown values fall back to the floor. See https://docs.mymarky.ai for the versioning model.
2026-04-08, 2026-07-17, 2026-08-02, 2026-08-04, 2026-08-06 "2026-08-06"
Path Parameters
A UUID identifier.
Query Parameters
Filter by post status. NEW = draft awaiting your team's review (incl. freshly generated posts), DRAFT = approved by a reviewer on your team, REJECTED = declined by a reviewer, SCHEDULED = queued for a future time, PUBLISHED = already posted. DRAFT/REJECTED are your team's review verdicts — Marky does not gate publishing on them.
NEW, SCHEDULED, PUBLISHED, DRAFT, REJECTED Max results per page (1-100)
1 <= x <= 100Cursor from previous page's next_cursor
Keyword search. Returns only posts whose caption, title, or attached media's description/transcript contains this text (case-insensitive). Searching the media description is what finds 'the post about my dog' when the dog is in the image and the caption never says 'dog'. Trashed (REJECTED) posts are left out — pass status=REJECTED to search them. Combines with status, and pages with cursor just like an unfiltered listing.
Response detail. full (default) returns each post's whole caption plus publish_results, platform_overrides, and queue placement. summary returns a lean row — caption PREVIEW, media count + fingerprint, status, schedule, and metadata — with none of the heavy fields, for cheaply scanning or de-duping a large history without blowing your token budget.
full, summary 