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-schedule — Content-Type: application/json
| Field | Type | Required | Description |
|---|---|---|---|
posts | array | Yes | Array of post objects (max 100) |
timezone | string | Yes | IANA timezone for all posts (e.g. America/New_York) |
dryRun | boolean | No | If true, validate only — no posts are created. Default false. |
accountMapping | object | No | Platform-to-account-ID mapping. Overrides default account selection for platforms where you have multiple accounts. |
Post object fields (within posts array)
| Field | Type | Required | Description |
|---|---|---|---|
date | string | Yes | Date in YYYY-MM-DD format |
time | string | Yes | Time in HH:MM (24-hour) format |
content | string | Yes | Post text content |
platforms | string | Yes | Platform names or account IDs joined with + (e.g. instagram+facebook or 2280+2282) |
media | string | No | Filename 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
| Field | Type | Description |
|---|---|---|
dryRun | boolean | Whether this was a dry run |
scheduled | integer | Number of posts successfully scheduled |
failed | integer | Number of posts that failed |
results | array | Per-row results with row (0-based index), status, postId, and error |
batchErrors | array | Batch-level errors that block scheduling (e.g. X daily limit, subscription limit) |
batchWarnings | array | Warnings that don't block scheduling |
summary.totalRows | integer | Total rows in the request |
summary.validRows | integer | Rows that passed validation |
summary.errorRows | integer | Rows that failed validation |
summary.totalDestinations | integer | Total platform destinations created |
summary.platformBreakdown | object | Count of destinations per platform |
Request
Responses
- 200
- 400
- 401
- 422
- 429
Bulk schedule result
Invalid request parameters
Missing or invalid API key
Validation failed — batch errors prevent scheduling
Rate limit exceeded
Response Headers
Request limit per window
Remaining requests in current window
Unix timestamp when the window resets
Seconds to wait before retrying