Schedule many posts at once (CSV or rows)
bulk_scheduleChecks, and on request schedules, many posts at once: a CSV file's text (csv) or a list of rows (rows), each row one post with the columns date ("2026-10-12 09:00" in the row's or the upload's timezone, an ISO time with offset, or "next_slot"), networks ("linkedin, x"), text, optional text_ (each network its own text), media_urls (https links; video: or document: prefix), alt_text, first_comment (LinkedIn, Bluesky, Mastodon), x_reply and x_thread (X), title, brand and label. dry_run defaults to true: nothing is scheduled and the result lists, for every row, the time it would go out, its networks, each network's length as that network counts it, the X credits it would use, whether it would wait for approval or be held by the plan, and its errors and warnings. With dry_run false the upload is scheduled whole or not at all: if any row has an error nothing is scheduled (code bulk_rows_invalid) and each row says what to fix. The plan limits rows per upload (Free 20, Starter 500, Pro 1,000, Agency 2,000, Scale 5,000); on Free, posts past the 3 scheduled at a time are saved as held. The same upload twice is refused (code bulk_already_scheduled) unless allow_duplicate is true. The result has batch_id; DELETE /api/bulk/{batch_id} undoes the whole upload. Write the rows for the user when they describe a content plan; show them the dry run before scheduling.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| csv | No | The CSV file's text, first line = column names. Comma, semicolon or tab separated. | |
| rows | No | Instead of csv: the posts as objects with the same column names, e.g. [{"date":"2026-10-12 09:00","networks":"linkedin, bluesky","text":"…"}]. | |
| dry_run | No | true (default): only check. false: schedule every row, or none. | |
| brand_id | No | Default brand for rows without a brand column. | |
| timezone | No | IANA timezone for dates without one, e.g. "America/Lima". Default: each row's timezone column, else the brand's queue timezone. | |
| date_format | No | How to read dates like 12/10/2026. Default ymd (2026-10-12). | |
| fit_long_text | No | Accept a text over a network's limit and cut it at a sentence or word when published, instead of refusing the row. | |
| allow_duplicate | No | Schedule an upload identical to one already scheduled. |