# 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. Open API keys in dashboard Give the key a clear name (e.g., cms-backend-prod), choose AI CMS as the service scope, assign a Role, and set Expiration: Click Create and copy the key once — it’s shown only at creation time. Create scoped API key for AI CMS 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 Hero Light ## 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 Landing page with Sign in button 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. Registration form *** ### 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. Dashboard with default team selection *** ### 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.). Service catalog Select your service Service catalog *** ### 5) Choose a plan Pick a plan that matches your team’s needs. You can start on the **Free** plan and upgrade any time. Plan selection screen During setup, you can claim a free, hosted subdomain in this format: ``` https://.octaviatech.app ``` *** ### 6) Provision complete → Configure and build Service dashboard and settings 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** Service dashboard and settings *** ## 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.