Posts

Fetch one public post by ID.

GET https://api.menofhunger.com/v1/public/posts/:id

Try it

Every post link looks like menofhunger.com/p/<id>. Paste the whole link or just the ID.

curl https://api.menofhunger.com/v1/public/posts/:id

Response

Trimmed for readability.

{
  "data": {
    "id": "cm4x8f2p1k0001qab3d7yh2m9z",
    "createdAt": "2026-07-14T13:02:41.518Z",
    "editedAt": null,
    "body": "Discipline is remembering what you want.",
    "kind": "regular",
    "visibility": "public",
    "topics": ["discipline"],
    "hashtags": [],
    "cashtags": [],
    "boostCount": 42,
    "commentCount": 7,
    "repostCount": 3,
    "bookmarkCount": 11,
    "viewerCount": 1280,
    "totalViewCount": 1540,
    "parentId": null,
    "media": [],
    "poll": null,
    "author": {
      "id": "cm4x8ez4mn0000qab3g1r5t8kv",
      "username": "menofhunger",
      "name": "Men of Hunger",
      "avatarUrl": "https://menofhunger.com/…",
      "verifiedStatus": "identity",
      "premium": true
    }
  }
}

Fields

id
string
body
string
Plain text. Mentions, #hashtags, and $cashtags stay inline.
createdAt / editedAt
ISO 8601 string
kind
"regular" | "checkin" | "repost" | "articleShare"
author
object
id, username, name, avatarUrl, verifiedStatus, premium.
media
array
Each has url, kind ("image" | "gif" | "video"), width, height, alt.
topics / hashtags / cashtags
string[]
boostCount, commentCount, repostCount, bookmarkCount, viewerCount, totalViewCount
number
viewerCount is unique people; totalViewCount is accepted impressions.
parentId
string | null
Set when the post is a reply.
poll
object | null
Options with voteCount and percent, plus endsAt.
viewer*
false | []
Present but always empty — there is no viewer on a public call.

404s

Drafts, deleted posts, group posts, and anything not set to public visibility all return 404 — the same as an ID that never existed.