get_account_info
Get the authenticated user's profile and business information.
No parameters.
MCP
One endpoint exposes 77 tools covering content generation, media, publishing, analytics and engagement. Any Model Context Protocol client can drive it, and so can plain HTTP.
POSThttps://www.oriiion.ai/mcpPOSThttps://www.oriiion.ai/mcp
Amber marks the 15 tools that need an elevated role — see Restricted tools.
JSON-RPC 2.0 over Streamable HTTP. Every request is a POST to the single endpoint above — there is no per-resource URL scheme.
Accept: application/json, text/event-stream. A client that will not accept an event stream is rejected by the transport. text/event-stream, so a single reply arrives framed as event: message followed by a data: line. Parse the frame before parsing the JSON. www host. The apex redirects with 307, which preserves the method and body, so a POST does survive the hop — but it costs a round trip on every call. Two options. An API key suits server-to-server integrations where one credential maps to one account. OAuth suits products that act for many oriiion users, each signing in themselves.
Keys are minted at /dashboard/api and prefixed orin_sk_. The full value is shown once. Either header is accepted on /mcp:
X-API-Key: orin_sk_…
Authorization: Bearer orin_sk_… OAuth 2.1, authorization code with PKCE (S256). Access tokens are prefixed orin_at_ and sent as Authorization: Bearer. Discovery metadata is served at /.well-known/oauth-authorization-server, so most clients need only the endpoint URL.
| Authorization server metadata | /.well-known/oauth-authorization-server |
|---|---|
| Protected resource metadata | /.well-known/oauth-protected-resource |
| Client registration | /api/mcp-oauth/register |
| Authorization | /oauth/authorize |
| Token | /api/mcp-oauth/token |
Clients register dynamically — there is no manual onboarding step and no client secret. The server advertises token_endpoint_auth_methods_supported: ["none"], so it is public-client only; a confidential client that insists on authenticating at the token endpoint will fail. There is one scope, mcp, granting everything the signed-in account can do. Tokens are refreshable, and the account holder can revoke a connection at any time from /dashboard/api.
This trips people up, so it is worth stating plainly. The JSON-RPC endpoint and the upload endpoints accept every credential form. The remaining HTTP endpoints authenticate through the app's own middleware, which reads an API key only from X-API-Key — a Bearer header there is treated as a session token and rejected.
| Surface | X-API-Key | Bearer orin_sk_ | Bearer orin_at_ |
|---|---|---|---|
| POST /mcp | |||
| /api/mcp/upload* | |||
| other /api/* routes |
A client may connect, negotiate and discover without credentials: initialize, ping, any notifications/*, tools/list, prompts/list and prompts/get all succeed anonymously. So does calling get_pricing — the only tool that does.
Anything else returns JSON-RPC error -32000 with a 401 status:
{
"jsonrpc": "2.0",
"error": {
"code": -32000,
"message": "Missing credentials. Connect via OAuth, or send an API key as X-API-Key or Authorization: Bearer."
},
"id": null
} The 401 also carries a WWW-Authenticate challenge pointing at the protected-resource metadata (RFC 9728). That is what makes OAuth-capable clients such as Claude and ChatGPT show an in-chat connect card and retry once the user signs in, rather than surfacing a dead error. An invalid, expired or revoked credential returns the same shape with the message Invalid, expired or revoked credentials.
Discovery needs no credential, which makes it the fastest way to confirm you can reach the server at all:
curl -X POST https://www.oriiion.ai/mcp \
-H 'Content-Type: application/json' \
-H 'Accept: application/json, text/event-stream' \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}' Calling a tool follows the standard tools/call shape. Arguments are validated against the tool's input schema before the call runs:
curl -X POST https://www.oriiion.ai/mcp \
-H 'Content-Type: application/json' \
-H 'Accept: application/json, text/event-stream' \
-H 'X-API-Key: orin_sk_…' \
-d '{
"jsonrpc": "2.0",
"id": 2,
"method": "tools/call",
"params": {
"name": "get_top_posts",
"arguments": { "days": 30, "platform": "instagram", "limit": 5 }
}
}' Tools return their payload as text content — JSON-encoded for anything structured, so parse result.content[0].text rather than expecting a typed body.
Two distinct failure channels, and conflating them is the most common integration bug:
error object — malformed requests, unknown methods, missing credentials. These have no result. isError: true and a human-readable message. A post that does not exist, a platform that is not connected, or a role-gated tool all land here. Checking only for error will read these as successes. Generation and media processing return a handle immediately rather than blocking. Each one has a specific companion tool to poll — they are not interchangeable, and there is no single generic status endpoint.
| Start with | Poll with |
|---|---|
| generate_posts | get_generation_status |
| generate_from_product | get_generation_status |
| generate_from_news | get_generation_status |
| edit_image | get_task_status |
| create_post_from_video | get_task_status |
| process_video | get_task_status |
| create_video_shoot | get_video_shoot_status |
MCP has no binary channel, so bytes travel over ordinary HTTP — gated by the same credential as /mcp, never a weaker one. Every upload route returns a permanent oriiion URL, which is what the media tools (create_post_from_image, create_document_post, change_image and the rest) expect.
POST /api/mcp/upload, either as multipart/form-data with a file part, or as JSON with { filename, contentBase64 }.
curl -X POST https://www.oriiion.ai/api/mcp/upload \
-H 'X-API-Key: orin_sk_…' \
-F 'file=@product-shot.jpg' 4.5 MB is a hard serverless request-body limit, so bigger files go around it in three steps: POST /api/mcp/upload-token with { filename, contentType, size } returns a client token and an upload URL; PUT the bytes there directly; then confirm with POST /api/mcp/upload-register and the resulting URL so the file is registered to the account. The storage path is assigned server-side — registering a URL outside your own account's prefix is rejected. Alternatively create_upload_link returns a short-lived page a person can open on their phone to upload directly.
15 of the 77 tools require an elevated role and are unavailable on a standard account. They are still advertised in tools/list, so a client will show them and may try to call one — the call fails as a tool error, not a protocol error, with a message explaining the tool is unavailable for the account. Treat them as absent when planning an integration; they are marked
All 77 tools, grouped by area.
Read and update the profile every generated post is grounded in, and check what the account has connected.
Get the authenticated user's profile and business information.
No parameters.
Update the user's business profile information. All fields are optional — only provided fields will be updated.
Parameters
businessNamestringbusinessCategorystringbusinessLocationstringwebsiteUrlstringbusinessGoalstringbusinessAboutstringbusinessSlogansstringpostingLanguagestringtimezonestringSet the user's account type. This affects which social platforms are required during onboarding.
Parameters
accountTypestring required List all social media platforms the user has connected (Facebook, Instagram, LinkedIn, X). Shows page names and usernames.
No parameters.
Check the user's onboarding progress. Returns which steps are completed, which are required, and whether onboarding is fully complete.
No parameters.
Generate onboarding links for the user's remaining steps (payment, Instagram, Facebook, LinkedIn connections). Returns direct links the user can click to complete each step.
No parameters.
Mark the user's onboarding as complete. Only works once all required steps (payment + required social connection) are done — verify with get_onboarding_status first. Call this at the end of a successful onboarding conversation.
No parameters.
Scrape the user's website and auto-extract business name, category and description into their profile (only fills fields that are still empty). Use during onboarding so the user doesn't have to type what their site already says. Show the user what was found and confirm it.
Parameters
websiteUrlstring required Performance across connected platforms. Every tool takes a look-back window and returns change against the previous period.
Headline social-media performance for the account over a period: total views, reach, engagements (likes/comments/shares/saves), posts and followers, each with change vs the previous period. Use this to understand overall account health.
Parameters
daysnumberplatformstringPer-platform breakdown of performance (views, reach, engagements, followers, engagement rate) ranked so you can see which platform delivers the most value for this customer. Use it to decide where to focus.
Parameters
daysnumberThe best-performing published posts by engagement, with their captions, platforms, media type and metrics. Study these to learn what content resonates and create more of what works.
Parameters
daysnumberplatformstringlimitnumberEngagement-weighted best times to post (day + hour, UTC) based on the account's own history, plus concrete upcoming datetimes to schedule at. Use before scheduling to maximise reach.
Parameters
platformstringFollower counts and growth per connected account over a period. Use alongside engagement to judge which platforms are worth investing in.
Parameters
daysnumberA synthesized 'what's working' briefing combining the best platform, best posting times, top posts and the engagement mix into actionable guidance for creating better content. Call this before generating new posts to ground them in what performs.
Parameters
daysnumberCreate posts and edit them before they go anywhere. Generation is asynchronous — see Async work below.
List the user's social media posts. Supports filtering by status and platform. Returns up to 50 posts at a time.
Parameters
statusstringplatformstringlimitnumberoffsetnumberGet a single post by ID, including its carousel media items if any.
Parameters
postIdnumber required Generate new social media posts using AI. Creates posts asynchronously — returns a task ID and group ID to track progress. Use get_generation_status to poll for completion.
Returns immediately — poll get_generation_status for the result.
Parameters
descriptionstringcountnumberCheck the status of an async post generation batch. Returns 'generating', 'completed', 'failed', or 'partial'.
Parameters
groupIdstring required Update the caption/text of an existing post. Without a platform, the main caption is updated everywhere. With a platform, only that platform's caption variant is changed (other platforms keep theirs).
Parameters
postIdnumber required captionstring required platformstringAI-generate platform-specific caption variants (Facebook, Instagram, LinkedIn, X, etc.) for one post, tailored to each connected platform's style and character limits. The base caption stays unchanged; each platform publishes its own variant.
Parameters
postIdnumber required Add mentions/tags to a post. Instagram: photo tags (usernames) and collaborators (max 3). LinkedIn: mentions as { name, url } pairs — the caption must contain '@<name>' for each one. Applied when the post is published.
Parameters
postIdnumber required platformstring required usernamesstring[]collaboratorsstring[]linkedinMentionsobject[]Set an automatic first comment for a post (posted right after publishing — commonly used for hashtags or links). Supported on Facebook, Instagram and LinkedIn. Pass an empty string to remove it.
Parameters
postIdnumber required platformstring required commentstring required Create two links to a visual page of the user's generated posts. ownerLink = full EDIT powers: edit each platform's caption, AI-edit / replace / add images, and schedule (great when chat can't render images, or as a QR on a phone) — share only with people trusted to edit. reviewLink = read-only EXTERNAL APPROVAL: view every platform's caption, leave comments (a thread) and approve or request changes — safe to share with a client or colleague; their feedback notifies the user and shows in their dashboard Reviews tab. Defaults to the latest generation batch.
Parameters
groupIdstringDelete a post. Only draft and scheduled posts can be deleted. Published posts cannot be deleted.
Parameters
postIdnumber required The two tools that reach the outside world. Both act on the account’s real connected profiles.
Publish a draft post. By default it goes to all the user's configured platforms. Pass platforms to publish to a specific subset only (e.g. only LinkedIn). Only draft posts can be published.
Parameters
postIdnumber required platformsstring[]Schedule a draft post for a specific date and time. The post will be automatically published at the scheduled time.
Parameters
postIdnumber required scheduledForstring required Establish who the account is before generating for it: voice, visual style, and the profiles worth learning from.
Find the user's social media profiles (Instagram, LinkedIn, Facebook, YouTube, TikTok, X) by harvesting links from their website and web-searching for official profiles. Returns candidates only — confirm with the user, then save with set_social_profiles.
No parameters.
Save the user's confirmed social media profile URLs to their account.
Parameters
instagramstringlinkedinstringfacebookstringyoutubestringtiktokstringxstringCollect candidate brand images from the user's website, Instagram posts and earlier research (up to 24). Show them to the user to pick from, then save the selection with select_brand_images.
Parameters
instagramHandlestringSave the user's chosen brand images as visual references for post generation.
Parameters
imageUrlsstring[] required Analyze the user's website (screenshot + AI vision) to extract their brand identity: logo, brand colors and fonts. Takes ~20-30 seconds. Nothing is saved — show the result to the user and persist their confirmed version with set_brand_identity.
Parameters
websiteUrlstringGet the user's saved brand identity: logo, colors, fonts, AI-image setting, and content style guide (include/exclude rules).
No parameters.
Save the user's confirmed brand identity. Only provided fields are updated.
Parameters
logoUrlstringcolorsobjectfontsobjectGenerate a content style guide (tone of voice, dos, don'ts, emoji & hashtag policy) from the user's saved business profile. Nothing is saved — show it to the user, apply their edits, then persist with save_style_guide.
Parameters
toneHintstringPersist the user's confirmed content style guide. It feeds directly into post generation (include/exclude rules).
Parameters
toneOfVoicestringdosstring[]dontsstring[]emojiPolicystringhashtagPolicystringChoose whether the user's posts use AI-created images (true) or real photos — their brand images, products and stock (false).
Parameters
useAiImagesboolean required Products from a connected Shopify store or a scraped website feed. Ids are prefixed by source.
List the user's products (from their connected Shopify store and/or website product feed). Pass `search` to filter by title/description. Each item includes ALL its image URLs in `images` (plus `imageCount`) and a brief description; use get_product for the full untruncated description. Use the returned ids with generate_from_product.
Parameters
searchstringGet full details for one product — complete title, full (untruncated) description and every product image URL. Use before generating so posts reflect the real product info.
Parameters
productIdstring required Create a new product in oriiion (added to the user's manual product feed). Returns a feed-{id} you can immediately use with generate_from_product. Image URLs are re-hosted on oriiion storage.
Parameters
titlestring required descriptionstringimageUrlsstring[]Generate social media posts featuring one of the user's products (using its title, description and image). Runs asynchronously — the user is notified when posts are ready.
Returns immediately — poll get_generation_status for the result.
Parameters
productIdstring required countnumbertopicstringArticles matched to the account’s topics, and posts written from them.
List recent news articles relevant to the user's business/topics. Use the returned article ids with generate_from_news.
Parameters
limitnumberGenerate thought-leadership posts based on a news article. Omit articleId to auto-pick the most relevant recent article. Runs asynchronously — the user is notified when posts are ready.
Returns immediately — poll get_generation_status for the result.
Parameters
articleIdnumbercountnumberplatformstringGet bytes into an account and turn them into posts. Files travel over HTTP, not JSON-RPC — see Uploading files.
Store a small file in the user's oriiion account by passing its bytes inline as base64, and get back a permanent URL for the post tools. HARD LIMIT 1MB — the whole file travels as tool-call text, so this is only for things like a logo or a one-page PDF. For anything bigger: POST it to https://oriiion.ai/api/mcp/upload with the header X-API-Key: <this connection's API key> and form field file=@<path> if you can make HTTP requests, otherwise call create_upload_link.
Parameters
filenamestring required contentBase64string required cropbooleanGet the user's own files (photos, video, PDFs, documents) into their oriiion account when you only have them inside this conversation. Returns a short-lived link the user opens in a browser and drops files on; then call list_uploaded_files for the stored URLs, which work with create_post_from_image, create_carousel_from_images, create_post_from_video and create_document_post. IF YOU CAN RUN SHELL COMMANDS, skip this and upload directly instead — it is faster and needs nothing from the user: curl -X POST https://oriiion.ai/api/mcp/upload -H "X-API-Key: <the API key configured for this connection>" -F "file=@/path/to/file" — it returns the stored URL as JSON. Use this link tool when you cannot make HTTP requests or the file only exists as an attachment in the chat.
Parameters
notestringThe URLs of files the user recently uploaded out of band — via an upload link or a direct HTTP upload — newest first. Call this after the user says they have finished uploading. Returns each file's type so you know which post tool to pass it to.
Parameters
limitnumberhoursnumberCreate posts from an image the user provides (public URL). The image becomes the post's media and AI writes captions for it. Runs asynchronously — the user is notified when posts are ready.
Parameters
imageUrlstring required topicstringcountnumberenhancebooleanCreate a carousel post from 2-10 images (public URLs). Images are cropped to portrait format. Provide either a ready caption or a context for AI to write one. Returns a draft post plus an ownerLink (a page showing every slide where the user can edit, schedule or publish) and a reviewLink for sharing. ALWAYS give the user the ownerLink — it is the only way to see the slides here, since this chat cannot display images.
Parameters
imageUrlsstring[] required captionstringcontextstringCreate a swipeable document post from a PDF (public URL) — the format LinkedIn shows as a page-by-page carousel. LinkedIn is the ONLY platform that supports documents: if LinkedIn is not connected the tool returns a connect link, which you should give the user. By default the PDF pages are ALSO rendered as JPGs into a separate Instagram carousel post, so the same content goes out on both networks. Provide either a ready caption or a context for AI to write one.
Parameters
documentUrlstring required titlestringcaptionstringcontextstringcreateCarouselbooleanAdd an image (public URL) to an existing post as an extra slide, turning it into a carousel (max 10 slides).
Parameters
postIdnumber required imageUrlstring required AI-edit a post's image with a natural-language instruction (e.g. 'make the background blue', 'remove the text'). Runs asynchronously (~1-2 min) and applies the edited image to the post automatically. Check progress with get_task_status.
Returns immediately — poll get_task_status for the result.
Parameters
postIdnumber required instructionstring required Replace a post's image entirely. Pass imageUrl to swap in an existing image (instant), or prompt to generate a brand-new AI image (async ~1-2 min, applied automatically; check with get_task_status).
Parameters
postIdnumber required imageUrlstringpromptstringCheck the status of an async task (image edits, video processing). Returns 'processing', 'completed' or 'failed'. For post generation batches, prefer waiting for the automatic notification instead.
Parameters
taskIdnumber required Rendering and captioning are long-running. Poll rather than waiting on the call.
Create posts from a video the user provides (public URL). The video becomes the post's media and AI writes captions based on the topic. Runs asynchronously — the user is notified when posts are ready.
Returns immediately — poll get_task_status for the result.
Parameters
videoUrlstring required topicstring required countnumberAdd AI-generated burned-in subtitles to a talking video (public URL). Uses the user's saved caption style and brand color unless overridden. The captioned video appears in the user's Todo list when ready (1-3 minutes).
Returns immediately — poll get_task_status for the result.
Parameters
videoUrlstring required captionStylestringTurn a script into a talking-head video the user films on their phone. Pass `script` to have them say your exact words (nothing is rewritten — it is only cut into takes), or `topic` to have oriiion write the script. Returns a link that opens a teleprompter + camera on a phone, and shows a QR code to scan when opened on a computer — so it works whichever device this chat is on. The user films each take, then the video renders automatically (1-3 min) and appears ON THAT SAME PAGE, where they can edit the caption, subtitle style, hook and CTA and re-render. This chat cannot be notified when the render finishes — always tell the user the video arrives on that page, and use get_video_shoot_status when they come back and ask.
Returns immediately — poll get_video_shoot_status for the result.
Parameters
scriptstringtopicstringtargetSecondsnumberWhere a guided video shoot stands: how many takes are filmed, whether the video is still rendering, and the finished video plus its hook and CTA once it is done. Defaults to the user's most recent shoot. Call this when the user asks how their video is coming along — nothing can push that into this chat on its own.
Parameters
shootIdnumberPaid promotion of posts that already exist. Boosting spends the account’s ad wallet.
Get the user's prepaid advertising wallet: available balance, reserved funds, service fee, and recent transactions. Amounts are in cents.
No parameters.
List the user's ad campaigns (boosted posts) with status, budget, actual spend, and performance metrics.
No parameters.
Get AI-generated suggestions for which post to boost as a paid ad, with recommended audience, budget, and duration. Takes a few seconds. Use boost_post to launch one.
No parameters.
Launch a paid ad boosting a published post. THIS SPENDS MONEY from the user's prepaid ad wallet (budget + service fee). Always confirm the budget with the user before calling. Use get_boost_recommendations first for suggested settings.
Parameters
postIdnumber required platformstringmodestringbudgetCentsnumber required durationDaysnumber required goalstringtargetingobjectWhat the account is on and what it could be on.
Get oriiion's subscription plans and prices. Works without authentication — useful before the user has an account. To subscribe, the user pays through their personal payment link from get_onboarding_links.
No parameters.
Get the authenticated user's own subscription/contract status: current plan, monthly amount, last and next payment, recent invoices, and Try & Buy trial state (on trial + days remaining). Scoped to the signed-in user only. Invoices are emailed automatically to the invoice email on file; there is no on-demand resend.
No parameters.
Reading and replying to comments on connected accounts.
Read recent comments on the user's social media posts across platforms. By default returns only unanswered comments (no reply from the account yet). Use reply_to_comment to answer one.
Parameters
unansweredOnlybooleanplatformstringlimitnumberReply to a comment on one of the user's social media posts. Use the postId, accountId and commentId values exactly as returned by list_comments (these are platform ids, not oriiion post numbers). Always show the user the reply text before sending unless they already approved it.
Parameters
postIdstring required accountIdstring required commentIdstringmessagestring required Comment-triggered DMs and one-to-many sends. These message real people.
List the account's comment→DM automations: when someone comments a keyword on a post (or replies to a story), the account automatically DMs them and can post a public reply. Instagram and Facebook only. Also returns the accountId values to use when creating one. Admin-only feature.
No parameters.
Create a comment→DM automation. Once created it is LIVE and will DM real people automatically, so show the user the exact dmMessage, keywords and which account it runs on, and get their approval first. Use an accountId from list_comment_automations. Instagram and Facebook only.
Parameters
accountIdstring required namestring required dmMessagestring required triggerstringkeywordsstring[]matchModestringcommentReplystringplatformPostIdstringpostTitlestringlinkTrackingbooleanUpdate a comment→DM automation, or pause/resume it. Passing isActive:false alone pauses it without changing anything else; isActive:true resumes it. Only the fields you pass are changed.
Parameters
automationIdstring required namestringdmMessagestringcommentReplystringkeywordsstring[]matchModestringlinkTrackingbooleanisActivebooleanPermanently delete a comment→DM automation. To stop it temporarily, use update_comment_automation with isActive:false instead. Confirm with the user before deleting.
Parameters
automationIdstring required List the account's DM broadcast campaigns with status (draft, scheduled, sending, completed, cancelled), recipient counts and message text. Also returns the accountId values to use when creating one. Admin-only feature.
No parameters.
Create a broadcast DRAFT — a DM sent to many contacts at once. Creating never sends anything: add people with add_broadcast_recipients, then deliver with send_broadcast. Use an accountId from list_broadcasts. Not available on WhatsApp or LinkedIn.
Parameters
accountIdstring required namestring required textstring required descriptionstringtagsstring[]isSubscribedbooleanList the contacts a broadcast can reach — people who have messaged the account and are still subscribed. Use this to pick contactId values for add_broadcast_recipients.
Parameters
platformstringsearchstringtagstringlimitnumberAdd people to a broadcast draft, or just read who is already on it (call with neither contactIds nor populate to read). Recipients can only ever be ADDED — there is no way to remove one, so trimming an over-filled draft means deleting it and starting over. Adding still sends nothing.
Parameters
broadcastIdstring required contactIdsstring[]populatebooleanDeliver, schedule or cancel a broadcast. THIS DMs REAL PEOPLE AND CANNOT BE UNDONE. Before calling with action send or schedule you MUST show the user the exact message text and the number of recipients, and get their explicit approval. You must also pass confirmRecipientCount matching the current recipient count (from add_broadcast_recipients) — the call is refused otherwise. action cancel stops a scheduled broadcast and needs no confirmation.
Parameters
broadcastIdstring required actionstringscheduledAtstringconfirmRecipientCountnumberDelete a broadcast and its recipient list. A broadcast that is mid-send must be cancelled first. Confirm with the user before deleting.
Parameters
broadcastIdstring required Search an account’s own imported photos to illustrate a post.
List the user's connected photo libraries (Dropbox, OneDrive, Google Drive/Photos, etc.) and which approved folder/album each imports from.
No parameters.
Search the user's own photo library (imported + scraped, vision-tagged) by keyword — e.g. 'coffee', 'team', 'outdoor'. Returns real photo URLs to use with change_image / add_image_to_post.
Parameters
querystring required limitnumberGiven a post ID, return the best-matching real photos from the user's own library for that post's topic (ranked). Ideal for AI-OFF customers — pass a chosen URL to change_image to set it.
Parameters
postIdnumber required