Skip to main content

Best Times to Post: GET /v1/best-times

Returns the best weekday-and-hour slots to post for one or more accounts, or for a whole platform. Every slot says what it is based on, so an agent never presents a guess as a measurement.

Request​

# One account
curl "https://app.posteverywhere.ai/api/v1/best-times?account_id=123&timezone=America/New_York" \
-H "Authorization: Bearer $POSTEVERYWHERE_API_KEY"

# Several accounts posted together: one combined pick in `combined`
curl "https://app.posteverywhere.ai/api/v1/best-times?account_ids=123,456"

# A platform, no account needed
curl "https://app.posteverywhere.ai/api/v1/best-times?platform=instagram"
ParamValuesDefault
account_id / account_idsOne id, or up to 20 comma separated (from GET /v1/accounts)-
platforminstagram, tiktok, youtube, linkedin, facebook, x, threads, pinterest, bluesky, telegram, discord, wordpress-
timezoneIANA timezone for the slotsyour profile timezone
countSlots per result, 1 to 105

Pass account_id(s) or platform. An account outside your organization (or outside a restricted key's accounts) returns 404 not_found.

Where the times come from​

Each result and each slot has a basis:

basisMeaning
personalMeasured from this account's own posts. Needs 30 or more posts with stats, published 3 to 90 days ago. Each post is compared with the account's own typical post at that time, so account growth and one viral post do not skew the result.
platformWhat works for PostEverywhere users on the same platform, in each poster's local time. Used when the account has fewer than 30 posts with stats, and to fill hours a personal account has rarely posted at.
generalGeneral guidance, not measured from any audience. Used where there is not enough data, for example on X, Telegram and Discord.

score is performance against a typical post: 1.25 means about 25% better. It is null for general guidance. Posts are ranked by engagement on most platforms, and by views on TikTok and YouTube (impressions on Pinterest).

Response​

{
"data": {
"timezone": "America/New_York",
"best_times": [
{
"account_id": 123,
"account_name": "Cafe Luna",
"platform": "instagram",
"basis": "personal",
"confidence": "medium",
"sample_size": 142,
"metric": "engagement",
"personal_progress": null,
"timezone": "America/New_York",
"slots": [
{
"day_of_week": 2,
"iso_weekday": 2,
"hour": 12,
"time": "12:00",
"label": "Tue 12:00 PM",
"basis": "personal",
"score": 1.31,
"next": { "date": "2026-10-06", "time": "12:00", "iso": "2026-10-06T16:00:00.000Z" }
}
],
"note": "Based on 142 of this account's Instagram posts from the last 90 days, compared with its own typical post."
}
],
"combined": null,
"next_best": { "label": "Tue 12:00 PM", "basis": "personal", "next": { "iso": "2026-10-06T16:00:00.000Z" } }
},
"error": null
}

Post at the best time​

next_best is the soonest of the top three slots, at least 30 minutes from now. Use next_best.next.iso as scheduled_for in POST /v1/posts.

  • MCP: get_best_times, and create_post / schedule_post take schedule_at: "best_time", which does this for you and tells you which time it picked.
  • CLI: posteverywhere best-times -a 123,456 or --platform instagram.

Results are cached for a few hours, so repeated calls are fast and return the same times.