Skip to main content
The posts endpoints are the core of the PostSider API. You can publish or schedule a post to one or more connected channels at once, list posts in a date range, validate a post before publishing, change its status, and delete it. Each post carries its own content per channel, so you can tailor the copy and media for each platform in a single call.

POST /public/v1/posts

Create a post across one or more channels. A single request can target multiple connected channels, each with its own content.

Request body

string
required
The post disposition: now publishes immediately, schedule books it for date, and draft saves it without publishing.
string
required
The target publish time in ISO 8601, interpreted as UTC, for example 2026-07-01T10:00:00Z. For now, use the current time.
The API DTO requires a date value for every post request, including draft. A draft is not published, but still carries a date used by the post record and calendar.
Optional. Whether to shorten links found in the content. Defaults to false.
array
required
One entry per channel. Each entry carries its own content.
string
required
The id of the connected channel to post to. Get ids from GET /public/v1/integrations.
array
required
An array of content objects. Most platforms take a single entry.
string
The text body of the post.
array
Optional media objects returned by POST /public/v1/upload or POST /public/v1/upload-from-url.
array
Optional tags, each an object with value and label.

Example

Posts are validated server-side with the same rules as the dashboard. If a channel’s content is invalid (for example too long, or missing a required field), the request returns 400 with a readable, per-channel message. Drafts skip most checks so you can save work in progress.

Response

The endpoint returns one entry per targeted channel, each with the created post id and the target channel id:
The full post object (content, state, media, settings) is available later through GET /public/v1/posts or GET /public/v1/posts/:id. Scheduling to Temporal starts asynchronously; a rejected channel is marked ERROR in the post record. For safe retries, send a stable Idempotency-Key header. Reusing the same key for the same organization returns the existing result instead of creating a duplicate post.
To schedule into a channel’s queue, first call GET /public/v1/find-slot/:id to get the next free time, then pass that value as date.

GET /public/v1/posts

List posts scheduled or published within a date range (UTC).

Query parameters

string
required
Range start, ISO 8601, for example 2026-06-01T00:00:00Z.
string
required
Range end, ISO 8601, for example 2026-06-30T23:59:59Z.
string
Optional channel group id to filter by.

Example

Response


GET /public/v1/posts/:id/missing

Returns the channel’s missing-media status for a post. PostSider marks a post as needing missing content when the provider reports media that is not yet available; this endpoint returns the missing content ids and URLs. It is not a general post validator - it only reports the provider-flagged missing-media case and returns an empty array otherwise.

Example


PUT /public/v1/posts/:id/status

Change the status of an existing post. The accepted values are the lowercase draft and schedule; schedule moves a draft into the publishing queue.

Request body

string
required
The new status. Valid values: draft, schedule.

Example

The response is { "id": "post_abc123", "state": "QUEUE" }. Any value other than draft or schedule returns 400.

DELETE /public/v1/posts/:id

Delete a post by id. Deleting a scheduled post removes it from the publishing queue. Deleting an already-published post removes it from PostSider’s records but does not remove the content from the social platform.

Example

Posts that belong to a group (such as a thread) are deleted together. To delete a whole group explicitly, use DELETE /public/v1/posts/group/:group.
Deletion is irreversible. To move a post to a different time, change its date in the dashboard or create a new post instead.

Approval endpoints

Approval is optional. Create a draft first, then submit it for review:
The status response includes the approval state, note, request time, and resolution time. An absent approval record returns { "status": "NONE" }.