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.
Authorizations
Bearer authentication header of the form Bearer <token>, where <token> is your auth token.
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.
Path Parameters
A UUID identifier.
Body
Post caption text
Restrict publishing to these platforms (e.g. instagram, facebook, linkedIn). Case-insensitive. Omit or set null to publish to ALL connected platforms.
facebook, instagram, twitter, linkedIn, linkedInProfile, tiktok, pinterest, googleBusiness, instagramStory, youtube URLs to images or videos to attach
Initial post status
NEW, SCHEDULED 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.
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
Post ID
Business this post belongs to
When the post was created
Post caption text
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.
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).
Platforms this post is restricted to. Null means ALL connected platforms.
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.
Per-platform content overrides on this post, if any. Each platform publishes its override fields where set, the post's own fields otherwise.
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.
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.
Last update time
