---
title: "Get sync job status"
method: GET
path: "/analytics/sync/{job_id}"
tags: ["Analytics"]
---

# Get sync job status

`GET /analytics/sync/{job_id}`

## Request

- Base URL: `https://api.shortsync.app/v1`
- URL: `https://api.shortsync.app/v1/analytics/sync/{job_id}`
- Auth: HTTP bearer

Poll a sync job's status. Requires the `analytics:read` scope only.
Observing your own jobs is a read operation, so no write scope is
needed.

## Response `200`

Job status.

- object
  - `data` AnalyticsSyncJob, required
    - `job_id` string, uuid, required
    - `status` 'queued' | 'running' | 'completed' | 'failed' | 'canceled', required
    - `platform` string, nullable, required: The narrower filter from the POST body, or `null` when the sync ran across every platform.
    - `requested_at` string, date-time, required
    - `started_at` string, date-time, nullable, required
    - `completed_at` string, date-time, nullable, required
    - `progress` object, required
      - `posts_synced` integer, required: Running total across every platform in the sync.
      - `posts_total` integer, required: Best-known denominator. May grow mid-sync if video discovery finds new posts.
    - `per_platform` AnalyticsSyncJobPlatformResult[], required
      - `platform` 'instagram' | 'tiktok' | 'youtube' | 'facebook' | 'snapchat' | 'pinterest' | 'threads' | 'twitter' | 'bluesky' | 'linkedin' | 'reddit' | 'telegram' | 'mastodon' | 'discord' | 'tumblr' | 'pixelfed' | 'google_business', required
      - `posts_synced` integer, required
      - `total_posts` integer, required
      - `has_more` boolean, required: True when the platform still has posts beyond this batch. Trigger another sync after this one completes to page further.
      - `next_offset` integer, required
      - `error` string, nullable
    - `error` string, nullable, required: Human-readable summary of any per-platform errors. Non-null when at least one platform reported an error.

## Other responses

- `401`: Missing, malformed, or revoked token.
- `403`: Token is valid but cannot access this resource. Common cases: - `INSUFFICIENT_SCOPE` - token lacks the required scope. - `WORKSPACE_NOT_ALLOWED` - account token is allowlisted to other workspaces.
- `404`: Resource does not exist or is not visible to this token.
- `429`: Per-key sliding-window rate limit (60 req/min), per-org monthly request quota, or per-user upload cap was hit. `RATE_LIMIT_EXCEEDED` carries the window headers; `QUOTA_EXCEEDED` carries `details.quota` (which counter), `used`, `limit`, `resets_at`, and `upgrade_url`. `UPLOAD_QUOTA_EXCEEDED` (Free tier on `POST /posts` only) carries the same shape plus `details.remaining`.

---

[API](https://skmtc.dev/shortsync/apis/shortsync-api.md) · [All operations](https://skmtc.dev/shortsync/apis/shortsync-api/llms.txt) · [OpenAPI document](https://skmtc.dev/shortsync/apis/shortsync-api/revisions/71fdaef1e400?raw)
