配信API と 記事JSON
投入する形式は1つだけです。あとは配信先の設定に従って自動で出し分けます。 対話的に試す場合は Swagger UI / ReDoc をご利用ください。
認証
環境変数 AUTOPOST_API_KEY を設定すると、配信系のエンドポイントが X-API-Key ヘッダで保護されます。
未設定の場合は認証なしで動くため、ローカル開発以外では必ず設定してください。
curl -X POST https://aisnsiodev-seobuilder.hf.space/v1/articles \
-H "X-API-Key: $AUTOPOST_API_KEY" \
-H "Content-Type: application/json" \
-d @article.json
エンドポイント
| メソッド / パス | 説明 | 認証 |
|---|---|---|
GET /v1/health | 稼働確認とバージョン、登録クライアント数 | 不要 |
GET /v1/platforms | 対応媒体と能力(canonical可否・予約可否・本文形式) | 不要 |
GET /v1/features | 機能カタログ 500項目と実装状況 | 不要 |
GET /v1/library | 記事ライブラリの一覧 | 不要 |
GET /v1/library/{slug} | 記事1件の生JSON | 不要 |
GET /v1/clients | クライアント一覧(認証情報はマスクして返す) | 必要 |
POST /v1/clients | クライアントの登録・更新 | 必要 |
POST /v1/articles | 記事を配信する。?dry_run=true で送信せず内容だけ返す | 必要 |
GET /v1/jobs/{id} | 配信ジョブの結果 | 必要 |
PUT /v1/jobs/{id}/results | 手動投稿(note / Ameba)の公開URLを記録 | 必要 |
POST /v1/clients/{id}/line/broadcast | 任意のURLをLINE友だちへ配信 | 必要 |
SEO運用API
配信APIのほかに、記事診断・キーワード・順位・計測・ワークフロー・レポートのエンドポイントがあります。
参照系は認証不要、変更系は write / publish スコープを要求します。
| メソッド / パス | 説明 |
|---|---|
GET /v1/analyze/{slug} | 記事を診断する(タイトル長・キーワード配置・読みやすさ・出典・表記ゆれ・薬機法表現) |
GET /v1/schema/{slug} | Article / BreadcrumbList / FAQPage / HowTo のJSON-LDを生成する |
GET /v1/llmo/{slug} | AI検索に引用されやすいかを診断する |
GET /v1/write/suggest/{slug} | タイトル案・メタ説明・FAQ・alt・要約をまとめて出す |
POST /v1/write/draft | 本文を生成する(要 ANTHROPIC_API_KEY) |
GET / POST /v1/keywords | キーワード台帳。クラスタリング・カバレッジ・カニバリ検出つき |
GET / POST /v1/ranks | 順位の記録と分析(変動・競合比較・シェアオブボイス) |
POST /v1/events | 計測イベントを記録する(同意が無ければ保存しない) |
GET /v1/analytics | 流入チャネル・記事別・CTA位置別・KPI進捗 |
GET / POST /v1/workflow/{slug} | 下書き→レビュー→承認→公開の状態管理 |
GET / POST /v1/schedule | 予約公開・繰り返し・編集カレンダー |
POST /v1/delivery/retry/{job_id} | 失敗した配信先だけ再実行する |
POST /v1/delivery/withdraw | 配信を撤回する(下書き化できない媒体は手作業として返す) |
GET /v1/reports/{client} | 月次レポート(?fmt=html でそのまま共有できる形) |
GET /v1/integrations | 外部連携の設定状況(未設定は未設定と返す) |
GET / POST /v1/keys | スコープ付きAPIキーの発行・失効 |
GET /v1/features | 機能カタログ500件と実装状況 |
認可のしくみ
APIキーを1本も発行していない間は、AUTOPOST_API_KEY による共有鍵(それも未設定ならローカル開発として無認証)で動きます。
POST /v1/keys でキーを発行すると、以後はスコープによる判定に切り替わります。
いまどのモードで動いているかは GET /v1/security/status で必ず確認できます。
# 閲覧専用キーをクライアントに渡す
curl -X POST .../v1/keys -H "X-API-Key: $ADMIN" \
-d '{"name":"クライアント閲覧用","role":"viewer"}'
# 生のキーは発行時にしか返らない(保存しているのはハッシュのみ)
記事JSON
1本の記事を表す共通フォーマットです。必須は client_id / slug / title / body_markdown の4つだけです。
| 項目 | 説明 |
|---|---|
client_id | 配信設定を引くクライアントID |
slug | URL用の文字列。空白や / ? # & は使えません |
title / body_markdown | タイトルと本文(Markdown) |
excerpt | 要約。teaser・SNS短文・meta description に使われます |
tags / category | 媒体側の分類欄へ引き渡されます |
cta | LINE誘導CTA。省略するとクライアント設定から補完されます |
variants | 媒体別の別原稿。{"qiita": {"title": ..., "body_markdown": ...}} |
social | SNS別の投稿文。省略時は本文から自動生成 |
targets | この記事だけの配信先。省略時はクライアントの既定配信先 |
fallback | 別原稿が無い媒体の扱い。teaser(既定)/ skip / full |
publish_at / draft | 予約公開の日時 / 下書きとして置くか |
{
"client_id": "demo",
"slug": "ai-inquiry-automation-small-business-2026",
"title": "中小企業がAIで問い合わせ対応を自動化する手順【2026年版】",
"excerpt": "問い合わせ対応の7割はAIで一次対応できます。導入の順番・費用感・失敗しない設計を、実際の運用フローに沿って解説します。",
"body_markdown": "問い合わせ対応に追われて本業の時間が削られていませんか。この記事では、月商500万円規模の会社が **追加の人員なし** で一次対応を自動化した手順をそのまま公開します。\n\n## なぜ今、問い合わせ対応をAI化すべきか\n\n2026年時点で、LINEやWebフォーム経由の問い合わせのうち約7割は「営業時間」「料金」「対応エリア」など定型の質問です。ここをAIが即答するだけで、返信までの平均時間は数時間から数十秒に縮まります。\n\n## ステップ1:よくある質問を20個書き出す\n\n過去3か月の問い合わせを見返し、頻度順に20個だけ抜き出します。最初から網羅しようとしないことが成功のコツです。\n\n## ステップ2:LINE公式アカウントに一次対応を置く\n\n問い合わせ窓口をLINEに寄せると、AI応答・ステップ配信・予約導線をひとつにまとめられます。\n\n## ステップ3:人が対応すべき問い合わせだけ通知する\n\nAIが答えられない質問はスタッフのLINEグループへ転送。転送率は初月で15%前後、2か月目には10%を切るのが目安です。\n\n## 費用感と導入期間\n\n初期設定は2〜3週間、月額はツール費込みで数千円〜数万円のレンジに収まります。\n\n## まとめ\n\n完璧を目指さず、20問の一次対応から始めるのが最短ルートです。",
"tags": [
"AI活用",
"問い合わせ対応",
"LINE公式アカウント",
"業務効率化"
],
"category": "AI活用",
"cover_image_url": "https://example.com/images/ai-inquiry.jpg",
"cta": {
"line_url": "https://lin.ee/XXXXXXX",
"offer": "御社の問い合わせをAI化した場合の削減時間を無料で試算します",
"label": "LINEで無料試算を受け取る",
"positions": [
"middle",
"bottom"
]
},
"variants": {
"qiita": {
"title": "LINE Messaging API × LLMで問い合わせ一次対応Botを最小構成で作る",
"body_markdown": "## 構成\n\nWebhook → 関数 → LLM → 返信、の4段です。\n\n## 実装のポイント\n\n1. FAQ 20問をシステムプロンプトに入れる\n2. 確信度が低い場合は人へ転送するフラグを返させる\n3. 会話ログは個人情報を除いて保存する\n\n## まとめ\n\n最初は20問で十分です。",
"tags": [
"LINE",
"LLM",
"Python"
]
}
},
"social": {
"linkedin": "問い合わせ対応の7割は定型質問。AIで一次対応を自動化した中小企業の手順を公開しました。",
"x": "問い合わせ対応をAIで自動化する手順(2026年版)をまとめました。最初は「よくある質問20個」からで十分です。",
"line_broadcast": "【新着】問い合わせ対応をAIで自動化する手順を公開しました。まずは20問から。"
},
"publish_at": null,
"draft": false,
"fallback": "teaser"
}
クライアント設定
clients.yaml に配信先・認証情報・CTAの既定値をまとめます。認証情報は ${ENV_VAR} 記法で環境変数から読み込むため、
ファイルにトークンを直接書く必要はありません。${VAR:-default} で既定値も指定できます。
clients:
- id: demo
name: デモ:AI活用支援サービス
site_url: https://example.com
line_url: https://lin.ee/XXXXXXX
line_offer: 「AI集客の無料診断」をLINEで受け付け中
utm_campaign: demo_blog
default_targets: [wordpress:main, hatena:main, devto:main, note:main, line:main]
targets:
wordpress:main:
role: primary
credentials:
site_url: https://example.com
username: ${WP_USER}
app_password: ${WP_APP_PASSWORD}
options:
canonical_meta: rank_math_canonical_url
line:main:
credentials:
channel_access_token: ${LINE_CHANNEL_ACCESS_TOKEN}
options:
mode: broadcast
template: flex
CLI
python -m autopost platforms
python -m autopost validate article.json --clients clients.yaml
python -m autopost publish article.json --clients clients.yaml --dry-run
python -m autopost publish today/*.json --clients clients.yaml \
--targets wordpress:main,line:main
自分で動かす
pip install -e ".[test]"
python -m pytest
AUTOPOST_API_KEY=xxx AUTOPOST_CLIENTS=data/clients.yaml \
uvicorn seobuilder.app:app --port 7860
Dockerで動かす場合は docker build -t seobuilder . && docker run -p 7860:7860 --env-file .env seobuilder です。