Posts

Get post

Reads one post's current content, status, assigned account, and version number. An X post also carries its tweets or article. A published post also carries an analytics block (full metrics, outliers, media URLs; a LinkedIn post is refreshed live first) when the key has analytics:read, or analyticsUnavailableReason while none are stored yet. A post only imported from LinkedIn analytics comes back as a published post with postivPostId null.

GET/api/public/posts/:id
cURLGET /api/public/posts/:id
curl "https://postiv.ai/api/public/posts/ID_ID" \
  -H "Authorization: Bearer pk_postiv_..."
200Response
{
  "success": true,
  "post": {
    "id": "post1...",
    "channel": "linkedin",
    "parentPostId": null,
    "title": null,
    "status": "draft",
    "content": "Most founders think...",
    "integrationId": 1234,
    "profile": {
      "id": 1234,
      "name": "Jan",
      "headline": "Founder",
      "picture": "https://..."
    },
    "latestVersion": 1,
    "hasImage": false,
    "openInPostivUrl": "https://postiv.ai/app/create?postId=post1..."
  }
}

Authorization

Requires an organization API key with the posts:read scope, sent as Authorization: Bearer or x-api-key.

Path parameters

idstringrequired

A Postiv post id or an analytics post id: any posts[].id from List posts, or the id from Create post.

Response

Full post object.

post.id / title / type / status / content / orgId / integrationId / templateId / planItemIdmixed
post.channelstring

Channel of the post.

post.parentPostIduuid|null

Links the versions of one post across accounts (see the MCP tool add_post_version).

post.formatstring

X posts only: single, thread or article.

post.tweets[]array

X single or thread posts: each { text, assets, length }. assets lists the tweet's images (assetId, alt); length is { length, valid, remaining } by X's weighted count.

post.headline / body / cover / images / paragraphCountmixed

X articles only: headline, body in markdown (the format create-post and update-post take), the cover, the inline images (each with the paragraph it follows) and the paragraph count. content is the plain text of an X post.

post.profileobject|null

{ id, name, headline, picture }: picture is fully resolved here (S3 signed URL or LinkedIn CDN upload fallback), unlike the list endpoint.

post.scheduledTime / queueStatus / latestVersion / hasImage / tags / author / openInPostivUrl / createdAt / updatedAtmixed
post.deliveryobject|null

Latest publish attempt, or null if the post was never scheduled: { status, scheduledTime, lastError, connectionIssue, canReschedule } and, for X, { items: [{ index, status, url }], confirmedCount, totalCount }. status is queued, publishing, pending_approval, changes_requested, approval_denied, approval_expired, failed, partially_published (some tweets of an X thread are live) or published. lastError is a readable reason for a failed attempt; connectionIssue means reconnect the account first. canReschedule means the failed attempt put nothing live: retry an X post with a new time (reschedule), or move a LinkedIn post back to draft (unschedule) and schedule it again. An X item status is pending, in_flight, confirmed, unknown or rejected; url is set once confirmed.

post.imagesarray

[{ imageId, url }] for every image saved on a LinkedIn draft, in publish order (up to 20; two or more publish as a multi-image post). Present only when the post has images. post.media is the most recently changed one. Scheduling without media publishes all of them.

post.carouselobject|null

{ id, title, slideCount } for a carousel saved on a draft, or { id, title, slideCount, versionId } for the carousel a scheduled post's queue entry publishes; null otherwise. Use get_carousel for its slides.

post.videoobject|null

{ assetId, title, fileName, contentType, url } for a video saved on a LinkedIn draft; null otherwise. url is a signed, expiring download URL.

post.pdfobject|null

{ fileName, url } for a PDF carousel saved on a LinkedIn draft or queued on a scheduled post; null otherwise. url is a signed, expiring download URL.

Errors

404post_not_found

Good to know

  • Posts with status scheduled/published are locked against edits (see update-post).
  • For an X post content is the plain text and format, tweets (or the article's headline, body, cover and images) sit beside it. Take assetId values for update-post or detach-post-media from there.