| name | dev.to |
| description | Dev.to API via curl. Use this skill to publish and manage articles on Dev.to. |
| vm0_secrets | DEVTO_API_KEY |
Dev.to Publisher
Use the Dev.to API via direct curl calls to publish and manage articles.
Official docs:
https://developers.forem.com/api/v1
When to Use
Use this skill when you need to:
- Publish articles to Dev.to
- Update existing articles
- Manage drafts
- Fetch your published articles
Prerequisites
- Go to https://dev.to/settings/extensions
- Scroll to "DEV Community API Keys"
- Generate a new API key
export DEVTO_API_KEY="your-api-key"
Important: When using
$VARin a command that pipes to another command, wrap the command containing$VARinbash -c '...'. Due to a Claude Code bug, environment variables are silently cleared when pipes are used directly.bash -c 'curl -s "https://api.example.com" -H "Authorization: Bearer $API_KEY"' | jq .
How to Use
All examples below assume you have DEVTO_API_KEY set.
1. Publish an Article
Write to /tmp/devto_request.json:
{
"article": {
"title": "My Awesome Article",
"body_markdown": "## Introduction\n\nThis is my article content.\n\n## Conclusion\n\nThanks for reading!",
"published": false,
"tags": ["javascript", "webdev"]
}
}
Then run:
bash -c 'curl -s -X POST "https://dev.to/api/articles" -H "api-key: ${DEVTO_API_KEY}" -H "Content-Type: application/json" -d @/tmp/devto_request.json' | jq '{id, url, published}'
Response:
{
"id": 123456,
"url": "https://dev.to/username/my-awesome-article-abc",
"published": false
}
2. Publish Immediately
Set published: true to publish right away:
Write to /tmp/devto_request.json:
{
"article": {
"title": "Published Article",
"body_markdown": "Content here...",
"published": true,
"tags": ["tutorial"]
}
}
Then run:
bash -c 'curl -s -X POST "https://dev.to/api/articles" -H "api-key: ${DEVTO_API_KEY}" -H "Content-Type: application/json" -d @/tmp/devto_request.json' | jq '{id, url, published}'
3. Publish with Cover Image
Write to /tmp/devto_request.json:
{
"article": {
"title": "Article with Cover",
"body_markdown": "Content here...",
"published": true,
"tags": ["webdev", "tutorial"],
"main_image": "https://example.com/cover.png"
}
}
Then run:
bash -c 'curl -s -X POST "https://dev.to/api/articles" -H "api-key: ${DEVTO_API_KEY}" -H "Content-Type: application/json" -d @/tmp/devto_request.json' | jq '{id, url}'
4. Publish from Markdown File
TITLE="My Article Title"
CONTENT=$(cat article.md | jq -Rs '.')
Write to /tmp/devto_request.json:
{
"article": {
"title": "${TITLE}",
"body_markdown": ${CONTENT},
"published": false,
"tags": ["programming"]
}
}
Then run:
bash -c 'curl -s -X POST "https://dev.to/api/articles" -H "api-key: ${DEVTO_API_KEY}" -H "Content-Type: application/json" -d @/tmp/devto_request.json' | jq '{id, url, published}'
Managing Articles
5. Get Your Articles
bash -c 'curl -s "https://dev.to/api/articles/me?per_page=10" -H "api-key: ${DEVTO_API_KEY}"' | jq '.[] | {id, title, published, url}'
6. Get Published Articles Only
bash -c 'curl -s "https://dev.to/api/articles/me/published?per_page=10" -H "api-key: ${DEVTO_API_KEY}"' | jq '.[] | {id, title, url}'
7. Get Unpublished (Drafts)
bash -c 'curl -s "https://dev.to/api/articles/me/unpublished" -H "api-key: ${DEVTO_API_KEY}"' | jq '.[] | {id, title}'
8. Get Single Article
Note: Replace
123456with an actual article ID from the "List My Articles" response (example 5) or from theidfield in the create article response (example 1).
ARTICLE_ID="123456"
bash -c 'curl -s "https://dev.to/api/articles/${ARTICLE_ID}" -H "api-key: ${DEVTO_API_KEY}"' | jq '{id, title, url, published}'
9. Update an Article
Note: Replace
123456with an actual article ID from the "List My Articles" response (example 5) or from theidfield in the create article response (example 1).
ARTICLE_ID="123456"
Write to /tmp/devto_request.json:
{
"article": {
"title": "Updated Title",
"body_markdown": "Updated content..."
}
}
Then run:
bash -c 'curl -s -X PUT "https://dev.to/api/articles/${ARTICLE_ID}" -H "api-key: ${DEVTO_API_KEY}" -H "Content-Type: application/json" -d @/tmp/devto_request.json' | jq '{id, url}'
10. Publish a Draft
Note: Replace
123456with an actual article ID from the "List My Articles" response (example 5) or from theidfield in the create article response (example 1).
ARTICLE_ID="123456"
Write to /tmp/devto_request.json:
{
"article": {
"published": true
}
}
Then run:
bash -c 'curl -s -X PUT "https://dev.to/api/articles/${ARTICLE_ID}" -H "api-key: ${DEVTO_API_KEY}" -H "Content-Type: application/json" -d @/tmp/devto_request.json' | jq '{id, url, published}'
Article Parameters
| Parameter | Type | Description |
|---|---|---|
title |
string | Article title (required) |
body_markdown |
string | Content in Markdown |
published |
boolean | true to publish, false for draft |
tags |
array | Up to 4 tags (lowercase, no spaces) |
main_image |
string | Cover image URL |
canonical_url |
string | Original article URL (for cross-posts) |
series |
string | Series name to group articles |
Examples
Tech Tutorial
Write to /tmp/devto_request.json:
{
"article": {
"title": "Getting Started with Docker",
"body_markdown": "## What is Docker?\n\nDocker is a platform for developing...\n\n## Installation\n\n```bash\nbrew install docker\n```\n\n## Your First Container\n\n```bash\ndocker run hello-world\n```",
"published": true,
"tags": ["docker", "devops", "tutorial", "beginners"]
}
}
Then run:
bash -c 'curl -s -X POST "https://dev.to/api/articles" -H "api-key: ${DEVTO_API_KEY}" -H "Content-Type: application/json" -d @/tmp/devto_request.json' | jq '{url}'
Cross-post from Blog
Write to /tmp/devto_request.json:
{
"article": {
"title": "My Blog Post",
"body_markdown": "Content from my blog...",
"published": true,
"canonical_url": "https://myblog.com/original-post",
"tags": ["webdev"]
}
}
Then run:
bash -c 'curl -s -X POST "https://dev.to/api/articles" -H "api-key: ${DEVTO_API_KEY}" -H "Content-Type: application/json" -d @/tmp/devto_request.json' | jq '{url}'
Article in a Series
Write to /tmp/devto_request.json:
{
"article": {
"title": "React Hooks - Part 1: useState",
"body_markdown": "First part of the series...",
"published": true,
"series": "React Hooks Deep Dive",
"tags": ["react", "javascript", "hooks"]
}
}
Then run:
bash -c 'curl -s -X POST "https://dev.to/api/articles" -H "api-key: ${DEVTO_API_KEY}" -H "Content-Type: application/json" -d @/tmp/devto_request.json' | jq '{url}'
Guidelines
- Max 4 tags: Dev.to limits articles to 4 tags
- Lowercase tags: Tags should be lowercase without spaces
- Escape markdown: Use
jq -Rsto properly escape markdown content - Cover images: Must be URLs, not local files
- Draft first: Set
published: falseto review before publishing - Check response: Always verify the returned URL