API Reference · 영어 퀴즈

퀴즈 답안 제출

문항의 답을 제출하고 서버 채점 결과를 받습니다. 문항은 순서대로만 풀 수 있고, 틀리면 같은 문항을 다시 제출합니다. 마지막 문항을 맞히면 서버가 슬롯 완료 포인트와 월 출석 보너스를 판정해 결과를 함께 반환합니다. claim: deferred 면 지급은 사용자가 보상을 받을 때(수령 API)로 미룹니다.

POST/api/v1/contents/{content_id}/quiz/slots/{slot_key}/answers

요청 파라미터

  • content_id (path, uuid, required) — 퀴즈 콘텐츠 ID.
  • slot_key (path, string, required) — 시작한 슬롯 키.
  • item_id (body, uuid, required) — 답할 문항.
  • answer_index (body, int, required) — 선택한 보기의 answers 배열 인덱스(0부터). 보기 순서는 서버가 고정하므로 받은 순서 그대로 표시하세요.
  • claim (body, string, optional) — "deferred" 면 지연 지급. 이 요청이 슬롯을 완료하면 판정(검증·한도·이벤트 기록)까지만 하고, 지급(포스트백/내부 적립)은 세트 보상 받기·출석 보너스 받기 때 합니다. 생략하면 완료 시점에 바로 지급합니다. 다른 값은 400.

요청예시

shell
curl -X POST -H "Authorization: Bearer sess_prod_0193a1b2-3c4d-7e6f-8890-abcdef012345" \
     -H "Content-Type: application/json" \
     -d '{"item_id":"01a0f522-0000-7000-8000-000000000004","answer_index":0}' \
     "https://added.blomics.net/api/v1/contents/0193a1b2-3c4d-5e6f-7890-abcdef012345/quiz/slots/20261001-2/answers"

응답 필드

  • correct (boolean) — 정답 여부. 오답이어도 정답은 알려주지 않습니다.
  • already_solved (boolean) — 이미 맞힌 문항의 재전송. 상태만 돌려주며 중복 지급되지 않습니다.
  • solved_count (int 0~3) — 지금까지 맞힌 문항 수.
  • slot_completed (boolean) — 슬롯 완료 여부.
  • reward (object, nullable) — 슬롯 완료 보상 결과(완료 시). summary{ matched, granted, rejected, skipped }와 legs(캠페인별 지급 결과: outcome granted/rejected, point, reject_reason). 형식은 이벤트 저장 응답과 같습니다. 지연 지급이면 지급을 미룬 승인 leg 에 payout: "pending"(이때 postback_id·delivery 없음)이 붙고, 받을 것이 있으면 reward.claim_status: "unclaimed" 가 붙습니다.
  • attendance (object, nullable) — 슬롯이 완료된 응답에만(마지막 답 재전송 포함). 오늘의 퀴즈 조회의 attendance(단계별 outcome·point·granted_at·reward 포함)에 더해:
    • granted_now (int[]) — 이 요청이 판정한 보너스 단계(기준 일수). 재전송이면 빈 배열.
    • rewards (array) — granted_now 단계별 지급 결과. days, granted_at, outcome(granted / rejected / error), point(지급된 포인트 합, 거절·오류면 0), summary·legs(reward 와 같은 형식). 지연 지급이면 claim_status: "unclaimed" 가 붙습니다(tiers[] 도 같음).

응답예시 — 오답

json
{ "correct": false, "already_solved": false, "solved_count": 2, "slot_completed": false, "reward": null, "attendance": null }

응답예시 — 마지막 문항 정답(슬롯 완료)

json
{
  "correct": true,
  "already_solved": false,
  "solved_count": 3,
  "slot_completed": true,
  "reward": {
    "summary": { "matched": 1, "granted": 1, "rejected": 0, "skipped": 0 },
    "legs": [
      { "campaign_id": "0193…", "campaign_type": "always_on", "parent_campaign_id": null,
        "event_id": "0193…", "event_type": "quiz_slot_completed",
        "outcome": "granted", "event_log_id": "0193…", "point": 10, "postback_id": "0193…" }
    ]
  },
  "attendance": {
    "month": "2026-10", "attended_days": 20,
    "tiers": [{ "days": 20, "granted": true, "granted_at": "2026-10-20T03:12:09.000Z",
                "outcome": "granted", "point": 5, "reward": { "summary": { … }, "legs": [ … ] } }],
    "granted_now": [20],
    "rewards": [{
      "days": 20, "granted_at": "2026-10-20T03:12:09.000Z", "outcome": "granted", "point": 5,
      "summary": { "matched": 1, "granted": 1, "rejected": 0, "skipped": 0 },
      "legs": [{ "campaign_id": "0193…", "event_type": "quiz_attendance_bonus",
                 "outcome": "granted", "event_log_id": "0193…", "point": 5, "postback_id": "0193…" }]
    }]
  }
}
출석 보너스 안내 문구 분기
안내 금액은 rewards[].point(또는 tiers[].point)를 쓰세요. 캠페인이 여러 개면 합산된 값이라 legs[].point 를 직접 더할 필요가 없습니다. outcome 이 granted 면 지급 안내, rejected 면 지급 한도 등으로 지급되지 않음(사유는 legs[].reject_reason), error 면 처리 지연 안내로 분기합니다. 출석 보너스 이벤트가 캠페인에 아직 없으면 단계가 판정되지 않고(granted_now 에 없음) 등록 후 다음 슬롯 완료 때 지급됩니다.
지연 지급(claim: deferred)
완료 응답의 금액(point)으로 지급 안내를 보여 주고, 사용자가 확인하면 세트 보상 받기(출석 보너스가 함께 판정됐으면 출석 보너스 받기)를 호출하세요. 그때 매체 포스트백이 발송됩니다. 한도·기간 판정은 완료 시점에 끝나므로 받을 때 지급 조건으로 거절되지 않습니다. 받지 않고 떠난 보상은 기한 없이 오늘의 퀴즈 조회의 unclaimed 에 남습니다.
재시도·중복 제출
네트워크 오류로 마지막 답 응답을 못 받았다면 같은 요청을 다시 보내세요. 이미 완료된 슬롯이면 already_solved: true 와 함께 처음 지급 결과(reward)와 그달 출석 결과(attendance.tiers, 이때 granted_now·rewards 는 빈 배열)를 돌려줍니다. 같은 슬롯 보상은 세션을 바꿔도 사용자당 1회만 지급됩니다.

에러처리

  • 400 INVALID_PARAM — slot_key·item_id 형식 오류, answer_index 범위 밖, claim 이 "deferred" 가 아님.
  • 401 UNAUTHORIZED / SESSION_EXPIRED — 세션 인증 실패·만료.
  • 404 NOT_FOUND — 퀴즈 콘텐츠 아님, 이 슬롯에 없는 문항.
  • 499 QUIZ_SLOT_NOT_STARTED — start 없이 제출.
  • 499 QUIZ_ITEM_OUT_OF_ORDER — 앞 문항을 맞히기 전 다음 문항 제출. data.expected_position 포함.
  • 499 QUIZ_SLOT_NOT_OPEN — 완료 마감(answer_deadline) 경과.
  • 500 INTERNAL_ERROR — 서버 오류.