curl --request POST \
--url https://api.mymarky.ai/api/businesses/{business_id}/posts \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"caption": "<string>",
"restrict_publish_to": [
"<string>"
],
"media_ids": [
"<string>"
],
"media_urls": [
"<string>"
],
"design_id": "<string>",
"cover_media_id": "<string>",
"video_cover_timestamp_ms": 1,
"status": "NEW",
"scheduled_publish_time": "2023-11-07T05:31:56Z",
"link": "<string>",
"metadata": {},
"platform_overrides": [
{
"platform": "<string>",
"caption": "<string>",
"media_urls": [
"<string>"
],
"title": "<string>",
"link": "<string>",
"first_comment": "<string>"
}
],
"restrict_publish_to_integration_ids": [
"<string>"
]
}
'import requests
url = "https://api.mymarky.ai/api/businesses/{business_id}/posts"
payload = {
"caption": "<string>",
"restrict_publish_to": ["<string>"],
"media_ids": ["<string>"],
"media_urls": ["<string>"],
"design_id": "<string>",
"cover_media_id": "<string>",
"video_cover_timestamp_ms": 1,
"status": "NEW",
"scheduled_publish_time": "2023-11-07T05:31:56Z",
"link": "<string>",
"metadata": {},
"platform_overrides": [
{
"platform": "<string>",
"caption": "<string>",
"media_urls": ["<string>"],
"title": "<string>",
"link": "<string>",
"first_comment": "<string>"
}
],
"restrict_publish_to_integration_ids": ["<string>"]
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
caption: '<string>',
restrict_publish_to: ['<string>'],
media_ids: ['<string>'],
media_urls: ['<string>'],
design_id: '<string>',
cover_media_id: '<string>',
video_cover_timestamp_ms: 1,
status: 'NEW',
scheduled_publish_time: '2023-11-07T05:31:56Z',
link: '<string>',
metadata: {},
platform_overrides: [
{
platform: '<string>',
caption: '<string>',
media_urls: ['<string>'],
title: '<string>',
link: '<string>',
first_comment: '<string>'
}
],
restrict_publish_to_integration_ids: ['<string>']
})
};
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 => "POST",
CURLOPT_POSTFIELDS => json_encode([
'caption' => '<string>',
'restrict_publish_to' => [
'<string>'
],
'media_ids' => [
'<string>'
],
'media_urls' => [
'<string>'
],
'design_id' => '<string>',
'cover_media_id' => '<string>',
'video_cover_timestamp_ms' => 1,
'status' => 'NEW',
'scheduled_publish_time' => '2023-11-07T05:31:56Z',
'link' => '<string>',
'metadata' => [
],
'platform_overrides' => [
[
'platform' => '<string>',
'caption' => '<string>',
'media_urls' => [
'<string>'
],
'title' => '<string>',
'link' => '<string>',
'first_comment' => '<string>'
]
],
'restrict_publish_to_integration_ids' => [
'<string>'
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.mymarky.ai/api/businesses/{business_id}/posts"
payload := strings.NewReader("{\n \"caption\": \"<string>\",\n \"restrict_publish_to\": [\n \"<string>\"\n ],\n \"media_ids\": [\n \"<string>\"\n ],\n \"media_urls\": [\n \"<string>\"\n ],\n \"design_id\": \"<string>\",\n \"cover_media_id\": \"<string>\",\n \"video_cover_timestamp_ms\": 1,\n \"status\": \"NEW\",\n \"scheduled_publish_time\": \"2023-11-07T05:31:56Z\",\n \"link\": \"<string>\",\n \"metadata\": {},\n \"platform_overrides\": [\n {\n \"platform\": \"<string>\",\n \"caption\": \"<string>\",\n \"media_urls\": [\n \"<string>\"\n ],\n \"title\": \"<string>\",\n \"link\": \"<string>\",\n \"first_comment\": \"<string>\"\n }\n ],\n \"restrict_publish_to_integration_ids\": [\n \"<string>\"\n ]\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.mymarky.ai/api/businesses/{business_id}/posts")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"caption\": \"<string>\",\n \"restrict_publish_to\": [\n \"<string>\"\n ],\n \"media_ids\": [\n \"<string>\"\n ],\n \"media_urls\": [\n \"<string>\"\n ],\n \"design_id\": \"<string>\",\n \"cover_media_id\": \"<string>\",\n \"video_cover_timestamp_ms\": 1,\n \"status\": \"NEW\",\n \"scheduled_publish_time\": \"2023-11-07T05:31:56Z\",\n \"link\": \"<string>\",\n \"metadata\": {},\n \"platform_overrides\": [\n {\n \"platform\": \"<string>\",\n \"caption\": \"<string>\",\n \"media_urls\": [\n \"<string>\"\n ],\n \"title\": \"<string>\",\n \"link\": \"<string>\",\n \"first_comment\": \"<string>\"\n }\n ],\n \"restrict_publish_to_integration_ids\": [\n \"<string>\"\n ]\n}")
.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::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"caption\": \"<string>\",\n \"restrict_publish_to\": [\n \"<string>\"\n ],\n \"media_ids\": [\n \"<string>\"\n ],\n \"media_urls\": [\n \"<string>\"\n ],\n \"design_id\": \"<string>\",\n \"cover_media_id\": \"<string>\",\n \"video_cover_timestamp_ms\": 1,\n \"status\": \"NEW\",\n \"scheduled_publish_time\": \"2023-11-07T05:31:56Z\",\n \"link\": \"<string>\",\n \"metadata\": {},\n \"platform_overrides\": [\n {\n \"platform\": \"<string>\",\n \"caption\": \"<string>\",\n \"media_urls\": [\n \"<string>\"\n ],\n \"title\": \"<string>\",\n \"link\": \"<string>\",\n \"first_comment\": \"<string>\"\n }\n ],\n \"restrict_publish_to_integration_ids\": [\n \"<string>\"\n ]\n}"
response = http.request(request)
puts response.read_body{
"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>"
}{
"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>"
}{
"type": "<string>",
"title": "<string>",
"status": 123,
"detail": "<string>",
"code": "<string>",
"instance": "<string>",
"request_id": "<string>",
"param": "<string>"
}Create post
Create a post directly without using the generation pipeline.
Use this when you generate content externally (e.g. with your own AI agent) and want to push it in for scheduling and publishing.
Send an Idempotency-Key header to make a retry safe: if your request times
out and you resend it with the same key, you get the original post back
instead of a duplicate — so a network blip never double-posts.
Errors: 400 missing_field: status is SCHEDULED but scheduled_publish_time was not given. 400 invalid_request: scheduled_publish_time is not in the future. 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. 422 IDEMPOTENCY_KEY_CONFLICT: The Idempotency-Key was reused with a different body. 429 rate_limit_exceeded: You sent too many requests this minute.
curl --request POST \
--url https://api.mymarky.ai/api/businesses/{business_id}/posts \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"caption": "<string>",
"restrict_publish_to": [
"<string>"
],
"media_ids": [
"<string>"
],
"media_urls": [
"<string>"
],
"design_id": "<string>",
"cover_media_id": "<string>",
"video_cover_timestamp_ms": 1,
"status": "NEW",
"scheduled_publish_time": "2023-11-07T05:31:56Z",
"link": "<string>",
"metadata": {},
"platform_overrides": [
{
"platform": "<string>",
"caption": "<string>",
"media_urls": [
"<string>"
],
"title": "<string>",
"link": "<string>",
"first_comment": "<string>"
}
],
"restrict_publish_to_integration_ids": [
"<string>"
]
}
'import requests
url = "https://api.mymarky.ai/api/businesses/{business_id}/posts"
payload = {
"caption": "<string>",
"restrict_publish_to": ["<string>"],
"media_ids": ["<string>"],
"media_urls": ["<string>"],
"design_id": "<string>",
"cover_media_id": "<string>",
"video_cover_timestamp_ms": 1,
"status": "NEW",
"scheduled_publish_time": "2023-11-07T05:31:56Z",
"link": "<string>",
"metadata": {},
"platform_overrides": [
{
"platform": "<string>",
"caption": "<string>",
"media_urls": ["<string>"],
"title": "<string>",
"link": "<string>",
"first_comment": "<string>"
}
],
"restrict_publish_to_integration_ids": ["<string>"]
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
caption: '<string>',
restrict_publish_to: ['<string>'],
media_ids: ['<string>'],
media_urls: ['<string>'],
design_id: '<string>',
cover_media_id: '<string>',
video_cover_timestamp_ms: 1,
status: 'NEW',
scheduled_publish_time: '2023-11-07T05:31:56Z',
link: '<string>',
metadata: {},
platform_overrides: [
{
platform: '<string>',
caption: '<string>',
media_urls: ['<string>'],
title: '<string>',
link: '<string>',
first_comment: '<string>'
}
],
restrict_publish_to_integration_ids: ['<string>']
})
};
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 => "POST",
CURLOPT_POSTFIELDS => json_encode([
'caption' => '<string>',
'restrict_publish_to' => [
'<string>'
],
'media_ids' => [
'<string>'
],
'media_urls' => [
'<string>'
],
'design_id' => '<string>',
'cover_media_id' => '<string>',
'video_cover_timestamp_ms' => 1,
'status' => 'NEW',
'scheduled_publish_time' => '2023-11-07T05:31:56Z',
'link' => '<string>',
'metadata' => [
],
'platform_overrides' => [
[
'platform' => '<string>',
'caption' => '<string>',
'media_urls' => [
'<string>'
],
'title' => '<string>',
'link' => '<string>',
'first_comment' => '<string>'
]
],
'restrict_publish_to_integration_ids' => [
'<string>'
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.mymarky.ai/api/businesses/{business_id}/posts"
payload := strings.NewReader("{\n \"caption\": \"<string>\",\n \"restrict_publish_to\": [\n \"<string>\"\n ],\n \"media_ids\": [\n \"<string>\"\n ],\n \"media_urls\": [\n \"<string>\"\n ],\n \"design_id\": \"<string>\",\n \"cover_media_id\": \"<string>\",\n \"video_cover_timestamp_ms\": 1,\n \"status\": \"NEW\",\n \"scheduled_publish_time\": \"2023-11-07T05:31:56Z\",\n \"link\": \"<string>\",\n \"metadata\": {},\n \"platform_overrides\": [\n {\n \"platform\": \"<string>\",\n \"caption\": \"<string>\",\n \"media_urls\": [\n \"<string>\"\n ],\n \"title\": \"<string>\",\n \"link\": \"<string>\",\n \"first_comment\": \"<string>\"\n }\n ],\n \"restrict_publish_to_integration_ids\": [\n \"<string>\"\n ]\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.mymarky.ai/api/businesses/{business_id}/posts")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"caption\": \"<string>\",\n \"restrict_publish_to\": [\n \"<string>\"\n ],\n \"media_ids\": [\n \"<string>\"\n ],\n \"media_urls\": [\n \"<string>\"\n ],\n \"design_id\": \"<string>\",\n \"cover_media_id\": \"<string>\",\n \"video_cover_timestamp_ms\": 1,\n \"status\": \"NEW\",\n \"scheduled_publish_time\": \"2023-11-07T05:31:56Z\",\n \"link\": \"<string>\",\n \"metadata\": {},\n \"platform_overrides\": [\n {\n \"platform\": \"<string>\",\n \"caption\": \"<string>\",\n \"media_urls\": [\n \"<string>\"\n ],\n \"title\": \"<string>\",\n \"link\": \"<string>\",\n \"first_comment\": \"<string>\"\n }\n ],\n \"restrict_publish_to_integration_ids\": [\n \"<string>\"\n ]\n}")
.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::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"caption\": \"<string>\",\n \"restrict_publish_to\": [\n \"<string>\"\n ],\n \"media_ids\": [\n \"<string>\"\n ],\n \"media_urls\": [\n \"<string>\"\n ],\n \"design_id\": \"<string>\",\n \"cover_media_id\": \"<string>\",\n \"video_cover_timestamp_ms\": 1,\n \"status\": \"NEW\",\n \"scheduled_publish_time\": \"2023-11-07T05:31:56Z\",\n \"link\": \"<string>\",\n \"metadata\": {},\n \"platform_overrides\": [\n {\n \"platform\": \"<string>\",\n \"caption\": \"<string>\",\n \"media_urls\": [\n \"<string>\"\n ],\n \"title\": \"<string>\",\n \"link\": \"<string>\",\n \"first_comment\": \"<string>\"\n }\n ],\n \"restrict_publish_to_integration_ids\": [\n \"<string>\"\n ]\n}"
response = http.request(request)
puts response.read_body{
"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>"
}{
"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>"
}{
"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
Optional. Send a unique value (e.g. a UUID) to make this create request safe to retry. A repeat with the same key returns the original response instead of creating a duplicate. Cached for 24h, scoped to your org. Reusing a key with a different body returns 422.
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.
Body
Post caption text. This is the caption every channel publishes unless it has its own in platform_overrides.
Restrict publishing to these platforms (e.g. instagram, facebook, linkedIn). Case-insensitive. Omit or set null to publish to ALL connected platforms.
Marky media ids to attach, in order. Prefer this over media_urls whenever the media is already in Marky — an image you just generated (use its media_id), an upload, or a library search result. Ids are verified against your workspace, so a mistyped one fails clearly instead of looking like a broken link. Cannot be combined with media_urls or design_id. SEVERAL ids on ONE post IS a carousel: they publish as a single multi-image post in the order you list them (Instagram assembles them into a carousel, LinkedIn into a swipeable document). There is no separate carousel endpoint and you do not need one — never split the slides across several posts.
URLs to images or videos to attach. Use this only for media that is NOT already in Marky — otherwise pass media_ids, which cannot be mistyped. Foreign URLs are copied into Marky storage at save time, so the link is fetched now and must be public and exact. Do not set this when design_id or media_ids is given.
Attach a design (from create_design) to this post. When set, media is taken from the design automatically — do NOT also pass media_urls. Editing the design later keeps this post's media in sync.
Marky media id of an IMAGE to use as this video's cover (the thumbnail shown before it plays). Upload the still with POST /api/media/from-url or POST /api/media/uploads first and pass the id it returns. Used by Instagram (Reel cover), Facebook and Pinterest. TikTok can only take a frame of the video itself, so it uses video_cover_timestamp_ms instead; LinkedIn, X, YouTube and Google Business pick their own. Ignored on a post with no video. Replacing the post's media later does NOT clear the cover — send a new one.
Which frame of the video TikTok should use as its cover, in milliseconds from the start (TikTok's API takes a timestamp, never an image). Defaults to 1000 (one second in). Other platforms ignore this and use cover_media_id when you send one.
x >= 0Initial post status
The exact time to publish (ISO 8601). Required if status is SCHEDULED; must be in the future.
Clickable destination URL for platforms that support link posts: the Facebook link attachment, the Google Business CTA button, and the Pinterest pin destination. Other platforms ignore it — put links in the caption there. Must be http(s).
Up to 50 string key/value pairs for your own analytics dimensions (e.g. {'media_type': 'animated-video', 'format': 'talking-head', 'style': 'data-take', 'hook': 'question', 'topic': 'automate-with-ai'}). Keys <=40 chars, values <=500 chars. Returned verbatim on every read; Marky never interprets them.
Show child attributes
Show child attributes
Per-platform variants of this post — one entry per platform you want to tailor. Unset fields fall back to the post's own values. Strongly recommended whenever a post targets more than one platform: a caption that fits Instagram is usually wrong for X/Twitter (280 chars) and LinkedIn (no hashtag walls).
Show child attributes
Show child attributes
Restrict publishing to these exact connected accounts (integration ids from GET /businesses/{business_id}/integrations). Use instead of restrict_publish_to when a business has multiple accounts of the same platform and you want specific ones. Omit or set null for platform-level targeting. Cannot be combined with restrict_publish_to in one request.
Response
Successful Response
Post ID
Business this post belongs to
When the post was created
Link to view this post in the Marky app (openable/shareable — show it to the user). This is where the post lives in Marky; link is the outbound URL published with the post.
Link to the workspace's scheduled-posts list in the Marky app — where the user sees this post waiting in the lineup. Present once the post is SCHEDULED; null otherwise.
Post caption text
Post status. One of: NEW (draft awaiting your team's review, incl. freshly generated), 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. Same values the list_posts status filter accepts.
Attached media URLs
The same attached media as media_urls, in the same order, but with each item's description and transcript. Use this when analysing what content performs: the creative is usually the reason a post did well, and a URL alone tells you nothing about what was in it.
Show child attributes
Show child attributes
The design attached to this post, if any. Media is derived from this design; edit it with revise_post_design or create_design + a new link.
Media id of the cover image shown before this post's video plays. Marky generates one from the first frame when you don't send one.
The frame (milliseconds from the start) TikTok uses as its cover. Null when nobody has chosen a cover for this post.
Clickable destination URL for platforms that support link posts: the Facebook link attachment, the Google Business CTA button, and the Pinterest pin destination. Other platforms ignore it — put links in the caption there. Must be http(s).
Platforms this post is restricted to. Null means ALL connected platforms.
Exact connected accounts (integration ids) this post is restricted to. Null means targeting is platform-level (see restrict_publish_to).
The exact time this post is scheduled to publish (set via schedule). Null for drafts, queued posts, and already-published posts.
When the post was actually published (past timestamp). Null until it publishes.
Caller-defined string key/value pairs set at create/update time — your own analytics dimensions (e.g. media_type, format, style, hook, topic). Marky returns them verbatim and never interprets them.
Show child attributes
Show child attributes
Per-platform content overrides on this post, if any. Each platform publishes its override fields where set, the post's own fields otherwise.
Show child attributes
Show child attributes
Per-platform publish outcomes — one entry per platform this post was sent to. Poll this until every entry has a terminal status (success or failed) to know publishing is complete.
Show child attributes
Show child attributes
Daily-queue placement. Present only when the post is in a recurring daily queue (status SCHEDULED with no adhoc_publish_time). Null for drafts, adhoc-scheduled, and published posts.
Show child attributes
Show child attributes
If set, this post repeats: a standard 5-field cron string (e.g. '0 9 * * 1' = every Monday 9am UTC). When it publishes, Marky auto-creates the next occurrence at the next cron time. Null = a one-off post.
Last update time
