# Create a scheduled or a draft post Source: https://docs.ocoya.com/api-reference/create-a-scheduled-or-a-draft-post /openapi.yaml post /post Returns an id of the post # Create an AI-generated campaign Source: https://docs.ocoya.com/api-reference/create-an-ai-generated-campaign /openapi.yaml post /campaigns Queues generation for a multi-post AI campaign and returns immediately with `GENERATING` status. Campaign posts are generated asynchronously in the background. # Create an AI-generated draft post Source: https://docs.ocoya.com/api-reference/create-an-ai-generated-draft-post /openapi.yaml post /post/ai Generates a post caption and creates a draft post. Optionally attaches social profiles, a reusable hashtag library, and one AI-generated image. # Delete post Source: https://docs.ocoya.com/api-reference/delete-post /openapi.yaml delete /post/{postId} Deletes a post by Post id and cancels all schedules. Returns nothing. # Generate social connection URL Source: https://docs.ocoya.com/api-reference/generate-social-connection-url /openapi.yaml post /social-profiles/connection-url Returns a browser URL that starts connecting a social network to a brand. Open the returned URL while signed in to Ocoya to approve OAuth and select profiles. # List all connected social profiles Source: https://docs.ocoya.com/api-reference/list-all-connected-social-profiles /openapi.yaml get /social-profiles Returns information about all connected social profiles # List all owned brands Source: https://docs.ocoya.com/api-reference/list-all-owned-brands /openapi.yaml get /brands Returns information about all owned brands # List all posts Source: https://docs.ocoya.com/api-reference/list-all-posts /openapi.yaml get /post Returns information about all posts # List all workflows Source: https://docs.ocoya.com/api-reference/list-all-workflows /openapi.yaml get /workflow Returns information about all workflows # List hashtag libraries Source: https://docs.ocoya.com/api-reference/list-hashtag-libraries /openapi.yaml get /hashtag-libraries Returns reusable hashtag libraries in a brand so you can pass a hashtag library ID to AI post or campaign generation. # List information about the workflow Source: https://docs.ocoya.com/api-reference/list-information-about-the-workflow /openapi.yaml get /workflow/{workflowId} Returns information about all workflow steps # List Studio templates Source: https://docs.ocoya.com/api-reference/list-studio-templates /openapi.yaml get /studio-templates Returns Studio templates that can be used as visual references for AI-generated posts. # Me Source: https://docs.ocoya.com/api-reference/me /openapi.yaml get /me Returns information about authenticated user. # Toggle workflow on or off Source: https://docs.ocoya.com/api-reference/toggle-workflow-on-or-off /openapi.yaml post /workflow/{workflowId} Enables or disables the workflow. Returns nothing. # Update post Source: https://docs.ocoya.com/api-reference/update-post /openapi.yaml patch /post/{postId} Returns an id of the updated post # Authentication Source: https://docs.ocoya.com/authentication How to authenticate requests to the Ocoya REST API. ## Base URL The current REST API endpoint is: ```txt theme={null} https://app.ocoya.com/api/_public/v1 ``` ## Header Send your API key in the `X-API-Key` header. ```http theme={null} X-API-Key: YOUR_API_KEY Content-Type: application/json Accept: application/json ``` [Create API key](https://app.ocoya.com/general/settings/api) ## Test Your API Key Call `/me` to verify the key. ```bash cURL theme={null} curl -X GET "https://app.ocoya.com/api/_public/v1/me" \ -H "X-API-Key: YOUR_API_KEY" ``` ```js Node.js theme={null} const response = await fetch('https://app.ocoya.com/api/_public/v1/me', { headers: { 'X-API-Key': process.env.OCOYA_API_KEY, }, }) const me = await response.json() console.log(me) ``` If the key is valid, the API responds with your user context instead of an authentication error. ## Authentication Errors If no API key is provided, the API returns `401 Unauthorized`. ```json theme={null} { "message": "Missing API token." } ``` If the API key is invalid, the API returns `403 Forbidden`. ```json theme={null} { "message": "Invalid API token." } ``` ## Security Notes API keys are designed for backend requests. Do not use them directly in browser-side code. Store API keys in environment variables or a secrets manager. Replace an API key if it appears in client code, logs, screenshots, or public repositories. ## MCP Authentication MCP does not use Ocoya API keys. MCP clients authenticate through OAuth and ask the user to approve brand access. See [MCP](/mcp/get-started) for setup instructions. # Limitations Source: https://docs.ocoya.com/fundamentals/limitations Common request constraints for the Ocoya REST API. ## Dates Use ISO 8601 datetime strings for scheduled post times. ```txt theme={null} 2026-07-01T09:00:00Z ``` Use UTC when possible. If you generate local times in your app, convert them to a timezone-aware ISO string before sending the request. ## Pagination List endpoints can accept pagination parameters such as `page` and `perPage` when supported by the endpoint. Use small page sizes for user-facing interfaces and larger page sizes only for background jobs that can tolerate slower responses. ## Media URLs Post media URLs must be absolute URLs that Ocoya can fetch. ```txt theme={null} https://example.com/image.jpg ``` Avoid private URLs, expiring URLs with very short lifetimes, and files that require cookies or custom request headers. ## Brand-Scoped Requests Most publishing and workflow operations need a `brandId`. Use `GET /brands` first, then pass the selected brand ID to endpoints such as: * `GET /social-profiles` * `GET /hashtag-libraries` * `GET /post` * `POST /post` * `POST /post/ai` * `POST /campaigns` * `GET /workflow` ## Social Profile IDs Use `GET /social-profiles?brandId=BRAND_ID` to find the `socialProfileIds` that posts should target. Only use profiles connected to the same brand as the post. # Rate limits Source: https://docs.ocoya.com/fundamentals/rate-limits Understand Ocoya API rate limits and response headers. ## Limit Ocoya applies a global user rate limit of **60 requests per minute** for REST API requests using the same API key. If you expect bursts, queue requests and use a backoff strategy instead of retrying immediately. ## Rate Limit Response When the limit is exceeded, the API returns `429 Too Many Requests`. ```http theme={null} HTTP/1.1 429 Too Many Requests Content-Type: application/json X-RateLimit-Limit: 60 X-RateLimit-Remaining: 0 ``` ```json theme={null} { "message": "You've exceeded the request limit." } ``` ## Headers | Header | Meaning | | ----------------------- | ------------------------------------------------------- | | `X-RateLimit-Limit` | Maximum number of API requests allowed per minute. | | `X-RateLimit-Remaining` | Remaining number of API requests in the current window. | | `X-RateLimit-Reset` | Timestamp indicating when the remaining limit resets. | ## Recommended Handling Wait until the reset window before retrying requests. Prefer event-driven workflows and scheduled jobs over high-frequency polling. Reuse brand and social profile IDs instead of fetching them before every post creation. # How to use Source: https://docs.ocoya.com/get-started Make your first Ocoya REST API request. ## What You Need Before you send requests, you need: 1. An Ocoya API key 2. A brand ID 3. Social profile IDs if you want to create or schedule posts ## Get An API Key Create or copy an API key from your Ocoya API settings. [Create API key](https://app.ocoya.com/general/settings/api) API keys are for server-side usage. Do not expose them in browser JavaScript, mobile apps, or public repositories. ## Base URL All REST API examples use: ```txt theme={null} https://app.ocoya.com/api/_public/v1 ``` ## Send Your First Request The fastest way to verify your API key is working is to call `/me`. ```bash cURL theme={null} curl -X GET "https://app.ocoya.com/api/_public/v1/me" \ -H "X-API-Key: YOUR_API_KEY" ``` ```js Node.js theme={null} const response = await fetch('https://app.ocoya.com/api/_public/v1/me', { method: 'GET', headers: { 'Accept': 'application/json', 'X-API-Key': process.env.OCOYA_API_KEY, }, }) const me = await response.json() console.log(me) ``` ```python Python theme={null} import os import requests response = requests.get( "https://app.ocoya.com/api/_public/v1/me", headers={"X-API-Key": os.environ["OCOYA_API_KEY"]}, ) print(response.json()) ``` If the key is valid, the API returns your user context. ```json theme={null} { "id": "clx354swx0006ghoatnjknv98", "name": "Ocoya Support", "email": "support@ocoya.com" } ``` ## Typical Publishing Flow Call `GET /brands` and choose the brand you want to publish from. If the brand has no connected profiles yet, call `POST /social-profiles/connection-url` and open the returned `url` in a browser. Call `GET /social-profiles?brandId=BRAND_ID` to find connected profile IDs. Call `GET /hashtag-libraries?brandId=BRAND_ID` when an AI draft should use saved hashtag context. Call `POST /post?brandId=BRAND_ID` with a caption, media URLs, target social profile IDs, and optional `scheduledAt`. Call `POST /post/ai?brandId=BRAND_ID` with a prompt when you want Ocoya to generate the caption first. Call `POST /campaigns?brandId=BRAND_ID` to queue multi-post campaign generation and receive an immediate `GENERATING` response. Use `GET /post`, `PATCH /post/{postId}`, and `DELETE /post/{postId}` to inspect, reschedule, or remove posts. ## Create A Post Use `scheduledAt` when you want a scheduled post. Omit it when you want a draft. ```bash cURL theme={null} curl -X POST "https://app.ocoya.com/api/_public/v1/post?brandId=BRAND_ID" \ -H "X-API-Key: YOUR_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "caption": "Launching our summer campaign today.", "mediaUrls": ["https://example.com/image.jpg"], "socialProfileIds": ["SOCIAL_PROFILE_ID"], "scheduledAt": "2026-07-01T09:00:00Z" }' ``` ```js Node.js theme={null} const response = await fetch('https://app.ocoya.com/api/_public/v1/post?brandId=BRAND_ID', { method: 'POST', headers: { 'Content-Type': 'application/json', 'X-API-Key': process.env.OCOYA_API_KEY, }, body: JSON.stringify({ caption: 'Launching our summer campaign today.', mediaUrls: ['https://example.com/image.jpg'], socialProfileIds: ['SOCIAL_PROFILE_ID'], scheduledAt: '2026-07-01T09:00:00Z', }), }) const post = await response.json() console.log(post) ``` ## Connect A Social Profile Use `POST /social-profiles/connection-url` when you need a browser URL for connecting a new social profile. ```bash cURL theme={null} curl -X POST "https://app.ocoya.com/api/_public/v1/social-profiles/connection-url?brandId=BRAND_ID" \ -H "X-API-Key: YOUR_API_KEY" \ -H "Content-Type: application/json" \ -d '{"provider":"instagram"}' ``` Open the returned `url` while signed in to Ocoya. ## Create An AI Draft Use `POST /post/ai` when you want Ocoya to generate the caption from a prompt before creating the draft. Use `hashtagLibraryId` and `referenceDesignIds` when you want the draft to use saved hashtag library or Studio template context. ```bash cURL theme={null} curl -X POST "https://app.ocoya.com/api/_public/v1/post/ai?brandId=BRAND_ID" \ -H "X-API-Key: YOUR_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "prompt": "Write a friendly launch post for our new analytics dashboard.", "tone": "friendly", "postLength": "medium", "socialProfileIds": ["SOCIAL_PROFILE_ID"], "hashtagLibraryId": "HASHTAG_LIBRARY_ID", "generateImage": true, "referenceUrls": ["https://example.com/reference.png"], "referenceDesignIds": ["STUDIO_DESIGN_ID"] }' ``` ## Create An AI Campaign Use `POST /campaigns` when you want Ocoya to generate a multi-post campaign in the background. The response returns immediately with `GENERATING` status. Use `hashtagLibraryId` when the campaign should use a saved hashtag library. ```bash cURL theme={null} curl -X POST "https://app.ocoya.com/api/_public/v1/campaigns?brandId=BRAND_ID" \ -H "X-API-Key: YOUR_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "prompt": "Summer launch campaign for our ecommerce analytics dashboard", "goal": "launch", "audience": "marketing_teams", "duration": 10, "count": 6, "postLength": "medium", "tone": "professional", "hashtagLibraryId": "HASHTAG_LIBRARY_ID", "socialProfileIds": ["SOCIAL_PROFILE_ID"], "generateMedia": true }' ``` ## MCP vs REST API Use the REST API for backend systems that already know exactly what they need to do. Use [MCP](/mcp/get-started) when you want AI clients such as Claude, Codex, or ChatGPT to discover and call Ocoya tools after the user approves OAuth access. # Switch a workflow on, and read its runs Source: https://docs.ocoya.com/help/activate-a-workflow Resolve the errors, set it live, and check what happened each time it fired. A new workflow starts **inactive** and does nothing until you set it live. Before you can, every step has to be configured. Ocoya workflow builder showing a workflow named RSS poster marked Inactive, a red badge reading 3, a greyed-out Set live button, a View runs button, and three steps — New RSS item, Use AI agent and Create social post — each with a red error icon ## Clear the errors first The red number in the header is how many steps still need something. Each unfinished step carries a red marker, so you can see which. Typical ones: an RSS trigger with no feed URL (*RSS url missing*), a schedule with no interval (*Schedule missing*), an AI agent step with no agent picked, a WooCommerce trigger with no store (*Store missing*). **Set live stays disabled while any error remains.** Hovering it says so: > All errors must be resolved before toggling the workflow on or off Work down the chain from the trigger, selecting each step and filling it in. The error count falls as you go. ## Set it live With the count at zero, **Set live** switches the workflow on and the badge changes from Inactive to Live. **Pause** switches it off again. A paused workflow keeps its configuration and its run history — pausing isn't deleting, and setting it live again picks up from then on. It won't replay anything it missed while paused. Pausing is the right move when a workflow is behaving unexpectedly. It stops the runs — and the credits — immediately, and gives you time to look at what it did without deleting the evidence. ## Reading the runs Along the bottom of the builder are four counters, and **View runs** opens the full list. | Outcome | Means | | --------------- | ------------------------------------------------------ | | **In progress** | Running now | | **Succeeded** | Finished, no error | | **Failed** | Stopped on an error | | **Exited** | Stopped deliberately — a Filter's condition wasn't met | **Exited is not a failure.** A Comment-to-DM workflow filtering for one keyword exits on every comment that doesn't contain it, which is the filter doing its job. A workflow with far more exits than successes usually means the filter is too narrow, not that something is broken. Each run records when it was triggered, when it finished, how long it took, its status, and — if it failed — the error. Exited runs show the reason instead. A workflow that has never fired shows *No runs yet*. ## Runs cost credits Every run costs 1 credit, including runs that fail and runs that exit at a filter. A workflow that triggers often spends accordingly. If your balance runs out, runs fail with: > You've exceeded the credit limit. Upgrade to get more. The workflow stays live — it starts working again when your credits reset or you upgrade. See [What are credits?](/help/credits) ## Related Working out why nothing happened. Configuring the steps that are showing errors. # Adding images and video Source: https://docs.ocoya.com/help/adding-media Upload media to a post, pull in a Studio design, and what each network will accept. A post's media sits in the **Media** panel of the editor, next to the caption. There are two ways to fill it. ## Upload a file **Upload** takes an image, video or GIF from your computer. Ocoya shows it as soon as it's attached, and you can reorder, replace or remove anything already there. Media is attached to the post as a whole, so every channel on the post gets the same files. If one network needs different media, that's a separate post. ## Use a Studio design The Media panel also opens your **Studio templates** — search them, pick one, and it comes into the post. Two actions are worth knowing: * **Edit in Studio** opens the design in the editor so you can change it, then bring it back. * **Edit thumbnail** sets the still frame a video shows before it plays. TikTok doesn't support custom thumbnails at all, and on Instagram they work for Reels but not standard video. See [Studio](/help/studio) for the design side. Stock photography lives in Studio rather than the post editor. If you want an Unsplash image, add it to a design in Studio and bring the design into the post. ## What each network accepts This is where most media problems come from — the same file can be fine on LinkedIn and refused by Bluesky. The quick version: image counts run from 1 on Google Business to 35 on TikTok, and size limits from 2 MB on Bluesky to 20 MB on TikTok. Video is one file everywhere except Discord, and Bluesky and Google Business take no video at all. The full tables are in [Character and media limits](/help/channel-limits). Ocoya checks against them before publishing and names the specific rule you broke, so you don't have to memorise them. Discord counts images and videos together against a limit of 10 attachments. Kick posts are chat messages and carry no media at all. ## Images that get cropped Instagram accepts a limited range of shapes — landscape at 1.91:1 and portrait at 4:5 — and Ocoya crops to fit anything outside that. If a crop took something you wanted, crop the image yourself before uploading. That way you choose what survives rather than letting the centre of the frame decide. ## Related Every network's image, video and size limits. Letting Ocoya make the image instead. # Generate an AI campaign Source: https://docs.ocoya.com/help/ai-campaigns Turn one campaign idea into a run of posts spread across days — and know what it costs before you run it. A campaign generates a run of posts around one idea, spread over a period, rather than a single post. Ocoya plans the sequence first so the posts build on each other instead of repeating. It's marked **Advanced** because it spends credits in multiples. Read the cost section before your first run. Select **Campaigns** in the sidebar, or **New AI campaign** from Planner. Ocoya campaign composer headed What campaign should we create, with a prompt field and a toolbar showing Hashtags, Images, Professional, Medium, Awareness, Business owners, 5 posts, 7 days and Profiles, a cost badge reading 10, and suggestion chips below ## Describe the campaign Describe the whole campaign, not one post — *a three-week run-up to our winter range launch*, not *a post about winter coats*. The toolbar underneath sets the rest. The first row is the same as an [AI post](/help/ways-to-create-a-post): hashtags, images, tone and length. The second row is campaign-specific: | Control | What it does | Range | | ------------ | ---------------------------------------------------------------------------------------------------------------------------------------------- | --------------- | | **Goal** | Awareness, Generate leads, Launch, Promote an offer, Educate audience, or Event | — | | **Audience** | Business owners, Founders / executives, Marketing teams, Buyers / customers, Local community, Investors, First-time buyers, Existing customers | — | | **Posts** | How many posts to generate | 3–30, default 5 | | **Days** | How long to spread them over | 1–30, default 7 | | **Profiles** | Which channels the posts are for | — | Goal and audience do real work — they change the angle of every post in the run, not just its wording. A campaign set to *Generate leads* for *First-time buyers* reads very differently from *Awareness* for *Existing customers* on the same topic. ## What it costs The cost badge shows the total before you run anything. The arithmetic is per post: **(1 credit per caption + 1 per image) × number of posts** | Campaign | Credits | | ----------------------- | ------- | | 5 posts, no images | 5 | | 5 posts, 1 image each | 10 | | 10 posts, 1 image each | 20 | | 30 posts, 2 images each | 90 | The maximum is 30 posts with up to 10 images each, so a campaign can cost several hundred credits. The badge always shows the real total — check it before running rather than after. See [What are credits?](/help/credits) Credits are spent on **generation**, not on publishing. A campaign you generate and then discard still costs the full amount. Start small — five posts with one image is 10 credits and tells you quickly whether the output is usable. ## Nothing is scheduled yet Generating a campaign does not put anything on your calendar. Ocoya hands you a plan to review, and only the posts you approve get scheduled. See [Review a generated campaign](/help/review-a-campaign). ## Getting better output The same rule as every other AI feature: the brand profile does most of the work. A campaign inherits the brand's voice on every post, so a thin brand description produces thirty thin posts rather than one. See [Set up your brand](/help/set-up-your-brand). Beyond that, the prompt should carry the specifics the AI cannot know — dates, product names, the offer, what makes this launch different. ## Related Approving, editing and scheduling what came back. Why a campaign costs what it does. # Edit a caption with AI Source: https://docs.ocoya.com/help/ai-copywriter Select any part of a caption and have Ocoya rewrite, shorten, expand or translate it. You don't have to generate a whole post to use AI on it. Select any part of a caption you've already written and Ocoya can rework just that part, leaving the rest alone. This works the same whether you wrote the caption by hand or generated it. ## Use it Select some text in the caption, then choose an action from the AI menu that appears. Ocoya replaces the selection with what it returns — the rest of the caption is untouched. Each action costs **1 credit**. See [What are credits?](/help/credits) ## The actions | Action | What it does | | --------------------------- | -------------------------------------------------------------------------------------------- | | **Write from instructions** | Treats the selected text as a brief rather than as copy, and writes the caption it describes | | **Fix spelling & grammar** | Corrects mistakes without changing the meaning | | **Rephrase** | Rewrites the selection, keeping the same meaning | | **Shorten** | Cuts it down while keeping the main message | | **Expand** | Adds useful detail | | **Emojify** | Works emoji into the text | | **Translate** | Translates the selection into another language, picked from a submenu | **Write from instructions** is the one people miss. Instead of selecting a sentence to improve, you type what you want — one instruction per line — select those lines, and Ocoya writes a caption section for each one, in order. It's the fastest way to get structure into a long caption. ## Translating a caption Translate sits in its own submenu with the language list. Ocoya detects the language your caption is already in — the editor shows it next to the post score — so the language you're translating from doesn't need choosing. A common pattern for multi-market brands: write the caption once, then use [per-channel captions](/help/ways-to-create-a-post) to hold a translated version for each market's channel, rather than creating a separate post per language. ## Fixing what the post score flags The AI menu also carries a **Fix** action for each failing item on your post score, labelled after the item — *Fix: Opening line gives people a reason to stop*, and so on. These are narrower than the general actions: each one is told to change only what that check measures and to leave everything else verbatim. See [Post score](/help/post-score) for what each check looks at. ## When it doesn't help AI editing works on wording. It cannot fix a caption that has nothing to say — expanding a thin sentence gives you a longer thin sentence. It also writes from your brand description, so if the tone comes back wrong across every action rather than on one, the brand profile is the thing to change. See [Set up your brand](/help/set-up-your-brand). ## Related Writing by hand, drafting from a prompt, or generating a campaign. Each AI edit costs one. # The AI content doesn't sound like us Source: https://docs.ocoya.com/help/ai-sounds-generic Why generated captions come out bland, in the order the causes actually matter. This is the most common complaint about AI output, and it almost always has the same cause. Work through these in order — the first one accounts for most of it. ## 1. Your brand description Everything Ocoya generates is written from your brand profile. A thin description produces thin captions, every time, on every channel. Open **Brand** and read your description as if you were the AI. Does it say what you sell, who buys it, and how you sound? > We sell things online. gives the model nothing. Compare: > Acme Co makes hard-wearing outdoor gear for people who would rather be outside. We sell direct to walkers and climbers who care more about kit lasting than about looking new. Plain-spoken, a bit dry, never hyped. The second produces noticeably different output from the same prompt. If you change one thing, change this. See [Set up your brand](/help/set-up-your-brand). **Fetch brand** next to your website reads your site and drafts this for you — usually a better starting point than a blank field. ## 2. Your visual identity The same applies to images. Logos and colours are what stop generated designs looking like stock. A brand with no visual identity gets generic imagery no matter how good the prompt. ## 3. Your prompt Describe the **subject**, not the style — the style should come from your brand, so you don't have to restate it every time. Put in what the model can't know: the product name, the date, the offer, what makes this one different. *A post about our new jacket* is a weaker brief than *the Fell jacket, out Friday, our first fully recycled shell, aimed at people who already own one of ours*. ## 4. Tone and length The composer's **tone** (Professional, Friendly, Educational, Bold, Founder-led) and **length** (short through extra long) change the output meaningfully. If everything reads samey, you may have left both on their defaults for every post. ## 5. Hashtags it invented If the hashtags are wrong rather than the words, that's a separate fix: select a [hashtag library](/help/hashtag-libraries) and the AI is restricted to your tags, with no inventing, translating or pluralising. ## What not to do **Don't regenerate repeatedly.** Each run costs credits and, with the same brand profile and prompt behind it, tends to produce the same kind of output. Two regenerations without changing anything is usually two wasted credits. **Don't fix it entirely by hand every time.** Editing one caption fixes one post; improving the brand description fixes every future one. ## When it's close but not right Generate, then edit. Select the part that's off and use the AI actions — rewrite, shorten, expand — rather than regenerating the whole thing. See [Edit a caption with AI](/help/ai-copywriter). The [post score](/help/post-score) is also worth opening: a caption that reads flat often fails the same two checks, the opening line and having a concrete takeaway. ## Related The profile everything is generated from. Fixing part of a caption instead of regenerating. # API tokens Source: https://docs.ocoya.com/help/api-tokens Create a token for the Ocoya API, see what it can reach, and revoke it when you're done. An API token lets your own code talk to Ocoya. Find them under **Settings → API**. This page covers managing tokens. For how to actually call the API — the base URL, the header, the endpoints — see the [REST API documentation](/welcome). Ocoya API settings showing an API usage chart with 1H, 1D and 30D ranges, and an API tokens section with a Create token button and one token listed with its masked value and creation date ## Create a token Select **Create token** and give it a name. The name is only for you — it's there so you can tell tokens apart later and revoke the right one. Name tokens after where they're used, not what they do. *Zapier*, *staging server*, *reporting script* tells you what breaks when you revoke it. *API key 2* doesn't. Copy the token as soon as it's created and store it somewhere safe. Ocoya shows only the first and last few characters afterwards. ## What a token can reach **Each token can access every brand owned by this account.** There's no way to scope a token to a single brand — the token list shows *All brands* against each one. That matters if you were planning to give a client's developer a token for their brand only. You can't. They'd be able to reach every brand you own. ## Revoke a token The **⋯** menu on any token offers **Delete token**. Deletion is immediate and permanent — anything using that token starts failing straight away, so make sure you know what's using it first. That's what the names are for. There's no way to rotate a token in place. To replace one: create the new token, move your integration across, then delete the old one. ## Watching usage The **API usage** chart shows authenticated requests for the current brand, over the last hour, day or 30 days. It's the quickest way to confirm an integration is actually calling Ocoya, or to spot one calling far more than you expected. Ocoya allows **60 requests per minute** per key, and returns `429 Too Many Requests` beyond that. The full detail, including the rate-limit headers, is in [Rate limits](/fundamentals/rate-limits). ## Related Authentication, endpoints and examples. Using Ocoya from Claude, ChatGPT or your editor instead. # Brands and channels Source: https://docs.ocoya.com/help/brands-and-channels How Ocoya is organised, and which settings belong to a brand. Ocoya is organised around **brands**. A brand is a business you post as — your own company, or one client if you're an agency. Everything else belongs to a brand. ``` Brand billing, members, identity, time zone └── Channel one connected social account ``` ## What a brand holds | | | | ------------ | --------------------------------------------- | | **Identity** | Name, website, description, logos and colours | | **Channels** | Every connected social account | | **Content** | Posts, drafts, campaigns and the calendar | | **Members** | The people with access, and their roles | | **Settings** | Time zone, week start and posting schedule | Switch brands using the brand name at the top of the left sidebar. ## Billing is shared across your brands You pay once, not per brand. One subscription covers every brand you own, and creating a new brand puts it on the same plan automatically — there's no second checkout and no second invoice. Your plan's allowances are **pooled across all your brands**, not granted to each one separately: | Allowance | How it's counted | | ------------ | ---------------------------------------------- | | Brands | How many you can create in total | | Team members | Everyone across all your brands | | Channels | Every connected account across all your brands | | Credits | One shared balance | Connecting the same social account to two brands counts as **one** channel against your limit, not two. Useful for agencies running the same account across several brands. Brands you were invited into by someone else don't touch your allowances — they count against that owner's plan. Ocoya Brand settings showing a Brand profile section with Name, Website and Description fields, a Fetch brand button, and a Visual identity section for logos and icons Your brand's identity isn't decorative. Ocoya's AI reads the description and visual identity when writing captions and generating images, so a complete brand profile produces noticeably better output. See [Set up your brand](/help/set-up-your-brand). ## Channels A channel is one connected social account — a single Facebook Page, one Instagram Business account, one LinkedIn profile. Ocoya Channels page showing connected channels with their network and connection date **Channels belong to a brand.** Connect Instagram while Brand A is selected, switch to Brand B, and that Instagram channel is not there. It hasn't been lost — it belongs to Brand A. If a channel seems to have vanished, check which brand is selected in the sidebar before anything else. ## When to use more than one brand Create a separate brand for each business you post as. Each keeps its own identity, channels, content and members. Agencies typically run one brand per client, which keeps each client's content and access separate while everything stays on one subscription. Most businesses need only one brand. How many you can create depends on your plan. Starter, Team and Agency all allow unlimited brands. On the legacy plans it's Bronze 1, Silver 5, Gold 20, and Diamond unlimited. ## Which brand is a setting on? Every setting below applies to the brand currently selected in the sidebar. | I want to… | Go to | | ------------------------------------- | ------------------------------------------------- | | Change the plan, or see an invoice | **Settings → Billing** — covers all your brands | | Invite someone or change their role | **Settings → Team** — per brand | | Check the credit balance | Bottom of the sidebar — shared across your brands | | Change the name, logo or description | **Brand** | | Change the time zone posts publish in | Planner settings | | Connect or reconnect a social account | **Channels** | | Find a post or campaign | **Planner** | ## Common mix-ups **"My channel disappeared."** You're on a different brand. Switch brands in the sidebar. **"I invited someone but they can't see my other client's content."** Members are invited per brand. Invite them to each brand they need. **"My teammate has different credits to me."** Credits belong to whoever owns the brand. Working in someone else's brand spends theirs, not yours. **"Can I bill each client separately?"** Not within one account — all your brands share a single subscription and one invoice. Separate billing needs separate Ocoya accounts, each with its own owner. ## Related Filling in the profile Ocoya's AI writes from. Add a social account to the current brand. # Cancel your subscription Source: https://docs.ocoya.com/help/cancel-your-subscription How to unsubscribe, and what happens to your brands and posts afterwards. You can cancel yourself, at any time, without contacting anyone. ## Cancel Select **Billing** in the sidebar. It sits alongside **Manage subscription** and **Payment & invoices** on your current plan. Ocoya asks *Before you go, can we help?* and offers a call. If your reason is something fixable — a missing feature, a channel that keeps disconnecting, a billing surprise — it's worth a conversation. Otherwise select **Continue cancelling**. Stripe handles the cancellation and returns you to Ocoya. ## What happens next Cancelling stops future payments. It isn't a refund of the period you've already paid for, and it isn't an instant shutdown — access continues to the end of the paid period, then the brand drops to free-plan limits. On the free plan you keep **1 brand and 1 user, with no connected social profiles and no monthly credits**. Your posts, brands and media aren't deleted — but scheduled posts stop publishing once the channels are no longer usable, so reschedule or export anything time-sensitive before the period ends. ## Cancelling is not deleting Cancelling ends the subscription and leaves the account in place, which is what you want if you might come back — resubscribing restores your limits, and your channels can be reconnected from the Channels page. To remove the account and its data entirely, that's a separate request: contact support. ## Common problems **"I don't see Unsubscribe."** Only Owners and Admins can manage billing. See [Roles and permissions](/help/roles-and-permissions). **"I cancelled but was charged again."** Check the date on the invoice — a charge dated before your cancellation is for the period you were still subscribed. If it's dated after, contact support with the invoice number. **"I cancelled by mistake."** Resubscribe from the plan cards in Billing. If you're still inside the paid period, nothing was lost. ## Related What each plan includes. Invoices and payment methods. # Change your email address Source: https://docs.ocoya.com/help/change-your-email Change the address you sign in with — and why Ocoya makes you verify it first. Your email address is how you sign in — it's where magic links go and what identifies your account. Changing it takes a verification step, deliberately. ## Change it From the account menu in the left sidebar. Nothing has changed yet. Ocoya asks you to confirm the new address before sending anything, and warns: > Sending the verification to someone else may end up forbidding your access. Read the address on that screen carefully. This is the point where a typo becomes a problem. Ocoya emails a verification link to the **new** address. Your account shows **Email change pending verification** until you use it. Select the link in that email. Ocoya confirms with *Email updated!* and the new address is live. ## Until you verify, nothing has changed The old address still signs you in while a change is pending. That's the safety net: if the verification never arrives, you haven't lost access. If the link fails, Ocoya says *That didn't work.* — start the change again rather than trying the same link twice. ## Why the warning matters The verification goes to the **new** address, not the old one. If you type an address you don't control — a typo, or an old colleague's — whoever receives it can complete the change, and you lose the account. Check the address on the confirmation screen before sending. It's the last point at which a mistake is free. ## If the verification email doesn't arrive Work through these in order: 1. Wait two minutes. Delivery is usually immediate but can lag. 2. Check spam and junk at the **new** address. 3. Confirm the address you typed is one you can actually open. 4. If your company filters inbound mail, ask IT to allow `ocoya.com`. Your old address still works throughout, so you can keep using Ocoya and try again. ## What it doesn't change Your brands, posts, channels, credits and team memberships are all unaffected — only the address you sign in with. If you sign in with Google, changing your Ocoya email doesn't change your Google account. Because a linked Google account has to match your Ocoya address, that link may stop working after a change. See [Your account](/help/your-account). ## Related Name, image, password and connected sign-in. What to do if you can't get in. # Change your plan Source: https://docs.ocoya.com/help/change-your-plan Upgrade, downgrade or switch plans, and what happens to what you've already paid. Plan changes happen in **Billing**, and payment is handled by Stripe. ## Change your plan Select **Billing** in the sidebar. You'll see your current plan at the top and the three plan cards below it. Use the **Monthly** / **Yearly (2 months free)** toggle before choosing a plan — the price on each card follows it. Select the button on the plan you want. It reads **Upgrade to**, **Downgrade to** or **Switch to** depending on where you're moving from. Stripe takes the payment and returns you to Ocoya. The new limits apply as soon as it completes. ## What it costs to change Stripe shows the exact amount before you confirm, so check that screen rather than assuming — the figure depends on where you are in the current period and whether you're switching interval as well as plan. Nothing is charged until you confirm. ## If your plan is a legacy one The button says **Switch to** rather than Upgrade or Downgrade. Prices across plan generations aren't comparable — legacy Gold at \$99 is not an upgrade over Team at \$79 despite the higher price — so Ocoya deliberately doesn't label the direction. See [Legacy plans](/help/legacy-plans). ## Managing an existing subscription **Manage subscription** on your current plan opens Stripe's plan screen for the subscription you already have — useful for changing the interval or seat quantity without moving plan. If you have no active subscription it opens the portal home instead. ## Common problems **"The buttons are greyed out."** You're on the free plan and already have a subscription elsewhere, or you're not an Owner or Admin — only those roles can manage billing. **"I downgraded and lost access to a channel."** Downgrading lowers your social-profile and user limits. Anything over the new limit stops being usable until you disconnect down to it or move back up. ## Related What each plan includes. Cards, invoices and receipts. # Character and media limits Source: https://docs.ocoya.com/help/channel-limits Every network's caption, image and video limits in one table. Each network sets its own rules, which is why the same post can publish to LinkedIn and be refused by Instagram. Ocoya checks a post against these before publishing and tells you which limit it breaks. ## Caption limits | Network | Caption | Hashtags | | --------------- | ------------------------- | -------- | | Facebook | 5,000 | No limit | | Instagram | 2,200 | 30 | | X (Twitter) | 280 per post, 5,000 total | No limit | | LinkedIn | 3,000 | No limit | | TikTok | 2,200 | No limit | | Pinterest | 500 | No limit | | Threads | 500 per post, 5,000 total | No limit | | Bluesky | 300 per post, 5,000 total | No limit | | Mastodon | 500 per post, 5,000 total | No limit | | YouTube Shorts | 5,000 | No limit | | Google Business | 1,500 | No limit | | Discord | 2,000 | No limit | Where a network shows two numbers, the first is what fits in one post and the second is the point at which Ocoya refuses the post. Between the two, Ocoya splits your text into a thread — see [Long posts and threads](/help/long-posts-and-threads). ## Image limits | Network | Images per post | Max size each | | --------------- | --------------- | ------------- | | Facebook | 10 | 8 MB | | Instagram | 10 | 8 MB | | X (Twitter) | 4 | 5 MB | | LinkedIn | 9 | 10 MB | | TikTok | 35 | 20 MB | | Pinterest | 5 | — | | Threads | 10 | 8 MB | | Bluesky | 4 | 2 MB | | Mastodon | 4 | 16 MB | | Discord | 10 | 10 MB | | Google Business | 1 | 5 MB | ## Video limits | Network | Videos per post | Max size | | -------------- | --------------- | -------- | | Facebook | 1 | 100 MB | | Instagram | 1 | 100 MB | | X (Twitter) | 1 | 100 MB | | LinkedIn | 1 | 100 MB | | TikTok | 1 | 100 MB | | Threads | 1 | 100 MB | | Pinterest | 1 | — | | Mastodon | 1 | 99 MB | | YouTube Shorts | 1 | 256 MB | | Discord | 10 | 10 MB | **Bluesky and Google Business take no video at all** — attach one and the post is refused. YouTube Shorts is the mirror image: it takes a video or a GIF and no still images. Instagram Reels are a separate case: up to **1,000 MB**, between 3 seconds and 15 minutes. ## Other rules worth knowing | Network | Rule | | --------------- | --------------------------------------------------------------- | | Instagram | Business or Creator account only, linked to a Facebook Page | | Facebook | Pages only, never personal profiles | | Pinterest | Every Pin needs a board | | LinkedIn | PDF carousels need at least 2 images and a 5–50 character title | | Discord | Maximum 10 attachments per post | | Google Business | Events and offers need a title, start time and end time | | TikTok | Custom video thumbnails are not supported | | Instagram | Custom thumbnails work for Reels, not standard video | ## Image shapes Instagram accepts a limited range of shapes and Ocoya crops to fit: * Landscape — 1.91:1 * Portrait — 4:5 If an image is cropped differently than you expected, it was outside that range. Crop it yourself first to control what's kept. ## Related What happens when a caption is longer than one post allows. Diagnosing a post refused by a network. # Why can't I connect another channel? Source: https://docs.ocoya.com/help/channel-slots How channel slots are counted across your brands, and how to free one up. Every plan includes a number of connected channels, and Ocoya refuses a new connection once you're at the limit. ## What counts **Every connected channel counts as one**, across **all your brands** — not per brand. Five channels in one brand and five in another is ten against your limit. A Facebook Page and an Instagram account are **two**, even though they're connected in a single flow and linked to each other at Meta's end. That surprises people more than anything else here. | Plan | Social profiles | | ------- | --------------- | | Starter | 5 | | Team | 20 | | Agency | 100 | Legacy plans differ — Bronze 5, Silver 20, Gold 50, Diamond 150. See [Legacy plans](/help/legacy-plans). ## What doesn't count twice **The same account connected to two brands counts once.** If you run the same Instagram account across two brands, it uses one slot, not two. Brands themselves don't count against anything on current plans — they're unlimited. ## Freeing a slot **Disconnect a channel you no longer post to.** A disconnected channel stops counting immediately, and its history stays in the brand. See [Disconnect a channel](/help/disconnect-a-channel). Worth checking before you upgrade: dormant accounts, test connections made while setting up, and channels belonging to clients you no longer work with. Disconnecting does not delete anything you've published, and reconnecting later attaches the account back to the brand rather than creating a duplicate. ## Or upgrade If every connected channel is one you actually use, the limit is doing its job — [change your plan](/help/change-your-plan). The new limit applies as soon as the change completes. Downgrading works the other way. If you drop to a plan with fewer channels than you have connected, anything over the new limit stops being usable until you disconnect down to it. ## Related Freeing a slot without losing history. What each plan includes. # Bluesky Source: https://docs.ocoya.com/help/channels/bluesky Connect Bluesky with an app password, what you can post, and its limits. Bluesky is the one network that doesn't use a sign-in page. You connect it with your handle and an **app password** — a separate password you generate in Bluesky, which you can revoke at any time without changing your account password. ## Before you start Generate an app password in Bluesky under **Settings → App passwords**. It looks like `xxxx-xxxx-xxxx-xxxx`. Never enter your account password. Ocoya asks for an app password specifically so it never holds full access to your account. ## Connect Bluesky Select **Channels** in the left sidebar, then **Connect channel**. Pick **Bluesky** from the **Add a connection** panel. Add a connection panel listing every channel Ocoya connects to, each with its category and an arrow to continue Your handle is under your display name on your Bluesky profile — usually `yourname.bsky.social`. Custom domain handles work too. Paste the app password you generated, then select **Connect Bluesky**. There's also a **Follow us on Bluesky** checkbox, ticked by default. Clear it if you'd rather not. ## What you can post | Post type | Supported | | ------------ | --------------------- | | Text post | Yes — no image needed | | Single image | Yes | | Carousel | Yes — up to 4 images | | Video | No | | GIF | No | ## Bluesky's limits | | Limit | | --------------- | ------------------------------------ | | Post text | 300 characters per post, 5,000 total | | Hashtags | No fixed limit | | Images per post | 4, maximum 2 MB each | | Video | Not supported | **2 MB per image is the tightest image limit of any network Ocoya supports.** A photo straight off a phone is usually larger, so compress before uploading if Bluesky rejects it. ## Long captions become threads Bluesky holds 300 characters per post. Above that, Ocoya splits your caption into a thread rather than refusing it, up to 5,000 characters total. See [Long posts and threads](/help/long-posts-and-threads). ## Common problems **"Could not connect Bluesky."** Almost always the account password rather than an app password, or a typo in the handle. Generate a fresh app password and try again. **"It worked, then stopped."** Revoking the app password in Bluesky disconnects Ocoya. Generate a new one and reconnect — see [Reconnect a channel](/help/reconnect-a-channel). **"My video won't attach."** Bluesky publishing is image-only in Ocoya. Post the video to another channel, or share a link. ## Related When a caption is split into a chain of replies. Restoring access after an app password is revoked. # Discord Source: https://docs.ocoya.com/help/channels/discord Connect a Discord channel, what you can post, and why Discord never splits a long post. A Discord connection is one **channel** in one server, not a whole server. Connect the channel you want Ocoya to post in; connect again for a second channel. ## Before you start You need permission to add a webhook in the server — that's **Manage Webhooks**, which server admins have by default. If you don't have it, ask an admin to connect the channel or grant the permission. ## Connect Discord Select **Channels** in the left sidebar, then **Connect channel**. Pick **Discord** from the **Add a connection** panel. It's below Mastodon in the list. Discord asks which server to add Ocoya to, then which channel to post in. Both choices happen on Discord's own screen. Approve the request. The channel appears on your Channels page. ## How posts appear Ocoya publishes through a channel webhook, so posts arrive from an Ocoya webhook rather than from your personal Discord account. That's how Discord works for any scheduling tool — there's no way to post as yourself through the API. Disconnecting the channel in Ocoya removes the webhook from Discord. ## What you can post | Post type | Supported | | --------- | --------------------- | | Text post | Yes — no image needed | | Images | Yes — up to 10 | | Video | Yes — up to 10 | | GIF | Yes — up to 10 | Ten attachments in total per post, counting images, videos and GIFs together. ## Discord's limits | | Limit | | -------------------- | ---------------------- | | Post text | 2,000 characters | | Hashtags | No fixed limit | | Attachments per post | 10, maximum 10 MB each | ## Long posts are refused, not split This is where Discord differs from X, Threads, Bluesky and Mastodon. Those four split a long caption into a thread. **Discord doesn't** — 2,000 characters is a hard ceiling, and a longer caption is refused before publishing. If you're writing one post for several networks, keep the Discord version under 2,000 characters, or write a separate shorter caption for it. ## Common problems **"I don't see the server I want."** You're signed in to Discord as an account that isn't in that server, or you lack Manage Webhooks there. **"Posts stopped appearing."** Someone deleted the webhook in Discord's channel settings, or the channel itself was deleted. Reconnect the channel — see [Reconnect a channel](/help/reconnect-a-channel). **"Can it post to a thread or forum channel?"** Connect a standard text channel. Threads and forum posts inside Discord aren't selectable as targets. ## Related Every network's limits in one table. Diagnosing a post a network refused. # Facebook Pages Source: https://docs.ocoya.com/help/channels/facebook Connect a Facebook Page to Ocoya, what you can post, and the limits Facebook applies. Ocoya publishes to Facebook **Pages**. Personal Facebook profiles cannot be connected — Facebook does not allow any scheduling tool to post to them. ## Before you start You need an **admin** role on the Page you want to connect. If someone else created the Page, ask them to make you an admin first, in **Page settings → Page access**. ## Connect a Facebook Page Select **Channels** in the left sidebar, then **Connect channel**. Pick **Facebook Page** from the **Add a connection** panel. Add a connection panel listing every channel Ocoya connects to, each with its category and an arrow to continue Facebook shows a list of Pages with none pre-selected, and a separate permissions screen. **Tick the Page you want and approve every permission.** Missing either is the most common reason a Page doesn't appear afterwards. Choose the Page to add. It appears on your Channels page. ## What you can post | Post type | Supported | | ------------ | --------------------- | | Text post | Yes | | Single image | Yes | | Carousel | Yes — up to 10 images | | Video | Yes — one per post | | Reel | Yes | ## Facebook's limits | | Limit | | --------------- | --------------------- | | Post text | 5,000 characters | | Hashtags | No fixed limit | | Images per post | 10, maximum 8 MB each | | Video per post | 1, maximum 100 MB | ## Posting to a Facebook Group Ocoya connects Pages, not Groups directly. To post to a Group, make your Page an admin of that Group in the Group's settings, then post as the Page. ## Common problems **"My Page isn't in the list."** You're not an admin of it, you didn't tick it on Facebook's selection screen, or you signed in with the wrong Facebook account. Check in that order. **"Facebook keeps disconnecting."** Facebook expires access more aggressively than most networks, especially after a password change. See [Reconnect a channel](/help/reconnect-a-channel). **"My post says Published by Ocoya."** Facebook attributes posts to the tool that made them. This can't be turned off through the API. ## Related Instagram connects through Facebook, and has its own requirements. Fixing Facebook access when it expires. # Google Business Source: https://docs.ocoya.com/help/channels/google-business Connect Google Business locations, and post updates, offers and events. Google Business connects **locations**, not accounts. One connected channel is one location, so a business with four branches connects four channels and can post to them separately or together. ## Before you start Your locations need to be verified in Google Business Profile. Unverified locations don't appear in the list. ## Connect Google Business Select **Channels** in the left sidebar, then **Connect channel**. Pick **Google Business** from the **Add a connection** panel. Add a connection panel listing every channel Ocoya connects to, each with its category and an arrow to continue Sign in with the account that manages the locations, and approve access. Ocoya lists every location it can see, named by the location title with its address underneath. Pick the ones you want and add them. ## Three kinds of post Google Business posts aren't all the same shape. In the post editor, the **Google Business options** panel gives you three: | Type | What it's for | Extra fields | | ---------- | --------------------------------- | ------------------------- | | **Update** | Ordinary news or announcements | None | | **Offer** | A promotion with a start and end | Title, start and end date | | **Event** | Something happening at a set time | Title, start and end date | Offers and events won't publish without a title and both dates. ## Call to action Update and Event posts can carry a button: **Book**, **Order online**, **Buy**, **Learn more** or **Sign up**, each needing a URL. Choose **None** for no button. Offers don't take a call-to-action button — Google renders offers with their own layout instead. ## Google Business' limits | | Limit | | --------------- | ---------------- | | Post text | 1,500 characters | | Images per post | 1, maximum 5 MB | | Video | Not supported | Posts are published in English (`en-US`). ## Common problems **"None of my locations appear."** They're unverified, or the Google account you signed in with doesn't manage them. Check in Google Business Profile first. **"My offer wouldn't schedule."** Offers and events need a title and both dates. Ocoya blocks scheduling until they're filled in. **"My call to action disappeared."** You switched the post to **Offer**, which doesn't support one. **"My video was rejected."** Google Business posts are text and a single image only. ## Related Every network's limits in one table. How locations sit inside a brand. # Instagram Source: https://docs.ocoya.com/help/channels/instagram Connect an Instagram Business account to Ocoya, what you can post, and the limits Instagram applies. Instagram is the channel people have most trouble connecting, almost always for the same reason: **Instagram does not allow personal accounts to be connected to any scheduling tool.** Your account must be a Business or Creator account. ## Before you start In the Instagram mobile app, go to **Settings → Account type and tools → Switch to professional account**. This is free, reversible, and done entirely in the Instagram app. Instagram publishes through Facebook's systems, so a Business account must be linked to a Facebook Page. In the Instagram app: **Edit profile → Page → connect or create a Facebook Page**. You need an admin role on the linked Facebook Page. Without it the connection completes but no profile appears. ## Connect Instagram Select **Channels** in the left sidebar, then **Connect channel**. Pick **Instagram Business** from the **Add a connection** panel. Add a connection panel listing every channel Ocoya connects to, each with its category and an arrow to continue You sign in through Facebook, not Instagram. Approve every permission and tick every Page and Instagram account in the list. Facebook's screens default to *not* selecting them, and skipping this is the single most common cause of "my profile isn't showing". Choose the Instagram account to add. It appears on your Channels page. ## What you can post | Post type | Supported | | ------------ | --------------------- | | Single image | Yes | | Carousel | Yes — up to 10 images | | Video | Yes — one per post | | Reel | Yes — one per post | | Story | Yes | | GIF | Yes — one per post | ## Instagram's limits | | Limit | | ---------------------- | ----------------------------------------------------- | | Caption | 2,200 characters | | Hashtags | 30 per post | | Images per post | 10, maximum 8 MB each | | Video per post | 1, maximum 100 MB, up to 1920px wide | | Reel | 1 per post, 3 seconds to 15 minutes, maximum 1000 MB | | GIF | 1 per post, 3 to 60 seconds | | Custom video thumbnail | Not supported for standard video; supported for Reels | Ocoya checks these before publishing and tells you which one a post breaks. ## Image sizes and cropping Instagram accepts a limited range of shapes. Ocoya crops images automatically to fit: * **Landscape** — 1.91:1 * **Portrait** — 4:5 If an image comes out cropped differently than you expected, it fell outside that range and was adjusted. Crop it yourself before uploading to control exactly what's kept. ## Common problems **"My Instagram account isn't in the list."** In order of likelihood: it's still a personal account; it isn't linked to a Facebook Page; you don't administer that Page; or you didn't tick it on Facebook's permission screen. Work through those in order. **"Instagram keeps disconnecting."** Facebook and Instagram expire access more aggressively than other networks. See [Reconnect a channel](/help/reconnect-a-channel). **"My Reel failed to publish."** Check length and size — 3 seconds minimum, 15 minutes maximum, 1000 MB cap. **"My carousel only posted one image."** Instagram accepts up to 10 images. If a post had more, it breaks the limit and Ocoya reports it before publishing. **"My account is restricted."** Instagram sometimes restricts accounts for activity it considers automated. Ocoya can't lift a restriction — you'll need to resolve it in the Instagram app, then reconnect. ## Related Fixing Instagram access when it expires. Diagnosing a post that didn't go out. # LinkedIn Source: https://docs.ocoya.com/help/channels/linkedin Connect LinkedIn to Ocoya, post PDF carousels, and the limits LinkedIn applies. Connect LinkedIn to schedule posts, images, video and PDF carousels. ## Connect LinkedIn Select **Channels** in the left sidebar, then **Connect channel**. Pick **LinkedIn** from the **Add a connection** panel. Add a connection panel listing every channel Ocoya connects to, each with its category and an arrow to continue Sign in to LinkedIn and approve the permissions requested. ## What you can post | Post type | Supported | | ---------------------------- | ----------------------- | | Text post | Yes | | Single image | Yes | | Multi-image post | Yes — up to 9 images | | PDF carousel (document post) | Yes — at least 2 images | | Video | Yes — one per post | ## LinkedIn's limits | | Limit | | ------------------ | --------------------- | | Post text | 3,000 characters | | Images per post | 9, maximum 10 MB each | | Video per post | 1, maximum 100 MB | | PDF carousel title | 5 to 50 characters | | PDF carousel | At least 2 images | ## PDF carousels LinkedIn's document posts appear as a swipeable carousel. In Ocoya, add at least two images and give the carousel a title between 5 and 50 characters. A one-image carousel is refused with: > LinkedIn PDF carousel requires at least 2 images ## Polls and articles LinkedIn does not allow polls or long-form articles to be created through its API, so they cannot be scheduled from Ocoya or any other tool. Create those directly on LinkedIn. ## Common problems **"My carousel was rejected."** It had fewer than 2 images, or the title was outside 5–50 characters. **"I can't schedule a poll."** Not supported by LinkedIn's API — see above. **"LinkedIn disconnected."** LinkedIn access expires periodically. See [Reconnect a channel](/help/reconnect-a-channel). ## Related Fixing LinkedIn access when it expires. Every network's limits in one table. # Mastodon Source: https://docs.ocoya.com/help/channels/mastodon Connect a Mastodon account on any server, what you can post, and its limits. Mastodon isn't one website — it's thousands of independent servers. Ocoya connects to whichever server hosts your account, so the first thing it asks for is the server, not your username. ## Connect Mastodon Select **Channels** in the left sidebar, then **Connect channel**. Pick **Mastodon** from the **Add a connection** panel. Add a connection panel listing every channel Ocoya connects to, each with its category and an arrow to continue Type the domain of the server your account is on — `mastodon.social`, for example. Ocoya suggests the common ones: mastodon.social, mas.to, mastodon.world, mastodon.online and techhub.social. Any real Mastodon server works, not just those. Ocoya sends you to your server's authorization page, where you approve access to read your account and publish posts and media. You sign in to your server, never to Ocoya. ## What you can post | Post type | Supported | | ------------ | --------------------- | | Text post | Yes — no image needed | | Single image | Yes | | Carousel | Yes — up to 4 images | | Video | Yes — one per post | | GIF | Yes — one per post | A Mastodon post needs either text or media. Completely empty posts are refused. ## Mastodon's limits | | Limit | | --------------- | ------------------------------------ | | Post text | 500 characters per post, 5,000 total | | Hashtags | No fixed limit | | Images per post | 4, maximum 16 MB each | | Video per post | 1, maximum 99 MB | **Your server can be stricter.** Every Mastodon server sets its own character count and attachment limit, and Ocoya reads them from your server when publishing. Most use 500 characters, but a server configured for 1,000 gets 1,000 — and one that allows fewer attachments will say so: *"This Mastodon server allows a maximum of N media attachments."* ## Long captions become threads Above your server's per-post limit, Ocoya splits the caption into a chain of replies rather than refusing it, up to 5,000 characters total. See [Long posts and threads](/help/long-posts-and-threads). ## Common problems **"Enter a valid Mastodon server domain, such as mastodon.social."** The domain was mistyped, or you entered your full handle instead of the server. Enter only the domain — `mastodon.social`, not `@you@mastodon.social`. **"This Mastodon server cannot be connected."** The domain resolves but isn't a reachable Mastodon server. Check it in a browser first; if your server is behind a login wall or private network, Ocoya can't reach it. **"My post was shorter than 500 characters and still split."** Your server's limit is lower than Mastodon's default. The warning in the editor uses 500; publishing uses your server's real number. ## Related When a caption is split into a chain of replies. Every network's limits in one table. # Pinterest Source: https://docs.ocoya.com/help/channels/pinterest Connect Pinterest to Ocoya, choose a board, and the limits Pinterest applies. Connect Pinterest to schedule Pins and photo carousels. Every Pin must go to a board, so Ocoya asks you to choose one on each post. ## Connect Pinterest Select **Channels** in the left sidebar, then **Connect channel**. Pick **Pinterest** from the **Add a connection** panel. Add a connection panel listing every channel Ocoya connects to, each with its category and an arrow to continue Sign in to Pinterest and approve the permissions requested. Ocoya needs access to your boards to publish Pins. ## Boards **Every Pin needs a board.** When you add Pinterest to a post, pick the board it should publish to. A post without a board selected will not publish. If a board you expect is missing, it was created after you connected. Reconnect the channel to refresh the board list. ## What you can post | Post type | Supported | | ---------------- | -------------------- | | Single image Pin | Yes | | Photo carousel | Yes — up to 5 images | | Video Pin | Yes — one per post | ## Pinterest's limits | | Limit | | ------------------- | --------------------- | | Description | 500 characters | | Pin title | Up to 100 characters | | Images per carousel | 5 | | Video per Pin | 1 | | Board | Required on every Pin | ## Common problems **"My Pin didn't publish."** Usually no board was selected. Open the post and choose one. **"My new board isn't listed."** Reconnect the channel to refresh boards. **"Pinterest keeps disconnecting."** Pinterest expires access periodically. See [Reconnect a channel](/help/reconnect-a-channel). ## Related Fixing Pinterest access, and refreshing your board list. Every network's limits in one table. # Threads Source: https://docs.ocoya.com/help/channels/threads Connect a Threads profile, what you can post, and how long captions become threads. Threads connects directly, not through Instagram — even though the two share an account. You connect one Threads profile at a time. ## Connect Threads Select **Channels** in the left sidebar, then **Connect channel**. Pick **Threads** from the **Add a connection** panel. Add a connection panel listing every channel Ocoya connects to, each with its category and an arrow to continue Threads asks for permission to read your profile, publish content and manage replies. **Approve all three.** The replies permission is what lets Ocoya publish threads — without it, any caption over 500 characters fails at publishing time. There's no profile-selection screen. Threads returns a single profile, and it appears on your Channels page once approved. ## What you can post | Post type | Supported | | ------------- | --------------------- | | Text post | Yes — no image needed | | Single image | Yes | | Carousel | Yes — up to 10 images | | Video | Yes — one per post | | GIF | Yes — one per post | | Reel or story | No | ## Threads' limits | | Limit | | --------------- | ------------------------------------ | | Post text | 500 characters per post, 5,000 total | | Hashtags | No fixed limit | | Images per post | 10, maximum 8 MB each | | Video per post | 1, maximum 100 MB | ## Long captions become threads Above 500 characters Ocoya splits your caption into a chain of replies rather than refusing it. Ocoya warns you while you write, and the post still publishes. Above 5,000 characters it's refused outright. See [Long posts and threads](/help/long-posts-and-threads) for how the splitting works. ## Common problems **"Threading requires the threads\_manage\_replies permission."** You approved the first two permissions but not the third. Reconnect the profile and approve all of them — see [Reconnect a channel](/help/reconnect-a-channel). **"My Instagram account is connected but Threads isn't."** They're separate connections in Ocoya, even on the same login. Connect Threads on its own. ## Related When a caption is split into a chain of replies. Every network's limits in one table. # TikTok Source: https://docs.ocoya.com/help/channels/tiktok Connect a TikTok account to Ocoya, what you can post, and the limits TikTok applies. Connect TikTok to schedule videos, photo posts and GIFs from Ocoya alongside your other channels. ## Connect your TikTok account Select **Channels** at the bottom of the left sidebar, then **Connect channel** in the top right. Pick **TikTok** from the **Add a connection** panel. Add a connection panel listing every channel Ocoya connects to, each with its category and an arrow to continue Sign in to TikTok and approve the permissions it asks for. Approve all of them — declining any one can leave Ocoya connected but unable to publish. Choose the TikTok profile you want to add. It then appears on your Channels page. TikTok connects to the brand you have selected in the sidebar. If you manage several brands, check you're on the right one before connecting. ## What you can post | Post type | Supported | | ---------- | --------------------- | | Video | Yes — one per post | | Photo post | Yes — up to 35 images | | GIF | Yes — one per post | ## TikTok's limits | | Limit | | ---------------------- | ---------------------------------------------- | | Caption | 2,200 characters | | Hashtags | No fixed limit — they count toward the caption | | Video per post | 1, maximum 100 MB | | Images per post | 35, maximum 20 MB each | | GIF per post | 1, maximum 100 MB | | Custom video thumbnail | Not supported | If a post exceeds one of these, Ocoya tells you which limit it hit rather than failing silently at publish time. TikTok does not accept a custom thumbnail through its API. TikTok selects the cover frame itself, and you can change it in the TikTok app after the video is live. ## Requirements * Videos must be at least 3 seconds long. * Your TikTok account must be able to post publicly. Private accounts, and accounts restricted by TikTok, cannot publish through any scheduling tool. * Only one video per post. To publish several videos, create several posts. ## Common problems **"My video published but the cover frame is wrong."** Expected — see the warning above. Change the cover in the TikTok app. **"My post failed with a size error."** TikTok caps video at 100 MB. Compress the file or shorten the video and reschedule. **"My TikTok channel needs reconnecting."** TikTok's access expires periodically like other networks. See [Reconnect a channel](/help/reconnect-a-channel). **"I can't see my profile when connecting."** You signed in with a different TikTok account. Sign out of TikTok in your browser, then start the connection again. ## Related When TikTok stops accepting posts from Ocoya. Diagnosing a post that didn't go out. # X (Twitter) Source: https://docs.ocoya.com/help/channels/x-twitter Connect X to Ocoya, how long posts become threads, and the limits X applies. Connect X to schedule posts, images and video alongside your other channels. Ocoya turns long posts into threads automatically. ## Connect your X account Select **Channels** in the left sidebar, then **Connect channel**. Pick **X (Twitter)** from the **Add a connection** panel. Add a connection panel listing every channel Ocoya connects to, each with its category and an arrow to continue Sign in to X and approve access. To connect several X accounts, repeat the process. Sign out of X in your browser between connections, or X will reconnect the same account each time. ## Long posts become threads A single X post holds **280 characters**. Write more than that and Ocoya splits the post into a thread automatically rather than rejecting it. While composing, Ocoya warns you before you schedule: > Twitter caption exceeds 280 characters and will be split into a thread The hard limit is **5,000 characters**. Beyond that the post is refused and you'll need to shorten it. Threads, Bluesky and Mastodon behave the same way, each with their own per-post limit: Threads 500, Bluesky 300, Mastodon 500. ## X's limits | | Limit | | ---------------------- | ------------------------------------- | | Single post | 280 characters | | Total before rejection | 5,000 characters, split into a thread | | Images per post | 4, maximum 5 MB each | | Video per post | 1, maximum 100 MB | ## Duplicate content X rejects posts that are identical to something you posted recently. This is X's own anti-spam rule and applies whether you post through Ocoya or directly. If you need to repeat a message, change the wording, swap the image, or leave more time between posts. ## Common problems **"My post became a thread and I didn't want that."** It was over 280 characters. Shorten it to a single post. **"X keeps asking me to reconnect."** X expires access periodically. See [Reconnect a channel](/help/reconnect-a-channel). **"I connected a second account but it replaced the first."** Your browser was still signed in to the first account. Sign out of X, then connect again. ## Related Fixing X access when it expires. Every network's limits in one table. # YouTube Shorts Source: https://docs.ocoya.com/help/channels/youtube Connect a YouTube channel, and what Ocoya can publish to it. Ocoya publishes **Shorts** to YouTube — vertical video, one per post. It doesn't upload regular long-form videos, and it can't post images. ## Connect YouTube Select **Channels** in the left sidebar, then **Connect channel**. Pick **Youtube Shorts** from the **Add a connection** panel. Add a connection panel listing every channel Ocoya connects to, each with its category and an arrow to continue Sign in with the Google account that owns the channel and approve upload access. One channel per connection, and no selection screen — YouTube returns the channel for the account you signed in with. To publish to a second channel, connect again with that channel's account. ## What you can post | Post type | Supported | | -------------- | ------------------------------------- | | Video | Yes — one per post | | GIF | Yes — one per post, uploaded as video | | Image | No | | Text-only post | No | Every YouTube post needs exactly one video or GIF. Ocoya tells you plainly if that isn't the case: * *YouTube Shorts publishing only supports video or GIF uploads* — you attached an image. * *YouTube Shorts publishing only supports one video or GIF* — you attached more than one. * *YouTube Shorts publishing requires one video or GIF* — you attached nothing. ## YouTube's limits | | Limit | | -------------- | ----------------- | | Title | 100 characters | | Description | 5,000 characters | | Video per post | 1, maximum 256 MB | 256 MB is the most generous video size of any network Ocoya supports — but keep the video vertical and short enough for YouTube to treat it as a Short. ## After publishing Published posts link to `youtube.com/shorts/...`. If YouTube decides a video doesn't qualify as a Short — usually because it's too long or not vertical — it stays on your channel as a normal video at its regular watch URL. ## Common problems **"My image was rejected."** Shorts are video-only. Use a video, or publish the image to another channel. **"Upload failed for a large file."** Anything over 256 MB is refused. Compress or trim it first. **"It published as a normal video, not a Short."** That's YouTube's call, based on length and aspect ratio, not something Ocoya sets. ## Related Every network's limits in one table. The other short-video channel, with different rules. # Connect a social channel Source: https://docs.ocoya.com/help/connect-a-channel Connect Facebook, Instagram, X, LinkedIn, TikTok, and other channels to an Ocoya brand so you can publish to them. Before you can publish anything from Ocoya, you need to connect at least one social channel. Channels are connected to a **brand**, not to your account, so each brand you run has its own set of channels. ## Open the Channels page Select **Channels** at the bottom of the left sidebar. The page lists every channel already connected to the brand you have selected, with the network it belongs to and when it was connected. Ocoya Channels page showing a table of connected channels with their network and connection date, a search box, an All networks filter, and a Connect channel button in the top right Channels belong to the brand named in the top left of the sidebar. If you do not see the channels you expect, select that brand name to switch to a different brand. ## Connect a new channel Select the black **Connect channel** button in the top right of the Channels page. A panel titled **Add a connection** opens from the right. Select the network you want to add from the list. Add a connection panel listing every channel Ocoya connects to, each with its category and an arrow to continue Ocoya sends you to the network's own login and permission screen. Sign in to that network and approve the access it asks for. These screens belong to the network, not to Ocoya, so what they look like depends on the provider. After you approve access, Ocoya shows the **Select profiles** page, which lists the profiles it found on the account you just authorized. Choose the ones you want to add to this brand. Once added, the channel appears in the **Connected channels** table on the Channels page. ## Which networks can I connect? Ocoya connects to these channels: | Type | Channels | | --------- | -------------------------------------------------------------------------------------------------------------------------------------------------- | | Social | Facebook Page, Instagram Business, X (Twitter), LinkedIn, Pinterest, Bluesky, Threads, TikTok, Youtube Shorts, Google Business, Mastodon, Dribbble | | Streaming | Kick, Twitch | | Community | Discord, Whop | | Ecommerce | WooCommerce | Facebook and Instagram connect as **Pages** and **Business** accounts. A personal Facebook profile or a personal Instagram account cannot be connected — convert the Instagram account to a Business or Creator account first, from the Instagram app. ## If no profiles are found If the **Select profiles** page says "We haven't found any profiles", Ocoya reached the network but the account you authorized had nothing it could add. This usually means one of the following: 1. You signed in to the network with an account that does not manage the page or profile you want. 2. You did not grant every permission the network asked for. Ocoya needs all of them to list your profiles. 3. The Instagram account is a personal account rather than a Business or Creator account. Return to the Channels page, select **Connect channel** again, and repeat the connection — this time signing in with the account that manages the profile, and approving every permission requested. ## Manage a connected channel Select the **⋯** button at the end of any row in the Connected channels table: * **Manage** — open that channel's settings. * **Copy API profile id** — copy the profile's identifier, for use with the [Ocoya API](https://docs.ocoya.com). To find a channel in a long list, use the **Search channels** box, or narrow the table with the **All networks** filter. ## Related Still stuck connecting a channel? Message the Ocoya team from inside the app. # Connect an AI tool to Ocoya Source: https://docs.ocoya.com/help/connect-ai-tools Let Claude, ChatGPT or your editor work in Ocoya directly, and manage what they can reach. Ocoya has an MCP server, which lets an AI tool use Ocoya as a set of tools rather than you copying things back and forth. Connected, an assistant can draft and schedule posts, read your calendar, check channels and run workflows on your behalf. Find it under **Settings → MCP**. Ocoya MCP settings showing an MCP usage chart, tabs for Claude, ChatGPT, Codex and VS Code, sub-tabs for Claude Code, Claude Desktop / Web and JSON config, and a setup snippet reading claude mcp add ocoya --transport http https://app.ocoya.com ## Connect a tool Pick your tool from the tabs — **Claude**, **ChatGPT**, **Codex** or **VS Code** — and Ocoya shows the exact snippet for it. Claude has its own sub-tabs for Claude Code, Claude Desktop / Web and a raw JSON config. Copy the snippet, run or paste it where the tool expects, and Ocoya opens in your browser to approve the connection. Sign-in and brand approval are handled by OAuth — you don't create or paste an API token for this. Step-by-step guides for each tool live in the [MCP documentation](/mcp/get-started). ## Approving access When the tool connects, Ocoya shows a consent screen with **Requested permissions** and **Select brands to allow**. Choosing brands here is the real decision. Unlike an [API token](/help/api-tokens) — which always reaches every brand you own — an MCP connection is scoped to the brands you tick. If you run client brands, grant only the ones that tool should touch. ## What a connected tool can do The tools are grouped as **Publishing**, **Campaigns**, **Planning**, **Creative assets**, **Profiles**, **Workflows** and **Brands** — roughly matching what you can do in the app yourself. Anything that costs credits in Ocoya costs credits through MCP too. An assistant generating ten posts spends the same as you generating ten posts. See [What are credits?](/help/credits) The full tool list is in the [MCP documentation](/mcp/tools). ## Managing connections The MCP panel lists every connected tool with when it was connected, when its access expires, and which brands it can reach. **Revoke access** disconnects one immediately. Do that when you stop using a tool, when a connection covers brands it shouldn't, or if a machine you connected from is no longer yours. The **MCP usage** chart shows authenticated MCP requests for the current brand over the last hour, day or 30 days — useful for confirming a connection works, or noticing one that's busier than expected. ## API token or MCP? | | Use | | ------------- | ------------------------------------------------- | | **MCP** | You want an AI assistant to work in Ocoya for you | | **API token** | You're writing code that calls Ocoya | They're separate mechanisms. Connecting a tool over MCP doesn't need a token, and a token doesn't grant MCP access. ## Related Per-tool setup guides and the full tool reference. For your own code, rather than an assistant. # Connect WooCommerce Source: https://docs.ocoya.com/help/connect-woocommerce Link your WooCommerce store so publishing a product can trigger a post. Connecting a store lets Ocoya react when you publish a product — the basis of the [WooCommerce poster workflow](/help/create-a-workflow), which turns a new product into a social post. WooCommerce is the only ecommerce platform Ocoya connects to. ## Before you start You need **admin access to the store**. The connection is approved inside WooCommerce itself, and only an administrator sees that screen. The store must also be reachable over **HTTPS**. WooCommerce sends the credentials back to Ocoya over that connection and won't complete the handshake without it. ## Connect it Select **Channels** in the left sidebar, then **Connect channel**. It's listed under **Ecommerce** rather than with the social networks. The address of the store itself — `https://yourstore.com`, not the wp-admin path. Ocoya sends you to your own store's approval screen. Sign in as an administrator if you aren't already, and approve. Once approved you're returned to Ocoya and the store appears under **Ecommerce** connections. ## What Ocoya asks for Ocoya requests **read and write** access to the store, not read-only. Write access is needed to create the webhook that tells Ocoya when a product is published — without it, nothing could trigger. Approving it in WooCommerce creates an API key pair for Ocoya, which you can see and revoke in your store under **WooCommerce → Settings → Advanced → REST API**. Revoking it there cuts Ocoya off regardless of what Ocoya's own settings say. ## Using it A connected store does nothing on its own — it's a trigger source for workflows. Create a workflow from the **WooCommerce poster** example to post when you publish a product. Two behaviours to know, both from the trigger itself: * It fires **only the first time a product goes live**. Editing a published product won't trigger it again. * Triggering can be **delayed by up to 5 minutes**. See [Create a workflow](/help/create-a-workflow) and [Triggers and actions](/help/workflow-steps). ## Common problems **"The approval screen didn't appear."** Check the store URL, and that you're signed in to WordPress as an administrator. A URL with a typo, or one pointing at a staging site, fails here. **"It connected but nothing triggers."** The workflow also has to exist and be set live. A connected store with no workflow does nothing. See [A workflow didn't run](/help/workflow-didnt-run). **"I revoked the key in WooCommerce."** Then Ocoya can no longer reach the store. Connect it again from Channels. ## Related The WooCommerce poster example. When a product went live and nothing posted. # Create a workflow Source: https://docs.ocoya.com/help/create-a-workflow Pick an example that matches what you want, then configure its steps. Workflows start from an example. Select **New workflow** and Ocoya shows what it can build, grouped into **Marketing**, **Engagement** and **Advanced**. Selecting one previews its chain of steps on the right. **Use this example** creates the workflow with those steps in place and opens it. Give it a few seconds — Ocoya is building the steps before it takes you there. Ocoya Create workflow drawer with Marketing, Engagement and Advanced tabs, the Marketing examples listed on the left, and a preview on the right showing Schedule tagged TRIGGER flowing into Use AI agent and then Create social post, with a Use this example button ## The examples **Marketing** — publishing something. | Example | What it does | Steps | | ---------------------- | -------------------------------------------------- | ------------------------------------ | | **Daily poster** | Posts AI-generated content on a recurring schedule | Schedule → AI agent → Create post | | **RSS poster** | Posts when a new article appears in a feed | RSS → AI agent → Create post | | **WooCommerce poster** | Posts when you publish a product | WooCommerce → AI agent → Create post | **Engagement** — replying to people. | Example | What it does | Steps | | --------------------- | -------------------------------------------------------------- | -------------------------------------------------- | | **DM chatbot** | Answers DMs using AI | New DM → AI agent → Send DM | | **Mention responder** | Comments on public posts that mention you | New mention → AI agent → Reply in comments | | **Comment-to-DM** | Replies to comments containing a keyword and DMs the commenter | New comment → Filter → Send DM → Reply in comments | **Advanced** | Example | What it does | Steps | | ------------------ | -------------------------- | -------------------------------- | | **Webhook poster** | Posts when a URL is called | Webhook → AI agent → Create post | All three Engagement examples run on the Inbox, which supports **Facebook and Instagram only**. They will not fire for any other network. ## Create from scratch The drawer also offers **Create from scratch**. It's marked **Coming soon** — the button says so when you select it — so for now, start from the example whose shape is closest to what you want. ## After it's created The workflow opens in the builder with its steps laid out and **inactive**. Each step needs configuring before it will do anything useful — a schedule needs an interval, an RSS trigger needs a feed URL, an AI agent needs to be picked or created. Work down the chain from the trigger, then switch the workflow on. See [Triggers and actions](/help/workflow-steps). ## Choosing between examples The trigger is the real decision — it's what you can't change later without starting again. * Something should happen **on a rhythm** → Daily poster * Something should happen **when content appears elsewhere** → RSS or WooCommerce poster * Something should happen **when a person does something** → an Engagement example * Something should happen **when another system says so** → Webhook poster ## Related Configuring each step in the chain. The model, the plan requirement and what a run costs. # What are credits? Source: https://docs.ocoya.com/help/credits Credits are what Ocoya's AI features run on. Here's what uses them, how many you get, and when they reset. Credits are what Ocoya's AI features run on. Every time you ask Ocoya to write a caption, generate an image, or run an automation, it uses credits from your brand's balance. Your plan decides how many you get, and the balance refills at the start of each billing period. Nothing else in Ocoya uses credits. Scheduling posts, publishing, connecting channels and replying in the Inbox are all free and unlimited on any paid plan. ## Where to find your balance Your remaining credits are shown at the bottom of the left sidebar, on every page. Sidebar panel labelled Credits left showing the remaining balance and a progress bar underneath it ## What uses a credit Each AI action costs **1 credit**. Ocoya shows the cost on the button before you run it, so you always know what an action will spend. | Action | Credits | | -------------------------------------------------------- | ------------- | | Generate a caption | 1 | | Generate an image | 1 per image | | Rewrite, shorten, expand or translate text in the editor | 1 per action | | Generate hashtags | 1 | | Suggest a reply in the Inbox | 1 | | Send a message to an AI Agent | 1 per message | | Test a bot | 1 | | One automation or workflow run | 1 | A workflow run is the one non-AI action that costs a credit. It costs one whether or not the run ends up producing a post. ### Costs add up within a single action An AI post is one caption plus however many images you asked for. With image generation switched off, generating a post costs 1 credit: Ocoya AI post composer toolbar with Hashtags, Images, Professional and Medium buttons, and an amber badge showing a lightning bolt and the number 1 Turn image generation on and ask for one image, and the same post costs 2 credits — 1 for the caption, 1 for the image: The same composer toolbar with the Images button now reading Images (1) and the cost badge showing 2 credits Campaigns work the same way, multiplied by the number of posts. A campaign of 10 posts, each with one generated image, costs 20 credits: 10 captions plus 10 images. The cost badge always shows the total for the action you are about to run. If the number looks higher than you expected, check how many images or posts are selected. ## How many credits you get Your allowance depends on your plan. You can see it on any plan card under **Settings → Billing**. Ocoya billing settings showing Starter, Team and Agency plan cards with their yearly prices and a What's included list covering users, social profiles and credits **Current plans** | Plan | Credits | Users | Social profiles | | ------- | ------- | ----- | --------------- | | Starter | 300 | 1 | 5 | | Team | 1,500 | 5 | 20 | | Agency | 5,000 | 20 | 100 | **Legacy plans** If you joined Ocoya before the current plans, you may be on one of these. They keep working, and your billing page shows a **Legacy** badge next to the plan name. | Plan | Credits | | ------- | --------- | | Bronze | 100 | | Silver | 500 | | Gold | 1,500 | | Diamond | Unlimited | Accounts without a paid subscription have no credits and cannot use AI features. Start a plan to get an allowance. ## When credits reset **Credits refill every month**, on every plan. Unused credits do not carry over — each month starts at your full allowance regardless of how many you used or didn't use. Your reset day is the day of the month you subscribed. If you started your plan on the 12th, your credits refill on the 12th of each month. This is true whether you pay monthly or yearly. Paying annually doesn't give you a year's credits in one lump — you get your plan's allowance every month, the same as a monthly subscriber. If your subscription started on the 29th, 30th or 31st, months without that date reset on the last day instead. A subscription starting on the 31st resets on 28 February, then returns to the 31st in March. ## Credits are shared across your brands This surprises people, so it's worth being clear: credits belong to **you as the account owner**, not to each brand separately. If you own more than one brand, they all draw from the same balance. Generating 50 posts in one brand leaves 50 fewer credits for every other brand you own. The number in the sidebar is your total remaining across all of them. Brands owned by someone else — for example a client's brand you were invited into — use that owner's credits, not yours. ## When you run out Once your balance reaches zero, AI actions stop and Ocoya shows: > You've exceeded the credit limit. Upgrade to get more. Everything that doesn't use AI keeps working normally. Your scheduled posts still publish, your automations still trigger their non-AI steps, and you can still create and schedule posts by hand. You have two ways forward: 1. **Wait for the reset.** Your allowance refills on your monthly reset day. 2. **Upgrade your plan.** A higher plan gives a larger allowance, available immediately. Go to **Settings → Billing** and choose a plan. ### Making credits go further * Switch image generation off when you only need a caption. That halves the cost of each post. * Generate a campaign once and edit the posts by hand, rather than regenerating the whole campaign. * Check the number of images selected before generating — each one costs a credit, whether or not you end up using it. * Turn off automations you aren't relying on. Every run costs a credit, including runs that produce a post you don't publish. ## Related Balance looks wrong, or credits disappeared faster than expected? Message the Ocoya team from inside the app. # Delete your account and data Source: https://docs.ocoya.com/help/delete-your-account How account deletion works, and how it differs from cancelling or deleting a brand. Three different things get confused here, and they have very different effects. | | What it does | | ---------------------------- | --------------------------------------------------------------------- | | **Cancel your subscription** | Stops future payments. The account and its content stay | | **Delete a brand** | Removes one brand and its content. Your account and other brands stay | | **Delete your account** | Removes your Ocoya account entirely | ## Deleting your account There's no self-service button for this. Account deletion is handled as a request — [contact support](https://app.ocoya.com/?modal=support) and ask for your account and its data to be deleted. It's worth saying explicitly what you want removed, because "delete my account" can mean different things depending on how many brands you own and who else is in them. ### Before you ask **Disconnect your channels, and revoke Ocoya at each network.** Removing your Ocoya account is not the same as withdrawing the access you granted on Facebook or LinkedIn. Do that on each network yourself — see [Disconnect a channel](/help/disconnect-a-channel) for where. **Export anything you want to keep.** There's no bulk export, so captions or media you want are worth saving before the account goes. **Think about brands other people use.** If you own a brand your colleagues or clients work in, deleting your account affects them. Transferring ownership or having someone else take over the brand may be what you actually want. **Cancel the subscription first** if you have one, so billing stops regardless of how long the deletion request takes. See [Cancel your subscription](/help/cancel-your-subscription). ## Cancelling is not deleting Cancelling ends the subscription and leaves everything in place. Access continues to the end of the paid period, then the brand drops to free-plan limits — 1 brand, 1 user, no connected channels and no credits. Your posts, brands and media aren't deleted, which is what you want if you might come back. If you want the data gone, cancelling doesn't do it — ask for deletion. ## Deleting a brand is not deleting your account Deleting a brand removes that brand from Ocoya. Your account, your other brands and your subscription are unaffected, and you can't delete your last one: > You need at least one brand. Create or join another brand before deleting this one. See [Create, switch and delete brands](/help/manage-brands). ## Leaving someone else's brand If you just want out of a brand that isn't yours, you don't need to delete anything. Open **Settings → Team**, find yourself and select **Leave**. Your account and your own brands are untouched. ## Related Stopping payments without losing the account. Revoking Ocoya's access at each network. # Disconnect a channel Source: https://docs.ocoya.com/help/disconnect-a-channel Removing a channel from a brand, what happens to its posts, and how to revoke Ocoya's access properly. Disconnecting removes a channel from the brand and stops Ocoya using it. It's the right move when an account is no longer yours to post to, or when you're freeing up a slot against your plan's channel limit. ## Disconnect Open **Channels**, select the **⋯** menu on the channel, and choose **Disconnect**. Ocoya confirms first: > Disconnect *\[channel name]*? You can reconnect it later. ## What stops * **Publishing.** Scheduled posts to that channel will not go out. * **Inbox.** For Facebook and Instagram, its conversations stop arriving. * **Workflows.** Any workflow whose trigger or action used that channel stops working. Disconnecting does not warn you about scheduled posts queued for that channel. They simply won't publish. Check Planner for anything pending before you disconnect. ## What stays **Your posting history stays.** Posts already published, and the record of what went out and when, remain in the brand. Disconnecting is not a way to clear history. **Posts on the network stay.** Anything Ocoya already published is a normal post on your account and is unaffected. To remove it, delete it on the network. **The channel doesn't count against your limit any more**, so a disconnected channel frees a slot. ## Reconnecting later Reconnecting the same account attaches it back to the brand rather than creating a duplicate. See [Reconnect a channel](/help/reconnect-a-channel), which is also what to do when a channel has simply expired rather than being deliberately removed. If you're disconnecting because posts are failing, reconnecting is usually what you actually want — see [Why didn't my post publish?](/help/post-didnt-publish) ## Revoking access properly This is the part people miss. Disconnecting in Ocoya removes the channel from your brand. To be certain Ocoya can no longer reach the account at all, also remove Ocoya from the network's own connected-apps settings: | Network | Where | | -------------------------------- | -------------------------------------------------------------- | | Facebook, Instagram | Facebook **Settings → Business integrations** | | X (Twitter) | **Settings → Security and account access → Apps and sessions** | | LinkedIn | **Settings → Data privacy → Permitted services** | | TikTok | **Settings → Security → Manage app permissions** | | Google, YouTube, Google Business | Google Account **Security → Third-party apps** | | Pinterest, Threads | Account settings → apps or connected accounts | Doing it there is what actually invalidates the access the network issued. It's worth doing whenever an account is leaving your control — a client relationship ending, or someone leaving the team. Bluesky is different: it's connected with an app password rather than an approval. Revoke it by deleting that app password in your Bluesky settings. ## Related What a connection holds in the first place. When access lapsed rather than you removing it. # Edit, duplicate or delete a post Source: https://docs.ocoya.com/help/edit-a-post Changing a scheduled post, reusing one you've already written, and removing one safely. Find the post in [Planner](/help/planner-views) and open it. Everything below happens in the post editor. ## Edit a scheduled post Change the caption, the media, the channels or the time, then save. As long as the post hasn't published yet, edits apply to what goes out. A post that has already published can't be edited from Ocoya — what's on the network is a normal post on your account now. Edit or delete it there. ## Reschedule Change the date and time on the post. The new time still has to be **at least two minutes ahead**. To move a post in the Calendar view, drag it to a different day. That's usually quicker than opening it when you're spacing a week out. ## Duplicate a post **Duplicate post** in the editor makes a copy you can change and schedule separately. The original is untouched. This is the practical way to: * Repost something that did well, with a fresh angle * Build a series from one post that's already on-brand * Keep a caption you like as a starting point A duplicate is an ordinary new post — it has no link back to the original, so editing one never affects the other. ## Delete a post **Delete post** removes it. Ocoya confirms: > Do you really want to delete this post? Any schedules will immediately stop running. Deleting a post in Ocoya does **not** remove anything already published to a network. If the post has gone out, delete it on the network too. Delete is the right move for a draft you don't want or a scheduled post you've changed your mind about. For a post that partly published, don't delete it — see below. ## A post that published to some channels but not others Its status is **Needs attention**. Don't reschedule or delete the whole post: rescheduling would publish it a second time on the channels that already worked. Remove the channels that succeeded, then reschedule the rest. See [Why didn't my post publish?](/help/post-didnt-publish) ## Related Finding the post you want to change. What each status means and what it allows. # Create and schedule your first post Source: https://docs.ocoya.com/help/first-post Write a post, choose channels, and schedule it — by hand or with AI. Before you start, make sure you have [connected at least one channel](/help/connect-a-channel) and [set your time zone](/help/time-zones) — posts publish in the brand's time zone, which starts as UTC. There are two ways to create a post: write it yourself, or describe it and let Ocoya draft it. ## Write it yourself Select **Planner** in the left sidebar, then **New post**. Select which connected channels the post should go to. You can write one caption for all of them, or a different caption per channel — useful when one network has a much shorter limit than another. Ocoya counts characters against each selected channel and warns you before you hit a limit. See [Character and media limits](/help/channel-limits). Choose when it should publish. The time must be **at least two minutes from now** — anything closer is refused. Save the post. It appears on your calendar on that date. ## Let Ocoya draft it Select **New AI post** from Planner and describe what you want. Ocoya AI post composer with a prompt field reading Describe the post you want Ocoya to create, plus Hashtags, Images, Professional and Medium options and suggestion chips The toolbar under the prompt controls what you get: * **Hashtags** — add generated hashtags * **Images** — generate images to go with the caption * **Professional** — the tone of voice * **Medium** — the length The badge on the right shows what the action will cost in credits before you run it. See [What are credits?](/help/credits) Ocoya drafts the post and opens it in the editor, where you edit it exactly like one you wrote yourself. AI output quality depends heavily on your brand profile. If captions feel generic, fill in your brand description — see [Set up your brand](/help/set-up-your-brand). ## See what's scheduled Planner has three views of the same posts, switchable at the top: * **List** — everything in order, with filters for channel, date and status * **Board** — posts grouped by status * **Calendar** — a month grid Ocoya Planner in Calendar view with a month grid, a Draft panel on the left, an All profiles filter and a Share button ## Publish now instead To publish immediately rather than schedule, use **Publish now** in the post editor. This skips the two-minute minimum. ## Drafts Saving a post without a date keeps it as a draft. Drafts never publish — they wait in Planner until you give them a date. Drafts appear in the panel on the left of the Calendar view. ## Related Making sure posts go out at the hour you meant. What to check when a scheduled post doesn't appear. # Your free trial Source: https://docs.ocoya.com/help/free-trial What the 7-day trial includes, what happens when it ends, and how to stop before it does. New subscriptions start with a **7-day free trial**. When you're eligible, the plan card reads *Start 7-day free trial* rather than Subscribe. ## What you get Everything on the plan you picked — all its features, its channel and member limits, and its monthly credits. The trial isn't a reduced version. **Nothing is charged when you start.** Ocoya says so on the checkout summary: *No charge today when starting your trial*. You do enter card details, because the trial converts to a paid subscription rather than expiring into nothing. ## When it ends At the end of the seven days the subscription becomes a normal paid one and your card is charged for the plan you chose. Nothing else changes — your brands, channels, posts and schedule carry on. ## Stopping before it ends Cancel before the seventh day and you're not charged. Cancelling goes through the same route as any subscription: **Settings → Billing → Unsubscribe**. See [Cancel your subscription](/help/cancel-your-subscription). Cancelling during a trial ends the trial. Your account drops to free-plan limits — 1 brand, 1 user, no connected channels and no credits — rather than continuing to the seventh day. If you're unsure, the thing to check is the renewal date on **Settings → Billing**. That's the date you'll be charged, and it's the deadline for cancelling free of charge. ## Making the week count Seven days is enough to answer the question that matters: does the AI sound like you? That depends almost entirely on the brand profile, so fill it in properly on day one rather than day six. See [Set up your brand](/help/set-up-your-brand). Connect the channels you actually use, schedule a week of real posts, and let some of them publish. A trial spent generating drafts you never publish doesn't tell you much. ## Related What each plan includes. Stopping before the trial converts. # Generate images with AI Source: https://docs.ocoya.com/help/generate-images Add generated images to a post, ask for a carousel, and steer the result with reference images. When Ocoya drafts a post it can generate the images to go with it. Image generation is off unless you switch it on, so a caption-only draft never costs more than one credit. ## Switch it on In the AI post composer, the **Images** button in the toolbar toggles image generation and sets how many you want. **Images per post** goes from 1 to 10. The cost badge on the right of the toolbar updates as you change it. One credit for the caption, plus one per image: | Asking for | Credits | | ------------------- | ------- | | Caption only | 1 | | Caption + 1 image | 2 | | Caption + 5 images | 6 | | Caption + 10 images | 11 | You're charged for what you generate, not for what you keep — so set the count before you run it rather than generating ten and using two. See [What are credits?](/help/credits) ## Asking for more than one More than one image isn't the same prompt run repeatedly. Ocoya first plans a **carousel** — a sequence where each image is a slide with its own job — then generates against that plan. That means a set of five reads as five parts of one idea rather than five variations of the same picture. It also means the order matters: the images come back in the sequence the plan set, and that's the order they'll appear in the post. If you want genuinely unrelated images, generate them as separate posts. ## Steering the result Three things shape what comes back, in roughly this order of influence: **Your brand profile.** Logos, colours and the brand description are read on every generation. A brand with no visual identity filled in gets generic stock-looking output. This is the highest-leverage thing to fix. See [Set up your brand](/help/set-up-your-brand). **Your prompt.** Describe the subject, not the style — the style comes from your brand. **Reference images.** Attach up to **3 images per run** with **Attach image**, or drop files onto the composer. Ocoya uses them as visual reference for what you're asking for. Useful for a product shot you want the generated images to match. ## When the images aren't right Regenerating costs the same again, so it's worth changing something first rather than rolling the dice: * If the look is wrong across every image, fix the brand's visual identity. * If the subject is wrong, the prompt needs to be more specific. * If one image in a carousel is wrong but the others are fine, replace just that one by uploading your own — you don't have to regenerate the set. You can always delete a generated image and upload your own instead. Nothing about a post requires the images to have come from Ocoya. ## Related Where the AI composer sits, and what else it does. How many images each network accepts, and how large. # Hashtag libraries Source: https://docs.ocoya.com/help/hashtag-libraries Save reusable sets of hashtags in the post editor, and keep the AI from inventing its own. A hashtag library is a named set of hashtags you can reuse. They exist for two reasons: so you don't retype the same twenty tags, and so Ocoya's AI uses *your* hashtags rather than making some up. You create and manage them from the post editor — there's no separate page to visit. ## Create one In the post editor, open **Manage hashtags**. That lists your existing libraries and lets you add one without leaving the post you're writing. From the hashtag panel, choose to create one. Between 2 and 30 characters. Name it after when you'd use it — *Product launches*, *Recruiting* — rather than after its contents. Type them in, separating with a space, a comma or a `#`. Press Enter to add one. You don't need to type the `#` — Ocoya adds it. Duplicates are dropped automatically, so pasting an overlapping list from somewhere else is safe. A library needs a name and at least one hashtag before it will save. Libraries belong to the brand, so each brand keeps its own. Editing one changes it everywhere it's used from that point on; posts already published are untouched. ## Why it matters for AI posts This is the part worth knowing. When you pick a library while generating a post, Ocoya is instructed to use **only** hashtags from that library — it won't invent new ones, rewrite them, translate them, or change them between singular and plural. `#RunningShoe` stays `#RunningShoe` and doesn't quietly become `#RunningShoes`. That matters because a hashtag that's one character off is a hashtag nobody follows. With no library selected, the AI adds no hashtags at all unless your prompt explicitly asks for them. Generating hashtags costs 1 credit, the same as any other AI action. See [What are credits?](/help/credits) ## Choosing what goes in one A library works best when every tag in it is appropriate for every post you'd use it on, because the AI picks from the whole set. A library mixing product tags with recruiting tags gives the AI room to pick the wrong ones. Several small, specific libraries beat one large general one. ## Related The other reusable asset — for organising posts, not tagging them publicly. Where hashtags, labels and notes all live. # Inbox Source: https://docs.ocoya.com/help/inbox Reply to DMs, mentions and comments from Ocoya — and which networks are supported. Inbox brings the conversations happening on your social channels into Ocoya, so you can reply without opening each network separately. ## Supported networks Inbox supports **Facebook and Instagram only**. Other networks are not yet available, even though you can publish to them from Ocoya. This catches people out: you can schedule to twelve networks, but only two feed the Inbox. Connecting X or LinkedIn will not make their messages appear. Ocoya says so in the profile list too. Ocoya Inbox showing DMs, Mentions and Comments tabs, Open, Resolved and Assigned to me filters, a list of five Facebook and Instagram profiles each with a Reconnect to use button, and a panel reading Facebook and Instagram only ## What's in the Inbox Inbox has three tabs: | Tab | What it shows | | ------------ | --------------------------------------------------------------- | | **DMs** | Direct messages sent to your Facebook Page or Instagram account | | **Mentions** | Posts and stories where someone mentioned you | | **Comments** | Comments left on your posts | Each can be filtered by **Open**, **Resolved** and **Assigned to me**, so a shared inbox doesn't turn into two people answering the same message. ## Working through conversations Select a conversation to open it, then reply directly. When you're finished with a thread, mark it **Resolved** so it leaves the Open list. Anyone else in the brand sees the same state. Use **Assigned to me** when several people work the same inbox — assign a thread to yourself so colleagues know it's handled. ## Turning a channel on or off Each connected Facebook and Instagram profile has a toggle in the profile list on the left of the Inbox. Switch a profile off to stop its conversations appearing, without disconnecting the channel or affecting publishing. ## Letting Ocoya draft a reply In a DM thread, Ocoya can suggest a reply for you. It reads the **last four messages** in the conversation and drafts a response in your brand's voice, which lands in the reply box for you to edit before sending — nothing is sent automatically. It costs 1 credit per suggestion. See [What are credits?](/help/credits) A very short thread gives it nothing to work from, and Ocoya says so rather than guessing: > The conversation is too short to suggest a reply ## Automating replies Inbox conversations can trigger automations — auto-replying to DMs, responding to mentions, or sending a DM when someone comments. Those are set up under **Workflows**, and each run costs a credit. ## Common questions **"Why can't I see my X messages?"** Inbox is Facebook and Instagram only. **"A colleague replied and I didn't know."** Use **Assigned to me** and mark threads Resolved. **"My messages stopped appearing."** The channel may need reconnecting — Inbox uses the same access as publishing. See [Reconnect a channel](/help/reconnect-a-channel). **"Older conversations are missing."** Networks limit how far back an app can read. Very old threads may not be retrievable. ## Related When messages stop arriving. Automated replies cost a credit per run. # Ocoya help center Source: https://docs.ocoya.com/help/index Guides for connecting channels, creating and scheduling posts, and running your brand in Ocoya. Find an answer below, or ask the assistant in the corner of the page. If you'd rather talk to someone, [contact support](https://app.ocoya.com/?modal=support) from inside the app. ## Popular guides Add Facebook, Instagram, X, LinkedIn, TikTok and more to a brand. What to check when a scheduled post didn't go out. What uses credits, how many you get, and when they reset. Sign in with a magic link, a password, or your Google account. ## Browse by topic Logging in, setting up a brand, and publishing your first post. Connecting, reconnecting and managing your social accounts. The AI Copywriter, campaigns, agents, and how credits are spent. Fixes for posts that failed, channels that disconnect, and login problems. ## Building something with Ocoya? Reference for the REST API, the Ocoya MCP server, and the tools it exposes. # Invite people to a brand Source: https://docs.ocoya.com/help/invite-people Add teammates or a client to a brand, resend or cancel an invitation, and remove someone. People are invited to a **brand**, not to your account. Someone invited to one brand sees only that brand. Open **Settings → Team**. Ocoya Team settings showing a Brand members card with one member listed as Owner and an Invite button in the top right ## Send an invitation Select **Invite**, enter their email address and choose the role they should have. Ocoya emails them an invitation. Choosing the role matters more than it looks — it decides what they can change, and **Client** is the deliberately narrow one for the person whose accounts these are. See [Roles and permissions](/help/roles-and-permissions). If they already have an Ocoya account, they're added straight away. If not, the invitation walks them through creating one. ## Pending invitations Someone invited but not yet joined shows in the list as **Invite sent**, with two actions: * **Resend invite** — if the first email didn't arrive or was lost * **Cancel invite** — withdraws it. Ocoya confirms first A pending invitation counts against your member limit, so cancel ones that aren't going anywhere. ## When you hit the limit > Your current plan has reached its member limit. Upgrade to invite more people. Members are counted across **all your brands**, not per brand. Starter includes 1, Team 5 and Agency 20. See [Plans and limits](/help/plans-and-limits). Removing someone frees their seat immediately. ## Change someone's role Change it in the same list. It takes effect at once — they don't need to sign out. Only Owners and Admins can change roles. ## Remove someone Select the remove action on their row. Ocoya confirms: > Do you really want to remove this member from this brand? Removal is immediate. Content they created stays — posts belong to the brand, not to the person who made them. If they're in your other brands, those are unaffected. To remove **yourself**, use the same control on your own row; it reads **Leave** instead. See [Create, switch and delete brands](/help/manage-brands). ## Related What each role can do before you pick one. How many people your plan includes. # Labels Source: https://docs.ocoya.com/help/labels Colour-coded tags for organising posts inside Ocoya — private to your team, never published. Labels are how you categorise posts inside Ocoya so you can find them again. They're internal — a label never appears on a published post and nobody outside your brand sees one. Don't confuse them with [hashtag libraries](/help/hashtag-libraries), which do get published. Labels are applied and managed from the post editor. ## Label a post Open the post and use its **Labels** control. The panel opens on a list of the brand's existing labels — pick the ones that apply. ## Create or edit a label From the same panel, switch to managing labels. There you can add a **New label**, **Edit** an existing one or **Delete** one. A label needs: * **A name** — between 2 and 30 characters * **A colour** — chosen from the colour list The colour is what makes a label readable at a glance in Planner, so give related labels distinct colours rather than five shades of blue. ## What to label Labels earn their keep when the name answers a question you actually ask later. Some that work: * **Campaign** — *Spring launch*, *Black Friday* — so you can pull up everything from one push * **Content type** — *Product*, *Behind the scenes*, *Recruiting* * **Client or account**, if you run several inside one brand * **Status of your own** — *Needs photo*, *Legal reviewed* — for stages Ocoya's own [post statuses](/help/post-editor) don't cover What doesn't work is labelling things Ocoya already tracks. There's no value in a *Scheduled* label or an *Instagram* label — you can already filter on both. ## Deleting a label Deleting a label **removes it from every post that has it**. Ocoya asks you to confirm first. The posts themselves are unaffected — only the label is gone, and it cannot be put back except by relabelling each post by hand. If you only want to stop using a label going forward, leaving it in place costs nothing. ## Labels are per brand Each brand keeps its own labels. Running the same scheme across several brands means creating it in each — there's no way to copy a set between them. If you're an agency, it's worth agreeing the scheme before you set up the second brand, because renaming labels across ten brands later is tedious. ## Related The tags that do get published. Where labels, hashtags and notes live. # Legacy plans Source: https://docs.ocoya.com/help/legacy-plans Bronze, Silver, Gold and Diamond — what they include, and what changes if you move. If you subscribed to Ocoya before the current plans existed, you're on a **legacy** plan. It keeps working. Nothing is being switched off, and there's no deadline. Your plan shows its name with a **Legacy** badge in Billing. ## The legacy plans | | Bronze | Silver | Gold | Diamond | | ----------------- | ------ | ------ | ----- | --------- | | Monthly | \$19 | \$49 | \$99 | \$199 | | Yearly | \$180 | \$468 | \$948 | \$1,908 | | Users | 1 | 5 | 20 | 50 | | Social profiles | 5 | 20 | 50 | 150 | | Credits per month | 100 | 500 | 1,500 | Unlimited | | Brands | 1 | 5 | 20 | Unlimited | ## What moving to a current plan changes The clearest difference is **brands: unlimited on every current plan**, where legacy plans cap them. Credits are also more generous, and new features ship to the current plans. | Moving from | Closest current plan | What you gain | What to check | | --------------- | -------------------- | ---------------------------------------------- | ---------------------------------------------------------------------- | | Bronze (\$19) | Starter (\$29) | Unlimited brands, 300 credits instead of 100 | Costs more per month | | Silver (\$49) | Team (\$79) | Unlimited brands, 1,500 credits instead of 500 | Costs more per month | | Gold (\$99) | Team (\$79) | Cheaper, unlimited brands, same 20 users | Social profiles drop from 50 to 20 | | Diamond (\$199) | Agency (\$199) | Same price, unlimited brands, 5,000 credits | Users drop from 50 to 20; credits become metered rather than unlimited | Check the limits you actually use before switching — profile counts and users are where a move can bite. ## Why the button says "Switch", not "Upgrade" Prices across plan generations aren't comparable. Legacy Gold at \$99 is more expensive than Team at \$79 but has fewer credits and capped brands, so calling either direction an upgrade would be misleading. Ocoya labels every move off a legacy plan as a switch and leaves the judgement to you. ## Moving back You can't. Legacy plans are closed to new subscriptions, so switching to a current plan is one-way. That's the one thing worth being sure about before you do it. ## Related What the current plans include. How to make the switch. # Log in to Ocoya Source: https://docs.ocoya.com/help/log-in-to-ocoya Sign in to Ocoya with a magic link, an email and password, or your Google account. There are three ways to log in to Ocoya: a magic link sent to your email, an email and password, or your Google account. All three take you to the same brand, so you can switch between them at any time. Go to [app.ocoya.com](https://app.ocoya.com/) to start. Ocoya login card showing the Magic link tab selected, an email field, a Send magic link button, and a Continue with Google button ## Log in with a magic link A magic link is a one-time sign-in link emailed to you, so you do not need to remember a password. This is the option Ocoya selects by default. On the login screen, make sure the **Magic link** tab is selected. It is selected by default when the page loads. Type the email address associated with your Ocoya account into the **[name@company.com](mailto:name@company.com)** field. Select the black **Send magic link** button. Ocoya emails you a sign-in link. Open the email from Ocoya and select the sign-in link. You are taken straight into your brand. Magic links expire 10 minutes after they are sent. If yours has expired, return to the login screen and select **Send magic link** again to get a new one. ### If the magic link email does not arrive If you selected **Send magic link** but no email arrived, work through these checks in order: 1. Wait 2 minutes. Delivery is usually immediate but can be delayed. 2. Check your spam and junk folders for an email from Ocoya. 3. Confirm you typed the same email address you used to create your Ocoya account. A magic link is only sent to an address that already has an account. 4. If your company filters inbound email, ask your IT team to allow email from `ocoya.com`. If none of that works, log in with your password or your Google account instead, or [contact support](https://app.ocoya.com/?modal=support). ## Log in with an email and password Use this option if you set a password when you created your account. On the login screen, select the **Password** tab. The form changes to show both an email field and a password field. Ocoya login card with the Password tab selected, showing an email field, a masked password field with a show-password eye icon, and a Sign in button Type your email address and password. To check what you typed, select the eye icon at the right of the password field to show the password. Select the black **Sign in** button to open your brand. ## Log in with Google If you signed up using Google, or you want to skip passwords entirely, select **Continue with Google** at the bottom of the login screen and choose your Google account. Use the same Google account you signed up with. Signing in with a different Google address creates a separate Ocoya account rather than opening your existing brand. ## Create an account If you do not have an Ocoya account yet, select **Sign up** next to "Don't have an account?" at the top of the login card. ## Related Still cannot get in? Message the Ocoya team from inside the app. # Long posts and threads Source: https://docs.ocoya.com/help/long-posts-and-threads How Ocoya splits a long caption into a thread on X, Threads, Bluesky and Mastodon. Some networks hold only a short post. Rather than refusing a longer caption, Ocoya splits it into a **thread** — a chain of replies that reads as one piece of writing. This happens automatically on X, Threads, Bluesky and Mastodon. ## When a post becomes a thread | Network | Fits in one post | Becomes a thread above | | ----------- | ---------------- | ---------------------- | | X (Twitter) | 280 characters | 280 | | Threads | 500 characters | 500 | | Bluesky | 300 characters | 300 | | Mastodon | 500 characters | 500 | Ocoya warns you while you're writing, before you schedule anything: > Twitter caption exceeds 280 characters and will be split into a thread That's a warning, not an error — the post will publish. ## The hard limit Threading is not unlimited. Above **5,000 characters** the post is refused outright and you'll need to shorten it. So on X there are three ranges: * **Up to 280** — one post * **280 to 5,000** — a thread * **Above 5,000** — refused ## Keeping it to one post If you want a single post rather than a thread, shorten the caption until the warning disappears. Ocoya counts characters as you type. Because you can write a different caption per channel, the usual approach is a short version for X and a longer one for Facebook or LinkedIn, in the same post. ## Networks that don't thread Every other network either accepts the full caption or refuses it. Facebook takes 5,000 characters in one post, LinkedIn 3,000, Instagram 2,200 — exceed those and the post is refused rather than split. See [Character and media limits](/help/channel-limits). ## Related Every network's limits in one table. Connecting X, and its duplicate-content rule. # Manage a channel Source: https://docs.ocoya.com/help/manage-a-channel Open a connected channel to check its details, control what it's used for, and set its posting times. Every connected channel has its own settings page. Open **Channels**, select the **⋯** menu on a channel, and choose **Manage**. There are three sections. ## Details Who the channel is — the connected profile's name and picture as the network reports them, and when it was connected. This is also where the channel's identifier lives, which you need if you're working with the [Ocoya API](/help/api-tokens). The **⋯** menu on the Channels page has **Copy API profile id** as a shortcut. ## Capabilities What this channel is allowed to be used for. Ocoya describes each capability in plain terms: * **Publish and schedule social content** — whether posts can go to it * **Use this channel in planner workflows** — whether [workflows](/help/what-are-workflows) can act on it * **Track connected profile activity** Turning a capability off is the gentler alternative to disconnecting. The channel stays connected and keeps its history, but stops being offered for that purpose — useful when an account is dormant and you'd rather it wasn't picked by accident. For ecommerce connections the capabilities are different: **Generate content from product and order data**, **Trigger workflows from commerce activity** and **Use store events in automations**. ## Posting slots The weekly times this channel should suggest when you schedule. See [Posting slots](/help/posting-slots). ## Related Setting the times a channel suggests. When turning a capability off isn't enough. # Create, switch and delete brands Source: https://docs.ocoya.com/help/manage-brands Adding a brand, moving between them, leaving one, and permanently deleting one. Everything in Ocoya belongs to a brand — channels, posts, members, settings. This is how you add, switch, leave and remove them. For what a brand actually holds, see [Brands and channels](/help/brands-and-channels). ## Switch between brands Select the brand name at the top of the left sidebar. Ocoya brand switcher menu headed Switch brand, listing three brands with the current one greyed out, and a New brand option at the bottom The brand you're already in is greyed out. Everything you see afterwards — Planner, Channels, Inbox, Workflows — belongs to whichever brand is selected. This is worth internalising, because most "where did my channel go?" questions turn out to be a brand you're not currently in. ## Create a brand **New brand** at the bottom of the same menu. It needs a name, and that's all — you can fill in the rest of the profile afterwards. A new brand starts empty: no channels, no posts, no members but you. It joins your existing subscription, so there's no second checkout. If your plan caps brands, you'll see: > Your current plan has reached its brand limit. Every current plan — Starter, Team and Agency — allows unlimited brands. Only the legacy plans cap them, at 1 for Bronze, 5 for Silver and 20 for Gold. See [Legacy plans](/help/legacy-plans). ## Leave a brand If you're a member of someone else's brand and no longer need access, open **Settings → Team**, find yourself in the list and select **Leave**. Leaving removes your access immediately. Content you created stays — posts belong to the brand, not to you. You'd need a fresh invitation to get back in. ## Delete a brand Deleting a brand removes **all of its posts and all of its members**. It cannot be undone. Ocoya confirms first: *Do you really want to delete this brand? All users and posts within the brand will be removed.* Open **Brand** in the sidebar, scroll to **Danger zone**, and select **Delete brand**. Only **Owners and Admins** can reach the Brand page at all — Managers and Clients are redirected away from it, so they can't delete a brand by accident. You also can't delete your way to nothing. Ocoya refuses to remove your last brand: > You need at least one brand. Create or join another brand before deleting this one. If you own the brand, you must keep owning at least one — so create or join another before deleting the one you own. Before deleting, consider whether you actually want to: * **Stepping away from a client?** Deleting destroys the history. Leaving the brand, or removing the other members, keeps it. * **Reducing cost?** Brands don't cost anything individually on current plans, so deleting one saves nothing — [changing plan](/help/change-your-plan) does. * **Need the content?** Export or reschedule anything you want to keep first. It goes with the brand. The Danger zone also shows the brand's **API brand id** — the identifier you need when working with the [Ocoya API](https://docs.ocoya.com) or the MCP server. ## Related What belongs to a brand, and what's shared across them. Who can create, delete and invite. # Move a channel to another brand Source: https://docs.ocoya.com/help/move-a-channel Connect the same social account to a different brand, and what happens to the old one. A social account lives in one brand at a time. If you connected it to the wrong brand, or a client's account needs to move, you move it by connecting it again from the brand it should be in. ## Move it Use the brand switcher at the top of the sidebar. See [Create, switch and delete brands](/help/manage-brands). **Channels → Connect channel**, pick the network, and authorise the same account. See [Connect a social channel](/help/connect-a-channel). Ocoya notices the account already belongs elsewhere and asks you to confirm rather than moving it silently: > This profile belongs to another brand. Confirm that you want to switch it to this brand. Confirm and the channel becomes part of the new brand. ## What moves and what doesn't The channel moves. **Its posting history stays behind** in the old brand. That's deliberate — the old brand keeps its record of what was published while the account belonged to it, so past reporting stays intact. But it does mean the new brand starts with an empty history for that channel. Also left behind in the old brand: * **Scheduled posts** queued for that channel. They will no longer publish, because the channel is gone from that brand — check for pending posts before moving. * **Workflows** that used the channel. They'll need rebuilding in the new brand. ## If you don't get the confirmation If the connection completes without asking, the account wasn't attached to another active brand — it may have been in a brand that's since been deleted, which Ocoya repairs quietly. ## Moving isn't sharing A social account can only be in one brand at a time. If two brands both need to post to it, moving won't help — you'd be moving it back and forth. That's a sign the two brands should be one. The exception is your **channel limit**: the same account connected in one brand counts once, so moving it doesn't change how many slots you're using. See [Brands and channels](/help/brands-and-channels). ## Related The connection flow itself. Why channels belong to a brand rather than to you. # Payment and invoices Source: https://docs.ocoya.com/help/payment-and-invoices Update your card, and download invoices and receipts. Payment details and invoices live in Stripe, reached from Ocoya in one click. Ocoya never stores your card. ## Open your billing details Select **Billing** in the sidebar. The button sits on your current plan, next to **Manage subscription**. It opens Stripe's billing portal. ## Update your card In the portal, under payment methods, add the new card and make it default. Remove the old one afterwards if you don't want it kept. Do this before your renewal date rather than after a failed payment — a failed charge can suspend the subscription until it's settled. ## Download invoices and receipts The portal lists every invoice with its date, amount and number, each with a download link. Invoices are PDFs and include whatever billing details and tax ID were on file **at the time of the charge** — which is why adding a tax ID only affects future invoices. See [VAT and tax IDs](/help/tax-ids). ## Update billing details Company name, address and email are all editable in the portal, under billing information. These appear on future invoices. ## Common problems **"I can't see the Billing option."** Only Owners and Admins can manage billing. See [Roles and permissions](/help/roles-and-permissions). **"My payment failed."** Update the card in the portal, then retry the outstanding invoice from the same page. Stripe also retries automatically for a few days. **"An old invoice has the wrong company details."** Invoices are fixed once issued. Contact support if you need one reissued. ## Related Adding a VAT or GST number to your invoices. Upgrading, downgrading and switching. # Planner views Source: https://docs.ocoya.com/help/planner-views List, Board and Calendar are three ways to look at the same posts — and each is better at a different job. Planner holds every post in the brand. The three tabs at the top — **List**, **Board** and **Calendar** — are three views of the same posts, not three places posts can live. Switching views never moves anything. The filters sit above all three: a search box, an **All profiles** channel filter, a sort order, and a date range. ## List Ocoya Planner in List view showing three posts in a table with their channels and captions, plus Search, All profiles, All time, Newest and All statuses filters A flat table, newest first by default, with a status filter the other views don't have. Use it when you're looking for a specific post and know something about it — roughly when it went out, which channel, whether it failed. It's the only view that pages through large numbers of posts comfortably. ## Board Ocoya Planner in Board view with Draft, Scheduled, Pending approval, Posted and Error columns, each showing a post count, and empty columns offering a Create post button The same posts grouped into columns by status: **Draft**, **Scheduled**, **Pending approval**, **Posted** and **Error**. Each column shows how many posts are in it, and an empty column offers a **Create post** button. Use it when you care about state rather than timing — what's still a draft, what's waiting on an approver, what failed. The Error column is the fastest way to spot a problem you didn't get an alert about. Note the board has five columns while a post can carry [seven statuses](/help/post-editor). Generating and Needs attention are short-lived, so they don't get columns of their own. ## Calendar Ocoya Planner in Calendar view showing a month grid with a scheduled post, a Draft panel listing two drafts on the left, and Share, All profiles and Newest controls above A month grid. Drafts sit in a panel on the left rather than on the grid, because they have no date — drag one onto a day to schedule it. Use it when you care about spacing: whether you've got four posts on Tuesday and nothing all week, or whether a campaign is landing evenly. Calendar is also where the **Share** button lives, for giving someone a read-only view. See [Share your calendar](/help/share-your-calendar). ## Which to use | You want to… | Use | | ------------------------------------ | -------- | | Find one specific post | List | | See what's stuck, waiting or failed | Board | | See how posts are spread across days | Calendar | | Reschedule by dragging | Calendar | | Filter by status | List | ## Planner settings The gear icon at the right of the view tabs opens **Planner settings** — time zone, week start, and Publish like a human. Those apply to the brand, not to the view you happen to be in. See [Time zones and scheduling](/help/time-zones). ## Related What each status means. A read-only link for a client. # Plans and limits Source: https://docs.ocoya.com/help/plans-and-limits What Starter, Team and Agency include, and what each limit counts. Ocoya has three plans. All of them include **unlimited brands** — the limits that differ are users, social profiles and monthly AI credits. ## The plans | | Starter | Team | Agency | | ----------------- | --------- | --------- | --------- | | Monthly | \$29 | \$79 | \$199 | | Yearly | \$290 | \$790 | \$1,990 | | Users | 1 | 5 | 20 | | Social profiles | 5 | 20 | 100 | | Credits per month | 300 | 1,500 | 5,000 | | Brands | Unlimited | Unlimited | Unlimited | Yearly billing costs ten months rather than twelve — the **Yearly (2 months free)** toggle above the plan cards switches between them. Ocoya Billing settings showing the current plan, a monthly and yearly toggle, and the Starter, Team and Agency plan cards with users, social profiles and credits for each ## What each limit counts **Users** — people with access to a brand, including you. Inviting past your limit is blocked with an upgrade prompt. See [Roles and permissions](/help/roles-and-permissions). **Social profiles** — each connected channel counts as one, so a Facebook Page and an Instagram account are two even though they connect together. Connecting past the limit is refused. See [Connect a channel](/help/connect-a-channel). **Credits** — spent on AI generation and refilled monthly. See [Credits](/help/credits). **Brands** — unlimited on every current plan, so a new client or business line never costs more. ## Free trial New subscriptions start with a **7-day free trial**. The plan card reads *Start 7-day free trial* rather than *Subscribe* when you're eligible. ## Where to find it Select **Billing** in the sidebar. Only Owners and Admins see it — Managers and Clients don't. See [Roles and permissions](/help/roles-and-permissions). ## Related Upgrading, downgrading and switching. Bronze, Silver, Gold and Diamond, and what happens if you stay. # Post approvals Source: https://docs.ocoya.com/help/post-approvals Send a post to someone for sign-off before it publishes, and what happens when they approve or reject it. Approvals put a post in front of someone before it goes out. The post holds at **Pending approval** until an approver acts on it — it will not publish in the meantime, even if its scheduled time passes. This is the mechanism agencies use to get client sign-off, and teams use for a second pair of eyes. ## Send a post for approval A post needs content before it can be sent. An empty one is refused with *Add content before requesting approval*. In the post editor. Pick one or more people from the brand's members. At least one is required — Ocoya refuses with *Select at least one approver* otherwise. The post moves to **Pending approval** and the approvers are notified. ## What approvers can do **Approve it.** The post continues on its existing schedule: > This post has been approved and can continue with its scheduled publishing flow. Approving doesn't publish the post — it releases it to publish at the time it was already set for. If that time has already passed, give it a new one. **Reject it.** The post goes back to being a draft: > This post has been rejected and moved back to draft. That means a rejected post loses its scheduled time. Fix whatever was wrong, then reschedule and send it for approval again. People on the **Client** role can approve and decline posts but cannot create or edit them, which is exactly the shape most agency sign-off needs. See [Roles and permissions](/help/roles-and-permissions). ## Finding posts waiting on approval Planner's **Board** view has a Pending approval column with a live count, which is the quickest way to see what's outstanding. Ocoya Planner in Board view with Draft, Scheduled, Pending approval, Posted and Error columns, each showing how many posts it holds Clients don't see Drafts or internally-pending posts at all, so what a client sees in that column is only what's actually waiting on them. ## Common problems **"The post didn't go out even though it was scheduled."** Check whether it was still pending approval. A post awaiting sign-off does not publish, and Ocoya does not publish it late once approved — see [Why didn't my post publish?](/help/post-didnt-publish) **"I can't send this post for approval."** Two reasons Ocoya gives: the post has no content, or it's locked because it's already publishing or published. The message is *Approval is unavailable while this post is locked*. **"My approver can't see it."** They need to be a member of that brand. Membership is per brand, so someone in your other brand won't see it. ## Related Which roles can approve, and which can only approve. Where to see everything awaiting sign-off. # Why didn't my post publish? Source: https://docs.ocoya.com/help/post-didnt-publish What to check when a scheduled Ocoya post didn't go out, and how to get it published. When a scheduled post doesn't appear on your social channel, Ocoya has almost always tried to publish it and been refused by the network. The post keeps the error it received, so you can see exactly what happened and fix it. Two things are worth knowing before you start: * **Each channel publishes separately.** A post going to four channels is four separate attempts. Three can succeed while the fourth fails, so check every channel rather than assuming the whole post failed. * **Ocoya does not retry a failed post.** Once a channel refuses a post, that attempt is finished. Fixing the problem does not republish it by itself — you need to schedule it again. ## Find the post and read the error Open **Planner** and find the post on the date it was meant to go out. You can use the List, Board or Calendar view — whichever you prefer. Ocoya Planner in Calendar view showing a month grid, a Draft panel on the left, an All profiles filter and a Share button above the calendar Open the post. Ocoya stores the message the network sent back, per channel, and that message is the fastest route to the cause. Work through the sections below to match it. ## The channel needs reconnecting This is the most common cause by a wide margin. Ocoya refreshes its access to your channel at the moment it publishes. If the network has expired or revoked that access, publishing fails there and then, even though the channel looked fine in your list the day before. Access is typically revoked when someone changes the account password, removes Ocoya from the network's connected-apps list, changes who administers a Facebook Page, or lets the network's own token expiry lapse. **How to fix it:** go to **Channels**, reconnect the affected channel, then reschedule the post. Ocoya Channels page showing a table of connected channels with their networks and connection dates, plus a Connect channel button ## The post broke one of the network's rules Ocoya checks your post against each network's limits before sending it. If a channel rejects the post, the error names the specific rule. Every network has different rules, which is why the same post can publish fine to LinkedIn and fail on Instagram. **Caption too long** > *\[Network]* caption exceeds character limit Shorten the caption for that channel. You can write a different caption per channel rather than trimming the whole post. **Too many images, videos or GIFs** > *\[Network]* allows a maximum of *\[n]* images per post Remove the extras, or split the content across several posts. Discord accepts at most 10 attachments per post. **File too large or too wide** > Maximum *\[network]* image size of \*\[n]\*mb exceeded > Maximum *\[network]* video width of \*\[n]\*px exceeded Compress or resize the file. Reels, Stories and standard posts each have their own size and dimension limits on the same network. **Video or GIF too long or too short** Each network sets its own minimum and maximum duration, and Stories and Reels differ from standard video. **Too many hashtags** > *\[Network]* allows a maximum of *\[n]* hashtags per post **The post was empty for that channel** > *\[Network]* post is empty A post can have content for one channel and nothing for another if the per-channel text was cleared. Add content for that channel, or remove it from the post. ### Rules specific to one network | Network | Requirement | | --------------- | --------------------------------------------------------------------------------------------------------------------------------- | | LinkedIn | A PDF carousel needs at least 2 images | | Discord | Maximum 10 attachments per post | | Google Business | Events and offers need a title, and a start and end time. The end time must be after the start time. A button needs a valid link. | | Instagram | The account must be a Business or Creator account, not personal | ## The scheduled time was too close to now Ocoya needs a short lead time to queue a post. If you schedule something for less than two minutes ahead, it is refused with: > Choose a schedule time at least 2 minutes from now Pick a time further out, or use **Publish now** instead. ## Nothing published at all, on any channel If an entire day of posts didn't go out, the cause is usually one of these rather than a per-post problem: 1. **The post was still a draft.** Drafts never publish. Check whether the post shows as a draft in Planner. 2. **The post was awaiting approval.** If your brand uses post approval, a post that hasn't been approved will not go out. 3. **Your time zone isn't what you think.** A post scheduled for 9am publishes at 9am in your brand's time zone, which may not be your local one. 4. **You ran out of credits.** This only affects posts an automation was due to generate — credits are never needed to publish a post you already created. ## After you fix it Because Ocoya doesn't retry, fixing the underlying problem doesn't republish anything. Reschedule the post: 1. Open the post in Planner. 2. Correct whatever the error named — reconnect the channel, shorten the caption, swap the image. 3. Set a new date and time at least two minutes ahead, and save. If the post is time-sensitive and the moment has passed, use **Publish now** instead of scheduling. If a post published to some channels but not others, don't reschedule the whole post — that would publish it twice on the channels that already succeeded. Remove the channels that worked, then reschedule for the ones that failed. ## Still failing If a post keeps failing and the error doesn't match anything above, [contact support](https://app.ocoya.com/?modal=support) and include: * The exact error message shown on the post * Which channel it was going to * The date and time it was scheduled for That's enough for the team to trace the publish attempt directly. ## Related What credits are used for, and what happens when you run out. # The post editor Source: https://docs.ocoya.com/help/post-editor Choosing channels, writing one caption or one per channel, and what each post status means. Every post in Ocoya opens in the same editor, whether you wrote it from scratch or generated it. This is what's in it. Ocoya post editor showing a Schedule button, an Edit and Preview toggle, a row of connected channel avatars, a three-paragraph caption, and a green post score of 70 next to a language indicator reading English ## Choose the channels Pick which of the brand's connected channels the post goes to. A post can go to one or to all of them. Each channel you add is published **separately**. Three can succeed while a fourth fails — which is why [a failed post](/help/post-didnt-publish) is diagnosed per channel rather than as a whole. ## One caption, or one per channel By default every channel gets the same caption. That's usually what you want. When it isn't — because X allows 280 characters and LinkedIn allows 3,000, or because you want a different call to action on each — use **Customize per channel**. The control carries a badge showing how many channels currently differ from the shared caption, so you can tell at a glance whether a post has variations without opening each tab. A channel you haven't customised keeps following the shared caption. Edit the shared caption afterwards and the customised ones stay as you left them. This is the cleanest way to handle a caption that's too long for one network. Rather than cutting the whole post down to X's limit, write the full version once and a short version for X. See [Character and media limits](/help/channel-limits). ## What the editor tells you as you write * **Character count**, measured against every channel you've selected. Ocoya warns before you hit a limit rather than at publish time. * **Post score**, a number out of 100 next to the caption. See [Post score](/help/post-score). * **AI actions** on any text you select — rewrite, shorten, expand, translate. See [Edit a caption with AI](/help/ai-copywriter). ## Labels, hashtags and notes Three panels open from the editor and cover things that used to live elsewhere: * **Labels** — categorise the post so you can find it later, and create or edit the brand's labels without leaving. See [Labels](/help/labels). * **Manage hashtags** — pick a hashtag library, or build one here. See [Hashtag libraries](/help/hashtag-libraries). * **Notes** — free text attached to the post, for your team. A note is internal. It never publishes and nobody outside the brand sees it — the place for *waiting on the photo from Sam* or *client asked us to avoid the word premium*, which otherwise ends up in a chat thread nobody finds later. ## Post statuses Every post carries one status, shown in Planner and in the editor. | Status | Means | | -------------------- | -------------------------------------- | | **Generating** | Ocoya is still writing it | | **Draft** | Saved with no date. Never publishes | | **Pending approval** | Waiting on someone to approve it | | **Scheduled** | Has a date and will publish | | **Posted** | Went out | | **Needs attention** | Published to some channels but not all | | **Error** | The network refused it | **Needs attention** is the one worth understanding. It doesn't mean the post failed — it means it partly succeeded. Rescheduling the whole post would publish it twice on the channels that already worked, so remove those channels first. People on the **Client** role don't see Drafts or posts awaiting internal approval. That's deliberate: a client sees finished work and things waiting on them, not your working state. See [Roles and permissions](/help/roles-and-permissions). ## Scheduling Pick a date and time in the brand's time zone — not your computer's. The time must be **at least two minutes from now**; closer than that and Ocoya refuses with *Choose a schedule time at least 2 minutes from now*. **Publish now** skips the two-minute minimum and sends it immediately. Saving without a date makes it a draft. Drafts sit in Planner until you give them a time. ## Related Why a post can go out at an hour you didn't expect. Reading the error a channel sent back. # Post score Source: https://docs.ocoya.com/help/post-score What the number next to your caption measures, what each of the eleven checks looks at, and how to raise it. Every post in the editor carries a score out of 100. It's a rough read on whether the caption is likely to earn attention — not a prediction of how the post will perform, and not something you have to satisfy before publishing. Select the number to open the checklist behind it. Ocoya post editor with a three-paragraph caption and a post score of 70 shown in green in the top right toolbar ## What the number means | Score | Label | | -------- | ------ | | 85–100 | High | | 70–84 | Strong | | 50–69 | Fair | | Below 50 | Low | The score is the sum of eleven checks whose weights add up to 100. A check counts as passed once it earns 70% of its weight, so an item can contribute points while still showing as unpassed. Nothing is blocked by a low score. You can publish a post scoring 12. ## The eleven checks | Check | Weight | What it looks at | | ---------------------------------------------- | ------ | ----------------------------------------------------------------------------- | | Caption has publishable substance | 10 | Whether there's a real sentence, not just media | | Opening line gives people a reason to stop | 12 | A question, a number, or a benefit in the first line, kept short | | Caption length fits the selected channel | 10 | Length against the limits of the channels you picked | | Post communicates a concrete value or takeaway | 12 | Whether there's something specific rather than general | | Text is easy to scan | 8 | Line breaks and structure | | Caption invites a response or next action | 10 | A question or call to action | | Post includes visual media | 10 | Whether an image or video is attached | | Hashtag count fits the channel | 8 | Hashtag count against what that network expects | | Links do not distract from engagement | 6 | Link count and placement | | Writing is readable at social speed | 8 | Average sentence around 22 words or fewer, simple wording | | Caption avoids spam signals | 6 | No more than 6 emoji, no more than 3 exclamation marks, not heavy on capitals | The two heaviest are the opening line and having a concrete takeaway, at 12 each. That's deliberate — they're the two that most affect whether anyone reads past the first line. ## Raising it Each unpassed check comes with a specific suggestion, and next to it a **Fix** action that hands just that problem to the AI. The fix is scoped: *Fix: Caption avoids spam signals* is told to remove spam signals and leave the rest of your caption verbatim, rather than rewriting the post. Each fix costs 1 credit, the same as any other AI edit. See [Edit a caption with AI](/help/ai-copywriter). Two checks can't be fixed by rewriting: * **Post includes visual media** — attach an image or video. * **Caption length fits the selected channel** — this moves when you change which channels the post goes to, because the limits differ. See [Character and media limits](/help/channel-limits). ## Don't chase 100 The score rewards a particular shape of post: a hook, a takeaway, a prompt to respond, an image, restrained punctuation. That shape suits most marketing posts and actively doesn't suit some — a short factual announcement will score Low and still be exactly the right post. Treat a Low score as worth a second look, not as a verdict. ## Related The Fix actions, and the rest of the AI editing menu. The per-network limits the length check measures against. # Posting slots Source: https://docs.ocoya.com/help/posting-slots Set the weekly times a channel should suggest, so scheduling doesn't mean picking a time every post. Posting slots are the times of week a channel should post at. Once set, Ocoya suggests them when you schedule, so you're choosing from your plan rather than picking an hour each time. Ocoya describes them as *the weekly times this profile should use when suggesting scheduled posts from your queue*. ## Set them Open **Channels → ⋯ → Manage** on a channel, then **Posting slots**. There's also a shortcut from the post editor — **Edit posting slots** on a selected channel. Slots apply to days you pick: **Every Day**, **Weekdays**, **Weekends**, or individual days. **New posting slot time** adds one. Add as many as you want per day. **Remove slot** on any entry. Slots are set **per channel**, so your LinkedIn schedule can differ from your Instagram one — which is usually what you want, since the audiences behave differently. ## What they do and don't do **They suggest, they don't publish.** A slot is a recommendation offered when you schedule. Setting slots does not make posts appear at those times on its own — something still has to create the post. If you want posts to actually go out on a rhythm without you writing each one, that's a workflow. See [Create a workflow](/help/create-a-workflow). **They're in the brand's time zone**, like everything else scheduled. Set the time zone first or your slots will be offset. See [Time zones and scheduling](/help/time-zones). ## Choosing times A few slots you'll actually fill beat a dense grid you won't. Start with two or three a week per channel and add more when you're consistently ahead. If you have [analytics](/help/credits) or knowledge of when your audience is active, use it. Otherwise start with mid-morning and early evening on weekdays, and adjust once you have a few weeks of your own data. ## Related Where slots live, alongside details and capabilities. The zone your slots are interpreted in. # Reconnect a channel Source: https://docs.ocoya.com/help/reconnect-a-channel Why social channels lose access to Ocoya, and how to reconnect one without losing your scheduled posts. Social networks hand Ocoya a time-limited pass to post on your behalf. When that pass expires or is withdrawn, Ocoya can no longer publish to that channel and you need to reconnect it. This is the single most common reason a scheduled post doesn't go out, and it is normal — not a sign anything is broken. ## Why access is lost Ocoya checks its access at the moment it publishes, not when you schedule. That's why a channel can look completely healthy in your list and still fail hours later. Access typically ends because: * **The network expired it.** Most networks time-limit access whether you use it or not. Facebook and Instagram are the strictest. * **Someone changed the account password.** Most networks revoke every connected app when the password changes. * **Ocoya was removed** from the network's connected-apps or business-integrations settings. * **Page or account permissions changed.** Someone was removed as an admin of a Facebook Page, or the Page changed ownership. * **The account was converted.** For example, an Instagram Business account switched back to personal. ## Reconnect the channel Select **Channels** at the bottom of the left sidebar. The list shows every channel connected to the brand you have selected, and when each was connected. Ocoya Channels page listing connected channels with their network and connection date, a search box, a network filter and a Connect channel button Select **Connect channel** in the top right, then choose the same network the channel belongs to. Add a connection panel listing every channel Ocoya connects to, each with its category and an arrow to continue Sign in to the network using the account that **manages** the page or profile. This is where reconnections usually go wrong — signing in with a personal account that doesn't administer the Page will complete without error and still not find the profile. Accept all the permissions the network asks for. If you decline even one, Ocoya may connect but be unable to publish, which produces the same failure again later. On the **Select profiles** screen, choose the profile you are reconnecting. Ocoya reattaches it to the existing channel rather than creating a duplicate. Reconnecting does not delete your scheduled posts, drafts, analytics history or automations. The channel keeps its identity — only its access is refreshed. ## Posts that failed while access was down Reconnecting fixes future posts. It does **not** republish anything that already failed, because Ocoya does not retry a failed post. Go to **Planner**, find the posts that were due while the channel was disconnected, and reschedule them. See [Why didn't my post publish?](/help/post-didnt-publish) for how to do that without double-posting. ## If the profile doesn't appear If the **Select profiles** screen is empty or missing the profile you want: 1. **Check which account you signed in with.** Sign out of that network in your browser, then start the connection again so you can pick the right account. 2. **Check you administer the page.** For Facebook and Instagram you need an admin role on the Page itself, not just access to the linked account. 3. **Check the account type.** Instagram must be a Business or Creator account. Personal accounts cannot be connected. 4. **Grant every permission.** Networks hide profiles from apps that weren't given the permission to list them. ## If it keeps disconnecting A channel that needs reconnecting every few days usually points at something outside Ocoya: * **A shared password being rotated.** Every rotation revokes connected apps. Use a network account you control rather than a shared login. * **Someone removing Ocoya** from connected apps, often unknowingly while tidying up business settings. * **A page admin whose own access was removed.** If the person who connected the channel loses their admin role, the connection goes with it. If none of that applies and it keeps happening, [contact support](https://app.ocoya.com/?modal=support) with the channel name and roughly how often it disconnects. ## Related Other reasons a scheduled post didn't go out. Adding a channel to a brand for the first time. # Reels and Stories Source: https://docs.ocoya.com/help/reels-and-stories Post as a Reel or a Story instead of a normal post, and the limits each one has. Facebook and Instagram accept more than one kind of post, and Ocoya lets you choose which. Every other network takes a normal post, so there's nothing to pick. | Network | Post types | | --------------- | ----------------- | | **Instagram** | Post, Reel, Story | | **Facebook** | Post, Reel | | Everything else | Post only | ## Choosing the type In the post editor, a channel that supports more than one type shows a type selector next to it. Channels with only one option don't show a selector at all — which is why you won't see it on LinkedIn or X. **Reel only appears once the post has a video attached.** If you're expecting the option and it isn't there, add the video first — Ocoya hides a type the post can't currently be. The type is set per channel, so the same post can go out as a Reel on Instagram and a normal post on Facebook. ## Reels | | Instagram | Facebook | | ---------------- | ----------------------- | ----------------------- | | Maximum size | 1,000 MB | 100 MB | | Length | 3 seconds to 15 minutes | 3 seconds to 90 seconds | | Custom thumbnail | Yes | No | Facebook Reels are the tighter of the two by some distance — 100 MB and 90 seconds against Instagram's 1,000 MB and 15 minutes. A video that's fine as an Instagram Reel can easily be refused by Facebook, so if you're posting one video to both, the Facebook limits are the ones to build for. Both expect vertical video. Facebook checks for **9:16** specifically. ## Stories Instagram only. | | | | ---------------- | ------------------------------------- | | Maximum size | 8 MB for an image, 100 MB for a video | | Length | 3 to 60 seconds | | Custom thumbnail | Yes | A Story can be an image or a video, and the 8 MB image limit is the one that catches people — it's tighter than the 8 MB that applies to a normal Instagram post only because story images are often exported at full resolution. ## Thumbnails Instagram Reels and Stories accept a custom thumbnail — the still frame shown before the video plays. Set it with **Edit thumbnail** in the Media panel. See [Adding images and video](/help/adding-media). Facebook Reels do **not** accept one, and neither does standard Instagram video. TikTok doesn't support custom thumbnails at all. ## Common problems **"The Reel option isn't there."** The post has no video attached, or the channel is one that doesn't support Reels. **"It published as a normal post."** The type is per channel — check the selector on that specific channel rather than assuming it applied to all of them. **"Facebook refused a video Instagram accepted."** Almost always the 100 MB or 90-second Facebook Reel limits. Shorten or compress for Facebook, or send the long version to Instagram only. **"My Story image was rejected."** Stories cap images at 8 MB. Export it smaller. ## Related Every network's limits for normal posts. Attaching media and setting a thumbnail. # The referral programme Source: https://docs.ocoya.com/help/referral-programme Share your referral link, track what it earns, and get paid. Every Ocoya account has a referral link. If someone subscribes after following it, you earn commission. Find it under **Support → Get paid**. ## Your link **Share your unique link** holds the link itself — copy it and put it wherever your audience is: a newsletter, a video description, a blog post about your workflow. You can customise the token at the end of the link. It accepts letters, numbers and dashes only: > Token must only contain single letters, numbers or dashes A readable token (`/?via=yourname`) tends to get clicked more than a random string. ## The referral badge **Referral badge** generates an embeddable badge for your site, in a choice of styles. Pick a style, choose the format, and Ocoya gives you the code to paste into your HTML. It's a reasonable option if you have a site with steady traffic. For most people the plain link does the same job. ## What the numbers mean The page tracks the funnel in three stages, then the money: | | | | --------------- | ------------------------------------------- | | **Visitors** | People who clicked your link | | **Leads** | People who registered and tried to pay | | **Conversions** | People who successfully subscribed and paid | | | | | --------------------- | -------------------------------------------------- | | **Total commission** | Everything you've earned, paid and unpaid together | | **Unpaid commission** | Earned, awaiting approval and payout | | **Paid commission** | Already sent to you | The gap between Leads and Conversions is the useful signal. Plenty of leads and few conversions usually means your audience is curious but the fit isn't right — a more specific pitch converts better than a broader one. ## Getting paid Payouts go by **PayPal**. Two fields on the page matter: * **Your PayPal email** — where payouts are sent. Nothing can be paid until this is set. * **Your email** — used for correspondence about the programme. Commission moves from Unpaid to Paid after the Ocoya team approves it — the page describes Unpaid as the *amount to be sent to you after our approval*. Commission rates, qualifying periods and payout schedules are set by the Ocoya team rather than in the app, so they aren't shown on this page. [Ask support](https://app.ocoya.com/?modal=support) for the current terms. ## Common questions **"Someone signed up but I have no conversion."** Conversions count people who subscribed and paid. A free trial or an unpaid signup shows as a Lead until it becomes a paid subscription. **"They went to Ocoya directly instead of using my link."** Then the referral isn't attributed. The link is what carries it. **"My commission is stuck as unpaid."** It's awaiting approval. Check your PayPal email is set, then contact support if it stays that way. ## Related For commission rates, payout timing, or a referral that wasn't tracked. # Review a generated campaign Source: https://docs.ocoya.com/help/review-a-campaign Edit, approve and schedule the posts a campaign produced — nothing goes on your calendar until you say so. Generating a campaign produces a plan, not a schedule. Ocoya says so on the review screen: > Edit before anything is saved. Nothing reaches your calendar until you approve posts and save. A campaign you don't like can be abandoned without anything publishing — though the credits it cost are already spent. ## Work through the posts Each generated post comes with its caption, any images, and a proposed date. Ocoya spreads the dates evenly across the number of days you asked for, starting the day after you generate. For each one you can: * **Edit it.** Change the caption or the date directly. Your edits autosave — Ocoya shows *Autosaved* as you go. * **Regenerate it.** Ask for a different version of that post. **Regenerate all** does the whole campaign again. * **Reschedule it.** Move it to a different date without touching the others. * **Approve it.** Mark it as one you want. ## Approving and scheduling Only approved posts are scheduled: > Approved posts will be scheduled. You need at least one — saving with none selected is refused with *Approve at least one post before saving*. This is the useful part of the model: generate ten, approve the six that work, and the four you didn't like simply never exist as posts. You don't have to delete anything. Regenerating costs credits again, at the same rate as the original generation — 1 per caption, 1 per image. Editing a caption by hand costs nothing. If a post is nearly right, edit it rather than regenerating. ## Once it's scheduled A campaign that's been through review is marked as done: > This campaign has already been scheduled. From that point its posts are ordinary scheduled posts. They appear in Planner alongside everything else, and you edit, reschedule or delete them there — not from the campaign screen. Individual posts show as **Already scheduled** if you go back to the campaign. ## Common questions **"Can I generate a campaign and schedule it later?"** Yes — the plan is saved. Come back to it from **Campaigns** and approve when you're ready. **"I approved the wrong post."** Once scheduled it's a normal post, so open it in Planner and delete or reschedule it there. **"Can I add a post to a campaign after scheduling?"** Not to the campaign itself. Create a normal post for the same date instead — nothing downstream treats campaign posts differently. **"The dates don't suit me."** Reschedule posts individually during review, or set a different number of days before generating and run it again. ## Related The controls and the cost, before you run one. Where campaign posts live once they're scheduled. # Roles and permissions Source: https://docs.ocoya.com/help/roles-and-permissions What each role can do in a brand, and which one to give a teammate or a client. Everyone you invite to Ocoya joins a **brand** with a role. The role decides what they can change. There are four roles. | Role | Can do | | ----------- | ----------------------------------------------------------- | | **Owner** | Everything, including transferring ownership | | **Admin** | Everything except managing the owner | | **Manager** | Day-to-day work and settings, but not people or billing | | **Client** | Connect channels, approve posts, comment and view analytics | ## What each role can change | | Owner | Admin | Manager | Client | | ------------------------- | ----- | ----- | ------- | ------ | | Manage the owner | Yes | No | No | No | | Brand settings | Yes | Yes | No | No | | Invite and remove people | Yes | Yes | No | No | | Billing and subscription | Yes | Yes | No | No | | Other settings | Yes | Yes | Yes | No | | Create and schedule posts | Yes | Yes | Yes | No | | Approve or decline posts | Yes | Yes | Yes | Yes | | Connect channels | Yes | Yes | Yes | Yes | | View analytics | Yes | Yes | Yes | Yes | ## Choosing a role **Owner** — one person per brand. Owns the subscription, which covers every brand they own, and the credit balance is theirs. Everything done in the brand draws on the owner's credits. **Admin** — a trusted colleague who needs to run everything, including inviting people and handling billing. The only thing they cannot do is manage the owner. **Manager** — your day-to-day social media person. They can create, schedule, publish and adjust settings, but cannot see billing or change who has access. This is the right role for most team members. **Client** — deliberately narrow, for the person whose social accounts these are. They can connect their own channels, approve or decline the posts you've drafted, leave comments and see how things performed. They cannot create or edit content. Client is the role to use for an agency's customer. They get the approval and visibility they want without being able to change scheduled content. ## Credits and roles Credits belong to the brand **owner**, not to the person doing the work. Anyone working in a brand spends the owner's credits, whatever their role. See [What are credits?](/help/credits) ## Changing someone's role Ocoya Team settings showing a Brand members card with one member listed as Owner, an Invite button, and the Account, Team, Billing, API and MCP sections down the left Open **Settings → Team**, find the person, and change their role. It takes effect immediately — they don't need to sign out and back in. Only owners and admins can change roles. ## Removing someone Removing a member ends their access to that brand immediately. Content they created stays — posts, drafts and campaigns belong to the brand, not to the person who made them. If they're a member of your other brands, those are unaffected. Membership is per brand. ## Related How brands are organised and what belongs to one. Why a teammate's work spends the owner's credits. # Setting up your first brand Source: https://docs.ocoya.com/help/set-up-first-brand What Ocoya asks for when you sign up, and what to do in the first ten minutes. The first thing Ocoya asks after you sign up is to **create your brand** — the business you'll be posting as. ## What it asks for **Brand name.** What customers know you as. Required — Ocoya won't continue without one: > Enter a brand name to continue. **Description.** What your brand does and who it serves. Also required to continue: > Add your brand name and description to continue. That second requirement is deliberate and worth taking seriously rather than typing something to get past it. The description is the context Ocoya's AI reads every time it writes a caption or generates an image. A vague one produces vague posts, for as long as you keep the brand. Two sentences naming what you sell, who buys it and how you sound is enough to start. You can improve it later under [Brand](/help/set-up-your-brand). Ocoya then shows *Preparing your brand* while it sets things up. ## The first ten minutes New brands start on **UTC**. If you're not in UTC, change it before scheduling anything, or posts go out at the wrong hour. See [Time zones and scheduling](/help/time-zones). Start with the network you actually post to most. See [Connect a social channel](/help/connect-a-channel). Add your website and logos. **Fetch brand** reads your site and fills much of it in. See [Set up your brand](/help/set-up-your-brand). Before generating anything, publish one post yourself. It tells you the connection works and shows you the editor. See [Create and schedule your first post](/help/first-post). ## Then try the AI Once the brand profile is filled in, generate a post and compare it with the one you wrote. If the generated one sounds generic, that's the brand description talking — improve it and try again. It's the single highest-leverage thing you can change. See [Ways to create a post](/help/ways-to-create-a-post). ## Related The profile the AI writes from. Your first post, start to finish. # Set up your brand Source: https://docs.ocoya.com/help/set-up-your-brand Fill in your brand profile so Ocoya's AI writes and designs in your voice. A brand is who you post as. Its profile is also the context Ocoya's AI reads every time it writes a caption or generates an image, so filling it in properly is the single biggest improvement you can make to AI output. An empty brand profile produces generic content. A complete one produces content that sounds like you. ## Open your brand Select **Brand** at the top of the left sidebar. Ocoya Brand settings showing a Brand profile section with Name, Website and Description fields, a Fetch brand button, and a Visual identity section for logos and icons A **Complete** badge appears next to Brand profile once the essentials are filled in. ## Fill in the brand profile The name customers know your business by. This is what Ocoya uses when it refers to you in captions. Your primary brand website. Select **Fetch brand** next to it and Ocoya reads your site to fill in the description and visual identity for you — usually faster and more accurate than typing it yourself. What your brand does and who it serves. This has the largest effect on caption quality of any field here. Be specific. "We sell things online" gives Ocoya nothing to work with. "Acme Co makes hard-wearing outdoor gear for people who would rather be outside" tells it your product, your audience and your tone in one sentence. Upload your logos so generated designs match your established look. Use transparent PNG, JPG or WebP files — square files of at least 500 × 500 px work best. Select **Save** when you're done. ## Why it matters Your brand profile feeds: * **Captions** — the AI Copywriter and AI Post Generator write from your description * **Campaigns** — every post in a generated campaign inherits the brand's voice * **Designs** — Studio uses your logos and colours * **AI Agents** — agents answer with your brand context If AI output feels generic or off-tone, the brand description is the first thing to improve. ## One brand or several? Use a separate brand for each business or client you post as. Each brand keeps its own: * Identity and visual assets * Connected channels * Posts, drafts and campaigns * Time zone and posting schedule Switch between them using the brand name at the top of the sidebar. Note that a channel connected to one brand is not visible from another — see [Brands and channels](/help/brands-and-channels). ## Related How brands are organised, and what belongs to one. Add social accounts to this brand. # Share your calendar Source: https://docs.ocoya.com/help/share-your-calendar Give a client a read-only link to your posting calendar, without giving them an Ocoya account. A public link gives someone a view-only calendar they can open in a browser. No Ocoya account, no login, no access to anything but the calendar. It's the lightest way to show a client what's coming without inviting them into the brand. If they need to approve posts or leave comments, invite them on the [Client role](/help/roles-and-permissions) instead. ## Turn it on Go to the Calendar or Board view. The button sits above the calendar. Ocoya generates the URL as soon as you enable it. Ocoya Share menu showing a Public link heading, the description Create a view-only calendar URL, and a toggle switch in the off position Use **Copy link**, or open it in a new tab to check what your client will see. Once it's on, the **Share** button carries a small green dot, so you can tell at a glance that a brand's calendar is public without opening the menu. ## What the recipient sees A read-only calendar. They cannot edit, schedule, approve or comment, and they cannot reach any other part of Ocoya. ## Turning it off is permanent Switching **Public link** off destroys the link. Turning it back on generates a **different** URL — the old one is dead for good, and anyone still holding it gets an error page rather than your calendar. That's the behaviour you want if a link has gone somewhere it shouldn't: switch it off and the leak is closed immediately. It's also a trap if you're just tidying up, because every client you sent the old link to will need the new one. Someone opening a disabled link sees: > Public link disabled — This shared calendar link is disabled or no longer available. ## Each brand has its own link The setting is per brand, so sharing one client's calendar never exposes another's. An agency running ten brands turns it on ten times and gets ten unrelated URLs. ## Related When to invite a client instead of sending a link. Where the Share button lives. # Studio Source: https://docs.ocoya.com/help/studio Ocoya's design editor — templates, your brand's look, and getting a design into a post. Studio is where you design the images that go with your posts. It's a full editor, not a filter — you start from a template or a blank canvas and lay out text, images and shapes. Select **Studio** in the left sidebar. Ocoya Studio showing an Explore template library banner with New design and Browse all buttons, a row of six template thumbnails for fashion and beauty posts, and a Recent designs section with a No designs yet empty state ## Start a design **New design** opens a blank canvas — the dropdown next to it picks the size, so you can start from an Instagram post, a story, or an ad shape rather than resizing later. **Browse all** opens the template library. There are over 1,500 templates, covering posts, stories and ads. Picking one copies it into your designs; the original is untouched, so you can start from the same template as often as you like. Starting from a template is usually faster than a blank canvas, even when you change most of it — the layout and type sizing are already right for the format. ## Your designs Everything you make appears under **Recent designs**, with a search box. Designs belong to the brand, so anyone with access to that brand can open and edit them, and switching brands shows a different set. ## Your brand's look Studio reads the brand's **visual identity** — logos and colours — from your brand profile, which is what keeps generated and template-based designs consistent with everything else you publish. If designs come out looking generic, the brand profile is the thing to fill in, not the design. See [Set up your brand](/help/set-up-your-brand). ## Using a design in a post A finished design can be attached to a post like any other image. The practical order is: make the design in Studio, then create the post and add it — rather than creating an empty post and hopping back and forth. Each network has its own limits on how many images a post can carry and how large they can be. See [Character and media limits](/help/channel-limits). ## AI text in Studio Studio has the same AI text tools as the post editor — rewrite, fix spelling, shorten, expand, change tone, translate — applied to a text layer rather than a caption. Each action costs 1 credit, the same as anywhere else. See [What are credits?](/help/credits) ## Related The logos and colours Studio designs from. The other way to get an image — describe it instead of designing it. # VAT and tax IDs Source: https://docs.ocoya.com/help/tax-ids Add a VAT, GST or other tax ID so it appears on your Ocoya invoices. A tax ID on file appears on your invoices, which is usually what your accountant needs in order to reclaim the VAT. ## Add a tax ID Select **Billing** in the sidebar. This opens Stripe's billing portal. Under billing information, add your company name and address, then add the tax ID. Stripe asks which kind — VAT, GST, ABN, EIN and many others. Pick the one for your country and enter the number in that country's format. You can hold more than one, which matters if you're registered in several countries. ## It only affects future invoices An invoice is fixed once issued, so a tax ID added today appears on your **next** invoice, not on past ones. If you've just subscribed and need the ID on your first invoice, add it before the renewal rather than after. ## Common problems **"My number was rejected."** Stripe validates the format per country and, for EU VAT, checks the number is real and active. Enter it with the country prefix (`LT100004801314`, not `100004801314`) and confirm it's active in the [VIES checker](https://ec.europa.eu/taxation_customs/vies/). **"I still get charged VAT."** Whether VAT applies depends on your country and business status, not just on holding an ID. A valid ID in the right circumstances removes it from future invoices; it never changes an invoice already issued. **"I need a past invoice reissued with my ID."** Contact support with the invoice number. ## Related Downloading invoices and updating your card. What each plan costs. # Time zones and scheduling Source: https://docs.ocoya.com/help/time-zones Set the time zone your posts publish in, choose your week start, and understand why a post can go out a few minutes late. Every time you see in Ocoya — in the calendar, on a scheduled post, in a posting schedule — is in your **brand's** time zone, not your computer's. If a post went out at an unexpected hour, this is almost always why. New brands start on **UTC**. If you're not in UTC, set this before scheduling anything. ## Set your time zone Select **Planner** in the left sidebar. Select the settings icon at the top right of the Planner, above the calendar. The **Planner settings** panel opens. Pick your time zone from the **Timezone** list. Ocoya shows the current time in the selected zone underneath, so you can confirm it looks right before saving. Ocoya Planner settings panel with a Timezone dropdown set to UTC showing the current time in that zone, a Week start dropdown set to Monday, and a Publish like a human toggle Changing the time zone does not move posts you have already scheduled. A post set for 9:00 stays at 9:00 and is now interpreted in the new zone. After changing time zone, check anything already scheduled. ## Time zone is set per brand Each brand has its own time zone. That's deliberate — an agency posting for a London client and a New York client wants each brand's calendar in its own local time. It also means setting the time zone once doesn't cover your other brands. If you run several, set each one. ## Week start **Week start** controls which day your calendar and date pickers begin on. It changes how the calendar looks, nothing about when posts publish. ## Why a post published a few minutes late If a post went out around 3–5 minutes after its scheduled time, check whether **Publish like a human** is switched on in Planner settings. When enabled, Ocoya deliberately varies publishing times so your schedule looks less automated. Posts publish at various times within **5 minutes** of the time you chose. This is normal behaviour, not a fault. Switch it off if you need posts to go out at exact times — for a launch, a live event, or anything coordinated with something else. ## Daylight saving time Ocoya uses named time zones such as *Europe/London*, not fixed offsets, so daylight saving is handled for you. A post scheduled for 9:00 publishes at 9:00 local time on both sides of a clock change. The exception is a post scheduled *during* the hour a clock change skips or repeats. If you're scheduling for the early hours of a clock-change night, pick a time outside 01:00–03:00. ## Checklist for "it posted at the wrong time" 1. **Check the brand's time zone.** Planner settings — is it still UTC? 2. **Check which brand you're on.** Another brand may have a different zone. 3. **Check Publish like a human.** Up to 5 minutes of intentional drift. 4. **Check the post's actual scheduled time.** Open it in Planner — the time shown is the brand's zone, so it should match what you expect once the zone is right. 5. **Check whether the zone was changed after scheduling.** Existing posts keep their clock time and take on the new zone. ## Related When a post didn't go out at all. Why time zone is a brand setting rather than an account one. # Ways to create a post Source: https://docs.ocoya.com/help/ways-to-create-a-post Write a post yourself, draft one from a prompt, or generate a whole campaign — and what each costs. Ocoya gives you three ways to start a post. They all end in the same editor, so the choice is only about how much of the first draft you write yourself. Open **Planner** and the three sit at the top of the page, under *Plan your next post*. | | What it does | What it costs | | ------------------- | ----------------------------- | ----------------------------------- | | **New post** | Opens a blank editor | Free | | **New AI post** | Drafts one post from a prompt | 1 credit, plus 1 per image | | **New AI campaign** | Generates a multi-post plan | 1 credit per post, plus 1 per image | Scheduling and publishing never cost credits. Only the generating does. See [What are credits?](/help/credits) ## New post A blank editor. You pick the channels, write the caption, add media and choose a time. Use this when you already know what you want to say, when you're working from copy someone else wrote, or when the post is short enough that describing it to an AI would take longer than typing it. The editor still has AI in it — you can select any part of your caption and rewrite it. See [Edit a caption with AI](/help/ai-copywriter). ## New AI post Describe the post and Ocoya drafts it. The prompt field reads *Describe the post you want Ocoya to create...*, and the toolbar underneath controls what comes back: * **Hashtags** — generate hashtags alongside the caption * **Images** — generate images, and how many * **Professional** — the tone of voice * **Medium** — the length The badge on the right of the toolbar shows the total cost before you run anything. With images off it reads 1. Switch on one image and it reads 2 — one credit for the caption, one for the image. Ocoya drafts the post and opens it in the editor, where you edit it exactly like one you wrote yourself. Output quality depends heavily on your brand profile — the AI writes from your brand description. If captions come back generic, that's the first thing to fix. See [Set up your brand](/help/set-up-your-brand). ## New AI campaign Marked **Advanced**, because it generates many posts at once rather than one. You describe the campaign instead of a single post, and the toolbar carries extra controls on a second row: the campaign goal, the audience, how many posts, how many days to spread them over, and which channels to use. The cost badge works the same way but multiplies. A campaign of 5 posts with one image each costs 10 credits — five captions plus five images. Ocoya shows that total before you generate. You review the generated plan before anything is scheduled, so a campaign you don't like costs credits but doesn't post anything. ## Which to use Write it yourself when you know the message. Use an AI post when you know the topic but not the words. Use a campaign when you need a run of posts around one theme and would otherwise write them one at a time. If you're unsure, start with a single AI post. It costs a credit or two and tells you quickly whether your brand profile is giving the AI enough to work with. ## Related Rewriting, shortening and translating text you've already written. What the number next to your caption is measuring. # What workflows are Source: https://docs.ocoya.com/help/what-are-workflows Automations that react to something happening — a schedule, a new RSS item, a comment — and post or reply for you. A workflow is a small automation: something happens, and Ocoya does something about it. A schedule comes round and a post goes out. Someone comments with a keyword and they get a DM. A new article appears in your RSS feed and becomes a post. Select **Workflows** in the left sidebar. Ocoya Workflows page headed Build automations that react to social activity and brand events, with a New workflow button and two workflow cards each labelled Inactive ## How one is built Every workflow is a chain: one **trigger** that starts it, then one or more **actions** that run in order. ``` Trigger what starts it └── Action what happens └── Action and then ``` You don't assemble that chain yourself. You pick an example whose shape matches what you want, and Ocoya creates the workflow with those steps already in place — then you configure each step. See [Create a workflow](/help/create-a-workflow). The steps are set when the workflow is created. There's no way to add a step to an existing workflow or remove one, so if you need a different shape, create a new workflow from a different example. ## What it costs Workflows need a **paid plan**. On the free plan, creating one opens an upgrade prompt instead. Each run costs **1 credit**, whether or not it ends up producing a post. A daily poster costs about 30 credits a month; a comment responder on a busy post can cost a great deal more, because it runs once per comment. That's the thing to watch. An automation you forget about keeps spending. See [What are credits?](/help/credits) ## What they're good for Three shapes cover most of it: **Publishing on a rhythm.** A schedule trigger plus an AI agent keeps something going out without you writing it each time. **Turning a feed into posts.** RSS or a WooCommerce product going live becomes a post automatically. **Answering people.** A comment, mention or DM arrives and gets a reply. The reply-to-people workflows run on the Inbox, and **Inbox supports Facebook and Instagram only**. A DM or comment workflow will not fire for X, LinkedIn or anything else, however the channel is connected. See [Inbox](/help/inbox). ## What they can't do * **Branch.** A workflow runs one path, start to finish. * **Change shape after creation.** Steps are fixed when you pick the example. * **Publish without credits.** If your balance is empty, runs stop. Posts you already scheduled by hand still publish — that's unaffected. ## Related The examples, and which one to start from. What each step does and what it needs. # What Ocoya stores about a connected channel Source: https://docs.ocoya.com/help/what-ocoya-stores What connecting a social account actually gives Ocoya, and what it keeps. Connecting a channel gives Ocoya permission to act on that account on your behalf. This is what that involves. ## What a connection holds | | | | --------------------- | ---------------------------------------------------------------------------------------------------------------------------------- | | **Which account** | The network, the account's id on that network, its display name and profile picture — so you can tell your channels apart | | **Access** | The credential the network issued when you approved the connection. It's what lets Ocoya publish for you | | **Connection health** | Whether the network has rejected that credential, when, and the error it gave — this is what drives the "needs reconnecting" state | | **Where it posts** | Per-network extras, such as which Pinterest boards or Google Business locations the account has | Ocoya only ever gets what you approved on the network's own permission screen. The scopes are listed there at connection time, and they differ per network. ## What Ocoya keeps from your activity **Posts you made through Ocoya** — the caption, the media, which channels it went to, when, and what the network said back. That history is how Planner shows you what published and why something failed. **Inbox conversations, for Facebook and Instagram only.** If you use the [Inbox](/help/inbox), Ocoya pulls in DMs, mentions and comments for those two networks so you can reply from Ocoya. No other network feeds the Inbox, so no other network's messages are pulled in. How far back the Inbox reaches is set by the networks, not by Ocoya — they limit how much history an app can read. ## Where it lives A connected channel belongs to **one brand**. Connecting the same social account to a second brand is a second, separate connection — the two don't share state. Who inside a brand can see it is a matter of roles: everyone with access to the brand can see its channels, and what they can *do* depends on their role. See [Roles and permissions](/help/roles-and-permissions). ## Your own posts, on the network Ocoya publishes to your account, so what appears there is yours and lives under that network's terms, not Ocoya's. Deleting a post inside Ocoya doesn't remove it from the network — delete it there too. ## Related What stops, what stays, and how to revoke access properly. Who inside a brand can see and change what. # A workflow didn't run Source: https://docs.ocoya.com/help/workflow-didnt-run Work through the reasons a workflow stayed quiet, in the order they're most likely. Open the workflow and look at **View runs** first. That tells you which problem you have: * **No runs at all** — the trigger never fired. Work through the section below. * **Runs marked Exited** — it fired and a Filter stopped it deliberately. * **Runs marked Failed** — it fired and something broke. The run carries the error. ## Nothing ran at all **Is it live?** A workflow sitting at **Inactive** never fires. New workflows start inactive, and pausing one leaves it that way. See [Switch a workflow on](/help/activate-a-workflow). **Does it still have errors?** A workflow with an unresolved step can't be set live at all — the red count in the header is the thing to clear. **Has the trigger actually happened yet?** This is the most common answer, and the timings surprise people: | Trigger | When it really fires | | ------------------------ | ------------------------------------------------------------------------- | | **New RSS item** | Feeds are checked **every 1–2 hours**, not continuously | | **Product published** | Only the **first** time a product goes live, and up to **5 minutes** late | | **Schedule** | On the interval you set, counted from when it went live | | **New comment** | Only on the **one post** you picked, not everything you publish | | **New mention / New DM** | Facebook and Instagram only | Comment, mention and DM triggers run on the Inbox, which supports **Facebook and Instagram only**. A DM workflow on an X or LinkedIn channel will never fire, however healthy the connection looks. See [Inbox](/help/inbox). **Are you out of credits?** Runs need a credit each. With an empty balance, runs fail rather than silently skipping — check for failed runs carrying: > You've exceeded the credit limit. Upgrade to get more. **Are you on a paid plan?** Workflows need one. On the free plan you'll have hit an upgrade prompt when creating it. ## It ran but exited An **Exited** run means a Filter's condition wasn't met, and the workflow stopped on purpose. Check the filter's keywords against what actually arrived. Two things catch people: * The condition is **Contains** or **Does not contain**, and both are case-insensitive — so case isn't your problem, but a hyphen, a plural or an emoji between the words might be. * A filter with a narrow keyword exits far more often than it proceeds. That's normal. Lots of exits and no failures usually means the filter is working and the keyword is simply rare. ## It ran but failed The run carries the error. Common causes: **The channel needs reconnecting.** A Create post or Send DM step fails the same way a scheduled post does when access has lapsed. See [Reconnect a channel](/help/reconnect-a-channel). **The post broke a network rule.** An AI agent writing without limits in mind can produce a caption too long for the channel, or hashtags beyond what the network allows. See [Character and media limits](/help/channel-limits). **Credits ran out mid-period.** ## It ran and succeeded, but nothing appeared Check what the **Create social post** step is set to do. Its **Behavior** decides whether the run publishes the post or leaves it as a draft — a workflow quietly filling Planner with drafts has worked exactly as configured. Look in [Planner](/help/planner-views) for posts you didn't write. Filtering by date around the run usually finds them. ## It's running too often Pause it. That stops the runs and the credit spend immediately, and keeps the history so you can see what happened. A comment or DM trigger fires **once per comment or message**, so a post that does well can produce a lot of runs quickly. If that's the cause, a tighter Filter is the fix — filtered-out runs still cost a credit each, but they won't post. ## Still stuck [Contact support](https://app.ocoya.com/?modal=support) with the workflow name, roughly when you expected it to fire, and the error text from a failed run if there is one. ## Related Clearing errors, going live, and reading runs. Why every run costs one, including failed ones. # Triggers and actions Source: https://docs.ocoya.com/help/workflow-steps What each workflow step does, what it needs from you, and the AI agent that does the writing. A workflow is one trigger followed by actions. Select a step in the builder to configure it. ## Triggers The trigger is what starts a run. Each workflow has exactly one, set when you created it from an example. | Trigger | Fires when | You configure | | --------------------- | --------------------------------- | --------------------------------------------- | | **Schedule** | A set interval comes round | **Run every** — how often | | **New RSS item** | A new item appears in a feed | **RSS feed URL** | | **Product published** | You publish a WooCommerce product | **Pick store** | | **New webhook** | A URL is visited or called | Nothing — Ocoya gives you the **Webhook URL** | | **New comment** | Someone comments on a chosen post | **Social profile**, then the **Post** | | **New mention** | Someone mentions you | **Social profile** | | **New DM** | A DM arrives | **Social profile** | Three details worth knowing: * **RSS is checked every 1–2 hours**, not continuously. Feeds update infrequently enough that polling harder would gain nothing, so don't expect a post within minutes of an article going up. * **WooCommerce fires only the first time a product goes live**, and can be delayed by up to 5 minutes. Editing a published product won't trigger it again. * **New comment watches one specific post**, not everything you publish. Pick the post when you set it up. The last three triggers read from the Inbox, so they cover **Facebook and Instagram only**. ## Actions | Action | What it does | You configure | | ---------------------- | ---------------------------------------- | ---------------------------------------------------- | | **Use AI agent** | Generates text (and optionally an image) | The agent, plus the **Text input** it works from | | **Create social post** | Publishes or drafts a post | **Caption**, **Behavior**, optional image URLs | | **Reply in comments** | Comments back | **Reply text** | | **Send DM** | Sends a direct message | **DM message**, optional attachment | | **Filter** | Stops the run unless a condition holds | **Only continue if** — contains, or does not contain | | **Delay** | Waits before the next step | **Delay for** | **Filter** is the one that makes engagement workflows precise. Its conditions are *Contains* and *Does not contain*, both case-insensitive, which is how the Comment-to-DM example replies only to comments carrying your keyword rather than every comment on the post. Steps pass values down the chain — an AI agent's generated text becomes the caption of the post that follows it, for example, rather than you retyping it. ## The AI agent Most examples include **Use AI agent**, and it's where the actual writing happens. You pick an agent, or create one from inside the step. An agent holds: * **Agent name** * **Prompt** — its standing instructions, the equivalent of a brief * **LLM** — which model it runs on * **Image generation** — on or off * **Web search** — on or off The prompt is what makes an agent good or useless. *Write a social post* produces filler. Something that says what the brand does, who it's for, what to avoid and how long the post should be produces something you'd publish. There's a **Test** button so you can try an agent's output before switching the workflow on. A test costs 1 credit, which is a great deal cheaper than discovering the problem across thirty live runs. An agent belongs to your brand, so one good agent can be reused across several workflows. Improving its prompt improves every workflow that uses it. ## Credits The **run** costs 1 credit, and that covers the whole chain — the AI agent's work included. A workflow with four steps costs the same as one with two. Testing an agent costs 1 credit per test. See [What are credits?](/help/credits) ## Related Picking the example that gives you the right steps. Why comment, mention and DM triggers are Facebook and Instagram only. # Your account Source: https://docs.ocoya.com/help/your-account Your name, profile image, password and the Google account you can sign in with. Your account is you as a person — separate from any brand. Changing it affects every brand you belong to. Open the account menu in the left sidebar and select **Settings**, then **Account**. Ocoya Account settings showing an Image section with an Upload button, a Basic information section with Name and Email fields, a Sign in using password section with a masked password field, and Account, Team, Billing, API and MCP sections listed down the left ## Profile image **Upload** replaces the default. PNG or JPG, up to **5 MB**. Your image appears wherever you do — in a brand's member list, next to comments and approvals — so it's how teammates identify you. ## Name Free text. It's what teammates see, so it's worth being the name they'd recognise. ## Password The **Sign in using password** section sets a password, whether or not you already have one. It's optional — if you only ever sign in with a magic link or Google, you don't need one. Leaving the field blank leaves your existing password unchanged. You only type in it when you actually want to change something. A password has to meet all five of these: * At least 6 characters * A number * A lowercase letter * An uppercase letter * A special symbol Ocoya shows a strength meter as you type, and won't accept the password until every requirement is met. Setting a password doesn't switch anything off. Magic links and Google keep working — you're adding a way in, not replacing one. See [Log in to Ocoya](/help/log-in-to-ocoya). ## Sign in with Google **Third party accounts** shows whether a Google account is linked. If it isn't, the **+** button links one. The Google account must use the **same email address** as your Ocoya account. Signing in with a different Google address creates a separate Ocoya account rather than linking to this one. There's no way to unlink a connected account from this screen. If you need one removed, [contact support](https://app.ocoya.com/?modal=support). ## Changing your email The Email field here starts the change, but it isn't immediate — it needs verifying first, and getting it wrong can lock you out. See [Change your email address](/help/change-your-email). ## Related The verification step, and why it matters. Magic links, passwords and Google. # ChatGPT Source: https://docs.ocoya.com/mcp/connect/chatgpt Add Ocoya MCP as a custom ChatGPT connector. # Connect ChatGPT to Ocoya MCP Use this MCP URL when creating the ChatGPT app connector: ```txt theme={null} https://mcp.ocoya.com ``` ## Create the ChatGPT app Open ChatGPT settings or workspace settings. Open Apps and click Create. Enable developer mode if ChatGPT asks for it. Paste `https://mcp.ocoya.com` as the connection URL. Set Authentication method to OAuth. Click Create. If the app appears under Drafts, click Publish so workspace members can use it. ## Connect the app After publishing, find Ocoya in the ChatGPT Apps list. Open the Ocoya app and click Connect. Complete the Ocoya OAuth page by approving permissions and selecting the brands ChatGPT can access. Use the connected Ocoya app in ChatGPT. ## Test the connection Start with a read-only request: ```txt theme={null} List my Ocoya brands. ``` Only approve write actions such as publishing, deleting posts, or running workflows when the intended action is clear. # Claude Source: https://docs.ocoya.com/mcp/connect/claude Connect Claude Code, Claude Desktop, or Claude Web to Ocoya MCP. # Connect Claude to Ocoya MCP Use this MCP URL: ```txt theme={null} https://mcp.ocoya.com ``` ## Claude Code Run this from the project where you want Claude Code to see Ocoya tools: ```bash theme={null} claude mcp add ocoya --transport http https://mcp.ocoya.com ``` Then ask Claude Code: ```txt theme={null} What Ocoya MCP tools do you have available? ``` If Claude opens Ocoya, sign in and approve access to the brands it should use. ## Claude Desktop and Claude Web Claude supports custom MCP connectors. Open Claude settings, go to Connectors, and choose to add a custom connector. Name the connector `Ocoya` and paste the MCP URL. When Claude first uses an Ocoya tool, complete the Ocoya OAuth approval flow. ```txt theme={null} https://mcp.ocoya.com ``` # Codex Source: https://docs.ocoya.com/mcp/connect/codex Add Ocoya MCP through Codex config or the Codex CLI. # Connect Codex to Ocoya MCP Use this MCP URL when configuring Codex: ```txt theme={null} https://mcp.ocoya.com ``` ## Config file Open `~/.codex/config.toml`. Add this server entry: ```toml theme={null} [mcp_servers.ocoya] url = "https://mcp.ocoya.com" ``` Run the OAuth login command: ```bash theme={null} codex mcp login ocoya ``` When Ocoya opens in your browser, sign in, approve permissions, and select the brands Codex can access. Restart Codex Desktop or open a new thread so the authenticated Ocoya tools are loaded. ## CLI setup Run: ```bash theme={null} codex mcp add ocoya --url https://mcp.ocoya.com ``` Run: ```bash theme={null} codex mcp login ocoya ``` Complete the Ocoya OAuth page by approving permissions and selecting the brands Codex can access. Restart Codex Desktop or open a new thread before using the Ocoya tools. If `codex` is not on your PATH on macOS, use the bundled app CLI: ```bash theme={null} /Applications/Codex.app/Contents/Resources/codex mcp add ocoya --url https://mcp.ocoya.com /Applications/Codex.app/Contents/Resources/codex mcp login ocoya ``` ## Test the connection Start with a read-only request: ```txt theme={null} List my Ocoya brands. ``` If Codex does not expose Ocoya tools after authentication, restart Codex Desktop and open a new thread. You can also check MCP status with `/mcp`. Only approve write actions such as publishing, deleting posts, or running workflows when the intended action is clear. # JSON and stdio clients Source: https://docs.ocoya.com/mcp/connect/json-clients Configure generic JSON-based MCP clients or bridge stdio-only clients. # Connect JSON and stdio clients Use this MCP URL: ```txt theme={null} https://mcp.ocoya.com ``` ## JSON-based clients Many MCP clients accept a JSON configuration shaped like this: ```json theme={null} { "mcpServers": { "ocoya": { "url": "https://mcp.ocoya.com" } } } ``` If your client asks for a transport, choose HTTP or streamable HTTP. ## Stdio-only clients If a client only supports stdio MCP servers, bridge the remote HTTP server with `mcp-remote`: ```bash theme={null} npx -y mcp-remote https://mcp.ocoya.com ``` Use the command above as the stdio server command in that client. ## Verify access Ask the client: ```txt theme={null} Do you have access to the Ocoya MCP tools? ``` Then try: ```txt theme={null} List my Ocoya brands. ``` # VS Code Source: https://docs.ocoya.com/mcp/connect/vs-code Configure Ocoya MCP for VS Code and GitHub Copilot Agent mode. # Connect VS Code to Ocoya MCP Use VS Code's MCP server command, or create `.vscode/mcp.json`: ```json theme={null} { "servers": { "ocoya": { "type": "http", "url": "https://mcp.ocoya.com" } } } ``` Switch Copilot Chat to Agent mode before asking it to use Ocoya tools. ```txt theme={null} List my Ocoya brands. ``` If the server does not appear, restart VS Code and confirm your version supports MCP servers. # Overview Source: https://docs.ocoya.com/mcp/get-started Use Ocoya MCP to let AI clients work with approved Ocoya brands through OAuth. # Ocoya MCP Ocoya MCP lets AI assistants such as Claude, ChatGPT, Codex, and VS Code work with your Ocoya account directly. After you approve access, the assistant can read approved brands, list connected social profiles, create posts, generate drafts with AI, schedule content, publish posts, manage brand context, and run workflows through natural language. Use MCP when you want an assistant to operate Ocoya safely through approved brand access instead of giving it API keys or asking it to write raw REST calls. Users sign in to Ocoya, review permissions, and choose which brands the MCP client can access. Every brand tool is limited to the brands selected during the OAuth approval flow. Clients can discover brand data, create and update posts, schedule content, publish immediately, and run workflows. Ocoya MCP uses OAuth. Ocoya API keys are not accepted by the MCP server. ## What can the AI do? With Ocoya MCP connected, your assistant can: * **Resolve account context** — identify the authorized user and list approved brands. * **Choose publishing channels** — list connected social profiles and start new social connection flows. * **Find and inspect content** — list posts, calendar posts, and full post details before making changes. * **Create and update posts** — create drafts, attach media, apply social profiles, schedule content, and update existing post groups. * **Generate AI drafts and campaigns** — create ready-to-edit posts or queue multi-post campaign generation with optional hashtag libraries and Studio template references. * **Use creative context** — list hashtag libraries and Studio templates for more consistent content. * **Run automations** — list workflows, inspect workflow details, enable or disable workflows, and queue workflow runs. ## How access works Ocoya MCP is a remote HTTP MCP server: ```txt theme={null} https://mcp.ocoya.com ``` When a client first needs an Ocoya tool, it opens the Ocoya OAuth flow in the browser. The user signs in, reviews the requested scopes, selects allowed brands, and approves the client. The client receives short-lived access tokens and refreshes them according to the OAuth flow. Approved grants can include: | Capability | What it allows | | ---------------------- | ---------------------------------------------------------------------- | | `brand:read` | Read approved brands and related brand context. | | `social_profiles:read` | Read connected social profiles in approved brands. | | `posts:read` | List and inspect posts and calendar content. | | `posts:write` | Create drafts, update posts, schedule posts, and delete posts. | | `posts:publish` | Publish posts immediately. | | `workflows:read` | List and inspect workflows. | | `workflows:run` | Toggle workflows and queue workflow runs. | | `offline_access` | Refresh access without asking the user to approve every request again. | ## Getting started Open the MCP settings page in Ocoya and choose the client you want to connect. Open MCP settings Configure your client with `https://mcp.ocoya.com`. See the connection guide for Claude, ChatGPT, Codex, VS Code, and JSON-based clients. Sign in to Ocoya, review permissions, select the brands the client may access, and approve the connection. Ask the client to list your Ocoya brands and connected social profiles before creating, scheduling, or publishing content. ## Recommended first prompts ```txt theme={null} List my Ocoya brands and show the connected social profiles in the Acme brand. ``` ```txt theme={null} Create a draft post in Acme with this caption: "Our summer launch is live." ``` ```txt theme={null} Schedule that post for LinkedIn tomorrow at 09:00 in the brand timezone. ``` ```txt theme={null} Show me workflows in Acme and run the product launch workflow with campaignId set to summer-2026. ``` ## Important: review write actions MCP clients can perform write actions in the brands you approve. Review client actions before approving sensitive tasks such as immediate publishing, deleting posts, connecting social profiles, disabling workflows, or running workflows with production inputs. ## Next Learn how MCP connects AI clients to Ocoya tools through approved brand access. Configure Ocoya MCP in Claude, ChatGPT, Codex, VS Code, and JSON-based clients. Review every Ocoya MCP tool, parameter, request example, and return shape. # Tools Source: https://docs.ocoya.com/mcp/tools Complete Ocoya MCP tool reference with parameters, request examples, and return notes. # MCP tools Ocoya exposes 22 MCP tools. MCP clients call these tools through the standard `tools/call` JSON-RPC method, but most clients handle that automatically when you ask for an Ocoya action in natural language. Use list tools first to resolve brand, profile, post, brand, template, and workflow IDs. Then pass those IDs to write tools. ```json theme={null} { "jsonrpc": "2.0", "id": 1, "method": "tools/call", "params": { "name": "ocoya_list_brands", "arguments": {} } } ``` ## Tool categories | Category | Tools | Typical use | | ------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------- | | Account and brand | `ocoya_get_me`, `ocoya_list_brands`, `ocoya_get_brand` | Identify the authorized user and resolve brand IDs. | | Social profiles | `ocoya_list_social_profiles`, `ocoya_generate_social_connection_url`, `ocoya_get_social_profile` | Choose publishing channels and start social profile connection flows. | | Posts and calendar | `ocoya_list_posts`, `ocoya_list_calendar_posts`, `ocoya_get_post`, `ocoya_update_post`, `ocoya_create_post`, `ocoya_create_ai_post`, `ocoya_create_ai_campaign`, `ocoya_schedule_post`, `ocoya_delete_post` | Draft, generate, queue AI campaigns, inspect, update, schedule, publish, and remove content. | | Creative context | `ocoya_list_hashtag_libraries`, `ocoya_list_studio_templates` | Find hashtag libraries and Studio templates for generated posts. | | Workflows | `ocoya_list_workflows`, `ocoya_get_workflow`, `ocoya_toggle_workflow`, `ocoya_run_workflow` | Inspect, enable, disable, and run automations. | ## Recommended flow Call `ocoya_list_brands`, optionally with `query`, and keep the returned `id` as `brandId`. For publishing tasks, call `ocoya_list_social_profiles` with `brandId` and keep the target `socialProfileIds`. Use `ocoya_list_hashtag_libraries` or `ocoya_list_studio_templates` when the post should use saved hashtag or visual references. Create, update, schedule, publish, delete, toggle, or run only after the IDs and user intent are clear. Use ISO datetimes for scheduling: ```txt theme={null} 2026-07-01T09:00:00Z ``` ## Account and brand Return the authorized Ocoya user for the current MCP OAuth grant. List or search brands approved for the current MCP connection. Fetch brand details after resolving a brand ID. ## Social profiles List connected channels for an approved brand. Generate a browser URL that starts a new social profile connection flow. Fetch details for one connected social profile. ## Posts and calendar Search post groups by status, caption, and pagination. List scheduled posts within a date range. Fetch full details for one post group. Create a draft, schedule a post, or publish immediately. Generate a ready-to-edit AI draft with optional hashtag, profile, and Studio references. Queue generation for a multi-post AI campaign and return immediately with `GENERATING` status. Update caption, schedule, publish state, media, or attached social profiles. Schedule or reschedule an existing post group. Delete a post group and cancel related schedules. ## Creative context Find reusable hashtag libraries for generated drafts. Find Studio template IDs to use as visual references. ## Workflows List workflow IDs and enabled state for a brand. Fetch workflow metadata and step options. Enable or disable a workflow. Queue an immediate workflow run with optional input. ## Write actions The tools below can change brand state: * `ocoya_create_post` * `ocoya_create_ai_post` * `ocoya_update_post` * `ocoya_schedule_post` * `ocoya_delete_post` * Generate social connection URL * `ocoya_toggle_workflow` * `ocoya_run_workflow` Review the user's intent before immediate publishing, deletion, workflow changes, or social connection actions. # ocoya_create_ai_campaign Source: https://docs.ocoya.com/mcp/tools/ocoya-create-ai-campaign Start generating a multi-post Ocoya AI campaign and return immediately while background generation continues. ## Parameters | Name | Type | Required | Description | | -------------------- | --------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `brandId` | string | Yes | Brand ID from `ocoya_list_brands`. | | `prompt` | string | Yes | Campaign prompt or brief. | | `goal` | string | No | One of `awareness`, `leads`, `launch`, `offer`, `education`, `event`. Defaults to `awareness`. | | `audience` | string | No | One of `business_owners`, `founders_executives`, `marketing_teams`, `buyers_customers`, `local_community`, `investors`, `first_time_buyers`, `existing_customers`. Defaults to `business_owners`. | | `duration` | number | No | Campaign duration in days, from 1 to 30. Defaults to 7. | | `count` | number | No | Number of posts to generate, from 3 to 30. Defaults to 5. | | `postLength` | string | No | One of `short`, `medium`, `long`, `extra_long`. Defaults to `medium`. | | `tone` | string | No | One of `professional`, `friendly`, `educational`, `bold`, `founder_led`. Defaults to `professional`. | | `hashtagLibraryId` | string | No | Hashtag library ID from `ocoya_list_hashtag_libraries`. | | `socialProfileIds` | string\[] | No | Connected social profile IDs to attach when generated campaign posts are saved. | | `generateMedia` | boolean | No | Whether to generate images for campaign posts. | | `imageCount` | number | No | Number of images to generate for each campaign post, from 1 to 10. Values above 1 create carousel-style post creatives. Defaults to 1. | | `referenceUrls` | string\[] | No | Image URLs to use as visual references when `generateMedia` is `true`. Maximum 3. | | `referenceDesignIds` | string\[] | No | Studio design IDs from `ocoya_list_studio_templates` to use as visual references when `generateMedia` is `true`. Maximum 3. | ## Request example ```json theme={null} { "name": "ocoya_create_ai_campaign", "arguments": { "brandId": "cmayvq3hk00017apshay5qezu", "prompt": "Summer launch campaign for our ecommerce analytics dashboard", "goal": "launch", "audience": "marketing_teams", "duration": 10, "count": 6, "postLength": "medium", "tone": "professional", "hashtagLibraryId": "cmayw7l5200067apsmz2tv7e8", "socialProfileIds": ["clh49poxf008x8kov4ncbjty9"], "generateMedia": true, "imageCount": 3 } } ``` ## Returns Returns the queued campaign ID, `GENERATING` status, and generation progress metadata. This tool does not wait for generated posts. Campaign generation runs in the background, so clients should treat the immediate response as a queued job and check the campaign later in Ocoya. # ocoya_create_ai_post Source: https://docs.ocoya.com/mcp/tools/ocoya-create-ai-post Queue a ready-to-edit Ocoya draft from a prompt with optional social profiles, hashtag library, and square image generation. ## Parameters | Name | Type | Required | Description | | -------------------- | --------- | -------- | ------------------------------------------------------------------------------------------------------------------ | | `brandId` | string | Yes | Brand ID from `ocoya_list_brands`. | | `prompt` | string | Yes | What the post should be about. Minimum 10 characters. | | `tone` | string | No | Caption tone. One of `professional`, `friendly`, `educational`, `bold`, `founder_led`. Defaults to `professional`. | | `postLength` | string | No | Caption length. One of `short`, `medium`, `long`, `extra_long`. Defaults to `medium`. | | `socialProfileIds` | string\[] | No | Connected social profile IDs to attach to the draft. | | `hashtagLibraryId` | string | No | Hashtag library ID from `ocoya_list_hashtag_libraries`. | | `generateImage` | boolean | No | Whether to generate square image media for the draft. | | `imageCount` | number | No | Number of generated images when `generateImage` is `true`. Use `1` for a single image or `2-10` for a carousel. | | `referenceUrls` | string\[] | No | Image URLs to use as visual references when `generateImage` is `true`. | | `referenceDesignIds` | string\[] | No | Studio design IDs from `ocoya_list_studio_templates` to use as visual references when `generateImage` is `true`. | ## Request example ```json theme={null} { "name": "ocoya_create_ai_post", "arguments": { "brandId": "cmayvq3hk00017apshay5qezu", "prompt": "Create a LinkedIn post announcing our new analytics dashboard for ecommerce brands.", "tone": "professional", "postLength": "medium", "socialProfileIds": ["clh49poxf008x8kov4ncbjty9"], "hashtagLibraryId": "cmayw7l5200067apsmz2tv7e8", "generateImage": true, "imageCount": 3, "referenceDesignIds": ["design_123"] } } ``` ## Returns Returns post action details such as post group ID, status, and schedule. The status starts as `GENERATING`; fetch the post later to see the completed draft. The generated post is saved as an editable Ocoya draft when background generation finishes unless generation fails and the post moves to `ERROR`. # ocoya_create_post Source: https://docs.ocoya.com/mcp/tools/ocoya-create-post Create an Ocoya social post as a draft, schedule it for later, or publish it immediately when publishNow is enabled. ## Parameters | Name | Type | Required | Description | | ------------------ | --------- | -------- | --------------------------------------------------- | | `brandId` | string | Yes | Brand ID from `ocoya_list_brands`. | | `caption` | string | No | Post caption text. | | `mediaUrls` | string\[] | No | Optional publicly reachable media URLs. Maximum 10. | | `socialProfileIds` | string\[] | No | Connected social profile IDs to attach to the post. | | `scheduledAt` | string | No | Optional ISO datetime. Omit to save as draft. | | `publishNow` | boolean | No | Publish immediately through Ocoya scheduling. | At least one of `caption` or `mediaUrls` should be provided. ## Request example ```json theme={null} { "name": "ocoya_create_post", "arguments": { "brandId": "cmayvq3hk00017apshay5qezu", "caption": "Launching our summer campaign today.", "mediaUrls": ["https://example.com/image.jpg"], "socialProfileIds": ["clh49poxf008x8kov4ncbjty9"], "scheduledAt": "2026-07-01T09:00:00Z" } } ``` ## Returns Returns post action details such as post group ID, status, and schedule. # ocoya_delete_post Source: https://docs.ocoya.com/mcp/tools/ocoya-delete-post Delete an Ocoya post group in an approved brand and cancel any schedules related to that post group. ## Parameters | Name | Type | Required | Description | | ------------- | ------ | -------- | ---------------------------------- | | `brandId` | string | Yes | Brand ID from `ocoya_list_brands`. | | `postGroupId` | string | Yes | Ocoya post group ID. | ## Request example ```json theme={null} { "name": "ocoya_delete_post", "arguments": { "brandId": "cmayvq3hk00017apshay5qezu", "postGroupId": "cmajvvb9q0003ja5vh0538j6r" } } ``` ## Returns Returns the deleted post group ID and a `deleted` boolean. # Generate social connection URL Source: https://docs.ocoya.com/mcp/tools/ocoya-generate-social-connection-url Generate a browser URL that starts the social network connection flow for a brand. ## Parameters | Name | Type | Required | Description | | ---------- | ------ | -------- | ---------------------------------------------------------------- | | `brandId` | string | Yes | Brand ID from `ocoya_list_brands`. | | `provider` | string | Yes | One of `facebook`, `instagram`, `x`, `linkedin`, or `pinterest`. | ## Request example ```json theme={null} { "name": "ocoya_generate_social_connection_url", "arguments": { "brandId": "cmayvq3hk00017apshay5qezu", "provider": "instagram" } } ``` ## Returns Returns `url`. # ocoya_get_brand Source: https://docs.ocoya.com/mcp/tools/ocoya-get-brand Fetch details for one brand that the MCP OAuth grant is allowed to access. ## Parameters | Name | Type | Required | Description | | --------- | ------ | -------- | ---------------------------------- | | `brandId` | string | Yes | Brand ID from `ocoya_list_brands`. | ## Request example ```json theme={null} { "name": "ocoya_get_brand", "arguments": { "brandId": "cmayvq3hk00017apshay5qezu" } } ``` ## Returns Returns brand details such as name, image, timezone, week start, color theme, and brand options. # ocoya_get_me Source: https://docs.ocoya.com/mcp/tools/ocoya-get-me Return the Ocoya user identity associated with the active MCP OAuth grant, including the authorized user id, name, and email. ## Parameters This tool does not require parameters. ## Request example ```json theme={null} { "name": "ocoya_get_me", "arguments": {} } ``` ## Returns Returns the authorized user's `id`, `name`, and `email`. # ocoya_get_post Source: https://docs.ocoya.com/mcp/tools/ocoya-get-post Fetch full details for one Ocoya post group in a brand, including the fields needed before reviewing, updating, scheduling, or deleting it. ## Parameters | Name | Type | Required | Description | | ------------- | ------ | -------- | ---------------------------------- | | `brandId` | string | Yes | Brand ID from `ocoya_list_brands`. | | `postGroupId` | string | Yes | Ocoya post group ID. | ## Request example ```json theme={null} { "name": "ocoya_get_post", "arguments": { "brandId": "cmayvq3hk00017apshay5qezu", "postGroupId": "cmajvvb9q0003ja5vh0538j6r" } } ``` ## Returns Returns full Ocoya post group details. # ocoya_get_social_profile Source: https://docs.ocoya.com/mcp/tools/ocoya-get-social-profile Fetch details for one connected social profile in a brand after resolving the profile id with ocoya_list_social_profiles. ## Parameters | Name | Type | Required | Description | | ----------------- | ------ | -------- | ---------------------------------------------------- | | `brandId` | string | Yes | Brand ID from `ocoya_list_brands`. | | `socialProfileId` | string | Yes | Social profile ID from `ocoya_list_social_profiles`. | ## Request example ```json theme={null} { "name": "ocoya_get_social_profile", "arguments": { "brandId": "cmayvq3hk00017apshay5qezu", "socialProfileId": "clh49poxf008x8kov4ncbjty9" } } ``` ## Returns Returns profile details, provider-specific metadata, and posting slot configuration. # ocoya_get_workflow Source: https://docs.ocoya.com/mcp/tools/ocoya-get-workflow Fetch workflow details and available step options for an Ocoya workflow before inspecting, toggling, or running it. ## Parameters | Name | Type | Required | Description | | ------------ | ------ | -------- | ------------------ | | `workflowId` | string | Yes | Ocoya workflow ID. | ## Request example ```json theme={null} { "name": "ocoya_get_workflow", "arguments": { "workflowId": "cmajvvb9q0003ja5vh0538j6r" } } ``` ## Returns Returns workflow details, including step metadata and options. # ocoya_list_brands Source: https://docs.ocoya.com/mcp/tools/ocoya-list-brands List or search brands allowed by the MCP OAuth grant and resolve the brandId required by brand-scoped tools. ## Parameters | Name | Type | Required | Description | | ------- | ------ | -------- | -------------------------------------------- | | `query` | string | No | Optional case-insensitive brand name search. | ## Request example ```json theme={null} { "name": "ocoya_list_brands", "arguments": { "query": "main" } } ``` ## Returns Returns authorized brands with IDs, names, images, timezone, color theme, and user count. # ocoya_list_calendar_posts Source: https://docs.ocoya.com/mcp/tools/ocoya-list-calendar-posts List scheduled calendar posts for a brand within a date range, using ISO datetimes for the start and end boundaries. ## Parameters | Name | Type | Required | Description | | ---------- | ------ | -------- | ------------------------------------------- | | `brandId` | string | Yes | Brand ID from `ocoya_list_brands`. | | `dateFrom` | string | Yes | Start ISO datetime. | | `dateTo` | string | Yes | End ISO datetime. | | `page` | number | No | Zero-based page number. | | `perPage` | number | No | Maximum number of posts to return per page. | ## Request example ```json theme={null} { "name": "ocoya_list_calendar_posts", "arguments": { "brandId": "cmayvq3hk00017apshay5qezu", "dateFrom": "2026-07-01T00:00:00Z", "dateTo": "2026-07-08T00:00:00Z" } } ``` ## Returns Returns paginated scheduled calendar post results. # ocoya_list_hashtag_libraries Source: https://docs.ocoya.com/mcp/tools/ocoya-list-hashtag-libraries List reusable hashtag libraries in an approved brand before creating AI drafts or campaigns that should use saved hashtag groups. ## Parameters | Name | Type | Required | Description | | --------- | ------ | -------- | ---------------------------------- | | `brandId` | string | Yes | Brand ID from `ocoya_list_brands`. | | `query` | string | No | Case-insensitive name search. | ## Request example ```json theme={null} { "name": "ocoya_list_hashtag_libraries", "arguments": { "brandId": "cmayvq3hk00017apshay5qezu", "query": "launch" } } ``` ## Returns Returns hashtag libraries with IDs, names, and reusable hashtags. Use the returned `id` as `hashtagLibraryId` when calling `ocoya_create_ai_post` or `ocoya_create_ai_campaign`. # ocoya_list_posts Source: https://docs.ocoya.com/mcp/tools/ocoya-list-posts List Ocoya post groups for a brand and optionally filter by status or caption search before opening, updating, scheduling, or deleting posts. ## Parameters | Name | Type | Required | Description | | ---------- | --------- | -------- | ------------------------------------------- | | `brandId` | string | Yes | Brand ID from `ocoya_list_brands`. | | `statuses` | string\[] | No | Optional post statuses to filter by. | | `query` | string | No | Optional caption search query. | | `page` | number | No | Zero-based page number. | | `perPage` | number | No | Maximum number of posts to return per page. | ## Request example ```json theme={null} { "name": "ocoya_list_posts", "arguments": { "brandId": "cmayvq3hk00017apshay5qezu", "statuses": ["SCHEDULED"], "page": 0, "perPage": 20 } } ``` ## Returns Returns paginated Ocoya post group results. # ocoya_list_social_profiles Source: https://docs.ocoya.com/mcp/tools/ocoya-list-social-profiles List connected social profiles for a brand so an MCP client can choose the correct target channels before creating or publishing posts. ## Parameters | Name | Type | Required | Description | | --------- | ------ | -------- | ---------------------------------- | | `brandId` | string | Yes | Brand ID from `ocoya_list_brands`. | ## Request example ```json theme={null} { "name": "ocoya_list_social_profiles", "arguments": { "brandId": "cmayvq3hk00017apshay5qezu" } } ``` ## Returns Returns connected social profile IDs, providers, names, images, and provider-specific profile metadata. # ocoya_list_studio_templates Source: https://docs.ocoya.com/mcp/tools/ocoya-list-studio-templates List Studio templates in an approved brand so AI image generation can follow a saved template style or layout. ## Parameters | Name | Type | Required | Description | | --------- | ------ | -------- | ---------------------------------------- | | `brandId` | string | Yes | Brand ID from `ocoya_list_brands`. | | `query` | string | No | Optional template name search. | | `page` | number | No | Zero-based page number. Defaults to `0`. | | `perPage` | number | No | Templates per page. Defaults to `20`. | ## Request example ```json theme={null} { "name": "ocoya_list_studio_templates", "arguments": { "brandId": "cmayvq3hk00017apshay5qezu", "query": "launch" } } ``` ## Returns Returns Studio design IDs, names, preview images, page thumbnails, page count, width, and height. Use returned design IDs as `referenceDesignIds` when calling `ocoya_create_ai_post` or `ocoya_create_ai_campaign`. # ocoya_list_workflows Source: https://docs.ocoya.com/mcp/tools/ocoya-list-workflows List brand workflows so an MCP client can discover automation ids before inspecting, toggling, or running workflows. ## Parameters | Name | Type | Required | Description | | --------- | ------ | -------- | ---------------------------------- | | `brandId` | string | Yes | Brand ID from `ocoya_list_brands`. | ## Request example ```json theme={null} { "name": "ocoya_list_workflows", "arguments": { "brandId": "cmayvq3hk00017apshay5qezu" } } ``` ## Returns Returns workflow IDs, creation dates, names, and enabled state. # ocoya_run_workflow Source: https://docs.ocoya.com/mcp/tools/ocoya-run-workflow Run an Ocoya workflow immediately through the background automation runner with an optional input payload. ## Parameters | Name | Type | Required | Description | | ------------ | ------ | -------- | -------------------------------- | | `workflowId` | string | Yes | Ocoya workflow ID. | | `input` | object | No | Optional workflow input payload. | ## Request example ```json theme={null} { "name": "ocoya_run_workflow", "arguments": { "workflowId": "cmajvvb9q0003ja5vh0538j6r", "input": {} } } ``` ## Returns Returns the workflow ID and whether the run was queued. # ocoya_schedule_post Source: https://docs.ocoya.com/mcp/tools/ocoya-schedule-post Schedule or reschedule an existing Ocoya post group by assigning a new ISO datetime in an approved brand. ## Parameters | Name | Type | Required | Description | | ------------- | ------ | -------- | ---------------------------------- | | `brandId` | string | Yes | Brand ID from `ocoya_list_brands`. | | `postGroupId` | string | Yes | Ocoya post group ID. | | `scheduledAt` | string | Yes | ISO datetime to schedule the post. | ## Request example ```json theme={null} { "name": "ocoya_schedule_post", "arguments": { "brandId": "cmayvq3hk00017apshay5qezu", "postGroupId": "cmajvvb9q0003ja5vh0538j6r", "scheduledAt": "2026-07-01T09:00:00Z" } } ``` ## Returns Returns post action details such as post group ID, status, and schedule. # ocoya_toggle_workflow Source: https://docs.ocoya.com/mcp/tools/ocoya-toggle-workflow Enable or disable an Ocoya workflow after resolving the workflow id and confirming the desired on or off state. ## Parameters | Name | Type | Required | Description | | ------------ | ------- | -------- | --------------------------------------- | | `workflowId` | string | Yes | Ocoya workflow ID. | | `on` | boolean | Yes | Whether the workflow should be enabled. | ## Request example ```json theme={null} { "name": "ocoya_toggle_workflow", "arguments": { "workflowId": "cmajvvb9q0003ja5vh0538j6r", "on": true } } ``` ## Returns Returns the workflow ID and enabled state. # ocoya_update_post Source: https://docs.ocoya.com/mcp/tools/ocoya-update-post Update an existing post group in one call, including caption, schedule, publish-now state, media, and attached social profiles. ## Parameters | Name | Type | Required | Description | | --------------------- | -------------- | -------- | ------------------------------------------------------------------------------------------------------------------- | | `brandId` | string | Yes | Brand ID from `ocoya_list_brands`. | | `postGroupId` | string | Yes | Ocoya post group ID. | | `caption` | string | No | New caption to apply to existing post variations. | | `scheduledAt` | string or null | No | ISO datetime to schedule the post, or `null` to make it unscheduled. | | `publishNow` | boolean | No | Publish the existing post immediately without creating a new post. | | `mediaUrls` | string\[] | No | Full replacement set of publicly reachable image or video URLs. Maximum 10. Use an empty array to remove all media. | | `addMediaUrls` | string\[] | No | Publicly reachable image or video URLs to append without removing existing media. Maximum 10 total. | | `clearMedia` | boolean | No | Remove all media from the post. Ignored when `mediaUrls` is provided. | | `socialProfileIds` | string\[] | No | Full replacement set of connected social profile IDs from `ocoya_list_social_profiles`. | | `addSocialProfileIds` | string\[] | No | Connected social profile IDs to append without removing profiles already attached to the post. | ## Request example ```json theme={null} { "name": "ocoya_update_post", "arguments": { "brandId": "cmayvq3hk00017apshay5qezu", "postGroupId": "cmajvvb9q0003ja5vh0538j6r", "addSocialProfileIds": ["clh49poxf008x8kov4ncbjty9"], "scheduledAt": "2026-07-01T09:00:00Z" } } ``` ## Returns Returns post action details such as post group ID, status, and schedule. # Troubleshooting Source: https://docs.ocoya.com/mcp/troubleshooting Fix common Ocoya MCP connection, OAuth, brand, and tool-call issues. # MCP troubleshooting Most Ocoya MCP issues come from client configuration, incomplete OAuth approval, missing brand access, or passing IDs from the wrong brand. ## Quick checks | Symptom | What to check | | -------------------------------- | ------------------------------------------------------------------------------------------------------------------------------ | | Client does not list Ocoya tools | Confirm the MCP URL is `https://mcp.ocoya.com`, restart the client, and make sure the client supports remote HTTP MCP servers. | | OAuth opens but access is denied | Sign in to the correct Ocoya account and approve at least one brand. | | `401` response | The client has not completed OAuth, the access token expired, or the client is sending an API key instead of using OAuth. | | Brand not found | The brand was not selected during approval, or the client is using a brand ID from another Ocoya account. | | Social profile rejected | Call `ocoya_list_social_profiles` for the same `brandId` and use one of the returned IDs. | | Invalid schedule | Use an ISO datetime such as `2026-07-01T09:00:00Z`. | | Workflow cannot be enabled | Resolve workflow validation errors in Ocoya before toggling or running it. | ## OAuth and authorization Ocoya MCP does not accept Ocoya API keys. MCP clients should use OAuth and send a bearer token issued by Ocoya after the user approves access. For diagnostics, an unauthenticated request should return `401` with a `WWW-Authenticate` header that points to Ocoya OAuth metadata: ```bash theme={null} curl -i https://mcp.ocoya.com \ -H "Content-Type: application/json" \ -d '{ "jsonrpc": "2.0", "id": 1, "method": "tools/list", "params": {} }' ``` If a client keeps failing OAuth, remove the Ocoya MCP connection from that client, add it again, and complete the approval flow from a browser where you can sign in to Ocoya. ## Brand access Brand-scoped tools require a `brandId` returned by `ocoya_list_brands`. If a brand is missing: 1. Reconnect Ocoya MCP. 2. Select the missing brand during the OAuth approval flow. 3. Ask the client to call `ocoya_list_brands` again. Do not reuse brand IDs from another account, environment, or OAuth grant. ## Posting and scheduling Before creating or scheduling posts, ask the client to resolve fresh IDs: ```txt theme={null} List my Ocoya brands and connected social profiles for the Acme brand. ``` Use the returned `brandId` and `socialProfileIds` in post tools. For scheduling, pass ISO datetimes: ```txt theme={null} 2026-07-01T09:00:00Z ``` ## Client-specific notes | Client | Check | | ------------------ | ------------------------------------------------------------------------------------------------------------------------------------ | | Claude Code | Quote URLs if your shell treats special characters differently. Restart Claude Code after adding a new MCP server. | | Codex | Restart the app or open a new thread after editing `~/.codex/config.toml`. Run `codex mcp login ocoya` when OAuth login is required. | | VS Code | Use a recent VS Code version with MCP support and switch Copilot Chat to Agent mode. | | Stdio-only clients | Use `mcp-remote` to bridge `https://mcp.ocoya.com`. | ## Safe recovery If the connection looks stale or the wrong account is connected: 1. Revoke or remove the Ocoya MCP connection in the client. 2. Add the MCP server again. 3. Complete OAuth with the intended Ocoya account. 4. Select the brands the client should access. 5. Verify with `ocoya_list_brands` before write actions. # What is MCP? Source: https://docs.ocoya.com/mcp/what-is-mcp Learn how Model Context Protocol connects AI clients to approved Ocoya brand tools. # What is MCP? MCP, or Model Context Protocol, is a standard way for AI clients to connect to external products. Instead of asking an assistant to guess how Ocoya works, you connect the assistant to Ocoya MCP and it can discover typed tools for supported actions. Ocoya MCP exposes brand, publishing, brand, Studio, and workflow tools after the user approves OAuth access. Claude, ChatGPT, Codex, VS Code, or another MCP-compatible client connects to `https://mcp.ocoya.com` over Streamable HTTP MCP. Ocoya opens an OAuth approval flow where the user signs in, reviews permissions, and selects the brands the client can access. The approved client can create and manage posts, schedule content, apply brand context, and run workflows inside the selected brands. ## Why use MCP for Ocoya? MCP is useful when you want an AI assistant to perform product actions directly and safely: * The assistant can discover Ocoya tools instead of inventing API calls. * Users approve access through OAuth instead of copying API keys. * Brand access is scoped to the brands selected during approval. * Tool calls return structured data that clients can use in follow-up actions. ## What Ocoya exposes Ocoya MCP gives approved clients tools for: | Area | What the assistant can do | | ----------------- | ----------------------------------------------------------------------- | | Account and brand | Identify the authorized user and list approved brands. | | Social profiles | List connected channels and start new social connection flows. | | Posts | Create, inspect, update, schedule, publish, and delete post groups. | | AI drafts | Generate editable draft posts from prompts and optional visual context. | | Creative context | List hashtag libraries and Studio templates. | | Workflows | List, inspect, enable, disable, and run workflows. | ## Authentication model Ocoya MCP uses OAuth. A client cannot use Ocoya MCP with an Ocoya API key. When the client first needs an Ocoya tool, it opens Ocoya in the browser. The user signs in, reviews requested permissions, selects allowed brands, and approves the client. The client receives a short-lived access token and can refresh access according to the OAuth flow. If a brand was not selected during approval, tools cannot access that brand. ## MCP vs REST API Use MCP when an AI client should act on the user's behalf through natural language and tool calls. Use the REST API when you are building a backend integration, scheduled job, or application that calls Ocoya endpoints directly. ## Next Choose your MCP client and add the Ocoya MCP server. Review all available Ocoya MCP tools and parameters. # Welcome Source: https://docs.ocoya.com/welcome Build social publishing and automation workflows with Ocoya. # Build Social Workflows With Ocoya Create API key Ocoya is a social media content, scheduling, and automation platform. The REST API lets you manage brand data, connected social profiles, posts, and workflows from your own backend services. Ocoya also provides an MCP server so AI clients can work with the same brand and publishing tools through OAuth-approved access. ## What You Can Build Create draft posts, attach media, select connected social profiles, and schedule content from your own app or automation. List brands, resolve brand IDs, and inspect connected social profiles before creating posts. List workflows, inspect workflow steps, and toggle automations on or off from external systems. Connect Claude, Codex, ChatGPT, and other MCP-compatible clients to help create posts and operate brand workflows. ## REST API Flow Generate an API key from Ocoya settings and keep it server-side. Call `/me` and `/brands`, then choose the brand you want to operate on. Use `/social-profiles` with a `brandId` to find the profile IDs that posts should target. Create drafts, schedule posts, list existing posts, update schedules, or delete posts. ## Where To Go Next Learn the typical REST API setup flow and make your first request. See how API keys are sent and how to keep them safe. Connect AI tools to Ocoya with the Model Context Protocol. Browse generated endpoint reference pages from the OpenAPI spec.