Skip to main content
POST
Every request carries the same five fields: type, date, shortLink, tags and posts. One date applies to every channel in the request: a date inside an entry of posts is ignored. To give channels different times, send one request per time. Each entry in posts is one channel, and each item in its value list is one part of the post: the first is the post, the rest are its thread or comments. The request examples on this page show whole requests for Bluesky, Nostr, WordPress and DEV. A step-by-step guide, from finding the channel id to checking the result, is Schedule a post with the API.

type

A draft is checked too: the body, each network’s required settings, and that every item has text or media. The network’s rules on length and media are checked only when the post is set to go out (schedule, now and update), and again when you move a draft to schedule with Change post status. So a draft that was accepted can still be refused then.

Two fields that are easy to miss

  • image is required on every item of value. Send [] for text only. Leaving it out answers 400 with posts.0.value.0.image must be an array.
  • group deletes. Leave it out for a new post. When it names an existing group, every post of that group that the request does not resend is deleted.
  • shortLink changes nothing today. It is required, but PostQueen has no link shortener set up, so links stay as written with true too.
Every field, with its type, is in the body schema on this page. Media must be uploaded first. A post’s media path must end in .png, .jpg, .jpeg, .gif, .webp or .mp4, and a video must be ready: see Upload a file.

Link to another post

Write (post:ID) in a content, with the id of another post of your workspace, and PostQueen replaces it with that post’s address on its network when this post is published. Use it to point a new post or a comment at an earlier one:
The id is a postId from this endpoint’s answer or an id from List posts. The address is read at publish time, so the other post has to be published first. When it has no address by then, or the id is not a post of your workspace, the placeholder is removed and the rest of the text goes out.

Settings by network

settings.__type is always set from the channel, so you may leave it out; what matters is the shape of the rest. Networks without required settings need no settings at all. Every field of every network, with examples: Posting settings by network.

What comes back

A 201 with one row per channel entry. Keep the postIds: the other post endpoints take them.
When a part breaks a network’s rule, the call answers 400 before anything is saved, naming the network and the channel:
A channel id that is not a channel of your workspace, or a channel that was deleted, answers 400 with Integration with id <id> not found, and nothing is saved. Take the ids from List channels. Every status the endpoint returns, and what to do about it, is on Limits and errors.

Changing or copying a post

  • Change a scheduled post. Send it again with value[].id set to the id of each part you keep, and its group from List posts so the parts you leave out are deleted. Use update with the post’s current date to change its text or media without touching the schedule, or schedule with a new date to move it. To change only its settings, Update post settings is simpler.
  • update needs the id of the main post. In each entry of posts, value[0].id must be the id of a post in your workspace, and of the post itself, not of one of its comments. A missing, mistyped or deleted id is refused with 400 before anything is saved:
    Take the ids from List posts. Later items of value with a new id, or none, are added to the post as new comments or thread items.
  • Publish a post again. schedule or now with the id of a post that was already published is refused with 400. Add "republish": true if you mean it.
  • Copy a post. There is no copy endpoint. Read the post with List posts, parse its settings and image (they come back as JSON strings), and send the content as a new post without any post ids or group.

Size and rate limits

Do not put file data in the body. This endpoint takes about 100 kB of JSON, which one base64 image exceeds, and answers 413 before anything is checked. Upload the file first and send its id and path.
A workspace can send 30 POST /posts requests an hour. A request refused with 400 during validation, such as a missing setting or a post that is too long, gets its slot back. A refusal once the posts are being created, such as a republish without republish or “Media not found”, counts. One request can carry many channels and a whole thread, and it counts once. See Limits and errors.

Authorizations

Authorization
string
header
required

Your API key from Connections > API Keys, or an OAuth access token (pos_...). Send it as it is, with no Bearer prefix.

Body

application/json
type
enum<string>
required

schedule queues the post for date, and publishes it at once when date has already passed. now publishes at once. draft saves it without publishing. update changes posts named by value[].id without starting a new publish. Its value[0].id must be the id of a main post of the workspace, not of a comment, or the request is refused with 400

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

Publish date and time in UTC, ISO 8601. Required for every type; now uses the current minute instead. A date in the past with schedule publishes at once. It applies to every entry in posts: a date inside an entry is ignored

Replace links in the text with PostQueen short links. Required; send false to keep links as they are. PostQueen has no link shortener set up today, so true leaves links as they are too

tags
object[]
required

Tags to attach. Required: send [] for none

posts
object[]
required

One entry per channel. Each entry becomes its own post with its own group

Minimum array length: 1
order
string

Accepted and not used

inter
integer

Repeat the post every this many days. Leave it out for a post that goes out once

Required range: x >= 1
republish
boolean

Needed to publish again a post that was already published (schedule or now with a value[].id of a published post). Without it the request is refused with 400

Response

Saved. One row per channel entry

postId
string
integration
string
Last modified on October 9, 2026