Changes to the REST API are listed here, newest first. Anything that can break an existing integration is marked Breaking and says what to do about it.
This page is the only place API changes are announced. Bookmark it, or watch it through your usual docs reader, before relying on behaviour that is not documented in the reference.
4 November 2026 — Studio designs
New endpoints
| Endpoint | What it does |
|---|---|
GET /studio-designs | Lists the brand’s own designs saved in Studio, newest first. Takes brandId, and optionally query, page and perPage. |
GET /studio-designs/{designId} | Returns one design with its fields: each text, image and colour layer with its id, label, type and current value. Takes brandId. |
POST /studio-designs/{designId}/render | Renders the design as a PNG with the values in fields and returns its url. Takes brandId. The saved design is not changed. |
New parameters
POST /post/ai and POST /campaigns take studioDesignId and studioDesignFields. With a
design, each post’s image is that design, with its text layers written by the AI from the
caption, instead of an AI-generated image. Any other layer changes only when it is set in
studioDesignFields.
GET /studio-templates is unchanged: it lists Ocoya’s public template gallery, not the
brand’s own designs.
3 November 2026 — Campaigns and brand profiles; hashtag libraries removed
New endpoints
| Endpoint | What it does |
|---|---|
GET /campaigns | Lists a brand’s AI campaigns, newest first, with status and generation progress. Takes brandId, and optionally status, page and perPage. |
GET /campaigns/{campaignId} | Returns one campaign with its posts: caption preview, date, and, once saved, postGroupId and post status. Takes brandId. |
GET /brands/{brandId} | Returns the brand profile: description, website, logos, colors, fonts, tone of voice, guidelines, SEO keywords with monthly searches, hashtags, and the brand score with its suggested next step. |
PATCH /brands/{brandId} | Changes the brand’s description, url, tone, guidelines, keywords, hashtags or colors. Brand owners and admins only. |
GET /brands now also returns each brand’s image, timezone, website url
and brand score.
Breaking: hashtag libraries are gone from the API
Brands now keep their own hashtags (Brand → Hashtags), and AI campaigns use them.
GET /hashtag-librariesis removed.hashtagLibraryIdis no longer accepted byPOST /post/aiandPOST /campaigns. It is ignored if sent, so existing calls keep working.
What you need to change
Stop calling GET /hashtag-libraries. To control the hashtags AI uses, read
them with GET /brands/{brandId} and set them with PATCH /brands/{brandId}.
The MCP server changed the same way: ocoya_list_campaigns,
ocoya_get_campaign and ocoya_update_brand are new, ocoya_get_brand returns
the full profile, and ocoya_list_hashtag_libraries is removed.
ocoya_update_brand needs the new brand:write scope, so reconnect the client
to use it.
30 October 2026 — Social profiles are now channels
A connected account, page or database is called a channel everywhere in Ocoya, so the API and the MCP server now use the same word. Nothing breaks: the old names keep working, and responses carry both names until further notice.
Endpoints
| Before | Now |
|---|---|
GET /social-profiles | GET /channels |
POST /social-profiles/connection-url | POST /channels/connection-url |
Fields
| Before | Now |
|---|---|
socialProfileIds | channelIds |
addSocialProfileIds | addChannelIds |
socialProfileId | channelId |
socialProfiles on a post | channels, a plain list of id, provider, name and image |
socialProfile on a workflow step | channel |
MCP
| Before | Now |
|---|---|
ocoya_list_social_profiles | ocoya_list_channels |
ocoya_get_social_profile | ocoya_get_channel |
ocoya_generate_social_connection_url | ocoya_generate_channel_connection_url |
social_profiles:read scope | channels:read |
If a request sends both names, the old one wins.
1 September 2026 — Workspaces are now brands
Breaking. The old names were removed rather than deprecated, so requests using them fail rather than falling back.
What Ocoya calls a workspace in the product has always been called a brand in the interface. The API now uses the same word.
Endpoints
| Before | Now |
|---|---|
GET /workspaces | GET /brands |
GET /brand-kits | Removed |
Parameters
The workspaceId query parameter is now brandId, on every endpoint that took
it — /social-profiles, /post, /post/ai, /campaigns,
/hashtag-libraries, /studio-templates and /analytics/export.
What you need to change
Rename the parameter. The values are unchanged: a brand ID is the same identifier you were already passing as a workspace ID, so nothing needs to be re-fetched or re-mapped.
curl "https://www.app.ocoya.com/api/_public/v1/post?workspaceId=cmayvq3hk00017apshay5qezu" \
-H "X-API-Key: $OCOYA_API_KEY"curl "https://www.app.ocoya.com/api/_public/v1/post?brandId=cmayvq3hk00017apshay5qezu" \
-H "X-API-Key: $OCOYA_API_KEY"If you were reading brand kits through GET /brand-kits, that endpoint is gone.
Saved hashtag context was then available from GET /hashtag-libraries, removed
on 3 November 2026 (see above).