Skip to content

Create and schedule posts

POST
/posts
curl --request POST \
--url https://api.dropslate.top/v1/posts \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '{ "targets": { "accountIds": [ "acc_01" ] }, "mediaIds": [ "med_01" ], "text": "Launch day.", "when": "now", "confirm": true }'

One post per account: the same text sent to three accounts creates three posts. Requires the write scope. POST /posts/plan (no write needed) dry-runs the same body first and lists any issue per account without creating anything - CLAUDE.md’s “plan before create”.

Media typeapplication/json
object
targets
required
object
accountIds
Array<string>
groupId
string
mediaIds
Array<string>
text
string
title
string
tags
Array<string>
perPlatform

Per-network settings keyed by platform. Unknown keys are refused.

object
youtube

Everything videos.insert can write. Not settable through the YouTube API (set in YouTube Studio): Test & Compare, recording location, end screens, cards, monetization, comments.

object
visibility
string
default: public
Allowed values: public unlisted private
madeForKids
boolean
useCoverAsThumbnail

The first image of the post becomes the thumbnail (the channel must be verified for custom thumbnails).

boolean
default: true
category

VideoCategories id; default 22 (People & Blogs).

string
/^[0-9]{1,3}$/
language

BCP-47 language of the title and description.

string
/^[a-z]{2,3}(-[A-Za-z0-9]{2,8})*$/
audioLanguage

BCP-47 language spoken in the video.

string
/^[a-z]{2,3}(-[A-Za-z0-9]{2,8})*$/
recordingDate
string format: date
license
string
default: youtube
Allowed values: youtube creativeCommon
embeddable
boolean
default: true
publicStatsViewable
boolean
default: true
containsSyntheticMedia

YouTube altered or synthetic content disclosure.

boolean
paidProductPlacement
boolean
notifySubscribers
boolean
default: true
playlistId

A playlist on the same channel; a refusal is reported on the post, the video still goes out.

string
/^PL(?:[A-Za-z0-9_-]{16}|[A-Za-z0-9_-]{32})$/
tiktok
object
instagram
object
contentType
string
default: reels
Allowed values: reels post story carousel
collaborators

Up to 3 usernames invited as collaborators (1.3.0: was 20).

Array<string>
<= 3 items
shareToFeed

Reels only.

boolean
default: true
altText

The image of a feed post (1.3.0); not sent on carousels yet.

string
<= 1000 characters
coverMs

The Reel cover frame, milliseconds into the video (1.3.0).

integer
facebook
object
contentType
string
default: video
Allowed values: photo video reel story text
link

Text posts only (1.3.0). A video takes the post title.

string format: uri
<= 2048 characters /^https:///
threads

Base tags are not appended to a thread; it takes one topicTag. replyControl is accepted and ignored since 1.3.0.

object
topicTag
string
>= 1 characters <= 50 characters /^[^.&]+$/
linkAttachment

A link preview on a thread with no files (1.3.0).

string format: uri
<= 2048 characters /^https:///
altText

Images (1.3.0).

string
<= 1000 characters
replyControl
string
Allowed values: everyone accounts_you_follow mentioned_only
overrides

A network’s own text, title and tags instead of the post’s: each account of that network gets overrides.<network>.text ?? text, and so on. Only networks with a connector.

object
youtube
object
text
string
<= 10000 characters
title
string
<= 500 characters
tags
Array<string>
<= 50 items
instagram
object
text
string
<= 10000 characters
title
string
<= 500 characters
tags
Array<string>
<= 50 items
facebook
object
text
string
<= 10000 characters
title
string
<= 500 characters
tags
Array<string>
<= 50 items
threads
object
text
string
<= 10000 characters
title
string
<= 500 characters
tags
Array<string>
<= 50 items
tiktok
object
text
string
<= 10000 characters
title
string
<= 500 characters
tags
Array<string>
<= 50 items
when
One of:
string
Allowed values: now draft
confirm
required

Must be true; the guard against an accidental publish.

boolean
Example
{
"targets": {
"accountIds": [
"acc_01"
]
},
"mediaIds": [
"med_01"
],
"text": "Launch day.",
"when": "now",
"confirm": true
}

Created; queued if scheduled, draft if not.

Media typeapplication/json
object
posts
Array<object>
object
id
string
accountId
string
platform
string
mediaIds
Array<string>
text
string
title
string
nullable
tags
Array<string>
publishAt
string format: date-time
nullable
tz
string
status
string
Allowed values: draft queued live failed
externalId
string
nullable
externalUrl
string
nullable
error
object
code
string
message
string
hint
string
nullable
attempts
integer
createdVia
string
Allowed values: ui api mcp
createdAt
string format: date-time
updatedAt
string format: date-time
statusLine

The post in one sentence, the same one the dashboard and an MCP agent show.

string
Example
{
"posts": [
{
"tz": "Europe/Kiev",
"status": "draft",
"createdVia": "ui",
"statusLine": "Queued. YouTube · What We Made · 12 Sep, 18:00 (Kyiv)."
}
]
}

Monthly post quota exceeded for the plan.

Media typeapplication/json
object
code
required
string
message
required
string
hint
string
Example
{
"code": "not_found",
"message": "The post does not exist.",
"hint": "Check the id and try again."
}

The key is missing the “write” scope, or this route needs a signed-in session instead of a key.

Media typeapplication/json
object
code
required
string
message
required
string
hint
string
Example
{
"code": "not_found",
"message": "The post does not exist.",
"hint": "Check the id and try again."
}

The plan has issues - see POST /posts/plan first.

Media typeapplication/json
object
code
required
string
message
required
string
hint
string
Example
{
"code": "not_found",
"message": "The post does not exist.",
"hint": "Check the id and try again."
}

More than 600 requests in ten minutes for this key, or the workspace hit 60 post requests in an hour.

Media typeapplication/json
object
code
required
string
message
required
string
hint
string
Example
{
"code": "not_found",
"message": "The post does not exist.",
"hint": "Check the id and try again."
}
Retry-After
integer

Seconds to wait.