---
title: "Get recommended posting times for a platform"
method: GET
path: "/analytics/best-times"
tags: ["Analytics"]
---

# Get recommended posting times for a platform

`GET /analytics/best-times`

Recommended day/hour posting slots for one platform, computed from the workspace's own posting history (publish time × engagement of every post published on that platform, recency-weighted, outlier-damped). Times are bucketed in the requesting user's timezone (overridable via `timezone`). When the workspace has fewer than 15 analyzed posts on the platform, a static industry-average table is returned instead — `basis` flips from `own_data` to `defaults` and `posts_needed` says how many more published posts unlock personalized recommendations. Grid scores are relative within the platform (100 = the best slot). Requires the `analytics:read` scope.

## Query parameters

- `platform` string, required
- `timezone` string

## Response `200`

Best-time grid and top recommendations

- object
  - `platform` string
  - `timezone` string — IANA timezone the day/hour buckets are expressed in
  - `basis` 'own_data' | 'own_data_and_audience' | 'audience' | 'defaults' — `own_data` = computed from this workspace's posts; `own_data_and_audience` = own posts blended with when the audience is online (Instagram, TikTok Business); `audience` = not enough posts yet, based on the audience-online profile only; `defaults` = industry averages (not enough history yet)
  - `sample_size` integer — Number of analyzed posts (published >72h ago, last 365 days)
  - `posts_needed` integer — How many more published posts unlock personalized recommendations (0 when basis is own_data)
  - `metric` string — Always `engagement` in v1 (shared cross-platform engagement formula)
  - `window_days` integer
  - `audience_online` object — Hour (0-23, in the response timezone) -> number of followers online, from the platform's audience-activity data. Present for Instagram and TikTok Business accounts with 100+ followers once the daily account snapshot has collected it.
  - `audience_online_date` string, date — Snapshot date of `audience_online`.
  - `grid` object[] — One entry per day/hour cell that has data (missing cells = no posts there). Scores are relative 0-100.
    - `day` 'monday' | 'tuesday' | 'wednesday' | 'thursday' | 'friday' | 'saturday' | 'sunday'
    - `hour` integer
    - `score` integer
    - `n` integer — Sample count behind the cell (±1h smoothed). Absent on defaults.
    - `typical_engagement` integer — Back-transformed typical engagement for the slot. Absent on defaults.
  - `recommendations` object[] — Top 3 slots, diversity-enforced (never two on the same day within 3 hours)
    - `day` string
    - `hour` integer
    - `time` string
    - `score` integer

## Other responses

- `400` — Missing/unknown platform or invalid timezone

---

[API](https://skmtc.dev/omnisocials/apis/omnisocials-api.md) · [All operations](https://skmtc.dev/omnisocials/apis/omnisocials-api/llms.txt) · [OpenAPI document](https://skmtc-service-production.skmtc.workers.dev/v1/apis/omnisocials/omnisocials-api/revisions/e53b89af0b98/schema)
