Built for agentic infrastructure

Let agents act.
Keep control.

Set action limits, control delegation, require approval when needed, and verify what happened.

Every amount shown here is synthetic sandbox money. No real funds move in this product today.

Trust Rail

  1. Refund Agent
  2. Authenticated
  3. €350 refund requested
  4. Policy checked
  5. Human approval
  6. Executed
  7. Signed receipt ✓

Bounded delegation

Owners and admins issue root grants; agents can delegate narrower child grants to other agents. Every child is a strict subset of its parent's actions, amounts, and expiry — never wider.

Deterministic policy enforcement

Versioned, typed policy bundles — not LLM judgment — decide ALLOW, DENY, or REQUIRE_APPROVAL. The gateway holds the only downstream credential, so an agent cannot bypass it.

Signed, verifiable receipts

Every decision and execution is recorded as an Ed25519-signed JWS receipt. Anyone holding a receipt can verify signature validity, issuer trust, and recorded outcome independently.

What the team sees

A real, working preview of the Overview page layout. Numbers shown here are illustrative placeholders — the running product always renders live counts from your own organization, and reports zero for a new one.

trustrail.app/dashboard

Total actions

—

Allowed

—

Awaiting approval

—

Denied

—

Recent activity

refund.create · order_demo_101sign in to see real records
subscription.invite_user · account_demo_leasign in to see real records
subscription.grant_credit · account_demo_leasign in to see real records

Integrate once

The TypeScript SDK is under active development; this is the intended usage against the same POST /v1/actions contract the dashboard itself calls.

import { TrustRail } from "@trustrail/sdk";

const client = new TrustRail({
  baseUrl: process.env.TRUSTRAIL_API_URL,
  apiKey: process.env.TRUSTRAIL_AGENT_KEY, // scoped to one agent + environment
});

// The agent asks for a refund. TrustRail resolves the grant chain,
// evaluates the published policy, reserves budget, and only then
// dispatches to the merchant connector.
const action = await client.actions.execute({
  grantId: "grant_refund_child",
  connectorId: "merchant_sandbox",
  action: "refund.create",
  resourceId: "order_demo_101",
  arguments: { amount_minor: 8000, currency: "EUR", reason: "Customer return" },
  idempotencyKey: "demo-refund-001",
});

if (action.decision === "DENY") {
  // Blocked before the merchant ever saw the request.
} else if (action.executionState === "awaiting_approval") {
  // A human reviewer must approve this exact request within its TTL.
  const result = await client.actions.wait(action.id, { timeoutMs: 30_000 });
}