커뮤니티 오픈 API
사이트 단위 API입니다. 키 하나가 커뮤니티 하나에 묶이고, 요청에서 지정한 멤버를 대신해 동작합니다. 크리에이터 대시보드 API도 멤버 API도 아니며, 여기에는 로그인 세션이 없습니다.
시작하기 전에
어떤 키든 동작하려면 두 가지가 먼저 참이어야 하며, 둘 다 여러분의 코드로는 해결할 수 없습니다.
1. 커뮤니티 플랜에 API 접근이 포함되어야 합니다
이것은 연동하는 쪽이 아니라 커뮤니티 소유자가 결정합니다. 플랜에 API 접근 기능이 있어야 하고, 없으면 모든 호출이 22203을 반환합니다. 또한 일일 할당량이 0이 아니어야 하며, 0이면 모든 호출이 22204를 반환합니다.
예전에 만들어진 커뮤니티는 플랜에 다른 고급 기능이 포함되어 있어도 API 접근이 기본적으로 꺼져 있습니다. 방금 발급한 키가 모든 호출에서 22203을 반환한다면, 코드를 다시 읽지 말고 소유자에게 콘솔을 확인해 달라고 하세요.
오류를 모아 알아낼 필요는 없습니다. /capabilities/get이 바로 답해 주며, 그 두 상태에서도 동작합니다.
2. 커뮤니티 관리자 콘솔에서 키 만들기
커뮤니티 관리자 → 통합 → API Keys → 생성. 키는 mfk_ 뒤에 64자리 16진수가 붙는 형태이며, 전체 값은 생성 시 단 한 번만 표시되고 이후에는 접두사만 보입니다.
생성할 때 고른 스코프가 그 키로 호출할 수 있는 엔드포인트를 결정합니다. 나중에 수정할 수 없으니, 바꾸려면 새 키를 만들고 기존 키를 폐기하세요.
선택적으로 키를 IP 허용 목록(단일 주소 또는 CIDR)으로 제한할 수 있습니다. 그 밖의 곳에서 온 요청은 10007로 실패합니다 — 잘못된 키와 같은 코드이므로, 어제까지 되던 키가 새 호스트에서 안 될 때 기억해 둘 만합니다.
스코프
| 스코프 | 포함 범위 |
|---|---|
| site.read | 커뮤니티 프로필과 설정 |
| content.read | 게시물 읽기, 피드, 검색, 답글 트리 |
| content.write | 게시물 생성·수정·삭제 |
| media.read | 저장된 미디어의 서명 URL |
| media.write | 미디어 업로드 토큰 — 하위 호환을 위해 서명 URL 읽기도 가능 |
| spaces.read | 스페이스 목록과 상세 |
| members.read | 멤버 조회와 이메일 검색 |
* 의 의미가 2026년 9월에 바뀌었습니다
예전에는 '나중에 추가되는 것까지 포함한 전부'를 뜻했습니다. 즉 플랫폼이 새 기능을 낼 때마다 과거에 발급된 모든 키가 조용히 넓어졌다는 뜻입니다. 이제 새 키는 생성 시점의 구체적인 목록을 저장하고, 남아 있는 *는 발급 당시 존재하던 네 가지 스코프, 곧 site.read·content.read·content.write·media.write 만을 가리킵니다.
따라서 오래된 키로는 새 엔드포인트 — 스페이스, 멤버, 서명 URL 읽기 — 를 호출할 수 없습니다. 필요한 스코프를 선택해 새 키를 발급하세요. 이는 의도된 동작입니다. 플랫폼이 새 기능을 냈다는 이유로 누구도 모르는 사이에 멤버 명부를 넘겨서는 안 되니까요.
인증
두 헤더 중 하나로 키를 보냅니다. 둘은 동등하며 함께 보내면 X-API-Key가 우선합니다. 커뮤니티는 키에서 도출되므로 사이트 id를 보낼 일은 전혀 없습니다.
X-API-Key: mfk_xxx
Authorization: Bearer mfk_xxx
키 자체가 자격 증명입니다 — 서버 쪽에 보관하세요. 브라우저 코드에도 모바일 번들에도 넣어서는 안 됩니다. 읽을 수 있는 사람은 누구나 여러분의 멤버로 게시할 수 있습니다.
공통 규약
아래의 모든 엔드포인트에 해당합니다.
- 모든 엔드포인트는 POST입니다. GET·PUT·DELETE는 없으며 읽기도 POST입니다.
- Content-Type: application/json을 보내세요. 파라미터를 받지 않는 엔드포인트도 빈 JSON 본문을 기대합니다.
- 모든 id는 "kZ3mQ9x" 같은 hashid 문자열입니다 — 커뮤니티·사용자·게시물·스페이스·미디어 모두 마찬가지. 숫자 id는 거부됩니다.
- 타임스탬프는 RFC3339로 반환됩니다. 예: 2026-08-18T10:00:00Z.
- 금액은 최소 통화 단위(센트)의 정수입니다.
- 선택적 Accept-Language 헤더(zh, en, ja, ko, es, fr, de, pt)가 오류 메시지를 현지화합니다.
- 커뮤니티는 API 키에서 도출됩니다. 경로에도 본문에도 사이트 id를 보내지 마세요.
입력 하나가 이 규칙을 깹니다. /post/create와 /post/update의 scheduled_at은 문자열이 아니라 초 단위 i64 Unix 타임스탬프입니다. 아래 '예약 게시'를 참고하세요.
성공과 실패가 같은 봉투를 씁니다
{
"code": 0,
"msg": "success",
"data": { }
}엔드포인트
모든 엔드포인트는 /site_open_api/v1 아래에 있고 JSON 본문의 POST를 쓰며, 키에 표시된 스코프를 요구합니다.
키의 스코프, API 접근 여부, 할당량의 사용량·잔량·초기화 시각을 반환합니다. 플랜 게이트나 일일 할당량이 나머지 전부를 막고 있을 때에도 답하는 유일한 엔드포인트이며, 자체적으로 할당량을 소모하지 않습니다. quota_limit이 -1이면 무제한입니다. 세 개의 할당량 필드는 함께 나타나고 함께 사라지므로, 빼기 전에 필드가 있는지 확인하세요.
커뮤니티 프로필, 설정, 메타데이터
id로 게시물 하나 조회
필수: id
한 번에 최대 50개. 못 찾은 id는 배치 전체를 실패시키지 않고 missing_ids에 담깁니다
필수: ids
게시물 검색 — 필드 이름은 keyword가 아니라 query 입니다
필수: query
추천 게시물. 스페이스로 범위를 좁힐 수도 있습니다
한 게시물 아래의 모든 답글
필수: post_id
1단계 답글만
필수: post_id
한 답글 아래의 하위 트리
필수: post_id
한 답글의 상위 체인
필수: post_id
커뮤니티 피드, 최신순(문자열 커서). since_id는 그보다 새로운 게시물만 가져옵니다 — 수정과 삭제는 볼 수 없으므로 타임라인을 채우는 데는 쓸 수 있어도 동기화에는 쓸 수 없습니다
점수순 커뮤니티 피드(부동소수점 커서)
추천 피드(문자열 커서)
한 스페이스의 피드. 정렬·검색·Q&A 필터는 선택 사항(문자열 커서)
필수: space_id
한 스페이스의 피드, 점수순(부동소수점 커서) — 호환을 위해 남겨 둔 예전 입구입니다
필수: space_id
멤버로서 게시합니다. 본문, 스페이스, 제목, 답글·인용 대상, 미디어, 투표, 오디오, 예약은 모두 선택 사항
필수: author_user_id, idempotency_key
게시물 수정. version을 넘기면 낙관적 잠금이 됩니다
필수: actor_user_id, idempotency_key, post_id
게시물 삭제
필수: actor_user_id, idempotency_key, post_id
해당 시점에서 보이는 스페이스 — viewer_user_id를 생략하면 익명 시점이 되어 공개된 것만 반환됩니다
id로 스페이스 하나 조회
필수: id
id로 멤버 한 명 조회
필수: id
정확히 일치하는 이메일로 멤버 찾기
필수: email
미디어 업로드 서비스용 단기 토큰
필수: author_user_id
비공개 미디어의 서명 URL (만료됩니다 — 저장하지 말고 그때그때 다시 서명하세요)
필수: author_user_id, items, access_level
curl -X POST https://api.mateflow.com/site_open_api/v1/capabilities/get \
-H "X-API-Key: mfk_xxx" -H "Content-Type: application/json" -d '{}'
# → data: {
# "api_version": "v1",
# "site_id": "kZ3mQ9x",
# "scopes": ["site.read", "content.read"],
# "api_access": true,
# "quota_limit": 5000, // -1 means unlimited
# "quota_used": 128,
# "quota_reset_at": "2026-09-15T00:00:00Z"
# }- id 목록을 받는 읽기는 50개가 상한이고, 페이지네이션이 있는 모든 엔드포인트의 limit 상한도 50입니다.
- /space/feed/list의 커서 인코딩은 sort를 따르므로, sort를 바꾸면 페이지네이션을 다시 시작해야 합니다. Q&A 스페이스는 sort를 무시하고 qa_sort로 정렬합니다. 새로 연동한다면 /space/feed/top 대신 /space/feed/list에 sort=top을 쓰세요.
- 멤버 응답은 좁게 투영된 형태입니다. id, username, display_name, avatar_url, status, role, created_at만 담깁니다. 이메일로 찾았더라도 이메일은 반환되지 않습니다 — 그 주소는 이미 여러분이 가지고 있고, 모든 멤버의 주소를 돌려주면 /member/get이 연락처 내보내기가 되어 버리니까요. 조회는 정확히 일치할 때만 되고, 못 찾는 것은 오류가 아니라 정상적인 성공이므로 적중과 실패를 상태 코드로도 소요 시간으로도 구분할 수 없습니다. 레이트 리밋 또한 이 API에서 가장 엄격합니다.
멤버를 대신해 동작하기
이 API에는 로그인 세션이 없으므로 '누가 동작하는지'와 '누구의 시점으로 결과를 보여 줄지'는 항상 요청 본문에 명시합니다. 셋 다 멤버 hashid를 받습니다.
author_user_id새 게시물이 어느 멤버 명의로 발행될지. 이미 이 커뮤니티에 속해 있어야 하며, 아니면 20303이 반환됩니다.
actor_user_id수정이나 삭제를 실행하는 사람. 권한은 이 멤버를 기준으로 판단하며, 작성자도 관리자도 아니면 10004가 반환됩니다.
viewer_user_id읽기에서는 선택 사항. 그 멤버에게 보이는 대로 결과를 반환합니다(비공개 스페이스, 좋아요와 북마크 상태). 생략하면 익명, 공개된 것만 보이는 시점이 됩니다.
페이지네이션
- 피드와 목록은 항목과 함께 next_cursor를 반환합니다. next_cursor를 그대로 되돌려 보내면 다음 페이지를 받고, next_cursor가 비어 있으면 끝에 도달했다는 뜻입니다.
- limit의 상한은 어디서나 50입니다.
- /space/feed/list의 커서에는 현재 sort가 인코딩되어 있습니다. 목록 도중에 sort를 바꾸면 커서가 무효가 되므로 첫 페이지부터 다시 시작하세요.
주의: /feed/top과 /space/feed/top의 커서는 문자열이 아니라 부동소수점 점수입니다. 두 종류를 하나의 문자열 변수에 담으면 페이지 넘김이 조용히 깨집니다.
멱등성
모든 쓰기는 요청 본문에 idempotency_key를 받습니다. 여기에는 정확히 한 겹의 멱등성만 있습니다 — 플랫폼의 헤더 기반 방식을 알고 계신다면 아래 주의를 보세요.
- idempotency_key는 모든 쓰기에서 필수이며 190자까지입니다. 같은 값을 재사용해도 두 번째 게시물이 만들어지지 않습니다.
- 그 범위는 커뮤니티와 요청 유형과 키의 조합이며, 어떤 API 키를 썼는지와는 무관합니다. 같은 커뮤니티의 서로 다른 두 키가 같은 idempotency_key로 같은 엔드포인트를 호출하면, 두 번째 호출은 첫 번째 결과를 그대로 돌려받습니다.
- 같은 키에 다른 본문을 보내면 성공한 재시도처럼 조용히 통과하지 않고 일관된 충돌 오류가 반환됩니다.
- 요청이 타임아웃되면 같은 키로 재시도하세요 — 절대 새 키를 만들지 마세요.
플랫폼 공통의 Idempotency-Key 요청 헤더 — 24시간 응답 캐시가 달린 그 계층 — 은 /site_open_api/**에는 적용되지 않습니다. 그 계층은 API 키 인증보다 앞에 있어서, 캐시가 적중하면 키 검증 자체를 건너뛰게 되기 때문입니다. 여기서 이 헤더를 보내도 아무 일도 일어나지 않습니다.
예약 게시
예약은 입력 형식과 동작이 모두 다른 유일한 곳입니다.
- scheduled_at은 초 단위 i64 Unix 타임스탬프입니다 — 다른 모든 시각이 쓰는 RFC3339 문자열이 아닙니다.
- /post/update에서 scheduled_at을 생략하면 기존 예약이 그대로 남습니다. 지우기가 아닙니다.
0 이하의 값을 넘기면 예약을 취소하고 게시물을 초안으로 되돌립니다 — 다만 초안 상태를 가지는 것은 블로그 게시물뿐입니다. 일반 게시물에 같은 호출을 하면 10005와 schedule_cancel_unsupported가 반환됩니다. 내부 경로가 '지금 게시'이기 때문인데, 이를 받아들이면 내용을 예정보다 일찍 공개하고 피드와 알림을 발생시키며 되돌릴 방법이 남지 않기 때문입니다.
미디어 업로드
파일은 API 호스트가 아니라 미디어 서비스로 갑니다. 세 단계입니다.
- /media/get_token으로 API 키를 단기 업로드 토큰과 교환합니다.
- 파일을 multipart로 미디어 서비스에 POST합니다. 토큰은 말 그대로 "token"이라는 이름의 헤더에 넣고, file_cate는 Media·Avatar·Header·Audio·File 중 하나로 설정합니다.
- 게시물을 만들 때 반환된 미디어 id를 media_ids에 넘깁니다.
파괴적 변경, 2026년 9월
스코프를 명시하지 않고 발급한 토큰은 이제 업로드 권한만 가집니다. 이전에는 업로드·읽기·삭제를 함께 가졌습니다. 그 토큰으로 읽거나 삭제했다면 read 또는 delete 스코프를 명시적으로 넘기세요. 별개로, 유예 기간에 있는 커뮤니티 — 체험이 끝나고 카드가 등록되지 않은 — 는 플랜 게이트에 의해 업로드 토큰이 거부됩니다. 읽기와 삭제 토큰은 영향을 받지 않습니다.
# 1. Exchange the API key for a short-lived upload token.
# Since 2026-09 a token with no explicit scope is upload-only.
curl -X POST https://api.mateflow.com/site_open_api/v1/media/get_token \
-H "X-API-Key: mfk_xxx" -H "Content-Type: application/json" \
-d '{"author_user_id": "kZ3mQ9x", "scope": "upload"}'
# 2. Upload the file to the media service (token goes in a "token" header)
curl -X POST https://media.mateflow.com/api/v1/media/upload \
-H "token: <token from step 1>" \
-F "file_cate=Media" -F "file=@photo.jpg"
# 3. Attach the media id when creating the post
curl -X POST https://api.mateflow.com/site_open_api/v1/post/create \
-H "X-API-Key: mfk_xxx" -H "Content-Type: application/json" \
-d '{"author_user_id":"kZ3mQ9x","idempotency_key":"6f1c...","body":"Hi","media_ids":["m8Yq2Lp"]}'비공개 미디어는 /media/get_signed_urls로 읽습니다. items와 access_level(1 공개 / 2 반비공개 / 3 비공개)을 받아 만료 시각이 있는 URL을 반환합니다. 저장해 두지 말고 필요할 때 요청하세요. 그러지 않으면 403을 반환하기 시작합니다.
게시물에 미디어 첨부하기
- media_id와 alt 쌍의 목록인 medias, 또는 id만 담은 목록인 media_ids 중 하나를 보내세요. 둘 다 보내면 10005가 반환됩니다.
- alt는 선택 사항입니다. 빈 문자열은 기존 대체 텍스트를 지우고, 필드를 생략하면 그대로 둡니다.
오류 코드
성공과 실패가 봉투를 공유하고, HTTP 상태는 비즈니스 코드를 따라갑니다. 상태가 아니라 code로 분기하세요.
| 코드 | HTTP | 의미 |
|---|---|---|
| 0 | 200 | 성공 |
| 10005 | 400 | 잘못된 파라미터 — msg에 문제가 된 필드 이름이 담깁니다 |
| 10007 | 401 | 키가 무효·폐기·만료되었거나, 호출 IP가 허용 목록에 없습니다 |
| 21304 | 403 | 이 엔드포인트가 요구하는 스코프가 키에 없습니다. 스코프는 생성 시 고정됩니다 |
| 22203 | 403 | 플랜에 API 접근이 포함되어 있지 않습니다 — data.required_plan 참고 |
| 22204 | 403 | 일일 할당량 소진 — data.current와 data.limit 참고 |
| 20303 | 404 | author_user_id / viewer_user_id가 이 커뮤니티의 멤버가 아닙니다 |
| 10003 | 404 | 대상 레코드가 존재하지 않습니다 |
| 10004 | 403 | 행위자에게 이 리소스에 대한 권한이 없습니다 |
| 10202 | 429 | 레이트 리밋 — 백오프하고 Retry-After 헤더를 따르세요 |
| 10001 | 500 | 서버 오류 — 재시도해도 안전합니다 |
함정에 주의하세요: 22203과 22204는 429가 아니라 403입니다. 스로틀링은 10202뿐입니다. HTTP 상태가 아니라 code로 판단하세요 — 이 API에서 가장 흔한 오독입니다.
오류 응답에는 request_id가 있습니다. 문제를 알릴 때 함께 적어 주세요 — 로그에서 바로 그 호출을 찾는 단서입니다.
플랜 관련 오류에는 구조화된 메타데이터가 있습니다
두 플랜 오류 모두 커뮤니티 소유자에게 무엇을 해야 하는지 알려 줄 만큼의 정보를 담아 돌아옵니다. '무언가 잘못되었습니다' 대신 실제로 쓸모 있는 메시지를 보여 줄 수 있습니다.
// The plan does not include API access
{
"code": 22203,
"msg": "...",
"request_id": "00de5640-8ae5-4a71-aef8-2f2cab0ce8a7",
"data": {
"error_code": "feature_not_available",
"feature": "api_access",
"required_plan": "Growth"
}
}
// The community is out of daily quota
{
"code": 22204,
"data": {
"error_code": "quota_exceeded",
"resource": "api_requests_per_day",
"current": "5001",
"limit": "5000",
"required_plan": "Business"
}
}할당량과 레이트 리밋
서로 다른 세 가지 장치입니다. 이들을 뒤섞는 것이, 사실은 플랜 할당량이 떨어졌을 뿐인 연동이 '레이트 리밋에 걸렸다'고 보고되는 이유입니다.
| 계층 | 세는 대상 | 초과 시 |
|---|---|---|
| 플랜 일일 할당량 | 하루 전체, 모든 엔드포인트, 커뮤니티 단위 | 22204 / HTTP 403 |
| 키 단위 버스트 예산 | 10초와 60초 창, 키 단위, 엔드포인트별 등급 | 10202 / HTTP 429 |
| 일반 IP 제한 | 출발지 IP 단위, 10초당 60회 및 분당 300회 | 10202 / HTTP 429 |
일일 할당량은 인증을 통과한 요청을 세고, UTC 0시에 초기화되며, 실제로 적용 중인 상한을 data.limit으로 알려 줍니다 — 해당 커뮤니티를 위해 개별적으로 올려 준 한도까지 포함해서요. 카운터 백엔드에 문제가 생기면 거부가 아니라 통과시키므로, 가끔 적게 세어진다고 해서 할당량이 작동을 멈춘 것은 아닙니다.
키 단위 버스트 예산 (2026년 9월 추가)
예전에는 IP 단위 버킷만 있어서, 하나의 출구 주소 뒤에 있는 여러 고객이 서로 자리를 다투는 한편 여러 주소에 흩어진 호출자는 거의 제약을 받지 않았습니다. 이제 예산은 키 단위로 등급이 나뉩니다 — 키야말로 커뮤니티 소유자가 발급하고, 교체할 수 있고, 책임지는 대상이니까요.
| 등급 | 대상 | 10초당 | 60초당 |
|---|---|---|---|
| 읽기 | 피드, 게시물, 답글, 스페이스, 인트로스펙션 | 120 | 600 |
| 미디어 | get_token 및 get_signed_urls | 30 | 120 |
| 쓰기 | 게시물 생성·수정·삭제 | 20 | 120 |
| 검색 | post/search | 20 | 60 |
| 멤버 조회 | member/lookup | 5 | 10 |
member/lookup이 훨씬 엄격한 것은 용량이 아니라 보안 때문입니다. 다른 제약들은 '한 번의 답이 얼마나 드러내는가'를 제한하지만, 이것만은 '몇 번 물을 수 있는가'를 제한합니다 — 조회를 명부 수집으로 바꾸는 단계가 바로 그것이기 때문입니다. 설계된 용도대로, 이미 가진 주소를 사람의 속도로 해석하는 데에는 분당 10회면 차고 넘칩니다.
- 초과하면 HTTP 429와 code 10202가 반환되고 Retry-After 및 X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset 헤더가 함께 옵니다.
- 이 숫자들은 측정값이 아니라 출발점으로 다루세요 — 관측된 트래픽에 따라 조정됩니다. 재시도 로직에 하드코딩하지 말고 429와 Retry-After를 따르세요. 레이트 리밋 계층은 기본적으로 꺼져 있으며, 시행 전에 한동안 관측 모드로 동작합니다.
- 어느 경우든 429 백오프를 구현하고, 읽기 트래픽은 대략 초당 10요청 이하로 유지하세요.
웹훅 수신하기
커뮤니티 소유자가 웹훅 엔드포인트를 설정했거나 Slack·Discord·Zapier를 연결했다면, 전송 본문에는 의미가 다른 두 벌의 id가 담깁니다.
| 필드 | 식별 대상 | 재시도 사이에서 |
|---|---|---|
| event_id | 비즈니스 이벤트 | 변하지 않음 |
| occurred_at | 이벤트가 일어난 시각 | 변하지 않음 |
| delivery_id | 이번 전송 시도 | 매번 바뀜 |
| timestamp | 이번 시도를 보낸 시각 | 매번 바뀜 |
중복 제거는 event_id로 하세요. 처리에는 성공했지만 응답이 너무 느렸던 전송은 새 delivery_id와 같은 event_id로 다시 도착합니다. 하나의 이벤트가 커스텀 웹훅과 Zap 양쪽으로 갈 때도 두 쪽이 같은 event_id를 보므로 서로 맞출 수 있습니다.
전송은 at-least-once이며 순서가 뒤바뀔 수 있습니다. 중복도, 오래된 이벤트가 늦게 도착하는 것도 모두 정상입니다. 수신 측이 멱등해야 합니다.
event_id는 없을 수 있습니다. 이 필드가 도입되기 전에 큐에 들어간 작업에는 없으며, 전송은 0을 보내는 대신 필드를 통째로 생략합니다 — 0을 보내면 오래된 작업이 전부 같은 이벤트처럼 보이기 때문입니다. 없는 경우도 받아들이고, delivery_id로 최선을 다한 중복 제거로 되돌아가세요.
문제 해결
실제로 들어오는 증상과 대개의 원인.
| 증상 | 대개는 |
|---|---|
| 10007 invalid API key. 그런데 키는 방금 콘솔에서 복사한 것 | 키 앞뒤에 공백이나 줄바꿈이 있음. 또는 키가 폐기됨. 또는 IP 허용 목록이 설정되어 있는데 출구 주소가 목록에 없음 |
| 22203 feature_not_available | 플랜의 API 접근이 꺼져 있습니다. 소유자가 바꾼 뒤 플랜 캐시가 만료되기까지 최대 10분이 걸립니다 |
| limit이 0인 22204 quota_exceeded | 플랜의 일일 요청 할당량이 0이며, 이는 사용 불가라는 뜻입니다 — '설정하지 않아서 무제한'이 아닙니다 |
| 될 줄 알았던 엔드포인트에서 21304 | 키에 그 스코프가 없습니다. 스코프는 생성 시 고정되므로 해법은 새 키입니다 |
| '모든 권한'(*)을 가진 키에서 21304 | 남아 있는 *는 나중에 추가된 스코프 — media.read, spaces.read, members.read — 를 포함하지 않습니다. 그것들을 선택해 새 키를 발급하세요 |
| 10202와 HTTP 429 | 레이트 리밋입니다. Retry-After에 따라 백오프하세요. member/lookup에서 발생했다면 그 버킷은 분당 10회임을 기억하세요 |
| 10005와 schedule_cancel_unsupported | 일반 게시물에 0 이하의 scheduled_at을 넘겼습니다. 돌아갈 초안 상태를 가지는 것은 블로그 게시물뿐입니다 |
| 읽기나 삭제에 쓰던 미디어 토큰이 갑자기 안 됨 | 2026년 9월부터 스코프 없는 토큰은 업로드 전용입니다. read 또는 delete 스코프를 넘기세요 |
| /member/lookup이 200과 found false를 반환 | 이는 오류가 아니라 정상적인 '못 찾음'입니다. 적중도 실패도 모두 200이니 found로 분기하세요 |
| query를 언급하는 10005 invalid params | 검색 필드는 query입니다. keyword는 유효한 필드가 아닙니다 |
| 20303 user not found | 그 id가 이 커뮤니티의 멤버가 아니거나, hashid 대신 숫자 id를 보냈습니다 |
| 페이지가 더 넘어가지 않음 | /feed/top과 /space/feed/top의 커서는 부동소수점입니다. 문자열로 직렬화하면 더 이상 맞지 않습니다 |
| 얼마 뒤 미디어 URL이 403을 반환하기 시작 | 서명 URL에는 TTL이 있습니다. 저장하지 말고 필요할 때 다시 서명하세요 |
참고
- 커뮤니티는 API 키에서 도출됩니다. 경로에도 본문에도 사이트 id를 보내지 마세요.
- 스코프는 키 생성 시 고정됩니다. 바꾸려면 새 키를 만들고 기존 키를 폐기하세요.
- API 키는 서버 쪽에 두세요. 클라이언트 코드에 두면 읽을 수 있는 사람은 누구나 여러분의 멤버로 게시할 수 있습니다.
- OpenAPI 계약은 모든 경로와 스키마를 담고 있습니다. 한 가지 주의: 이를 생성한 도구가 요청 본문의 required를 내보내지 않으므로, 필수 필드는 명세 파일이 아니라 이 페이지를 기준으로 삼으세요.
개발 시작하기
커뮤니티 관리자 콘솔에서 범위를 지정한 키를 만들고, /capabilities/get으로 확인한 다음 시작하세요.
14일 무료 체험 · 신용카드 불필요