genko.meDocs

導入

JavaScriptでgenko.meの配信APIに接続し、記事一覧と記事詳細を表示するまでの手順。SDKと素のfetchの両方。

このページでは、JavaScriptからgenko.meのblogAPIに接続し、記事一覧と記事詳細を取得します。@genko-me/sdkを使う書き方と、素のfetchだけで書く方法の両方を載せます。

用意するもの

  • genko.meのアカウントとワークスペース。APIの作成とAPIキーの発行にはオーナー権限が必要です。
  • Node.jsで動かす場合はNode.js 18以降。SDKも以下のコードも、グローバルのfetchとURLを使います。ブラウザで動かす場合は、fetchが使えるブラウザなら追加の要件はありません。
  • リスト形式のAPIが1つと、公開済みの記事が1件。まだない場合はクイックスタートの手順2・3で作れます。

以降のyour-workspaceは自分のワークスペースIDに、blogは自分のエンドポイントに置き換えます。

インストール

SDKを使う場合だけインストールします。素のfetchで書くなら、この手順は不要です。

bash
npm install @genko-me/sdk

@genko-me/reactはNext.js向けの表示部品なので、ここでは入れません。

APIキーとワークスペースIDを設定する

管理画面のURLがhttps://genko.me/w/your-workspaceなら、ワークスペースIDはyour-workspaceです。

APIキーは「設定・プラン」の「APIキー」タブ(/w/your-workspace/settings/api-keys)で作成します。「選択したAPIのみ」でblogだけを許可しておくと、キーが漏れたときの範囲を限定できます。作成直後に表示される値は後から再表示できません。

Node.jsでは環境変数に入れます。

.env
GENKO_API_KEY=発行したキー
js
const apiKey = process.env.GENKO_API_KEY;

Node.js 20.6以降ならnode --env-file=.env app.jsで読み込めます。.envをGitの追跡対象に入れないでください。

ブラウザで直接呼ぶ場合、キーは配信するJavaScriptの中に現れます。置いてよい条件は概要にまとめています。

記事一覧を出す

SDKを使う

接続の設定を1か所にまとめ、以降はそれを参照します。

lib/genko.js
import { createGenko, listApi } from "@genko-me/sdk";
export const genko = createGenko({  workspace: "your-workspace",  apiKey: process.env.GENKO_API_KEY,  apis: { blog: listApi() },});

apisのキーがそのままエンドポイント名になります。オブジェクト形式のAPIはlistApi()ではなくobjectApi()を使います。

list.js
import { genko } from "./lib/genko.js";
const { contents, totalCount } = await genko.apis.blog.list({  limit: 10,  orders: "-publishedAt",  fields: ["title", "publishedAt"],});
console.log(`全${totalCount}件`);for (const post of contents) {  console.log(post.id, post.title, post.publishedAt);}

fieldsは配列でも"title,publishedAt"のような文字列でも渡せます。指定できるクエリはクエリ仕様と同じです。

素のfetchで書く

lib/genko-fetch.js
const BASE_URL = "https://api.genko.me";const WORKSPACE = "your-workspace";
export async function getList(endpoint, queries = {}) {  const url = new URL(`${BASE_URL}/v1/${WORKSPACE}/${endpoint}`);  for (const [key, value] of Object.entries(queries)) {    if (value !== undefined) url.searchParams.set(key, String(value));  }
  const response = await fetch(url, {    headers: { "X-API-KEY": process.env.GENKO_API_KEY },  });
  if (!response.ok) {    const { message } = await response.json().catch(() => ({}));    throw new Error(`配信APIが${response.status}を返しました: ${message ?? "原因不明のエラーです。"}`);  }
  return response.json();}

URLSearchParams(url.searchParams)を使うと、filtersの角括弧や日本語の値も正しくエンコードされます。文字列を自分で連結しないでください。

js
const { contents, totalCount } = await getList("blog", {  limit: 10,  orders: "-publishedAt",  fields: "title,publishedAt",});

レスポンスはcontents・totalCount・offset・limitを持つオブジェクトです。該当する記事がない場合もエラーにはならず、contentsが空配列になります。

記事詳細を出す

詳細は、一覧で得たidをパスの末尾に付けて取得します。

SDKを使う

detail.js
import { genko } from "./lib/genko.js";
const post = await genko.apis.blog.getOrNull("headless-cms-nextjs");if (!post) {  console.log("記事が見つかりません。");} else {  console.log(post.title);  console.log(post.body); // リッチテキストはHTML文字列}

get()は見つからないと例外を投げ、getOrNull()は404のときだけnullを返します。認証エラーやサーバーエラーはgetOrNull()でも例外として伝わります。

素のfetchで書く

lib/genko-fetch.js
export async function getEntry(endpoint, id, queries = {}) {  const url = new URL(`${BASE_URL}/v1/${WORKSPACE}/${endpoint}/${encodeURIComponent(id)}`);  for (const [key, value] of Object.entries(queries)) {    if (value !== undefined) url.searchParams.set(key, String(value));  }
  const response = await fetch(url, {    headers: { "X-API-KEY": process.env.GENKO_API_KEY },  });
  if (response.status === 404) return null;  if (!response.ok) throw new Error(`配信APIが${response.status}を返しました。`);
  return response.json();}

一覧と違い、詳細のレスポンスはcontentsで包まれず、コンテンツのオブジェクトがそのまま返ります。非公開・削除済み・存在しないIDはどれも404です。

エラーの扱い

SDKでは、APIがエラーを返すとGenkoApiErrorが投げられます。statusにHTTPステータスが入ります。

js
import { GenkoApiError } from "@genko-me/sdk";
try {  await genko.apis.blog.list();} catch (error) {  if (error instanceof GenkoApiError && error.status === 401) {    console.error("APIキーを確認してください。");  }  throw error;}

ステータスごとの原因はエラーと制限にまとめています。ネットワーク障害など、HTTPレスポンス自体を受け取れなかった失敗は別の例外になります。

次に読む

ページ送り、保存済み下書きのプレビュー、Webhookの署名検証は実践に続きます。

最終更新: 2026年9月17日

目次