Developer API · v1

Shoalcast API

사람들의 반응을 미리 시뮬레이션하는 엔진을 여러분의 제품 안에서 호출하세요. 출시 전 체크리스트, 마케팅 자동화, 사내 의사결정 도구에 반응 예측 단계를 붙일 수 있습니다.

인증

워크스페이스 > API 키에서 키를 만들고 모든 요청에 Authorization: Bearer sk_shoal_… 헤더로 보내세요. 키는 만들 때 한 번만 보여 주며 서버에는 해시만 저장됩니다. 키는 서버 쪽 환경 변수에 두고, 브라우저 코드나 앱 번들에 넣지 마세요.

빠른 시작

시뮬레이션은 수십 초에서 몇 분이 걸립니다. 생성 후 status가 completed 또는 failed가 될 때까지 몇 초 간격으로 조회하세요.

export SHOAL_API_KEY=sk_shoal_...

# 1) 생성
curl -s -X POST $HOST/api/v1/simulations \
  -H "Authorization: Bearer $SHOAL_API_KEY" -H "Content-Type: application/json" \
  -d '{"question":"구독료를 20% 올리면 사용자 반응은?","agents":12,"rounds":3}'
# → 202 {"id":"sim_...","status":"queued", ...}

# 2) 완료될 때까지 조회
curl -s $HOST/api/v1/simulations/sim_... -H "Authorization: Bearer $SHOAL_API_KEY"
// Node.js (서버 쪽)
const headers = { Authorization: `Bearer ${process.env.SHOAL_API_KEY}`, "Content-Type": "application/json" };
const sim = await fetch(`${HOST}/api/v1/simulations`, {
  method: "POST", headers,
  body: JSON.stringify({ question: "구독료를 20% 올리면 사용자 반응은?" }),
}).then((r) => r.json());

let result = sim;
while (result.status === "queued" || result.status === "running") {
  await new Promise((r) => setTimeout(r, 4000));
  result = await fetch(`${HOST}/api/v1/simulations/${sim.id}`, { headers }).then((r) => r.json());
}
console.log(result.report?.headline);

엔드포인트

POST/api/v1/simulations시뮬레이션 생성 (비동기, 202 반환)
GET/api/v1/simulations최근 시뮬레이션 목록 (?limit=20)
GET/api/v1/simulations/{id}상태·그래프·에이전트·타임라인·보고서 조회
POST/api/v1/simulations/{id}/ask후속 질문 또는 에이전트 인터뷰
GET/api/v1/simulations/{id}/messages후속 질문 기록
DELETE/api/v1/simulations/{id}끝난 시뮬레이션 삭제
GET/api/v1/usage요금제와 이번 달 사용량
POST/api/v1/surveys설문 생성 (빈 설문 · template · ai{goal,audience})
GET/api/v1/surveys내 설문 목록
GET / PATCH / DELETE/api/v1/surveys/{id}설문 조회 · 수정(title, description, questions) · 삭제
POST/api/v1/surveys/{id}/status배포 상태 변경 {status: draft|open|closed}
GET/api/v1/surveys/{id}/results문항별 집계 (?clean=0 품질 표시 포함, ?segment={문항id} 교차분석)
GET/api/v1/surveys/{id}/responses응답 원자료 (?format=csv)
POST/api/v1/surveys/{id}/reviewAI 문항 검수
POST/api/v1/surveys/{id}/askAI 분석가에게 질문 {question}
POST / GET/api/v1/surveys/{id}/reportAI 보고서 생성 · 조회
POST/api/v1/surveys/{id}/panel/estimate패널 조건별 해당 인원·예상 비용 {criteria, quota}
POST / GET/api/v1/surveys/{id}/panel/campaigns패널 발송 요청 · 목록 (운영자 승인 후 모집)
DELETE/api/v1/surveys/{id}/panel/campaigns/{cid}패널 요청 취소

시뮬레이션 생성

필드타입설명
questionstring (5–2000자, 필수)예측하고 싶은 상황이나 결정
contextstring (최대 12,000자)보고서·기획안·기사 등 시드 자료
variants[{label, text}] (최대 6)같은 청중에게 비교할 안. 2개 이상이면 A/B 비교 보고서
agentsinteger 4–100페르소나 수. 기본 12 (요금제 한도 내)
roundsinteger 1–12상호작용 라운드 수. 기본 3 (요금제 한도 내)

응답 객체

{
  "id": "sim_8f2c...", "object": "simulation",
  "status": "running",            // queued | running | completed | failed
  "stage": "simulation",          // graph | agents | simulation | report | completed
  "progress": 0.54,
  "engine": "bridge",
  "graph":   { "title", "summary", "entities": [...], "relations": [...], "anchors": [...], "pressures": [...] },
  "agents":  [{ "id": "a1", "name", "segment", "bio", "traits", "stance": -1..1, "influence": 0..1, "platform" }],
  "timelines": [{ "variant": "기본안", "rounds": [{ "round": 1, "event", "summary",
      "posts": [{ "agent_id", "action", "platform", "content", "reply_to_agent_id", "stance" }],
      "sentiment": { "overall": 0.12, "segments": [{ "name", "value" }] } }] }],
  "report": { "headline", "prediction", "confidence": 0..1, "confidence_rationale",
      "segments": [...], "turning_points": [...], "risks": [...], "opportunities": [...],
      "signals_to_watch": [...], "recommendations": [...], "variant_comparison": [...] },
  "error": null
}

후속 질문 · 에이전트 인터뷰

완료된 시뮬레이션 세계에 질문합니다. agent_id를 넣으면 해당 페르소나가 1인칭으로 답합니다.

curl -s -X POST $HOST/api/v1/simulations/sim_.../ask \
  -H "Authorization: Bearer $SHOAL_API_KEY" -H "Content-Type: application/json" \
  -d '{"question":"어떤 설명을 들었다면 해지하지 않았을까요?","agent_id":"a4"}'

설문 API

AI로 설문을 설계하고, 배포하고, 결과와 보고서를 받습니다. 응답 링크는 {host}/s/{token} 형식이며 응답자는 로그인 없이 답합니다. 문항 유형은 single · multi · scale · nps · text 입니다.

# AI로 설문 초안 만들기 (AI 사용 1회)
curl -s -X POST $HOST/api/v1/surveys   -H "Authorization: Bearer $SHOAL_API_KEY" -H "Content-Type: application/json"   -d '{"ai":{"goal":"학생 요금 인상 시 이탈 의향과 이유","audience":"대학생 이용자"}}'

# 배포 시작 → 응답 링크: $HOST/s/<token>
curl -s -X POST $HOST/api/v1/surveys/srv_.../status   -H "Authorization: Bearer $SHOAL_API_KEY" -H "Content-Type: application/json" -d '{"status":"open"}'

# 패널 발송 요청: 20~30대 서울·경기 여성 300명
curl -s -X POST $HOST/api/v1/surveys/srv_.../panel/campaigns \
  -H "Authorization: Bearer $SHOAL_API_KEY" -H "Content-Type: application/json" \
  -d '{"criteria":{"genders":["여성"],"ages":["20대","30대"],"regions":["서울","경기"]},"quota":300}'

# 패널 응답을 연령대로 나눠 본 결과 (segment=_gender | _age | _region)
curl -s "$HOST/api/v1/surveys/srv_.../results?segment=_age" -H "Authorization: Bearer $SHOAL_API_KEY"

# 연령대 문항으로 나눠 본 결과
curl -s "$HOST/api/v1/surveys/srv_.../results?segment=q1a2b3c" -H "Authorization: Bearer $SHOAL_API_KEY"

오류와 한도

오류는 {"error":{"code","message"}} 형태입니다.

  • 400 invalid_request — 본문 형식 오류
  • 401 invalid_api_key — 키가 없거나 폐기됨
  • 403 plan_limit — 요금제의 에이전트·라운드·비교안 한도 초과
  • 404 not_found — 다른 계정의 리소스이거나 없음
  • 409 not_ready — 완료 전 후속 질문
  • 429 quota_exceeded — 이번 달 한도 소진 (usage 포함)
  • 502 engine_error — 모델 호출 실패 (질문 한도는 차감되지 않음)
?