Skip to main content
POST
Publish post now

Authorizations

Authorization
string
header
required

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

Marky-Version
enum<string>

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.

Available options:
2026-04-08,
2026-07-17,
2026-08-02,
2026-08-04,
2026-08-06,
2026-10-30,
2026-10-31,
2026-11-03
Example:

"2026-11-03"

Path Parameters

business_id
string
required

The workspace ID (a UUID from list_workspaces). Named business_id for backward compatibility; workspaces were called businesses.

post_id
string<uuid>
required

A UUID identifier.

Body

application/json
restrict_publish_to
string[] | null

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

restrict_publish_to_integration_ids
string<uuid>[] | null

Restrict publishing to these exact connected accounts (integration ids from list_connected_social_accounts). Use instead of restrict_publish_to when a workspace 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

Publish accepted; firing in background

id
string
required

Post ID

business_id
string
required

Workspace this post belongs to

created_at
string
required

When the post was created

url
string
required
read-only

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.

delivery
enum<string> | null
required

What actually reached the platforms, from publish_results: 'delivered' (every platform succeeded), 'partial' (some succeeded, some failed), 'failed' (every platform failed), 'pending' (still in progress). Null when no publish has been attempted. Prefer this over status to tell the user whether a post went out.

Available options:
pending,
delivered,
partial,
failed
scheduled_posts_url
string | null
required

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.

caption
string | null

Post caption text

status
string | null

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.

media_urls
string[] | null

Attached media URLs

media_details
PostMedia · object[] | null

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.

design_id
string | null

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.

cover_media_id
string | null

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.

video_cover_timestamp_ms
integer | null

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

restrict_publish_to
string[] | null

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

restrict_publish_to_integration_ids
string[] | null

Exact connected accounts (integration ids) this post is restricted to. Null means targeting is platform-level (see restrict_publish_to).

scheduled_publish_time
string | null

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

scheduled_publish_time_local
string | null

The same moment in the workspace's timezone, ready to show a person, e.g. "Wed Sep 23, 6:00 PM MSK". Quote it as-is instead of converting the UTC value.

timezone
string | null

IANA timezone the *_local times are in: the workspace's calendar timezone, or "UTC" when the workspace hasn't set one (see timezone_source).

timezone_source
enum<string> | null

Where timezone came from: business (the workspace's own setting) or unset_utc (no timezone saved yet, so times are shown in UTC).

Available options:
business,
unset_utc
published_at
string | null

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

creation_method
enum<string> | null

Where the post was created: web, mobile, api (REST with an API key), mcp (an MCP client), max (the built-in assistant), onboarding (the first batch for a new workspace), duplicate, recurrence (the next occurrence of a recurring post), backup_fill (a backup copied into an empty queue slot), or internal. Null for posts created before 2026-10-30.

Available options:
web,
mobile,
api,
mcp,
max,
onboarding,
duplicate,
recurrence,
backup_fill,
internal
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. Keys starting with marky_ are Marky's own (e.g. the copy date below); any you send are dropped.

signature_id
string | null

The saved signature (e.g. a compliance disclaimer) appended to the caption when this post was created, or null. It is applied once: editing or rescheduling the post never appends it again.

copy_date
string<date> | null

The day this caption is about, read from the caption when it was written: an upcoming holiday of the workspace's country, one of the workspace's events, or an explicit date like 'September 25'. Never 'today'/'tomorrow'. Queueing never places the post after this day. Null when the caption names no date.

copy_moment
string | null

The moment the caption names, e.g. 'National Day'. Null for a plain date.

suggested_publish_time
string | null

When to publish on copy_date: the workspace's first posting-schedule slot that day, else 10:00 local. Offer it as the post's date; schedule with at to use it.

suggested_publish_time_local
string | null

The same moment in the workspace's timezone, ready to show a person, e.g. "Wed Sep 23, 6:00 PM MSK". Quote it as-is instead of converting the UTC value.

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.

publish_readiness
PublishReadiness · object | null

Returned by queue, schedule and publish: which platforms this post will actually publish to, and which connected accounts won't get it and why. Null on reads.

repeating_cron
string | null

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.

warnings
FieldWarning · object[]

Non-blocking notes about this post's captions, e.g. a call-to-action with no link or phone ('cta_without_contact'), or a caption in a different language from the workspace ('language_mismatch'). Empty when there is nothing to fix. Fix them with update_post before the post publishes; they never block anything.

updated_at
string | null

Last update time

revision_id
string | null

Id of the undo record this write created. Pass it to revert_revisions to put the record back exactly as it was before this call. Set only on the response to a write; null when you read the record.