Admin APICreator Marketplace
GET /ai/admin/meta-creator-marketplace/creators/{id}
크리에이터 단건 상세 (리스트 카드 클릭, id 키, 실 Meta 호출·표준액세스 mock)
크리에이터 상세 조회 (ADMIN)
탐색기 리스트에서 카드를 클릭했을 때의 단건 상세입니다. 리스트에 없는 무거운 데이터(오디언스 breakdown + 최근 미디어)를 담아, 리스트 row 를 가볍게 유지하면서 상세에서만 호출합니다.
식별키는 크리에이터 IG id(안정·불변)입니다. username 은 변경 가능하지만 id 는 고정이고, 표준 mock 응답에도 id 가 포함되어 그대로 키로 씁니다. username 은 리스트가 이미 들고 있어 표시용으로만 선택 전달합니다.
리스트와 동일한 실 Meta 호출입니다 — creator_marketplace_creators 를 query=username 으로 좁혀 호출하고 반환 프로필의 insights + recent_media 를 매핑합니다. 표준(standard) 액세스에서는 Meta 제공 mock/test 데이터(mocked_username_*, mock=true)가, App Review(advanced) 승인 후 동일 코드로 실데이터가 내려옵니다. 오디언스 breakdowns 는 insights.metrics(M).breakdown(D) 서브요청을 Graph Batch API 로 한 번에 묶어(한 호출에 차원 1개만 허용 — 콤마 리스트는 #100) 병합합니다. 표준액세스에서도 mock breakdown 이 채워져 옵니다(라이브 실측 확인).
HTTP 요청
GET /ai/admin/meta-creator-marketplace/creators/{id}?username={username}
Authorization: Bearer {admin_access_token}Path / Query Parameters
| 파라미터 | 위치 | 타입 | 필수 | 설명 |
|---|---|---|---|---|
id | path | String | 예 | 크리에이터 IG id (리스트 응답의 id) |
username | query | String | 아니오 | 표시용 username (리스트가 보유 → 전달 시 응답에 그대로 표기. 없으면 placeholder) |
응답
성공 응답 (200 OK) — 표준(mock)
{
"status": 200,
"code": null,
"message": "크리에이터 상세 조회 완료",
"data": {
"id": "265694058577505",
"username": "mocked_username_1",
"name": "mocked_username_1",
"biography": "proceed through app review",
"country": "KR",
"gender": "FEMALE",
"ageBucket": "25_to_34",
"isAccountVerified": false,
"onboardedStatus": "ONBOARDED",
"hasBrandPartnershipExperience": true,
"pastBrandPartnershipPartners": [],
"insights": {
"totalFollowers": 220000,
"creatorEngagedAccounts": 28000,
"creatorReach": 130000,
"reelsHookRate": 32.9,
"reelsInteractionRate": 43.8
},
"breakdowns": {
"AGE": [
{ "label": "18-24", "percent": 5.2 },
{ "label": "25-34", "percent": 5.1 },
{ "label": "35-44", "percent": 8.2 }
],
"TOP_COUNTRIES": [
{ "label": "Mocked Country 1", "percent": 3.3 },
{ "label": "Mocked Country 2", "percent": 6.1 }
],
"FOLLOW_TYPE": [
{ "label": "follower_count", "percent": 47.3 },
{ "label": "non_follower_count", "percent": 52.7 }
]
},
"recentMedia": [
{ "thumbnailUrl": null, "views": 130000, "likes": 6500, "comments": 650 }
],
"mock": true
}
}응답 필드
| 필드 | 타입 | 설명 |
|---|---|---|
id | String | 크리에이터 IG id (식별키) |
username / name | String | 크리에이터 (표시용) |
biography / country / gender / ageBucket | String | 프로필 |
isAccountVerified / onboardedStatus / hasBrandPartnershipExperience | — | 프로필 |
pastBrandPartnershipPartners | Array | 과거 협업 파트너 |
insights | Object | totalFollowers, creatorEngagedAccounts, creatorReach(정수 카운트) + reelsHookRate, reelsInteractionRate. rate 2종은 0~100 퍼센트 포인트 스케일(예: 32.9 = 32.9%, 0~1 소수 아님). Meta total_value.value 무변환 통과 — mock·실데이터 동일 스케일 |
breakdowns | Object | 키 = AGE / GENDER / TOP_COUNTRIES / TOP_CITIES / FOLLOW_TYPE / MEDIA_TYPE(대문자), 값 = [{ label, percent }]. 비중형(age/gender/top_countries/top_cities)은 응답 percentage 그대로, 절대수형(follow_type/media_type)은 합계 대비 %로 환산. 표준액세스 mock 도 채워짐 |
recentMedia | Array | [{ thumbnailUrl, views, likes, comments }] |
mock | Boolean | mock 여부 |
에러 응답
| 상태 코드 | code | 설명 |
|---|---|---|
400 | BAD_REQUEST | id 누락 |
403 | FORBIDDEN | 관리자 권한 없음 |
설계 메모
- 식별키 = IG
id(불변). username 은 리네임 가능 + 중복 위험이 있어 키로 쓰지 않음. 표준 mock 응답에도 id 가 포함돼 mock 단계부터 id 로 식별 가능. - 리스트(
/creators)는 인사이트 스칼라만 인라인으로 주고recent_media는 요청하지 않는다. 상세는recent_media를 추가로 요청(CREATOR_DETAIL_FIELDS)해 리스트 페이로드는 경량 유지. - 상세는 마켓 단건 노드 직접조회 대신
creator_marketplace_creators를query=username으로 좁혀 호출하고id매칭 프로필을 매핑한다(미매칭 시 첫 건). - breakdown 은
breakdown()이 차원 1개만 받으므로(콤마 리스트는#100) 지원 (메트릭,차원) 6쌍을 서브요청으로 나눠, Graph Batch API(단일 POST +batch=[...])로 한 요청에 묶어 보낸다 → HTTP 왕복 6→1. 응답은 서브요청 순서대로[{code, body}]배열이고 각 body 를 재파싱해insights.data[].total_value.breakdowns = { dimension_key, results }를 뽑는다. 각 서브응답은 fail-soft(일부 실패해도 나머지 채움). 레이트리밋 call_count 는 서브요청 수만큼 카운트되므로 배치는 왕복만 줄이고 쿼터는 동일. - 상세는 배치 호출이 재클릭마다 반복되지 않도록 응답을 Redis 단기 캐시(
meta:cm:detail:{id}, TTL=검색과 동일)한다.