Skip to content

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 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.

  1. 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.

  2. 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.

  3. 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.

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

    Passed
    credential.findFirst({ where: { tenantId, id } })
  • Unscoped query

    Refused: no organisation scope
    credential.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

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

    v2

    The current root key and its version

  • Authenticated data

    tenant:credential:type

    Binds 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.

On older keys: 3

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

    v1

  • Dynatrace

    v2

  • Splunk

    v1

  • ServiceNow

    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.

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+962
  • Premium-rate numbers blocked

    Premium-rate and known fraud prefixes are always blocked, whatever the allowlist says.

    +1900+979+49900
  • Hourly 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.