Schedule a multi-platform post
Create one post with independent delivery targets across multiple connected accounts.
Create a scheduled post with one or more target_account_ids, an ISO-8601 publish_at, the brand timezone, and optional media and platform configurations. Set schedule_strategy to next_available when publish_at is the earliest acceptable time: App9 Post checks all active reservations for each account, moves busy targets to their next recommended slot, and returns each target's resolved publishAt independently.
What this means in practice
Create a scheduled post with one or more target_account_ids, an ISO-8601 publish_at, the brand timezone, and optional media and platform configurations. Set schedule_strategy to next_available when publish_at is the earliest acceptable time: App9 Post checks all active reservations for each account, moves busy targets to their next recommended slot, and returns each target's resolved publishAt independently.
Use the documented brand and account boundaries consistently across the scheduler, REST API, SDK, MCP tools, SSE consumers, and webhooks. That makes the same social operation explainable to an operator and reproducible by an integration.
Implementation checklist
Select connected accounts and intersect their capabilities.
Prepare common copy, media, and platform-specific overrides.
Call the preview endpoint and resolve all account-level errors.
Create the post with mode scheduled, optional schedule_strategy next_available, and a stable Idempotency-Key.
Observe target results through the results endpoint, SSE, or webhooks.
Example request
This example uses a server-side API key and an explicit brand selection. Replace placeholder values and keep credentials out of browser bundles, client logs, and source control.
curl --request POST \
--url 'https://postapi.app9.co/v1/social-posts' \
--header 'Authorization: Bearer APP9_POST_API_KEY' \
--header 'X-App9-Post-Brand: BRAND_ID' \
--header 'Content-Type: application/json' \
--data '{
"caption": "A single campaign, adapted for every channel.",
"mode": "scheduled",
"publish_at": "2026-08-20T15:00:00Z",
"schedule_strategy": "next_available",
"timezone": "UTC",
"target_account_ids": [
"acct_facebook",
"acct_instagram",
"acct_linkedin"
],
"media_ids": [
"media_launch_video"
],
"platform_configurations": {
"linkedin": {
"caption": "A longer professional update for LinkedIn."
}
}
}'Operational details
Due targets normally enter dispatch within the service scheduling window, not necessarily at an exact millisecond.
A post can become partially_succeeded when some target accounts succeed and others fail.
Scheduling is uncharged; credits are reserved when an individual target enters dispatch.
Recommended cadence is a growth-oriented distribution policy, not a provider API rate limit or delivery guarantee.
Current recommendations are Facebook three posts per rolling day; Instagram two; TikTok four; YouTube three; X, Threads, and Bluesky three; LinkedIn two; Pinterest five; Snapchat four; and WordPress one. Posts are spaced by two to six hours depending on the network instead of being released in a burst.
Common mistakes to avoid
- Do not create one unrelated post per network when a shared campaign needs unified audit and status.
- Do not reuse an idempotency key for a changed request body.
- Do not delete successful target evidence when retrying only failed targets.
Frequently asked questions
Can one target fail without canceling the others?
Yes. Every target has independent attempts and results, and the parent post can report partial success.
Does next_available change every target to the same time?
No. Each account receives its own cadence-safe publishAt, so a faster channel does not wait for a busier or slower channel.