仕組み

記事JSONが入ってから、
公開URLが返るまで

SEOBuilder は「どの媒体に、どの原稿を、どの順番で出すか」を媒体の能力から機械的に決めます。 人が媒体ごとに貼り替える作業を無くすのが目的です。

SEOBuilder の配信パイプライン 1つの記事JSONがエンジンに入り、自社サイト・転載先・別原稿媒体・SNS・LINE・手動投稿の6つの役割へ順番に配信される。自社サイトを最初に公開し、そのURLが正規URLとして後続に引き渡される。 記事JSON 1本ぶんの原稿 +CTA+別原稿 SEOBuilder Engine 役割順に配信 失敗は媒体単位で隔離 1 自社ドメイン(primary) WordPress / WordPress.com / Ghost — 最初に公開し、このURLを正規URLに確定 2 転載(syndicate) dev.to / Hashnode / Medium — 同一本文+canonical で自社に評価を集める 3 別原稿(variant) はてな / Qiita / Zenn / livedoor / Blogger / Notion — 別原稿、無ければ要約+リンク 4 SNS(social) LinkedIn / X / Threads / Facebook — 要約+計測パラメータ付きリンク 5 LINE公式アカウント(line) Messaging API で友だちへ新着通知 — 記事→LINE→自動応答の動線をつなぐ 6 手動投稿(manual) note / Ameba — 公式APIが無いため「貼るだけ」パッケージを生成して人が投稿

1. 配信順は「役割」で決まる

配信先には primary / syndicate / variant / manual / social / line の役割があり、 この順に実行されます。順番に意味があります — 自社サイトの公開URLが確定していないと、転載先にcanonicalを渡せず、SNSに貼るリンクも決まらないからです。

役割やること
1primary自社ドメインへ公開し、その URL を正規URLとして確定する
2syndicatecanonical に対応する媒体へ、同一本文+正規URL指定で転載する
3variant / manual別原稿があれば投稿、無ければ要約+リンク。手動媒体は貼り付け用パッケージを生成
4social要約+計測パラメータ付きリンクをSNSへ投稿する
5lineLINE公式アカウントの友だちへ新着を配信する

2. 本文の出し分けは3段階で決まる

canonical に対応しない媒体に来たとき、エンジンは次の順で投稿する原稿を選びます。

  1. 別原稿があるか — 記事JSONの variants["qiita"] のように媒体名で用意されていれば、それを投稿します。同じテーマを別の角度で書いたものなので、複製にはなりません。
  2. 無ければ fallback に従う — 既定は teaser。抜粋・「この記事で分かること」(本文のH2から自動抽出)・全文へのリンクだけの短い原稿を組み立てます。
  3. 明示的に指定もできるfallback: "skip" ならその媒体には出しません。"full" なら同一本文を出します(重複を承知で使う設定です)。

なお、自社サイトの公開URLがまだ無い状態(ドライラン・primary未設定)では teaser のリンク先が作れないため、全文にフォールバックします。

3. CTAは本文の構造を見て差し込む

CTAブロックは top / middle / bottom の指定位置に入ります。単純に先頭と末尾へ足すだけではありません。

  • 中盤は本文中の ## 見出しの位置を数え、その中央の見出しの直前に入れます。段落の途中を割りません。
  • 末尾は「参考情報 / 出典 / References」の見出しを探し、その前に置きます。出典リストの後ろに埋もれると読まれないためです。
  • 本文中に既に同じLINE URLが書かれている場合は、二重に差し込みません。

すべてのCTAリンクには utm_source / utm_medium / utm_campaign と、位置ごとの utm_content=cta_middle が付きます。 元のURLにパラメータが付いていた場合は壊さずに残します。

4. 失敗は媒体ごとに閉じ込める

1つの媒体が落ちても、残りの配信は最後まで進みます。408 / 425 / 429 / 5xx と通信エラーは指数バックオフで再試行し、 それでも駄目なら理由を failed として記録して次の媒体へ進みます。認証情報が足りない配信先は、通信する前に失敗として明示されます。

結果は1つのジョブにまとまり、媒体ごとの状態・公開URL・エラー文が残ります。note や Ameba のように人が投稿する媒体は manual として記録され、 投稿後に PUT /v1/jobs/{id}/results でURLを書き戻すとジョブが完成します。

5. 送る前に、送る中身を確認できる

dry_run=true を付けると、外部へは一切送信せず「どの媒体に何を送る予定か」だけが返ります。 認証情報を1つも設定していない状態でも動くので、導入前の確認に使えます。

ドライランを試す API仕様を見る