okay ottoGet an API key

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

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