MCP

oriiion integration reference

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/mcp

Everything available

POSThttps://www.oriiion.ai/mcp

Amber marks the 15 tools that need an elevated role — see Restricted tools.

Transport

JSON-RPC 2.0 over Streamable HTTP. Every request is a POST to the single endpoint above — there is no per-resource URL scheme.

  • Send Accept: application/json, text/event-stream. A client that will not accept an event stream is rejected by the transport.
  • Responses come back as text/event-stream, so a single reply arrives framed as event: message followed by a data: line. Parse the frame before parsing the JSON.
  • The server is stateless: no session id is issued, and no session header is expected on subsequent calls.
  • Use the 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.

Authentication

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.

API key

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

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.

Header support is not uniform

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.

SurfaceX-API-KeyBearer orin_sk_Bearer orin_at_
POST /mcp
/api/mcp/upload*
other /api/* routes

Before you authenticate

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.

Quickstart

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 }
    }
  }'

Results and errors

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:

  • Protocol errors arrive as a JSON-RPC error object — malformed requests, unknown methods, missing credentials. These have no result.
  • Tool errors arrive as a successful JSON-RPC result carrying 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.

Async work

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 withPoll with
generate_postsget_generation_status
generate_from_productget_generation_status
generate_from_newsget_generation_status
edit_imageget_task_status
create_post_from_videoget_task_status
process_videoget_task_status
create_video_shootget_video_shoot_status

Uploading files

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.

Files up to 4.5 MB

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'

Larger files

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.

Restricted tools

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

Restricted
throughout the reference below.

Tool reference

All 77 tools, grouped by area.

Account & business

Read and update the profile every generated post is grounded in, and check what the account has connected.

get_account_info

Read-only

Get the authenticated user's profile and business information.

No parameters.

update_business_info

Update the user's business profile information. All fields are optional — only provided fields will be updated.

Parameters

businessNamestring
Business or brand name
businessCategorystring
Business category or industry
businessLocationstring
Business location (city, country)
websiteUrlstring
Website URL
businessGoalstring
Primary business goal for social media
businessAboutstring
Short description of the business
businessSlogansstring
Brand slogans or taglines
postingLanguagestring
Language for generated posts (e.g. 'sv', 'en')
timezonestring
Timezone (e.g. 'Europe/Stockholm')

set_account_type

Set the user's account type. This affects which social platforms are required during onboarding.

Parameters

accountTypestring required
Account type: 'small_business' (needs Facebook/Instagram) or 'thought_leader' (needs LinkedIn) (one of "small_business", "thought_leader")

get_connected_platforms

Read-only

List all social media platforms the user has connected (Facebook, Instagram, LinkedIn, X). Shows page names and usernames.

No parameters.

get_onboarding_status

Read-only

Check the user's onboarding progress. Returns which steps are completed, which are required, and whether onboarding is fully complete.

No parameters.

complete_onboarding

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.

research_website

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
Full website URL including https://

Analytics

Performance across connected platforms. Every tool takes a look-back window and returns change against the previous period.

get_analytics_overview

Read-only

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

daysnumber
Look-back window in days (1–365; defaults to 30)
platformstring
Filter to one platform (one of "all", "facebook", "instagram", "linkedin", "x", "tiktok", "youtube"; defaults to "all")

get_platform_analytics

Read-only

Per-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

daysnumber
Look-back window in days (1–365; defaults to 30)

get_top_posts

Read-only

The 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

daysnumber
Look-back window in days (1–365; defaults to 30)
platformstring
Filter to one platform (one of "all", "facebook", "instagram", "linkedin", "x", "tiktok", "youtube"; defaults to "all")
limitnumber
How many top posts to return (1–20; defaults to 5)

get_best_posting_times

Read-only

Engagement-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

platformstring
Filter to one platform (one of "all", "facebook", "instagram", "linkedin", "x", "tiktok", "youtube"; defaults to "all")

get_follower_stats

Read-only

Follower counts and growth per connected account over a period. Use alongside engagement to judge which platforms are worth investing in.

Parameters

daysnumber
Look-back window in days (1–365; defaults to 30)

get_content_insights

Read-only

A 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

daysnumber
Look-back window in days (1–365; defaults to 30)

Posts & captions

Create posts and edit them before they go anywhere. Generation is asynchronous — see Async work below.

list_posts

Read-only

List the user's social media posts. Supports filtering by status and platform. Returns up to 50 posts at a time.

Parameters

statusstring
Filter by post status (one of "all", "draft", "scheduled", "published", "edited"; defaults to "all")
platformstring
Filter by platform (one of "all", "facebook", "instagram", "linkedin", "twitter"; defaults to "all")
limitnumber
Number of posts to return (1–50; defaults to 20)
offsetnumber
Pagination offset (min 0; defaults to 0)

get_post

Read-only

Get a single post by ID, including its carousel media items if any.

Parameters

postIdnumber required
The post ID to retrieve

generate_posts

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

descriptionstring
Topic or description for the posts. If omitted, auto-generates based on user profile.
countnumber
Number of posts to generate (1–5; defaults to 3)

get_generation_status

Read-only

Check the status of an async post generation batch. Returns 'generating', 'completed', 'failed', or 'partial'.

Parameters

groupIdstring required
The group ID returned from generate_posts

edit_caption

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
The post ID to edit
captionstring required
The new caption text
platformstring
Only update the caption for this platform (one of "facebook", "instagram", "linkedin", "x", "tiktok", "snapchat", "pinterest", "threads", "youtube")

generate_platform_captions

AI-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
The post to generate platform captions for

set_mentions

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
The post ID
platformstring required
Which platform the mentions are for (one of "instagram", "linkedin")
usernamesstring[]
Instagram: usernames to photo-tag (with or without @)
collaboratorsstring[]
Instagram: usernames to invite as collaborators (max 3)
linkedinMentionsobject[]
LinkedIn: mentions to link

set_first_comment

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
The post ID
platformstring required
Which platform the first comment is for (one of "facebook", "instagram", "linkedin")
commentstring required
The first comment text (empty string removes it)

get_post_review_link

Read-only

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

groupIdstring
A specific generation group id; omit for the latest batch of drafts

delete_post

Destructive

Delete a post. Only draft and scheduled posts can be deleted. Published posts cannot be deleted.

Parameters

postIdnumber required
The post ID to delete

Publishing

The two tools that reach the outside world. Both act on the account’s real connected profiles.

publish_post

Destructive

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
The post ID to publish
platformsstring[]
Publish only to these platforms. Omit to use the user's configured platforms.

schedule_post

Schedule a draft post for a specific date and time. The post will be automatically published at the scheduled time.

Parameters

postIdnumber required
The post ID to schedule
scheduledForstring required
ISO 8601 datetime string for when to publish (e.g. 2025-06-15T10:00:00Z)

Brand & style

Establish who the account is before generating for it: voice, visual style, and the profiles worth learning from.

find_social_profiles

Read-only

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.

set_social_profiles

Save the user's confirmed social media profile URLs to their account.

Parameters

instagramstring
Instagram profile URL
linkedinstring
LinkedIn profile/company URL
facebookstring
Facebook page URL
youtubestring
YouTube channel URL
tiktokstring
TikTok profile URL
xstring
X (Twitter) profile URL

discover_brand_images

Read-only

Collect 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

instagramHandlestring
Instagram handle to pull post images from; defaults to the user's saved profile

select_brand_images

Save the user's chosen brand images as visual references for post generation.

Parameters

imageUrlsstring[] required
The image URLs the user selected

research_brand

Read-only

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

websiteUrlstring
Website to analyze; defaults to the user's saved website

get_brand_identity

Read-only

Get the user's saved brand identity: logo, colors, fonts, AI-image setting, and content style guide (include/exclude rules).

No parameters.

set_brand_identity

Save the user's confirmed brand identity. Only provided fields are updated.

Parameters

logoUrlstring
Logo image URL
colorsobject
fontsobject

generate_style_guide

Read-only

Generate 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

toneHintstring
Optional tone preference from the user, e.g. 'playful' or 'professional'

save_style_guide

Persist the user's confirmed content style guide. It feeds directly into post generation (include/exclude rules).

Parameters

toneOfVoicestring
2-3 sentences describing the voice
dosstring[]
Rules posts should follow
dontsstring[]
Things posts must avoid
emojiPolicystring
One line on emoji usage
hashtagPolicystring
One line on hashtag usage

set_image_style

Choose whether the user's posts use AI-created images (true) or real photos — their brand images, products and stock (false).

Parameters

useAiImagesboolean required
true = AI-created images, false = real photos

Products

Products from a connected Shopify store or a scraped website feed. Ids are prefixed by source.

list_products

Read-only

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

searchstring
Optional keyword to filter products by title or description

get_product

Read-only

Get 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
Product id from list_products (e.g. 'shopify-42' or 'feed-17')

create_product

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
Product title / name (required)
descriptionstring
Product description
imageUrlsstring[]
Up to 4 product image URLs

generate_from_product

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
Product id from list_products (e.g. 'shopify-42' or 'feed-17')
countnumber
Number of posts to generate (1–5; defaults to 3)
topicstring
Optional angle or occasion for the posts (e.g. 'summer sale')

News

Articles matched to the account’s topics, and posts written from them.

list_news

Read-only

List recent news articles relevant to the user's business/topics. Use the returned article ids with generate_from_news.

Parameters

limitnumber
Number of articles to return (1–25; defaults to 10)

generate_from_news

Generate 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

articleIdnumber
Article id from list_news. Omit to auto-pick the most relevant one.
countnumber
Number of posts to generate (1–5; defaults to 3)
platformstring
Primary platform for the posts (one of "facebook", "instagram", "linkedin"; defaults to "linkedin")

Media & uploads

Get bytes into an account and turn them into posts. Files travel over HTTP, not JSON-RPC — see Uploading files.

upload_file

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
Original filename including extension, e.g. 'logo.png'
contentBase64string required
The file contents, base64-encoded (a data: URL prefix is accepted and stripped)
cropboolean
Images only: crop to 1080x1350 portrait for social posts. Leave false to keep the original framing. (defaults to false)

list_uploaded_files

Read-only

The 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

limitnumber
How many files to return (1–50; defaults to 20)
hoursnumber
Only files uploaded within this many hours (1–720; defaults to 24)

create_post_from_image

Create 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
Public HTTP/HTTPS URL of the image
topicstring
What the post should be about (helps the caption)
countnumber
Number of caption variants/posts to generate (1–5; defaults to 3)
enhanceboolean
Let AI regenerate an enhanced version of the image (defaults to false)

create_document_post

Create 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
Public HTTP/HTTPS URL of the PDF document
titlestring
Title shown on the LinkedIn document card. Defaults to a readable form of the filename.
captionstring
Caption to use as-is
contextstring
What the document is about — used to AI-generate the caption if none is given
createCarouselboolean
Also turn the PDF pages into a separate Instagram carousel post (max 10 slides). Default true. (defaults to true)

add_image_to_post

Add an image (public URL) to an existing post as an extra slide, turning it into a carousel (max 10 slides).

Parameters

postIdnumber required
The post to add the image to
imageUrlstring required
Public HTTP/HTTPS URL of the image to add

edit_image

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
The post whose image to edit
instructionstring required
What to change in the image

change_image

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
The post whose image to replace
imageUrlstring
Public URL of the replacement image
promptstring
Description of a new image to AI-generate instead

get_task_status

Read-only

Check 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
The task id returned by an async tool

Video

Rendering and captioning are long-running. Poll rather than waiting on the call.

create_post_from_video

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
Public HTTP/HTTPS URL of the video
topicstring required
What the video/post is about (required for the caption)
countnumber
Number of caption variants/posts to generate (1–5; defaults to 3)

process_video

Add 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
Public HTTPS URL of the video to caption
captionStylestring
Caption style override. Defaults to the user's saved preference. (one of "single-word", "single-word-box", "minimal", "hormozi", "beast", "classic", "karaoke", "neon", "typewriter", "bold-pop")

create_video_shoot

Turn 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

scriptstring
The exact words to say on camera. Filmed verbatim — use this when the user wants their own wording.
topicstring
What the video should be about, if oriiion should write the script instead.
targetSecondsnumber
How long the finished video should run, in seconds. Only used when writing from a topic. (10–120)

get_video_shoot_status

Read-only

Where 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

shootIdnumber
A specific shoot id from create_video_shoot; omit for the most recent one

Ads

Paid promotion of posts that already exist. Boosting spends the account’s ad wallet.

get_ad_wallet

Read-only

Get the user's prepaid advertising wallet: available balance, reserved funds, service fee, and recent transactions. Amounts are in cents.

No parameters.

list_ad_campaigns

Read-only

List the user's ad campaigns (boosted posts) with status, budget, actual spend, and performance metrics.

No parameters.

get_boost_recommendations

Read-only

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.

boost_post

Destructive

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
The published post to boost
platformstring
Platform to boost on when the post published to several; defaults to the post's own platform (one of "instagram", "tiktok", "linkedin", "pinterest")
modestring
managed: paid from the prepaid wallet incl. service fee. own_account: billed to the user's own connected ad account, no fee (requires the ads add-on) (one of "managed", "own_account"; defaults to "managed")
budgetCentsnumber required
Total ad budget in cents (e.g. 30000 = 300 kr). The service fee is added on top of this. (5000–2000000)
durationDaysnumber required
How many days the ad runs (1–30)
goalstring
What the ad optimizes for (one of "engagement", "traffic", "awareness", "video_views"; defaults to "engagement")
targetingobject
Audience targeting; omit to let the platform decide

Plan & billing

What the account is on and what it could be on.

get_pricing

Read-only
No auth

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_billing_status

Read-only

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.

Comments inbox

Reading and replying to comments on connected accounts.

list_comments

Read-only
Restricted

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

unansweredOnlyboolean
Only return comments the account has not replied to yet (defaults to true)
platformstring
Filter to one platform (one of "facebook", "instagram", "linkedin", "x", "threads", "youtube", "bluesky", "reddit")
limitnumber
Max comments to return (1–100; defaults to 25)

reply_to_comment

Restricted

Reply 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
The social post id from list_comments
accountIdstring required
The accountId from list_comments
commentIdstring
The comment to reply under (omit to comment on the post itself)
messagestring required
The reply text

Automations & broadcasts

Comment-triggered DMs and one-to-many sends. These message real people.

list_comment_automations

Read-only
Restricted

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_comment_automation

Restricted

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
The Zernio accountId from list_comment_automations
namestring required
Internal name for the automation (not shown to the public)
dmMessagestring required
The DM sent to whoever triggers the automation
triggerstring
comment: fires on post comments. story_reply: fires on story replies (one of "comment", "story_reply"; defaults to "comment")
keywordsstring[]
Words that trigger it (max 25). Leave empty to fire on every comment
matchModestring
exact: the comment must be exactly the keyword. contains: the keyword appears anywhere (one of "exact", "contains"; defaults to "contains")
commentReplystring
Optional PUBLIC reply posted under the comment as well
platformPostIdstring
Restrict to one post (platform id). Omit to run account-wide on every post
postTitlestring
Human-readable label for the post it is restricted to
linkTrackingboolean
Track clicks on links in the DM (defaults to true)

update_comment_automation

Restricted

Update 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
The automationId from list_comment_automations
namestring
dmMessagestring
New DM text
commentReplystring
New public reply (empty string removes it)
keywordsstring[]
Replaces the whole keyword list (max 25)
matchModestring
(one of "exact", "contains")
linkTrackingboolean
isActiveboolean
false pauses the automation, true resumes it

delete_comment_automation

Destructive
Restricted

Permanently 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
The automationId from list_comment_automations

list_broadcasts

Read-only
Restricted

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_broadcast

Restricted

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
The Zernio accountId from list_broadcasts
namestring required
Internal campaign name (not shown to recipients)
textstring required
The DM text every recipient receives
descriptionstring
Internal note about the campaign
tagsstring[]
Contact tags defining the default segment used by add_broadcast_recipients populate (max 25)
isSubscribedboolean
Limit the segment to subscribed contacts (keep true unless the user says otherwise) (defaults to true)

list_broadcast_contacts

Read-only
Restricted

List 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

platformstring
Filter to one platform (one of "instagram", "facebook", "telegram", "twitter", "bluesky", "reddit")
searchstring
Search by name or handle
tagstring
Only contacts carrying this tag
limitnumber
Max contacts to return (1–200; defaults to 50)

add_broadcast_recipients

Restricted

Add 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
The broadcastId from list_broadcasts
contactIdsstring[]
Hand-picked contactId values from list_broadcast_contacts (max 500 per call)
populateboolean
Add everyone matching the broadcast's own segment filters (tags / subscribed). Confirm with the user first — this can be a large list

send_broadcast

Destructive
Restricted

Deliver, 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
The broadcastId from list_broadcasts
actionstring
send: deliver now. schedule: deliver at scheduledAt. cancel: stop a scheduled broadcast (one of "send", "schedule", "cancel"; defaults to "send")
scheduledAtstring
ISO date/time — required when action is schedule
confirmRecipientCountnumber
The exact number of recipients you told the user about. Required for send and schedule; must match the real count

delete_broadcast

Destructive
Restricted

Delete 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
The broadcastId from list_broadcasts

Connected photo libraries

Search an account’s own imported photos to illustrate a post.

list_connected_sources

Read-only
Restricted

List the user's connected photo libraries (Dropbox, OneDrive, Google Drive/Photos, etc.) and which approved folder/album each imports from.

No parameters.

search_my_images

Read-only
Restricted

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
Keywords describing the photo you want, e.g. 'product on white background'
limitnumber
Max images to return (1–30; defaults to 12)

recommend_images_for_post

Read-only
Restricted

Given 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
The post ID to recommend images for