ハルCMS Docs llms-full.txt ダッシュボード

ハルCMS 開発者ドキュメント

記事の作成・公開・取得をプログラムとAIから。REST API・MCPサーバー・配信APIのリファレンス。

書き込みは REST APIMCP(同じAPIキー・同じ検証を通る)、サイトへの表示は認証不要の配信API。記事を published にすると、配信APIに即座に載ります。

app.harucms.comREST /api/ext/v1・MCP /mcp {サブドメイン}.harucms.app配信 /v1(公開・キー不要) img.harucms.com画像(アップロードAPIが返すURL)

3つの入口

ハルCMSは、株式会社Web春が運営する日本語ファーストのヘッドレスCMSです。ブラウザのエディタに加えて、次の3つのプログラム向け入口を提供します。

入口URL認証用途
REST APIhttps://app.harucms.com/api/ext/v1APIキー(Bearer)記事の作成・更新・公開・画像アップロード
MCPサーバーhttps://app.harucms.com/mcp同じAPIキーClaude等のAIアシスタントから直接操作
配信APIhttps://{サブドメイン}.harucms.app/v1不要(公開)サイト側から公開記事を取得
  • Markdownファースト — 本文は body_md(Markdown)だけ送ればOK。HTML変換はサーバー側で行います。
  • 公開は即時status: "published" にした瞬間、配信APIに載ります。Webhook・CI設定は不要です。
  • エディタと同一の検証 — API・MCP経由の操作もブラウザのエディタと同じ検証・変更履歴・監査ログを通ります。
  • AI最適化 — MCP標準搭載・llms-full.txt 提供・下書き既定などの安全設計込み。

クイックスタート

0. APIキーを発行する

ダッシュボード(app.harucms.com)にログイン → 対象サイトの「APIキー」→ 用途がわかる名前を付けて発行します。キーの値が表示されるのは発行時の一度だけです(サーバーにはハッシュのみ保存)。停止・削除も同じ画面からいつでもできます。

1. 接続を確認する

curl https://app.harucms.com/api/ext/v1/me \
  -H "Authorization: Bearer hcms_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
const BASE = "https://app.harucms.com/api/ext/v1";
const KEY = process.env.HARUCMS_API_KEY;

const res = await fetch(`${BASE}/me`, {
  headers: { Authorization: `Bearer ${KEY}` },
});
console.log(await res.json());
import os, requests

BASE = "https://app.harucms.com/api/ext/v1"
KEY = os.environ["HARUCMS_API_KEY"]

r = requests.get(f"{BASE}/me", headers={"Authorization": f"Bearer {KEY}"})
print(r.json())
// レスポンス
{
  "ok": true,
  "data": {
    "site_name": "あなたのサイト名",
    "api_host": "your-site.harucms.app",
    "custom_domain": null,
    "collections": ["news"]
  }
}

2. 下書きを作る

curl -X POST "$BASE/posts" \
  -H "Authorization: Bearer $KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "title": "夏季休業のお知らせ",
    "body_md": "## 休業期間\n\n8月13日〜16日はお休みをいただきます。",
    "category": "お知らせ"
  }'

status を省略すると必ず下書き(draft)として作成されます。サイトには載りません。

3. 公開する

curl -X PUT "$BASE/posts/作成された記事のidまたはslug" \
  -H "Authorization: Bearer $KEY" \
  -H "Content-Type: application/json" \
  -d '{ "status": "published" }'
公開の仕組み公開した記事は配信API(https://{サブドメイン}.harucms.app/v1/posts)に即座に載ります。エッジキャッシュ(約5分)が挟まるため、地域によっては反映まで最大5分かかることがあります。

認証とAPIキー

REST・MCP共通で、すべてのリクエストに以下のヘッダーが必要です。

ヘッダー必須
AuthorizationBearer hcms_...(`hcms_` + 32文字のAPIキー)はい
Content-Typeapplication/json(ボディがある場合)POST / PUT

キーの性質

  • キーはサイトごとに発行され、そのサイトの記事・メディアだけを操作できます。他のサイト・アカウント設定・課金には一切アクセスできません。
  • サーバー側にはキーのハッシュ(SHA-256)のみ保存されます。値が見られるのは発行時の一度だけです。紛失した場合は削除して再発行してください。
  • キーの停止・削除は即時反映されます(以後の全リクエストは 401)。
  • すべての操作はサイトの監査ログに記録されます(いつ・どのキーが・何をしたか)。
  • キーを発行したメンバーをサイトから外すと、そのメンバーが発行したキーも自動で停止されます。
キーの取り扱いキーはコードにハードコードせず、環境変数(推奨名: HARUCMS_API_KEY)やシークレットマネージャに保管してください。公開リポジトリへのコミットは厳禁です。漏えいが疑われる場合はダッシュボードで該当キーを停止または削除してください(即時失効します)。

コンテンツモデル

コンテンツの単位は「記事(post)」です。記事は「コレクション」に属します(例: news = お知らせ、blog = ブログ)。コレクション名は半角英小文字・数字・-_(1〜32文字)で、省略時は news。使用中の一覧は GET /me で確認できます。

記事のフィールド

フィールド説明
idstring記事ID(post_ で始まる。システム発行)
slugstringURLになる識別子。サイト内で一意。省略時は自動採番(ランダム値)
titlestring記事タイトル(日本語なら25〜30字目安)
body_mdstring本文(Markdown)。これが原稿の正。見出しは ## から
body_htmlstring本文HTML。未指定なら body_md からサーバーが生成(送らないことを推奨)
excerptstring | null要約(一覧・OGP・検索結果用。80字目安)
cover_imagestring | null表紙画像URL(メディアAPIの返すURL)
categorystring | nullカテゴリ名(自由入力。既存一覧と表記を揃える)
statusstringdraft(下書き・既定)/ published(公開)/ scheduled(予約)
collectionstring所属コレクション。既定 news
publish_atstring | null予約公開日時(scheduled のとき必須・ISO 8601)
published_atstring | null公開日時(公開時に自動設定・UTC)
authorstring | null投稿者表示名(API経由の操作はキーの名前が入る)
seoobject | null記事単位のSEO設定(下記
updated_atstring最終更新日時(UTC)

slugのルール: 半角英数字で始まり、英数字と - _ . だけが使えます(120文字以内)。SEOを意識するなら英小文字とハイフンでの明示指定を推奨します。

公開ステータスの遷移

status挙動
draft下書き。配信APIには一切出ない(既定値。不正な値を送った場合もdraftになる)
published即時公開。配信APIに載る
scheduled予約公開。publish_at の時刻を過ぎると5分以内に自動公開され、公開日時には予約時刻が入る

公開中の記事を draft に戻すと、配信APIからも取り下げられます。保存のたびに変更履歴が自動で残り、エディタから復元できます。

日時の形式入力はISO 8601(例 2026-09-01T10:00:00+09:00・タイムゾーン付き推奨)。レスポンスの日時は YYYY-MM-DD HH:MM:SSUTC)で返ります。サイト表示ではJSTへの変換を忘れずに。

SEO設定(seoフィールド)

作成・更新時に seo オブジェクトを渡すと、記事単位のSEO・構造化データを設定できます。すべて任意です(設定するものだけ入れる)。

フィールド説明
meta_titlestringtitleタグの上書き(全角32字以内推奨)
meta_descriptionstringmeta description / og:description(80〜120字推奨)
noindexbooleantrue で検索エンジンから除外
canonicalstring正規URL(http(s)の絶対URLのみ有効)
takeawaysstring[]記事の要点(最大10個・3〜5個推奨。AI検索の要約枠に効く)
faq[{q, a}]FAQペア(最大20個・2〜5個推奨。FAQ構造化データになる)
jsonld_extraobject[]任意のJSON-LDブロック(最大5個。HowTo・Product等)

検証はサーバー側で行われ、不正な形のフィールドは黙って捨てられます(エラーにはなりません)。更新時に seo を省略すると既存値を維持、null を送るとクリアします。

AIで書くならmeta_descriptiontakeawaysfaq を本文に基づいて埋めるのが、検索とAI検索(AI Overview等)への露出を上げる最短ルートです。
GET/api/ext/v1/me

キーが指すサイトの情報を返します。接続テストと、配信ホスト・コレクションの確認に使います。

curl "$BASE/me" -H "Authorization: Bearer $KEY"

// 200
{ "ok": true, "data": { "site_name": "サイト名", "api_host": "your-site.harucms.app",
  "custom_domain": null, "collections": ["news"] } }
GET/api/ext/v1/posts

記事一覧を新しい順に返します(本文は含みません。全文は GET /posts/:id)。下書き・予約も含む管理用の一覧です。

クエリ説明
collectionstring任意既定 news
statusstring任意draft / published / scheduled で絞り込み(省略で全部)
limitnumber任意件数上限(既定50・最大200)
curl "$BASE/posts?status=published&limit=10" -H "Authorization: Bearer $KEY"

// 200
{ "ok": true, "data": [
  { "id": "post_...", "slug": "summer-menu-2026", "title": "夏の新メニューのご案内",
    "excerpt": "...", "cover_image": null, "category": "お知らせ",
    "status": "published", "collection": "news",
    "publish_at": null, "published_at": "2026-08-07 01:00:00",
    "author": "連携ツール名", "updated_at": "2026-08-07 01:00:00" }
] }
GET/api/ext/v1/posts/:id

記事1件の全文(body_md / body_html 含む)を返します。:id には記事IDでもslugでも指定できます。レスポンスの seo_json はJSON文字列です(配信APIでは seo としてパース済みで返ります)。

curl "$BASE/posts/summer-menu-2026" -H "Authorization: Bearer $KEY"
POST/api/ext/v1/posts

記事を作成します。

ボディ説明
titlestring必須記事タイトル(25〜30字目安)
body_mdstring必須本文Markdown。見出しは ## から
categorystring任意カテゴリ名
excerptstring任意要約(80字目安)
cover_imagestring任意表紙画像URL
statusstring任意既定 draft
publish_atstring任意scheduled のとき必須(例 2026-09-01T10:00:00+09:00
collectionstring任意既定 news
slugstring任意英数字で始まり - _ . 可(120文字以内)。省略で自動採番
seoobject任意SEO設定
body_htmlstring任意通常は送らない(サーバーが生成。送ってもサニタイズされる)
curl -X POST "$BASE/posts" \
  -H "Authorization: Bearer $KEY" -H "Content-Type: application/json" \
  -d '{
    "title": "新メニューのご案内",
    "body_md": "## 夏の新メニュー\n\n7月から新メニューが始まりました。\n\n- 冷やし担々麺\n- すだちそば",
    "category": "お知らせ",
    "excerpt": "7月からの新メニューを2品ご紹介します"
  }'
const res = await fetch(`${BASE}/posts`, {
  method: "POST",
  headers: { Authorization: `Bearer ${KEY}`, "Content-Type": "application/json" },
  body: JSON.stringify({
    title: "新メニューのご案内",
    body_md: "## 夏の新メニュー\n\n7月から新メニューが始まりました。",
    category: "お知らせ",
  }),
});
const { data } = await res.json(); // data.id, data.slug, data.status === "draft"
r = requests.post(f"{BASE}/posts",
    headers={"Authorization": f"Bearer {KEY}"},
    json={
        "title": "新メニューのご案内",
        "body_md": "## 夏の新メニュー\n\n7月から新メニューが始まりました。",
        "category": "お知らせ",
    })
post = r.json()["data"]  # post["status"] == "draft"

作成された記事が data で返ります(data.iddata.slug を控える)。409 = slug重複です。

PUT/api/ext/v1/posts/:id

記事を部分更新します。渡したフィールドだけが変わります(:id はIDでもslugでも可)。公開・非公開・予約の切り替えもこのエンドポイントです。excerpt / cover_image / category / seonull でクリア、省略で維持。

# 公開する
curl -X PUT "$BASE/posts/post_abc123" -H "Authorization: Bearer $KEY" \
  -H "Content-Type: application/json" -d '{ "status": "published" }'

# 予約公開に変更(タイムゾーン付きのISO 8601を推奨)
curl -X PUT "$BASE/posts/post_abc123" -H "Authorization: Bearer $KEY" \
  -H "Content-Type: application/json" \
  -d '{ "status": "scheduled", "publish_at": "2026-09-01T10:00:00+09:00" }'

# 非公開に戻す(配信APIからも消える)
curl -X PUT "$BASE/posts/post_abc123" -H "Authorization: Bearer $KEY" \
  -H "Content-Type: application/json" -d '{ "status": "draft" }'
DELETE/api/ext/v1/posts/:id

記事を削除します。公開中の記事は配信APIからも消えます。取り消せません。

curl -X DELETE "$BASE/posts/post_abc123" -H "Authorization: Bearer $KEY"

// 200
{ "ok": true, "data": { "id": "post_abc123" } }
GET/api/ext/v1/categories

そのサイトで使われている既存カテゴリの一覧です。表記ゆれ(「お知らせ」と「おしらせ」など)を防ぐため、記事作成前の確認を推奨します。

{ "ok": true, "data": ["イベント", "お知らせ", "キャンペーン"] }
POST/api/ext/v1/media

画像をアップロードし、記事で使えるURLを返します。multipart/form-datafile フィールドで送信します(JPEG / PNG / GIF / WebP / AVIF・10MBまで。形式はファイルの中身で判定します)。プランのストレージ上限を超える場合は 403 が返ります。

curl -X POST "$BASE/media" -H "Authorization: Bearer $KEY" \
  -F "file=@./photo.jpg"

// 200
{ "ok": true, "data": { "id": "med_...", "filename": "photo.jpg",
  "url": "https://img.harucms.com/..." } }

返ってきた urlcover_image や本文の ![alt](url) に使います。

POST/api/ext/v1/media-from-url

外部URLの画像を取り込みます(httpsのみ・JPEG / PNG / GIF / WebP / AVIF・10MBまで。私的IPアドレスや当社ホストへのURLは取り込めません)。バイナリを扱えない環境(AIエージェント等)向けです。レスポンスは /media と同じ形です。

curl -X POST "$BASE/media-from-url" -H "Authorization: Bearer $KEY" \
  -H "Content-Type: application/json" \
  -d '{ "url": "https://example.com/images/photo.jpg" }'

配信API(公開・キー不要)

サイト側(Astro・Next.js等)から公開記事を取得するAPIです。認証不要・CORS全開放なので、ブラウザからもビルド時からも直接fetchできます。公開済み(published)の記事だけが返ります。

項目
ベースURLhttps://{サブドメイン}.harucms.app/v1(検証済み独自ドメインも同じパス構成)
認証不要(下書きの確認は認証付きのREST APIで)
キャッシュエッジキャッシュ約5分。記事の保存・公開時に自動でキャッシュ削除(反映は通常すぐ・最大5分)

自分のサイトの配信ホストは GET /meapi_host、またはダッシュボードのサイトカードで確認できます。

GET/v1/posts

公開記事の一覧(新しい順・本文なし)。

クエリ説明
collectionstring任意既定 news
categorystring任意カテゴリ名で絞り込み
limitnumber任意既定20・最大100
offsetnumber任意ページ送り用
curl "https://your-site.harucms.app/v1/posts?limit=10"

// 200
{ "posts": [
    { "id": "post_...", "slug": "summer-menu-2026", "title": "夏の新メニューのご案内",
      "excerpt": "...", "cover_image": "https://img.harucms.com/...",
      "category": "お知らせ", "collection": "news", "author": "山田",
      "published_at": "2026-08-07 01:00:00", "updated_at": "2026-08-07 01:00:00" }
  ],
  "total": 12, "has_more": false }

total は全件数が確定したときだけ返ります。ページ送りの判定には has_more を使ってください。

GET/v1/posts/:slug

記事詳細です。body_md / body_html / seo(パース済みオブジェクトまたは null)を含みます。存在しないslugは 404

curl "https://your-site.harucms.app/v1/posts/summer-menu-2026"
GET/v1/categories

公開記事に使われているカテゴリの一覧です(?collection= で絞り込み可)。

{ "categories": ["お知らせ", "イベント"] }

Astro / Next.js から取得する

Astro(ビルド時取得=静的生成)

---
// src/pages/news/index.astro
const res = await fetch('https://your-site.harucms.app/v1/posts?limit=20');
const { posts } = await res.json();
// 詳細ページは /v1/posts/{slug}(getStaticPathsで全slugを列挙して生成)
---
<ul>
  {posts.map((p) => (
    <li><a href={`/news/${p.slug}/`}>{p.title}</a></li>
  ))}
</ul>

Next.js(App Router・ISR)

// app/news/page.tsx
export const revalidate = 300;

export default async function NewsPage() {
  const res = await fetch('https://your-site.harucms.app/v1/posts?limit=20', {
    next: { revalidate: 300 },
  });
  const { posts } = await res.json();
  return (
    <ul>
      {posts.map((p: { id: string; slug: string; title: string }) => (
        <li key={p.id}><a href={`/news/${p.slug}`}>{p.title}</a></li>
      ))}
    </ul>
  );
}
静的サイトの再ビルドAstroの静的生成で使う場合、記事公開後にサイトの再ビルドが必要です。管理画面の「サイト設定 → Webhook」にホスティングのデプロイフックURL(Vercel の Deploy Hook・Netlify の Build Hook・Cloudflare Pages の Deploy Hook)を登録すると、公開の瞬間に再ビルドが走ります。SSR・ISRなら再ビルド不要で自動反映されます。

MCPサーバー

MCP(Model Context Protocol)は、AIアシスタントに外部ツールを安全に接続するための標準プロトコルです。ハルCMSはホスト型MCPサーバーを標準搭載しており、npm installもコードも不要で、AIに「記事を書いて下書きにして」と話すだけで動きます。

項目
エンドポイントhttps://app.harucms.com/mcp
トランスポートStreamable HTTP(ステートレス・POSTのみ。SSEストリームは無し)
認証APIキー(RESTと同じ)を Authorization: Bearer ヘッダーで

Claude Code(CLI)

claude mcp add --transport http haru-cms https://app.harucms.com/mcp \
  --header "Authorization: Bearer hcms_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

登録後、Claudeに「サイトにお知らせを1本書いて下書きにして」のように話すだけで動きます。

Claude Desktop

設定 → コネクタ → 「カスタムコネクタを追加」で上記URLを入力し、ヘッダーに Authorization: Bearer hcms_... を設定します。

Cursor / その他のMCPクライアント

// mcp.json(Cursor: .cursor/mcp.json)
{
  "mcpServers": {
    "haru-cms": {
      "url": "https://app.harucms.com/mcp",
      "headers": { "Authorization": "Bearer hcms_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" }
    }
  }
}

ChatGPT

お使いのChatGPTのコネクタ設定がヘッダー認証(Bearer)に対応していれば、上記URL+Authorization: Bearer hcms_... で登録できます。ヘッダー指定ができないプラン・バージョンでは、REST APIをそのまま使ってください(llms-full.txt を読ませれば連携コードの実装まで自走します)。

MCPツールリファレンス

提供しているツールは以下の8本だけです(これ以外の名前のツールは存在しません)。

ツール説明引数(*は必須)
get_site_infoサイト名・配信ホスト・コレクション一覧(最初に呼んで接続確認)
list_posts記事一覧(新しい順)collection status limit
get_post記事1件の全文id*(IDかslug)
create_post記事作成(status省略は下書き)title* body_md* category excerpt cover_image status publish_at collection slug seo
update_post部分更新・公開/非公開の切替id* + title body_md category excerpt cover_image status publish_at collection seo
delete_post記事削除(公開中は配信からも消える・取り消し不可)id*
list_categories既存カテゴリ一覧(表記ゆれ防止)
upload_image_from_urlhttpsの画像を取り込みURLを返す(JPEG / PNG / GIF / WebP / AVIF・10MBまで。形式はファイルの中身で判定します)url*

安全設計

  • 既定は下書きstatus を明示しない作成は必ず下書きになります。AIが会話の流れで勝手に公開することはありません。
  • スコープはサイト単位 — キーは1サイト分の権限しか持ちません。他サイト・アカウント設定・課金には一切アクセスできません。
  • 全操作が監査ログに記録 — いつ・どのキーが・どの記事に何をしたかをダッシュボードで確認できます。
  • 即時失効 — キーを停止・削除すればその瞬間からすべての操作が拒否されます。
  • HTMLはサニタイズbody_html を直接送ってもサーバー側でサニタイズされます(XSS対策)。
運用の推奨AIに公開まで任せる場合も、まず create_post(下書き)→ 内容確認 → update_post で公開、の2段階を推奨します。

エラーとプラン制限

エラーは共通フォーマット { "error": "日本語のメッセージ" } + HTTPステータスで返ります。

ステータス意味対処
400リクエスト不正(必須フィールド不足・不正なslug/日時・画像取得失敗など)メッセージに従い修正
401認証失敗(キーが無効・停止済み・Bearer プレフィックス欠落)キーの値と形式を確認
403ストレージ上限超過(POST /media不要なメディアを削除するかプランをアップ
404記事が見つからないid / slug を確認
409slug重複別のslugにするか、slugを省略して自動採番
503画像ストレージ未設定運営にお問い合わせ
5xxサーバーエラー指数バックオフ(1秒→2秒→4秒…)で再試行

レート制限とリクエスト枠

  • 分単位の固定レート制限は現在ありません429 は返りません)。ただしバッチ処理は1〜2リクエスト/秒程度に抑えるのが行儀の良い使い方です。
  • プランには月間リクエスト枠があります(配信API+REST/MCPの合算。Free 100万〜Business 2億)。枠を超えてもAPIも配信も止まりません。超過分は100円/100万リクエスト(税込)で自動継続します。
  • ストレージ上限(プラン別)を超えると新規アップロードだけがブロックされます。既存の記事・画像・配信には影響しません。
  • 最新の料金・制限は機械可読のJSONでも取得できます(認証不要): /api/public/pricing
再試行の指針5xx は指数バックオフでの再試行を推奨します。4xx(400/401/403/404/409)はリクエスト自体の問題なので、再試行しても解決しません。

AIエージェント連携

このドキュメントの全文はAIが読み込みやすいプレーンテキストでも提供しています。AIエージェント(Claude Code等)に以下を渡すだけで、連携コードの実装やMCPセットアップから記事作成まで自走できます。

https://app.harucms.com/docs/llms-full.txt を読んで、
ハルCMSとの連携をセットアップしてください。
APIキー: 環境変数 HARUCMS_API_KEY に設定済み
やりたいこと: (例)毎週月曜にブログ下書きを自動生成する
ファイル内容
/docs/llms.txtインデックス(要点と目次)
/docs/llms-full.txt全文(REST・MCP・配信API・エラーのすべて)。AIにはこちらを読ませてください

例えばこんな依頼がそのまま動きます:

  • 「MCPで接続して、今公開中の記事一覧を見せて」
  • 「この議事録を要約してお知らせ記事の下書きにして」
  • 「予約投稿で来週月曜9時に公開される記事を作って」
  • 「この画像URLを取り込んで表紙にした記事を作って」

よくある質問

Webhookはありますか?

あります。管理画面の「サイト設定 → Webhook」で通知先URLを登録すると、記事の公開・更新・非公開・削除の瞬間に POST で通知します(1サイト5件まで・HMAC署名 x-harucms-signature 付き・届かないときは1分→5分→30分→120分で再試行)。ペイロードは記事のメタ(id・slug・title・status・published_at)だけで、本文は配信APIから取り直してください。

いちばん簡単な使い方は、ホスティングのデプロイフックURLをそのまま登録することです。Vercel・Netlify・Cloudflare Pages はいずれも「POSTが来たら再ビルド」するURLを発行しており、追加の設定は要りません。GitHub Actions でデプロイしている場合はフックURLが無いので、署名を検証して repository_dispatch を叩く小さな受け口を1本用意します(webharu.com はこの方式)。

読み取り専用のキーはありますか?

現在のキーは読み書き両方の権限を持ちます。取得だけの用途ならAPIキーは不要です — 公開記事は配信API(キー不要)で取得できます。下書きも読む必要がある場合だけキーを使ってください。

body_htmlを直接送ってもいい?

可能ですが推奨しません。body_md だけ送る方が、エディタとの相互編集・将来のデザイン変更に強くなります。送ったHTMLはサーバー側でサニタイズされます。

予約公開の精度は?

5分間隔のスケジューラが処理するため、指定時刻から最大5分程度の遅延があります。公開日時には予約時刻がそのまま記録されます。

公開したのにサイトに反映されない

配信APIのエッジキャッシュ(約5分)の可能性があります。5分待っても反映されない場合は、取得しているホスト(api_host)とコレクション名を確認してください。Astroの静的生成では再ビルドも必要です。

1つのキーを複数のツールで使い回してもいい?

動作はしますが、ツールごとにキーを分けることを推奨します(監査ログでの区別・漏えい時に該当ツールだけ止められるため)。

記事数の上限は?

全プラン無制限です。プランで変わるのはサイト数・メンバー数・ストレージ・月間リクエスト枠です(料金データ)。

独自ドメインで配信できる?

有料プランで独自ドメインを設定できます。検証完了後は https://あなたのドメイン/v1/posts と、同じパス構成で配信されます。