Penta 백엔드 API 문서
개요
Penta는 디즈니 아동 도서 서비스로, Django REST Framework 기반의 REST API를 제공한다.
- 프레임워크: Django 4.2+ / Django REST Framework
- 인증: JWT (Access Token 1일, Refresh Token 7일)
- 다국어: django-parler (ko, en, ja/jp, es)
- 데이터베이스: PostgreSQL (운영), SQLite (개발)
Base URL
개발: http://localhost:8080/api
운영: https://api.pentadisney.com/api
지원 언어
| 코드 | 언어 |
|---|---|
| ko | 한국어 |
| en | 영어 |
| ja (jp) | 일본어 |
| es | 스페인어 |
언어 선택 우선순위: Accept-Language 헤더 > 사용자 프로필 app_language 설정 > 기본값(en)
1. 인증 (Authentication)
JWT 인증 시스템
- Access Token: 유효기간 1일 (24시간)
- Refresh Token: 유효기간 7일
- 모든 인증 필요 API에
Authorization: Bearer <access_token>헤더를 포함한다.
1.1 회원가입
POST /api/users/register/
소셜 로그인 기반 회원가입. social_provider와 social_id로 사용자를 생성한다.
- Auth: 불필요
- Rate Limit: 9/hr (
register)
1.2 소셜 로그인
POST /api/users/social-auth/
소셜 로그인 인증. 지원 제공자: Google, Apple, Kakao, LINE, Facebook. 기존 계정이면 로그인, 없으면 자동 생성한다.
- Auth: 불필요
- Rate Limit: 15/min (
login) - 응답:
access,refresh토큰 + 사용자 정보
1.3 토큰 갱신
POST /api/users/token/refresh/
Refresh Token으로 새 Access Token과 Refresh Token을 발급받는다.
- Auth: 불필요
- 파라미터:
refresh(string, 필수)
1.4 로그아웃
POST /api/users/logout/
현재 토큰을 무효화한다.
- Auth: 필요
1.5 관리자 Google 로그인
POST /api/users/admin-google-login/
관리자 전용 Google OAuth 로그인.
- Auth: 불필요
2. 사용자 (Users)
2.1 프로필 조회/수정
GET /api/users/profile/
PATCH /api/users/profile/
현재 사용자의 프로필 정보를 조회하거나 수정한다.
- Auth: 필요
- 수정 가능 필드: nickname, language, country, birth_year, marketing_consent 등
2.2 프로필 요약
GET /api/users/profile-summary/
사용자 프로필 + 읽기 통계 요약 정보.
- Auth: 필요
2.3 설정
GET /api/users/settings/
PATCH /api/users/settings/
앱 설정 관리 (app_language, viewer_languages, push_notification_enabled, notification_marketing, notification_bookmark).
- Auth: 필요
2.4 기기 관리
POST /api/users/devices/register/
GET /api/users/devices/
기기 등록 (FCM 토큰 포함) 및 등록된 기기 목록 조회.
- Auth: 필요
- 파라미터: device_id, device_type (ios/android), device_model, app_version, fcm_token
2.5 로그인 이력
GET /api/users/login-history/
로그인 이력 조회.
- Auth: 필요
2.6 계정 삭제
POST /api/users/delete-account/
계정 탈퇴 (소프트 삭제). deletion_reason 포함 가능.
- Auth: 필요
2.7 북마크
GET /api/users/bookmarks/
POST /api/users/bookmarks/
DELETE /api/users/bookmarks/<book_id>/
GET /api/users/bookmarks/status/<book_id>/
북마크 목록 조회, 추가, 삭제, 특정 도서 북마크 상태 확인.
- Auth: 필요
2.8 읽기 이력
GET /api/users/reading-history/
읽기 이력 조회 (에피소드 단위 진행률 포함).
- Auth: 필요
2.9 녹음
GET /api/users/recordings/
DELETE /api/users/recordings/<pk>/
사용자 녹음 목록 조회 및 삭제.
- Auth: 필요
2.10 도서 상태별 조회
GET /api/users/recent-books/
GET /api/users/books-in-progress/
GET /api/users/completed-books/
최근 읽은 도서, 진행중 도서, 완독 도서를 각각 조회한다.
- Auth: 필요
2.11 리뷰 요청
GET /api/users/review-eligibility/
POST /api/users/review-requested/
앱 리뷰 요청 대상 여부 확인 및 리뷰 요청 노출 기록.
- Auth: 필요
3. 도서 (Books)
3.1 도서 목록
GET /api/books/
도서 목록 조회. 언어별 출판된 도서만 반환.
- Auth: 불필요 (인증 시 북마크/진행률 포함)
- 파라미터:
lang,page,page_size,brand,series,character
3.2 전체 도서 데이터
GET /api/books/all/
전체 도서 데이터를 한번에 반환 (캐싱 최적화).
- Auth: 불필요
3.3 도서 카탈로그
GET /api/books/catalog/
도서 카탈로그 조회 (필터, 정렬 지원).
- Auth: 불필요
3.4 도서 상세
GET /api/books/<pk>/
도서 상세 정보 (에피소드 목록, 캐릭터, 시리즈, 스티커 정보 포함).
- Auth: 불필요 (인증 시 북마크/진행률 포함)
3.5 도서 추천
GET /api/books/<book_id>/recommendations/
특정 도서 기반 추천 도서 목록.
- Auth: 불필요
3.6 도서 읽기 진행률
GET /api/books/<book_id>/reading-progress/
POST /api/books/<book_id>/reading-progress/
도서의 읽기 진행률 조회 및 업데이트.
- Auth: 필요
3.7 에피소드 상세
GET /api/books/<book_id>/episodes/<pk>/
에피소드 상세 정보 (페이지 URL 목록 포함). 구독 필요 콘텐츠는 인증/구독 필수.
- Auth: 필요 (프리미엄 콘텐츠)
- Rate Limit: 300/min (
book_content)
3.8 에피소드 녹음
GET /api/books/<book_id>/episodes/<episode_id>/recordings/
POST /api/books/<book_id>/episodes/<episode_id>/recordings/
에피소드별 녹음 목록 조회 및 녹음 업로드.
- Auth: 필요
3.9 에피소드 읽기 진행률
GET /api/books/<book_id>/episodes/<episode_id>/reading-progress/
POST /api/books/<book_id>/episodes/<episode_id>/reading-progress/
에피소드별 읽기 진행률 조회 및 업데이트.
- Auth: 필요
3.10 검색
GET /api/books/search/
도서 검색. 제목, 저자, 시놉시스를 대상으로 검색한다.
- Auth: 불필요
- Rate Limit: 90/min (
search) - 파라미터:
q(검색어),lang
3.11 캐릭터
GET /api/books/characters/
GET /api/books/characters/<pk>/
캐릭터 목록 및 상세 조회.
- Auth: 불필요
3.12 일러스트레이터
GET /api/books/illustrators/
GET /api/books/illustrators/<pk>/
일러스트레이터 목록 및 상세 조회.
- Auth: 불필요
4. 홈 (Home)
4.1 종합 홈 데이터
GET /api/home/
홈 화면에 필요한 종합 데이터를 한번에 반환한다. 배너, 큐레이션, 랭킹, 캐릭터, 필터 등을 포함한다.
- Auth: 불필요 (인증 시 개인화 데이터 포함)
4.2 필터
GET /api/home/filters/
홈 화면 필터 옵션 목록 (tab, series, reading_level).
- Auth: 불필요
4.3 캐릭터 친구들
GET /api/home/characters/
홈 화면 캐릭터 목록.
- Auth: 불필요
4.4 랭킹
GET /api/home/rankings/
실시간 랭킹 TOP 10 (국가별).
- Auth: 불필요
- 파라미터:
country(기본: 사용자 국가 또는 KR)
4.5 배너
GET /api/home/banners/
활성 배너 목록 (시간 기반 필터링).
- Auth: 불필요
4.6 큐레이션 상세
GET /api/home/curations/<curation_id>/
특정 큐레이션의 도서 목록.
- Auth: 불필요
5. 결제 (Payments)
5.1 구독
POST /api/payments/subscribe/
구독 생성 (Google Play / Apple App Store 결제 후 호출).
- Auth: 필요
5.2 구독 조회
GET /api/payments/subscription/
현재 구독 상태 조회.
- Auth: 필요
5.3 구독 취소
POST /api/payments/subscription/cancel/
구독 취소 (자동갱신 중지, 만료일까지 유효).
- Auth: 필요
5.4 프로모 코드 적용 (결제)
POST /api/payments/promo/apply/
결제 시 프로모 코드 적용.
- Auth: 필요
5.5 구독 오퍼
GET /api/payments/subscription-offers/
사용 가능한 구독 오퍼 (프로모 코드 기반 할인 포함).
- Auth: 필요
5.6 결제 이력
GET /api/payments/history/
GET /api/payments/subscription-history/
결제 거래 이력 및 구독 이력 조회.
- Auth: 필요
5.7 결제 검증
POST /api/payments/verify/
Google Play / Apple App Store 영수증 검증 및 구독 활성화.
- Auth: 필요
- Rate Limit: 30/min (
payment_verify)
5.8 환불
POST /api/payments/refund-request/
POST /api/payments/refund-process/
환불 요청 및 환불 처리 (관리자).
- Auth: 필요
5.9 Google Play 관리
POST /api/payments/google-play/manage/
Google Play 구독 관리 (Acknowledge, Refund, Revoke).
- Auth: 필요 (관리자)
5.10 웹훅
POST /api/payments/rtdn/pubsub/
Google Play 실시간 개발자 알림 (RTDN) 수신 엔드포인트. Google Pub/Sub에서 호출한다.
- Auth: 불필요 (Google Pub/Sub 인증)
POST /api/payments/apple/notifications/
Apple Server Notifications V2 웹훅 수신 엔드포인트.
- Auth: 불필요 (Apple JWS 서명 검증)
6. 프로모코드 (Promo Codes)
6.1 프로모 코드 적용
POST /api/promocodes/apply/
GET /api/promocodes/applied/
POST /api/promocodes/applied/clear/
프로모 코드 임시 적용 (IAP 결제 전), 적용된 프로모 조회, 적용 해제.
- Auth: 필요
6.2 래퍼럴 코드
POST /api/promocodes/referral/create/
GET /api/promocodes/referral/my-stats/
GET /api/promocodes/referral/my-benefits/
GET /api/promocodes/referral/rewards/
래퍼럴 코드 생성, 내 추천 통계 조회, 내 래퍼럴 혜택 조회, 리워드 내역 조회.
- Auth: 필요
6.3 친구 초대 링크
GET /api/promocodes/invite/<code>/
GET /api/promocodes/invite/<code>/info/
래퍼럴 웹 리다이렉트 (앱 딥링크) 및 초대 링크 정보 조회.
- Auth: 불필요
별도 웹 URL도 제공:
GET /invite/<code>/- 웹 초대 링크
6.4 파트너 분석
GET /api/promocodes/analytics/<partner_code>/
파트너 프로모션 분석 데이터 (관리자 전용).
- Auth: 필요 (관리자)
별도 파트너 리다이렉트 URL:
GET /r/<code>/- 파트너 프로모션 짧은 링크
7. 스티커 (Stickers)
7.1 내 스티커 목록
GET /api/stickers/
사용자가 수집한 스티커 목록.
- Auth: 필요
7.2 스티커 통계
GET /api/stickers/stats/
스티커 수집 통계 (총 수집수, 일/주/월간 통계).
- Auth: 필요
7.3 인기 스티커
GET /api/stickers/popular/
인기 스티커 목록 (기간별, 국가별).
- Auth: 필요
7.4 미보유 스티커
GET /api/stickers/missing/
사용자가 아직 보유하지 않은 스티커 목록.
- Auth: 필요
7.5 공개 예정 스티커
GET /api/stickers/upcoming/
공개 예정 스티커 목록.
- Auth: 필요
7.6 스티커 위시리스트
GET /api/stickers/wishlist/
POST /api/stickers/wishlist/
DELETE /api/stickers/wishlist/<sticker_id>/
스티커 위시리스트(찜) 조회, 추가, 삭제.
- Auth: 필요
7.7 스티커 획득
POST /api/stickers/earn/<episode_id>/
에피소드 완독 시 스티커 획득.
- Auth: 필요
8. 이벤트/뉴스 (Events & News)
8.1 이벤트 목록
GET /api/events-news/
이벤트 및 뉴스 목록. type 파라미터로 event/news 구분 가능.
- Auth: 불필요
- 파라미터:
type(event/news),lang
8.2 이벤트 상세
GET /api/events-news/<pk>/
이벤트/뉴스 상세 정보.
- Auth: 불필요
8.3 이벤트 참여
POST /api/events-news/participate/
이벤트 참여 기록.
- Auth: 필요
- 파라미터:
event_id
9. 알림 (Notifications)
9.1 알림 목록
GET /api/notifications/
사용자 알림 목록 (유저소식 + 팬타소식).
- Auth: 필요
9.2 읽음 처리
POST /api/notifications/mark-read/
POST /api/notifications/mark-all-read/
특정 알림 읽음 처리 및 전체 읽음 처리.
- Auth: 필요
9.3 미읽음 수
GET /api/notifications/unread-count/
미읽음 알림 개수 조회.
- Auth: 필요
9.4 레드닷
GET /api/notifications/red-dot/
알림 레드닷 표시 여부 (새 알림이 있는지 빠르게 확인).
- Auth: 필요
10. 지원 (Support)
10.1 FAQ
GET /api/support/faq/
GET /api/support/faq/<pk>/
FAQ 목록 및 상세 조회. 카테고리별 필터링 가능 (account, payment, content, technical, other).
- Auth: 불필요
10.2 1:1 문의
GET /api/support/inquiries/
POST /api/support/inquiries/
GET /api/support/inquiries/<pk>/
문의 목록 조회, 문의 등록, 문의 상세 조회.
- Auth: 필요
- 파라미터 (등록 시): type (bug/payment/content/account/suggestion/other), subject, message
10.3 공지사항
GET /api/support/announcements/
GET /api/support/announcements/<pk>/
공지사항 목록 및 상세 조회.
- Auth: 불필요
11. 블로그 (Blog)
11.1 포스트
GET /api/blog/posts/
GET /api/blog/posts/<pk>/
블로그 포스트 목록 및 상세 조회. slug 기반 조회도 지원한다. 상세 조회 시 조회수가 자동 증가한다 (IP 기반 1시간 쿨다운).
- Auth: 불필요
11.2 카테고리
GET /api/blog/categories/
GET /api/blog/categories/<pk>/
블로그 카테고리 목록 및 상세 조회.
- Auth: 불필요
11.3 태그
GET /api/blog/tags/
GET /api/blog/tags/<pk>/
블로그 태그 목록 및 상세 조회.
- Auth: 불필요
12. 업로드 및 CloudFront
12.1 파일 업로드
POST /api/upload/presigned-url/
POST /api/upload/confirm/
S3 Presigned URL 발급 (클라이언트에서 직접 S3 업로드) 및 업로드 완료 확인.
- Auth: 필요
12.2 CloudFront
CloudFront 쿠키는 자동으로 관리된다. 별도 엔드포인트 없이 CDN 콘텐츠를 포함하는 API 응답에 쿠키가 자동으로 포함된다.
CDN 콘텐츠를 포함하는 API:
/api/home/(배너, 캐릭터, 도서 표지)/api/books/(도서 표지)/api/books/{id}/(도서 상세)/api/books/{id}/episodes/{id}/(에피소드 페이지)/api/stickers/(스티커 이미지)/api/events-news/(이벤트 이미지)/api/users/recent-books/,/api/users/books-in-progress/(도서 표지)
Rate Limiting
| 대상 | 제한 | 설명 |
|---|---|---|
| anon | 300/hr | 비인증 사용자 |
| user | 3000/hr | 인증 사용자 |
| login | 15/min | 로그인 시도 |
| register | 9/hr | 회원가입 |
| payment_verify | 30/min | 결제 검증 |
| search | 90/min | 검색 |
| book_content | 300/min | 도서 콘텐츠 접근 |
| admin | 1500/hr | 관리자 |
| sensitive | 90/min | 민감 작업 |
에러 응답 형식
HTTP 상태 코드
| 코드 | 설명 |
|---|---|
| 200 | 성공 |
| 201 | 생성 성공 |
| 204 | 성공 (응답 본문 없음) |
| 400 | 잘못된 요청 |
| 401 | 인증 필요 |
| 403 | 권한 없음 (구독 필요 포함) |
| 404 | 리소스 없음 |
| 429 | 요청 한도 초과 |
| 500 | 서버 오류 |
페이지네이션
표준 DRF 페이지네이션 형식:
{
"count": 100,
"next": "https://api.pentadisney.com/api/books/?page=2",
"previous": null,
"results": [...]
}
page: 페이지 번호 (기본: 1)page_size: 페이지당 항목 수 (기본: 20, 최대: 100)
기타 엔드포인트
| Method | URL | 설명 |
|---|---|---|
| GET | /health/ | ALB 헬스체크 |
| GET | /api/app/ | 앱 설정 (최소 버전 등) |
| GET | /.well-known/apple-app-site-association | Apple Universal Links 설정 |
| GET | /privacy-policy/ | 개인정보처리방침 |