GET
/v1/publications/{publicationId}/posts/slug/{postSlug}

Retrieve a post using its publication ID and its URL-friendly slug

Path Parameters

publicationId*string

Unique identifier of the publication

postSlug*string

URL-friendly identifier of the post

Length1 <= length <= 256

Query Parameters

includeContent?|

Include full content fields (markdown, json, staticHtml). Default: false

Response Body

Post details retrieved successfully

application/json
  1. response
id*string

Unique identifier for the post

title*string

Title of the post

Lengthlength <= 200
imageUrl?string

Optional URL to the post's main image

Formaturi
imageAlt?string

Alternative text describing the cover image, shown to screen readers and when the image fails to load

publishedAt?string

Epoch timestamp when the post was published

updatedAt?string

Epoch timestamp when the post was last updated

subtitle?string

Optional subtitle or brief summary

Lengthlength <= 300
slug*string

URL-friendly identifier for the post; accessible at paragraph.com/@[publicationSlug]/[slug]

Length1 <= length <= 256
staticHtml?string

Rendered HTML content of the post

json?string

TipTap JSON representation of the post content structure. This is the source of truth that the staticHtml and markdown is generated from

markdown?string

Markdown source of the post content

coinId?string

ID of the associated coin, if the post is coined

categories?array<string>

Categories/tags associated with this post

canonicalUrl?string

Canonical URL used in rendered metadata. This does not change the Paragraph permalink.

Formaturi
publishOnline?boolean

Whether the published post is visible on the public website

communityId?string

Subscriber segment id selected for newsletter delivery

authors?array<>

Authors of this post

authorIds?array<string>

IDs of the authors of this post

views?number

Total views. Only included when fetching your own posts via GET /v1/posts

status?string

Current publish status. Only set on authenticated endpoints (listOwn, getById for your own post). Use this instead of publishedAt to determine publish state — publishedAt is preserved across unpublishing.

Value in"published""draft""scheduled""archived"
curl -X GET "https://example.com/v1/publications/string/posts/slug/string"
{  "id": "string",  "title": "string",  "imageUrl": "http://example.com",  "imageAlt": "string",  "publishedAt": "string",  "updatedAt": "string",  "subtitle": "string",  "slug": "string",  "staticHtml": "string",  "json": "string",  "markdown": "string",  "coinId": "string",  "categories": [    "string"  ],  "canonicalUrl": "http://example.com",  "publishOnline": true,  "communityId": "string",  "authors": [    {      "id": "string",      "walletAddress": "string",      "avatarUrl": "http://example.com",      "publicationId": "string",      "name": "string",      "bio": "string"    }  ],  "authorIds": [    "string"  ],  "views": 0,  "status": "published"}

Update a post by ID PUT

Update an existing post in your publication. The publication is identified by the API key provided in the Authorization header. **Behavior:** - Only provided fields are updated; omitted fields remain unchanged - When `markdown` is provided, it replaces the full content. Rich blocks (embeds, buttons, callouts) created in the editor will be lost — the markdown to editor conversion is lossy for blocks without a markdown equivalent - Set `status` to `"published"` to publish a draft, `"draft"` to unpublish, or `"archived"` to archive - When editing an already-live post that should remain live, include `status: "published"` in the update and verify the returned post status before telling the writer it is live - Set `scheduledAt` (Unix timestamp in milliseconds) to schedule a draft's first-publish for a future time. Must be in the future and at most 30 days out. Only valid for posts that haven't been published or already scheduled. Pass `scheduledAt: null` to cancel a previously scheduled publish (or to reschedule: cancel first, then schedule again with the new time). Set `sendNewsletter: true` alongside `scheduledAt` to email subscribers when the post publishes. - Set `imageUrl` to update the post's cover/hero image; the URL is fetched, re-hosted, and a placeholder is generated. Pass `clearImage: true` to remove the existing cover. - Set `imageAlt` to describe the cover image for screen readers. It renders everywhere the cover appears, so set it whenever you set `imageUrl`.

Get post by publication slug and post slug GET

Retrieve a post using its publication's slug and the post's slug. This is useful for building user-facing URLs.