Skip to main content
POST
/
api
/
businesses
/
{business_id}
/
posts
Create post
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": [],
  "media_urls": [
    "<string>"
  ],
  "status": "NEW",
  "scheduled_publish_time": "2023-11-07T05:31:56Z",
  "link": "<string>",
  "metadata": {},
  "platform_overrides": [
    {
      "caption": "<string>",
      "media_urls": [
        "<string>"
      ],
      "title": "<string>",
      "link": "<string>",
      "first_comment": "<string>"
    }
  ]
}
'
import requests

url = "https://api.mymarky.ai/api/businesses/{business_id}/posts"

payload = {
"caption": "<string>",
"restrict_publish_to": [],
"media_urls": ["<string>"],
"status": "NEW",
"scheduled_publish_time": "2023-11-07T05:31:56Z",
"link": "<string>",
"metadata": {},
"platform_overrides": [
{
"caption": "<string>",
"media_urls": ["<string>"],
"title": "<string>",
"link": "<string>",
"first_comment": "<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: [],
media_urls: ['<string>'],
status: 'NEW',
scheduled_publish_time: '2023-11-07T05:31:56Z',
link: '<string>',
metadata: {},
platform_overrides: [
{
caption: '<string>',
media_urls: ['<string>'],
title: '<string>',
link: '<string>',
first_comment: '<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' => [

],
'media_urls' => [
'<string>'
],
'status' => 'NEW',
'scheduled_publish_time' => '2023-11-07T05:31:56Z',
'link' => '<string>',
'metadata' => [

],
'platform_overrides' => [
[
'caption' => '<string>',
'media_urls' => [
'<string>'
],
'title' => '<string>',
'link' => '<string>',
'first_comment' => '<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 \"media_urls\": [\n \"<string>\"\n ],\n \"status\": \"NEW\",\n \"scheduled_publish_time\": \"2023-11-07T05:31:56Z\",\n \"link\": \"<string>\",\n \"metadata\": {},\n \"platform_overrides\": [\n {\n \"caption\": \"<string>\",\n \"media_urls\": [\n \"<string>\"\n ],\n \"title\": \"<string>\",\n \"link\": \"<string>\",\n \"first_comment\": \"<string>\"\n }\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 \"media_urls\": [\n \"<string>\"\n ],\n \"status\": \"NEW\",\n \"scheduled_publish_time\": \"2023-11-07T05:31:56Z\",\n \"link\": \"<string>\",\n \"metadata\": {},\n \"platform_overrides\": [\n {\n \"caption\": \"<string>\",\n \"media_urls\": [\n \"<string>\"\n ],\n \"title\": \"<string>\",\n \"link\": \"<string>\",\n \"first_comment\": \"<string>\"\n }\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 \"media_urls\": [\n \"<string>\"\n ],\n \"status\": \"NEW\",\n \"scheduled_publish_time\": \"2023-11-07T05:31:56Z\",\n \"link\": \"<string>\",\n \"metadata\": {},\n \"platform_overrides\": [\n {\n \"caption\": \"<string>\",\n \"media_urls\": [\n \"<string>\"\n ],\n \"title\": \"<string>\",\n \"link\": \"<string>\",\n \"first_comment\": \"<string>\"\n }\n ]\n}"

response = http.request(request)
puts response.read_body
{
  "id": "<string>",
  "business_id": "<string>",
  "created_at": "2023-11-07T05:31:56Z",
  "caption": "<string>",
  "status": "<string>",
  "media_urls": [
    "<string>"
  ],
  "link": "<string>",
  "restrict_publish_to": [
    "<string>"
  ],
  "scheduled_publish_time": "2023-11-07T05:31:56Z",
  "published_at": "2023-11-07T05:31:56Z",
  "metadata": {},
  "platform_overrides": [
    {
      "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>",
      "updated_at": "2023-11-07T05:31:56Z"
    }
  ],
  "queue": {
    "queue_id": "<string>",
    "position": 123,
    "estimated_publish_time": "2023-11-07T05:31:56Z"
  },
  "updated_at": "2023-11-07T05:31:56Z"
}
{
"error": {
"type": "<string>",
"message": "<string>",
"doc_url": "<string>",
"param": "<string>",
"request_id": "<string>"
}
}
{
"error": {
"type": "<string>",
"message": "<string>",
"doc_url": "<string>",
"param": "<string>",
"request_id": "<string>"
}
}
{
"error": {
"type": "<string>",
"message": "<string>",
"doc_url": "<string>",
"param": "<string>",
"request_id": "<string>"
}
}
{
"error": {
"type": "<string>",
"message": "<string>",
"doc_url": "<string>",
"param": "<string>",
"request_id": "<string>"
}
}
{
"error": {
"type": "<string>",
"message": "<string>",
"doc_url": "<string>",
"param": "<string>",
"request_id": "<string>"
}
}
{
"detail": [
{
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>"
}
]
}
{
"error": {
"type": "<string>",
"message": "<string>",
"doc_url": "<string>",
"param": "<string>",
"request_id": "<string>"
}
}
{
"error": {
"type": "<string>",
"message": "<string>",
"doc_url": "<string>",
"param": "<string>",
"request_id": "<string>"
}
}

Authorizations

Authorization
string
header
required

Bearer authentication header of the form Bearer <token>, where <token> is your auth token.

Headers

Idempotency-Key
string | null

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.

Path Parameters

business_id
string
required

A UUID identifier.

Body

application/json
caption
string
required

Post caption text

restrict_publish_to
enum<string>[] | null

Restrict publishing to these platforms (e.g. instagram, facebook, linkedIn). Case-insensitive. Omit or set null to publish to ALL connected platforms.

Available options:
facebook,
instagram,
twitter,
linkedIn,
linkedInProfile,
tiktok,
pinterest,
googleBusiness,
instagramStory,
youtube
media_urls
string[] | null

URLs to images or videos to attach

status
enum<string>
default:NEW

Initial post status

Available options:
NEW,
SCHEDULED
scheduled_publish_time
string<date-time> | null

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).

metadata
Metadata · object | null

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.

platform_overrides
PlatformOverrideModel · object[] | null

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).

Response

Successful Response

id
string
required

Post ID

business_id
string
required

Business this post belongs to

created_at
string<date-time>
required

When the post was created

caption
string | null

Post caption text

status
string | null

Post status. One of: NEW (draft, incl. freshly generated), SCHEDULED (queued for a future time), PUBLISHED (already posted). Same values the list_posts status filter accepts.

media_urls
string[] | null

Attached media URLs

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).

restrict_publish_to
string[] | null

Platforms this post is restricted to. Null means ALL connected platforms.

scheduled_publish_time
string<date-time> | null

The exact time this post is scheduled to publish (set via schedule). Null for drafts, queued posts, and already-published posts.

published_at
string<date-time> | null

When the post was actually published (past timestamp). Null until it publishes.

metadata
Metadata · object | null

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.

platform_overrides
PlatformOverrideModel · object[] | null

Per-platform content overrides on this post, if any. Each platform publishes its override fields where set, the post's own fields otherwise.

publish_results
PublishResultResponse · object[]

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.

queue
QueueInfo · object | null

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.

updated_at
string<date-time> | null

Last update time