Threads

Put a thread on the global feed

Promotes a thread from the newsletter's own space to Commune's global feed, where anyone can read it. Needs content: write. One thread at a time: there is no automatic promotion and no bulk form.

It is not reversible through this API. A thread can be taken back off the feed in Commune itself, but no operation here does it. Treat the promotion as a decision rather than a toggle.

A thread that is already public is a success rather than a conflict, changes nothing, and publishes no event.

Replies are not threads and answer 422. A reply is exactly as readable as the thread it is in, so promote the thread instead.

Takes no body: there is only one visibility this moves a thread to.

Publishes thread.published, carrying the visibility the thread had before, unless it was already public.

post/threads/{thread}/publish

Request

  • Base URL: https://api.usecommune.com
  • URL: https://api.usecommune.com/threads/{thread}/publish
  • Auth: one of:
    • HTTP bearer
    • OAuth 2 (authorization code, authorization URL https://usecommune.com/api/oauth/authorize, token URL https://usecommune.com/api/oauth/token, scopes: content:write)

Response

The thread, now public.

object'thread' required

Always thread.

idstring uuid required

Stable identifier.

short_idstring nullable

Eight character base62 identifier used by the thread's own URL at /n/{handle}/chat/{short_id}. Null for a thread Commune opened under an article, which is reached through the article instead.

contentstring required

The opening message. HTML, since people format what they write. Treat it as untrusted markup and render it in a sandboxed context.

visibility'public' | 'subscribers' required

Where a thread is placed. public puts it on the global Commune feed and makes it readable by anyone. subscribers keeps it inside the newsletter. Set and changed by the newsletter's team.

A third value, paid, was in this enum until 2026-10-10. It was never produced by anything and no thread ever carried it, so it was removed rather than left as a state consumers had to handle. See Removals under Versioning.

is_article_threadboolean required

true when Commune opened this thread under an article rather than a person starting it. These are kept off the global feed, because the article card already represents the conversation there.

reply_countinteger

Undeleted replies in the thread, at any depth.

view_countinteger

How many times the thread was opened.

created_atstring date-time required

When the thread was opened.

updated_atstring date-time

When the thread row last changed for any reason.

edited_atstring date-time nullable

When the author last edited the opening message. Null when it was never edited, which is what drives the edited marker in the product.

last_activity_atstring date-time required

When the thread last received a reply, or when it was opened if it never did. This is the sort key for the thread list.

Example response

{
  "newsletter": {
    "object": "newsletter",
    "id": "9a4c1c6e-0f2b-4f47-9d3f-6d1b1a2c3d4e"
  },
  "author": {
    "object": "newsletter",
    "id": "9a4c1c6e-0f2b-4f47-9d3f-6d1b1a2c3d4e"
  },
  "article": {
    "object": "newsletter",
    "id": "9a4c1c6e-0f2b-4f47-9d3f-6d1b1a2c3d4e"
  }
}

Changes

No recorded changes to this operation across all 1 revision of this API.