Security and governance
Sensitive work waits for approval — and every step is recorded.
Identity, policy, approval and audit sit on every request. Organisations stay isolated; credentials stay sealed.
Example: a read-only Splunk search runs directly, a phone call to a country outside the allowlist is denied, and a ServiceNow incident update waits at the approval gate until Sara A. approves it, then runs and is recorded in the audit trail.
Controls
Controls in the execution path.
Follow one tool call from request to record. Six controls run at fixed points before, during and after it, so the rules are enforced by Botify rather than left to convention.
Before the call
Identity and roles
The request brings the user’s identity and roles into the run, and Botify checks them before any tool may run.
Tool policy
Rules allow, deny or require approval for each tool, per setup and per organisation. A read-only Splunk search can run directly while a call to a country off the allowlist is denied.
Organisation scope
The call can reach only its own organisation’s data, connections and credentials. The database client refuses any query that does not filter by organisation.
During the call
Approval gate
A sensitive tool, such as a ServiceNow incident update or an outbound phone call, holds the run until an authorised person approves or rejects that exact action.
Credentials opened at call time
The connector’s sealed credential is opened only at the moment the tool runs, and only for its own organisation and credential. The API never returns it.
After the call
Audit trail
The request, every tool call, the approval with the name of its approver, and the result are written to one trail your team can query later.
Organisation isolation
A query without an organisation never reaches the data.
Data, connections and credentials belong to exactly one organisation. The database client itself refuses any query on organisation-scoped data that does not filter by organisation, nested writes included.
Scoped query
Passedcredential.findFirst({ where: { tenantId, id } })Unscoped query
Refused: no organisation scopecredential.findMany({ where: { provider } })
Organisation guard
Built into the database client. Checks reads, writes and nested writes.
ForbiddenError: tenant-scoped query is missing a tenantId filter
Organisation A
In scope- Data
- Connections
- Credentials
Organisation B
Out of reach- Data
- Connections
- Credentials
Secrets
Credentials sealed, bound to their owner, and rotated.
Connector credentials are sealed with AES-256-GCM before they are stored. The envelope is bound to its organisation and credential, the API never returns it, and root keys rotate in the background.
Credential
••••••••••The secret itself, such as an OAuth refresh token
Active key
v2The current root key and its version
Authenticated data
tenant:credential:typeBinds the envelope to its organisation and credential
AES-256-GCM
A fresh 96-bit IV for every seal
Stored envelope
Sealed- Key version
- v2
- IV
- r4Qm9sTzL1wKc0Ve
- Ciphertext
- hT7wq0Zk3NbX…9LxA
- Auth tag
- fM2c8RvY0pQeJ5sd==
Copied to another organisation or credential, it fails to open.
Key rotation
A background loop re-encrypts every envelope still on an older key to the active one. The key version travels with each envelope, so rotation needs no migration.
Gmail
v1Dynatrace
v2Splunk
v1ServiceNow
v1
Never returned by the API
Provider, scopes and key version are readable. The secret is not: it is opened only at the moment a connector needs it.
Phone guardrails
Outbound calls within hard limits.
Botify can place calls over your own number, but only inside the rules your organisation sets, and never without approval.
Country allowlist per organisation
Calls go only to the countries your organisation allows. An empty allowlist means no outbound calls at all.
Example+966+962Premium-rate numbers blocked
Premium-rate and known fraud prefixes are always blocked, whatever the allowlist says.
+1900+979+49900Hourly limits and cooldowns
Each organisation has an hourly call limit, and a number that was just called waits out a cooldown.
Every call is approved
The call tool is set to always wait for an authorised person before Botify dials.
phone.callAlways needs approval
Walk your security team through it.
Bring your security and compliance reviewers. We trace a real tool call through identity, policy, approval and audit, and answer their questions on isolation and secrets.