The API reference moved here from eksis.io/developers.
Posts

Create a post

POST
/v1/posts

One endpoint covers drafts, schedules, the queue, and publishing now: mode is what differs. Anything but draft is refused while a target still has a blocking validation error, and the offending checks come back in error.details.validations. Media ids must point at finished uploads in this workspace; any that do not come back as media.not_found, listed in error.details.mediaIds. Settings are checked against the platform of each channel before anything is saved, and whatever was accepted but ignored or adjusted comes back in data.warnings.

Authorization

headerAuthorizationBearer <token>

Send your key as Authorization: Bearer eksis_sk_....

Request Body

application/json
  1. body
title?|

Internal label, never published.

Lengthlength <= 120
caption?string

Used by every target that has no caption of its own.

Lengthlength <= 63206
baseCaption?stringDeprecated

Old name of caption, still accepted.

Lengthlength <= 63206
mediaIds?array<string>

Media ids from GET /v1/media, POST /v1/media/uploads, or POST /v1/media/imports. Used by targets with an empty mediaIds.

Itemsitems <= 35
baseMediaIds?array<string>Deprecated

Old name of mediaIds, still accepted.

Itemsitems <= 35
targets*array<|>

One entry per destination channel. A post always has at least one.

Items1 <= items
scheduledAt?|

Required when mode is schedule. Interpreted as an absolute instant, so send an offset.

Formatdate-time
mode?string

draft saves without publishing. schedule needs scheduledAt. queue takes the next free slot from the channel queue. now publishes immediately.

Default"draft"
Value in"draft""schedule""now""queue"

Response Body

The post was created.

application/json
  1. response
data?
curl -X POST 'https://api.eksis.io/v1/posts' \  -H 'Authorization: Bearer eksis_sk_...' \  -H 'Content-Type: application/json' \  -d '{  "caption": "Three tips for planning a content week.",  "mediaIds": [    "YOUR_VIDEO_MEDIA_ID"  ],  "mode": "schedule",  "scheduledAt": "2026-11-03T09:00:00+07:00",  "targets": [    {      "channelId": "YOUR_YOUTUBE_CHANNEL_ID",      "contentType": "short",      "settings": {        "title": "How we plan a week of posts",        "privacy": "public",        "categoryId": "22",        "tags": [          "social media"        ],        "madeForKids": false      }    }  ]}'
{  "data": {    "id": "string",    "status": "string",    "scheduledAt": "2019-08-24T14:15:22Z",    "warnings": [      {        "channelId": "string",        "platform": "string",        "code": "string",        "field": "string",        "message": "string",        "hint": "string"      }    ]  }}