---
title: Strapi
description: >-
  strapi() ソースを使って Strapi の REST API 経由でコンテンツタイプを読み込み、Strapi 4 と Strapi 5 の両方で Blocks の本文を Markdown に変換します。
---

組み込みの `strapi()` アダプターは、Strapi REST API（`/api/<pluralApiId>`）を通じてコンテンツタイプを読み込み、各エントリーの Blocks 本文を Markdown に変換します。変換の対象は、段落、見出し、リスト、引用、コードブロック、画像、リンクです。Markdown のリッチテキストフィールドは記述されたとおりにそのまま渡されます。ただし、Web、メール、電話、相対アドレスのいずれでもないリンクは、ラベルのみが残ります。Strapi 5 のレスポンスはそのまま読み込まれます。Strapi 4 の `attributes` エンベロープはフラット化されるため、同じフィールドパスを使用できます。インストールは不要です。

```ts blume.config.ts
import { defineConfig } from "blume";
import { filesystem, strapi } from "blume/sources";

export default defineConfig({
  content: {
    sources: [
      filesystem({ root: "docs" }),
      strapi({
        prefix: "guides",
        url: "https://cms.example.com",
        contentType: "guides",
        // locale: "en"
        // Field paths default to title / description / slug / content / updatedAt
        fields: { body: "body" },
        // Extra query parameters: filters[...], sort
        params: { "filters[section][$eq]": "sdk" },
      }),
    ],
  },
});
```

API トークンは `STRAPI_API_TOKEN` 環境変数から取得され、Bearer トークンとして送信されます。エントリーは `populate=*` を指定して取得されるため、画像には URL が含まれます（範囲を絞り込むには `populate` を設定してください）。相対アップロードパス（`/uploads/x.png`）は `url` を基準に解決されます。インポートされるのは公開済みのエントリーのみです。`--preview` を指定すると下書きがリクエストされます（Strapi 5 では `status=draft`、Strapi 4 では `publicationState=preview`）。このとき、一度も公開されたことのないドキュメントは `draft: true` としてステージングされます。公開済みのドキュメントの場合は、最新の下書きがプレビューされます。
