AI로 Zindies 앱 만들기

Zindies 공개 API(OAuth / REST)를 사용해 크리에이터와 매장이 자신용 앱(주로 UI)을 만들기 위한 AI용 가이드입니다.

원칙적으로 의존이 적은 단일 HTML + JavaScript로 동작하며 파일을 열면 바로 시험할 수 있는 결과물을 만듭니다.

주요 독자는 AI 코딩 에이전트입니다. 크리에이터와 매장이 자신만을 위한 작은 도구를 빠르게 만들어 쓰는 것을 상정합니다.

AI / 크롤러용 Markdown 버전은 여기 → /build-with-ai.md

연결 정보

먼저 OpenAPI 사양을 가져와 엔드포인트·파라미터·응답의 유일한 정본으로 삼으세요. 필드명을 추측으로 만들지 마세요.

인증

토큰은 두 종류가 있습니다. 용도에 맞게 선택하세요.

  • 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 토큰뿐입니다(쿠키 불필요).

범위 허용 메서드 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는 페이지당 건수(최대 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 = 파라미터 오류를 반환합니다.

앱 작성 팁

  • 로딩·비어 있음·오류 세 가지 상태를 반드시 준비한다.
  • 페이지네이션 또는 random 표시를 구현한다.
  • 이미지는 photo_url / photos_urls를 사용한다.
  • locale 파라미터로 다국어 표시에 대응하면 좋다.

하지 말아야 할 것

  • OpenAPI 사양에 없는 필드나 엔드포인트를 추측으로 쓰지 않는다.
  • 토큰을 소스에 삽입하거나 Git에 커밋하지 않는다.
  • 공개 엔드포인트에 쿠키/credentials를 붙이지 않는다(Bearer만).
  • private / 초안 상태 데이터를 표시하려 하지 않는다(API는 공개 데이터만 반환).