POST /api/v1/bulk/wallet-screen
Triage a list. For each address this answers one question — does either dataset Scienter owns outright have a record of it — and nothing more.curl
Why this is a screen and not a score
It would be reasonable to expect/api/v1/bulk/wallet-score — a batched form
of the single-address score. That route makes four
upstream reads per address: the explorer summary, the engine’s scorecard, its
entity resolution and its flagged feed. Five hundred addresses is two thousand
upstream calls against a provider budget shared with the rest of the product,
inside a sixty-second ceiling. It would not finish.
So this route answers the narrower question and is named for it. Every field
is read from data compiled into the build — no network call is made, per
address or at all:
That is what makes five hundred of them cheap, and it is also exactly why it is
not a score. A screen says whether a dataset has heard of an address. A score
is a reconstruction. Use the screen to decide which addresses are worth
spending a single-address call on.
Per-address state
Each result carries its own state. They are not interchangeable.insufficient_evidence does not mean the address is clean. The
exchange-wallet table is partial by construction and the launch corpus covers
a measured window; an address absent from both has not been examined, which is
a different fact from having been examined and found unremarkable. The reason
field says so on every such result rather than leaving the caller to infer it.
Limits and cost
The per-request charge is deliberate: the route spends no upstream quota, so
charging per address would price a cost it does not incur. The expensive work
stays on the single-address routes.
A body over 500 addresses is a
400 naming the count it received. Malformed
JSON, a missing addresses array and an empty array are each a 400 with the
shape it expected.