Provider readinessInterfaces and provider certification may evolve. Check account capabilities before production use.Read the readiness contract

Schedule a multi-platform post

Create one post with independent delivery targets across multiple connected accounts.

Direct answer

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

  1. Select connected accounts and intersect their capabilities.

  2. Prepare common copy, media, and platform-specific overrides.

  3. Call the preview endpoint and resolve all account-level errors.

  4. Create the post with mode scheduled, optional schedule_strategy next_available, and a stable Idempotency-Key.

  5. 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.

Shell
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

Protect intent, tenant boundaries, and provider state.
  • 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.

Was this useful? This documentation is reviewed against the public App9 Post contract. Use the API reference and live capability response for machine-enforced details.

Open API reference