Optional integration keys
Scani’s integrations are independently unlockable. A missing
key causes the corresponding tRPC route to return
PRECONDITION_FAILED at call-time; nothing else breaks. You can
enable integrations one at a time as you obtain keys.
All of these are read by the data-provider,
not by the api or worker. In Tier 1, that’s the data-provider on
your compose network; in Tier 2/3, the hosted data-provider has its
own copies and the user-side .env doesn’t need them.
Pricing
Section titled “Pricing”Note: fiat / FX pricing uses Frankfurter, which requires no key.
AI / parsing
Section titled “AI / parsing”On-chain
Section titled “On-chain”Bitcoin, Tron, TON, and ENS resolution use public RPCs without
key requirements. The provider implementations live in
packages/clients/providers/src/providers/.
Exchange OAuth
Section titled “Exchange OAuth”Most exchanges use API-key + secret credentials the user pastes into the app. Binance is the exception — it uses OAuth, which requires operator-side configuration:
Without these set, the Binance integration is unavailable; every other exchange continues to work via the standard API-key flow.
Sentry (error tracking)
Section titled “Sentry (error tracking)”Payloads are passed through packages/business/shared/src/utils/sentry-scrubber.ts
before send, which strips credentials / tokens / known PII.
Cloud-management (Tier 2/3 hosted data-provider only)
Section titled “Cloud-management (Tier 2/3 hosted data-provider only)”Ignored in Tier 1 single-tenant mode.
How to tell what’s enabled
Section titled “How to tell what’s enabled”Each tRPC route that depends on a provider returns
PRECONDITION_FAILED with a message naming the missing env var:
{ "error": { "code": "PRECONDITION_FAILED", "message": "OPENAI_API_KEY is not configured" } }The SPA renders these as a soft empty-state in the UI rather than a crash.