POST /social/posts/bulk schedules up to 50 posts in one call. Send a JSON posts array, or the contents of a CSV file as the csv string. Run the free POST /social/posts/bulk/validate first: it checks every row and creates nothing.
The bulk scheduler in the SmartlyQ app reads CSV files with the same code and the same columns, so a file that works in the app works here, and the other way round.
CSV columns
The first line names the columns. Column names are not case-sensitive, and the order does not matter.
List cells (
platforms, account_ids, media_urls) are split on |. platforms and account_ids may also use commas. In media_urls a comma only starts a new link when the next link begins with http, because some image links contain commas.
A file can use ; or a tab instead of a comma between cells, as Excel does in some languages. A UTF-8 byte-order mark is ignored.
Platform option columns
Any platform option can be a column, named<platform>.<field>:
A value can be the option itself or its label:
private, Only Me and only_me all mean the same for tiktok.visibility. An option column applies only to rows that post to that platform. A column name we do not know rejects the whole file with VALIDATION_ERROR and lists the unknown names in details.unknown.
Example
Checks
Every row gets the same checks as a single post: caption length and media per platform, the platform rules (for example TikTok’svisibility, which has no default), and the 24-hour same-text guard. The validate call reports them per row. The create call rejects the whole batch for structural problems before anything is created and refunds the charge; a row that fails after that is reported in results.
