はじめに

API ドキュメント

ogflow は日本語タイトルの折り返し処理に特化した OGP 画像生成 API です。BudouX と JIS X 4051 禁則処理を内蔵し、日本語が自然に折り返された 1200×630px の PNG をリクエスト一本で生成できます。

ベース URL

1https://ogflow.jp

エンドポイント一覧

メソッドパス認証説明
GET /og 必須 クエリパラメータで PNG を直接返す
POST /og 必須 JSON ボディで生成し R2 URL を返す
GET /demo/og 不要 認証なしのデモ(ウォーターマーク付き・30 req/分)
GET /health 不要 ヘルスチェック
クイックスタート

5 分で始める

API キーを取得して、SDK をインストールするだけで Next.js などから OGP 画像を生成できます。

1. API キーを申し込む

申し込みフォームから申し込むと sk_ogflow_... 形式のキーをお送りします。

2. SDK をインストール

1npm install @ogflow/sdk
2# または yarn add / pnpm add @ogflow/sdk

SDK を使わず HTTP クライアントで直接リクエストすることもできます。

3. 画像を生成する

SDK を使う場合:

1import { createOG } from '@ogflow/sdk';
2
3const og = createOG({ apiKey: process.env.OG_API_KEY! });
4const { url } = await og.generate({ title: '記事タイトル', theme: 'minimal' });

curl で直接使う場合:

1curl -H "Authorization: Bearer $API_KEY" \
2 "https://ogflow.jp/og?title=記事タイトル&theme=minimal" \
3 -o og.png
認証

API キー認証

サーバーサイドから使う場合に推奨する方式です。Authorization ヘッダーに Bearer トークンとして API キーを指定します。

1Authorization: Bearer sk_ogflow_...

curl の例

1curl -H "Authorization: Bearer $API_KEY" \
2 "https://ogflow.jp/og?title=テスト&theme=minimal" \
3 -o og.png
API キーはサーバーサイドのみで使用してください。ブラウザや CMS テンプレートに埋め込む場合は Signed URL 方式を使用してください。

Signed URL 認証

API キーを露出させずに有効期限付きの URL を生成する方式です。HTML への直接埋め込みや CMS テンプレートでの利用に適しています。

URL 構造

1https://ogflow.jp/og?title=...&theme=...&exp={unix}&key={api_key}&sig={hmac}
パラメータ説明
exp有効期限(Unix タイムスタンプ)。最大 86400 秒(24 時間)先まで
keyAPI キー
sigHMAC-SHA256(apiKey, ソート済みクエリ文字列) の hex 値。sig 自身は除外

SDK での生成(推奨)

1const url = await og.url({
2 title: '記事タイトル',
3 theme: 'minimal',
4 ttl: 3600, // 秒(最大 86400)
5});
6// → "https://ogflow.jp/og?title=...&exp=...&key=...&sig=..."
API リファレンス

GET /og

クエリパラメータで OGP 画像を生成し PNG を直接返します。R2 にキャッシュ済みの場合は Cloudflare が直配信します。

GET https://ogflow.jp/og?title=...&theme=...

リクエスト例

1curl -H "Authorization: Bearer $API_KEY" \
2 "https://ogflow.jp/og?title=記事タイトル&theme=minimal&siteName=My Blog" \
3 -o og.png

レスポンスヘッダー

ヘッダー値の例説明
Content-Typeimage/png
Cache-Controlpublic, max-age=31536000, immutableキャッシュ済みの場合
X-OG-CacheHIT | MISSR2 キャッシュの状態
X-OG-Generation-Ms87生成時間(ms)。MISS 時のみ

POST /og

JSON ボディで OGP 画像を生成し、R2 の永続 URL を返します。Webhook から事前生成したい場合や長いタイトルを URL エンコードせずに渡したい場合に使います。

POST https://ogflow.jp/og

リクエスト例

1curl -X POST "https://ogflow.jp/og" \
2 -H "Authorization: Bearer $API_KEY" \
3 -H "Content-Type: application/json" \
4 -d '{"title":"記事タイトル","theme":"minimal","siteName":"My Blog"}'

レスポンス(200 OK)

1{
2 "url": "https://pub-....r2.dev/og/minimal/abc123.png",
3 "hash": "abc123...",
4 "cached": false
5}
フィールド説明
urlstringR2 の公開 URL(無期限)
hashstringパラメータの SHA256 ハッシュ
cachedbooleantrue の場合は既存画像を返した(再生成なし)

パラメータ一覧

GET はクエリパラメータ、POST は JSON ボディとして渡します。パラメータ名は共通です。

名前必須制約説明
title 必須 string 1〜120 文字 OGP 画像のメインタイトル。BudouX + 禁則処理で自動折り返し
description 任意 string 最大 240 文字 タイトル下のサブテキスト(テーマによって表示文字数が切り詰められます)
theme 任意 enum テーマ名。デフォルト: minimalテーマ一覧参照
siteName 任意 string 最大 40 文字 サイト名。テーマによってヘッダーや右カラムに表示
size 任意 enum 1200x630 | 1200x600 画像サイズ。デフォルト: 1200x630
image 任意 string (URL) https:// から始まる URL サムネイル画像 URL。テーマによってレイアウト内に表示
avatar 任意 string (Base64) Base64 エンコード済み PNG zenn テーマのみ有効。フッターに 48px 円形アバターを表示
exp Signed URL 時必須 integer Unix タイムスタンプ 有効期限。現在時刻から最大 86400 秒先まで
key Signed URL 時必須 string Signed URL で使用する API キー
sig Signed URL 時必須 string HMAC-SHA256 hex 署名値。SDK の og.url() が自動生成

レスポンス

GET /og — PNG 直接レスポンス

R2 にキャッシュ済みの場合(X-OG-Cache: HIT)は Cloudflare CDN から直配信されます。初回は Generator が生成して R2 に保存してからクライアントに返します。

1HTTP/1.1 200 OK
2Content-Type: image/png
3Cache-Control: public, max-age=31536000, immutable
4X-OG-Cache: HIT

POST /og — JSON レスポンス

同じパラメータで 2 回呼ぶと cached: true が返り、再生成は行いません。

1HTTP/1.1 200 OK
2Content-Type: application/json
3
4{ "url": "https://pub-....r2.dev/og/minimal/abc.png", "hash": "abc...", "cached": false }
TypeScript SDK

インストール

公式 TypeScript SDK @ogflow/sdk は Node.js 18+・Cloudflare Workers・ブラウザで動作します。ゼロランタイム依存で Web Crypto API のみを使用します。

1npm install @ogflow/sdk
2# または yarn add @ogflow/sdk / pnpm add @ogflow/sdk

初期化

1import { createOG } from '@ogflow/sdk';
2
3const og = createOG({
4 apiKey: process.env.OG_API_KEY!,
5 // baseUrl: 'https://ogflow.jp', // デフォルト値
6});

og.generate()

POST /og を呼び出して画像を事前生成し、R2 の永続 URL を返します。Next.js の generateMetadata などサーバーサイドに最適です。

1const { url, hash, cached } = await og.generate({
2 title: '記事タイトル',
3 theme: 'minimal',
4 description: '記事の概要テキスト',
5 siteName: 'My Blog',
6});
7// url → "https://pub-....r2.dev/og/minimal/abc.png"

型定義

1generate(params: OgParams): Promise<OgGenerateResult>
2
3interface OgGenerateResult {
4 url: string; // R2 の永続 URL
5 hash: string; // パラメータの SHA256 ハッシュ
6 cached: boolean; // true = 再生成なし
7}

og.url()

API リクエストを送らずに Signed URL を生成します。HTML への埋め込みや CMS テンプレートで URL を事前に確定させたい場合に使います。

1const url = await og.url({
2 title: '記事タイトル',
3 theme: 'zenn',
4 ttl: 3600 * 24, // 最大 24 時間(86400 秒)
5});
6// → "https://ogflow.jp/og?title=...&exp=...&key=...&sig=..."
og.url() は async 関数です(内部で Web Crypto API を使用)。必ず await してください。

型定義

1url(params: OgUrlOptions): Promise<string>
2
3interface OgUrlOptions extends OgParams {
4 ttl?: number; // 有効期間(秒)。最大 86400
5}

共通型

1type Theme = 'minimal' | 'zenn' | 'dark' | 'gradient'
2 | 'newspaper' | 'tweet' | 'bold' | 'note';
3type Size = '1200x630' | '1200x600';
4
5interface OgParams {
6 title: string;
7 description?: string;
8 theme?: Theme;
9 size?: Size;
10 siteName?: string;
11}

エラー処理

API がエラーを返した場合、SDK は OgflowError を throw します。

1import { createOG, OgflowError } from '@ogflow/sdk';
2
3try {
4 const { url } = await og.generate({ title: '...' });
5} catch (err) {
6 if (err instanceof OgflowError) {
7 console.error(`HTTP ${err.status}: ${err.message}`);
8 // err.status: 400 | 401 | 403 | 429 | 502
9 }
10}
連携ガイド

Next.js

App Router の generateMetadataog.generate() を呼ぶことで、記事ごとに OGP 画像を自動生成できます。

1// app/blog/[slug]/page.tsx
2import { createOG } from '@ogflow/sdk';
3
4const og = createOG({ apiKey: process.env.OG_API_KEY! });
5
6export async function generateMetadata(
7 { params }: { params: { slug: string } }
8) {
9 const post = await fetchPost(params.slug);
10 const { url } = await og.generate({
11 title: post.title,
12 theme: 'minimal',
13 siteName: 'My Blog',
14 });
15 return {
16 openGraph: { images: [{ url, width: 1200, height: 630 }] },
17 twitter: { card: 'summary_large_image', images: [url] },
18 };
19}
R2 にキャッシュ済みの場合(cached: true)は Generator への通信が発生しないため高速です。記事の初回公開時のみ生成コストがかかります。

microCMS 連携

記事公開時に Webhook を受けて OGP 画像を自動生成します。SDK 不要で、管理画面の設定だけで導入できます。

Step 1: ダッシュボードでプロジェクトを作成

ダッシュボード → プロジェクト → 新規作成からプロジェクト ID と Webhook シークレットを発行します。テーマとサイト名もここで設定します。

Step 2: microCMS 管理画面で Webhook を設定

1URL: https://ogflow.jp/webhooks/microcms
2Header: X-OG-Project-Id: {プロジェクト ID}
3シークレット: {Webhook シークレット}

Webhook レスポンス

1{
2 "status": "generated",
3 "contentId": "article-123",
4 "permalinkUrl": "https://pub-....r2.dev/og/minimal/abc.png"
5}
Webhook は同期処理です。Fly.io のコールドスタート中は 5〜10 秒かかることがありますが、microCMS のデフォルトタイムアウト(10〜30 秒)内には収まる想定です。

ogflow は microCMS の contents.new.title フィールドを参照します。フィールド名が title 以外の場合はダッシュボードの「タイトルフィールド」設定で変更できます(近日対応)。

リファレンス

テーマ一覧

theme パラメータで指定できるテーマの一覧です。Free プランでは minimalzenn のみ利用できます。

themeプラン説明
minimal Free 白背景・左寄せシンプルレイアウト。汎用的で多くのブログに合います
zenn Free 濃紺背景・白文字。技術記事・Zenn スタイルのブログに
dark Hobby+ ダーク背景・グラデーションアクセント。モダンな技術ブログ向け
gradient Hobby+ 紫→青のグラデーション背景。SNS でインパクトを出したい場合に
newspaper Hobby+ 新聞風・マストヘッド付き。メディア・ニュースサイト向け
tweet Hobby+ 左右カラム分割。左に本文・右にサイト名を大きく表示
bold Hobby+ 黒背景・中央太字・ラジアルグロー。コンテンツをドラマチックに見せる
note Hobby+ Note 風・上部アクセントライン。柔らかい雰囲気のブログに
Free プランで minimal / zenn 以外を指定すると minimal にフォールバックします。Free プランの画像には右下に ogflow.jp のウォーターマークが入ります。

実際の表示はランディングページのデモで確認できます。

レート制限

全プランにレート制限が適用されます。超過すると 429 Too Many Requests が返ります。

プランレート上限月間生成枚数
Free60 req / 分200 枚 / 月
Hobby600 req / 分5,000 枚 / 月
Pro3,000 req / 分30,000 枚 / 月

429 レスポンス

1HTTP/1.1 429 Too Many Requests
2Retry-After: 60
3
4{ "error": "rate limit exceeded" }
R2 キャッシュ済みの画像(GET /og の X-OG-Cache: HIT)は Cloudflare CDN から直配信されるため、レート制限にカウントされません。同じパラメータでの再リクエストは実質無制限です。

エラーコード

HTTP ステータス意味よくある原因
400 Bad Request パラメータ不正 title が空・120 文字超、存在しない theme 名など
401 Unauthorized 認証エラー API キーが存在しない、Signed URL の sig が不正、exp 期限切れ
403 Forbidden アクセス拒否 API キーが無効化されている、Free プランで利用できないテーマを指定した
429 Too Many Requests レート制限超過 / 月間上限超過 プランのレート制限を超えてリクエストした、または月間生成枚数の上限に達した
502 Bad Gateway Generator エラー 画像生成サーバー(Fly.io)への接続失敗。一時的なエラーなのでリトライを推奨

エラーレスポンス形式

1{ "error": "invalid theme" }