{"openapi":"3.1.0","info":{"title":"SocialsForAI API","version":"1.0.0","summary":"Publish to X, LinkedIn, Bluesky, Mastodon, Telegram and more from code or AI agents.","description":"One API for posting to social networks, built for AI agents. Every error is {\"error\": {code, message, fix, issues?, request_id}}: read `fix` and act on it. Every response carries a Request-Id header; authenticated responses carry RateLimit-Limit, RateLimit-Remaining and RateLimit-Reset (per workspace per minute: free 60, hobby 120, pro 300, growth 600, scale 1500). Guide: https://socialsforai.com/llms.txt. How agents get credentials: https://socialsforai.com/auth.md. MCP server: https://socialsforai.com/api/mcp.","termsOfService":"https://socialsforai.com/terms","contact":{"name":"SocialsForAI","url":"https://socialsforai.com"}},"servers":[{"url":"https://socialsforai.com"}],"externalDocs":{"description":"Docs","url":"https://socialsforai.com/docs"},"tags":[{"name":"Meta"},{"name":"Workspace"},{"name":"Accounts"},{"name":"Posts"},{"name":"Media"},{"name":"Webhooks"},{"name":"Keys"}],"paths":{"/v1":{"get":{"operationId":"getIndex","tags":["Meta"],"summary":"List every endpoint.","security":[],"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Index"}}}},"400":{"description":"The request is invalid (validation_error, invalid_json...). error.issues lists the fields.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"rate_limited (see Retry-After).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/platforms":{"get":{"operationId":"listPlatforms","tags":["Meta"],"summary":"Supported platforms, whether each is available, and their limits.","security":[],"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"object":{"type":"string","const":"list"},"data":{"type":"array","items":{"$ref":"#/components/schemas/Platform"}},"has_more":{"type":"boolean"},"next_cursor":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["data"],"additionalProperties":true}}}},"400":{"description":"The request is invalid (validation_error, invalid_json...). error.issues lists the fields.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"rate_limited (see Retry-After).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/workspaces":{"post":{"operationId":"createWorkspace","tags":["Workspace"],"summary":"Create a workspace and get an API key. No auth: agents can sign up by themselves.","description":"Returns a Free-plan api_key once. Limited to 10 per hour and 50 per day from one network. No API key needed.","security":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"default":"My workspace","type":"string","minLength":1,"maxLength":100},"email":{"description":"The owner's email: lets them sign in at /login to manage keys and billing, and recover access.","type":"string","maxLength":254}}}}}},"responses":{"201":{"description":"Success.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkspaceCreated"}}}},"400":{"description":"The request is invalid (validation_error, invalid_json...). error.issues lists the fields.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"rate_limited (see Retry-After).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/workspace":{"get":{"operationId":"getWorkspace","tags":["Workspace"],"summary":"The workspace this key belongs to: name, plan, owner email.","description":"Scope: `posts:read`.","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Workspace"}}}},"400":{"description":"The request is invalid (validation_error, invalid_json...). error.issues lists the fields.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"missing_api_key or invalid_api_key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"insufficient_scope: the key lacks the scope this endpoint needs.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"rate_limited (see Retry-After).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"patch":{"operationId":"setWorkspaceOwner","tags":["Workspace"],"summary":"Attach an owner email (only while none is set).","description":"Scope: `admin`.","security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"email":{"type":"string","maxLength":254}},"required":["email"]}}}},"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Workspace"}}}},"400":{"description":"The request is invalid (validation_error, invalid_json...). error.issues lists the fields.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"missing_api_key or invalid_api_key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"insufficient_scope: the key lacks the scope this endpoint needs.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"rate_limited (see Retry-After).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/usage":{"get":{"operationId":"getUsage","tags":["Workspace"],"summary":"Active accounts this month, posts, plan, estimated cost and a cheaper plan if there is one.","description":"Scope: `posts:read`.","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Usage"}}}},"400":{"description":"The request is invalid (validation_error, invalid_json...). error.issues lists the fields.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"missing_api_key or invalid_api_key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"insufficient_scope: the key lacks the scope this endpoint needs.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"rate_limited (see Retry-After).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/upgrade-links":{"post":{"operationId":"createUpgradeLink","tags":["Workspace"],"summary":"Get a payment link for the workspace owner to move to a paid plan.","description":"An agent can't pay; it hands the url to the owner, who pays by card on Stripe Checkout. Needs an owner email on the workspace (409 owner_email_required). Scope: `admin`.","security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"plan":{"type":"string","enum":["hobby","pro","growth","scale"]}},"required":["plan"]}}}},"responses":{"201":{"description":"Success.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpgradeLink"}}}},"400":{"description":"The request is invalid (validation_error, invalid_json...). error.issues lists the fields.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"missing_api_key or invalid_api_key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"insufficient_scope: the key lacks the scope this endpoint needs.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"rate_limited (see Retry-After).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/connect-links":{"post":{"operationId":"createConnectLink","tags":["Accounts"],"summary":"Create a hosted link a person opens to connect social accounts.","description":"Needed for X and LinkedIn, where the owner approves on the network's own page. Send the url to the owner, then long-poll GET /v1/connect-links/{id}?wait=45. Scope: `accounts:write`.","security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"platforms":{"description":"Platforms to offer. Defaults to all configured platforms.","type":"array","items":{"type":"string"}},"external_ref":{"description":"Your id for the person connecting (end user, client...). Stored on the account.","type":"string","maxLength":255},"redirect_url":{"description":"Where to send the person after connecting. Receives ?account_id=&platform=&status=connected.","type":"string","format":"uri"},"expires_in":{"default":604800,"description":"Seconds until the link expires.","type":"integer","minimum":300,"maximum":2592000}}}}}},"responses":{"201":{"description":"Success.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectLink"}}}},"400":{"description":"The request is invalid (validation_error, invalid_json...). error.issues lists the fields.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"missing_api_key or invalid_api_key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"insufficient_scope: the key lacks the scope this endpoint needs.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"rate_limited (see Retry-After).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/connect-links/{id}":{"get":{"operationId":"getConnectLink","tags":["Accounts"],"summary":"Status of a connect link; long-polls with ?wait=.","description":"Scope: `accounts:write`.","security":[{"bearerAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"description":"The connect link id.","schema":{"type":"string"}},{"name":"wait","in":"query","required":false,"description":"Seconds to wait (max 120) until the owner finishes.","schema":{"type":"integer","minimum":0,"maximum":120}},{"name":"until","in":"query","required":false,"description":"Return when all offered platforms are connected, or as soon as any is.","schema":{"type":"string","enum":["all","any"]}}],"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectLinkStatus"}}}},"400":{"description":"The request is invalid (validation_error, invalid_json...). error.issues lists the fields.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"missing_api_key or invalid_api_key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"insufficient_scope: the key lacks the scope this endpoint needs.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"rate_limited (see Retry-After).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/accounts":{"get":{"operationId":"listAccounts","tags":["Accounts"],"summary":"List connected accounts.","description":"Scope: `accounts:read`.","security":[{"bearerAuth":[]}],"parameters":[{"name":"platform","in":"query","required":false,"description":"Only this network.","schema":{"type":"string","enum":["x","bluesky","linkedin","linkedin_page","mastodon","telegram","threads","facebook","instagram","sandbox"]}},{"name":"external_ref","in":"query","required":false,"description":"Only accounts tagged with this reference.","schema":{"type":"string"}},{"name":"status","in":"query","required":false,"description":"active or needs_reauth.","schema":{"type":"string","enum":["active","needs_reauth"]}}],"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"object":{"type":"string","const":"list"},"data":{"type":"array","items":{"$ref":"#/components/schemas/Account"}},"has_more":{"type":"boolean"},"next_cursor":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["data"],"additionalProperties":true}}}},"400":{"description":"The request is invalid (validation_error, invalid_json...). error.issues lists the fields.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"missing_api_key or invalid_api_key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"insufficient_scope: the key lacks the scope this endpoint needs.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"rate_limited (see Retry-After).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"operationId":"connectAccount","tags":["Accounts"],"summary":"Connect a Bluesky, Mastodon or Telegram account directly with credentials.","description":"X and LinkedIn answer 400 requires_owner_approval: use a connect link. Scope: `accounts:write`.","security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"platform":{"type":"string","description":"A platform that connects with credentials: bluesky, mastodon or telegram. X and LinkedIn need a connect link."},"credentials":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"},"description":"Fields for the platform. bluesky: {identifier, app_password, service?}. mastodon: {instance, access_token}. telegram: {bot_token, chat_id?} (omit chat_id to use the channel the bot was just added to). Never a main account password."},"external_ref":{"description":"Your id for the account owner (client, end user...).","type":"string","maxLength":255}},"required":["platform","credentials"]}}}},"responses":{"201":{"description":"Success.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Account"}}}},"400":{"description":"The request is invalid (validation_error, invalid_json...). error.issues lists the fields.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"missing_api_key or invalid_api_key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"insufficient_scope: the key lacks the scope this endpoint needs.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"rate_limited (see Retry-After).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/accounts/{id}":{"get":{"operationId":"getAccount","tags":["Accounts"],"summary":"Get an account.","description":"Scope: `accounts:read`.","security":[{"bearerAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"description":"The account id.","schema":{"type":"string"}}],"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Account"}}}},"400":{"description":"The request is invalid (validation_error, invalid_json...). error.issues lists the fields.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"missing_api_key or invalid_api_key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"insufficient_scope: the key lacks the scope this endpoint needs.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"rate_limited (see Retry-After).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"delete":{"operationId":"disconnectAccount","tags":["Accounts"],"summary":"Disconnect an account.","description":"Scope: `accounts:write`.","security":[{"bearerAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"description":"The account id.","schema":{"type":"string"}}],"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Account"}}}},"400":{"description":"The request is invalid (validation_error, invalid_json...). error.issues lists the fields.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"missing_api_key or invalid_api_key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"insufficient_scope: the key lacks the scope this endpoint needs.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"rate_limited (see Retry-After).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/posts":{"post":{"operationId":"createPost","tags":["Posts"],"summary":"Publish now or schedule a post to one or more accounts.","description":"dry_run: true validates without publishing and returns a Preflight. wait: true publishes before responding. approval: \"required\" holds the post for a person (status pending_approval, approval.url). Send an Idempotency-Key header so a retry never publishes twice. Scope: `posts:write`.","security":[{"bearerAuth":[]}],"parameters":[{"name":"Idempotency-Key","in":"header","required":false,"description":"Any unique string. The same key and body returns the original post; the same key with a different body is 409 idempotency_key_reused.","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"accounts":{"minItems":1,"maxItems":100,"type":"array","items":{"type":"string"},"description":"Account ids (acc_...) to publish to. A network name (\"x\", \"linkedin\", \"bluesky\", \"mastodon\", \"telegram\", \"threads\", \"facebook\", \"instagram\") also works when the workspace has exactly one active account on it."},"text":{"default":"","type":"string","maxLength":10000},"media":{"default":[],"maxItems":20,"type":"array","items":{"type":"object","properties":{"url":{"type":"string","format":"uri"},"type":{"description":"Guessed from the file extension when omitted. document = PDF, PowerPoint or Word (LinkedIn only).","type":"string","enum":["image","video","document"]},"alt":{"type":"string","maxLength":1000},"title":{"description":"Title for a document (LinkedIn; defaults to the file name) or a video (LinkedIn, Facebook).","type":"string","maxLength":400},"thumbnail":{"description":"Video thumbnail image (JPEG or PNG). Used by LinkedIn, Facebook, and as the Instagram Reel cover.","type":"string","format":"uri"}},"required":["url"]}},"link":{"anyOf":[{"type":"object","properties":{"url":{"type":"string","format":"uri","description":"The page to link to (http or https)."},"title":{"description":"Card title. Defaults to the page's own title.","type":"string","maxLength":300},"description":{"description":"Card description. Defaults to the page's description.","type":"string","maxLength":1000},"thumbnail":{"description":"Card image URL (JPEG or PNG, under 1 MB for Bluesky). Defaults to the page's og:image.","type":"string","format":"uri"}},"required":["url"]},{"type":"null"}],"description":"Share a link as a preview card. LinkedIn and Bluesky get a full card (image, title, domain; clicking it opens the URL). Facebook Pages, Threads, X, Mastodon and Telegram show the page's own preview, with the URL added to the text where needed. Instagram has no clickable links, so the link is left out there. On LinkedIn and Bluesky a link can't be combined with media: use link.thumbnail for the image."},"thread":{"default":[],"description":"Follow-up posts published as a thread: each replies to the one before. Works on X, Bluesky, Mastodon and Telegram; elsewhere only the first post goes out (with a thread_not_supported warning).","maxItems":25,"type":"array","items":{"type":"object","properties":{"text":{"default":"","type":"string","maxLength":10000},"media":{"default":[],"maxItems":20,"type":"array","items":{"type":"object","properties":{"url":{"type":"string","format":"uri"},"type":{"description":"Guessed from the file extension when omitted. document = PDF, PowerPoint or Word (LinkedIn only).","type":"string","enum":["image","video","document"]},"alt":{"type":"string","maxLength":1000},"title":{"description":"Title for a document (LinkedIn; defaults to the file name) or a video (LinkedIn, Facebook).","type":"string","maxLength":400},"thumbnail":{"description":"Video thumbnail image (JPEG or PNG). Used by LinkedIn, Facebook, and as the Instagram Reel cover.","type":"string","format":"uri"}},"required":["url"]}}}}},"reply_to":{"description":"A post id (post_...) from this workspace to reply to. On each account, the new post replies to that post's published copy. X, Bluesky, Mastodon and Telegram.","type":["string","null"]},"poll":{"anyOf":[{"type":"object","properties":{"question":{"description":"The question. LinkedIn and Telegram show it separately; elsewhere the post's text is the question. Defaults to the text.","type":"string","maxLength":300},"options":{"minItems":2,"maxItems":10,"type":"array","items":{"type":"string","minLength":1,"maxLength":100},"description":"2 to 4 choices (Telegram allows up to 10). Per-network length limits apply."},"duration_minutes":{"description":"How long it stays open. Default 1 day. LinkedIn rounds to 1, 3, 7 or 14 days; Telegram polls stay open until closed.","type":"integer","minimum":5,"maximum":43200},"multiple":{"description":"Allow several answers (Mastodon and Telegram).","type":"boolean"}},"required":["options"]},{"type":"null"}],"description":"A poll. X, LinkedIn, Mastodon and Telegram. Can't be combined with media."},"first_comment":{"anyOf":[{"type":"string","minLength":1,"maxLength":1250},{"type":"null"}],"description":"Posted as a comment by the same account right after the post goes out, e.g. to hold the link. LinkedIn profiles and Pages; elsewhere it's skipped with a warning (use thread on X, Bluesky, Mastodon and Telegram)."},"platform_options":{"default":{},"description":"Per-network settings, keyed by platform: a `text` override for any network, plus x.reply_settings, bluesky.langs, mastodon.visibility / spoiler_text / sensitive / language, telegram.disable_notification / protect_content, instagram.format (post|story) / share_to_feed / cover_url / thumb_offset / audio_name / collaborators, linkedin.visibility, linkedin_page.visibility and threads.reply_control. Example: {\"mastodon\": {\"spoiler_text\": \"Spoilers\"}, \"x\": {\"text\": \"Shorter for X\"}}.","type":"object","properties":{"x":{"type":"object","properties":{"text":{"description":"Text for this network instead of the post's text.","type":"string","maxLength":10000},"reply_settings":{"description":"Who can reply. Omit for everyone.","type":"string","enum":["following","mentionedUsers","subscribers","verified"]}},"additionalProperties":false},"bluesky":{"type":"object","properties":{"text":{"description":"Text for this network instead of the post's text.","type":"string","maxLength":10000},"langs":{"description":"Languages of the post, e.g. [\"en\"]. Helps feeds and translation.","maxItems":3,"type":"array","items":{"type":"string","pattern":"^[a-zA-Z]{2,3}(-[a-zA-Z0-9]{2,8})*$"}}},"additionalProperties":false},"mastodon":{"type":"object","properties":{"text":{"description":"Text for this network instead of the post's text.","type":"string","maxLength":10000},"visibility":{"description":"public (default), unlisted (not in public timelines), private (followers only) or direct (mentioned people only).","type":"string","enum":["public","unlisted","private","direct"]},"spoiler_text":{"description":"Content warning shown before the post; the text stays hidden until opened.","type":"string","maxLength":500},"sensitive":{"description":"Hide the media behind a sensitive-content warning.","type":"boolean"},"language":{"description":"Language of the post, e.g. \"en\".","type":"string","pattern":"^[a-zA-Z]{2,3}(-[a-zA-Z0-9]{2,8})*$"}},"additionalProperties":false},"telegram":{"type":"object","properties":{"text":{"description":"Text for this network instead of the post's text.","type":"string","maxLength":10000},"disable_notification":{"description":"Send silently: subscribers get no sound.","type":"boolean"},"protect_content":{"description":"Stop the message from being forwarded or saved.","type":"boolean"}},"additionalProperties":false},"linkedin":{"type":"object","properties":{"text":{"description":"Text for this network instead of the post's text.","type":"string","maxLength":10000},"visibility":{"description":"PUBLIC (default), CONNECTIONS (1st-degree connections only) or LOGGED_IN (signed-in LinkedIn members).","type":"string","enum":["PUBLIC","CONNECTIONS","LOGGED_IN"]}},"additionalProperties":false},"linkedin_page":{"type":"object","properties":{"text":{"description":"Text for this network instead of the post's text.","type":"string","maxLength":10000},"visibility":{"description":"PUBLIC (default) or LOGGED_IN (signed-in LinkedIn members).","type":"string","enum":["PUBLIC","LOGGED_IN"]}},"additionalProperties":false},"threads":{"type":"object","properties":{"text":{"description":"Text for this network instead of the post's text.","type":"string","maxLength":10000},"reply_control":{"description":"Who can reply. Defaults to everyone.","type":"string","enum":["everyone","accounts_you_follow","mentioned_only","parent_post_author_only","followers_only"]}},"additionalProperties":false},"facebook":{"type":"object","properties":{"text":{"description":"Text for this network instead of the post's text.","type":"string","maxLength":10000}},"additionalProperties":false},"instagram":{"type":"object","properties":{"text":{"description":"Text for this network instead of the post's text.","type":"string","maxLength":10000},"format":{"description":"post (default: a feed post, or a Reel for a single video) or story (one image or video, no caption).","type":"string","enum":["post","story"]},"share_to_feed":{"description":"Reels: also show the Reel in the main feed grid (Instagram's default is yes).","type":"boolean"},"cover_url":{"description":"Reels: a JPEG to use as the cover.","type":"string","format":"uri"},"thumb_offset":{"description":"Reels: the frame to use as the cover, in milliseconds from the start (ignored with cover_url).","type":"integer","minimum":0,"maximum":9007199254740991},"audio_name":{"description":"Reels: a name for the Reel's original audio.","type":"string","maxLength":100},"collaborators":{"description":"Up to 3 usernames to invite as collaborators (feed posts and Reels).","maxItems":3,"type":"array","items":{"type":"string","pattern":"^@?[\\w.]{1,30}$"}}},"additionalProperties":false},"sandbox":{"type":"object","properties":{"text":{"description":"Text for this network instead of the post's text.","type":"string","maxLength":10000}},"additionalProperties":false}},"additionalProperties":false},"scheduled_at":{"description":"When to publish: ISO-8601 with an offset (\"2026-11-05T09:00:00-08:00\", \"...Z\"), or a local time (\"2026-11-05T09:00\") together with timezone. Omit to publish now.","type":["string","null"]},"timezone":{"description":"IANA time zone for a local scheduled_at, for example \"America/Los_Angeles\".","type":"string"},"approval":{"description":"\"required\" holds the post until a person approves it: it is created as pending_approval with approval.url, a page where they see each network's version and choose Approve or Reject (with a note). Give that url to the person. Keys created with require_approval always need it.","type":"string","enum":["required","none"]},"dry_run":{"default":false,"type":"boolean"},"wait":{"default":false,"type":"boolean"},"idempotency_key":{"type":"string","maxLength":255},"metadata":{"default":{},"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}}},"required":["accounts"]}}}},"responses":{"201":{"description":"Success.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Post"}}}},"400":{"description":"The request is invalid (validation_error, invalid_json...). error.issues lists the fields.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"missing_api_key or invalid_api_key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"insufficient_scope: the key lacks the scope this endpoint needs.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"preflight_failed: the post would fail a check; error.issues lists each one with a fix. Nothing was published.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"rate_limited (see Retry-After).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"get":{"operationId":"listPosts","tags":["Posts"],"summary":"List posts, newest first.","description":"Scope: `posts:read`.","security":[{"bearerAuth":[]}],"parameters":[{"name":"status","in":"query","required":false,"description":"Only posts in this status.","schema":{"type":"string","enum":["pending_approval","scheduled","publishing","published","partially_published","failed","canceled","deleted"]}},{"name":"limit","in":"query","required":false,"description":"1 to 100, default 20.","schema":{"type":"integer","minimum":1,"maximum":100}},{"name":"before","in":"query","required":false,"description":"A post id: return older posts (use next_cursor).","schema":{"type":"string"}}],"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"object":{"type":"string","const":"list"},"data":{"type":"array","items":{"$ref":"#/components/schemas/Post"}},"has_more":{"type":"boolean"},"next_cursor":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["data"],"additionalProperties":true}}}},"400":{"description":"The request is invalid (validation_error, invalid_json...). error.issues lists the fields.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"missing_api_key or invalid_api_key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"insufficient_scope: the key lacks the scope this endpoint needs.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"rate_limited (see Retry-After).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/posts/{id}":{"get":{"operationId":"getPost","tags":["Posts"],"summary":"Get a post and its result on each account; long-polls with ?wait= while it waits for approval.","description":"Scope: `posts:read`.","security":[{"bearerAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"description":"The post id.","schema":{"type":"string"}},{"name":"wait","in":"query","required":false,"description":"Seconds to wait (max 120) while the post is pending_approval.","schema":{"type":"integer","minimum":0,"maximum":120}}],"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Post"}}}},"400":{"description":"The request is invalid (validation_error, invalid_json...). error.issues lists the fields.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"missing_api_key or invalid_api_key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"insufficient_scope: the key lacks the scope this endpoint needs.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"rate_limited (see Retry-After).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"delete":{"operationId":"deletePost","tags":["Posts"],"summary":"Delete a post everywhere it went out; cancels copies not yet published.","description":"Published copies are deleted from X, Bluesky, Mastodon, LinkedIn, Telegram and Facebook. Instagram and Threads answer delete_not_supported on the target. Scope: `posts:write`.","security":[{"bearerAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"description":"The post id.","schema":{"type":"string"}},{"name":"accounts","in":"query","required":false,"description":"Comma-separated account ids to delete it from only some accounts.","schema":{"type":"string"}}],"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Post"}}}},"400":{"description":"The request is invalid (validation_error, invalid_json...). error.issues lists the fields.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"missing_api_key or invalid_api_key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"insufficient_scope: the key lacks the scope this endpoint needs.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"rate_limited (see Retry-After).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/posts/{id}/metrics":{"get":{"operationId":"getPostMetrics","tags":["Posts"],"summary":"Likes, reposts, replies, views and more for each published copy, plus totals.","description":"Read from each network and cached for 15 minutes. X bills $0.005 per read, passed through. Scope: `posts:read`.","security":[{"bearerAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"description":"The post id.","schema":{"type":"string"}}],"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PostMetrics"}}}},"400":{"description":"The request is invalid (validation_error, invalid_json...). error.issues lists the fields.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"missing_api_key or invalid_api_key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"insufficient_scope: the key lacks the scope this endpoint needs.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"rate_limited (see Retry-After).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/media":{"post":{"operationId":"uploadMedia","tags":["Media"],"summary":"Upload a file of up to 4 MB and get a URL to use in a post.","description":"Send the raw bytes with their Content-Type, or JSON {data_base64, content_type}. Scope: `posts:write`.","security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"data_base64":{"type":"string"},"content_type":{"type":"string"}},"required":["data_base64","content_type"]}}}},"responses":{"201":{"description":"Success.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Media"}}}},"400":{"description":"The request is invalid (validation_error, invalid_json...). error.issues lists the fields.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"missing_api_key or invalid_api_key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"insufficient_scope: the key lacks the scope this endpoint needs.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"rate_limited (see Retry-After).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/media/uploads":{"post":{"operationId":"createMediaUpload","tags":["Media"],"summary":"Get a signed URL for uploading a file of up to 200 MB.","description":"PUT the bytes to upload_url with the returned headers, then use url in a post. Valid 2 hours. Scope: `posts:write`.","security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"content_type":{"type":"string"},"size_bytes":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}},"required":["content_type"]}}}},"responses":{"201":{"description":"Success.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MediaUpload"}}}},"400":{"description":"The request is invalid (validation_error, invalid_json...). error.issues lists the fields.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"missing_api_key or invalid_api_key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"insufficient_scope: the key lacks the scope this endpoint needs.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"rate_limited (see Retry-After).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/webhooks":{"post":{"operationId":"createWebhook","tags":["Webhooks"],"summary":"Send events to an https URL. Returns the signing secret once.","description":"Events: post.published, post.partially_published, post.failed, post.canceled, post.deleted, post.approval_requested, post.approved, post.rejected, account.connected, account.needs_reauth, account.disconnected, or [\"*\"]. Deliveries carry Socials-Signature: t=<unix>,v1=<hex>, where v1 = HMAC_SHA256(secret, \"<t>.<raw body>\"). Scope: `admin`.","security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"url":{"type":"string","format":"uri"},"events":{"default":["*"],"type":"array","items":{"type":"string"}}},"required":["url"]}}}},"responses":{"201":{"description":"Success.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Webhook"}}}},"400":{"description":"The request is invalid (validation_error, invalid_json...). error.issues lists the fields.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"missing_api_key or invalid_api_key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"insufficient_scope: the key lacks the scope this endpoint needs.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"rate_limited (see Retry-After).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"get":{"operationId":"listWebhooks","tags":["Webhooks"],"summary":"List webhook endpoints.","description":"Scope: `admin`.","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"object":{"type":"string","const":"list"},"data":{"type":"array","items":{"$ref":"#/components/schemas/Webhook"}},"has_more":{"type":"boolean"},"next_cursor":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["data"],"additionalProperties":true}}}},"400":{"description":"The request is invalid (validation_error, invalid_json...). error.issues lists the fields.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"missing_api_key or invalid_api_key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"insufficient_scope: the key lacks the scope this endpoint needs.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"rate_limited (see Retry-After).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/webhooks/{id}":{"delete":{"operationId":"deleteWebhook","tags":["Webhooks"],"summary":"Delete a webhook endpoint.","description":"Scope: `admin`.","security":[{"bearerAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"description":"The webhook id.","schema":{"type":"string"}}],"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Deleted"}}}},"400":{"description":"The request is invalid (validation_error, invalid_json...). error.issues lists the fields.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"missing_api_key or invalid_api_key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"insufficient_scope: the key lacks the scope this endpoint needs.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"rate_limited (see Retry-After).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/keys":{"get":{"operationId":"listKeys","tags":["Keys"],"summary":"List API keys (never the key values).","description":"Scope: `admin`.","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"object":{"type":"string","const":"list"},"data":{"type":"array","items":{"$ref":"#/components/schemas/ApiKey"}},"has_more":{"type":"boolean"},"next_cursor":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["data"],"additionalProperties":true}}}},"400":{"description":"The request is invalid (validation_error, invalid_json...). error.issues lists the fields.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"missing_api_key or invalid_api_key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"insufficient_scope: the key lacks the scope this endpoint needs.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"rate_limited (see Retry-After).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"operationId":"createKey","tags":["Keys"],"summary":"Create an API key, optionally limited by scopes, accounts, approval or a daily post cap.","description":"Returns the key once. A key limited by account_ids, require_approval or daily_post_limit can't hold the admin scope. Scope: `admin`.","security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"default":"default","type":"string","minLength":1,"maxLength":100},"scopes":{"description":"What the key may do: posts:read, posts:write (implies posts:read and accounts:read), accounts:read, accounts:write (implies accounts:read), admin (everything, plus keys, webhooks and upgrade links). Omit for full access.","minItems":1,"type":"array","items":{"type":"string","enum":["posts:read","posts:write","accounts:read","accounts:write","admin"]}},"account_ids":{"description":"Limit the key to these accounts: it only lists them and can only post to them.","minItems":1,"maxItems":100,"type":"array","items":{"type":"string"}},"require_approval":{"description":"Every post this key creates waits for a person to approve it (see approval on create_post).","type":"boolean"},"daily_post_limit":{"description":"Most posts the key may create in any 24 hours.","type":"integer","minimum":1,"maximum":10000}}}}}},"responses":{"201":{"description":"Success.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiKey"}}}},"400":{"description":"The request is invalid (validation_error, invalid_json...). error.issues lists the fields.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"missing_api_key or invalid_api_key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"insufficient_scope: the key lacks the scope this endpoint needs.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"rate_limited (see Retry-After).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/keys/{id}":{"delete":{"operationId":"revokeKey","tags":["Keys"],"summary":"Revoke an API key. The last active key can't be revoked.","description":"Scope: `admin`.","security":[{"bearerAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"description":"The key id.","schema":{"type":"string"}}],"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiKey"}}}},"400":{"description":"The request is invalid (validation_error, invalid_json...). error.issues lists the fields.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"missing_api_key or invalid_api_key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"insufficient_scope: the key lacks the scope this endpoint needs.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"rate_limited (see Retry-After).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}},"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","description":"An API key (sk_...). Get one with POST /v1/workspaces. Scopes: posts:read (Read posts, delivery results, metrics and usage); posts:write (Publish, schedule, cancel and delete posts, and upload media); accounts:read (List connected accounts); accounts:write (Create connect links, connect accounts and disconnect them); admin (Manage API keys, webhooks, the owner email and upgrade links)."}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"fix":{"type":"string"},"issues":{"type":"array","items":{"$ref":"#/components/schemas/Issue"}},"request_id":{"type":"string"}},"required":["code","message"],"additionalProperties":true}},"required":["error"],"additionalProperties":true},"Issue":{"type":"object","properties":{"code":{"type":"string","description":"Stable machine-readable code, e.g. text_too_long."},"message":{"type":"string"},"fix":{"type":"string","description":"What to do about it."},"severity":{"type":"string","enum":["error","warning"]},"account_id":{"type":"string"},"platform":{"type":"string"},"field":{"type":"string"}},"required":["code","message","severity"],"additionalProperties":true},"Approval":{"type":"object","properties":{"status":{"type":"string","enum":["pending","approved","rejected"]},"url":{"type":"string","description":"The page where a person approves or rejects this post. Give it to them."},"note":{"anyOf":[{"type":"string","description":"What the reviewer wrote when deciding."},{"type":"null"}]},"decided_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}]}},"required":["status","url"],"additionalProperties":true},"Target":{"type":"object","properties":{"id":{"type":"string"},"account_id":{"type":"string"},"platform":{"type":"string"},"status":{"type":"string","enum":["pending","publishing","published","failed","canceled","deleted"]},"url":{"anyOf":[{"type":"string"},{"type":"null"}]},"external_post_id":{"anyOf":[{"type":"string"},{"type":"null"}]},"attempts":{"type":"integer"},"next_attempt_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}]},"published_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}]},"verified":{"type":"boolean","description":"True when we read the post back from the network."},"error":{"anyOf":[{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"fix":{"type":"string"},"retryable":{"type":"boolean"}},"required":["code","message","retryable"],"additionalProperties":true},{"type":"null"}]}},"required":["id","account_id","platform","status"],"additionalProperties":true},"Post":{"type":"object","properties":{"id":{"type":"string"},"object":{"type":"string","enum":["post","preflight"],"description":"A dry run returns \"preflight\" with ok, issues and preview instead of a post."},"status":{"type":"string","enum":["pending_approval","scheduled","publishing","published","partially_published","failed","canceled","deleted"]},"text":{"type":"string"},"scheduled_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}]},"created_at":{"type":"string","format":"date-time"},"completed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}]},"approval":{"anyOf":[{"$ref":"#/components/schemas/Approval"},{"type":"null"}]},"targets":{"type":"array","items":{"$ref":"#/components/schemas/Target"}},"warnings":{"type":"array","items":{"$ref":"#/components/schemas/Issue"}},"ok":{"type":"boolean","description":"Dry runs only."},"issues":{"type":"array","items":{"$ref":"#/components/schemas/Issue"},"description":"Dry runs only."},"preview":{"type":"array","items":{"type":"object","properties":{"account_id":{"type":"string"},"platform":{"type":"string"},"text":{"type":"string"}},"additionalProperties":true},"description":"Dry runs only: the exact text each account would publish."}},"required":["object"],"additionalProperties":true},"PostMetrics":{"type":"object","properties":{"object":{"type":"string"},"post_id":{"type":"string"},"totals":{"type":"object","properties":{},"additionalProperties":true},"targets":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":true}}},"additionalProperties":true},"Account":{"type":"object","properties":{"id":{"type":"string"},"object":{"type":"string"},"platform":{"type":"string","enum":["x","bluesky","linkedin","linkedin_page","mastodon","telegram","threads","facebook","instagram","sandbox"]},"handle":{"anyOf":[{"type":"string"},{"type":"null"}]},"display_name":{"anyOf":[{"type":"string"},{"type":"null"}]},"avatar_url":{"anyOf":[{"type":"string"},{"type":"null"}]},"external_ref":{"anyOf":[{"type":"string"},{"type":"null"}]},"status":{"type":"string","enum":["active","needs_reauth"]},"connected_at":{"type":"string","format":"date-time"}},"required":["id","platform","status"],"additionalProperties":true},"ConnectLink":{"type":"object","properties":{"id":{"type":"string"},"object":{"type":"string"},"url":{"type":"string","description":"Send this to the account owner."},"start_urls":{"type":"object","properties":{},"additionalProperties":true},"platforms":{"type":"array","items":{"type":"string"}},"external_ref":{"anyOf":[{"type":"string"},{"type":"null"}]},"expires_at":{"type":"string","format":"date-time"}},"required":["id","url"],"additionalProperties":true},"ConnectLinkStatus":{"type":"object","properties":{"id":{"type":"string"},"object":{"type":"string"},"status":{"type":"string","enum":["connected","partially_connected","waiting","expired"]},"connected":{"type":"array","items":{"$ref":"#/components/schemas/Account"}},"pending_platforms":{"type":"array","items":{"type":"string"}},"expires_at":{"type":"string","format":"date-time"}},"required":["id","status"],"additionalProperties":true},"Platform":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"available":{"type":"boolean"},"in_review":{"type":"boolean"},"connect":{"type":"string"},"max_chars":{"type":"integer"},"max_images":{"type":"integer"},"supports_video":{"type":"boolean"},"daily_post_cap":{"type":"integer"}},"required":["id","name","available"],"additionalProperties":true},"Workspace":{"type":"object","properties":{"object":{"type":"string"},"id":{"type":"string"},"name":{"type":"string"},"plan":{"type":"string","enum":["free","hobby","pro","growth","scale"]},"owner_email":{"anyOf":[{"type":"string"},{"type":"null"}]},"created_at":{"type":"string","format":"date-time"}},"required":["id","name","plan"],"additionalProperties":true},"WorkspaceCreated":{"type":"object","properties":{"object":{"type":"string"},"id":{"type":"string"},"name":{"type":"string"},"plan":{"type":"string"},"owner_email":{"anyOf":[{"type":"string"},{"type":"null"}]},"api_key":{"type":"string","description":"Shown once. Store it."},"note":{"type":"string"}},"required":["id","api_key"],"additionalProperties":true},"Usage":{"type":"object","properties":{"object":{"type":"string"},"plan":{"type":"object","properties":{},"additionalProperties":true},"active_accounts":{"type":"integer"},"posts":{"type":"integer"},"estimated_cost":{"anyOf":[{"type":"number"},{"type":"null"}]},"recommended_plan":{"anyOf":[{"type":"object","properties":{"id":{"type":"string"},"monthly_cost":{"type":"number"}},"additionalProperties":true},{"type":"null"}]}},"additionalProperties":true},"UpgradeLink":{"type":"object","properties":{"object":{"type":"string"},"plan":{"type":"string","enum":["hobby","pro","growth","scale"]},"kind":{"type":"string","enum":["checkout","portal"]},"url":{"type":"string","description":"Give this to the workspace owner."},"monthly_price":{"type":"number"}},"required":["plan","url"],"additionalProperties":true},"Media":{"type":"object","properties":{"url":{"type":"string","description":"Use in a post's media."}},"required":["url"],"additionalProperties":true},"MediaUpload":{"type":"object","properties":{"upload_url":{"type":"string"},"method":{"type":"string"},"headers":{"type":"object","properties":{},"additionalProperties":true},"url":{"type":"string"}},"required":["upload_url","url"],"additionalProperties":true},"Webhook":{"type":"object","properties":{"id":{"type":"string"},"object":{"type":"string"},"url":{"type":"string"},"events":{"type":"array","items":{"type":"string"}},"secret":{"type":"string","description":"Returned only when the endpoint is created."}},"required":["id","url"],"additionalProperties":true},"ApiKey":{"type":"object","properties":{"id":{"type":"string"},"object":{"type":"string"},"name":{"type":"string"},"prefix":{"type":"string"},"current":{"type":"boolean"},"scopes":{"anyOf":[{"type":"array","items":{"type":"string","enum":["posts:read","posts:write","accounts:read","accounts:write","admin"]},"description":"null = full access."},{"type":"null"}]},"account_ids":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}]},"require_approval":{"type":"boolean"},"daily_post_limit":{"anyOf":[{"type":"integer"},{"type":"null"}]},"key":{"type":"string","description":"Returned only when the key is created."}},"required":["id","name"],"additionalProperties":true},"Deleted":{"type":"object","properties":{"id":{"type":"string"},"object":{"type":"string"},"deleted":{"type":"boolean"}},"additionalProperties":true},"Index":{"type":"object","properties":{"object":{"type":"string"},"name":{"type":"string"},"version":{"type":"string"},"docs":{"type":"string"},"openapi":{"type":"string"},"mcp":{"type":"string"},"endpoints":{"type":"object","properties":{},"additionalProperties":true}},"additionalProperties":true}}}}