Quickstart
Sandbox key to a first scored address in about ten minutes, with the fixtures you need to write a test suite that actually tests something.
1 · Get a sandbox key
Request access and you will have a sandbox key the same business day. Sandbox keys are prefixed ftai_test_, are never billed, and are rate-limited to 10 requests per second — enough for a test suite, not enough for a load test.
2 · Screen an address
The fixture below is a sandbox address that always returns an elevated score with mixer proximity, so you can assert on a known shape.
curl -s https://sandbox.fin-techai.com/v1/screen/address \
-H "Authorization: Bearer $FTAI_KEY" \
-H "Content-Type: application/json" \
-d '{
"chain": "ethereum",
"address": "0x0000000000000000000000000000000000000bad"
}'
→ 200 OK
{
"risk_score": 71,
"band": "elevated",
"reasons": [
{ "code": "MIXER_PROXIMITY", "weight": 34, "hops": 2,
"cluster": "tornado-router" },
{ "code": "HIGH_VELOCITY_FUNNEL", "weight": 22 },
{ "code": "NEW_ADDRESS", "weight": 15 }
],
"sanctions": { "match": false, "lists": ["OFAC","EU","UK","UN"] },
"as_of_block": 20914773,
"coverage": { "chains": ["ethereum"], "stale": [], "excluded": [] },
"evidence_url": "https://sandbox.fin-techai.com/v1/evidence/ev_3f…"
}
3 · Read it correctly
- Branch on
bandor on your own threshold overrisk_score— not on the presence of any single reason code. - Treat
sanctions.matchas a separate hard control. It is a legal fact, not a risk gradient, and it is deliberately not folded into the score. - Check
coverage. An emptystalearray is what you want; anything in it means part of the answer is behind head. - Log unknown reason codes and carry on. New codes are additive and must never break your integration.
4 · Sandbox fixtures
These addresses behave deterministically in the sandbox, so your tests do not depend on live chain state.
| Fixture | Returns |
|---|---|
| 0x…0bad | Score 71, elevated, mixer proximity at 2 hops |
| 0x…0sanc | Sanctions match on OFAC, score withheld |
| 0x…0new | Score 15, clear, thin history |
| 0x…0thin | CreditGraph thin_file: true |
| 0x…0stale | coverage.stale populated — exercise your staleness path |
| 0x…0slow | Responds in 6s — exercise your timeout path |
Full-length fixture addresses are in the sandbox welcome email; the abbreviations above are for reading.
5 · Subscribe to deterioration
A one-time score is a point-in-time answer. Register a webhook and you will be told when an address you have already cleared gets worse.
curl -s https://sandbox.fin-techai.com/v1/webhooks \
-H "Authorization: Bearer $FTAI_KEY" \
-H "Content-Type: application/json" \
-d '{ "url": "https://yourapp.example/hooks/ftai",
"events": ["screen.deteriorated", "screen.sanctions_match"] }'
Signature verification is not optional — see webhooks for the exact scheme.
6 · Move to production
- Swap the base URL to
api.fin-techai.comand the key toftai_live_. - Pin a scoring version if you have tuned thresholds:
X-FTAI-Scoring-Version: 4. - Handle 429 with
Retry-Afterand 5xx with jittered backoff. See errors and limits. - Set an alert on
coverage.stalebeing non-empty for more than a few minutes.