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.
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:
Responses
Response samples
- 200
[- {
- "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"
}
]upload a new agent session
Upload a new agent session.
S3 Upload Workflow:
- Call the S3 presign endpoint to obtain a direct upload URL for the raw session transcript file.
- Upload the raw transcript to S3.
- Send a POST request to this endpoint with the S3 key (
s3_key) and the pre-parsed, curated JSON payload (curated_data).
Authorizations:
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
- Payload
{- "title": "string",
- "curated_data": "string",
- "s3_key": "string",
- "tool_name": "claude_code"
}Response samples
- 201
{- "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:
path Parameters
| id required | string Example: my-session-abc123 The unique slug or ID of the agent session. |
Responses
Response samples
- 200
{- "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"
}Retrieve analytics totals
Retrieve aggregated lifetime stats (views, reactions, comments) for articles.
Scope Control:
- Specify
article_idto query a single post's metrics. - Specify
organization_idto retrieve metrics across all articles owned by the target organization.
Authorizations:
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:
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 dashboard analytics bundle
Retrieve a complete bundled metrics package (totals, history, top posts) for rendering dashboard landing pages.
Authorizations:
query Parameters
| start | string Example: start=2024-01-01 |
| end | string Example: end=2024-01-31 |
| article_id | integer |
| organization_id | integer |
Responses
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
trueto immediately publish the article and make it visible in feeds. Set tofalse(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:
Request Body schema: application/json
Representation of Article to be created
object | |||||||||||||||||||
| |||||||||||||||||||
Responses
Request samples
- Payload
{- "article": {
- "title": "string",
- "body_markdown": "string",
- "published": false,
- "series": "string",
- "main_image": "string",
- "canonical_url": "string",
- "description": "string",
- "tags": "string",
- "organization_id": 0
}
}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
tagto filter articles containing a single exact tag (e.g.tag=discuss). - Use
tagsto retrieve articles containing any of the comma-separated list of tags (e.g.tags=javascript,css). - Use
tags_excludeto filter out articles containing any of the comma-separated list of tags (e.g.tags_exclude=node,java).
- Use
- Filtering by User / Organization:
- Use
usernameto retrieve articles belonging to a specific User or Organization. Articles are returned in reverse chronological publication order.
- Use
- State Options:
- Use
state=freshto fetch fresh articles. - Use
state=risingto fetch rising/trending articles. - Combine
state=allwithusernameto fetch up to1000articles (both published and unpublished) from that user/organization in a single page.
- Use
- Top / Popularity:
- Use
top=Nto return the most popular articles published in the lastNdays (e.g.top=7for top articles of the week,top=30for top of the month). This parameter can be combined withtagto find top articles in a specific niche.
- Use
- Collections:
- Use
collection_idto retrieve articles belonging to a specific collection/series, sorted chronologically.
- Use
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 |
| 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 | string Enum: "fresh" "rising" "all" Example: state=fresh Using this parameter will allow the client to check which articles are fresh or rising.
If |
| top | integer <int32> >= 1 Example: top=2 Using this parameter will allow the client to return the most popular articles
in the last |
| 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
- 200
[- {
- "type_of": "string",
- "id": 0,
- "title": "string",
- "description": "string",
- "cover_image": "string",
- "readable_publish_date": "string",
- "social_image": "string",
- "tag_list": [
- "string"
], - "tags": "string",
- "slug": "string",
- "path": "string",
- "url": "string",
- "canonical_url": "string",
- "positive_reactions_count": 0,
- "public_reactions_count": 0,
- "created_at": "2019-08-24T14:15:22Z",
- "edited_at": "2019-08-24T14:15:22Z",
- "crossposted_at": "2019-08-24T14:15:22Z",
- "published_at": "2019-08-24T14:15:22Z",
- "last_comment_at": "2019-08-24T14:15:22Z",
- "published_timestamp": "2019-08-24T14:15:22Z",
- "reading_time_minutes": 0,
- "user": {
- "name": "string",
- "username": "string",
- "twitter_username": "string",
- "github_username": "string",
- "website_url": "string",
- "profile_image": "string",
- "profile_image_90": "string"
}, - "flare_tag": {
- "name": "string",
- "bg_color_hex": "string",
- "text_color_hex": "string"
}, - "organization": {
- "name": "string",
- "username": "string",
- "slug": "string",
- "profile_image": "string",
- "profile_image_90": "string"
}
}
]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
Ndays. - 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 |
| page | integer Pagination page index. |
| per_page | integer The number of items to return per page. |
Responses
Response samples
- 200
[- {
- "type_of": "string",
- "id": 0,
- "title": "string",
- "description": "string",
- "cover_image": "string",
- "readable_publish_date": "string",
- "social_image": "string",
- "tag_list": [
- "string"
], - "tags": "string",
- "slug": "string",
- "path": "string",
- "url": "string",
- "canonical_url": "string",
- "positive_reactions_count": 0,
- "public_reactions_count": 0,
- "created_at": "2019-08-24T14:15:22Z",
- "edited_at": "2019-08-24T14:15:22Z",
- "crossposted_at": "2019-08-24T14:15:22Z",
- "published_at": "2019-08-24T14:15:22Z",
- "last_comment_at": "2019-08-24T14:15:22Z",
- "published_timestamp": "2019-08-24T14:15:22Z",
- "reading_time_minutes": 0,
- "user": {
- "name": "string",
- "username": "string",
- "twitter_username": "string",
- "github_username": "string",
- "website_url": "string",
- "profile_image": "string",
- "profile_image_90": "string"
}, - "flare_tag": {
- "name": "string",
- "bg_color_hex": "string",
- "text_color_hex": "string"
}, - "organization": {
- "name": "string",
- "username": "string",
- "slug": "string",
- "profile_image": "string",
- "profile_image_90": "string"
}
}
]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
pageandper_pagequery 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
- 200
[- {
- "type_of": "string",
- "id": 0,
- "title": "string",
- "description": "string",
- "cover_image": "string",
- "readable_publish_date": "string",
- "social_image": "string",
- "tag_list": [
- "string"
], - "tags": "string",
- "slug": "string",
- "path": "string",
- "url": "string",
- "canonical_url": "string",
- "positive_reactions_count": 0,
- "public_reactions_count": 0,
- "created_at": "2019-08-24T14:15:22Z",
- "edited_at": "2019-08-24T14:15:22Z",
- "crossposted_at": "2019-08-24T14:15:22Z",
- "published_at": "2019-08-24T14:15:22Z",
- "last_comment_at": "2019-08-24T14:15:22Z",
- "published_timestamp": "2019-08-24T14:15:22Z",
- "reading_time_minutes": 0,
- "user": {
- "name": "string",
- "username": "string",
- "twitter_username": "string",
- "github_username": "string",
- "website_url": "string",
- "profile_image": "string",
- "profile_image_90": "string"
}, - "flare_tag": {
- "name": "string",
- "bg_color_hex": "string",
- "text_color_hex": "string"
}, - "organization": {
- "name": "string",
- "username": "string",
- "slug": "string",
- "profile_image": "string",
- "profile_image_90": "string"
}
}
]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
- 200
{ }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: falseon an already published article will revert it to draft status.
Authorizations:
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 | |||||||||||||||||||
| |||||||||||||||||||
Responses
Request samples
- Payload
{- "article": {
- "title": "string",
- "body_markdown": "string",
- "published": false,
- "series": "string",
- "main_image": "string",
- "canonical_url": "string",
- "description": "string",
- "tags": "string",
- "organization_id": 0
}
}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. |
Responses
Response samples
- 200
{ }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:
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
- 200
[- {
- "type_of": "string",
- "id": 0,
- "title": "string",
- "description": "string",
- "cover_image": "string",
- "readable_publish_date": "string",
- "social_image": "string",
- "tag_list": [
- "string"
], - "tags": "string",
- "slug": "string",
- "path": "string",
- "url": "string",
- "canonical_url": "string",
- "positive_reactions_count": 0,
- "public_reactions_count": 0,
- "created_at": "2019-08-24T14:15:22Z",
- "edited_at": "2019-08-24T14:15:22Z",
- "crossposted_at": "2019-08-24T14:15:22Z",
- "published_at": "2019-08-24T14:15:22Z",
- "last_comment_at": "2019-08-24T14:15:22Z",
- "published_timestamp": "2019-08-24T14:15:22Z",
- "reading_time_minutes": 0,
- "user": {
- "name": "string",
- "username": "string",
- "twitter_username": "string",
- "github_username": "string",
- "website_url": "string",
- "profile_image": "string",
- "profile_image_90": "string"
}, - "flare_tag": {
- "name": "string",
- "bg_color_hex": "string",
- "text_color_hex": "string"
}, - "organization": {
- "name": "string",
- "username": "string",
- "slug": "string",
- "profile_image": "string",
- "profile_image_90": "string"
}
}
]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:
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
- 200
[- {
- "type_of": "string",
- "id": 0,
- "title": "string",
- "description": "string",
- "cover_image": "string",
- "readable_publish_date": "string",
- "social_image": "string",
- "tag_list": [
- "string"
], - "tags": "string",
- "slug": "string",
- "path": "string",
- "url": "string",
- "canonical_url": "string",
- "positive_reactions_count": 0,
- "public_reactions_count": 0,
- "created_at": "2019-08-24T14:15:22Z",
- "edited_at": "2019-08-24T14:15:22Z",
- "crossposted_at": "2019-08-24T14:15:22Z",
- "published_at": "2019-08-24T14:15:22Z",
- "last_comment_at": "2019-08-24T14:15:22Z",
- "published_timestamp": "2019-08-24T14:15:22Z",
- "reading_time_minutes": 0,
- "user": {
- "name": "string",
- "username": "string",
- "twitter_username": "string",
- "github_username": "string",
- "website_url": "string",
- "profile_image": "string",
- "profile_image_90": "string"
}, - "flare_tag": {
- "name": "string",
- "bg_color_hex": "string",
- "text_color_hex": "string"
}, - "organization": {
- "name": "string",
- "username": "string",
- "slug": "string",
- "profile_image": "string",
- "profile_image_90": "string"
}
}
]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:
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
- 200
[- {
- "type_of": "string",
- "id": 0,
- "title": "string",
- "description": "string",
- "cover_image": "string",
- "readable_publish_date": "string",
- "social_image": "string",
- "tag_list": [
- "string"
], - "tags": "string",
- "slug": "string",
- "path": "string",
- "url": "string",
- "canonical_url": "string",
- "positive_reactions_count": 0,
- "public_reactions_count": 0,
- "created_at": "2019-08-24T14:15:22Z",
- "edited_at": "2019-08-24T14:15:22Z",
- "crossposted_at": "2019-08-24T14:15:22Z",
- "published_at": "2019-08-24T14:15:22Z",
- "last_comment_at": "2019-08-24T14:15:22Z",
- "published_timestamp": "2019-08-24T14:15:22Z",
- "reading_time_minutes": 0,
- "user": {
- "name": "string",
- "username": "string",
- "twitter_username": "string",
- "github_username": "string",
- "website_url": "string",
- "profile_image": "string",
- "profile_image_90": "string"
}, - "flare_tag": {
- "name": "string",
- "bg_color_hex": "string",
- "text_color_hex": "string"
}, - "organization": {
- "name": "string",
- "username": "string",
- "slug": "string",
- "profile_image": "string",
- "profile_image_90": "string"
}
}
]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:
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
- 200
[- {
- "type_of": "string",
- "id": 0,
- "title": "string",
- "description": "string",
- "cover_image": "string",
- "readable_publish_date": "string",
- "social_image": "string",
- "tag_list": [
- "string"
], - "tags": "string",
- "slug": "string",
- "path": "string",
- "url": "string",
- "canonical_url": "string",
- "positive_reactions_count": 0,
- "public_reactions_count": 0,
- "created_at": "2019-08-24T14:15:22Z",
- "edited_at": "2019-08-24T14:15:22Z",
- "crossposted_at": "2019-08-24T14:15:22Z",
- "published_at": "2019-08-24T14:15:22Z",
- "last_comment_at": "2019-08-24T14:15:22Z",
- "published_timestamp": "2019-08-24T14:15:22Z",
- "reading_time_minutes": 0,
- "user": {
- "name": "string",
- "username": "string",
- "twitter_username": "string",
- "github_username": "string",
- "website_url": "string",
- "profile_image": "string",
- "profile_image_90": "string"
}, - "flare_tag": {
- "name": "string",
- "bg_color_hex": "string",
- "text_color_hex": "string"
}, - "organization": {
- "name": "string",
- "username": "string",
- "slug": "string",
- "profile_image": "string",
- "profile_image_90": "string"
}
}
]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:
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
- 200
[- {
- "type_of": "string",
- "id": 0,
- "title": "string",
- "description": "string",
- "cover_image": "string",
- "readable_publish_date": "string",
- "social_image": "string",
- "tag_list": [
- "string"
], - "tags": "string",
- "slug": "string",
- "path": "string",
- "url": "string",
- "canonical_url": "string",
- "positive_reactions_count": 0,
- "public_reactions_count": 0,
- "created_at": "2019-08-24T14:15:22Z",
- "edited_at": "2019-08-24T14:15:22Z",
- "crossposted_at": "2019-08-24T14:15:22Z",
- "published_at": "2019-08-24T14:15:22Z",
- "last_comment_at": "2019-08-24T14:15:22Z",
- "published_timestamp": "2019-08-24T14:15:22Z",
- "reading_time_minutes": 0,
- "user": {
- "name": "string",
- "username": "string",
- "twitter_username": "string",
- "github_username": "string",
- "website_url": "string",
- "profile_image": "string",
- "profile_image_90": "string"
}, - "flare_tag": {
- "name": "string",
- "bg_color_hex": "string",
- "text_color_hex": "string"
}, - "organization": {
- "name": "string",
- "username": "string",
- "slug": "string",
- "profile_image": "string",
- "profile_image_90": "string"
}
}
]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
- 200
[- {
- "type_of": "string",
- "id": 0,
- "path": "string",
- "cloudinary_video_url": "string",
- "title": "string",
- "user_id": 0,
- "video_duration_in_minutes": "string",
- "video_source_url": "string",
- "user": {
- "name": "string"
}
}
]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:
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
- 200
[- {
- "type_of": "string",
- "id": 0,
- "title": "string",
- "description": "string",
- "cover_image": "string",
- "readable_publish_date": "string",
- "social_image": "string",
- "tag_list": [
- "string"
], - "tags": "string",
- "slug": "string",
- "path": "string",
- "url": "string",
- "canonical_url": "string",
- "positive_reactions_count": 0,
- "public_reactions_count": 0,
- "created_at": "2019-08-24T14:15:22Z",
- "edited_at": "2019-08-24T14:15:22Z",
- "crossposted_at": "2019-08-24T14:15:22Z",
- "published_at": "2019-08-24T14:15:22Z",
- "last_comment_at": "2019-08-24T14:15:22Z",
- "published_timestamp": "2019-08-24T14:15:22Z",
- "reading_time_minutes": 0,
- "user": {
- "name": "string",
- "username": "string",
- "twitter_username": "string",
- "github_username": "string",
- "website_url": "string",
- "profile_image": "string",
- "profile_image_90": "string"
}, - "flare_tag": {
- "name": "string",
- "bg_color_hex": "string",
- "text_color_hex": "string"
}, - "organization": {
- "name": "string",
- "username": "string",
- "slug": "string",
- "profile_image": "string",
- "profile_image_90": "string"
}
}
]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:
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
- 200
[- {
- "type_of": "string",
- "id": 0,
- "title": "string",
- "description": "string",
- "cover_image": "string",
- "readable_publish_date": "string",
- "social_image": "string",
- "tag_list": [
- "string"
], - "tags": "string",
- "slug": "string",
- "path": "string",
- "url": "string",
- "canonical_url": "string",
- "positive_reactions_count": 0,
- "public_reactions_count": 0,
- "created_at": "2019-08-24T14:15:22Z",
- "edited_at": "2019-08-24T14:15:22Z",
- "crossposted_at": "2019-08-24T14:15:22Z",
- "published_at": "2019-08-24T14:15:22Z",
- "last_comment_at": "2019-08-24T14:15:22Z",
- "published_timestamp": "2019-08-24T14:15:22Z",
- "reading_time_minutes": 0,
- "user": {
- "name": "string",
- "username": "string",
- "twitter_username": "string",
- "github_username": "string",
- "website_url": "string",
- "profile_image": "string",
- "profile_image_90": "string"
}, - "flare_tag": {
- "name": "string",
- "bg_color_hex": "string",
- "text_color_hex": "string"
}, - "organization": {
- "name": "string",
- "username": "string",
- "slug": "string",
- "profile_image": "string",
- "profile_image_90": "string"
}
}
]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:
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
- 200
[- {
- "type_of": "string",
- "id": 0,
- "title": "string",
- "description": "string",
- "cover_image": "string",
- "readable_publish_date": "string",
- "social_image": "string",
- "tag_list": [
- "string"
], - "tags": "string",
- "slug": "string",
- "path": "string",
- "url": "string",
- "canonical_url": "string",
- "positive_reactions_count": 0,
- "public_reactions_count": 0,
- "created_at": "2019-08-24T14:15:22Z",
- "edited_at": "2019-08-24T14:15:22Z",
- "crossposted_at": "2019-08-24T14:15:22Z",
- "published_at": "2019-08-24T14:15:22Z",
- "last_comment_at": "2019-08-24T14:15:22Z",
- "published_timestamp": "2019-08-24T14:15:22Z",
- "reading_time_minutes": 0,
- "user": {
- "name": "string",
- "username": "string",
- "twitter_username": "string",
- "github_username": "string",
- "website_url": "string",
- "profile_image": "string",
- "profile_image_90": "string"
}, - "flare_tag": {
- "name": "string",
- "bg_color_hex": "string",
- "text_color_hex": "string"
}, - "organization": {
- "name": "string",
- "username": "string",
- "slug": "string",
- "profile_image": "string",
- "profile_image_90": "string"
}
}
]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:
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
- 200
[- {
- "type_of": "string",
- "id": 0,
- "title": "string",
- "description": "string",
- "cover_image": "string",
- "readable_publish_date": "string",
- "social_image": "string",
- "tag_list": [
- "string"
], - "tags": "string",
- "slug": "string",
- "path": "string",
- "url": "string",
- "canonical_url": "string",
- "positive_reactions_count": 0,
- "public_reactions_count": 0,
- "created_at": "2019-08-24T14:15:22Z",
- "edited_at": "2019-08-24T14:15:22Z",
- "crossposted_at": "2019-08-24T14:15:22Z",
- "published_at": "2019-08-24T14:15:22Z",
- "last_comment_at": "2019-08-24T14:15:22Z",
- "published_timestamp": "2019-08-24T14:15:22Z",
- "reading_time_minutes": 0,
- "user": {
- "name": "string",
- "username": "string",
- "twitter_username": "string",
- "github_username": "string",
- "website_url": "string",
- "profile_image": "string",
- "profile_image_90": "string"
}, - "flare_tag": {
- "name": "string",
- "bg_color_hex": "string",
- "text_color_hex": "string"
}, - "organization": {
- "name": "string",
- "username": "string",
- "slug": "string",
- "profile_image": "string",
- "profile_image_90": "string"
}
}
]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
- 200
[- {
- "type_of": "string",
- "id": 0,
- "username": "string",
- "name": "string",
- "summary": "string",
- "twitter_username": "string",
- "github_username": "string",
- "website_url": "string",
- "location": "string",
- "joined_at": "string",
- "profile_image": "string"
}
]Suspend a User
Suspend a user's account.
Suspension Details:
- The user associated with the API key must have an
adminormoderatorrole. - Assigns the
suspendedrole 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:
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
adminormoderatorprivileges. - Assigns the
limitedrole, which rate-limits notifications generated by their actions (such as publishing new posts or comments). - Does not restrict content creation or delete content.
Authorizations:
path Parameters
| id required | integer <int32> >= 1 Example: 1 The ID of the user to limit. |
Responses
Add spam role for a User
Flag a user as spammer.
Spam Role Details:
- Requires
adminormoderatorprivileges. - 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:
path Parameters
| id required | integer <int32> >= 1 Example: 1 The ID of the user to assign the spam role. |
Responses
Add trusted role for a User
Assign the trusted role to a user.
Trusted Role Details:
- Requires
adminormoderatorprivileges. - 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:
path Parameters
| id required | integer <int32> >= 1 Example: 1 The ID of the user to assign the trusted role. |
Responses
The authenticated user
This endpoint allows the client to retrieve information about the authenticated user.
Usage Tips:
- Requires a valid
api-keyheader to identify the user. - Useful for checking permissions, verifying linking state, or retrieving user-specific profile settings.
Authorizations:
Responses
Response samples
- 200
{ }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
- 200
{ }Search for users
Search for a user by email address.
Permissions & Context:
- Requires administrative privileges (
api-keyof an administrator). - Used to verify account existence or map email addresses to platform usernames.
Authorizations:
query Parameters
| email required | string The exact email address of the user to search for. |
Responses
Response samples
- 200
{- "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": [
- 0
]
}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:
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:
Request Body schema: application/json
User invite params
string | |
| name | string or null |
Responses
Request samples
- Payload
{- "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
emailorusername. - Returns paginated list of extended user objects containing email addresses, registration dates, roles, and administrative statuses.
Authorizations:
query Parameters
| page | integer Pagination page index. |
| per_page | integer Number of items to return per page. |
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:
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:
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
- Payload
{- "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:
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
- Payload
{- "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:
path Parameters
| id required | integer Unique user ID. |
Request Body schema: application/json
Status parameters.
| status required | string |
| note | string |
Responses
Request samples
- Payload
{- "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:
path Parameters
| id required | integer Unique user ID. |
Request Body schema: application/json
Settings parameters.
required | object | ||
| |||
Responses
Request samples
- Payload
{- "notification_setting": {
- "email_newsletter": true
}
}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:
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
- Payload
{- "merge_user_id": 0
}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:
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
- Payload
{- "content": "string",
- "reason": "string"
}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:
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
- Payload
{- "provider": "string",
- "uid": "string",
- "username": "string"
}Bulk link identities (Admin)
Bulk link OAuth identities across multiple users. Requires Super Admin credentials.
Authorizations:
Request Body schema: application/json
Bulk identity params.
| provider required | string |
required | Array of objects |
Responses
Request samples
- Payload
{- "provider": "string",
- "identities": [
- {
- "user_id": 0,
- "uid": "string"
}
]
}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:
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
- 200
[- {
- "id": 0,
- "type_of": "manual",
- "user_count": 0
}
]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:
path Parameters
| id required | integer <int32> >= 1 Unique segment numerical ID. |
Responses
Response samples
- 200
{ }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:
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
pageandper_pagecontrols, returning 30 users per page by default.
Authorizations:
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
- 200
[- {
- "type_of": "string",
- "id": 0,
- "username": "string",
- "name": "string",
- "summary": "string",
- "twitter_username": "string",
- "github_username": "string",
- "website_url": "string",
- "location": "string",
- "joined_at": "string",
- "profile_image": "string"
}
]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_idsin the request body. - Returns a list of successes and failures. Successful additions include users already present in the segment.
Authorizations:
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
- Payload
{- "user_ids": [
- 0
]
}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_idsin the request body. - Returns successes (users successfully removed) and failures (users who were not members of the segment).
Authorizations:
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
- Payload
{- "user_ids": [
- 0
]
}Retrieve all badge achievements
Retrieve a list of all badge achievements (awarded badges) in the system. Requires administrator privileges.
Authorizations:
query Parameters
| page | integer Pagination page index. |
Responses
Response samples
- 200
[- {
- "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"
}
]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:
Request Body schema: application/json
Badge achievement details.
object | |||||||||
| |||||||||
Responses
Request samples
- Payload
{- "badge_achievement": {
- "user_id": 0,
- "badge_id": 0,
- "rewarding_context_message_markdown": "string",
- "include_default_description": true
}
}Response samples
- 201
{- "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:
path Parameters
| id required | integer Badge achievement unique ID. |
Responses
Response samples
- 200
{- "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 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:
query Parameters
| page | integer Pagination page index. |
Responses
Response samples
- 200
[- {
- "id": 0,
- "title": "string",
- "slug": "string",
- "description": "string",
- "badge_image": {
- "url": "string"
}, - "credits_awarded": 0,
- "allow_multiple_awards": true,
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}
]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
trueif a user can earn the same badge multiple times (e.g. weekly challenges).
Authorizations:
Request Body schema: application/json
Badge properties to create.
object | |||||||||||
| |||||||||||
Responses
Request samples
- Payload
{- "badge": {
- "title": "string",
- "description": "string",
- "remote_badge_image_url": "string",
- "credits_awarded": 0,
- "allow_multiple_awards": true
}
}Response samples
- 201
{- "id": 0,
- "title": "string",
- "slug": "string",
- "description": "string",
- "badge_image": {
- "url": "string"
}, - "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:
path Parameters
| id required | integer Unique badge ID. |
Responses
Response samples
- 200
{- "id": 0,
- "title": "string",
- "slug": "string",
- "description": "string",
- "badge_image": {
- "url": "string"
}, - "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:
path Parameters
| id required | integer Unique badge ID to update. |
Request Body schema: application/json
Badge properties to update.
object | |||||||||
| |||||||||
Responses
Request samples
- Payload
{- "badge": {
- "title": "string",
- "description": "string",
- "credits_awarded": 0,
- "allow_multiple_awards": true
}
}Response samples
- 200
{- "id": 0,
- "title": "string",
- "slug": "string",
- "description": "string",
- "badge_image": {
- "url": "string"
}, - "credits_awarded": 0,
- "allow_multiple_awards": true,
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}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:
Responses
Response samples
- 200
[- {
- "id": 0,
- "name": "string",
- "body_markdown": "string",
- "approved": true,
- "published": true,
- "expires_at": "2019-08-24T14:15:22Z",
- "organization_id": 0,
- "creator_id": 0,
- "placement_area": "sidebar_left",
- "tag_list": "string",
- "exclude_article_ids": "string",
- "audience_segment_id": 0,
- "audience_segment_type": "manual",
- "target_geolocations": [
- "string"
], - "display_to": "all",
- "type_of": "in_house"
}
]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:
Request Body schema: application/json
Billboard parameters.
| [$ref] | any |
Responses
Request samples
- Payload
{ }Response samples
- 201
{ }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:
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
- Payload
{ }Response samples
- 200
{ }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:
path Parameters
| id required | integer <int32> >= 1 Example: 123 The ID of the billboard to unpublish. |
Responses
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) ORp_id(Podcast Episode ID) to fetch comments. Specifying both is not supported. - Pagination: When paginating, the
pageparameter filters the top-level comments only. All replies to those top-level comments are returned nested inline, regardless of page index. - If the
pageparameter 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
- 200
[- {
- "type_of": "string",
- "id_code": "string",
- "created_at": "2019-08-24T14:15:22Z",
- "image_url": "string"
}
]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 |
Responses
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:
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
- 200
[- {
- "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": [
- {
- "date": "2019-08-24",
- "articles_count": 0,
- "comments_count": 0,
- "page_views": 0,
- "reactions_count": 0,
- "popularity_score": 0
}
], - "top_articles": [
- {
- "id": 0,
- "title": "string",
- "slug": "string",
- "score": 0,
- "published_at": "2019-08-24T14:15:22Z"
}
]
}
]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:
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
- 200
{- "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": [
- {
- "date": "2019-08-24",
- "articles_count": 0,
- "comments_count": 0,
- "page_views": 0,
- "reactions_count": 0,
- "popularity_score": 0
}
], - "top_articles": [
- {
- "id": 0,
- "title": "string",
- "slug": "string",
- "score": 0,
- "published_at": "2019-08-24T14:15:22Z"
}
]
}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:
path Parameters
| id required | integer Unique concept numerical ID. |
Request Body schema: application/json
object | |||||||
| |||||||
Responses
Request samples
- Payload
{- "concept": {
- "score": 0,
- "description": "string",
- "similarity_threshold": 0
}
}Response samples
- 200
{- "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": [
- {
- "date": "2019-08-24",
- "articles_count": 0,
- "comments_count": 0,
- "page_views": 0,
- "reactions_count": 0,
- "popularity_score": 0
}
], - "top_articles": [
- {
- "id": 0,
- "title": "string",
- "slug": "string",
- "score": 0,
- "published_at": "2019-08-24T14:15:22Z"
}
]
}Retrieve articles mapped to a concept
Retrieve articles classified under this concept.
Parameter Guidelines:
- sort: Set to
-similarityto sort articles by cosine similarity (most relevant first),-published_atto sort chronologically, or-scoreto sort by platform popularity score.
Authorizations:
path Parameters
| id required | integer Unique concept numerical ID. |
query Parameters
| sort | string Sorting criteria: |
| page | integer Pagination page index. |
| per_page | integer Number of items to return per page. |
Responses
Response samples
- 200
[- {
- "type_of": "string",
- "id": 0,
- "title": "string",
- "description": "string",
- "cover_image": "string",
- "readable_publish_date": "string",
- "social_image": "string",
- "tag_list": [
- "string"
], - "tags": "string",
- "slug": "string",
- "path": "string",
- "url": "string",
- "canonical_url": "string",
- "positive_reactions_count": 0,
- "public_reactions_count": 0,
- "created_at": "2019-08-24T14:15:22Z",
- "edited_at": "2019-08-24T14:15:22Z",
- "crossposted_at": "2019-08-24T14:15:22Z",
- "published_at": "2019-08-24T14:15:22Z",
- "last_comment_at": "2019-08-24T14:15:22Z",
- "published_timestamp": "2019-08-24T14:15:22Z",
- "reading_time_minutes": 0,
- "user": {
- "name": "string",
- "username": "string",
- "twitter_username": "string",
- "github_username": "string",
- "website_url": "string",
- "profile_image": "string",
- "profile_image_90": "string"
}, - "flare_tag": {
- "name": "string",
- "bg_color_hex": "string",
- "text_color_hex": "string"
}, - "organization": {
- "name": "string",
- "username": "string",
- "slug": "string",
- "profile_image": "string",
- "profile_image_90": "string"
}
}
]Retrieve all concepts (Admin)
Retrieve all concepts in the system including system and draft concepts. Admin credentials required.
Authorizations:
query Parameters
| page | integer |
| per_page | integer |
Responses
Response samples
- 200
[- {
- "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": [
- {
- "date": "2019-08-24",
- "articles_count": 0,
- "comments_count": 0,
- "page_views": 0,
- "reactions_count": 0,
- "popularity_score": 0
}
], - "top_articles": [
- {
- "id": 0,
- "title": "string",
- "slug": "string",
- "score": 0,
- "published_at": "2019-08-24T14:15:22Z"
}
]
}
]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:
Request Body schema: application/json
object | |||||||||||
| |||||||||||
Responses
Request samples
- Payload
{- "concept": {
- "name": "string",
- "description": "string",
- "parent_id": 0,
- "similarity_threshold": 0,
- "score": 0
}
}Response samples
- 201
{- "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": [
- {
- "date": "2019-08-24",
- "articles_count": 0,
- "comments_count": 0,
- "page_views": 0,
- "reactions_count": 0,
- "popularity_score": 0
}
], - "top_articles": [
- {
- "id": 0,
- "title": "string",
- "slug": "string",
- "score": 0,
- "published_at": "2019-08-24T14:15:22Z"
}
]
}Retrieve concept detail (Admin)
Retrieve full details of a specific concept by ID. Admin credentials required.
Authorizations:
path Parameters
| id required | integer |
Responses
Response samples
- 200
{- "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": [
- {
- "date": "2019-08-24",
- "articles_count": 0,
- "comments_count": 0,
- "page_views": 0,
- "reactions_count": 0,
- "popularity_score": 0
}
], - "top_articles": [
- {
- "id": 0,
- "title": "string",
- "slug": "string",
- "score": 0,
- "published_at": "2019-08-24T14:15:22Z"
}
]
}Update a concept (Admin)
Update concept properties. Admin credentials required.
Authorizations:
path Parameters
| id required | integer |
Request Body schema: application/json
object | |||||||||||
| |||||||||||
Responses
Request samples
- Payload
{- "concept": {
- "name": "string",
- "description": "string",
- "parent_id": 0,
- "similarity_threshold": 0,
- "score": 0
}
}Response samples
- 200
{- "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": [
- {
- "date": "2019-08-24",
- "articles_count": 0,
- "comments_count": 0,
- "page_views": 0,
- "reactions_count": 0,
- "popularity_score": 0
}
], - "top_articles": [
- {
- "id": 0,
- "title": "string",
- "slug": "string",
- "score": 0,
- "published_at": "2019-08-24T14:15:22Z"
}
]
}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:
path Parameters
| id required | integer |
Request Body schema: application/json
| days required | integer |
Responses
Request samples
- Payload
{- "days": 0
}Retrieve all concepts (Admin)
Retrieve all concepts in the system including system and draft concepts. Admin credentials required.
Authorizations:
query Parameters
| page | integer |
| per_page | integer |
Responses
Response samples
- 200
[- {
- "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": [
- {
- "date": "2019-08-24",
- "articles_count": 0,
- "comments_count": 0,
- "page_views": 0,
- "reactions_count": 0,
- "popularity_score": 0
}
], - "top_articles": [
- {
- "id": 0,
- "title": "string",
- "slug": "string",
- "score": 0,
- "published_at": "2019-08-24T14:15:22Z"
}
]
}
]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:
Request Body schema: application/json
object | |||||||||||
| |||||||||||
Responses
Request samples
- Payload
{- "concept": {
- "name": "string",
- "description": "string",
- "parent_id": 0,
- "similarity_threshold": 0,
- "score": 0
}
}Response samples
- 201
{- "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": [
- {
- "date": "2019-08-24",
- "articles_count": 0,
- "comments_count": 0,
- "page_views": 0,
- "reactions_count": 0,
- "popularity_score": 0
}
], - "top_articles": [
- {
- "id": 0,
- "title": "string",
- "slug": "string",
- "score": 0,
- "published_at": "2019-08-24T14:15:22Z"
}
]
}Retrieve concept detail (Admin)
Retrieve full details of a specific concept by ID. Admin credentials required.
Authorizations:
path Parameters
| id required | integer |
Responses
Response samples
- 200
{- "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": [
- {
- "date": "2019-08-24",
- "articles_count": 0,
- "comments_count": 0,
- "page_views": 0,
- "reactions_count": 0,
- "popularity_score": 0
}
], - "top_articles": [
- {
- "id": 0,
- "title": "string",
- "slug": "string",
- "score": 0,
- "published_at": "2019-08-24T14:15:22Z"
}
]
}Update a concept (Admin)
Update concept properties. Admin credentials required.
Authorizations:
path Parameters
| id required | integer |
Request Body schema: application/json
object | |||||||||||
| |||||||||||
Responses
Request samples
- Payload
{- "concept": {
- "name": "string",
- "description": "string",
- "parent_id": 0,
- "similarity_threshold": 0,
- "score": 0
}
}Response samples
- 200
{- "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": [
- {
- "date": "2019-08-24",
- "articles_count": 0,
- "comments_count": 0,
- "page_views": 0,
- "reactions_count": 0,
- "popularity_score": 0
}
], - "top_articles": [
- {
- "id": 0,
- "title": "string",
- "slug": "string",
- "score": 0,
- "published_at": "2019-08-24T14:15:22Z"
}
]
}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:
path Parameters
| id required | integer |
Request Body schema: application/json
| days required | integer |
Responses
Request samples
- Payload
{- "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, orIgnored).
Authorizations:
path Parameters
| id required | integer Unique feedback message ID. |
Request Body schema: application/json
Feedback parameters containing the status updates.
object | |||
| |||
Responses
Request samples
- Payload
{- "feedback_message": {
- "status": "string"
}
}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:
query Parameters
| page | integer Pagination page index. |
| per_page | integer Number of items to return per page. |
Responses
Response samples
- 200
[- {
- "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"
}
]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:
Request Body schema: application/json
Redirect routing parameters.
object | |||||||
| |||||||
Responses
Request samples
- Payload
{- "request_redirect": {
- "original_url": "string",
- "destination_url": "string",
- "request_domain": "string"
}
}Response samples
- 201
{- "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:
path Parameters
| id required | integer Unique redirect ID. |
Responses
Response samples
- 200
{- "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:
path Parameters
| id required | integer Unique redirect ID to update. |
Request Body schema: application/json
Updated redirect routing parameters.
object | |||||||
| |||||||
Responses
Request samples
- Payload
{- "request_redirect": {
- "original_url": "string",
- "destination_url": "string",
- "request_domain": "string"
}
}Response samples
- 200
{- "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"
}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:
Request Body schema: application/json
User invite params
string | |
| name | string or null |
Responses
Request samples
- Payload
{- "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
emailorusername. - Returns paginated list of extended user objects containing email addresses, registration dates, roles, and administrative statuses.
Authorizations:
query Parameters
| page | integer Pagination page index. |
| per_page | integer Number of items to return per page. |
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:
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:
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
- Payload
{- "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:
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
- Payload
{- "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:
path Parameters
| id required | integer Unique user ID. |
Request Body schema: application/json
Status parameters.
| status required | string |
| note | string |
Responses
Request samples
- Payload
{- "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:
path Parameters
| id required | integer Unique user ID. |
Request Body schema: application/json
Settings parameters.
required | object | ||
| |||
Responses
Request samples
- Payload
{- "notification_setting": {
- "email_newsletter": true
}
}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:
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
- Payload
{- "merge_user_id": 0
}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:
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
- Payload
{- "content": "string",
- "reason": "string"
}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:
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
- Payload
{- "provider": "string",
- "uid": "string",
- "username": "string"
}Bulk link identities (Admin)
Bulk link OAuth identities across multiple users. Requires Super Admin credentials.
Authorizations:
Request Body schema: application/json
Bulk identity params.
| provider required | string |
required | Array of objects |
Responses
Request samples
- Payload
{- "provider": "string",
- "identities": [
- {
- "user_id": 0,
- "uid": "string"
}
]
}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, orIgnored).
Authorizations:
path Parameters
| id required | integer Unique feedback message ID. |
Request Body schema: application/json
Feedback parameters containing the status updates.
object | |||
| |||
Responses
Request samples
- Payload
{- "feedback_message": {
- "status": "string"
}
}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:
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 |
Responses
Response samples
- 200
[- {
- "type_of": "string",
- "id": 0,
- "user_id": 0,
- "name": "string",
- "path": "string",
- "profile_image": "string"
}
]Follow users or organizations
Follow users or organizations in bulk on behalf of the authenticated user.
Bulk Update Behavior:
- Accepts arrays of
user_idsandorganization_idsin the request body. - Performs follow actions for all provided identifiers.
- Highly efficient for onboarding flows or importing social connections.
Authorizations:
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
- Payload
{- "user_ids": [
- 0
], - "organization_ids": [
- 0
]
}Response samples
- 200
{- "outcome": "string"
}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
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. |
Responses
Response samples
- 200
{ }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
- 200
[- {
- "type_of": "string",
- "id": 0,
- "username": "string",
- "name": "string",
- "summary": "string",
- "twitter_username": "string",
- "github_username": "string",
- "website_url": "string",
- "location": "string",
- "joined_at": "string",
- "profile_image": "string"
}
]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
- 200
[- {
- "type_of": "string",
- "id": 0,
- "title": "string",
- "description": "string",
- "cover_image": "string",
- "readable_publish_date": "string",
- "social_image": "string",
- "tag_list": [
- "string"
], - "tags": "string",
- "slug": "string",
- "path": "string",
- "url": "string",
- "canonical_url": "string",
- "positive_reactions_count": 0,
- "public_reactions_count": 0,
- "created_at": "2019-08-24T14:15:22Z",
- "edited_at": "2019-08-24T14:15:22Z",
- "crossposted_at": "2019-08-24T14:15:22Z",
- "published_at": "2019-08-24T14:15:22Z",
- "last_comment_at": "2019-08-24T14:15:22Z",
- "published_timestamp": "2019-08-24T14:15:22Z",
- "reading_time_minutes": 0,
- "user": {
- "name": "string",
- "username": "string",
- "twitter_username": "string",
- "github_username": "string",
- "website_url": "string",
- "profile_image": "string",
- "profile_image_90": "string"
}, - "flare_tag": {
- "name": "string",
- "bg_color_hex": "string",
- "text_color_hex": "string"
}, - "organization": {
- "name": "string",
- "username": "string",
- "slug": "string",
- "profile_image": "string",
- "profile_image_90": "string"
}
}
]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
- 200
[- {
- "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"
}
]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:
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
- Payload
{- "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"
}Update an organization by id
This endpoint allows the client to update an existing organization.
Authorizations:
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
- Payload
{- "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"
}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
- 200
[- {
- "title": "string",
- "slug": "string",
- "description": "string",
- "body_markdown": "string",
- "body_json": "string",
- "is_top_level_path": true,
- "social_image": { },
- "template": "contained"
}
]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:
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
- Payload
{- "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
- 200
{- "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:
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
- Payload
{- "title": "string",
- "slug": "string",
- "description": "string",
- "body_markdown": "string",
- "body_json": "string",
- "is_top_level_path": true,
- "social_image": { },
- "template": "contained"
}Response samples
- 200
{- "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:
path Parameters
| id required | integer <int32> >= 1 Example: 1 The ID of the page to delete. |
Responses
Response samples
- 200
{- "title": "string",
- "slug": "string",
- "description": "string",
- "body_markdown": "string",
- "body_json": "string",
- "is_top_level_path": true,
- "social_image": { },
- "template": "contained"
}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
- 200
[- {
- "type_of": "string",
- "id": 0,
- "class_name": "string",
- "path": "string",
- "title": "string",
- "image_url": "string",
- "podcast": {
- "title": "string",
- "slug": "string",
- "image_url": "string"
}
}
]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:
path Parameters
| username required | string Example: janedoe The unique username of the target user or organization. |
Responses
Response samples
- 200
{ }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:
query Parameters
| category required | string Enum: "like" "unicorn" "exploding_head" "raised_hands" "fire" The type of reaction (e.g. |
| 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. |
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:
query Parameters
| category required | string Enum: "like" "unicorn" "exploding_head" "raised_hands" "fire" The type of reaction (e.g. |
| 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. |
Responses
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:
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
- 200
[- {
- "type_of": "string",
- "id": 0,
- "title": "string",
- "description": "string",
- "cover_image": "string",
- "readable_publish_date": "string",
- "social_image": "string",
- "tag_list": [
- "string"
], - "tags": "string",
- "slug": "string",
- "path": "string",
- "url": "string",
- "canonical_url": "string",
- "positive_reactions_count": 0,
- "public_reactions_count": 0,
- "created_at": "2019-08-24T14:15:22Z",
- "edited_at": "2019-08-24T14:15:22Z",
- "crossposted_at": "2019-08-24T14:15:22Z",
- "published_at": "2019-08-24T14:15:22Z",
- "last_comment_at": "2019-08-24T14:15:22Z",
- "published_timestamp": "2019-08-24T14:15:22Z",
- "reading_time_minutes": 0,
- "user": {
- "name": "string",
- "username": "string",
- "twitter_username": "string",
- "github_username": "string",
- "website_url": "string",
- "profile_image": "string",
- "profile_image_90": "string"
}, - "flare_tag": {
- "name": "string",
- "bg_color_hex": "string",
- "text_color_hex": "string"
}, - "organization": {
- "name": "string",
- "username": "string",
- "slug": "string",
- "profile_image": "string",
- "profile_image_90": "string"
}
}
]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_feedorsidebar). - Supports search by list name and standard query pagination.
- Requires Administrator privileges.
Authorizations:
query Parameters
| page | integer Pagination page index. |
| search | string Search term to match against recommended list names. |
Responses
Response samples
- 200
[- {
- "id": 0,
- "name": "string",
- "placement_area": "string",
- "expires_at": "2019-08-24T14:15:22Z",
- "user_id": 0,
- "article_ids": [
- 0
], - "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}
]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:
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
- Payload
{- "name": "string",
- "placement_area": "string",
- "expires_at": "2019-08-24T14:15:22Z",
- "user_id": 0,
- "article_ids": [
- 0
]
}Response samples
- 201
{- "id": 0,
- "name": "string",
- "placement_area": "string",
- "expires_at": "2019-08-24T14:15:22Z",
- "user_id": 0,
- "article_ids": [
- 0
], - "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:
path Parameters
| id required | integer Unique list numeric ID. |
Responses
Response samples
- 200
{- "id": 0,
- "name": "string",
- "placement_area": "string",
- "expires_at": "2019-08-24T14:15:22Z",
- "user_id": 0,
- "article_ids": [
- 0
], - "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:
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
- Payload
{- "name": "string",
- "placement_area": "string",
- "expires_at": "2019-08-24T14:15:22Z",
- "user_id": 0,
- "article_ids": [
- 0
]
}Response samples
- 200
{- "id": 0,
- "name": "string",
- "placement_area": "string",
- "expires_at": "2019-08-24T14:15:22Z",
- "user_id": 0,
- "article_ids": [
- 0
], - "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}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:
query Parameters
| page | integer Pagination page index. |
| per_page | integer Number of items to return per page. |
Responses
Response samples
- 200
[- {
- "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"
}
]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:
Request Body schema: application/json
Redirect routing parameters.
object | |||||||
| |||||||
Responses
Request samples
- Payload
{- "request_redirect": {
- "original_url": "string",
- "destination_url": "string",
- "request_domain": "string"
}
}Response samples
- 201
{- "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:
path Parameters
| id required | integer Unique redirect ID. |
Responses
Response samples
- 200
{- "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:
path Parameters
| id required | integer Unique redirect ID to update. |
Request Body schema: application/json
Updated redirect routing parameters.
object | |||||||
| |||||||
Responses
Request samples
- Payload
{- "request_redirect": {
- "original_url": "string",
- "destination_url": "string",
- "request_domain": "string"
}
}Response samples
- 200
{- "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 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
- 200
[- {
- "id": 0,
- "domain": "string",
- "root": true,
- "name": "string",
- "description": "string",
- "logo_image_url": "string",
- "cover_image_url": "string"
}
]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:
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
- 200
[- {
- "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"
}
]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:
path Parameters
| id_or_slug required | string Example: community-pulse-2026 The ID or slug of the survey. |
Responses
Response samples
- 200
{- "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": [
- {
- "type_of": "poll",
- "id": 0,
- "prompt_markdown": "string",
- "prompt_html": "string",
- "poll_type_of": "single_choice",
- "position": 0,
- "poll_votes_count": 0,
- "poll_skips_count": 0,
- "poll_options_count": 0,
- "scale_min": 0,
- "scale_max": 0,
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z",
- "poll_options": [
- {
- "type_of": "poll_option",
- "id": 0,
- "markdown": "string",
- "processed_html": "string",
- "position": 0,
- "poll_votes_count": 0,
- "supplementary_text": "string"
}
]
}
]
}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
afterquery parameter with the last retrieved record ID to get the next page. - Requires Administrator authorization.
Authorizations:
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
- 200
[- {
- "type_of": "poll_vote",
- "id": 0,
- "poll_id": 0,
- "poll_option_id": 0,
- "user_id": 0,
- "user_email": "user@example.com",
- "session_start": 0,
- "created_at": "2019-08-24T14:15:22Z"
}
]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 (
afterquery param) to stream responses. - Requires Administrator authorization.
Authorizations:
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
- 200
[- {
- "type_of": "poll_text_response",
- "id": 0,
- "poll_id": 0,
- "user_id": 0,
- "user_email": "user@example.com",
- "text_content": "string",
- "session_start": 0,
- "created_at": "2019-08-24T14:15:22Z"
}
]Trends
Retrieve a list of active trends.
Trends Overview & Score Calculation:
- 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
scorereflects 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
- 200
[- {
- "type_of": "string",
- "id": 0,
- "name": "string",
- "slug": "string",
- "description": "string",
- "key_questions": [
- "string"
], - "score": 0,
- "articles_count": 0,
- "cover_image": "string",
- "first_observed_at": "2019-08-24T14:15:22Z",
- "last_observed_at": "2019-08-24T14:15:22Z",
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}
]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
- 200
{ }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
- 200
[- {
- "type_of": "string",
- "id": 0,
- "title": "string",
- "description": "string",
- "cover_image": "string",
- "readable_publish_date": "string",
- "social_image": "string",
- "tag_list": [
- "string"
], - "tags": "string",
- "slug": "string",
- "path": "string",
- "url": "string",
- "canonical_url": "string",
- "positive_reactions_count": 0,
- "public_reactions_count": 0,
- "created_at": "2019-08-24T14:15:22Z",
- "edited_at": "2019-08-24T14:15:22Z",
- "crossposted_at": "2019-08-24T14:15:22Z",
- "published_at": "2019-08-24T14:15:22Z",
- "last_comment_at": "2019-08-24T14:15:22Z",
- "published_timestamp": "2019-08-24T14:15:22Z",
- "reading_time_minutes": 0,
- "user": {
- "name": "string",
- "username": "string",
- "twitter_username": "string",
- "github_username": "string",
- "website_url": "string",
- "profile_image": "string",
- "profile_image_90": "string"
}, - "flare_tag": {
- "name": "string",
- "bg_color_hex": "string",
- "text_color_hex": "string"
}, - "organization": {
- "name": "string",
- "username": "string",
- "slug": "string",
- "profile_image": "string",
- "profile_image_90": "string"
}
}
]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
- 200
[- {
- "type_of": "string",
- "id": 0,
- "path": "string",
- "cloudinary_video_url": "string",
- "title": "string",
- "user_id": 0,
- "video_duration_in_minutes": "string",
- "video_source_url": "string",
- "user": {
- "name": "string"
}
}
]