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>",
"delivery": "pending",
"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>",
"scheduled_publish_time_local": "<string>",
"timezone": "<string>",
"timezone_source": "business",
"published_at": "<string>",
"creation_method": "web",
"metadata": {},
"signature_id": "<string>",
"copy_date": "2023-12-25",
"copy_moment": "<string>",
"suggested_publish_time": "<string>",
"suggested_publish_time_local": "<string>",
"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>",
"customer_message": "<string>",
"customer_fix": "<string>",
"integration_id": "<string>",
"updated_at": "<string>"
}
],
"queue": {
"queue_id": "<string>",
"position": 123,
"estimated_publish_time": "<string>",
"estimated_publish_time_local": "<string>",
"queue_runs_dry_at": "<string>",
"queue_runs_dry_at_local": "<string>",
"warnings": [
{
"field": "<string>",
"level": "approaching_limit",
"message": "<string>",
"code": "<string>"
}
]
},
"publish_readiness": {
"will_publish_to": [
"<string>"
],
"blocked": [
{
"platform": "<string>",
"integration_id": "<string>",
"reason": "<string>",
"message": "<string>",
"reconnect_url": "<string>"
}
],
"not_connected": [
"<string>"
]
},
"repeating_cron": "<string>",
"warnings": [
{
"field": "<string>",
"level": "approaching_limit",
"message": "<string>",
"code": "<string>"
}
],
"updated_at": "<string>",
"revision_id": "<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 workspace, 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 workspace is not in your org. 404 resource_not_found: No workspace 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>",
"delivery": "pending",
"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>",
"scheduled_publish_time_local": "<string>",
"timezone": "<string>",
"timezone_source": "business",
"published_at": "<string>",
"creation_method": "web",
"metadata": {},
"signature_id": "<string>",
"copy_date": "2023-12-25",
"copy_moment": "<string>",
"suggested_publish_time": "<string>",
"suggested_publish_time_local": "<string>",
"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>",
"customer_message": "<string>",
"customer_fix": "<string>",
"integration_id": "<string>",
"updated_at": "<string>"
}
],
"queue": {
"queue_id": "<string>",
"position": 123,
"estimated_publish_time": "<string>",
"estimated_publish_time_local": "<string>",
"queue_runs_dry_at": "<string>",
"queue_runs_dry_at_local": "<string>",
"warnings": [
{
"field": "<string>",
"level": "approaching_limit",
"message": "<string>",
"code": "<string>"
}
]
},
"publish_readiness": {
"will_publish_to": [
"<string>"
],
"blocked": [
{
"platform": "<string>",
"integration_id": "<string>",
"reason": "<string>",
"message": "<string>",
"reconnect_url": "<string>"
}
],
"not_connected": [
"<string>"
]
},
"repeating_cron": "<string>",
"warnings": [
{
"field": "<string>",
"level": "approaching_limit",
"message": "<string>",
"code": "<string>"
}
],
"updated_at": "<string>",
"revision_id": "<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-11-03) 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-10-30, 2026-10-31, 2026-11-03 "2026-11-03"
Path Parameters
The workspace ID (a UUID from list_workspaces). Named business_id for backward compatibility; workspaces were called businesses.
Query Parameters
Filter by post status. Repeat it to get several at once (status=NEW&status=DRAFT returns both). 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 Return only these posts (up to 100; repeat the param). With the default view=full each item is exactly what get_post returns, so this is the way to read several posts in one call. Ids from another workspace are left out, not an error. Combines with status; cannot be combined with q.
100Max results per page (1-100)
1 <= x <= 100The next value from the previous page's response, passed back verbatim. Leave it out for the first page. When next is null you have every result.
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 