CMS API Reference

CMS API Reference

CMS API Reference

Complete API documentation for Wrodium's CMS integration endpoints.

Created date:

Dec 5, 2025

Updated date:

Dec 11, 2025

Base URL

Authentication

All API requests require authentication via Bearer token:

Get your API key from Settings → API in your Wrodium dashboard.

Endpoints

List CMS Articles

Retrieve articles from your connected CMS.

Path Parameters

Parameter

Type

Required

Description

brand_url

string

Yes

Your brand identifier

Query Parameters

Parameter

Type

Default

Description

limit

integer

20

Number of articles (1-100)

Response
{
  "articles": [
    {
      "id": "123",
      "cms_type": "wordpress",
      "title": "How to Optimize for AI Search",
      "excerpt": "Learn the key strategies for appearing in AI-generated answers...",
      "published_at": "2024-01-15T10:30:00Z",
      "word_count": 1542,
      "status": "published",
      "url": "https://yourblog.com/optimize-ai-search",
      "raw": {}
    }
  ],
  "total": 45,
  "has_more": true
}
Response Fields

Field

Type

Description

id

string

Unique article identifier from CMS

cms_type

string

CMS provider (wordpress, webflow, etc.)

title

string

Article title (HTML stripped)

excerpt

string

Article excerpt or summary

published_at

string

ISO 8601 publication date

word_count

integer

Approximate word count

status

string

published, draft, archived

url

string

Public URL (if available)

raw

object

Original CMS payload (for debugging)

Example Request
curl -X GET "https://api.wrodium.com/v1/cms/articles/mybrand?limit=10" \
  -H "Authorization: Bearer wrod_xxxxxxxxxxxx"
Errors

Code

Description

401

Invalid or missing API key

404

Brand not found or CMS not configured

502

CMS connection failed

Update CMS Article

Push optimized content back to your CMS.

Request Body
{
  "brand_url": "mybrand",
  "article_id": "123",
  "title": "Updated: How to Optimize for AI Search",
  "content_html": "<h1>Introduction</h1><p>AI search is changing...</p>",
  "excerpt": "Updated summary of AI search optimization strategies",
  "slug": "optimize-ai-search-2024",
  "publish": true
}
Request Fields

Field

Type

Required

Description

brand_url

string

Yes

Your brand identifier

article_id

string

Yes

CMS article ID to update

title

string

No

New title

content_html

string

Yes

Updated HTML content

excerpt

string

No

New excerpt

slug

string

No

New URL slug

publish

boolean

No

Whether to publish (default: true)

Response

Returns the updated ArticleSummary object:

{
  "id": "123",
  "cms_type": "wordpress",
  "title": "Updated: How to Optimize for AI Search",
  "excerpt": "Updated summary of AI search optimization strategies",
  "published_at": "2024-01-15T10:30:00Z",
  "word_count": 1687,
  "status": "published",
  "url": "https://yourblog.com/optimize-ai-search-2024",
  "raw": {}
}
Example Request
curl -X POST "https://api.wrodium.com/v1/cms/update-article" \
  -H "Authorization: Bearer wrod_xxxxxxxxxxxx" \
  -H "Content-Type: application/json" \
  -d '{
    "brand_url": "mybrand",
    "article_id": "123",
    "content_html": "<h1>Introduction</h1><p>AI search is changing...</p>",
    "publish": true
  }'
Errors

Code

Description

401

Invalid or missing API key

404

Brand or article not found

422

Invalid content or validation error

501

CMS doesn't support updates (e.g., Framer)

502

CMS update failed

Get CMS Configuration

Retrieve your CMS connection settings (without sensitive credentials).

Response
{
  "brand_url": "mybrand",
  "provider": "wordpress",
  "connected": true,
  "last_sync": "2024-01-15T14:30:00Z",
  "article_count": 45
}

Test CMS Connection

Verify your CMS connection is working.

Response
{
  "success": true,
  "provider": "wordpress",
  "message": "Successfully connected to WordPress",
  "article_count": 45
}

Data Models

ArticleSummary

Normalized article representation across all CMS providers.

interface ArticleSummary {
  id: string;              // Unique ID from CMS
  cms_type: string;        // Provider name
  title: string;           // Plain text title
  excerpt: string;         // Plain text excerpt
  published_at: string;    // ISO 8601 datetime
  word_count: number;      // Approximate words
  status: string;          // published | draft | archived
  url: string | null;      // Public URL
  raw: object;             // Original CMS response
}

ArticleUpdateInput

Input for updating an article.

interface ArticleUpdateInput {
  title?: string;          // New title (optional)
  content_html: string;    // HTML content (required)
  excerpt?: string;        // New excerpt (optional)
  slug?: string;           // New URL slug (optional)
  publish: boolean;        // Publish after update (default: true)
}

UpdateArticleRequest

Full request body for the update endpoint.

interface UpdateArticleRequest {
  brand_url: string;       // Brand identifier
  article_id: string;      // CMS article ID
  title?: string;
  content_html: string;
  excerpt?: string;
  slug?: string;
  publish: boolean;
}

CMS Provider Specifics

WordPress

  • Uses REST API v2

  • Authentication: Application Passwords

  • Content field: content.renderedcontent

  • Supports custom post types via configuration

Webflow

  • Uses Data API v2

  • Requires field ID mapping in configuration

  • Updates go to /items/{id}/live endpoint

  • Supports localization

Contentful

  • Uses Content Management API (CMA)

  • Requires optimistic locking (X-Contentful-Version)

  • All fields are locale-specific

  • Updates create new versions (not auto-published)

Ghost

  • Uses Admin API with JWT authentication

  • Requires updated_at for collision detection

  • Supports HTML and Lexical content formats

Custom Webhook

  • You define pull and update endpoints

  • Must return normalized article format

  • Supports custom authentication headers

Rate Limits

Endpoint

Rate Limit

GET /cms/articles

60 requests/minute

POST /cms/update-article

30 requests/minute

GET /cms/config

60 requests/minute

POST /cms/test-connection

10 requests/minute

Rate limit headers are included in responses:


Error Responses

All errors follow this format:

{
  "detail": "Error message here",
  "code": "ERROR_CODE",
  "errors": []
}

Common Error Codes

Code

HTTP Status

Description

UNAUTHORIZED

401

Missing or invalid API key

NOT_FOUND

404

Resource not found

VALIDATION_ERROR

422

Invalid request data

CMS_NOT_CONFIGURED

404

CMS not connected

CMS_CONNECTION_FAILED

502

Could not reach CMS

CMS_UPDATE_FAILED

502

CMS rejected update

CMS_NOT_SUPPORTED

501

Operation not supported

RATE_LIMITED

429

Too many requests

SDKs

Python

from wrodium import WrodiumClient

client = WrodiumClient(api_key="wrod_xxx")

# List articles
articles = client.cms.list_articles("mybrand", limit=20)

# Update article
result = client.cms.update_article(
    brand_url="mybrand",
    article_id="123",
    content_html="<p>Updated content</p>",
)

JavaScript/TypeScript

import { Wrodium } from '@wrodium/sdk';

const client = new Wrodium({ apiKey: 'wrod_xxx' });

// List articles
const articles = await client.cms.listArticles('mybrand', { limit: 20 });

// Update article
const result = await client.cms.updateArticle({
  brandUrl: 'mybrand',
  articleId: '123',
  contentHtml: '<p>Updated content</p>',
});

Webhooks

Wrodium can send webhooks when CMS operations complete.

Events

Event

Description

cms.article.updated

Article successfully updated

cms.article.failed

Article update failed

cms.sync.completed

Full sync completed

Payload

{
  "event": "cms.article.updated",
  "timestamp": "2024-01-15T14:30:00Z",
  "data": {
    "brand_url": "mybrand",
    "article_id": "123",
    "cms_type": "wordpress",
    "status": "success"
  }
}

Configure webhooks in Settings → Webhooks.

Found this article insightful? Spread the words on…

Found this article insightful?
Spread the words on…

X.com

Share on X

X.com

Share on X

X.com

Share on X

X.com

Share on LinkedIn

X.com

Share on LinkedIn

X.com

Share on LinkedIn

Found this documentation insightful? Share it on…

X.com

LinkedIn

Contents

Checkout other documentations

Checkout other documentations

Checkout other documentations

Let us help you win on

ChatGPT

Let us help you win on

ChatGPT

Let us help you win on

ChatGPT