/v1/scammer-checksCheck an identifier for scam indications
Consumes credit on every call, **including misses** (anti-enumeration). A miss is always billed at the `minimal` rate even when `detail=full` was requested. Exactly one of `input` (structured, normalized server-side) or `query` (pre-normalized `searchQueryIndex`, used by the SDKs) must be present.
Parameters
| Nama | Tipe | Keterangan |
|---|---|---|
Idempotency-Key | string (header) | Dedup key for retries: same key + same payload returns the stored result without charging again; same key + different payload answers 409. Hashed **exactly as received** — no trimming — so the value a partner records is the value that reconciles. The SDKs send one on every call. |
Request body
| Nama | Tipe | Keterangan |
|---|---|---|
creditSource | USER | PARTNER | AUTO | Who pays. USER: the consenting user's subscription credits (Stage 1). PARTNER: the org's prepaid balance [Stage 2]. AUTO: user first, fall back to partner [Stage 2]. |
detail | minimal | full | `minimal` omits topChronologies/comments and is always English (no translation cost). `full` requires the contractual `features.fullDetail` rider. |
locale | string | BCP-47; only honored for detail=full (translation of tags/chronologies). |
input | oneOf | Structured identifier, normalized server-side with the same helpers the report pipeline uses. DOMAIN is deliberately not a supported type: the backend has no domain index, so such a key could never hit while the miss would still bill. |
query | string | Escape hatch: a pre-normalized searchQueryIndex as built by the SDKs (e.g. `PHONE_+62812...`). Validated against a per-type whitelist; prefer `input`. |
Katalog error
- 400
`invalid_request`, `unsupported_input_type`, or `unsupported_credit_source` (PARTNER/AUTO before Stage 2).
- 401
`expired_token` (refresh and retry), `invalid_token` / `grant_revoked` (terminal: discard the grant, re-consent), `invalid_api_key`. Only the two terminal codes end a session.
- 402
`insufficient_user_credits`, `insufficient_partner_balance`, or `insufficient_credits`. Identical for hit and miss — the error never leaks whether the identifier exists.
- 403
`missing_scope`, `detail_not_permitted` (full without the contractual rider), `credential_mismatch`, `partner_suspended`.
- 409
`idempotency_conflict` — same key, different payload.
- 429
`rate_limited`; honor the `Retry-After` header.