Skip to main content
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’s visibility, 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.