---
title: "List queued posts"
method: GET
path: "/api/businesses/{business_id}/queue"
tags: ["posts"]
---

# List queued posts

`GET /api/businesses/{business_id}/queue`

## Request

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

List the POSTS currently queued into this business's upcoming publish slots (what's lined up to go out). Distinct from get_posting_schedule (the recurring slot template) and get_queue_summary (aggregate fullness).

Each entry shows the post's position in the queue and the estimated time it
will publish (projected from the queue's recurring timeslots — approximate,
since it ignores jitter and skipped slots). Posts scheduled for an exact time
via `schedule` (adhoc) are NOT in this list; only daily-queue posts are.
For just "how full is the queue / when does it run dry", use
`GET /businesses/{business_id}/queue/summary` instead of paging this list.

Errors:
    400 invalid_value: The business_id is not a valid UUID.
    400 invalid_request: The cursor is malformed.
    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.
    429 rate_limit_exceeded: You sent too many requests this minute.

## Path parameters

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

## Query parameters

- `limit` integer: Max results per page (1-100)
- `cursor` string, nullable: The `next` value from the previous page's response, passed back verbatim. Leave it out for the first page. When `next` is null you have every result.

## Headers

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

## Response `200`

Successful Response

- QueuedPostsPage: The queued-posts listing plus the same aggregate `summary` block. Bundles in what `get_queue_summary` returns, so a caller paging the queue can see "how full is it / when does it run dry" without a second round-trip. Keeps the standard Page shape (`items` + `next`) and just ADDS `summary`; the summary counts the WHOLE queue, not just this page.
  - `items` QueuedPostResponse[], required: This page of results.
    - `post_id` string, required: The queued post's ID
    - `queue_id` string, required: ID of the daily queue this post belongs to.
    - `caption_preview` string, nullable: First ~140 characters of the caption.
    - `restrict_publish_to` string[], nullable: Platforms this post is restricted to. Null means ALL connected platforms.
    - `position` integer, required: 1-based rank in the queue (1 = next to publish).
    - `estimated_publish_time` string, nullable: Best estimate of when this post will publish, projected from the queue's recurring timeslots. Approximate (ignores jitter/skips). Null if it can't be computed.
    - `estimated_publish_time_local` string, nullable: The same moment in the business's timezone, ready to show a person, e.g. "Wed Sep 23, 6:00 PM MSK". Quote it as-is instead of converting the UTC value.
    - `warnings` FieldWarning[]: Advisory notes about when this post goes out (same codes as a post's queue.warnings). Never blocking.
      - `field` string, required: The field this warning is about, e.g. 'strategy', 'caption' or 'platform_overrides[0].caption'.
      - `code` string, nullable: Stable machine-readable code, e.g. 'cta_without_contact'. Branch on this, never on the message. Null on the older size-budget warnings.
      - `level` 'approaching_limit' | 'over_limit' | 'advisory', required: 'approaching_limit' = past the soft limit, act soon. 'over_limit' = past the hard limit, act now. 'advisory' = worth fixing before this publishes, but it may be intended.
      - `message` string, required: Plain-language explanation of what is wrong and how to fix it.
  - `next` string, nullable: Opaque cursor for the next page; null when there are no more. Pass it back verbatim as ?cursor=. Do not construct or decode it.
  - `summary` QueueSummaryResponse, required: Aggregate view of a business's daily queue — "how full is my queue?" in one cheap call.
    - `queued_count` integer, required: Number of posts waiting in the daily queue.
    - `next_estimated_publish_time` string, nullable: Estimated publish time of the NEXT queued post. Null when the queue is empty, no estimate can be computed, or the business has no connected account that can publish (the slot would pass with nothing going out).
    - `last_estimated_publish_time` string, nullable: Estimated publish time of the LAST queued post — i.e. when the queue runs dry. Null when the queue is empty, no estimate can be computed, or the business has no connected account that can publish.

## 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)
