Secrets and credentials: where API keys live and how to rotate them
Arino One stores every API key and credential in its own database, in a table called \app_secrets\, and resolves each one by checking that database first before ever falling back to a server environment variable. You manage them from Settings → API keys & secrets — a page restricted to administrators, where every change additionally requires re-entering your password.
What lives here
The credentials screen covers every external integration the app can use beyond the Infobip connection wizard itself:
| Credential | Powers |
|---|---|
| Infobip API key, base URL, sender override | Message sending and receiving via the Infobip relay |
| ElevenLabs API key | WhatsApp voice message generation and voicemail transcription |
| Anthropic (Claude) API key | AI features when using your own key instead of the managed option |
| OpenAI API key | AI features when using your own key instead of the managed option |
| Cloudflare TURN Key ID and API token | Reliable calling on restrictive networks for WebRTC calling |
| Stripe secret key and webhook signing secret | Payment links on orders and reliable webhook verification |
Some of these are optional — a smaller instance running only WhatsApp messaging on the managed AI option may never need to touch the ElevenLabs, Anthropic, OpenAI or Stripe fields at all.
Where a value actually resolves from
Every credential lookup in the app follows the same order:
- Database first — check
app_secretsfor a row with that key. If it has a non-empty value, use it. - Environment fallback — if the database has no value, fall back to the corresponding environment variable on the deployment.
- Bring-your-own fallback (Infobip only) — if the managed
INFOBIP_API_KEYresolves to nothing, the resolver checks the separate bring-your-own key used by remix/self-serve instances before giving up.
The practical implication: a value you save through Settings always wins over whatever was set at the infrastructure level, which prevents a stale platform default from silently overriding a key you've deliberately configured. It also means that if a message-sending feature suddenly breaks after a database change, checking whether an app_secrets row was accidentally cleared should be your first troubleshooting step, ahead of checking environment configuration.
Who can see and change credentials
Access is deliberately narrow:
- The API keys & secrets page is gated to administrators only; non-admin roles cannot open it at all.
- Every set or clear action requires confirming your own admin password in a re-authentication dialog before it takes effect — there is no bulk edit or unattended change path.
- Saved values are never redisplayed. The interface shows a masked state once a key is saved; there is no "reveal" action, so retrieving a previously saved value is not possible from the UI — if you've lost the original key, you must generate a new one at the provider and save that instead.
- Where an integration supports it (currently ElevenLabs), a connection test runs against the live value so you can confirm it works before depending on it, without needing to see the key itself.
Rotating a credential safely
Because the database value always takes priority once saved, rotation is safe to do without downtime:
- Generate the replacement credential in the provider's own dashboard (Infobip, Anthropic, OpenAI, Stripe, or Cloudflare).
- Paste it into the corresponding field on Settings → API keys & secrets and confirm with your password.
- Run the built-in test if one exists, or trigger the dependent feature (send a test message, generate a voice note, place a test call) to confirm the new value works.
- Only once the new value is confirmed working, revoke the old credential at the provider. Revoking first, before confirming the new one works, risks an outage in whatever the credential powers.
Rotate immediately, out of cycle, if a key may have been exposed — pasted into a support ticket, visible in a screen share, or held by someone who has left the organisation. Routine rotation on a fixed schedule (many teams use 90 days for anything touching billing) is good hygiene even without a known exposure.
What Arino never sees
Arino Link's outbound connection — covered in full in Arino Link and the Command Inbox — never transmits credentials of any kind, in any of its three traffic tiers. Heartbeats report only coarse booleans such as whether Infobip is connected, never the key itself. This is enforced by an automated test in the codebase, not merely stated as policy, so a credential leaving your instance toward Arino is not a configuration risk you need to manage — it structurally cannot happen through that channel.
Handling credentials safely day to day
- Never paste a live credential into a chat window, support ticket, or screenshot — redact it first if you need to show context.
- Treat any credential that has been shared outside the settings page as compromised and rotate it, even if the sharing was accidental or internal.
- Keep the list of who holds admin access current — see the user roles reference — since admin access is what gates who can view the settings page and change these values.
- For anything billing-adjacent, such as the Stripe keys, check audit and evidence for how changes here are logged for review.
Steps at a glance
- Open API keys & secretsGo to Settings → API keys & secrets. This page is only visible to administrators.
- Locate the credentialFind the key you need to change — Infobip API key, ElevenLabs, Anthropic, OpenAI, Cloudflare TURN, or Stripe — each with a short label and help text.
- Enter the new valuePaste the replacement key into the field. Existing values are masked and never redisplayed in full, so you cannot recover a lost key from this screen — only overwrite or clear it.
- Re-authenticate to confirmConfirm the change with your admin password in the re-authentication dialog. This step is required for every set or clear action, with no exceptions.
- Test the connection where availableFor credentials with a built-in test, such as ElevenLabs, run it immediately after saving to confirm the new key is valid before relying on it.
- Retire the old key at the providerOnce the new key is confirmed working, revoke the old one in the provider's own dashboard (Infobip, Anthropic, OpenAI, Stripe, Cloudflare) so a leaked or former key can no longer be used.
Frequently asked
Where does Arino One actually store credentials?
In the `app_secrets` table inside your Supabase-backed database, keyed by name — for example INFOBIP_API_KEY, ANTHROPIC_API_KEY, STRIPE_SECRET_KEY. This database value takes precedence over any matching environment variable, which exists only as a fallback for deployments that set secrets at the platform level instead.
What's the difference between a database secret and an environment variable?
Both are resolved by the same lookup, database first: if a value exists in `app_secrets`, it's used; only if it's missing or empty does the resolver fall back to `process.env`. This means a value saved through Settings → API keys & secrets will always override a stale or default environment value, which is deliberate — it stops a platform-level secret from silently overriding what you configured through the UI.
Who can view or change secrets?
Only administrators can open the API keys & secrets page at all, and every save or clear additionally requires re-entering your admin password in a confirmation dialog. Existing key values are never redisplayed in full once saved — the field shows masked placeholder state, not the actual key — so viewing a value that's already saved is not possible through the UI.
What happens if I clear a credential by mistake?
The dependent feature stops working immediately — for example, clearing the Infobip API key stops all outbound and inbound message flow through the relay. There is no soft-delete or undo; you must re-enter the correct value from your provider's dashboard. Test features (like ElevenLabs' connection test) exist to help you confirm a value works before relying on it in production.
Does Arino ever see my credentials?
No. Arino Link and the wider control-plane connection never transmit API keys, tokens, passwords or other credentials in any of its three traffic tiers — this is an explicit, tested rule, not just a policy statement. Credentials stay in your instance's own database.
How often should I rotate credentials?
Rotate immediately if a key may have been exposed (shared in a support ticket, committed to a public repository, or held by someone who has left the organisation), and on a routine schedule otherwise — many teams use 90 days for anything tied to billing, such as the Stripe secret key. Rotation is safe to do live: set the new value, confirm it works, then revoke the old one at the provider.
Apply this to your own deployment
This guide describes decisions we make on live instances. Tell us your channels, systems and region and we will map it to an architecture outline, a provisioning plan and an indicative commercial model — usually within one business day.