---
title: "Get cached per-post analytics"
method: GET
path: "/uploadposts/post-analytics/cached"
tags: ["Platform Integration"]
---

# Get cached per-post analytics

`GET /uploadposts/post-analytics/cached`

Replays per-post metrics that Upload-Post already fetched, instead of calling the social platforms again. Because it never touches the platforms during the request, it is NOT subject to the platform analytics rate limit of 100 requests / 5 minutes that applies to the live /uploadposts/post-analytics endpoints, and it is paginated — built for re-reading a large back catalogue. IMPORTANT: this is a write-through cache filled as a side effect of live reads. A post appears here only after it has been fetched at least once through a live per-post endpoint, and there is no background refresh — captured_at is the last time that post was read live. To refresh a post, call the live endpoint for it.

## Query parameters

- `user` string, required
- `platform` 'instagram' | 'tiktok' | 'youtube' | 'facebook' | 'linkedin' | 'threads' | 'pinterest' | 'reddit'
- `limit` integer
- `cursor` string
- `since` string, date
- `until` string, date

## Response `200`

Cached post analytics retrieved successfully.

- object
  - `success` boolean
  - `profile_username` string
  - `platform` string, nullable — The platform filter applied, or null when none was requested.
  - `since` string, date
  - `until` string, date
  - `source` string — Always 'snapshot_cache' — a marker that these numbers came from the daily snapshot, not a live platform call.
  - `posts` object[]
    - `post_id` string — The post's native ID on the platform.
    - `platform` string
    - `profile_username` string
    - `date` string, date — Snapshot date this row belongs to.
    - `captured_at` string, date-time — The last time this post was fetched live from the platform. Use it to judge freshness; nothing refreshes it in the background.
    - `metrics` object — Metrics captured for this post. Keys vary per platform (e.g. YouTube returns views, likes, comments, favorites). Read the keys present rather than assuming a fixed schema.
    - `post_url` string, nullable
    - `media_type` string, nullable
    - `upload_timestamp` string, date-time, nullable
  - `limit` integer — The effective page size applied.
  - `next_cursor` string, nullable — Token to pass as 'cursor' on the next request. Null when there are no more pages.
  - `has_more` boolean

## Other responses

- `400` — Missing user, invalid platform, malformed since/until date, or an invalid cursor.
- `401` — Unauthorized — Invalid or expired token.
- `404` — Not Found — Resource does not exist.
- `500` — Internal Server Error.

## Changes

- **2026-07-31** `10bd964e4415` — 1 info
  - endpoint added

[Change history](https://skmtc.dev/upload-post/apis/upload-post-api/changes/uploadposts/post-analytics/cached/get.md)

---

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