dev.to に API で記事を出す — 実測でしか分からなかったこと
ここに書いてあるのは全部、実際のアカウントで記事を出しながら観測したものです。 読んだ話ではありません。日付を入れてあるので、古くなっているかは各自で判断してください。
2026-09-04 〜 2026-09-06 の実測。記事19本、更新の呼び出しは約40回。
レート制限は 429 ではなく 500 で返る
いちばん時間を取られるのがこれです。500 は「サーバが壊れている」に読めるので、 再試行のループに入ってしまいます。
2026-09-04。 間隔を空けずに PUT /articles/:id を9回:
9回中3回 -> HTTP 500
本文に「レート制限」とは書かれていません。同じ内容を間隔を空けて投げ直すと、全部通ります。
| 間隔 | 回数 | 失敗 |
|---|---|---|
| なし | 9 | 3 |
| 10秒 | 6 | 0 |
| 10秒 | 11 | 0 |
| 20秒 | 7 | 0 |
書き込みの間を10秒空ければ、私が回した全部のバッチで通りました。 書き込みで 500 が返ったら、送った内容を疑う前に間隔を空けてください。
カバー画像は、送るときと返るときで名前が違う
送るのは main_image、返るのは cover_image です。
送信 { "article": { "main_image": "https://example.github.io/covers/a.png" } }
応答 { "cover_image": "https://media2.dev.to/dynamic/image/width=1000,.../https%3A%2F%2F..." }
応答の URL は dev.to 側の CDN で、送った URL を書き換えたものです。 つまり dev.to が取り込んだあとは、こちらの置き場が落ちても記事の表示は壊れません。
応答の main_image を見に行くと null なので、書き込みが効いていないように見えます。
published は毎回リクエストの値になる
「そのままにする」という選択肢がありません。送った値が、そのまま記事の状態になります。
PUT /articles/:id published: false で送る -> 公開済みの記事が取り下げられる
URL は残り、ページは 404 になり、貼られていたリンクが死にます。
published をコマンドラインのフラグで決めているツールなら、
フラグを付け忘れた更新が、直したかった記事を取り下げます。
安全な形は、推測せずに拒否することです。
if (existing?.published && !publish) {
throw new Error("この記事は公開済みです。--publish 無しの更新は下書きに戻します。");
}
推測するほうが危険です。「意図した取り下げ」と「フラグの付け忘れ」は、 ツールの中からは区別できません。
記事詳細の応答に series は入らない
series は article オブジェクトに載せれば設定できます。が、
GET /articles/:id は返してきません。
7本に series を設定して API を見ました。何も入っていません。 記事ページには最初から表示されていました。
# 設定できたかどうかは、これでは分からない
curl -H "api-key: $KEY" https://dev.to/api/articles/4570263 | jq .series
# こちらで分かる
curl -s https://dev.to/<user>/<slug> | grep -o "<シリーズ名>"
表示を確かめたいなら、表示を見ること。
同じ日に何本も出すと、ほとんどが埋まる
API の挙動ではありませんが、API があるとやってしまう失敗です。
2026-09-04。 英語記事9本を1日のうちに公開。24時間後の PV:
| 記事 | PV |
|---|---|
| 1本目 | 27 |
| 2本目 | 23 |
| 3本目 | 13 |
| 4本目 | 10 |
| 残り5本 | 0 |
フィードは時系列なので、まとめて出した記事は互いを埋めます。 以後は1日1本にしました。
0 のまま残った記事は、放っておいても回復しませんでした。
同一性はタイトルではなく id で持つ
GET /articles/me/published で自分の記事が取れます。
ここでタイトルで既存を探すと、タイトルの描画バグを直した日に、
ツールが自分の記事を見失って重複を作ります。
ファイル名と、API が採番した id の対応を持っておきます。
{ "ids": { "composite-github-action": 4576296 } }
そして記録があるのに見つからないときは止めます。 黙って新規作成に落ちるのがいちばん困ります。 同じ内容の記事が2本、同じ検索語で競合することになるからです。
注記
- API は Forem API v1。鍵は
api-keyヘッダに入れる - 上は1アカウントでの観測です。レート制限はアカウントの古さや評価で変わる可能性があります
- 公式ドキュメントと食い違う場合は、 まず公式を見てください。このページは実際に起きたことの記録です