Post from Claude or your own code
Okay Otto has a REST API and an MCP server. Both create posts that wait for your okay in the app, then publish to every account you picked and report back what each platform confirmed.
1. Get a key
In the app, open API & Claude and create a key. It starts with oo_live_ and is shown once. Use one key per place you use it, so you can revoke one without the others.
2. Add Okay Otto to Claude Code
claude mcp add --transport http okayotto https://okayotto.com/api/mcp \
--header "Authorization: Bearer oo_live_…"Then ask Claude something like “post these three images to the Cafe Meria Instagram with this caption”. Its tools:
- list_accounts: your connected accounts and their ids.
- create_post: images and a caption for one or more accounts of one brand. Returns a link for your okay.
- get_post_status: per account, waiting, published with its link, or failed with the reason.
- list_recent_posts: the latest posts and where they stand.
- list_songs and add_song_to_video: put one of our own songs under a video, ending on the beat.
- list_surfaces, fit_media and check_captions: make each platform’s version of a photo or video, and check each caption against that platform’s limits.
3. Say okay
Every post from the API or Claude arrives in your queue as Needs your okay. Open it and tap Okay, post it, or Not now to keep it as a draft. Nothing goes out before that. If you set a time, it posts at that time after your okay; otherwise within a minute.
REST API
Base URL https://okayotto.com/api/v1. Send Authorization: Bearer oo_live_… on every request.
List accounts
curl https://okayotto.com/api/v1/accounts \
-H "Authorization: Bearer $OKAYOTTO_KEY"Upload images from your computer
curl https://okayotto.com/api/v1/media \
-H "Authorization: Bearer $OKAYOTTO_KEY" \
-F files=@slide-1.jpg -F files=@slide-2.jpgReturns media. Or send JSON { "urls": ["https://…"] } to copy images from the web.
Create a post
curl https://okayotto.com/api/v1/posts \
-H "Authorization: Bearer $OKAYOTTO_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: launch-post-1" \
-d '{
"account_ids": ["<id from /accounts>"],
"caption": "Seven ingredients. You already know all of them.",
"image_urls": ["https://example.com/slide-1.jpg"],
"scheduled_at": "2026-11-02T14:00:00Z"
}'Send media from /media instead of image_urls for uploaded files. The response includes approve_url. Repeating an Idempotency-Key returns the same post.
Check a post
curl https://okayotto.com/api/v1/posts/<id> \
-H "Authorization: Bearer $OKAYOTTO_KEY"What works today
Image posts and carousels (1 to 20 images) to connected Instagram, Facebook and TikTok accounts. Instagram and Facebook posts go out when the person taps “Okay, post it”. A post with a TikTok account opens in the composer, where the person chooses TikTok's settings and presses Post, as TikTok requires. Video and more platforms are next; list_accounts marks each account with can_post.
Errors
Errors come back as { "error": { "code": "…", "message": "…" } }.
missing_api_key / invalid_api_key- No key, or a key that is unknown or revoked (401).
unknown_account- An account id is not in your workspace (404).
accounts_span_brands- All accounts in one post must belong to one brand.
account_disconnected- Reconnect that account in the app first.
platform_not_supported_yet- Posting to that platform through the API isn’t available yet.
daily_limit- The account reached its platform’s daily posting limit (429).
no_images / too_many_images / image_too_large- 1 to 20 images, 20 MB each at most.
unsupported_image- The image breaks a platform rule; Instagram takes 4:5 to 1.91:1. The message says which.
image_fetch_failed / not_an_image / unreadable_image- An image URL could not be downloaded or read.