---
title: "Get planning snapshot"
method: GET
path: "/api/businesses/{business_id}/planning-snapshot"
tags: ["businesses"]
---

# Get planning snapshot

`GET /api/businesses/{business_id}/planning-snapshot`

## Request

- Base URL: `https://api.mymarky.ai`
- URL: `https://api.mymarky.ai/api/businesses/{business_id}/planning-snapshot`
- Auth: HTTP bearer

Read everything a batch plan needs in one call: schedule, queue, topics, recent posts and library matches.

Call this once before planning several posts, instead of get_posting_schedule,
get_queue_summary, list_topics, list_posts and search_media_library one by
one. Each block says the same as its own tool, trimmed for planning: topics
are titles by category (no ids), and each recent post is one line with its
day, status and caption start. Call the individual tool when you need full
records or ids.

Errors:
    400 invalid_value: The business_id is not a valid UUID.
    401 authentication_required: API key or token is missing, invalid, or revoked.
    403 permission_denied: Your plan does not include API access, or this business is not in your org.
    404 resource_not_found: No business with that ID exists.
    422 invalid_request: More than 6 media_queries, or recent_days is outside 1-90.
    429 rate_limit_exceeded: You sent too many requests this minute.

## Path parameters

- `business_id` string, required: A UUID identifier.

## Query parameters

- `recent_days` integer: How many days of recent posts to include (1-90).
- `media_queries` string[], nullable: Up to 6 library searches to run, in plain words (e.g. 'our service truck'). Each returns up to 5 photos; a photo is only listed under the first query that found it.

## Headers

- `Marky-Version` '2026-04-08' | '2026-07-17' | '2026-08-02' | '2026-08-04' | '2026-08-06'

## Response `200`

Successful Response

- PlanningSnapshotResponse: Everything a batch plan needs, read in one call.
  - `schedule` SnapshotSchedule, required: The posting schedule, on the business's own clock.
    - `timeslots_local` string[], required: Weekly publish slots on the business's clock, e.g. 'MON 09:00'. Same values as get_posting_schedule.timeslots_local.
    - `timezone` string, nullable: IANA timezone the local slots are in, e.g. 'America/Chicago'. 'UTC' when the business has none set.
    - `paused` boolean, required: True while the schedule is paused: nothing in the queue publishes until it resumes.
  - `queue` SnapshotQueue, required: How full the daily queue is, and when it runs out.
    - `queued_count` integer, required: Posts waiting in the daily queue. Same as get_queue_summary.queued_count.
    - `runs_dry_at_local` string, nullable: When the LAST queued post is estimated to publish, on the business's clock, e.g. 'Fri Oct 2, 9:00 AM CDT'. After it nothing more goes out. Null when the queue is empty or no connected account can publish.
  - `topics` SnapshotTopics, required: The topics posts can be about. Call list_topics when you need topic ids.
    - `groups` SnapshotTopicGroup[], required: Enabled topics grouped by category, in the order list_topics returns them.
      - `category` string, nullable: Category name. Null for topics with no category.
      - `titles` string, required: Titles of the enabled topics in this category, newest first, separated by ' | '.
    - `disabled_count` integer, required: Topics that exist but are switched off. Not listed.
    - `truncated` boolean, required: True when the workspace has more topics than the snapshot reads; call list_topics for the rest.
  - `recent_posts` SnapshotRecentPosts, required: Posts created in the last `recent_days` days, newest first.
    - `posts` string[], required: One line per post, newest first: '<day> · <status> · <first 50 characters of the caption>', e.g. 'Sep 23 · PUBLISHED · Termites swarm in spring...'. The day is when it published, else when it is scheduled, else when it was written, on the business's clock. Rejected (trashed) posts are left out.
    - `truncated` boolean, required: True when more posts were created in the window than are listed; call list_posts to page through them.
  - `media_matches` SnapshotMediaMatch[], required: One entry per media query, in the order sent. Empty when no queries were sent.
    - `query` string, required: The search, as it was sent.
    - `media` SnapshotMedia[], required: Best matches first. A photo already listed under an earlier query is not repeated here.
      - `id` string, required: Media ID. Pass it in create_post's media_ids.
      - `alt_text` string, nullable: What the photo shows.
      - `type` string, nullable: image, video or audio.
      - `last_used_at_local` string, nullable: When it was last put on a post, on the business's clock. Null means it has never been posted.
      - `low_res` boolean: True when the longest side is under 1080px, so it may look soft on Instagram or Facebook. Same as search_media_library.low_res.

## Other responses

- `400`: Bad request — the input was malformed or otherwise invalid.
- `401`: Authentication failed — the API key is missing or invalid.
- `403`: Forbidden — the key is valid but may not access this resource.
- `404`: Not found — no resource matches the id in the path.
- `422`: Validation error — one or more fields failed validation.
- `429`: Rate limited — retry after the window resets (see Retry-After).
- `500`: Server error — something failed on our side; retry or quote X-Request-Id.

---

[API](https://skmtc.dev/mymarky/apis/marky-public-api.md) · [All operations](https://skmtc.dev/mymarky/apis/marky-public-api/llms.txt) · [OpenAPI document](https://skmtc.dev/mymarky/apis/marky-public-api/revisions/25aeacae455c?raw)
