๐ŸŒฑ ๋ณต๋ถ™ API & MCP

138๋งŒ+ (๋ชฉํ‘œ 1,000๋งŒ) ํ•œ๊ตญ ๊ฐ€์ƒ ์‹œ๋“œ ํšŒ์› ๋ฐ์ดํ„ฐ๋ฅผ REST์™€ MCP(Model Context Protocol)๋กœ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. PII๋Š” ๊ธฐ๋ณธ ๋งˆ์Šคํ‚น๋˜๋ฉฐ, unmask=true ์‚ฌ์šฉ ์‹œ Bearer ํ† ํฐ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

์ธ์ฆ

Authorization: Bearer <SEEDKIT_API_TOKEN>   # ๊ณต๊ฐœ REST
X-API-KEY: <EXTERNAL_API_KEY>               # ์™ธ๋ถ€ ํŠธ๋ฆฌ๊ฑฐ ยท ํ—ฌ์Šค ยท ๋‚ด๋ถ€ ํฌ๋ก 
# MCP๋Š” ๋ณ„๋„ โ€” OAuth 2.1 (์•„๋ž˜ MCP ์„น์…˜ ์ฐธ๊ณ )

ํ† ํฐ์€ ํ”„๋กœ์ ํŠธ ์‹œํฌ๋ฆฟ SEEDKIT_API_TOKEN / EXTERNAL_API_KEY ๋กœ ๊ด€๋ฆฌ๋ฉ๋‹ˆ๋‹ค. ๋ฆฌํฌํŠธ HTML์€ ์œ„ ํ† ํฐ ๋Œ€์‹  ?t= HMAC ๋ฆฌํฌํŠธ ํ† ํฐ, ์†Œ์œ ์ž JWT, ๊ณต๊ฐœ ์‡ผ์ผ€์ด์Šค ์—ฌ๋ถ€๋กœ ์ ‘๊ทผ ์ œ์–ดํ•ฉ๋‹ˆ๋‹ค.

REST ์—”๋“œํฌ์ธํŠธ ยท ๋ฐ์ดํ„ฐ ์กฐํšŒ

MethodPathAuth์„ค๋ช…
GET/api/public/v1/stats/summaryโ€”์ด ํšŒ์›์ˆ˜ยท๋ฐฐ์น˜ยท์ง€์—ญ ๋ถ„ํฌ
GET/api/public/v1/membersBearer ํ† ํฐํšŒ์› ํŽ˜์ด์ง€๋„ค์ด์…˜ (limitยทcursorยทregionยทgenderยทoccupationยทqยทunmask)
GET/api/public/v1/members/{id}Bearer ํ† ํฐํšŒ์› ๋‹จ๊ฑด
GET/api/public/v1/occupationsโ€”์ง์—… ๋ชฉ๋ก (tierยทemployment_typeยทinclude_legacy)
GET/api/public/v1/occupations/{id}โ€”์ง์—… ๋‹จ๊ฑด
GET/api/public/v1/occupations/tier/{tier}โ€”ํ‹ฐ์–ด๋ณ„ ์ง์—… ๋ชฉ๋ก (T1~T6)

REST ์—”๋“œํฌ์ธํŠธ ยท ์ƒ์„ฑ ยท ๋ฐฐ์น˜

MethodPathAuth์„ค๋ช…
POST/api/public/v1/generateBearer ํ† ํฐํ•„ํ„ฐ ์กฐ๊ฑด์œผ๋กœ ์ฆ‰์‹œ ์ƒ์„ฑ (count โ‰ค 10,000)
POST/api/public/webhooks/n8n/generateBearer ํ† ํฐn8n ๋‹จ์ผ ๋…ธ๋“œ์šฉ ยท ์™„๋ฃŒ ์‹œ callback POST
GET/api/public/v1/batchesโ€”๋ฐฐ์น˜ ๋ชฉ๋ก
GET/api/public/v1/batches/{id}โ€”๋ฐฐ์น˜ ๋‹จ๊ฑด
GET/api/public/v1/batches/{id}/statsโ€”๋ฐฐ์น˜ ์š”์•ฝ ํ†ต๊ณ„ (์„ฑ๋ณ„ยท์ƒ์• ์ฃผ๊ธฐยทํ‹ฐ์–ดยท์ƒ์œ„ ์ง€์—ญ/์ง์—…)
POST/api/public/v1/batchesBearer ํ† ํฐ๋ฐฐ์น˜ ์ƒ์„ฑ
POST/api/public/v1/batches/{id}/generateBearer ํ† ํฐ์ฒญํฌ ์ƒ์„ฑ (5,000๊ฑด)
DELETE/api/public/v1/batches/{id}Bearer ํ† ํฐ๋ฐฐ์น˜ + ํšŒ์› ์‚ญ์ œ

REST ์—”๋“œํฌ์ธํŠธ ยท ๋ฆฌํฌํŠธ ยท ์™ธ๋ถ€ ์—ฐ๋™

MethodPathAuth์„ค๋ช…
GET/api/public/v1/simulation-report/{id}๋ฆฌํฌํŠธ ํ† ํฐ / ์†Œ์œ ์ž์‹œ๋ฎฌ๋ ˆ์ด์…˜ ๋ฆฌํฌํŠธ HTML (PDF ์ธ์‡„์šฉ)
GET/api/public/v1/showcase-report/{id}๋ฆฌํฌํŠธ ํ† ํฐ / ์†Œ์œ ์ž๊ณต๊ฐœ ์‡ผ์ผ€์ด์Šค ๋ฆฌํฌํŠธ HTML
GET/api/public/v1/competitor-report/{id}๋ฆฌํฌํŠธ ํ† ํฐ / ์†Œ์œ ์ž๊ฒฝ์Ÿ์‚ฌ ๋น„๊ต ๋ฆฌํฌํŠธ HTML
GET/api/public/v1/complete-package/{id}๋ฆฌํฌํŠธ ํ† ํฐ / ์†Œ์œ ์ž๋ฆฌํฌํŠธ+ํ›„๊ธฐ+FGI ํ†ตํ•ฉ HTML
POST/api/public/v1/external-simulate-triggerX-API-KEY์™ธ๋ถ€ ์ƒํ’ˆ ๋“ฑ๋ก โ†’ ์กฐ์‚ฌ ํŠธ๋ฆฌ๊ฑฐ, ์™„๋ฃŒ ์‹œ callback
GET/api/public/v1/admin-healthX-API-KEY์ ์ฒด ํŒŒ์ดํ”„๋ผ์ธ ๊ฐ์‹œ
GET/api/public/v1/openapiโ€”OpenAPI 3.1 ์ŠคํŽ™ (๊ธฐ๊ณ„์šฉ JSON)

๋‚ด๋ถ€ ์ „์šฉ(์šด์˜ยทํฌ๋ก ): /cron-cleanup-stuck, /admin-cleanup-stuck, /retry-rejected-personas, /simulation-demo โ€” ์ŠคํŽ™์— x-internal: true ๋กœ ํ‘œ์‹œ๋˜๋ฉฐ ์™ธ๋ถ€ ํŒŒํŠธ๋„ˆ ๋Œ€์ƒ์ด ์•„๋‹™๋‹ˆ๋‹ค.

์‚ฌ๋žŒ์ด ์ฝ๋Š” ๊ฐœ์š”ยท๊ณผ๊ธˆยท์—ฐ๋™ ์‹œ์ž‘ ์•ˆ๋‚ด๋Š” /developers ์— ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ์‹œ ยท ๋ฐ์ดํ„ฐ/๋ฐฐ์น˜

curl https://bokput.io/api/public/v1/stats/summary

curl -H "Authorization: Bearer $TOKEN" \
  "https://bokput.io/api/public/v1/members?limit=10&region=11"

curl -X POST -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
  -d '{"label":"api-batch","targetCount":1000}' \
  https://bokput.io/api/public/v1/batches

์˜ˆ์‹œ ยท ๋ฆฌํฌํŠธ ยท ์™ธ๋ถ€ ํŠธ๋ฆฌ๊ฑฐ

# ๋ฆฌํฌํŠธ HTML (HMAC ๋ฆฌํฌํŠธ ํ† ํฐ)
curl "https://bokput.io/api/public/v1/simulation-report/<id>?t=<report_token>"
curl "https://bokput.io/api/public/v1/complete-package/<id>?t=<report_token>"

# ์™ธ๋ถ€ ์ƒํ’ˆ ๋“ฑ๋ก โ†’ ์กฐ์‚ฌ ํŠธ๋ฆฌ๊ฑฐ (์™„๋ฃŒ ์‹œ callback_url ๋กœ POST)
curl -X POST https://bokput.io/api/public/v1/external-simulate-trigger \
  -H "X-API-KEY: $EXTERNAL_API_KEY" -H "Content-Type: application/json" \
  -d '{"product_name":"์ˆ˜๋ถ„ ํฌ๋ฆผ","category":"beauty",
       "external_source":"partner-shop","external_ref_id":"SKU-1001",
       "callback_url":"https://partner.example.com/hooks/bokput","panel_size":100}'

์˜ˆ์‹œ ยท MCP

# ํˆด ๋ชฉ๋ก
curl -X POST https://bokput.io/mcp \
  -H "authorization: Bearer <OAUTH_ACCESS_TOKEN>" \
  -H "content-type: application/json" \
  -H "accept: application/json, text/event-stream" \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'

# ์ขŒ์„ ๋ฐฐ์ •
{"jsonrpc":"2.0","id":2,"method":"tools/call",
 "params":{"name":"lease_seats_allocate",
           "arguments":{"count":50,"category_code":"beauty","gender":"female","age_min":25,"age_max":39}}}

# ๋Œ“๊ธ€ ์ƒ์„ฑ (1ํšŒ 20๊ฑด, ์ดˆ๊ณผ๋ถ„์€ ์˜ˆ์•ฝ)
{"jsonrpc":"2.0","id":3,"method":"tools/call",
 "params":{"name":"community_comments_generate","arguments":{"post_id":"<uuid>","count":20}}}

MCP (Streamable HTTP)

MCP ํด๋ผ์ด์–ธํŠธ(Claude, Cursor ๋“ฑ)์—์„œ ๋‹ค์Œ URL์„ ๋“ฑ๋กํ•˜์„ธ์š”:

https://bokput.io/mcp
Accept: application/json, text/event-stream

์ธ์ฆ์€ OAuth 2.1(๋™์  ํด๋ผ์ด์–ธํŠธ ๋“ฑ๋ก)์ž…๋‹ˆ๋‹ค. ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ž๋™ ๋“ฑ๋ก๋˜๊ณ  ๋ธŒ๋ผ์šฐ์ € ๋™์˜ ํ™”๋ฉด์—์„œ ๋กœ๊ทธ์ธํ•˜๋ฉด ํ•ด๋‹น ๊ณ„์ • ๊ถŒํ•œ์œผ๋กœ ํˆด์ด ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. REST ์ „์šฉ SEEDKIT_API_TOKEN ์€ MCP์— ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋“ฑ๋ก๋œ tools๋Š” 29์ข…์ด๋ฉฐ 4๊ฐˆ๋ž˜๋กœ ๋‚˜๋‰ฉ๋‹ˆ๋‹ค. ์ „์ฒด ์ธ์žยท๊ถŒํ•œ์€ tools/list ์‘๋‹ต ์Šคํ‚ค๋งˆ๊ฐ€ ์ •๋ณธ์ž…๋‹ˆ๋‹ค.

์‹œ๋“œํ‚ท (10)

์ž„๋Œ€ (7)

์ปค๋ฎค๋‹ˆํ‹ฐ (8)

์„œ์‚ฌยท์Œ์„ฑ (4)