Forem API
Comprehensive assistance with Forem API (v1) development. Forem is the platform that powers DEV.to and other online communities. This skill provides guidance on interacting with articles, users, comments, organizations, tags, and more through the Forem REST API.
This skill should be triggered when:
Set up authentication headers for Forem API v1 requests:
# Required headers for authenticated requests
curl -X GET "https://dev.to/api/articles/me" \
-H "api-key: YOUR_API_KEY" \
-H "accept: application/vnd.forem.api-v1+json"
Key points:
dev.to/settings/extensionsapi-key header (not Authorization)accept: application/vnd.forem.api-v1+json header# Retrieve current user's profile information
curl -X GET "https://dev.to/api/users/me" \
-H "api-key: YOUR_API_KEY" \
-H "accept: application/vnd.forem.api-v1+json"
Response:
{
"type_of": "user",
"id": 1431,
"username": "username480",
"name": "User Name",
"twitter_username": "twitter_handle",
"github_username": "github_handle",
"joined_at": "Apr 14, 2023",
"profile_image": "/uploads/user/profile_image/..."
}
// Create and publish an article with tags
const response = await fetch('https://dev.to/api/articles', {
method: 'POST',
headers: {
'api-key': 'YOUR_API_KEY',
'accept': 'application/vnd.forem.api-v1+json',
'content-type': 'application/json'
},
body: JSON.stringify({
article: {
title: "Getting Started with Forem API",
description: "Learn how to integrate with Forem",
body_markdown: "## Introduction\n\n**Forem** is amazing!",
published: true,
tags: ["webdev", "api", "tutorial"]
}
})
});
const data = await response.json();
console.log(data.url); // https://dev.to/username/getting-started-...
Returns: Article object with id, slug, path, url, and published_timestamp
import requests
# Get JavaScript articles from the last 7 days
params = {
'tag': 'javascript',
'top': 7,
'per_page': 10,
'page': 1
}
response = requests.get(
'https://dev.to/api/articles',
params=params,
headers={'accept': 'application/vnd.forem.api-v1+json'}
)
articles = response.json()
for article in articles:
print(f"{article['title']} by {article['user']['name']}")
Query parameters:
tag - Filter by single tagtags - Multiple tags (comma-separated)username - Filter by authortop - Days since publicationper_page - Results per page (30-1000)page - Page number for pagination# Retrieve your unpublished articles
curl -X GET "https://dev.to/api/articles/me/unpublished" \
-H "api-key: YOUR_API_KEY" \
-H "accept: application/vnd.forem.api-v1+json"
Other endpoints:
/articles/me - All your articles/articles/me/published - Published only/articles/me/unpublished - Drafts only/articles/me/all - Everything including hiddenPUT /articles/{id}
Content-Type: application/json
Headers: api-key, accept
{
"article": {
"title": "Updated Title",
"body_markdown": "Updated content with **bold** text",
"published": true
}
}
# Get comments by article ID
response = requests.get(
'https://dev.to/api/comments',
params={'a_id': 123456},
headers={'accept': 'application/vnd.forem.api-v1+json'}
)
comments = response.json()
for comment in comments:
print(f"{comment['user']['name']}: {comment['body_html']}")
Query parameters:
a_id - Article IDp_id - Podcast episode ID# Add a "like" reaction to an article
curl -X POST "https://dev.to/api/reactions" \
-H "api-key: YOUR_API_KEY" \
-H "accept: application/vnd.forem.api-v1+json" \
-H "content-type: application/json" \
-d '{
"category": "like",
"reactable_id": 123456,
"reactable_type": "Article"
}'
Categories: like, unicorn, readinglist, thinking
# Fetch organization information and articles
curl -X GET "https://dev.to/api/organizations/forem" \
-H "accept: application/vnd.forem.api-v1+json"
# Get organization's published articles
curl -X GET "https://dev.to/api/organizations/forem/articles" \
-H "accept: application/vnd.forem.api-v1+json"
// Fetch popular tags from the platform
const response = await fetch('https://dev.to/api/tags', {
headers: { 'accept': 'application/vnd.forem.api-v1+json' }
});
const tags = await response.json();
tags.forEach(tag => {
console.log(`${tag.name} - ${tag.bg_color_hex}`);
});
application/vnd.forem.api-v1+json)All responses use JSON format with consistent structure:
type_of - Resource type (article, user, comment, etc.)id - Unique identifierFollow best practices to avoid rate limits:
Most list endpoints support pagination:
page - Page number (starts at 1)per_page - Items per page (typically 30-1000, default 30)200 - Success (GET, PUT)201 - Created (POST)204 - No Content (DELETE, unpublish)401 - Unauthorized (invalid API key)404 - Not Found422 - Unprocessable Entity (validation errors)This skill includes comprehensive documentation in references/:
Use view or read the reference file directly when you need:
dev.to/settings/extensionsGET /articles or GET /users/{username} without authapi-key and accept headerspublished: false), review, then update to publishbody_markdown field with full Markdown syntaxPOST /articles - Publish new articleGET /articles - Get published articles (paginated)GET /articles/{id} - Get specific articlePUT /articles/{id} - Update articleGET /articles/me - Your articlesPUT /articles/{id}/unpublish - Unpublish articleGET /users/me - Current user infoGET /users/{id} - User by ID/usernameGET /comments - Get comments by article/episodeGET /comments/{id} - Specific comment with descendantsGET /organizations/{username} - Organization detailsGET /organizations/{username}/articles - Organization's articlesGET /organizations/{username}/users - Organization membersGET /tags - Available tagsGET /follows/tags - User's followed tagsGET /followers/users - User's followersPOST /reactions - Create reactionPOST /reactions/toggle - Toggle reactionGET /readinglist - User's reading listdev.to/settings/extensions or your Forem instance settingsapplication/vnd.forem.api-v1+json accept headerapi-key and accept)body_markdown for rich content