# Generate Article Content
Source: https://developers.octaviatech.app/api-reference/ai-cms/ai/generate-content
POST /ai/generateContent
Generate Article Content.
# Generate Article Title
Source: https://developers.octaviatech.app/api-reference/ai-cms/ai/generate-title
POST /ai/generateTitle
Generate Article Title.
# SEO Optimize Content
Source: https://developers.octaviatech.app/api-reference/ai-cms/ai/seo-optimize
POST /ai/seoOptimize
SEO Optimize Content.
# Summarize Content
Source: https://developers.octaviatech.app/api-reference/ai-cms/ai/summarize
POST /ai/summarize
Summarize Content.
# Translate Content
Source: https://developers.octaviatech.app/api-reference/ai-cms/ai/translate
POST /ai/translate
Translate Content.
# API Keys
Source: https://developers.octaviatech.app/api-reference/ai-cms/apikeys
Create and manage API keys for Octavia AI CMS.
API keys let your apps call **AI CMS** securely. Keys are scoped to your **team** and **service** and can be configured with roles, expiry, and status controls.
Keep keys secret and prefer server-side usage. You can edit, disable/enable,
or revoke a key at any time.
***
## Create an API key
Follow these steps in the Octavia dashboard. (Replace the screenshots with your own — two images are expected here.)
Go to Dashboard → Settings → API Keys and click New API Key.
Give the key a clear name (e.g., cms-backend-prod), choose AI CMS as the service scope, assign a Role, and set Expiration:
- Expiration: either a specific end date or lifetime (no expiry).
- Status: you can toggle a key Active/Inactive anytime after creation.
Click Create and copy the key once — it’s shown only at creation time.
You can edit a key’s role, change its
expiration (switch between date-bound and lifetime), or
disable/enable it later from the same page.
***
## Roles & permissions (AI CMS)
Choose the smallest role that meets your use case.
If your backend services require unrestricted access, use **Super Admin**. For public websites and read-only pages, use **Read-only**.
| **Role** | **Intended Use** | **CMS Access (Summary)** |
| ------------------------------------- | ---------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Super Admin** | Platform owners / unrestricted backend systems | **Unlimited access.** Full control over all CMS resources, users, settings, billing, API keys, and administrative actions. Recommended only for trusted backend integrations that require complete access. |
| **Admin** | Team or project administrators | Manage articles, media, categories, tags, and translations. Can publish/unpublish content and manage team members, but cannot modify billing or API keys unless explicitly granted. |
| **Managing Editor (Editor-in-Chief)** | Editorial leads overseeing content strategy | Approve and publish articles, oversee editorial workflows, and manage categories and translations. Cannot modify team or billing settings. |
| **Publisher** | Publishing and release managers | Handle publishing, scheduling, and visibility of content. Can manage release timelines and locales but cannot alter user or team settings. |
| **Editor** | Reviewers and content editors | Create, edit, and localize articles; review submissions; manage media assets. Cannot publish or access administrative settings. |
| **Writer** | Authors and contributors | Create and edit their own drafts, upload media, and submit content for editorial review. Cannot publish or delete articles. |
| **Read-only** | Public websites, caching layers, and analytics tools | **View-only access.** Can read published articles, media, categories, and translations, but has **no write or modification permissions**. |
• **Super Admin** is recommended only when your backend integration explicitly
needs full, unrestricted control.
• For public websites and CDN/cache fetches, prefer **Read-only**.
***
## Managing keys
* **Rotate & edit**: Rename keys, change roles, update expiration (date ↔ lifetime), and flip **Active/Inactive** status anytime.
* **Revoke**: Permanently delete a key to invalidate it immediately across all clients.
* **Audit**: Use the dashboard to review last-used timestamps and quickly identify unused keys.
***
## Related guides
Header format and auth requirements for AI CMS.
Endpoint root for all AI CMS requests.
# Advanced Article Search
Source: https://developers.octaviatech.app/api-reference/ai-cms/articles/advance-search
GET /articles/advanceSearch
Advanced Article Search.
# Archive Article
Source: https://developers.octaviatech.app/api-reference/ai-cms/articles/archive
PUT /articles/archive
Archive Article.
Archiving an article temporarily removes it from public access without deleting its data.
Archived articles can be restored at any time, allowing you to republish or edit them later as needed.
# Create Article
Source: https://developers.octaviatech.app/api-reference/ai-cms/articles/create
POST /articles/create
Guidelines for creating multilingual articles in Octavia AI CMS.
When creating an article in **Octavia AI CMS**, you can include content in multiple languages.\
Fields that support localization must be sent in the **standard multilingual format**, where each language is represented by a lowercase ISO 639-1 code (for example, `en`, `es`, `fr`).
Example format:
```json theme={null}
"mainTitle": {
"en": "Building modern content workflows with Octavia AI CMS",
"es": "Creación de flujos de contenido modernos con Octavia AI CMS",
...
}
```
***
## Rules
* ✅ Keys must be **lowercase ISO 639-1** codes (`en`, `es`, `de`, etc.)
* ✅ At least one language (your default) is required
* ✅ Values must be plain **strings** (HTML allowed for `content`)
* ❌ Do **not** send a single string for multilingual fields
* ❌ Do **not** use uppercase or non-standard codes (e.g., `EN`, `eng`)
***
## Validation & Behavior
* **Slug** must be unique within your workspace
* **Publish controls**: `isPublished`, `isPrivate`, and `publishDate` are optional
* **Language fallback**: if the requested `lang` doesn’t exist, the API returns the default language
* **Content field** supports only **HTML**, not Markdown
* **Category**, **subCategory**, and **author** fields expect valid IDs
* When using the `lang` header, localized fields are flattened to a single string; otherwise, the full language map is returned
# Delete Article
Source: https://developers.octaviatech.app/api-reference/ai-cms/articles/delete
DELETE /articles/delete/{id}
Delete Article.
Deleting an article permanently removes it from your workspace.
This action **cannot be undone**, and all associated data will be lost and inaccessible after deletion.
# List Articles
Source: https://developers.octaviatech.app/api-reference/ai-cms/articles/get-all
GET /articles/getAll
List Articles.
# Get Articles by Author ID
Source: https://developers.octaviatech.app/api-reference/ai-cms/articles/get-by-author-id
GET /articles/getByAuthorId/{authorId}
Get Articles by Author ID.
# Get Articles by Category ID
Source: https://developers.octaviatech.app/api-reference/ai-cms/articles/get-by-category-id
GET /articles/getByCategoryId/{categoryId}
Get Articles by Category ID.
# Get Articles by Category Slug
Source: https://developers.octaviatech.app/api-reference/ai-cms/articles/get-by-category-slug
GET /articles/getByCategorySlug/{slug}
Get Articles by Category Slug.
# Get Article by ID
Source: https://developers.octaviatech.app/api-reference/ai-cms/articles/get-by-id
GET /articles/getById/{id}
Get Article by ID.
Octavia AI CMS supports **multi-language content delivery**.
You can specify which language to receive responses in by including the `lang` header in your API requests.
# Get Article by ID and Language
Source: https://developers.octaviatech.app/api-reference/ai-cms/articles/get-by-id-by-language
GET /articles/getByIdByLanguage/{id}
Get Article by ID and Language.
# Get Article by Slug
Source: https://developers.octaviatech.app/api-reference/ai-cms/articles/get-by-slug
GET /articles/getBySlug/{slug}
Get Article by Slug.
Octavia AI CMS supports **multi-language content delivery**.
You can specify which language to receive responses in by including the `lang` header in your API requests.
# Get Articles by Sub-category ID
Source: https://developers.octaviatech.app/api-reference/ai-cms/articles/get-by-sub-category-id
GET /articles/getBySubCategoryId/{subCategoryId}
Get Articles by Sub-category ID.
# Get Articles by Sub-category Slug
Source: https://developers.octaviatech.app/api-reference/ai-cms/articles/get-by-sub-category-slug
GET /articles/getBySubCategorySlug/{slug}
Get Articles by Sub-category Slug.
# Get Articles by Tag
Source: https://developers.octaviatech.app/api-reference/ai-cms/articles/get-by-tag
GET /articles/getByTag/{tag}
Get Articles by Tag.
# Search Articles
Source: https://developers.octaviatech.app/api-reference/ai-cms/articles/search
GET /articles/search
Search Articles.
# Update Article
Source: https://developers.octaviatech.app/api-reference/ai-cms/articles/update
PUT /articles/update
Update Article.
When updating an article, only the fields you include in the request will be updated — all other fields remain unchanged.
The only required field is **`id`**, which identifies the article to update.
# Authentication
Source: https://developers.octaviatech.app/api-reference/ai-cms/authentication
Authenticate AI CMS requests securely using an API key.
All **Octavia AI CMS** endpoints require authentication using an API key.\
You can generate and manage your keys directly from your [Octavia Dashboard](https://dashboard.octaviatech.app).
Include your key in every API request using the `x-api-key` header:
```http theme={null}
x-api-key: YOUR_API_KEY
```
Any request **without this header** will be rejected with a `401 Unauthorized` response.
***
## Example (JavaScript)
Here’s a simple example using **fetch** to authenticate and retrieve articles:
```javascript theme={null}
const API_URL = "https://api.octaviatech.app/cms/articles/getAll";
const API_KEY = "YOUR_API_KEY";
async function fetchArticles() {
try {
const response = await fetch(API_URL, {
method: "GET",
headers: {
"Content-Type": "application/json",
"x-api-key": API_KEY,
},
});
if (!response.ok) {
throw new Error(`Request failed with status ${response.status}`);
}
const data = await response.json();
console.log("Articles:", data.data.articles);
} catch (error) {
console.error("Error fetching articles:", error.message);
}
}
fetchArticles();
```
> 💡 Replace `YOUR_API_KEY` with your actual key from the Octavia dashboard.
> Always keep your API keys private and never expose them in client-side code.
# Create Author
Source: https://developers.octaviatech.app/api-reference/ai-cms/authors/create
POST /authors/create
How to create an author profile in Octavia AI CMS.
In **Octavia AI CMS**, every article must be associated with an **author** — making author profiles an essential part of the content structure.\
Authors help define the identity, credibility, and organization of your published content, while also enabling advanced features like personalized author pages or bio sections on your website.
You can use author data to **promote creators**, **showcase expertise**, and **link their content** across multiple languages.\
Each author profile can include multilingual fields such as `name` and `bio`, allowing your platform to display localized author information.
***
## Multilingual Fields
Like articles and categories, author fields that support multiple languages should follow the **standard multilingual format**:
```json theme={null}
"name": {
"en": "John Doe",
"es": "Juan Pérez",
...
}
```
### Common Multilingual Fields
* `name`
* `bio` (supports plain text or HTML)
* `role` or `title` (optional)
***
## Rules
* ✅ Each author must have a **unique slug** (used for SEO-friendly author URLs)
* ✅ `name` is required and supports multilingual values
* ✅ `email` is optional but recommended for internal reference
* ✅ `bio` can contain formatted text or HTML for better presentation on profile pages
* ✅ `isPrivate` can be used to hide an author from public listings
* ❌ Do not assign multiple author IDs to the same article (each article has one primary author)
***
## Validation & Behavior
* **Author requirement:** Every article must reference an existing author through the `author` field.
* **Public profiles:** You can use author data to design custom author pages (e.g., `/authors/{slug}`) showing their articles and bio.
* **Multilingual support:** When a `lang` header is provided, the CMS automatically returns the author’s localized data for that language.
* **Deactivation:** Authors can be marked inactive (`isActive: false`) to remove them from publishing workflows without deleting their data.
***
> 💡 *Tip:*
> Building detailed author profiles (with localized bios, roles, and optional images) enhances your CMS experience and allows readers to discover more about each contributor across languages.
# Delete Author
Source: https://developers.octaviatech.app/api-reference/ai-cms/authors/delete
DELETE /authors/delete/{id}
How to permanently delete an author from Octavia AI CMS.
Deleting an author **permanently removes** their profile and all related metadata from your workspace.\
This action **cannot be undone**, and any articles linked to this author will lose their reference — those articles must be reassigned to another author before deletion.
***
## Rules
* ✅ `id` is required to identify the author to delete
* ⚠️ Articles associated with this author should be reassigned first
* ❌ Deleted authors cannot be restored or recovered later
* ❌ Deleting an active author without reassignment may cause missing references in articles
***
## Validation & Behavior
* Once deleted, the author’s data and localized fields are permanently removed
* Attempting to delete a non-existent author returns a `404 Not Found` response
* Soft-deletion is not supported for authors — the deletion is immediate and irreversible
* To temporarily disable an author, use `isActive: false` instead of deleting them
# List Authors
Source: https://developers.octaviatech.app/api-reference/ai-cms/authors/get-all
GET /authors/getAll
List Authors.
# Get Author by ID
Source: https://developers.octaviatech.app/api-reference/ai-cms/authors/get-by-id
GET /authors/getById/{id}
Get Author by ID.
# Get Author by Slug
Source: https://developers.octaviatech.app/api-reference/ai-cms/authors/get-by-slug
GET /authors/getBySlug/{slug}
Get Author by Slug.
# Update Author
Source: https://developers.octaviatech.app/api-reference/ai-cms/authors/update
PUT /authors/update
How to update an existing author profile in Octavia AI CMS.
Updating an author lets you refresh or localize their profile information without affecting their associated articles.\
Only the fields you include in the request will be updated — all others remain unchanged.\
The only required field is **`id`**, which identifies the author to modify.
You can use this to update multilingual fields such as `name` or `bio`, or adjust metadata like `isPrivate`, `isActive`, and `slug`.
***
## Rules
* ✅ Only the provided fields will be updated
* ✅ `id` is required to identify the author
* ✅ Multilingual fields must follow the standard multilingual format
* ✅ You can safely update fields like `bio`, `email`, or `slug`
* ❌ Do not assign the same `slug` to multiple authors
* ❌ Deactivating an author (`isActive: false`) will remove them from new article assignments
***
## Validation & Behavior
* Updating an author does **not** affect already published articles
* Use `isActive: false` to hide an author from public listings while preserving their data
* Multilingual updates merge with existing data — you can add new locales without overwriting existing ones
* All updates are logged with timestamps for audit and tracking
# Base URL
Source: https://developers.octaviatech.app/api-reference/ai-cms/base-url
Base endpoint for all Octavia AI CMS API requests.
All **Octavia AI CMS** API requests should be sent to the following **base URL**:
```http theme={null}
https://api.octaviatech.app/cms
```
This base URL serves as the root for all API endpoints — for example:
```http theme={null}
GET https://api.octaviatech.app/cms/articles/getAll
POST https://api.octaviatech.app/cms/articles/create
```
> Always combine the base URL with the specific endpoint path listed in this documentation.
> The API uses secure HTTPS connections only — plain HTTP requests are not supported.
***
## Environment
Currently, only the **production environment** is available.
All requests must target the production base URL above.
> Sandbox and staging environments will be introduced in future releases.
# Create Category
Source: https://developers.octaviatech.app/api-reference/ai-cms/categories/create
POST /categories/create
How to create a multilingual category in Octavia AI CMS.
Octavia AI CMS allows you to create **multilingual categories** to organize your content effectively.\
Each category can include names and descriptions in multiple languages using the **standard multilingual format**.
Example:
```json theme={null}
"name": {
"en": "Technology",
"es": "Tecnología",
...
}
```
***
## Rules
* ✅ Keys must be **lowercase ISO 639-1** codes (e.g., `en`, `es`, `fr`)
* ✅ At least one language (your default locale) is required
* ✅ Values must be plain **strings**
* ❌ Do **not** send a single string for multilingual fields
* ❌ Do **not** use uppercase or invalid codes (e.g., `EN`, `eng`)
***
## Validation & Behavior
* **Slug** must be unique within your workspace
* **Name** and **description** fields support multilingual format
* **Thumbnail** and **isPrivate** fields are optional
* **Language fallback** applies when fetching data (if a requested language doesn’t exist, the default is returned)
# Delete Category
Source: https://developers.octaviatech.app/api-reference/ai-cms/categories/delete
DELETE /categories/delete/{id}
How to permanently delete a category from Octavia AI CMS.
Deleting a category **permanently removes it** from your workspace.
This action **cannot be undone**, and all related references (such as subcategories or articles linked to this category) will no longer be accessible.
# List Categories
Source: https://developers.octaviatech.app/api-reference/ai-cms/categories/get-all
GET /categories/getAll
List Categories.
# Get Category by ID
Source: https://developers.octaviatech.app/api-reference/ai-cms/categories/get-by-id
GET /categories/getById/{id}
Get Category by ID.
# Get Category by Slug
Source: https://developers.octaviatech.app/api-reference/ai-cms/categories/get-by-slug
GET /categories/getBySlug/{slug}
Get Category by Slug.
# Update Category
Source: https://developers.octaviatech.app/api-reference/ai-cms/categories/update
PUT /categories/update
How to update an existing category in Octavia AI CMS.
When updating a category, only the fields you include in the request will be modified — all other fields remain unchanged.\
The only required field is **`id`**, which identifies the category to update.
You can update one or more fields, including multilingual ones such as `name` or `description`.
***
## Example Request
```json theme={null}
{
"id": "68641ff3fa6f5ba988d00bcb",
"description": {
"en": "Updated description for technology-related content.",
"es": "Descripción actualizada para el contenido relacionado con la tecnología."
}
}
```
# Create Form
Source: https://developers.octaviatech.app/api-reference/ai-cms/forms/create
POST /forms/create
Create Form.
# Delete Form
Source: https://developers.octaviatech.app/api-reference/ai-cms/forms/delete
DELETE /forms/delete/{id}
Delete Form.
# List Forms
Source: https://developers.octaviatech.app/api-reference/ai-cms/forms/get-all
GET /forms/getAll
List Forms.
# List Form Submissions
Source: https://developers.octaviatech.app/api-reference/ai-cms/forms/get-all-submissions
GET /forms/{id}/getAllSubmissions
List Form Submissions.
# Get Form by ID
Source: https://developers.octaviatech.app/api-reference/ai-cms/forms/get-by-id
GET /forms/getById/{id}
Get Form by ID.
# Get Form by Slug
Source: https://developers.octaviatech.app/api-reference/ai-cms/forms/get-by-slug
GET /forms/getBySlug/{slug}
Get Form by Slug.
# Get Form Submission by ID
Source: https://developers.octaviatech.app/api-reference/ai-cms/forms/get-submission-by-id
GET /forms/getSubmissionById/{id}
Get Form Submission by ID.
# Delete Form Submission
Source: https://developers.octaviatech.app/api-reference/ai-cms/forms/submission-delete
DELETE /forms/submission/delete/{id}
Delete Form Submission.
# Update Form Submission
Source: https://developers.octaviatech.app/api-reference/ai-cms/forms/submission-update
PUT /forms/submission/update/{id}
Update Form Submission.
# Submit Form Response
Source: https://developers.octaviatech.app/api-reference/ai-cms/forms/submit
POST /forms/{id}/submit
Submit Form Response.
# Update Form
Source: https://developers.octaviatech.app/api-reference/ai-cms/forms/update
PUT /forms/update
Update Form.
# Introduction
Source: https://developers.octaviatech.app/api-reference/ai-cms/introduction
Overview of Octavia AI CMS and how to use the API docs
## Welcome
**Octavia AI CMS** is an **API-first**, **AI-assisted content management system** built for teams that need to **create, edit, localize, and publish** content programmatically.
It combines a flexible data model with built-in AI tools for **drafting, rewriting, translating, and summarizing** content — all through a simple and powerful API.
You can use it to automate content pipelines, power in-app editors, or build full-scale CMS integrations with your existing products.
For a detailed overview of features and capabilities, visit the product page:
Learn what Octavia AI CMS does and how it fits into your stack
***
## Getting Started
To start using the **Octavia AI CMS API**, follow these three simple steps:
Create your Octavia account to access the dashboard and explore the CMS.
Start for free — no credit card required.
Once signed in, activate the **AI CMS** app from your dashboard to set up your workspace.
Enable the AI CMS app in your workspace.
To interact with the API, you’ll need to create an **API key** from your dashboard.
***
## Next Steps
Learn how to authenticate requests using your API key and start making secure
calls to the AI CMS endpoints.
# Create Language
Source: https://developers.octaviatech.app/api-reference/ai-cms/languages/create
POST /languages/create
Create Language.
# Delete Language
Source: https://developers.octaviatech.app/api-reference/ai-cms/languages/delete
DELETE /languages/delete/{id}
Delete Language.
# List Languages
Source: https://developers.octaviatech.app/api-reference/ai-cms/languages/get-all
GET /languages/getAll
List Languages.
# Response Format
Source: https://developers.octaviatech.app/api-reference/ai-cms/response-fromat
Standard JSON structure returned by all Octavia AI CMS API endpoints.
All **Octavia AI CMS** endpoints return responses in a consistent, predictable JSON structure.
This unified format ensures reliable parsing and standardized error handling across all SDKs and integrations.
***
## Envelope structure
```ts theme={null}
export type ApiResponse = {
success: boolean;
statusCode: number;
message: string;
data: T | null;
};
```
### Field descriptions
| Field | Type | Description |
| -------------- | ----------- | -------------------------------------------------------------------------------------- |
| **success** | `boolean` | Indicates whether the request succeeded. `true` for 2xx, `false` for others. |
| **statusCode** | `number` | HTTP status code returned by the API. Mirrors the actual HTTP response status. |
| **message** | `string` | Human-readable summary of the outcome. Defaults to a standard message based on status. |
| **data** | `T or null` | Contains the actual response payload. `null` when no data is returned or on errors. |
***
## Example responses
### ✅ Success (200 OK)
```json theme={null}
{
"success": true,
"statusCode": 200,
"message": "Request successful",
"data": {
"id": "art_123",
"title": "Introducing AI CMS"
}
}
```
***
### 🆕 Resource created (201 Created)
```json theme={null}
{
"success": true,
"statusCode": 201,
"message": "Resource created successfully",
"data": {
"id": "art_456"
}
}
```
***
### 🚫 Validation error (422 Unprocessable Entity)
```json theme={null}
{
"success": false,
"statusCode": 422,
"message": "Unprocessable entity",
"data": {
"field": "title",
"error": "Title is required"
}
}
```
***
### 🧱 No content (204)
```json theme={null}
{
"success": true,
"statusCode": 204,
"message": "No content",
"data": null
}
```
***
## Next Steps
Explore all supported HTTP status codes, default messages, and their meanings.
# Get All Author Statistics
Source: https://developers.octaviatech.app/api-reference/ai-cms/statistics/get-all-authors-statistics
GET /getAllAuthorsStatistics
Get All Author Statistics.
# Get All User Statistics
Source: https://developers.octaviatech.app/api-reference/ai-cms/statistics/get-all-users-statistics
GET /getAllUsersStatistics
Get All User Statistics.
# Get Author Statistics
Source: https://developers.octaviatech.app/api-reference/ai-cms/statistics/get-author-statistics
GET /getAuthorStatistics/{authorId}
Get Author Statistics.
# Get Tenant Statistics
Source: https://developers.octaviatech.app/api-reference/ai-cms/statistics/get-tenant-statistics
GET /getTenantStatistics/{tenantId}
Get Tenant Statistics.
# Get User Statistics
Source: https://developers.octaviatech.app/api-reference/ai-cms/statistics/get-user-statistics
GET /getUserStatistics/{userId}
Get User Statistics.
# Status Codes
Source: https://developers.octaviatech.app/api-reference/ai-cms/status-codes
List of all HTTP status codes and their default messages used by Octavia AI CMS.
Every API response in **Octavia AI CMS** includes a standardized HTTP `statusCode` along with a corresponding `message` field.
This table defines what each code means and when it’s typically returned.
***
## Success responses
| **Status** | **Default Message** | **Description** |
| ---------- | ----------------------------- | ------------------------------------------------------------------------------------------------ |
| **200** | Request successful | The request completed successfully and returned the expected data. |
| **201** | Resource created successfully | A new resource was successfully created (e.g., an article or media asset). |
| **204** | No content | The operation was successful, but there is no content to return (e.g., after deleting a record). |
***
## Client errors
| **Status** | **Default Message** | **Description** |
| ---------- | -------------------- | --------------------------------------------------------------------------------------------------------------- |
| **400** | Bad request | The request was invalid, missing parameters, or incorrectly formatted. |
| **401** | Unauthorized | The request did not include a valid `x-api-key` header. |
| **403** | Forbidden | The API key is valid, but the user or role does not have permission for this operation. |
| **404** | Not found | The requested resource does not exist or is not accessible. |
| **405** | Method not allowed | The HTTP method is not supported on this endpoint. |
| **409** | Conflict | A conflict occurred, such as attempting to create a resource that already exists. |
| **422** | Unprocessable entity | Validation failed for one or more fields. The `data` object will contain details. |
| **423** | Service inactive | The service or workspace is **disabled** (e.g., expired subscription). Check the dashboard or contact support. |
| **426** | Plan limit exceeded | The user’s plan quota has been reached (e.g., too many items created). Upgrade or manage usage before retrying. |
| **429** | Too many requests | Rate limit exceeded (50 requests per second per IP). Implement retries with exponential backoff. |
***
## Server errors
| **Status** | **Default Message** | **Description** |
| ---------- | --------------------- | ----------------------------------------------------------------------------------- |
| **500** | Internal server error | A generic error occurred on the server. Try again or contact support if persistent. |
| **502** | Bad gateway | An upstream dependency failed to respond properly. Usually temporary. |
| **503** | Service unavailable | The API is temporarily offline or under maintenance. Retry later. |
| **504** | Gateway timeout | The request to an upstream service took too long to complete. |
***
## Example Error Response
```json theme={null}
{
"success": false,
"statusCode": 423,
"message": "Service inactive",
"data": {
"hint": "Your subscription has expired. Please check your dashboard or contact support."
}
}
```
***
## Notes
* **423 Service inactive** — Returned when your Octavia workspace or CMS instance is disabled due to an expired plan or manual suspension.
* **426 Plan limit exceeded** — Indicates your usage exceeded the limits of your current plan (e.g., number of articles, AI credits).
# Create Subcategory
Source: https://developers.octaviatech.app/api-reference/ai-cms/subCategories/create
POST /subCategories/create
How to create a multilingual subcategory in Octavia AI CMS.
Each **subcategory** in Octavia AI CMS belongs to exactly **one category**, identified by the `categoryId` field.\
Subcategories support multiple languages, following the same **standard multilingual format** used across the CMS.
Example:
```json theme={null}
"name": {
"en": "Artificial Intelligence",
"es": "Inteligencia Artificial",
...
}
```
***
## Rules
* ✅ Each subcategory must have a valid **`categoryId`** belonging to an existing category
* ✅ Multilingual fields (`name`, `description`) must use lowercase ISO 639-1 codes (`en`, `es`, etc.)
* ✅ At least one language entry is required
* ✅ Slug must be unique within the parent category
* ❌ A subcategory **cannot** belong to more than one category
* ❌ Do not send plain strings for multilingual fields
***
## Validation & Behavior
* **categoryId** is required and must reference a valid category
* **Slug** must be unique within that category
* **Name** and **description** are multilingual fields
* **Thumbnail** and **isPrivate** are optional
* **Language fallback** applies when fetching data (default language is returned if the requested locale is missing)
# Delete Subcategory
Source: https://developers.octaviatech.app/api-reference/ai-cms/subCategories/delete
DELETE /subCategories/delete/{id}
How to permanently delete a subcategory from Octavia AI CMS.
Deleting a subcategory **permanently removes it** from your workspace.
This action **cannot be undone**, and any articles linked to this subcategory will lose their reference.
# List Subcategories
Source: https://developers.octaviatech.app/api-reference/ai-cms/subCategories/get-all
GET /subCategories/getAll
List Subcategories.
# List Subcategories by Category
Source: https://developers.octaviatech.app/api-reference/ai-cms/subCategories/get-all-by-category
GET /subCategories/getAllByCategory/{id}
List Subcategories by Category.
# Get Subcategory by ID
Source: https://developers.octaviatech.app/api-reference/ai-cms/subCategories/get-by-id
GET /subCategories/getById/{id}
Get Subcategory by ID.
# Get Subcategory by Slug
Source: https://developers.octaviatech.app/api-reference/ai-cms/subCategories/get-by-slug
GET /subCategories/getBySlug/{slug}
Get Subcategory by Slug.
# Update Subcategory
Source: https://developers.octaviatech.app/api-reference/ai-cms/subCategories/update
PUT /subCategories/update
How to update an existing subcategory in Octavia AI CMS.
When updating a subcategory, only the fields included in the request will be modified — all others will remain unchanged.\
The only required field is **`id`**, which identifies the subcategory to update.
You can update multilingual fields such as `name` or `description`, or change metadata like `isPrivate` and `thumbnail`.
***
## Example Request
```json theme={null}
{
"id": "68641ff3fa6f5ba988d00bd7",
"description": {
"en": "Updated description for AI-related content.",
"es": "Descripción actualizada para el contenido relacionado con la IA."
}
}
```
# Introduction
Source: https://developers.octaviatech.app/index
Welcome to the home of Octavia Developers
## Welcome
The **Octavia Developer Platform** gives you clean, modern APIs to build content, commerce, and communications into your products. This documentation covers multiple services—not just the CMS—including **AI CMS**, **Storage** and more.
> Pick a service below to dive straight into its API and guides.
Create, localize, and publish content programmatically with AI assistance.
Store and serve files with signed URLs and access controls.
***
## Setting up
The first step to world-class integrations is setting up your environment.
Start with a free developer account—no credit card required.
Get instant access to the Octavia dashboard.
Enable the product you want to use (AI CMS, Appointment, etc.) from the
dashboard.
Toggle on the services you need for your workspace.
Generate an API key and include it in every request via the x-api-key header.
# Quickstart
Source: https://developers.octaviatech.app/quickstart
Set up your Octavia workspace and go live in minutes.
> Deploy your first Octavia service in minutes
This quickstart walks you through creating an account, activating a service (like **AI CMS**), and generating an API key.
By the end, you’ll have a live workspace, a selected service/plan, and credentials to start building.
Prerequisites: You’ll need an Octavia account. If you don’t
have one yet,
create a free account
.
## Getting started
Follow the steps below. Each step can include a screenshot — feel free to replace the image placeholders with your own.
### 1) Visit the site and click Sign in
Go to **octaviatech.app** and click **Login**.
***
### 2) Sign in or create an account
If you already have an account, sign in.
Otherwise, click **Create account** and enter **First name, Last name, Email, Password,** and **Region**, then complete registration.
***
### 3) Enter the dashboard and select a team
After sign-in, you’ll land in the **Dashboard**. Your **first team** is created automatically using your name.
You can create additional teams later, but to begin quickly, **select the default team** to continue.
***
### 4) Open the Octavia Services catalog
From the dashboard, open **Octavia Services** and pick the product you want (e.g., **AI CMS**, **Auth**, **Payments**, etc.).
Select your service
***
### 5) Choose a plan
Pick a plan that matches your team’s needs. You can start on the **Free** plan and upgrade any time.
During setup, you can claim a free, hosted subdomain in this format:
```
https://.octaviatech.app
```
***
### 6) Provision complete → Configure and build
Once the service is created (and billing completed if applicable), you can:
* View **service settings**
* Open the **product console**
* Create **API keys**
* Manage everything from the **left navigation**
***
## Troubleshooting
Refresh the dashboard or re-open the team switcher. If the default team was renamed or removed, create a new one and select it before continuing.
Check your billing status if you chose a paid plan. If payment succeeded,
refresh the dashboard; provisioning usually completes within seconds.
Ensure the x-api-key header is present on every request and that
you’re using a valid, active key from the dashboard.
The limit is 50 req/s per IP. Implement client-side queuing and exponential backoff, or distribute requests across workers.