---
title: "Get one post with its per-account delivery state"
method: GET
path: "/posts/{postId}"
tags: ["Posts"]
---

# Get one post with its per-account delivery state

`GET /posts/{postId}`

## Request

- Base URL: `https://www.juzpost.com/api/cli/v1`
- URL: `https://www.juzpost.com/api/cli/v1/posts/{postId}`
- Auth: HTTP bearer

Returns the full post including free-form `metadata` and a `targets` array holding one
entry per social account the post fans out to, each with its own status, fire time and
error. Use this to check what actually happened after scheduling, since the post-level
`status` is only a coarse summary. A post that is not yours is reported as `404`.

## Path parameters

- `postId` string, uuid, required

## Response `200`

The post and its per-account targets.

- Post: A post with its metadata and per-account delivery state.
  - `id` string, uuid, required: The post id.
  - `status` string, required: Coarse lifecycle summary. Prefer `targets` when you need to know the real state per account.
  - `type` 'text' | 'image' | 'video' | 'story' | 'blog', required: What kind of content the post carries. Anything other than `text` and `blog` must have at least one media key before it can be scheduled. `blog` is a WordPress blog post: `title` is required and `description` is the body, HTML sent as written (plain text works, blank lines become paragraphs). The first image is the featured image and any others are added under the body. Images only.
  - `content` string, required: The post body or caption.
  - `mediaUrls` string[], required: Storage keys of the post's media. Empty when there is none.
  - `coverR2Key` string, nullable, required: Storage key of the cover image, or null if none was set.
  - `scheduledFor` string, date-time, nullable, required: The post-level scheduled fire time, or null if unscheduled.
  - `metadata` object, required: The post's public metadata: `title`, `description` and `hashtags`, plus `source` and `client` when the post was created through the API or a connector. Other internal keys are never returned.
    - `title` string: The post title, if one was set.
    - `description` string: The long-form description, if one was set.
    - `hashtags` string[]: Hashtags without the leading `#`, if any were set.
    - `source` string: `connector` when the post was created through the API or an MCP connector.
    - `client` string: The API key or connector client that created the post.
  - `socialAccountIds` string[], required: Convenience list of the accounts this post fans out to, the same ids that appear in `targets`.
  - `targets` PostTarget[], required: One entry per account the post fans out to. Empty until the post is scheduled.
    - `socialAccountId` string, uuid, nullable, required: The social account this target publishes to.
    - `platform` string, nullable, required: The account's platform id, e.g. `instagram`; null if the account was removed.
    - `username` string, nullable, required: The account's handle on that platform; null if unknown or the account was removed.
    - `status` string, nullable, required: Delivery state for this account, typically `pending`, `scheduled`, `uploading`, `published` or `failed`.
    - `publishAt` string, date-time, nullable, required: When this account's copy is due to fire, or null if not scheduled.
    - `publishedAt` string, date-time, nullable, required: When this account's copy actually went live, or null if it has not.
    - `error` string, nullable, required: Why this account's copy failed, or null if it has not failed.
    - `link` string, uri, nullable, required: Where this account's copy lives on the platform, or null when it has not been published or the platform gives no link. For a WordPress draft this is the wp-admin edit page, which opens only for a user signed in to that site.
    - `blueskySettings` BlueskySettings, required: Alt text for each file one Bluesky account publishes, and the content warning labels on the post. Stored on that account's copy and returned on `GET /posts/{postId}`.
      - `altText` string[], required: One entry per file, in the order that account publishes them. Use an empty string for a file with no description. The count must equal the number of files, or the request fails with `400`.
      - `labels` string[], required: Content warnings. At most one of `sexual` (Suggestive), `nudity` or `porn` (Adult), plus `graphic-media`. Only on posts with images or video. Bluesky leaves posts labeled `sexual`, `porn` or `graphic-media` out of feeds for people who have not turned on adult content. Send `[]` for none.
    - `wordpressSettings` WordPressSettings, required: How one WordPress account's copy of a blog post is created. Every field is optional. Stored on that account's copy and returned on `GET /posts/{postId}`.
      - `status` 'publish' | 'draft': `publish` (the default when omitted) or `draft`, which creates a WordPress draft for the site's author to review.
      - `categories` string[]: Category names. Each must already exist on the site; an unknown name fails with `400` listing the site's categories.
      - `tags` string[]: Tag names. A tag the site does not have yet is created.
      - `slug` string: The URL slug. Made from the title when omitted.
      - `excerpt` string: Short summary shown in feeds and link previews.
      - `featuredImageAlt` string: Alt text for the featured image, which is the post's first image.
      - `seo` object: Yoast SEO fields. Only for an account whose site lets it write them; otherwise the request fails with `400`.
        - `title` string: SEO title shown in search results instead of the post title.
        - `description` string: Meta description. Yoast prints none when this is omitted.
        - `focusKeyphrase` string: Yoast focus keyphrase.
  - `createdAt` string, date-time, required: When the post was created.
  - `updatedAt` string, date-time, required: When the post was last modified.

## Other responses

- `401`: No bearer token was sent, or the token is unknown, revoked or malformed. Run the device login again to obtain a new token.
- `402`: The plan behind this token does not include the capability this operation needs. `error.details.requiredPlan` names the tier that does. This is never a token problem, so do not retry without changing the plan.
- `404`: No such resource. A resource that belongs to someone else is also reported here, so this never confirms whether another tenant's id exists.

---

[API](https://skmtc.dev/juzpost/apis/juzpost-rest-api.md) · [All operations](https://skmtc.dev/juzpost/apis/juzpost-rest-api/llms.txt) · [OpenAPI document](https://skmtc.dev/juzpost/apis/juzpost-rest-api/revisions/19296da24f95?raw)
