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.
/api/public/posts/:idcurl "https://postiv.ai/api/public/posts/ID_ID" \
-H "Authorization: Bearer pk_postiv_..."{
"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
idstringrequiredA 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 / planItemIdmixedpost.channelstringChannel of the post.
post.parentPostIduuid|nullLinks the versions of one post across accounts (see the MCP tool add_post_version).
post.formatstringX posts only: single, thread or article.
post.tweets[]arrayX 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 / paragraphCountmixedX 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 / updatedAtmixedpost.deliveryobject|nullLatest 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
| 404 | post_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.