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
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.
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.
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.
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.
Total actions
—
Allowed
—
Awaiting approval
—
Denied
—
Recent activity
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 });
}