Skip to main content

Bulk schedule posts

POST 

/posts/bulk-schedule

Schedule multiple posts at once from a CSV-like structure. Upload up to 100 posts in a single request.

Use dryRun: true to validate without creating posts.

Example:

{
"posts": [
{"date": "2026-04-01", "time": "09:00", "content": "Morning post!", "platforms": "instagram+facebook"},
{"date": "2026-04-01", "time": "12:00", "content": "Afternoon update", "platforms": "2280+2282", "media": "photo.jpg"}
],
"timezone": "America/New_York"
}

The platforms field accepts platform names (instagram+facebook+x) or account IDs (2280+2282) or a mix of both. Use account IDs when you have multiple accounts on the same platform.

The media field references filenames from your Media Library. Upload media first via POST /media/upload, then use the filename here.

Rate limits: Max 100 posts per upload. X posting limits still apply per plan (Trial: 10/day, Starter: 50/day, Growth: 150/day, Pro: 500/day).

Request Body Schema

POST /posts/bulk-scheduleContent-Type: application/json

FieldTypeRequiredDescription
postsarrayYesArray of post objects (max 100)
timezonestringYesIANA timezone for all posts (e.g. America/New_York)
dryRunbooleanNoIf true, validate only — no posts are created. Default false.
accountMappingobjectNoPlatform-to-account-ID mapping. Overrides default account selection for platforms where you have multiple accounts.

Post object fields (within posts array)

FieldTypeRequiredDescription
datestringYesDate in YYYY-MM-DD format
timestringYesTime in HH:MM (24-hour) format
contentstringYesPost text content
platformsstringYesPlatform names or account IDs joined with + (e.g. instagram+facebook or 2280+2282)
mediastringNoFilename from your Media Library

Full Request Example

{
"posts": [
{
"date": "2026-04-01",
"time": "09:00",
"content": "Good morning! Starting the week with fresh energy.",
"platforms": "instagram+facebook+linkedin"
},
{
"date": "2026-04-01",
"time": "12:00",
"content": "Lunchtime inspiration: our team is working on something big.",
"platforms": "x+threads",
"media": "team-photo.jpg"
}
],
"timezone": "America/New_York",
"dryRun": false,
"accountMapping": {
"instagram": 2280,
"facebook": 2278
}
}

Response Example

200 — Bulk schedule result

{
"data": {
"dryRun": false,
"scheduled": 2,
"failed": 0,
"results": [
{
"row": 0,
"status": "scheduled",
"postId": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
"error": null
},
{
"row": 1,
"status": "scheduled",
"postId": "a8b9c0d1-e2f3-4567-89ab-cdef01234567",
"error": null
}
],
"batchErrors": [],
"batchWarnings": [],
"summary": {
"totalRows": 2,
"validRows": 2,
"errorRows": 0,
"totalDestinations": 5,
"platformBreakdown": {
"instagram": 1,
"facebook": 1,
"linkedin": 1,
"x": 1,
"threads": 1
}
}
},
"error": null,
"meta": {
"request_id": "a1b2c3d4",
"timestamp": "2026-04-10T12:00:00.000Z"
}
}

Response fields

FieldTypeDescription
dryRunbooleanWhether this was a dry run
scheduledintegerNumber of posts successfully scheduled
failedintegerNumber of posts that failed
resultsarrayPer-row results with row (0-based index), status, postId, and error
batchErrorsarrayBatch-level errors that block scheduling (e.g. X daily limit, subscription limit)
batchWarningsarrayWarnings that don't block scheduling
summary.totalRowsintegerTotal rows in the request
summary.validRowsintegerRows that passed validation
summary.errorRowsintegerRows that failed validation
summary.totalDestinationsintegerTotal platform destinations created
summary.platformBreakdownobjectCount of destinations per platform

Request

Responses

Bulk schedule result