API resource

Blog (WordPress)

Connect your own WordPress site (on your own domain) and let your agent write, schedule and publish articles to it, so the SEO value lands on your site. WordPress.com sites connect with a WordPress sign-in; self-hosted sites with an Application Password (WordPress admin → Users → Profile → Application Passwords). Articles are HTML, save as drafts by default, and schedule natively on WordPress. With one site connected, every /v1/blog call finds it automatically; with several, pass account_id. Article ids are your site's own WordPress post ids. Included on every plan.

Connect a WordPress.com site

GET/v1/connect/wordpress

Send the site owner to auth_url; they approve and pick the site on WordPress.com, then land back on return_to. Connecting the same site again refreshes it in place.

Query parameters

return_tourl

Where the browser lands afterwards.

curl "https://creatoros-production-5658.up.railway.app/v1/connect/wordpress" \
  -H "Authorization: Bearer $CREATOROS_API_KEY"
Response 200
{
  "platform": "wordpress",
  "auth_url": "https://public-api.wordpress.com/oauth2/authorize?..."
}

Connect a self-hosted site

POST/v1/connect/wordpress

For WordPress you host yourself. Create an Application Password in WordPress admin (Users → Profile) and send it with the login username. The user must be able to publish posts and upload files (an Editor or Administrator); the site must be HTTPS. The password is stored server-side and never returned; revoking it in WordPress disconnects the site.

Body

site_urlurlrequired

The public site root, e.g. https://yoursite.com (no /wp-json).

usernamestringrequired

The WordPress login username.

application_passwordstringrequired

The Application Password (spaces are fine).

curl -X POST "https://creatoros-production-5658.up.railway.app/v1/connect/wordpress" \
  -H "Authorization: Bearer $CREATOROS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "site_url": "https://yoursite.com",
    "username": "kevin",
    "application_password": "abcd efgh ijkl mnop qrst uvwx"
  }'
Response 201
{
  "connected": true,
  "id": "acc_Wp7Lk2Qm9Vx4TcR8yN3bF1hZ",
  "site": "yoursite.com",
  "name": "Your Site"
}

List connected sites

GET/v1/blog

WordPress sites connected to this workspace.

curl "https://creatoros-production-5658.up.railway.app/v1/blog" \
  -H "Authorization: Bearer $CREATOROS_API_KEY"
Response 200
{
  "sites": [
    {
      "id": "acc_Wp7Lk2Qm9Vx4TcR8yN3bF1hZ",
      "site": "yoursite.com",
      "name": "Your Site",
      "blogId": "1",
      "needsReconnection": false
    }
  ]
}

List articles

GET/v1/blog/articles

Every published, scheduled, draft, pending and private article, newest first. Cursor paginated: pass nextCursor back as cursor.

Query parameters

limitinteger

1 to 50 (default 20).

cursorstring

nextCursor from the previous page.

account_idstring

Only with several sites.

curl "https://creatoros-production-5658.up.railway.app/v1/blog/articles" \
  -H "Authorization: Bearer $CREATOROS_API_KEY"
Response 200
{
  "platform": "wordpress",
  "articles": [
    {
      "id": "1842",
      "blogId": "1",
      "title": "Best time to post on TikTok in 2026",
      "status": "publish",
      "isPublished": true,
      "publishedAt": "2026-09-29T14:00:00Z"
    }
  ],
  "nextCursor": "wp:2"
}

Create an article

POST/v1/blog/articles

Saved as a draft unless isPublished: true (publish now) or a future publishDate (WordPress schedules it; don't send isPublished with it). bodyHtml is raw HTML, not Markdown. Missing tags are created. image.url is downloaded into your media library and set as the featured image (public JPEG, PNG, WebP or GIF up to 10 MB). SEO plugin fields (Yoast, Rank Math) aren't set; excerpt is the summary most themes use as the description.

Body

titlestringrequired

Article title.

bodyHtmlstring

The article HTML.

handlestring

URL slug.

excerptstring

Summary / description.

tagsstring[]

Tag names (up to 100).

imageobject

{ url, altText } featured image.

authorstring

WordPress user id as a string.

isPublishedboolean

true publishes now; false (default) is a draft.

publishDateISO 8601

Future time to schedule.

curl -X POST "https://creatoros-production-5658.up.railway.app/v1/blog/articles" \
  -H "Authorization: Bearer $CREATOROS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "title": "Best time to post on TikTok in 2026",
    "bodyHtml": "<p>We looked at 12,000 posts...</p><h2>The short answer</h2><p>...</p>",
    "handle": "best-time-to-post-on-tiktok",
    "excerpt": "When to post on TikTok for the most views in 2026, by day and hour, from 12,000 real posts.",
    "tags": [
      "tiktok",
      "posting schedule"
    ],
    "image": {
      "url": "https://example.com/cover.jpg",
      "altText": "TikTok posting heatmap"
    },
    "isPublished": false
  }'
Response 201
{
  "platform": "wordpress",
  "article": {
    "id": "1842",
    "blogId": "1",
    "title": "Best time to post on TikTok in 2026",
    "handle": "best-time-to-post-on-tiktok",
    "status": "draft",
    "isPublished": false
  }
}

Get an article

GET/v1/blog/articles/{articleId}

One article with its HTML, excerpt, tags, featured image, status and dates.

Path parameters

articleIdstringrequired

The WordPress post id.

curl "https://creatoros-production-5658.up.railway.app/v1/blog/articles/1842" \
  -H "Authorization: Bearer $CREATOROS_API_KEY"
Response 200
{
  "platform": "wordpress",
  "article": {
    "id": "1842",
    "title": "Best time to post on TikTok in 2026",
    "bodyHtml": "<p>...</p>",
    "tags": [
      "tiktok"
    ],
    "status": "publish",
    "isPublished": true
  }
}

Update an article

PATCH/v1/blog/articles/{articleId}

Partial update: omitted fields keep their value. isPublished: true publishes a draft, false moves it back to draft. tags replaces the whole list; empty bodyHtml or excerpt clears it.

Path parameters

articleIdstringrequired

The WordPress post id.

Body

titlestring

New title.

bodyHtmlstring

New HTML.

isPublishedboolean

Publish or unpublish.

publishDateISO 8601

Reschedule.

curl -X PATCH "https://creatoros-production-5658.up.railway.app/v1/blog/articles/1842" \
  -H "Authorization: Bearer $CREATOROS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "isPublished": true
  }'
Response 200
{
  "platform": "wordpress",
  "article": {
    "id": "1842",
    "status": "publish",
    "isPublished": true,
    "publishedAt": "2026-09-30T13:00:00Z"
  }
}

Delete an article

DELETE/v1/blog/articles/{articleId}

Deletes the article from WordPress for good (its images and tags stay in the site). Unpublish with isPublished: false instead if it may come back.

Path parameters

articleIdstringrequired

The WordPress post id.

curl -X DELETE "https://creatoros-production-5658.up.railway.app/v1/blog/articles/1842" \
  -H "Authorization: Bearer $CREATOROS_API_KEY"
Response 200
{
  "ok": true
}