Skip to main content
POST

Post type: now, schedule, or draft

The top-level type field controls when (and whether) the post is published: Drafts are how you stage content via the API without committing to a publish time, useful for content review workflows or pre-filling a calendar from an external CMS.
posts is required for every type, drafts included. Each entry must include an integration.id, or the request returns 400 Bad Request with the message All posts must have an integration id. A draft still has to be attached to at least one channel. There is no way to create a channel-less draft via the API.

Duplicating a post

There is no dedicated duplicate / clone endpoint. To copy an existing post, fetch it with GET /posts and submit the content as a new POST /posts request.
Strip the server-managed fields from the fetched object before you re-submit. Re-sending them either causes validation errors or, worse, accidentally updates the original. At minimum drop:
  • id and any nested post IDs
  • createdAt, updatedAt, and any other timestamps
  • state / status / releaseId (these are assigned by the scheduler)
  • Anything else the API did not ask you for when you originally created the post
Then set a fresh type (now, schedule, or draft) and date, and POST the cleaned object.

Provider-Specific Settings

When creating posts, each social media platform requires different settings. The settings object must include a __type field that identifies the platform.

Supported Platforms

Platforms Without Custom Settings

These platforms only need the __type field:
Platforms: threads, mastodon, bluesky, telegram, nostr, vk

Detailed Provider Settings

Schemas and examples for each platform: Provider Settings.

Body size

Do not inline image data. This endpoint falls back to the framework’s default body limit of roughly 100 kB, which a single base64 image clears easily, and you get a 413 PayloadTooLargeError before anything is validated.The 50 MB limit you may have read about applies to the internal routes the web interface uses, not to this one.
Upload first, then reference what comes back:
Once the upload has returned an id and a path, reference those two values instead of the file itself and the post body stays inside the 100 kB limit.
Upload a File lists the accepted types, and Upload from URL does the same for media already on the web.

Next steps

Every provider setting

The full schema each platform accepts, with a worked example.

Find your channel IDs

Every connected channel, with the integration.id each post entry needs.

Upload media first

The accepted file types, and the id and path you reference back here.

Read posts back

GET /posts, which is also step one of duplicating one.

Authorizations

Authorization
string
header
required

Your PostQueen API key

Body

application/json
type
enum<string>
required

Post type. update rewrites an existing post without starting a publishing workflow.

Available options:
draft,
schedule,
now,
update
date
string<date-time>
required

Publish date in UTC ISO format

Whether to use short links

tags
object[]
required
posts
object[]
required

The channels to post to and the content for each. Required for every type, drafts included: omitting it returns 400 'All posts must have an integration id'.

Minimum array length: 1
order
string

Order of posts

inter
number

Interval between posts

Response

200 - application/json

Post created successfully

postId
string
integration
string