Skip to main content
PATCH
Update post

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-08-06) 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
Example:

"2026-08-06"

Path Parameters

business_id
string
required

A UUID identifier.

post_id
string
required

A UUID identifier.

Body

application/json
caption
string | null

Updated caption text. Note that a channel listed in platform_overrides with its own caption publishes THAT caption, not this one. To change what every channel publishes, either send platform_overrides in the same call with the new per-channel captions, or send platform_overrides: [] to drop the overrides so every channel falls back to this caption. Read the post first to see which channels have one.

status
string | null

Move this post through your team's review workflow. NEW = notify your team the post is ready for review (it shows up on the app's review page). DRAFT = a reviewer approved it. REJECTED = a reviewer declined it. These are your team's workflow state — Marky does not gate publishing on them. Only allowed on posts currently in NEW, DRAFT, or REJECTED (use the schedule endpoint to schedule; published posts are immutable).

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.

media_ids
string[] | null

Replace the attached media, by library id. 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.

media_urls
string[] | null

Replace the attached media. URLs to images or videos. Use this to swap the image on a generated post during review. Prefer media_ids when the media is already in Marky. Do not set this when design_id is given — media comes from the design automatically.

design_id
string | null

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.

cover_media_id
string | null

Replace this video's cover image. 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.

video_cover_timestamp_ms
integer | null

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.

Required range: x >= 0

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

REPLACES the post's entire override set: send the full list you want to keep, send [] to clear all overrides, or omit/null to leave them unchanged.

restrict_publish_to_integration_ids
string[] | null

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

id
string
required

Post ID

business_id
string
required

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

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.

published_at
string | 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.

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.

updated_at
string | null

Last update time