Skip to main content

Forem API V1 (1.0.0)

Download OpenAPI specification:Download

Access Forem articles, users and other resources via API. For a real-world example of Forem in action, check out DEV. All endpoints can be accessed with the 'api-key' header and a accept header, but some of them are accessible publicly without authentication.

    Dates and date times, unless otherwise specified, must be in
    the [RFC 3339](https://tools.ietf.org/html/rfc3339) format.

agent_sessions

list the authenticated user's agent sessions

Retrieve a list of the authenticated user's agent sessions.

Agent Sessions Overview:

  • Agent sessions represent coding conversation transcripts uploaded from CLI tools (like Claude Code).
  • Used by the developer portal to render interactive walkthroughs or session summaries.
  • Requires authentication.
Authorizations:
api-key

Responses

Response samples

Content type
application/json
[
  • {
    }
]

upload a new agent session

Upload a new agent session.

S3 Upload Workflow:

  1. Call the S3 presign endpoint to obtain a direct upload URL for the raw session transcript file.
  2. Upload the raw transcript to S3.
  3. Send a POST request to this endpoint with the S3 key (s3_key) and the pre-parsed, curated JSON payload (curated_data).
Authorizations:
api-key
Request Body schema: application/json

Agent session upload parameters.

title
string

Title for the session (auto-generated if omitted)

curated_data
required
string

JSON string of curated session data with messages array and metadata.

s3_key
string

S3 object key from presign endpoint (optional).

tool_name
string
Enum: "claude_code" "codex" "gemini_cli" "github_copilot" "opencode" "pi"

Tool that produced the session (e.g. claude_code, codex).

Responses

Request samples

Content type
application/json
{
  • "title": "string",
  • "curated_data": "string",
  • "s3_key": "string",
  • "tool_name": "claude_code"
}

Response samples

Content type
application/json
{
  • "id": 0,
  • "slug": "string",
  • "title": "string",
  • "tool_name": "string",
  • "total_messages": 0,
  • "published": true,
  • "created_at": "2019-08-24T14:15:22Z",
  • "updated_at": "2019-08-24T14:15:22Z",
  • "url": "string"
}

show details for an agent session

Retrieve details for a single agent session by unique slug or ID.

Integration Tip:

  • Returns the complete session structure including parsed message logs, token counts, slices, and tool execution metadata.
Authorizations:
api-key
path Parameters
id
required
string
Example: my-session-abc123

The unique slug or ID of the agent session.

Responses

Response samples

Content type
application/json
{
  • "id": 0,
  • "slug": "string",
  • "title": "string",
  • "tool_name": "string",
  • "total_messages": 0,
  • "curated_count": 0,
  • "published": true,
  • "metadata": { },
  • "messages": [
    ],
  • "slices": [
    ],
  • "created_at": "2019-08-24T14:15:22Z",
  • "updated_at": "2019-08-24T14:15:22Z",
  • "url": "string"
}

analytics

Retrieve analytics totals

Retrieve aggregated lifetime stats (views, reactions, comments) for articles.

Scope Control:

  • Specify article_id to query a single post's metrics.
  • Specify organization_id to retrieve metrics across all articles owned by the target organization.
Authorizations:
api-key
query Parameters
article_id
integer

Optional ID to limit totals to a single article.

organization_id
integer

Optional ID to limit totals to an organization's articles.

Responses

Retrieve historical analytics

Retrieve historical analytics data graphed over a time range.

Time Range Formats:

  • start: Start date (e.g. 2024-01-01). Required.
  • end: End date (e.g. 2024-01-31). Defaults to current date if omitted.
Authorizations:
api-key
query Parameters
start
required
string
Example: start=2024-01-01

Start date (YYYY-MM-DD format).

end
string
Example: end=2024-01-31

End date (YYYY-MM-DD format).

article_id
integer

Limit stats to a single article.

organization_id
integer

Limit stats to an organization's articles.

Responses

Retrieve analytics for the past day

Retrieve real-time hourly analytics statistics for the last 24 hours. Used for live graphs.

Authorizations:
api-key
query Parameters
article_id
integer
organization_id
integer

Responses

Retrieve referrer analytics

Retrieve traffic referring domains and URL source tracking metrics for articles.

Authorizations:
api-key
query Parameters
start
string
Example: start=2024-01-01
end
string
Example: end=2024-01-31
article_id
integer
organization_id
integer

Responses

Retrieve top contributors analytics

Retrieve top organization contributors ordered by article engagement scores.

Authorizations:
api-key
query Parameters
start
string
Example: start=2024-01-01
end
string
Example: end=2024-01-31
article_id
integer
organization_id
integer

Responses

Retrieve follower engagement analytics

Retrieve stats detailing new follower growth and engagement over time.

Authorizations:
api-key
query Parameters
start
string
Example: start=2024-01-01
end
string
Example: end=2024-01-31

Responses

Retrieve dashboard analytics bundle

Retrieve a complete bundled metrics package (totals, history, top posts) for rendering dashboard landing pages.

Authorizations:
api-key
query Parameters
start
string
Example: start=2024-01-01
end
string
Example: end=2024-01-31
article_id
integer
organization_id
integer

Responses

Retrieve heatmap activity

Retrieve user activity heatmap metrics (commits, posts, reactions) grouped by weekdays and hours.

Authorizations:
api-key
query Parameters
end
string
Example: end=2024-12-31

Responses

articles

Publish article

This endpoint allows the client to create a new article.

"Articles" are all the posts that users create on DEV/Forem that typically show up in the feed. They can be a blog post, a discussion question, a help thread etc. but are referred to as articles within the code.

Body Parameter Tips:

  • title: A compelling and descriptive title for the article.
  • body_markdown: The main text of the article in Markdown format. You can use standard Markdown as well as Forem-specific Liquid tags (e.g., {% embed ... %}). You can also include YAML front matter at the very beginning of the markdown to specify metadata such as tags, series, and cover image.
  • published: Set to true to immediately publish the article and make it visible in feeds. Set to false (default) to save it as a draft.
  • tags: A comma-separated list of tags (up to 4 tags). Tags help categorize your post and improve discoverability.
  • series: Group articles together by specifying a series name. If the series does not exist, it will be created.
  • main_image: Absolute URL of the cover image for the article.
  • canonical_url: If this post was originally published elsewhere, specify the canonical URL to maintain SEO integrity.
  • description: A short summary of the article used for previews and SEO meta description.
Authorizations:
api-key
Request Body schema: application/json

Representation of Article to be created

object
title
string
body_markdown
string
published
boolean
Default: false
series
string or null
main_image
string or null
canonical_url
string or null
description
string
tags
string
organization_id
integer or null

Responses

Request samples

Content type
application/json
{
  • "article": {
    }
}

Published articles

This endpoint allows the client to retrieve a list of articles.

"Articles" are all the posts that users create on DEV/Forem that typically show up in the feed. They can be a blog post, a discussion question, a help thread etc. but are referred to as articles within the code.

By default it will return featured, published articles ordered by descending popularity.

It supports pagination, each page will contain 30 articles by default.

Query Parameter Usage Tips:

  • Filtering by Tags:
    • Use tag to filter articles containing a single exact tag (e.g. tag=discuss).
    • Use tags to retrieve articles containing any of the comma-separated list of tags (e.g. tags=javascript,css).
    • Use tags_exclude to filter out articles containing any of the comma-separated list of tags (e.g. tags_exclude=node,java).
  • Filtering by User / Organization:
    • Use username to retrieve articles belonging to a specific User or Organization. Articles are returned in reverse chronological publication order.
  • State Options:
    • Use state=fresh to fetch fresh articles.
    • Use state=rising to fetch rising/trending articles.
    • Combine state=all with username to fetch up to 1000 articles (both published and unpublished) from that user/organization in a single page.
  • Top / Popularity:
    • Use top=N to return the most popular articles published in the last N days (e.g. top=7 for top articles of the week, top=30 for top of the month). This parameter can be combined with tag to find top articles in a specific niche.
  • Collections:
    • Use collection_id to retrieve articles belonging to a specific collection/series, sorted chronologically.
query Parameters
page
integer <int32> >= 1
Default: 1

Pagination page

per_page
integer <int32> [ 1 .. 1000 ]
Default: 30

Page size (the number of items to return per page). The default maximum value can be overridden by "API_PER_PAGE_MAX" environment variable.

tag
string
Example: tag=discuss

Using this parameter will retrieve articles that contain the requested tag. Articles will be ordered by descending popularity.This parameter can be used in conjuction with top.

tags
string
Example: tags=javascript, css

Using this parameter will retrieve articles with any of the comma-separated tags. Articles will be ordered by descending popularity.

tags_exclude
string
Example: tags_exclude=node, java

Using this parameter will retrieve articles that do not contain any of comma-separated tags. Articles will be ordered by descending popularity.

username
string
Example: username=ben

Using this parameter will retrieve articles belonging to a User or Organization ordered by descending publication date. If state=all the number of items returned will be 1000 instead of the default 30. This parameter can be used in conjuction with state.

state
string
Enum: "fresh" "rising" "all"
Example: state=fresh

Using this parameter will allow the client to check which articles are fresh or rising. If state=fresh the server will return fresh articles. If state=rising the server will return rising articles. This param can be used in conjuction with username, only if set to all.

top
integer <int32> >= 1
Example: top=2

Using this parameter will allow the client to return the most popular articles in the last N days. top indicates the number of days since publication of the articles returned. This param can be used in conjuction with tag.

collection_id
integer <int32>
Example: collection_id=99

Adding this will allow the client to return the list of articles belonging to the requested collection, ordered by ascending publication date.

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Search for articles

This endpoint allows the client to search for articles.

Search Guidance:

  • q: The search query term. Matches against article titles, tags, and body content.
  • top: Restricts search results to articles published within the last N days.
  • page & per_page: Standard pagination support. Use this to display results sequentially on a search results page.
query Parameters
q
string

The search query term. Matches against article titles, tags, and body content.

top
integer

Restricts search results to articles published within the last N days.

page
integer

Pagination page index.

per_page
integer

The number of items to return per page.

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Published articles sorted by published date

This endpoint allows the client to retrieve a list of articles ordered strictly by descending publication date.

Usage Tips:

  • Bypasses all Forem/DEV feed personalization and popularity algorithms.
  • Ideal for building RSS feeds, chronological timelines, or "latest posts" widgets.
  • Supports standard page and per_page query parameters.
query Parameters
page
integer <int32> >= 1
Default: 1

Pagination page

per_page
integer <int32> [ 1 .. 1000 ]
Default: 30

Page size (the number of items to return per page). The default maximum value can be overridden by "API_PER_PAGE_MAX" environment variable.

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Published article by id

This endpoint allows the client to retrieve a single published article given its unique numerical id.

Integration Tip:

  • Returns the complete serialized article object including its HTML/markdown representation, tags, and author profile details.
  • To retrieve an article using its URL path structure instead of its numeric ID, use the /api/articles/{username}/{slug} endpoint.
path Parameters
id
required
integer

The unique numerical ID of the published article.

Responses

Response samples

Content type
application/json
{ }

Update an article by id

This endpoint allows the client to update an existing article by its unique numerical id.

Authorization Constraints:

  • The API key provided must belong to the author of the article.
  • Supports updating individual fields such as title, body_markdown, published, tags, etc.
  • Setting published: false on an already published article will revert it to draft status.
Authorizations:
api-key
path Parameters
id
required
integer <int32> >= 1
Example: 123

The unique numerical ID of the article to update.

Request Body schema: application/json

Representation of Article to be updated

object
title
string
body_markdown
string
published
boolean
Default: false
series
string or null
main_image
string or null
canonical_url
string or null
description
string
tags
string
organization_id
integer or null

Responses

Request samples

Content type
application/json
{
  • "article": {
    }
}

Published article by path

This endpoint allows the client to retrieve a single published article given its username and slug (the URL-friendly path identifier).

Usage Tip:

  • Handy for resolving absolute Forem/DEV article URLs (e.g., https://dev.to/username/slug) into their corresponding API data models.
path Parameters
username
required
string

The username of the article's author or organization.

slug
required
string

The URL-friendly slug of the article (e.g. my-first-post-1234).

Responses

Response samples

Content type
application/json
{ }

User's articles

This endpoint allows the client to retrieve a list of published articles on behalf of an authenticated user.

"Articles" are all the posts that users create on DEV that typically show up in the feed. They can be a blog post, a discussion question, a help thread etc. but is referred to as article within the code.

Published articles will be in reverse chronological publication order.

It will return published articles with pagination. By default a page will contain 30 articles.

Authorizations:
api-key
query Parameters
page
integer <int32> >= 1
Default: 1

Pagination page

per_page
integer <int32> [ 1 .. 1000 ]
Default: 30

Page size (the number of items to return per page). The default maximum value can be overridden by "API_PER_PAGE_MAX" environment variable.

Responses

Response samples

Content type
application/json
[
  • {
    }
]

User's published articles

This endpoint allows the client to retrieve a list of published articles on behalf of an authenticated user.

"Articles" are all the posts that users create on DEV that typically show up in the feed. They can be a blog post, a discussion question, a help thread etc. but is referred to as article within the code.

Published articles will be in reverse chronological publication order.

It will return published articles with pagination. By default a page will contain 30 articles.

Authorizations:
api-key
query Parameters
page
integer <int32> >= 1
Default: 1

Pagination page

per_page
integer <int32> [ 1 .. 1000 ]
Default: 30

Page size (the number of items to return per page). The default maximum value can be overridden by "API_PER_PAGE_MAX" environment variable.

Responses

Response samples

Content type
application/json
[
  • {
    }
]

User's unpublished articles

This endpoint allows the client to retrieve a list of unpublished articles on behalf of an authenticated user.

"Articles" are all the posts that users create on DEV that typically show up in the feed. They can be a blog post, a discussion question, a help thread etc. but is referred to as article within the code.

Unpublished articles will be in reverse chronological creation order.

It will return unpublished articles with pagination. By default a page will contain 30 articles.

Authorizations:
api-key
query Parameters
page
integer <int32> >= 1
Default: 1

Pagination page

per_page
integer <int32> [ 1 .. 1000 ]
Default: 30

Page size (the number of items to return per page). The default maximum value can be overridden by "API_PER_PAGE_MAX" environment variable.

Responses

Response samples

Content type
application/json
[
  • {
    }
]

User's all articles

This endpoint allows the client to retrieve a list of all articles on behalf of an authenticated user.

"Articles" are all the posts that users create on DEV that typically show up in the feed. They can be a blog post, a discussion question, a help thread etc. but is referred to as article within the code.

It will return both published and unpublished articles with pagination.

Unpublished articles will be at the top of the list in reverse chronological creation order. Published articles will follow in reverse chronological publication order.

By default a page will contain 30 articles.

Authorizations:
api-key
query Parameters
page
integer <int32> >= 1
Default: 1

Pagination page

per_page
integer <int32> [ 1 .. 1000 ]
Default: 30

Page size (the number of items to return per page). The default maximum value can be overridden by "API_PER_PAGE_MAX" environment variable.

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Unpublish an article

This endpoint allows the client to unpublish an article.

The user associated with the API key must have any 'admin' or 'moderator' role.

The article will be unpublished and will no longer be visible to the public. It will remain in the database and will set back to draft status on the author's posts dashboard. Any notifications associated with the article will be deleted. Any comments on the article will remain.

Authorizations:
api-key
path Parameters
id
required
integer <int32> >= 1
Example: 1

The ID of the article to unpublish.

query Parameters
note
string
Example: note=Admin requested unpublishing all articles via API

Content for the note that's created along with unpublishing

Responses

Organization's Articles

Retrieve a list of articles published by the organization.

Path Parameter Options:

  • organization_id_or_username: Supports either the organization's unique numerical ID OR its string username (slug).
  • Returns articles in reverse chronological publication order.
  • Ideal for populating an organization's custom blog feed or publication listing.
path Parameters
organization_id_or_username
required
string

The organization's numerical ID or string username.

query Parameters
page
integer <int32> >= 1
Default: 1

Pagination page

per_page
integer <int32> [ 1 .. 1000 ]
Default: 30

Page size (the number of items to return per page). The default maximum value can be overridden by "API_PER_PAGE_MAX" environment variable.

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Articles with a video

Retrieve a list of articles that contain uploaded videos.

Videos Overview:

  • Bypasses authentication (can be accessed publicly).
  • Returns articles that are published and include a video asset.
  • Articles are ordered by descending popularity (views, watch time, and reactions).
  • By default, returns 24 video articles per page.
query Parameters
page
integer <int32> >= 1
Default: 1

Pagination page

per_page
integer <int32> [ 1 .. 1000 ]
Default: 24

Page size (the number of items to return per page). The default maximum value can be overridden by "API_PER_PAGE_MAX" environment variable.

Responses

Response samples

Content type
application/json
[
  • {
    }
]

users

User's articles

This endpoint allows the client to retrieve a list of published articles on behalf of an authenticated user.

"Articles" are all the posts that users create on DEV that typically show up in the feed. They can be a blog post, a discussion question, a help thread etc. but is referred to as article within the code.

Published articles will be in reverse chronological publication order.

It will return published articles with pagination. By default a page will contain 30 articles.

Authorizations:
api-key
query Parameters
page
integer <int32> >= 1
Default: 1

Pagination page

per_page
integer <int32> [ 1 .. 1000 ]
Default: 30

Page size (the number of items to return per page). The default maximum value can be overridden by "API_PER_PAGE_MAX" environment variable.

Responses

Response samples

Content type
application/json
[
  • {
    }
]

User's published articles

This endpoint allows the client to retrieve a list of published articles on behalf of an authenticated user.

"Articles" are all the posts that users create on DEV that typically show up in the feed. They can be a blog post, a discussion question, a help thread etc. but is referred to as article within the code.

Published articles will be in reverse chronological publication order.

It will return published articles with pagination. By default a page will contain 30 articles.

Authorizations:
api-key
query Parameters
page
integer <int32> >= 1
Default: 1

Pagination page

per_page
integer <int32> [ 1 .. 1000 ]
Default: 30

Page size (the number of items to return per page). The default maximum value can be overridden by "API_PER_PAGE_MAX" environment variable.

Responses

Response samples

Content type
application/json
[
  • {
    }
]

User's unpublished articles

This endpoint allows the client to retrieve a list of unpublished articles on behalf of an authenticated user.

"Articles" are all the posts that users create on DEV that typically show up in the feed. They can be a blog post, a discussion question, a help thread etc. but is referred to as article within the code.

Unpublished articles will be in reverse chronological creation order.

It will return unpublished articles with pagination. By default a page will contain 30 articles.

Authorizations:
api-key
query Parameters
page
integer <int32> >= 1
Default: 1

Pagination page

per_page
integer <int32> [ 1 .. 1000 ]
Default: 30

Page size (the number of items to return per page). The default maximum value can be overridden by "API_PER_PAGE_MAX" environment variable.

Responses

Response samples

Content type
application/json
[
  • {
    }
]

User's all articles

This endpoint allows the client to retrieve a list of all articles on behalf of an authenticated user.

"Articles" are all the posts that users create on DEV that typically show up in the feed. They can be a blog post, a discussion question, a help thread etc. but is referred to as article within the code.

It will return both published and unpublished articles with pagination.

Unpublished articles will be at the top of the list in reverse chronological creation order. Published articles will follow in reverse chronological publication order.

By default a page will contain 30 articles.

Authorizations:
api-key
query Parameters
page
integer <int32> >= 1
Default: 1

Pagination page

per_page
integer <int32> [ 1 .. 1000 ]
Default: 30

Page size (the number of items to return per page). The default maximum value can be overridden by "API_PER_PAGE_MAX" environment variable.

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Organization's users

Retrieve a list of public user profiles associated with the organization.

Path Parameter Options:

  • organization_id_or_username: Supports either the organization's unique numerical ID OR its string username (slug).
  • Ideal for displaying team member directory lists on organization/brand pages.
path Parameters
organization_id_or_username
required
string

The organization's numerical ID or string username.

query Parameters
page
integer <int32> >= 1
Default: 1

Pagination page

per_page
integer <int32> [ 1 .. 1000 ]
Default: 30

Page size (the number of items to return per page). The default maximum value can be overridden by "API_PER_PAGE_MAX" environment variable.

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Suspend a User

Suspend a user's account.

Suspension Details:

  • The user associated with the API key must have an admin or moderator role.
  • Assigns the suspended role to the user, preventing them from posting new content (articles or comments) while suspended.
  • Existing content is not deleted.
  • Suspended users are not notified in the UI; if you want them to know, you must notify them explicitly.
Authorizations:
api-key
path Parameters
id
required
integer <int32> >= 1
Example: 1

The unique ID of the user to suspend.

Responses

Add limited role for a User

Limit a user's account permissions.

Limited Details:

  • Requires admin or moderator privileges.
  • Assigns the limited role, which rate-limits notifications generated by their actions (such as publishing new posts or comments).
  • Does not restrict content creation or delete content.
Authorizations:
api-key
path Parameters
id
required
integer <int32> >= 1
Example: 1

The ID of the user to limit.

Responses

Remove limited for a User

Remove the limited role, restoring the user to general privileges. Requires admin or moderator role.

Authorizations:
api-key
path Parameters
id
required
integer <int32> >= 1
Example: 1

The ID of the user to un-limit.

Responses

Add spam role for a User

Flag a user as spammer.

Spam Role Details:

  • Requires admin or moderator privileges.
  • Stops the user from creating new posts or comments, acting as a shadowban or block on activity.
  • Existing content remains but is hidden from search/feeds.
Authorizations:
api-key
path Parameters
id
required
integer <int32> >= 1
Example: 1

The ID of the user to assign the spam role.

Responses

Remove spam role from a User

Unflag a user as spammer, restoring general permissions. Requires admin or moderator role.

Authorizations:
api-key
path Parameters
id
required
integer <int32> >= 1
Example: 1

The ID of the user to remove the spam role from.

Responses

Add trusted role for a User

Assign the trusted role to a user.

Trusted Role Details:

  • Requires admin or moderator privileges.
  • Trusted users gain privileges like casting flag votes on inappropriate content or participating in priority review queues.
  • Triggers a system notification and an email to the user.
Authorizations:
api-key
path Parameters
id
required
integer <int32> >= 1
Example: 1

The ID of the user to assign the trusted role.

Responses

Remove trusted role from a User

Revoke the trusted role, returning the user to general status. Requires admin or moderator role.

Authorizations:
api-key
path Parameters
id
required
integer <int32> >= 1
Example: 1

The ID of the user to remove the trusted role from.

Responses

The authenticated user

This endpoint allows the client to retrieve information about the authenticated user.

Usage Tips:

  • Requires a valid api-key header to identify the user.
  • Useful for checking permissions, verifying linking state, or retrieving user-specific profile settings.
Authorizations:
api-key

Responses

Response samples

Content type
application/json
{ }

A User

This endpoint allows the client to retrieve a single user, either by id or by the user's username.

Path Parameter Options:

  • id: Can be either the user's unique numerical ID (e.g. 123) OR the user's string username (e.g. ben).
  • Note that the returned user object schema (ExtendedUser) includes extended profile statistics and social link details.
path Parameters
id
required
string

The user's unique numerical ID or string username.

Responses

Response samples

Content type
application/json
{ }

Search for users

Search for a user by email address.

Permissions & Context:

  • Requires administrative privileges (api-key of an administrator).
  • Used to verify account existence or map email addresses to platform usernames.
Authorizations:
api-key
query Parameters
email
required
string

The exact email address of the user to search for.

Responses

Response samples

Content type
application/json
{
  • "type_of": "string",
  • "id": 0,
  • "username": "string",
  • "name": "string",
  • "summary": "string",
  • "twitter_username": "string",
  • "github_username": "string",
  • "email": "string",
  • "website_url": "string",
  • "location": "string",
  • "joined_at": "string",
  • "profile_image": "string",
  • "badge_ids": [
    ]
}

Unpublish a User's Articles and Comments

This endpoint allows the client to unpublish all of the articles and comments created by a user.

Administrative Action:

  • Requires the authenticated user to be an Administrator.
  • This is a destructive administrative action that immediately unpublishes all posts/comments from public feeds.
  • Ideal for handling spam accounts or cleanup operations.
Authorizations:
api-key
path Parameters
id
required
integer <int32> >= 1
Example: 1

The unique numerical ID of the user whose content will be unpublished.

Responses

Invite a User

Invite a new user to join the platform by email.

Super Admin Action:

  • Requires Super Admin privileges.
  • Triggers a system invitation flow and sends an invitation email containing a sign-up link.
  • Handy for invite-only platforms or private enterprise instances.
Authorizations:
api-key
Request Body schema: application/json

User invite params

email
string
name
string or null

Responses

Request samples

Content type
application/json
{
  • "email": "string",
  • "name": "string"
}

List all users (Admin)

Retrieve a list of all users registered on the platform.

Permissions & Filters:

  • Requires Super Admin privileges.
  • Allows filtering by exact email or username.
  • Returns paginated list of extended user objects containing email addresses, registration dates, roles, and administrative statuses.
Authorizations:
api-key
query Parameters
page
integer

Pagination page index.

per_page
integer

Number of items to return per page.

email
string

Optional email search filter.

username
string

Optional username search filter.

Responses

Get user detail (Admin)

Retrieve details of a single user by numerical ID.

Super Admin Action:

  • Requires Super Admin privileges.
  • Includes administrative settings, audit notes, email newsletter preferences, and OAuth login identity states.
Authorizations:
api-key
path Parameters
id
required
integer

Unique user numeric ID.

Responses

Update user profile (Admin)

Update a user's public profile fields (name, location, bio summary, website) on their behalf. Requires Super Admin credentials.

Authorizations:
api-key
path Parameters
id
required
integer

Unique user ID to update.

Request Body schema: application/json

User profile updated fields.

name
string
username
string
summary
string
location
string
website_url
string

Responses

Request samples

Content type
application/json
{
  • "name": "string",
  • "username": "string",
  • "summary": "string",
  • "location": "string",
  • "website_url": "string"
}

Update user email (Admin)

Update a user's primary registration email address. Requires Super Admin credentials.

Authorizations:
api-key
path Parameters
id
required
integer

Unique user ID to update email for.

Request Body schema: application/json

Email parameters.

email
required
string

Responses

Request samples

Content type
application/json
{
  • "email": "string"
}

Update user moderation status (Admin)

Manually update a user's moderation status.

Status Details:

  • status: Allowed target states (e.g. active, suspended, banned).
  • note: Required reason text recorded in the user's moderation log audit history.
  • Requires Super Admin privileges.
Authorizations:
api-key
path Parameters
id
required
integer

Unique user ID.

Request Body schema: application/json

Status parameters.

status
required
string
note
string

Responses

Request samples

Content type
application/json
{
  • "status": "string",
  • "note": "string"
}

Update user notification settings (Admin)

Update a user's email notification preferences (e.g., unsubscribing them from the system newsletter). Requires Super Admin credentials.

Authorizations:
api-key
path Parameters
id
required
integer

Unique user ID.

Request Body schema: application/json

Settings parameters.

required
object
email_newsletter
boolean

Responses

Request samples

Content type
application/json
{
  • "notification_setting": {
    }
}

Merge user into another (Admin)

Merge a duplicate user account into a target main account.

Account Merging Behavior:

  • Transfers all comments, articles, reactions, and follows to the target user (merge_user_id).
  • Deletes/destroys the source user account once the merge completes successfully.
  • High risk! Action is permanent and irreversible.
  • Requires Super Admin credentials.
Authorizations:
api-key
path Parameters
id
required
integer

The duplicate user ID that will be deleted after contents merge.

Request Body schema: application/json

Merge parameters containing the target account ID.

merge_user_id
required
integer

Responses

Request samples

Content type
application/json
{
  • "merge_user_id": 0
}

List notes for a user (Admin)

Retrieve all moderator/administrator audit log notes appended to a user. Requires Super Admin credentials.

Authorizations:
api-key
path Parameters
user_id
required
integer

User ID to fetch notes for.

Responses

Add a note to a user (Admin)

Add a new moderation/audit note to a user.

Audit Logging Guidelines:

  • content: Plaintext description of behavior, infraction, or actions taken.
  • reason: Categorized classification (e.g. spam, abuse, harassment, administrative).
  • Requires Super Admin credentials.
Authorizations:
api-key
path Parameters
user_id
required
integer

User ID to append the note to.

Request Body schema: application/json

Note attributes.

content
required
string
reason
string

Responses

Request samples

Content type
application/json
{
  • "content": "string",
  • "reason": "string"
}

List identities for a user (Admin)

Retrieve all linked OAuth identities (e.g., GitHub, Twitter, Apple) for a user. Requires Super Admin credentials.

Authorizations:
api-key
path Parameters
user_id
required
integer

User ID to fetch linked identities for.

Responses

Link an identity to a user (Admin)

Manually link an OAuth provider identity to a user. Requires Super Admin credentials.

Identity Binding:

  • provider: The login provider name (e.g. github, twitter).
  • uid: The provider's unique user identifier.
  • username: The user's username on the provider's service.
Authorizations:
api-key
path Parameters
user_id
required
integer

User ID to bind identity to.

Request Body schema: application/json

OAuth credentials and identities.

provider
required
string
uid
required
string
username
string

Responses

Request samples

Content type
application/json
{
  • "provider": "string",
  • "uid": "string",
  • "username": "string"
}

Unlink an identity from a user (Admin)

Unlink a specific OAuth login provider identity from a user by identity ID. Requires Super Admin credentials.

Authorizations:
api-key
path Parameters
user_id
required
integer

User ID.

id
required
integer

Identity ID to unlink.

Responses

Bulk link identities (Admin)

Bulk link OAuth identities across multiple users. Requires Super Admin credentials.

Authorizations:
api-key
Request Body schema: application/json

Bulk identity params.

provider
required
string
required
Array of objects

Responses

Request samples

Content type
application/json
{
  • "provider": "string",
  • "identities": [
    ]
}

segments

Manually managed audience segments

Retrieve a list of manually managed audience segments.

Audience Segments Overview:

  • Audience Segments are cohorts of users grouped together for targeting announcements, features, or promotional campaign banners (Billboards).
  • This endpoint lists manual cohorts created and maintained by site administrators.
  • Requires administrator privileges.

The endpoint supports pagination, and each page will contain 30 segments by default.

Authorizations:
api-key
query Parameters
per_page
integer <int32> [ 1 .. 1000 ]
Default: 30

Page size (the number of items to return per page). The default maximum value can be overridden by "API_PER_PAGE_MAX" environment variable.

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Create a manually managed audience segment

Create a new manually managed audience segment.

Usage Guidance:

  • Used by administrators to define a new target cohort group.
  • Users can be added or removed in bulk later via segment member endpoints.
Authorizations:
api-key

Responses

A manually managed audience segment

Retrieve details of a single manually-managed audience segment specified by ID.

Integration Tip:

  • Includes segment type (manual), configuration, and metadata.
  • Automatic/system-generated segments cannot be queried or updated via this endpoint.
Authorizations:
api-key
path Parameters
id
required
integer <int32> >= 1

Unique segment numerical ID.

Responses

Response samples

Content type
application/json
{ }

Delete a manually managed audience segment

Delete an audience segment specified by ID.

Constraints:

  • Audience segments cannot be deleted if they are currently assigned to any active or pending Billboards.
Authorizations:
api-key
path Parameters
id
required
integer <int32> >= 1

Unique segment numerical ID.

Responses

Users in a manually managed audience segment

Retrieve a paginated list of users enrolled in the specified manual audience segment.

Pagination Guidance:

  • Supports standard page and per_page controls, returning 30 users per page by default.
Authorizations:
api-key
path Parameters
id
required
integer <int32> >= 1

Unique segment numerical ID.

query Parameters
per_page
integer <int32> [ 1 .. 1000 ]
Default: 30

Page size (the number of items to return per page). The default maximum value can be overridden by "API_PER_PAGE_MAX" environment variable.

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Add users to a manually managed audience segment

Add users in bulk to the specified manual audience segment.

Bulk Update Behavior:

  • Accepts a JSON array of user_ids in the request body.
  • Returns a list of successes and failures. Successful additions include users already present in the segment.
Authorizations:
api-key
path Parameters
id
required
integer <int32> >= 1

Unique segment numerical ID.

Request Body schema: application/json

Map containing user IDs to enroll in the segment.

user_ids
Array of integers <= 10000 items

Responses

Request samples

Content type
application/json
{
  • "user_ids": [
    ]
}

Remove users from a manually managed audience segment

Remove users in bulk from the specified manual audience segment.

Bulk Update Behavior:

  • Accepts a JSON array of user_ids in the request body.
  • Returns successes (users successfully removed) and failures (users who were not members of the segment).
Authorizations:
api-key
path Parameters
id
required
integer <int32> >= 1

Unique segment numerical ID.

Request Body schema: application/json

Map containing user IDs to remove from the segment.

user_ids
Array of integers <= 10000 items

Responses

Request samples

Content type
application/json
{
  • "user_ids": [
    ]
}

badge_achievements

Retrieve all badge achievements

Retrieve a list of all badge achievements (awarded badges) in the system. Requires administrator privileges.

Authorizations:
api-key
query Parameters
page
integer

Pagination page index.

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Create a badge achievement

Award a badge to a user. Requires administrator privileges.

Integration Tips:

  • user_id: The numeric ID of the user receiving the badge.
  • badge_id: The numeric ID of the badge being awarded.
  • rewarding_context_message_markdown: Optional personalized message shown in the notification or profile feed to explain why the user was awarded the badge.
Authorizations:
api-key
Request Body schema: application/json

Badge achievement details.

object
user_id
required
integer
badge_id
required
integer
rewarding_context_message_markdown
string
include_default_description
boolean

Responses

Request samples

Content type
application/json
{
  • "badge_achievement": {
    }
}

Response samples

Content type
application/json
{
  • "id": 0,
  • "user_id": 0,
  • "badge_id": 0,
  • "rewarding_context_message_markdown": "string",
  • "include_default_description": true,
  • "created_at": "2019-08-24T14:15:22Z",
  • "updated_at": "2019-08-24T14:15:22Z"
}

Retrieve a badge achievement's details

Retrieve details of a specific badge award/achievement by ID.

Authorizations:
api-key
path Parameters
id
required
integer

Badge achievement unique ID.

Responses

Response samples

Content type
application/json
{
  • "id": 0,
  • "user_id": 0,
  • "badge_id": 0,
  • "rewarding_context_message_markdown": "string",
  • "include_default_description": true,
  • "created_at": "2019-08-24T14:15:22Z",
  • "updated_at": "2019-08-24T14:15:22Z"
}

Delete a badge achievement

Revoke a badge award by deleting the badge achievement. Requires administrator privileges.

Authorizations:
api-key
path Parameters
id
required
integer

Badge achievement unique ID to delete.

Responses

badges

Retrieve all badges

Retrieve a list of all badges available on the platform.

Badges Overview:

  • Badges recognize achievements (e.g., "Top Writer", "Beloved Community Member", or anniversary milestones).
  • Publicly visible on user profiles.
Authorizations:
api-key
query Parameters
page
integer

Pagination page index.

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Create a badge

Create a new badge. Requires administrator privileges.

Body Parameter Guidelines:

  • title: Unique name for the badge.
  • description: Text explanation of the achievement.
  • remote_badge_image_url: Public URL to an image asset (PNG, GIF, or SVG) representing the badge icon.
  • allow_multiple_awards: Set to true if a user can earn the same badge multiple times (e.g. weekly challenges).
Authorizations:
api-key
Request Body schema: application/json

Badge properties to create.

object
title
required
string
description
required
string
remote_badge_image_url
required
string
credits_awarded
integer
allow_multiple_awards
boolean

Responses

Request samples

Content type
application/json
{
  • "badge": {
    }
}

Response samples

Content type
application/json
{
  • "id": 0,
  • "title": "string",
  • "slug": "string",
  • "description": "string",
  • "badge_image": {
    },
  • "credits_awarded": 0,
  • "allow_multiple_awards": true,
  • "created_at": "2019-08-24T14:15:22Z",
  • "updated_at": "2019-08-24T14:15:22Z"
}

Retrieve a badge's details

Retrieve details of a single badge by unique numeric ID.

Authorizations:
api-key
path Parameters
id
required
integer

Unique badge ID.

Responses

Response samples

Content type
application/json
{
  • "id": 0,
  • "title": "string",
  • "slug": "string",
  • "description": "string",
  • "badge_image": {
    },
  • "credits_awarded": 0,
  • "allow_multiple_awards": true,
  • "created_at": "2019-08-24T14:15:22Z",
  • "updated_at": "2019-08-24T14:15:22Z"
}

Update a badge

Update badge details (title, description, credits awarded, etc.) by unique ID. Requires administrator privileges.

Authorizations:
api-key
path Parameters
id
required
integer

Unique badge ID to update.

Request Body schema: application/json

Badge properties to update.

object
title
string
description
string
credits_awarded
integer
allow_multiple_awards
boolean

Responses

Request samples

Content type
application/json
{
  • "badge": {
    }
}

Response samples

Content type
application/json
{
  • "id": 0,
  • "title": "string",
  • "slug": "string",
  • "description": "string",
  • "badge_image": {
    },
  • "credits_awarded": 0,
  • "allow_multiple_awards": true,
  • "created_at": "2019-08-24T14:15:22Z",
  • "updated_at": "2019-08-24T14:15:22Z"
}

Delete a badge

Delete a badge configuration from the system by ID. Requires administrator privileges.

Authorizations:
api-key
path Parameters
id
required
integer

Unique badge ID to delete.

Responses

billboards

Billboards

Retrieve a list of all billboards configured in the system.

    ### Billboards Overview:
    - Billboards are custom promotional ads, notification banners, or call-to-actions shown on the Forem website.
    - Requires administrative privileges.
    - Returned objects include layout code, scheduling parameters, geo-targeting configurations, and custom target audience segment associations.
Authorizations:
api-key

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Create a billboard

Create a new billboard.

    ### Parameter Options & Tips:
    - **body_markdown**: The HTML/Markdown advertisement copy.
    - **placement_area**: Target region in layouts (e.g. `post_comments` below comments, `sidebar` in sidebars, `home_feed` between posts).
    - **display_to**: Cohort target rules (e.g. `all` for everyone, `logged_in`, `guests`, or customized segments).
    - **target_geolocations**: Comma-separated ISO codes for country/region targeting.
    - **approved** & **published**: Set to `true` to activate billboard rotation instantly.
Authorizations:
api-key
Request Body schema: application/json

Billboard parameters.

[$ref]
any

Responses

Request samples

Content type
application/json
{ }

Response samples

Content type
application/json
{ }

A billboard (by id)

Retrieve full configurations of a single billboard by ID. Requires admin credentials.

Authorizations:
api-key
path Parameters
id
required
integer <int32> >= 1
Example: 123

The ID of the billboard.

Responses

Update a billboard by ID

Update an existing billboard's configurations.

    ### Integration Guidance:
    - Allows changing placement area, geolocations, target segments, or text copy.
    - Updating an active billboard takes effect instantly in the layout delivery cache.
Authorizations:
api-key
path Parameters
id
required
integer <int32> >= 1
Example: 123

The ID of the billboard to update.

Request Body schema: application/json

Billboard updated attributes.

[$ref]
any

Responses

Request samples

Content type
application/json
{ }

Response samples

Content type
application/json
{ }

Unpublish a billboard

Remove a billboard from active rotation by unpublishing it.

    ### Usage:
    - Instantly disables display across all pages while keeping the configuration stored in the database for later reactivations or historical reporting.
Authorizations:
api-key
path Parameters
id
required
integer <int32> >= 1
Example: 123

The ID of the billboard to unpublish.

Responses

comments

Comments

This endpoint allows the client to retrieve all comments belonging to an article or podcast episode as threaded conversations.

Threaded Structure & Pagination Tips:

  • Threaded Format: Comments are returned as a tree structure (nested arrays of replies). Each top-level comment contains its nested child comments recursively.
  • Query Constraints: You must provide either a_id (Article ID) OR p_id (Podcast Episode ID) to fetch comments. Specifying both is not supported.
  • Pagination: When paginating, the page parameter filters the top-level comments only. All replies to those top-level comments are returned nested inline, regardless of page index.
  • If the page parameter is omitted, the response returns the full comment tree in a single payload.
query Parameters
page
integer <int32> >= 1
Default: 1

Pagination page

per_page
integer <int32> [ 1 .. 1000 ]
Default: 30

Page size (the number of items to return per page). The default maximum value can be overridden by "API_PER_PAGE_MAX" environment variable.

a_id
string
Example: a_id=321

Article identifier. Provide this to fetch comments belonging to a specific article.

p_id
string
Example: p_id=321

Podcast Episode identifier. Provide this to fetch comments belonging to a specific podcast episode.

page
string
Example: page=321

Pagination page index for top-level comments.

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Comment by id

This endpoint allows the client to retrieve a specific comment and all of its nested descendant replies.

Integration Tip:

  • Handy for linking directly to a deep comment thread or loading individual comment replies on demand.
path Parameters
id
required
string
Example: 321

Comment identifier (the unique alpha-numeric id_code of the comment).

Responses

concepts

Retrieve all accessible concepts

Retrieve all accessible concepts in the system.

Concepts Overview:

  • Concepts are semantic tags generated automatically by analyzing article text using ML embeddings (gemini-embedding-2), rather than explicit user tags.
  • Primarily used for advanced semantic categorization, automated feeds, and interest mapping.
Authorizations:
api-key
query Parameters
page
integer

Pagination page index.

per_page
integer

Number of items to return per page.

days
integer

Number of days of activity to aggregate for computing the concept popularity/trend score (default is 7 days).

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Retrieve details of a concept

Retrieve details, settings, and popularity metrics of a single concept by ID.

Integration Tip:

  • Includes the semantic description, similarity thresholds, parent concept mappings, and scores.
Authorizations:
api-key
path Parameters
id
required
integer

Unique concept numerical ID.

query Parameters
days
integer

Number of days of activity to aggregate for the concept popularity/trend score.

Responses

Response samples

Content type
application/json
{
  • "id": 0,
  • "name": "string",
  • "slug": "string",
  • "description": "string",
  • "parent_id": 0,
  • "score": 0,
  • "similarity_threshold": 0,
  • "created_at": "2019-08-24T14:15:22Z",
  • "updated_at": "2019-08-24T14:15:22Z",
  • "daily_metrics": [
    ],
  • "top_articles": [
    ]
}

Update a concept's metadata

Update concept metadata such as description, similarity threshold, and custom score.

Parameter Guidelines:

  • similarity_threshold: Cosine distance threshold (range 0.0 to 1.0) determining how closely an article's embedding must align with the concept's anchor embedding to be classified under it.
Authorizations:
api-key
path Parameters
id
required
integer

Unique concept numerical ID.

Request Body schema: application/json
object
score
number
description
string
similarity_threshold
number

Responses

Request samples

Content type
application/json
{
  • "concept": {
    }
}

Response samples

Content type
application/json
{
  • "id": 0,
  • "name": "string",
  • "slug": "string",
  • "description": "string",
  • "parent_id": 0,
  • "score": 0,
  • "similarity_threshold": 0,
  • "created_at": "2019-08-24T14:15:22Z",
  • "updated_at": "2019-08-24T14:15:22Z",
  • "daily_metrics": [
    ],
  • "top_articles": [
    ]
}

Retrieve articles mapped to a concept

Retrieve articles classified under this concept.

Parameter Guidelines:

  • sort: Set to -similarity to sort articles by cosine similarity (most relevant first), -published_at to sort chronologically, or -score to sort by platform popularity score.
Authorizations:
api-key
path Parameters
id
required
integer

Unique concept numerical ID.

query Parameters
sort
string

Sorting criteria: -similarity, -published_at, or -score.

page
integer

Pagination page index.

per_page
integer

Number of items to return per page.

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Retrieve all concepts (Admin)

Retrieve all concepts in the system including system and draft concepts. Admin credentials required.

Authorizations:
api-key
query Parameters
page
integer
per_page
integer

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Create a concept (Admin)

Create a new Concept.

Parameters:

  • name: Human readable label for the concept.
  • description: Detailed semantic definition used to generate the anchor embedding.
  • similarity_threshold: Target similarity threshold for categorizing articles under this concept.
  • parent_id: ID of parent concept, if establishing a hierarchy.
Authorizations:
api-key
Request Body schema: application/json
object
name
required
string
description
string
parent_id
integer or null
similarity_threshold
number
score
number

Responses

Request samples

Content type
application/json
{
  • "concept": {
    }
}

Response samples

Content type
application/json
{
  • "id": 0,
  • "name": "string",
  • "slug": "string",
  • "description": "string",
  • "parent_id": 0,
  • "score": 0,
  • "similarity_threshold": 0,
  • "created_at": "2019-08-24T14:15:22Z",
  • "updated_at": "2019-08-24T14:15:22Z",
  • "daily_metrics": [
    ],
  • "top_articles": [
    ]
}

Retrieve concept detail (Admin)

Retrieve full details of a specific concept by ID. Admin credentials required.

Authorizations:
api-key
path Parameters
id
required
integer

Responses

Response samples

Content type
application/json
{
  • "id": 0,
  • "name": "string",
  • "slug": "string",
  • "description": "string",
  • "parent_id": 0,
  • "score": 0,
  • "similarity_threshold": 0,
  • "created_at": "2019-08-24T14:15:22Z",
  • "updated_at": "2019-08-24T14:15:22Z",
  • "daily_metrics": [
    ],
  • "top_articles": [
    ]
}

Update a concept (Admin)

Update concept properties. Admin credentials required.

Authorizations:
api-key
path Parameters
id
required
integer
Request Body schema: application/json
object
name
string
description
string
parent_id
integer or null
similarity_threshold
number
score
number

Responses

Request samples

Content type
application/json
{
  • "concept": {
    }
}

Response samples

Content type
application/json
{
  • "id": 0,
  • "name": "string",
  • "slug": "string",
  • "description": "string",
  • "parent_id": 0,
  • "score": 0,
  • "similarity_threshold": 0,
  • "created_at": "2019-08-24T14:15:22Z",
  • "updated_at": "2019-08-24T14:15:22Z",
  • "daily_metrics": [
    ],
  • "top_articles": [
    ]
}

Delete a concept (Admin)

Permanently delete a concept by ID. Admin credentials required.

Authorizations:
api-key
path Parameters
id
required
integer

Responses

Trigger concept lookback backfill (Admin)

Trigger a background backfill worker to scan historical articles published in the last N days and evaluate them against this concept.

Authorizations:
api-key
path Parameters
id
required
integer
Request Body schema: application/json
days
required
integer

Responses

Request samples

Content type
application/json
{
  • "days": 0
}

admin

Retrieve all concepts (Admin)

Retrieve all concepts in the system including system and draft concepts. Admin credentials required.

Authorizations:
api-key
query Parameters
page
integer
per_page
integer

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Create a concept (Admin)

Create a new Concept.

Parameters:

  • name: Human readable label for the concept.
  • description: Detailed semantic definition used to generate the anchor embedding.
  • similarity_threshold: Target similarity threshold for categorizing articles under this concept.
  • parent_id: ID of parent concept, if establishing a hierarchy.
Authorizations:
api-key
Request Body schema: application/json
object
name
required
string
description
string
parent_id
integer or null
similarity_threshold
number
score
number

Responses

Request samples

Content type
application/json
{
  • "concept": {
    }
}

Response samples

Content type
application/json
{
  • "id": 0,
  • "name": "string",
  • "slug": "string",
  • "description": "string",
  • "parent_id": 0,
  • "score": 0,
  • "similarity_threshold": 0,
  • "created_at": "2019-08-24T14:15:22Z",
  • "updated_at": "2019-08-24T14:15:22Z",
  • "daily_metrics": [
    ],
  • "top_articles": [
    ]
}

Retrieve concept detail (Admin)

Retrieve full details of a specific concept by ID. Admin credentials required.

Authorizations:
api-key
path Parameters
id
required
integer

Responses

Response samples

Content type
application/json
{
  • "id": 0,
  • "name": "string",
  • "slug": "string",
  • "description": "string",
  • "parent_id": 0,
  • "score": 0,
  • "similarity_threshold": 0,
  • "created_at": "2019-08-24T14:15:22Z",
  • "updated_at": "2019-08-24T14:15:22Z",
  • "daily_metrics": [
    ],
  • "top_articles": [
    ]
}

Update a concept (Admin)

Update concept properties. Admin credentials required.

Authorizations:
api-key
path Parameters
id
required
integer
Request Body schema: application/json
object
name
string
description
string
parent_id
integer or null
similarity_threshold
number
score
number

Responses

Request samples

Content type
application/json
{
  • "concept": {
    }
}

Response samples

Content type
application/json
{
  • "id": 0,
  • "name": "string",
  • "slug": "string",
  • "description": "string",
  • "parent_id": 0,
  • "score": 0,
  • "similarity_threshold": 0,
  • "created_at": "2019-08-24T14:15:22Z",
  • "updated_at": "2019-08-24T14:15:22Z",
  • "daily_metrics": [
    ],
  • "top_articles": [
    ]
}

Delete a concept (Admin)

Permanently delete a concept by ID. Admin credentials required.

Authorizations:
api-key
path Parameters
id
required
integer

Responses

Trigger concept lookback backfill (Admin)

Trigger a background backfill worker to scan historical articles published in the last N days and evaluate them against this concept.

Authorizations:
api-key
path Parameters
id
required
integer
Request Body schema: application/json
days
required
integer

Responses

Request samples

Content type
application/json
{
  • "days": 0
}

Update a feedback message's status (Admin)

Update the status of a user feedback message or report.

Feedback Messages Overview:

  • Feedback messages are submitted by users via support forms or content abuse reporting modals.
  • Requires Administrator privileges.
  • Used to track moderation/resolution workflows (e.g. marking a spam report as Resolved, Spam, or Ignored).
Authorizations:
api-key
path Parameters
id
required
integer

Unique feedback message ID.

Request Body schema: application/json

Feedback parameters containing the status updates.

object
status
required
string

Responses

Request samples

Content type
application/json
{
  • "feedback_message": {
    }
}

Retrieve all request redirects (Admin)

Retrieve a list of all request redirects configured on the platform.

Redirects Overview:

  • Redirects map incoming HTTP request paths or domains to specific target destination URLs (301 or 302 redirects).
  • Primarily used for managing vanity URLs, legacy path support, or domain migrations.
  • Requires Administrator privileges.
Authorizations:
api-key
query Parameters
page
integer

Pagination page index.

per_page
integer

Number of items to return per page.

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Create a request redirect (Admin)

Create a new request redirect route. Requires Administrator privileges.

Body Parameter Guidelines:

  • original_url: The source path (e.g. /old-page) to intercept.
  • destination_url: The target destination (e.g. https://myforem.com/new-page) to redirect users to.
  • request_domain: The domain scope (e.g. dev.to) where this redirect rule applies.
Authorizations:
api-key
Request Body schema: application/json

Redirect routing parameters.

object
original_url
required
string
destination_url
required
string
request_domain
required
string

Responses

Request samples

Content type
application/json
{
  • "request_redirect": {
    }
}

Response samples

Content type
application/json
{
  • "id": 0,
  • "original_url": "string",
  • "destination_url": "string",
  • "request_domain": "string",
  • "created_at": "2019-08-24T14:15:22Z",
  • "updated_at": "2019-08-24T14:15:22Z"
}

Retrieve a request redirect's details (Admin)

Retrieve details of a single request redirect route by ID. Requires Admin credentials.

Authorizations:
api-key
path Parameters
id
required
integer

Unique redirect ID.

Responses

Response samples

Content type
application/json
{
  • "id": 0,
  • "original_url": "string",
  • "destination_url": "string",
  • "request_domain": "string",
  • "created_at": "2019-08-24T14:15:22Z",
  • "updated_at": "2019-08-24T14:15:22Z"
}

Update a request redirect (Admin)

Update details (paths or domain scope) of an existing redirect route by ID. Requires Admin credentials.

Authorizations:
api-key
path Parameters
id
required
integer

Unique redirect ID to update.

Request Body schema: application/json

Updated redirect routing parameters.

object
original_url
string
destination_url
string
request_domain
string

Responses

Request samples

Content type
application/json
{
  • "request_redirect": {
    }
}

Response samples

Content type
application/json
{
  • "id": 0,
  • "original_url": "string",
  • "destination_url": "string",
  • "request_domain": "string",
  • "created_at": "2019-08-24T14:15:22Z",
  • "updated_at": "2019-08-24T14:15:22Z"
}

Delete a request redirect (Admin)

Delete a request redirect route, disabling the routing intercept immediately. Requires Admin credentials.

Authorizations:
api-key
path Parameters
id
required
integer

Unique redirect ID to delete.

Responses

Invite a User

Invite a new user to join the platform by email.

Super Admin Action:

  • Requires Super Admin privileges.
  • Triggers a system invitation flow and sends an invitation email containing a sign-up link.
  • Handy for invite-only platforms or private enterprise instances.
Authorizations:
api-key
Request Body schema: application/json

User invite params

email
string
name
string or null

Responses

Request samples

Content type
application/json
{
  • "email": "string",
  • "name": "string"
}

List all users (Admin)

Retrieve a list of all users registered on the platform.

Permissions & Filters:

  • Requires Super Admin privileges.
  • Allows filtering by exact email or username.
  • Returns paginated list of extended user objects containing email addresses, registration dates, roles, and administrative statuses.
Authorizations:
api-key
query Parameters
page
integer

Pagination page index.

per_page
integer

Number of items to return per page.

email
string

Optional email search filter.

username
string

Optional username search filter.

Responses

Get user detail (Admin)

Retrieve details of a single user by numerical ID.

Super Admin Action:

  • Requires Super Admin privileges.
  • Includes administrative settings, audit notes, email newsletter preferences, and OAuth login identity states.
Authorizations:
api-key
path Parameters
id
required
integer

Unique user numeric ID.

Responses

Update user profile (Admin)

Update a user's public profile fields (name, location, bio summary, website) on their behalf. Requires Super Admin credentials.

Authorizations:
api-key
path Parameters
id
required
integer

Unique user ID to update.

Request Body schema: application/json

User profile updated fields.

name
string
username
string
summary
string
location
string
website_url
string

Responses

Request samples

Content type
application/json
{
  • "name": "string",
  • "username": "string",
  • "summary": "string",
  • "location": "string",
  • "website_url": "string"
}

Update user email (Admin)

Update a user's primary registration email address. Requires Super Admin credentials.

Authorizations:
api-key
path Parameters
id
required
integer

Unique user ID to update email for.

Request Body schema: application/json

Email parameters.

email
required
string

Responses

Request samples

Content type
application/json
{
  • "email": "string"
}

Update user moderation status (Admin)

Manually update a user's moderation status.

Status Details:

  • status: Allowed target states (e.g. active, suspended, banned).
  • note: Required reason text recorded in the user's moderation log audit history.
  • Requires Super Admin privileges.
Authorizations:
api-key
path Parameters
id
required
integer

Unique user ID.

Request Body schema: application/json

Status parameters.

status
required
string
note
string

Responses

Request samples

Content type
application/json
{
  • "status": "string",
  • "note": "string"
}

Update user notification settings (Admin)

Update a user's email notification preferences (e.g., unsubscribing them from the system newsletter). Requires Super Admin credentials.

Authorizations:
api-key
path Parameters
id
required
integer

Unique user ID.

Request Body schema: application/json

Settings parameters.

required
object
email_newsletter
boolean

Responses

Request samples

Content type
application/json
{
  • "notification_setting": {
    }
}

Merge user into another (Admin)

Merge a duplicate user account into a target main account.

Account Merging Behavior:

  • Transfers all comments, articles, reactions, and follows to the target user (merge_user_id).
  • Deletes/destroys the source user account once the merge completes successfully.
  • High risk! Action is permanent and irreversible.
  • Requires Super Admin credentials.
Authorizations:
api-key
path Parameters
id
required
integer

The duplicate user ID that will be deleted after contents merge.

Request Body schema: application/json

Merge parameters containing the target account ID.

merge_user_id
required
integer

Responses

Request samples

Content type
application/json
{
  • "merge_user_id": 0
}

List notes for a user (Admin)

Retrieve all moderator/administrator audit log notes appended to a user. Requires Super Admin credentials.

Authorizations:
api-key
path Parameters
user_id
required
integer

User ID to fetch notes for.

Responses

Add a note to a user (Admin)

Add a new moderation/audit note to a user.

Audit Logging Guidelines:

  • content: Plaintext description of behavior, infraction, or actions taken.
  • reason: Categorized classification (e.g. spam, abuse, harassment, administrative).
  • Requires Super Admin credentials.
Authorizations:
api-key
path Parameters
user_id
required
integer

User ID to append the note to.

Request Body schema: application/json

Note attributes.

content
required
string
reason
string

Responses

Request samples

Content type
application/json
{
  • "content": "string",
  • "reason": "string"
}

List identities for a user (Admin)

Retrieve all linked OAuth identities (e.g., GitHub, Twitter, Apple) for a user. Requires Super Admin credentials.

Authorizations:
api-key
path Parameters
user_id
required
integer

User ID to fetch linked identities for.

Responses

Link an identity to a user (Admin)

Manually link an OAuth provider identity to a user. Requires Super Admin credentials.

Identity Binding:

  • provider: The login provider name (e.g. github, twitter).
  • uid: The provider's unique user identifier.
  • username: The user's username on the provider's service.
Authorizations:
api-key
path Parameters
user_id
required
integer

User ID to bind identity to.

Request Body schema: application/json

OAuth credentials and identities.

provider
required
string
uid
required
string
username
string

Responses

Request samples

Content type
application/json
{
  • "provider": "string",
  • "uid": "string",
  • "username": "string"
}

Unlink an identity from a user (Admin)

Unlink a specific OAuth login provider identity from a user by identity ID. Requires Super Admin credentials.

Authorizations:
api-key
path Parameters
user_id
required
integer

User ID.

id
required
integer

Identity ID to unlink.

Responses

Bulk link identities (Admin)

Bulk link OAuth identities across multiple users. Requires Super Admin credentials.

Authorizations:
api-key
Request Body schema: application/json

Bulk identity params.

provider
required
string
required
Array of objects

Responses

Request samples

Content type
application/json
{
  • "provider": "string",
  • "identities": [
    ]
}

feedback_messages

Update a feedback message's status (Admin)

Update the status of a user feedback message or report.

Feedback Messages Overview:

  • Feedback messages are submitted by users via support forms or content abuse reporting modals.
  • Requires Administrator privileges.
  • Used to track moderation/resolution workflows (e.g. marking a spam report as Resolved, Spam, or Ignored).
Authorizations:
api-key
path Parameters
id
required
integer

Unique feedback message ID.

Request Body schema: application/json

Feedback parameters containing the status updates.

object
status
required
string

Responses

Request samples

Content type
application/json
{
  • "feedback_message": {
    }
}

followed_tags

Followed Tags

Retrieve the list of tags followed by the authenticated user.

    ### Integration & Personalization Guidance:
    - Requires authentication.
    - Returns tags in ascending/popularity order based on user interactions.
    - Useful for customizing the home feed interface, constructing personalized sidebar navigation, or displaying a user's customized topic preferences in a dashboard.
Authorizations:
api-key

Responses

Response samples

Content type
application/json
[
  • {
    }
]

tags

Followed Tags

Retrieve the list of tags followed by the authenticated user.

    ### Integration & Personalization Guidance:
    - Requires authentication.
    - Returns tags in ascending/popularity order based on user interactions.
    - Useful for customizing the home feed interface, constructing personalized sidebar navigation, or displaying a user's customized topic preferences in a dashboard.
Authorizations:
api-key

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Tags

Retrieve a list of tags used on the platform, ordered by popularity.

Integration Tips:

  • Bypasses authentication (can be accessed publicly).
  • Ordered by overall popularity/usage metrics on the platform.
  • Useful for autocomplete inputs in article editors, tag selection screens in settings, or rendering global navigation/explore lists.

It supports pagination, each page will contain 10 tags by default.

query Parameters
page
integer <int32> >= 1
Default: 1

Pagination page

per_page
integer <int32> [ 1 .. 1000 ]
Default: 10

Page size (the number of items to return per page). The default maximum value can be overridden by "API_PER_PAGE_MAX" environment variable.

Responses

Response samples

Content type
application/json
[
  • {
    }
]

followers

Followers

This endpoint allows the client to retrieve a list of the followers they have.

    ### Integration & Pagination Guidance:
    - "Followers" are other users registered on the platform who follow the authenticated user.
    - Supports pagination, defaulting to 80 followers per page.
    - The `sort` query parameter determines the sorting order based on when the follow relationship was established.
Authorizations:
api-key
query Parameters
page
integer <int32> >= 1
Default: 1

Pagination page

per_page
integer <int32> [ 1 .. 1000 ]
Default: 30

Page size (the number of items to return per page). The default maximum value can be overridden by "API_PER_PAGE_MAX" environment variable.

sort
string
Example: sort=created_at

Specifies the sort order for the follow relationship created_at field. Use created_at for chronological (oldest first) or -created_at for reverse chronological (newest first).

Responses

Response samples

Content type
application/json
[
  • {
    }
]

follows

Follow users or organizations

Follow users or organizations in bulk on behalf of the authenticated user.

Bulk Update Behavior:

  • Accepts arrays of user_ids and organization_ids in the request body.
  • Performs follow actions for all provided identifiers.
  • Highly efficient for onboarding flows or importing social connections.
Authorizations:
api-key
Request Body schema: application/json

Map containing lists of user and organization IDs to follow.

user_ids
Array of integers
organization_ids
Array of integers

Responses

Request samples

Content type
application/json
{
  • "user_ids": [
    ],
  • "organization_ids": [
    ]
}

Response samples

Content type
application/json
{
  • "outcome": "string"
}

health_checks

Check app health

Basic application liveness check.

Usage Guidance:

  • Verifies that the Rails application process is running and responding to requests.
  • Does not check database or cache connectivity.
  • Typically used by load balancers, container orchestrators (like Kubernetes), or uptime checkers to verify container health.
header Parameters
health-check-token
string

Access token required if token-based security is enabled in settings for health checks.

Responses

Check database connection

Database connection health check.

Usage Guidance:

  • Verifies that the application can successfully query the primary PostgreSQL database.
  • Used to monitor database pool status and connection health.
header Parameters
health-check-token
string

Access token required if token-based security is enabled in settings for health checks.

Responses

Check cache connection

Cache connection health check.

Usage Guidance:

  • Verifies that the application can successfully ping the Redis cache instance.
  • Used to monitor cache and background worker queue connection health.
header Parameters
health-check-token
string

Access token required if token-based security is enabled in settings for health checks.

Responses

instance

Retrieve instance configuration details

Retrieve configuration details for the current Forem instance.

Instance Metadata:

  • Bypasses authentication.
  • Returns public Forem version, branding parameters, community guidelines references, and supported features configurations.

Responses

organizations

An organization (by username)

Retrieve public profile information for a single organization by its username.

Integration Tip:

  • Bypasses authentication.
  • Returns details like Tech Stack, Tagline, Story, website URLs, and joined date.
path Parameters
username
required
string

The unique slugified username of the organization (e.g. github).

Responses

Response samples

Content type
application/json
{ }

Organization's users

Retrieve a list of public user profiles associated with the organization.

Path Parameter Options:

  • organization_id_or_username: Supports either the organization's unique numerical ID OR its string username (slug).
  • Ideal for displaying team member directory lists on organization/brand pages.
path Parameters
organization_id_or_username
required
string

The organization's numerical ID or string username.

query Parameters
page
integer <int32> >= 1
Default: 1

Pagination page

per_page
integer <int32> [ 1 .. 1000 ]
Default: 30

Page size (the number of items to return per page). The default maximum value can be overridden by "API_PER_PAGE_MAX" environment variable.

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Organization's Articles

Retrieve a list of articles published by the organization.

Path Parameter Options:

  • organization_id_or_username: Supports either the organization's unique numerical ID OR its string username (slug).
  • Returns articles in reverse chronological publication order.
  • Ideal for populating an organization's custom blog feed or publication listing.
path Parameters
organization_id_or_username
required
string

The organization's numerical ID or string username.

query Parameters
page
integer <int32> >= 1
Default: 1

Pagination page

per_page
integer <int32> [ 1 .. 1000 ]
Default: 30

Page size (the number of items to return per page). The default maximum value can be overridden by "API_PER_PAGE_MAX" environment variable.

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Organizations

This endpoint allows the client to retrieve a list of Dev organizations.

It supports pagination, each page will contain 10 tags by default.

query Parameters
page
integer <int32> >= 1
Default: 1

Pagination page

per_page
integer <int32> [ 1 .. 1000 ]
Default: 10

Page size (the number of items to return per page). The default maximum value can be overridden by "API_PER_PAGE_MAX" environment variable.

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Create an Organization

This endpoint allows the client to create an organization with the provided parameters. It requires a token from a user with admin privileges.

Authorizations:
api-key
Request Body schema: application/json

Representation of Organization to be created

type_of
string
username
string
name
string
summary
string
twitter_username
string
github_username
string
url
string
location
string
joined_at
string
tech_stack
string
tag_line
string or null
story
string or null

Responses

Request samples

Content type
application/json
{
  • "type_of": "string",
  • "username": "string",
  • "name": "string",
  • "summary": "string",
  • "twitter_username": "string",
  • "github_username": "string",
  • "url": "string",
  • "location": "string",
  • "joined_at": "string",
  • "tech_stack": "string",
  • "tag_line": "string",
  • "story": "string"
}

An organization (by id)

This endpoint allows the client to retrieve a single organization by their id

path Parameters
id
required
integer

Responses

Response samples

Content type
application/json
{ }

Update an organization by id

This endpoint allows the client to update an existing organization.

Authorizations:
api-key
path Parameters
id
required
integer <int32> >= 1
Example: 123

The ID of the organization to update.

Request Body schema: application/json

Representation of Organization to be updated

type_of
string
username
string
name
string
summary
string
twitter_username
string
github_username
string
url
string
location
string
joined_at
string
tech_stack
string
tag_line
string or null
story
string or null

Responses

Request samples

Content type
application/json
{
  • "type_of": "string",
  • "username": "string",
  • "name": "string",
  • "summary": "string",
  • "twitter_username": "string",
  • "github_username": "string",
  • "url": "string",
  • "location": "string",
  • "joined_at": "string",
  • "tech_stack": "string",
  • "tag_line": "string",
  • "story": "string"
}

Delete an Organization by id

This endpoint allows the client to delete a single organization, specified by id

Authorizations:
api-key
path Parameters
id
required
integer <int32> >= 1
Example: 1

The ID of the organization.

Responses

pages

show details for all pages

Retrieve details for all Page objects in the system.

    ### Pages Overview:
    - Pages are custom static or dynamic views hosted on the Forem instance.
    - Publicly visible unless restricted.
    - Helpful for building custom menus, rendering site policies, or embedding custom forms.

Responses

Response samples

Content type
application/json
[
  • {
    }
]

pages

Create a new custom page. Requires administrative privileges.

    ### Body Parameter Guidelines:
    - **title**: Heading displayed at the top of the page.
    - **slug**: URL path identifier. Must be unique and URL-safe.
    - **body_markdown**: Content written in Markdown format.
    - **body_json**: Optional JSON payload for API-consumed/structured data pages.
    - **is_top_level_path**: Set to `true` to serve the page directly at the root (e.g. `/{slug}`) instead of under the default namespace `/page/{slug}`. Use with caution to avoid namespace collisions with core Forem paths.
    - **template**: Layout styling options (`contained` or custom layouts).
Authorizations:
api-key
Request Body schema: application/json

Page parameters.

title
string

Title of the page

slug
string

Used to link to this page in URLs, must be unique and URL-safe

description
string

For internal use, helps similar pages from one another

body_markdown
string

The text (in markdown) of the page (required)

body_json
string

For JSON pages, the JSON body

is_top_level_path
boolean

If true, the page is available at '/{slug}' instead of '/page/{slug}', use with caution

template
string
Default: "contained"
Enum: "contained" "full_within_layout" "nav_bar_included" "json" "css" "txt"

Controls what kind of layout the page is rendered in

Responses

Request samples

Content type
application/json
{
  • "title": "string",
  • "slug": "string",
  • "description": "string",
  • "body_markdown": "string",
  • "body_json": "string",
  • "is_top_level_path": true,
  • "template": "contained"
}

show details for a page

Retrieve details for a single Page object specified by ID.

path Parameters
id
required
integer <int32> >= 1
Example: 1

The unique ID of the page.

Responses

Response samples

Content type
application/json
{
  • "title": "string",
  • "slug": "string",
  • "description": "string",
  • "body_markdown": "string",
  • "body_json": "string",
  • "is_top_level_path": true,
  • "social_image": { },
  • "template": "contained"
}

update details for a page

Update an existing page's details by ID. Requires administrative privileges.

Authorizations:
api-key
path Parameters
id
required
integer <int32> >= 1
Example: 1

The ID of the page to update.

Request Body schema: application/json

Representation of Page to be updated

title
required
string

Title of the page

slug
required
string

Used to link to this page in URLs, must be unique and URL-safe

description
required
string

For internal use, helps similar pages from one another

body_markdown
string or null

The text (in markdown) of the ad (required)

body_json
string or null

For JSON pages, the JSON body

is_top_level_path
boolean

If true, the page is available at '/{slug}' instead of '/page/{slug}', use with caution

social_image
object or null
template
required
string
Default: "contained"
Enum: "contained" "full_within_layout" "nav_bar_included" "json" "css" "txt"

Controls what kind of layout the page is rendered in

Responses

Request samples

Content type
application/json
{
  • "title": "string",
  • "slug": "string",
  • "description": "string",
  • "body_markdown": "string",
  • "body_json": "string",
  • "is_top_level_path": true,
  • "social_image": { },
  • "template": "contained"
}

Response samples

Content type
application/json
{
  • "title": "string",
  • "slug": "string",
  • "description": "string",
  • "body_markdown": "string",
  • "body_json": "string",
  • "is_top_level_path": true,
  • "social_image": { },
  • "template": "contained"
}

remove a page

Delete a custom page from the system by ID. Requires administrative privileges.

Authorizations:
api-key
path Parameters
id
required
integer <int32> >= 1
Example: 1

The ID of the page to delete.

Responses

Response samples

Content type
application/json
{
  • "title": "string",
  • "slug": "string",
  • "description": "string",
  • "body_markdown": "string",
  • "body_json": "string",
  • "is_top_level_path": true,
  • "social_image": { },
  • "template": "contained"
}

podcast_episodes

Podcast Episodes

Retrieve a list of podcast episodes published on the platform.

    ### Integration Guidance:
    - Bypasses authentication (can be accessed publicly).
    - Only returns active episodes belonging to published/reachable podcasts.
    - Episodes are returned in reverse chronological order based on their publication date.
    - The `username` query parameter is the unique slug of the podcast channel (e.g. `codenewbie`).

    It supports pagination, each page will contain 30 episodes by default.
query Parameters
page
integer <int32> >= 1
Default: 1

Pagination page

per_page
integer <int32> [ 1 .. 1000 ]
Default: 30

Page size (the number of items to return per page). The default maximum value can be overridden by "API_PER_PAGE_MAX" environment variable.

username
string
Example: username=codenewbie

Filters episodes by the unique slug (username) of the podcast (e.g. 'codenewbie').

Responses

Response samples

Content type
application/json
[
  • {
    }
]

profile images

A Users or organizations profile image

Retrieve the profile image URL and configuration for a user or organization by username.

    ### Integration Details:
    - Bypasses authentication.
    - Convenient for quickly displaying avatars/icons in comments lists, headers, or sidebar elements without requesting the full user profile model.
Authorizations:
api-key
path Parameters
username
required
string
Example: janedoe

The unique username of the target user or organization.

Responses

Response samples

Content type
application/json
{ }

reactions

toggle reaction

Toggle a reaction on a target resource (Article, Comment, or User) on behalf of the authenticated user.

    ### Toggle Logic:
    - **First Request**: Creates a new reaction of the specified category on the reactable target.
    - **Second Request (with same parameters)**: Deletes the existing reaction.
    - Particularly useful for simple, interactive UI buttons like "Like", "Unicorn", or "Save" where clicking toggles the active state.
Authorizations:
api-key
query Parameters
category
required
string
Enum: "like" "unicorn" "exploding_head" "raised_hands" "fire"

The type of reaction (e.g. like for standard likes, unicorn for outstanding posts, save for bookmarking to the reading list).

reactable_id
required
integer <int32>

The unique numerical ID of the target resource (Article, Comment, or User) being reacted to.

reactable_type
required
string
Enum: "Comment" "Article" "User"

The class name of the target resource being reacted to (e.g. Article, Comment, User).

Responses

create reaction

Create a reaction on a target resource (Article, Comment, or User) on behalf of the authenticated user.

    ### Usage Details:
    - Unlike the toggle endpoint, this endpoint is idempotent: multiple requests to react with the same category to the same target will return the existing reaction without deleting it.
Authorizations:
api-key
query Parameters
category
required
string
Enum: "like" "unicorn" "exploding_head" "raised_hands" "fire"

The type of reaction (e.g. like for standard likes, unicorn for outstanding posts, save for bookmarking to the reading list).

reactable_id
required
integer <int32>

The unique numerical ID of the target resource (Article, Comment, or User) being reacted to.

reactable_type
required
string
Enum: "Comment" "Article" "User"

The class name of the target resource being reacted to (e.g. Article, Comment, User).

Responses

readinglist

Readinglist

Retrieve the list of articles saved to the authenticated user's reading list.

    ### Integration Guidance:
    - Requires authentication.
    - Under the hood, this endpoint retrieves articles that the user has reacted to with the `"save"` reaction category.
    - Supports pagination, defaulting to 30 articles per page.
    - Returned objects conform to the standard `ArticleIndex` schema.
Authorizations:
api-key
query Parameters
page
integer <int32> >= 1
Default: 1

Pagination page

per_page
integer <int32> [ 1 .. 1000 ]
Default: 30

Page size (the number of items to return per page). The default maximum value can be overridden by "API_PER_PAGE_MAX" environment variable.

Responses

Response samples

Content type
application/json
[
  • {
    }
]

recommended_articles_lists

Retrieve all recommended articles lists

Retrieve a list of all recommended articles lists configured in the system.

Overview:

  • Recommended Articles Lists are curated selections of articles pinned or recommended in layout regions (e.g. main_feed or sidebar).
  • Supports search by list name and standard query pagination.
  • Requires Administrator privileges.
Authorizations:
api-key
query Parameters
page
integer

Pagination page index.

search
string

Search term to match against recommended list names.

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Create or update a recommended articles list

Create a new recommended articles list or update an existing one. Requires Administrator privileges.

Body Parameter Guidelines:

  • name: Curated list title or label (e.g. "Editor's Choice").
  • placement_area: Target UI layout region (e.g. main_feed, sidebar_top, onboarding).
  • expires_at: ISO 8601 timestamp after which the list recommendation automatically expires.
  • user_id: Owner/curator numeric user ID.
  • article_ids: Staged array of numeric article IDs to include in the recommendation sequence.
Authorizations:
api-key
Request Body schema: application/json

Curated recommended list details.

name
string
placement_area
required
string
expires_at
string <date-time>
user_id
required
integer
article_ids
Array of integers

Responses

Request samples

Content type
application/json
{
  • "name": "string",
  • "placement_area": "string",
  • "expires_at": "2019-08-24T14:15:22Z",
  • "user_id": 0,
  • "article_ids": [
    ]
}

Response samples

Content type
application/json
{
  • "id": 0,
  • "name": "string",
  • "placement_area": "string",
  • "expires_at": "2019-08-24T14:15:22Z",
  • "user_id": 0,
  • "article_ids": [
    ],
  • "created_at": "2019-08-24T14:15:22Z",
  • "updated_at": "2019-08-24T14:15:22Z"
}

Retrieve details of a recommended articles list

Retrieve full details and nested article lists for a specific recommended articles list by ID. Requires Admin credentials.

Authorizations:
api-key
path Parameters
id
required
integer

Unique list numeric ID.

Responses

Response samples

Content type
application/json
{
  • "id": 0,
  • "name": "string",
  • "placement_area": "string",
  • "expires_at": "2019-08-24T14:15:22Z",
  • "user_id": 0,
  • "article_ids": [
    ],
  • "created_at": "2019-08-24T14:15:22Z",
  • "updated_at": "2019-08-24T14:15:22Z"
}

Update a recommended articles list

Update an existing recommended articles list by ID. Requires Admin credentials.

Authorizations:
api-key
path Parameters
id
required
integer

Unique list numeric ID.

Request Body schema: application/json

Updated list parameters.

name
string
placement_area
string
expires_at
string <date-time>
user_id
integer
article_ids
Array of integers

Responses

Request samples

Content type
application/json
{
  • "name": "string",
  • "placement_area": "string",
  • "expires_at": "2019-08-24T14:15:22Z",
  • "user_id": 0,
  • "article_ids": [
    ]
}

Response samples

Content type
application/json
{
  • "id": 0,
  • "name": "string",
  • "placement_area": "string",
  • "expires_at": "2019-08-24T14:15:22Z",
  • "user_id": 0,
  • "article_ids": [
    ],
  • "created_at": "2019-08-24T14:15:22Z",
  • "updated_at": "2019-08-24T14:15:22Z"
}

request_redirects

Retrieve all request redirects (Admin)

Retrieve a list of all request redirects configured on the platform.

Redirects Overview:

  • Redirects map incoming HTTP request paths or domains to specific target destination URLs (301 or 302 redirects).
  • Primarily used for managing vanity URLs, legacy path support, or domain migrations.
  • Requires Administrator privileges.
Authorizations:
api-key
query Parameters
page
integer

Pagination page index.

per_page
integer

Number of items to return per page.

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Create a request redirect (Admin)

Create a new request redirect route. Requires Administrator privileges.

Body Parameter Guidelines:

  • original_url: The source path (e.g. /old-page) to intercept.
  • destination_url: The target destination (e.g. https://myforem.com/new-page) to redirect users to.
  • request_domain: The domain scope (e.g. dev.to) where this redirect rule applies.
Authorizations:
api-key
Request Body schema: application/json

Redirect routing parameters.

object
original_url
required
string
destination_url
required
string
request_domain
required
string

Responses

Request samples

Content type
application/json
{
  • "request_redirect": {
    }
}

Response samples

Content type
application/json
{
  • "id": 0,
  • "original_url": "string",
  • "destination_url": "string",
  • "request_domain": "string",
  • "created_at": "2019-08-24T14:15:22Z",
  • "updated_at": "2019-08-24T14:15:22Z"
}

Retrieve a request redirect's details (Admin)

Retrieve details of a single request redirect route by ID. Requires Admin credentials.

Authorizations:
api-key
path Parameters
id
required
integer

Unique redirect ID.

Responses

Response samples

Content type
application/json
{
  • "id": 0,
  • "original_url": "string",
  • "destination_url": "string",
  • "request_domain": "string",
  • "created_at": "2019-08-24T14:15:22Z",
  • "updated_at": "2019-08-24T14:15:22Z"
}

Update a request redirect (Admin)

Update details (paths or domain scope) of an existing redirect route by ID. Requires Admin credentials.

Authorizations:
api-key
path Parameters
id
required
integer

Unique redirect ID to update.

Request Body schema: application/json

Updated redirect routing parameters.

object
original_url
string
destination_url
string
request_domain
string

Responses

Request samples

Content type
application/json
{
  • "request_redirect": {
    }
}

Response samples

Content type
application/json
{
  • "id": 0,
  • "original_url": "string",
  • "destination_url": "string",
  • "request_domain": "string",
  • "created_at": "2019-08-24T14:15:22Z",
  • "updated_at": "2019-08-24T14:15:22Z"
}

Delete a request redirect (Admin)

Delete a request redirect route, disabling the routing intercept immediately. Requires Admin credentials.

Authorizations:
api-key
path Parameters
id
required
integer

Unique redirect ID to delete.

Responses

subforems

Retrieve all discoverable subforems

Retrieve a list of all discoverable subforems/communities.

Subforems Overview:

  • Subforems represent distinct sub-communities or specialized sections hosted within the Forem instance.
  • Bypasses authentication (can be accessed publicly).
  • Returns list of names, slugs, color schemes, and target interests.

Responses

Response samples

Content type
application/json
[
  • {
    }
]

surveys

List surveys

Retrieve a list of surveys configured on the platform.

Surveys Overview:

  • Surveys are admin-defined questionnaires consisting of multiple choice or text polls.
  • Requires Administrator authorization.
  • Supports standard pagination controls and active status filtering.
Authorizations:
api-key
query Parameters
page
integer <int32> >= 1
Default: 1

Pagination page

per_page
integer <int32> [ 1 .. 1000 ]
Default: 30

Page size (the number of items to return per page). The default maximum value can be overridden by "API_PER_PAGE_MAX" environment variable.

active
boolean

Filter by active status. Omit to return all surveys.

Responses

Response samples

Content type
application/json
[
  • {
    }
]

A survey with polls

Retrieve a single survey (by ID or slug) with its nested structure.

Nested Format Details:

  • Returns the target Survey object including all associated Polls, multiple choice options, and configuration states.
  • Requires Administrator authorization.
Authorizations:
api-key
path Parameters
id_or_slug
required
string
Example: community-pulse-2026

The ID or slug of the survey.

Responses

Response samples

Content type
application/json
{
  • "type_of": "survey",
  • "id": 0,
  • "title": "string",
  • "slug": "string",
  • "survey_type_of": "community_pulse",
  • "active": true,
  • "display_title": true,
  • "allow_resubmission": true,
  • "created_at": "2019-08-24T14:15:22Z",
  • "updated_at": "2019-08-24T14:15:22Z",
  • "polls": [
    ]
}

Survey poll votes

Retrieve multiple-choice poll votes for a specific survey.

Cursor Pagination Tip:

  • Uses cursor-based pagination to safely stream high volumes of voting records.
  • Specify the after query parameter with the last retrieved record ID to get the next page.
  • Requires Administrator authorization.
Authorizations:
api-key
path Parameters
id_or_slug
required
string

The ID or slug of the survey.

query Parameters
per_page
integer <int32> [ 1 .. 1000 ]
Default: 30

Page size (the number of items to return per page). The default maximum value can be overridden by "API_PER_PAGE_MAX" environment variable.

after
integer
Example: after=42

Return only votes with an ID greater than this value.

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Survey poll text responses

Retrieve free-text poll responses for a specific survey.

Integration & Cursor Tip:

  • Fetches written user answers for text-input questions.
  • Uses cursor-based pagination (after query param) to stream responses.
  • Requires Administrator authorization.
Authorizations:
api-key
path Parameters
id_or_slug
required
string

The ID or slug of the survey.

query Parameters
per_page
integer <int32> [ 1 .. 1000 ]
Default: 30

Page size (the number of items to return per page). The default maximum value can be overridden by "API_PER_PAGE_MAX" environment variable.

after
integer
Example: after=42

Return only text responses with an ID greater than this value.

Responses

Response samples

Content type
application/json
[
  • {
    }
]

trends

Trends

Retrieve a list of active trends.

  • Trends represent hot topics or semantic themes currently being heavily discussed in the community.
  • They are computed by clustering semantic concept embeddings of recently published articles.
  • The score reflects the volume and engagement (views, comments, reactions) of articles associated with the trend.
  • Returned trends are ordered by score and recency.
  • Publicly accessible without authentication.

It supports pagination, each page will contain 10 trends by default.

query Parameters
page
integer <int32> >= 1
Default: 1

Pagination page

per_page
integer <int32> [ 1 .. 1000 ]
Default: 10

Page size (the number of items to return per page). The default maximum value can be overridden by "API_PER_PAGE_MAX" environment variable.

Responses

Response samples

Content type
application/json
[
  • {
    }
]

A Trend

Retrieve details of a single trend using either its numeric ID or unique slug.

Usage Guidance:

  • Useful for loading details of a trending topic (description, score, and slug details) to render header sections on trending tag or topic pages.
path Parameters
id_or_slug
required
string
Example: ruby-3-4-release

The ID or slug of the trend to retrieve.

Responses

Response samples

Content type
application/json
{ }

Articles in a Trend

Retrieve a list of published articles belonging to a trend.

Article Ordering & Proximity:

  • Articles are mapped to trends based on their embedding distance to the trend's centroid.
  • Returned articles are ordered by proximity/similarity (distance) first (most relevant posts first), and then by overall article engagement score.
  • Supports pagination, each page will contain 10 articles by default.
path Parameters
trend_id_or_slug
required
string
Example: ruby-3-4-release

The ID or slug of the trend to retrieve articles for.

query Parameters
page
integer <int32> >= 1
Default: 1

Pagination page

per_page
integer <int32> [ 1 .. 1000 ]
Default: 10

Page size (the number of items to return per page). The default maximum value can be overridden by "API_PER_PAGE_MAX" environment variable.

Responses

Response samples

Content type
application/json
[
  • {
    }
]

videos

Articles with a video

Retrieve a list of articles that contain uploaded videos.

Videos Overview:

  • Bypasses authentication (can be accessed publicly).
  • Returns articles that are published and include a video asset.
  • Articles are ordered by descending popularity (views, watch time, and reactions).
  • By default, returns 24 video articles per page.
query Parameters
page
integer <int32> >= 1
Default: 1

Pagination page

per_page
integer <int32> [ 1 .. 1000 ]
Default: 24

Page size (the number of items to return per page). The default maximum value can be overridden by "API_PER_PAGE_MAX" environment variable.

Responses

Response samples

Content type
application/json
[
  • {
    }
]