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 $VAR in a command that pipes to another command, wrap the command containing $VAR in bash -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"'
How to Use
All examples below assume you have DEVTO_API_KEY set.
- 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 }
- 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}'
- 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}'
- Publish from Markdown File
To publish from a markdown file, first convert it to JSON:
cat article.md | jq -Rs '.' > /tmp/content.json
Write to /tmp/devto_request.json:
{ "article": { "title": "My Article Title", "body_markdown": "Your article content here...", "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}'
-
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}'
-
Get Unpublished (Drafts) bash -c 'curl -s "https://dev.to/api/articles/me/unpublished" -H "api-key: ${DEVTO_API_KEY}"' | jq '.[] | {id, title}'
-
Get Single Article
Replace
bash -c 'curl -s "https://dev.to/api/articles/
- Update an Article
Replace
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/
- Publish a Draft
Replace
Write to /tmp/devto_request.json:
{ "article": { "published": true } }
Then run:
bash -c 'curl -s -X PUT "https://dev.to/api/articles/
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\nbash\nbrew install docker\n\n\n## Your First Container\n\nbash\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 -Rs to properly escape markdown content Cover images: Must be URLs, not local files Draft first: Set published: false to review before publishing Check response: Always verify the returned URL