# API 계약(1차)

## 공개 API
- `GET /api/public/route-by-host`
  - Query: `host`, `path`
  - Response:
    - `status`: `ok | not_found`
    - `page`: block json
    - `campaignId`, `pageId`, `routeId`
- `POST /api/public/lead`
  - Body: `campaignId`, `pageId`, `routeId`, `payload`, `sourceMeta`

## 관리자 API
- 인증: `POST /api/admin/auth/login` (현재는 역할 기반 데모 토큰 반환)
- 캠페인: `GET /api/admin/campaigns`, `POST /api/admin/campaigns`, `PUT /api/admin/campaigns/:id`
- 페이지: `GET /api/admin/pages`, `GET /api/admin/pages/:id`, `POST /api/admin/pages`, `PUT /api/admin/pages/:id`
- 라우트: `GET /api/admin/pages/:id/routes`, `POST /api/admin/pages/:id/routes`
- 조건: `GET /api/admin/pages/:id/conditions`, `POST /api/admin/pages/:id/conditions`, `PATCH /api/admin/pages/:id/conditions/:conditionId`, `DELETE /api/admin/pages/:id/conditions/:conditionId`
- 리드: `GET /api/admin/leads`
- 사용자: `GET /api/admin/users`, `POST /api/admin/users`, `PUT /api/admin/users/:id/role`

## 역할/권한(1차)
- 헤더: `x-user-role`
- 값: `ADMIN`, `LEAD_MANAGER`
- `ADMIN`: 관리자 API 전체 사용
- `LEAD_MANAGER`: 리드 조회(`/api/admin/leads`)만 사용

## 공통 에러
- 401 `{ error: "unauthorized" }`
- 403 `{ error: "forbidden" }`
- 422 `{ error: "validation", details: [...] }`
