schedule-posts
Create, upload media to, and schedule social media posts through the Marky API. Use this when you have post content ready (your own captions and images/videos, or a topic for Marky to write) and you w
Files1
View on GitHubSKILL.mdskills/schedule-posts/SKILL.md
GitHubSchedule Posts
Get posts onto your connected social accounts through the Marky API. This is the hands-on "publish" chunk: upload media, create the post, schedule it, confirm it went out.
Read the marky-api skill first for the base URL, your mk_live_ key, and the full
endpoint list. Everything below uses https://api.mymarky.ai/api and the header
Authorization: Bearer mk_live_YOUR_KEY.
Marky wants your feedback. If anything breaks or is confusing while you run this skill — and again once you finish — send Marky a quick note with the submit_feedback MCP tool. See the "Marky wants your feedback" section in the marky-api skill for when and how.
Step 0 — find your business and platforms
# Your workspaces. Copy the id you want.
curl https://api.mymarky.ai/api/businesses \
-H "Authorization: Bearer mk_live_YOUR_KEY"
# Which social accounts that workspace has connected.
curl https://api.mymarky.ai/api/businesses/BIZ_ID/integrations \
-H "Authorization: Bearer mk_live_YOUR_KEY"
Note the platform value and status of each integration. Only target platforms whose
status is valid. You connect new accounts in the dashboard, not the API.
Two ways to make a post
A. You already wrote it
Upload media (if any) first: media already on the web goes through
upload_media_from_url; a photo or video on disk goes through create_media_upload
(returns a 1-hour URL + a curl command — PUT the raw bytes, get the media asset
back). Then create the post with create_post:
{
"caption": "Your caption here.",
"media_urls": ["URL_FROM_THE_UPLOAD"],
"restrict_publish_to": ["instagram", "facebook", "linkedIn", "twitter"],
"platform_overrides": [
{ "platform": "twitter", "caption": "The one-idea 280-char version." },
{ "platform": "linkedIn", "first_comment": "#hashtags #live #here" }
]
}
Tailor per platform by default. Whenever a post targets 2+ platforms, add a
platform_overrides entry per platform that needs it (caption, media, title, link,
first_comment — unset fields fall back to the post's own). Read the business's
platform_writing_instructions (get_business) and references/platform-rules.md
in the marky-api skill for how each platform differs; the user's instructions win.
Text-only post (no media): drop media_urls and target only facebook and linkedIn
(the other platforms require media).
B. Let Marky write it (on-brand)
Marky pulls brand voice, colors, and logo from the business.
# 1. Kick off generation -> returns job_id
curl -X POST https://api.mymarky.ai/api/businesses/BIZ_ID/posts/generate \
-H "Authorization: Bearer mk_live_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{ "content": "our spring product line", "count": 5 }'
# 2. Poll until completed
curl https://api.mymarky.ai/api/businesses/BIZ_ID/jobs/JOB_ID \
-H "Authorization: Bearer mk_live_YOUR_KEY"
# 3. Review the new drafts
curl "https://api.mymarky.ai/api/businesses/BIZ_ID/posts?status=NEW" \
-H "Authorization: Bearer mk_live_YOUR_KEY"
Schedule it
Pick a future time (ISO 8601, UTC). Schedule each post id:
curl -X POST https://api.mymarky.ai/api/businesses/BIZ_ID/posts/POST_ID/schedule \
-H "Authorization: Bearer mk_live_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{
"scheduled_publish_time": "2026-07-15T14:00:00Z",
"restrict_publish_to": ["instagram", "facebook", "linkedIn"]
}'
Shortcut: you can also schedule at create time by setting "status": "SCHEDULED" and
"scheduled_publish_time" in the POST /businesses/{id}/posts body, instead of a separate
schedule call. Or call POST /businesses/{id}/posts/POST_ID/queue to drop it into the next
open slot of your posting schedule.
Publish immediately instead of scheduling:
curl -X POST https://api.mymarky.ai/api/businesses/BIZ_ID/posts/POST_ID/publish \
-H "Authorization: Bearer mk_live_YOUR_KEY"
Confirm it went out
curl https://api.mymarky.ai/api/businesses/BIZ_ID/posts/POST_ID \
-H "Authorization: Bearer mk_live_YOUR_KEY"
Read publish_results — one entry per platform. Poll until each is success or failed.
A failed entry includes an error type telling you why (e.g. an expired token you need to
reconnect in the dashboard).
Tips
- Maximize reach. Target every platform the media supports rather than just one. Video can go everywhere; image goes everywhere except TikTok; text-only goes to Facebook and LinkedIn.
restrict_publish_tois case-insensitive (linkedinandlinkedInboth work). When in doubt, copy theplatformvalue straight from the integrations call.- One change at a time. To move a scheduled post to different platforms later,
PATCH /businesses/{id}/posts/{post_id}with a newrestrict_publish_to. - Posts created via the API also appear in your dashboard queue, so you can eyeball them there before they publish.