AI로 Zindies 앱 만들기
Zindies 공개 API(OAuth / REST)를 사용해 크리에이터와 매장이 자신용 앱(주로 UI)을 만들기 위한 AI용 가이드입니다.
원칙적으로 의존이 적은 단일 HTML + JavaScript로 동작하며 파일을 열면 바로 시험할 수 있는 결과물을 만듭니다.
주요 독자는 AI 코딩 에이전트입니다. 크리에이터와 매장이 자신만을 위한 작은 도구를 빠르게 만들어 쓰는 것을 상정합니다.
AI / 크롤러용 Markdown 버전은 여기 → /build-with-ai.md
연결 정보
먼저 OpenAPI 사양을 가져와 엔드포인트·파라미터·응답의 유일한 정본으로 삼으세요. 필드명을 추측으로 만들지 마세요.
- OpenAPI 사양 (JSON·최우선): https://api.zindies.co/v1/openapi.json
- OpenAPI 사양 (YAML): https://api.zindies.co/v1/openapi.yaml
- API 문서 (Swagger UI): https://api.zindies.co/docs
- 연결 정보 디스커버리 (.well-known/mcp.json): https://api.zindies.co/.well-known/mcp.json
- 서비스 색인 (llms.txt): https://zindies.co/llms.txt
- API 베이스 URL: https://api.zindies.co/v1
- MCP 서버: https://mcp.zindies.co/
인증
토큰은 두 종류가 있습니다. 용도에 맞게 선택하세요.
- 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— AnnouncementGET /v1/announcements/:id— AnnouncementGET /v1/search
개인 영역 (Bearer 필수)
GET /v1/meGET /v1/me/entitiesGET / POST / DELETE /v1/me/favoritesGET /v1/me/collectionGET / POST / DELETE /v1/me/event_participationsGET /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는 공개 데이터만 반환).