# 샌드박스

샌드박스는 실데이터 없는 연습용 환경입니다. 샌드박스 키로 인증하면 서비스 진입 직후 분기하여
결정적(항상 같은) 합성 응답을 반환합니다 — 실제 주체 조회 코드에는 도달하지 않습니다.
라이브와 같은 URL을 사용하며, 샌드박스 호출도 `environment='SANDBOX'`로 접근로그에 분리 기록됩니다.

## 고정 연습 주체 — 점수 조회

| pairwiseSub | 결과 | 설명 |
|---|---|---|
| `SANDBOX-TIER-A` | 820 · EXCELLENT | 750–850 구간 |
| `SANDBOX-TIER-B` | 700 · GOOD | 650–749 구간 |
| `SANDBOX-TIER-C` | 600 · FAIR | 550–649 구간 |
| `SANDBOX-TIER-D` | 500 · BELOW_AVERAGE | 450–549 구간 |
| `SANDBOX-TIER-E` | 400 · POOR | 0–449 구간 |
| `SANDBOX-NO-CONSENT` | 항상 거부 | 단건은 `SW2300`(NO_CONSENT)과 동일 형태, 배치는 `status="DENIED"` |
| `SANDBOX-EXPIRED` | 동의 만료 케이스 | 만료된 동의의 거부 동작 연습 |
| 그 밖의 값 | 300~850 결정적 점수 | `sha256(pairwiseSub)` 기반 — 같은 입력은 항상 같은 점수 |

사유코드는 실제 카탈로그(31종)의 고정 4건 세트가 영어/현지어 라벨과 함께 반환됩니다.

## 고정 케이스 — 증명서 검증 (verify)

`vcId` 접두사로 6가지 판정을 재현합니다.

| vcId 접두사 | reason | valid |
|---|---|---|
| `SANDBOX-VALID` | VALID | true |
| `SANDBOX-EXPIRED` | EXPIRED (90일 경과) | false |
| `SANDBOX-REVOKED` | REVOKED | false |
| `SANDBOX-TAMPERED` | COMMITMENT_MISMATCH | false |
| `SANDBOX-NOT-FOUND` | NOT_FOUND | false |
| `SANDBOX-TIER-MISMATCH` | TIER_MISMATCH | false |

## 예제

```bash
curl -s https://trendy.storydot.kr/superapp/api/fi/score/query \
  -H "X-Client-Id: YOUR_CLIENT_ID" \
  -H "X-API-Key: YOUR_SANDBOX_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "pairwiseSub": "SANDBOX-TIER-C", "purpose": "PREQUALIFY" }'
```

## 권장 테스트 체크리스트

- 등급 5구간(A~E) 응답 파싱과 자체 정책 매핑
- `SANDBOX-NO-CONSENT` 거부 처리(동의 필요 안내)
- `SANDBOX-EXPIRED` 재동의 유도 흐름
- verify 6판정 전부(특히 COMMITMENT_MISMATCH / EXPIRED 구분)
- 배치 OK/DENIED 혼합 처리
- 429 + `Retry-After` 재시도(60 req/min)
