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

Validate a post

POST
/v1/posts/validate

Runs every check that creating the post would run, and saves nothing. Send the same body as POST /v1/posts. A body that cannot be read (an unknown channel, a settings value of the wrong type) is still a 422; what each platform says about the post comes back as data: targets[].issues per channel, and blockers for anything else that would refuse the save, such as no free queue slot, a time in the past, the plan limit, or X credits. ok tells you whether mode would be accepted as sent. Drafts are always accepted.

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 result of the checks.

application/json
  1. response
data?
curl -X POST 'https://api.eksis.io/v1/posts/validate' \  -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": {    "ok": true,    "mode": "draft",    "scheduledAt": "2019-08-24T14:15:22Z",    "xCredits": 0,    "targets": [      {        "channelId": "string",        "platform": "string",        "ok": true,        "issues": [          {            "level": "error",            "code": "string",            "field": "string",            "message": "string"          }        ]      }    ],    "blockers": [      {        "code": "string",        "message": "string",        "hint": "string"      }    ],    "warnings": [      {        "channelId": "string",        "platform": "string",        "code": "string",        "field": "string",        "message": "string",        "hint": "string"      }    ]  }}