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}/review | AI 문항 검수 |
| POST | /api/v1/surveys/{id}/ask | AI 분석가에게 질문 {question} |
| POST / GET | /api/v1/surveys/{id}/report | AI 보고서 생성 · 조회 |
| 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} | 패널 요청 취소 |
시뮬레이션 생성
| 필드 | 타입 | 설명 |
|---|---|---|
| question | string (5–2000자, 필수) | 예측하고 싶은 상황이나 결정 |
| context | string (최대 12,000자) | 보고서·기획안·기사 등 시드 자료 |
| variants | [{label, text}] (최대 6) | 같은 청중에게 비교할 안. 2개 이상이면 A/B 비교 보고서 |
| agents | integer 4–100 | 페르소나 수. 기본 12 (요금제 한도 내) |
| rounds | integer 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— 모델 호출 실패 (질문 한도는 차감되지 않음)