---
title: "Simulate policies (dry run)"
method: POST
path: "/api/v1/policies/simulate"
tags: ["Simulation"]
deprecated: true
---

# Simulate policies (dry run)

`POST /api/v1/policies/simulate`

## Request

- Base URL: `https://agent.getaxonflow.com`
- URL: `https://agent.getaxonflow.com/api/v1/policies/simulate`
- Auth: none declared. Required headers: `X-Tenant-ID`
- TypeScript: <https://skmtc.dev/getaxonflow/apis/axonflow-policy-management-api/docs/api/v1/policies/simulate/post.ts> (a function with typed inputs; its response is checked against the schema)

> **Deprecated.**

Run all active policies against the provided input as a dry run —
no audit writes and no policy actions are applied.

**Evaluation tier and above** — requires an Evaluation or Enterprise
license. Daily simulation quotas apply per tier (unlimited on
Enterprise); exceeding the quota returns 429.

## Headers

- `X-Tenant-ID` string, required

## Request body

- SimulatePoliciesRequest
  - `query` string, required: Input to evaluate against all active policies
  - `request_type` string: Type of request being simulated (defaults to "simulation")
  - `user` SimulationUserContext: User context for policy simulation and testing
    - `id` integer: Numeric user identifier
    - `email` string
    - `role` string
    - `region` string: User's region for geo-based routing policies
    - `permissions` string[]
    - `tenant_id` string
    - `org_id` string: Organization for multi-tenant isolation
  - `client` SimulationClientContext: Client context for policy simulation
    - `id` string
    - `name` string
    - `org_id` string: Organization ID for usage tracking
    - `tenant_id` string
  - `context` object: Additional context for evaluation

## Response `200`

Simulation results

- SimulatePoliciesResponse
  - `allowed` boolean: Whether the input would be allowed
  - `applied_policies` string[]: Names of policies that matched
  - `risk_score` number, float
  - `required_actions` string[]
  - `processing_time_ms` integer
  - `total_policies` integer: Number of active policies visible to the calling tenant — its own plus the shared global/default baseline. CHANGED: this previously counted every active policy in the deployment, across all tenants, which disclosed the deployment-wide policy count to every caller. Integrations that treated this as a deployment-level total will now see a smaller, tenant-scoped number.
  - `dry_run` boolean: Always true — no actions were applied
  - `simulated_at` string, date-time
  - `tier` string: License tier the simulation ran under
  - `daily_usage` SimulationDailyUsage: Simulation quota usage (omitted on unlimited tiers)
    - `used` integer
    - `limit` integer: Daily limit (-1 = unlimited)

## Other responses

- `400`: Invalid request body or missing query
- `401`: Missing tenant identification
- `403`: Requires an Evaluation or Enterprise license
- `429`: Daily simulation limit reached

---

[API](https://skmtc.dev/getaxonflow/apis/axonflow-policy-management-api.md) - [All operations](https://skmtc.dev/getaxonflow/apis/axonflow-policy-management-api/llms.txt) - [OpenAPI document](https://skmtc.dev/getaxonflow/apis/axonflow-policy-management-api/revisions/302fbde24320?raw)
