Security context

Deployment configuration and runtime authorization facts are evaluated separately from message content.

Hosted profile

FieldMeaning
tenant_modeWhether tenant relationships are fixed or derived per request.
rolesStable actor IDs and security labels.
actionsOperations and their read, write, egress, or administrative consequence.
toolsAllowed tool IDs and security classes.
data_classesPublic, internal, confidential, or restricted resource classes.
destinationsInternal, approved external, or untrusted destinations.
authorization_rulesAllow and deny relationships across the catalogs. Deny rules take precedence.

Runtime facts

FieldSource
actor_role_idProfile role ID for the authenticated actor.
actor_tenant_idTenant ID from your identity/session layer.
resource_tenant_idTenant that owns the resource being accessed.
action_idProfile action ID for the operation being attempted.
tool_idProfile tool ID for the runtime or proposed tool.
authorization_decisionOptional result from your authorization service.
data_class_idProfile data-class ID for the resource.
destination_idProfile destination ID for the result or transfer.

Trust boundary

A deployment-scoped API key selects the hosted profile. The gateway resolves catalog IDs, derives tenant relationships, applies profile rules, and marks the result as gateway-derived. Message text can influence the threat score, but it cannot rewrite the profile or claim gateway provenance. Missing or contradictory facts increase Tier-3 routing instead of becoming an automatic allow.

TypeScript

Context-aware conversation
const conversation = axiom.conversation();

const facts = {
  actorRoleId: "support_agent",
  actorTenantId: signedInUser.tenantId,
  resourceTenantId: account.tenantId,
  actionId: "read_account",
  toolId: "support_assistant",
  dataClassId: "customer_confidential",
  destinationId: "current_session",
};

const input = await conversation.scanInput(userPrompt, {
  runtimeFacts: facts,
});
if (input.action === "block") throw new Error("Blocked by Axiom");

const modelOutput = await callYourModel(userPrompt);
const output = await conversation.scanOutput(modelOutput, {
  runtimeFacts: facts,
});
if (output.action === "block") throw new Error("Blocked by Axiom");