AI で Zindies アプリを作る

Zindies の公開 API (OAuth / REST) を使って、クリエイターや店舗が自分用のアプリ (主に UI) を作るための AI 向けガイドです。

原則として依存の少ない単一 HTML + JavaScript で動き、ファイルを開けばすぐ試せる成果物を作ります。

主な読み手は AI コーディングエージェントです。クリエイターや店舗が「自分専用の小さなツール」を素早く作って使うことを想定しています。

AI / クローラ向けの Markdown 版はこちら → /build-with-ai.md

接続情報

まず OpenAPI 仕様を取得し、エンドポイント・パラメータ・レスポンスはそこを唯一の正としてください。フィールド名を推測で作らないこと。

認証

トークンは 2 種類あります。用途に合わせて選んでください。

  • PAT — クリエイター/店舗が自分専用ツールを作るときに最も簡単。全スコープ相当・Anchor 制約なしで、画面から発行します。 (https://zindies.co/user/api)
  • OAuth 2.0 (Authorization Code + PKCE) — 複数ユーザーに配布するアプリ向け。スコープと Anchor (対象エンティティ) でアクセスを絞れます。 (https://developer.zindies.co/applications)
    scopes: profile:read profile:write creations:read creations:write announcements:read announcements:write events:read events:write analytics:read

トークンはソースに直書きせず、リポジトリにも含めないでください。配布アプリではスコープと Anchor を絞った OAuth を使い、個人ツールでも入力欄や安全なストレージから読み込みます。

CORS (ブラウザ完結アプリ)

api.zindies.co は CORS 設定済みで、ブラウザ完結アプリから直接呼び出せます。認証はいずれも Authorization ヘッダの Bearer トークンのみ (Cookie 不要) です。

範囲 許可メソッド Path
公開データの読み取り GET /v1/*
私領域 (お気に入り・イベント参加など) GET / POST / DELETE /v1/me/*
Anchor 配下のコンテンツ書き込み (作品・お知らせ・イベント) GET / POST / PATCH / DELETE /v1/creators/:token/*, /v1/places/:token/*

データモデル

暖色系 = 「個」のエンティティ (creator / creation / place)、寒色系 = 「集まり・発信」(event / announcement) という意味づけです。詳細フィールドは OpenAPI 仕様を参照してください。

エンティティ 役割 主なフィールド
クリエイター Creator クリエイター (作り手)。暖色系の識別色 token name title bio photo_url url
作品 Creation 作品 (ZINE)。暖色系の識別色 token title description released_year price photo_url creators url
店舗 Place 店舗 (取扱店)。暖色系の識別色 token name address latitude longitude place_type url
イベント Event イベント (day / period)。寒色系の識別色 event_type title started_at start_date place creators booths url
Announcement Announcement クリエイター/作品/店舗からのお知らせ (polymorphic) title body audience announceable_type created_at

エンドポイント

公開 read (認証不要)

  • GET /v1/creators — クリエイター
  • GET /v1/creators/:token — クリエイター
  • GET /v1/creations — 作品
  • GET /v1/creations/:token — 作品
  • GET /v1/places — 店舗
  • GET /v1/places/:token — 店舗
  • GET /v1/events — イベント
  • GET /v1/events/:id — イベント
  • GET /v1/announcements — Announcement
  • GET /v1/announcements/:id — Announcement
  • GET /v1/search

私領域 (Bearer 必須)

  • GET /v1/me
  • GET /v1/me/entities
  • GET / POST / DELETE /v1/me/favorites
  • GET /v1/me/collection
  • GET / POST / DELETE /v1/me/event_participations
  • GET /v1/me/reservations

Anchor 配下の書き込み (scope + Anchor バインディング必須)

  • GET / POST / PATCH / DELETE /v1/creators/:creator_token/creations (scope: creations:write)
  • GET / POST / PATCH / DELETE /v1/creators/:creator_token/announcements (scope: announcements:write)
  • GET / POST / PATCH / DELETE /v1/creators/:creator_token/events (scope: events:write)
  • GET / POST / PATCH / DELETE /v1/places/:place_token/announcements (scope: announcements:write)
  • GET / POST / PATCH / DELETE /v1/places/:place_token/events (scope: events:write)

コンテンツの書き込み (Anchor)

コンテンツの書き込みは creator / place のトークン配下にネストします。OAuth では使用するトークンが対象のクリエイター/店舗 (Anchor) にひも付いている必要があります。対象トークンは /v1/me/entities で取得できます。

POST   /v1/creators/:creator_token/creations
PATCH  /v1/creators/:creator_token/creations/:id
DELETE /v1/creators/:creator_token/creations/:id

共通規約

すべての GET 共通のクエリ規約です。一覧は ETag / Last-Modified を返すので条件付き GET でキャッシュできます。

  • page (1 始まり・既定 1) と per (既定 12・最大 100) でページネーション
  • per は 1 ページあたりの件数 (最大 100)
  • random=N (1〜100 のランダム抽出。page / per とは併用不可)
  • locale=ja|en|ko|zh-TW でサーバー側翻訳 (既定 ja)
  • places の近接検索 — lat / lng / radius_km
  • events のフィルタ — from / to (YYYY-MM-DD) / area / kind / event_type=day|period|all
  • search は q (2 文字以上必須) / type=creator|creation|place|event|all

レスポンスはすべて JSON です。エラーは { "error": "...", "message": "..." } 形式で、401 = 認証エラー、404 = not_found、400 = パラメータ不正を返します。

アプリ作成のヒント

  • 読み込み中・空・エラーの 3 状態を必ず用意する。
  • ページネーションまたは random 表示を実装する。
  • 画像は photo_url / photos_urls を使う。
  • locale パラメータで多言語表示に対応するとよい。

やってはいけないこと

  • OpenAPI 仕様に無いフィールドやエンドポイントを推測で使わない。
  • トークンをソースに埋め込んだり Git にコミットしたりしない。
  • 公開エンドポイントに Cookie / credentials を付けない (Bearer のみ)。
  • private / 下書き状態のデータを表示しようとしない (API は公開データのみ返す)。