Skip to content

Policy Engine API

The Policy Engine API provides programmatic control over Arbitex’s request enforcement layer. You can create and manage policy packs, define rules within those packs, configure the evaluation chain, and simulate policy decisions against synthetic requests — all without touching the admin UI.


The Policy Engine has three primary concepts:

Policy packs are named containers for rules. A pack groups related rules together — for example, a “Trading Desk Controls” pack or a compliance bundle for SOC 2. Each pack has a type: packs you create directly are custom packs; packs provided by Arbitex for compliance frameworks are bundle packs. Bundle packs are read-only; their contents cannot be modified.

Rules are the enforcement units inside a pack. Each rule has a set of conditions (user groups, entity types, content patterns, provider/model targets, etc.) and a single action to take when those conditions match. Rules within a pack are evaluated in ascending sequence order — lower sequence numbers evaluate first. For the complete list of conditions and actions, see Policy Rule Reference.

Policy chains define which packs are active for your organization and in what order. The org chain is evaluated for every request. Adding a pack to the chain activates it; removing a pack from the chain suspends it without deleting it. The chain also specifies the combining algorithm that governs how a terminal match in one pack interacts with remaining packs.

The combining_algorithm field on the chain controls what happens when a terminal rule fires:

first_applicable — The first terminal match wins and stops all further evaluation. Pack order and rule sequence numbers are the primary controls. This behaves like a stateful firewall: the most-specific rule you place earliest takes precedence. It is the recommended algorithm for organizations that want an allow-with-exceptions pattern — place narrow ALLOW rules before broad BLOCK rules and the ALLOW wins.

deny_overrides — If any rule anywhere in the chain produces a BLOCK or CANCEL, that result wins over any ALLOW, regardless of where the rules appear in the sequence. Evaluation continues past an ALLOW to check whether any remaining rule in any remaining pack produces a denial. Use this when your compliance posture requires that no allowlist rule can ever bypass a prohibition — for example, when a compliance bundle contains mandatory blocks that cannot be overridden by custom packs.


All endpoints in this reference require an admin-scoped API key. Pass the key as a Bearer token in the Authorization header:

Authorization: Bearer arb_live_your-api-key-here

Requests made with a non-admin key receive 403 Forbidden. For API key management, see API Keys.


Base URL: https://api.arbitex.ai/api/admin

MethodPathDescription
GET/policy-packs/List all packs with rule counts
POST/policy-packs/Create a custom pack
GET/policy-packs/{id}Get pack detail including rules
PUT/policy-packs/{id}Update pack metadata
DELETE/policy-packs/{id}Delete a custom pack

GET /api/admin/policy-packs/

Returns all policy packs visible to your organization: custom packs you have created and any compliance bundle packs that are active. Each item includes a rule_count computed field; use GET /policy-packs/{id} to retrieve the full rule list.

Response 200 OK — array of PolicyPackWithRuleCount

FieldTypeDescription
idUUIDPack identifier
tenant_idUUID | nullOwning tenant. null for system bundle packs.
namestringDisplay name
descriptionstringFree-text description
pack_typestring"custom" or a compliance bundle type identifier
compliance_standardstring | nullAssociated compliance standard (e.g. "soc2", "hipaa"). null for custom packs.
versionstringPack version string
is_activeboolWhether the pack is currently active in an org chain
rule_countintNumber of rules in the pack
created_atdatetimeISO 8601 UTC
updated_atdatetimeISO 8601 UTC
Terminal window
curl https://api.arbitex.ai/api/admin/policy-packs/ \
-H "Authorization: Bearer arb_live_your-api-key-here"
[
{
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"tenant_id": "b7e3c012-91d0-4a2e-89b5-f2abc8d1e3f4",
"name": "Trading Desk Controls",
"description": "Blocks MNPI keywords and restricts OpenAI access for the trading group.",
"pack_type": "custom",
"compliance_standard": null,
"version": "1.0.0",
"is_active": true,
"rule_count": 4,
"created_at": "2026-02-15T10:00:00Z",
"updated_at": "2026-03-01T14:22:00Z"
},
{
"id": "9c1d2e3f-4a5b-6c7d-8e9f-0a1b2c3d4e5f",
"tenant_id": null,
"name": "SOC 2 Baseline",
"description": "System bundle: SOC 2 Type II baseline policy rules.",
"pack_type": "soc2_baseline",
"compliance_standard": "soc2",
"version": "2.1.0",
"is_active": true,
"rule_count": 12,
"created_at": "2026-01-01T00:00:00Z",
"updated_at": "2026-01-01T00:00:00Z"
}
]

POST /api/admin/policy-packs/

Creates a new custom pack. Newly created packs have zero rules and are not added to any chain automatically. Add the pack to your org chain with PUT /api/admin/policy-chains/org to activate it.

Request body

FieldTypeRequiredDescription
namestringYesDisplay name for the pack
descriptionstringNoFree-text description
Terminal window
curl -X POST https://api.arbitex.ai/api/admin/policy-packs/ \
-H "Authorization: Bearer arb_live_your-api-key-here" \
-H "Content-Type: application/json" \
-d '{
"name": "Trading Desk Controls",
"description": "Blocks MNPI keywords and restricts OpenAI access for the trading group."
}'

Response 201 CreatedPolicyPackWithRuleCount

{
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"tenant_id": "b7e3c012-91d0-4a2e-89b5-f2abc8d1e3f4",
"name": "Trading Desk Controls",
"description": "Blocks MNPI keywords and restricts OpenAI access for the trading group.",
"pack_type": "custom",
"compliance_standard": null,
"version": "1.0.0",
"is_active": false,
"rule_count": 0,
"created_at": "2026-03-09T14:00:00Z",
"updated_at": "2026-03-09T14:00:00Z"
}

GET /api/admin/policy-packs/{id}

Returns a single pack including its complete rule list. Use this endpoint to inspect all rules in order before making changes.

Path parameters

ParameterTypeDescription
idUUIDPack identifier
Terminal window
curl https://api.arbitex.ai/api/admin/policy-packs/3fa85f64-5717-4562-b3fc-2c963f66afa6 \
-H "Authorization: Bearer arb_live_your-api-key-here"

Response 200 OKPolicyPackDetail (extends PolicyPackWithRuleCount)

The response includes all fields from PolicyPackWithRuleCount plus a rules array. Each rule in the array is a PolicyRuleResponse object. See Policy Rule Reference for the full conditions and action field schemas.

{
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"tenant_id": "b7e3c012-91d0-4a2e-89b5-f2abc8d1e3f4",
"name": "Trading Desk Controls",
"description": "Blocks MNPI keywords and restricts OpenAI access for the trading group.",
"pack_type": "custom",
"compliance_standard": null,
"version": "1.0.0",
"is_active": true,
"rule_count": 2,
"created_at": "2026-02-15T10:00:00Z",
"updated_at": "2026-03-01T14:22:00Z",
"rules": [
{
"id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"pack_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"name": "Block MNPI keyword mentions",
"sequence": 10,
"applies_to": "input",
"conditions": {
"content_regex": "\\bMNPI\\b"
},
"action": {
"type": "BLOCK",
"message": "Requests referencing MNPI cannot be processed through this gateway."
},
"is_active": true,
"created_at": "2026-02-15T10:05:00Z",
"updated_at": "2026-02-15T10:05:00Z"
}
]
}

PUT /api/admin/policy-packs/{id}

Updates the name or description of a pack. This endpoint cannot be used to change pack_type, compliance_standard, or rule contents. Bundle packs can have their metadata updated by admins; bundle rule contents remain read-only.

Path parameters

ParameterTypeDescription
idUUIDPack identifier

Request body

FieldTypeRequiredDescription
namestringNoNew display name
descriptionstringNoNew description
Terminal window
curl -X PUT https://api.arbitex.ai/api/admin/policy-packs/3fa85f64-5717-4562-b3fc-2c963f66afa6 \
-H "Authorization: Bearer arb_live_your-api-key-here" \
-H "Content-Type: application/json" \
-d '{
"name": "Trading Desk Controls v2",
"description": "Updated to include crypto-related keyword blocks."
}'

Response 200 OKPolicyPackWithRuleCount with updated fields.


DELETE /api/admin/policy-packs/{id}

Permanently deletes a custom pack and all its rules. This operation cannot be undone. Bundle packs cannot be deleted — they are managed by Arbitex and shared across all tenants. Attempting to delete a bundle pack returns 403 Forbidden.

A pack that is currently in an org chain must be removed from the chain before it can be deleted. Attempting to delete a pack that is still in an active chain returns 409 Conflict.

Path parameters

ParameterTypeDescription
idUUIDPack identifier (custom packs only)
Terminal window
curl -X DELETE \
https://api.arbitex.ai/api/admin/policy-packs/3fa85f64-5717-4562-b3fc-2c963f66afa6 \
-H "Authorization: Bearer arb_live_your-api-key-here"

Response 204 No Content on success.

StatusDescription
204Pack deleted
403Cannot delete a bundle pack
404Pack not found
409Pack is currently in an active chain

Rules live inside packs and are evaluated in ascending sequence order. Rules with lower sequence numbers evaluate first within a pack.

MethodPathDescription
GET/policy-packs/{id}/rules/List rules for a pack
POST/policy-packs/{id}/rules/Add a rule to a pack
PUT/policy-packs/{id}/rules/{rule_id}Update a rule
DELETE/policy-packs/{id}/rules/{rule_id}Delete a rule
POST/policy-packs/{id}/rules/reorderReorder rules by sequence number

GET /api/admin/policy-packs/{id}/rules/

Returns all rules in a pack ordered by sequence number. This is also available as the rules field in the response from GET /policy-packs/{id}.

Path parameters

ParameterTypeDescription
idUUIDPack identifier
Terminal window
curl https://api.arbitex.ai/api/admin/policy-packs/3fa85f64-5717-4562-b3fc-2c963f66afa6/rules/ \
-H "Authorization: Bearer arb_live_your-api-key-here"

Response 200 OK — array of PolicyRuleResponse, ordered by sequence ascending.


POST /api/admin/policy-packs/{id}/rules/

Adds a new rule to a pack. The rule takes effect immediately for new requests once the pack is in an active chain.

Path parameters

ParameterTypeDescription
idUUIDPack identifier

Request bodyPolicyRuleCreate

FieldTypeRequiredDescription
namestringYesDisplay name for the rule
sequenceinteger (≥ 0)YesEvaluation order within the pack. Lower numbers evaluate first. Use gaps (10, 20, 30) to leave room for insertions.
applies_tostringNoWhich traffic direction to scan. "input" (default), "output", or "both".
conditionsobjectNoConditions object. See Policy Rule Reference for all condition fields. Omit or set to {} for a catch-all rule.
actionobjectYesAction object with a type field plus any action-specific fields.
is_activeboolNoWhether the rule is active. Defaults to true.

Action types: BLOCK, ALLOW, CANCEL, REDACT, ROUTE_TO, PROMPT. See Policy Rule Reference — Actions for the full action field schema.

Terminal window
curl -X POST \
https://api.arbitex.ai/api/admin/policy-packs/3fa85f64-5717-4562-b3fc-2c963f66afa6/rules/ \
-H "Authorization: Bearer arb_live_your-api-key-here" \
-H "Content-Type: application/json" \
-d '{
"name": "Block MNPI keyword mentions",
"sequence": 10,
"applies_to": "input",
"conditions": {
"content_regex": "\\bMNPI\\b"
},
"action": {
"type": "BLOCK",
"message": "Requests referencing MNPI cannot be processed through this gateway."
}
}'

Response 201 CreatedPolicyRuleResponse

{
"id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"pack_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"name": "Block MNPI keyword mentions",
"sequence": 10,
"applies_to": "input",
"conditions": {
"content_regex": "\\bMNPI\\b"
},
"action": {
"type": "BLOCK",
"message": "Requests referencing MNPI cannot be processed through this gateway."
},
"is_active": true,
"created_at": "2026-03-09T15:00:00Z",
"updated_at": "2026-03-09T15:00:00Z"
}

PUT /api/admin/policy-packs/{id}/rules/{rule_id}

Updates an existing rule. All fields in the request body replace the current values — supply all fields you want to retain, not just the changed ones. The rule takes effect for new requests immediately.

Path parameters

ParameterTypeDescription
idUUIDPack identifier
rule_idUUIDRule identifier

Request body — same fields as PolicyRuleCreate. All fields are optional in an update; omitted fields retain their current values.

Terminal window
curl -X PUT \
"https://api.arbitex.ai/api/admin/policy-packs/3fa85f64-5717-4562-b3fc-2c963f66afa6/rules/a1b2c3d4-e5f6-7890-abcd-ef1234567890" \
-H "Authorization: Bearer arb_live_your-api-key-here" \
-H "Content-Type: application/json" \
-d '{
"name": "Block MNPI keyword mentions",
"sequence": 10,
"applies_to": "both",
"conditions": {
"content_regex": "\\bMNPI\\b"
},
"action": {
"type": "BLOCK",
"message": "Requests referencing MNPI cannot be processed through this gateway."
}
}'

Response 200 OKPolicyRuleResponse with updated fields.


DELETE /api/admin/policy-packs/{id}/rules/{rule_id}

Permanently removes a rule from a pack. The deletion takes effect for new requests immediately. This operation cannot be undone.

Path parameters

ParameterTypeDescription
idUUIDPack identifier
rule_idUUIDRule identifier
Terminal window
curl -X DELETE \
"https://api.arbitex.ai/api/admin/policy-packs/3fa85f64-5717-4562-b3fc-2c963f66afa6/rules/a1b2c3d4-e5f6-7890-abcd-ef1234567890" \
-H "Authorization: Bearer arb_live_your-api-key-here"

Response 204 No Content on success.


POST /api/admin/policy-packs/{id}/rules/reorder

Updates the sequence numbers for multiple rules in a single atomic operation. Use this to restructure evaluation order without individually updating each rule. Sequence numbers do not need to be contiguous — using gaps such as 10, 20, 30 is recommended.

Path parameters

ParameterTypeDescription
idUUIDPack identifier

Request bodyReorderRequest

FieldTypeRequiredDescription
entriesarrayYesList of {id: UUID, sequence: integer (≥ 0)} objects. Each entry maps a rule ID to its new sequence number.

All rules referenced in entries must belong to the specified pack. Rules not listed in entries retain their current sequence numbers.

Terminal window
curl -X POST \
"https://api.arbitex.ai/api/admin/policy-packs/3fa85f64-5717-4562-b3fc-2c963f66afa6/rules/reorder" \
-H "Authorization: Bearer arb_live_your-api-key-here" \
-H "Content-Type: application/json" \
-d '{
"entries": [
{ "id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890", "sequence": 10 },
{ "id": "b2c3d4e5-f6a7-8901-bcde-f12345678901", "sequence": 20 },
{ "id": "c3d4e5f6-a7b8-9012-cdef-123456789012", "sequence": 30 }
]
}'

Response 200 OK — updated array of PolicyRuleResponse for all rules in the pack, ordered by the new sequence numbers.


The policy chain defines the active set of packs and their evaluation order for your organization. At this time, Arbitex supports one chain per organization (the org chain).

MethodPathDescription
GET/policy-chains/List all chains
PUT/policy-chains/orgUpdate the org chain
POST/policy-chains/simulateSimulate policy evaluation

GET /api/admin/policy-chains/

Returns all policy chains for your organization. Currently returns one item: the org chain.

Terminal window
curl https://api.arbitex.ai/api/admin/policy-chains/ \
-H "Authorization: Bearer arb_live_your-api-key-here"

Response 200 OK — array of PolicyChainResponse

PolicyChainResponse fields:

FieldTypeDescription
idUUIDChain identifier
scopestringChain scope. Currently always "org".
combining_algorithmstring"first_applicable" or "deny_overrides"
packsarrayOrdered list of PolicyChainEntryResponse objects
created_atdatetimeISO 8601 UTC
updated_atdatetimeISO 8601 UTC

PolicyChainEntryResponse fields (elements of packs):

FieldTypeDescription
idUUIDChain entry identifier (not the pack ID)
pack_idUUIDReferenced pack identifier
pack_namestringPack display name at time of last chain update
pack_typestring"custom" or bundle type
rule_countintCurrent rule count in the pack
sequenceintEvaluation order within the chain. Lower numbers evaluate first.
is_activeboolWhether this pack is currently active in the chain
[
{
"id": "d4e5f6a7-b8c9-0123-defa-234567890123",
"scope": "org",
"combining_algorithm": "first_applicable",
"packs": [
{
"id": "e5f6a7b8-c9d0-1234-efab-345678901234",
"pack_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"pack_name": "Trading Desk Controls",
"pack_type": "custom",
"rule_count": 4,
"sequence": 10,
"is_active": true
},
{
"id": "f6a7b8c9-d0e1-2345-fabc-456789012345",
"pack_id": "9c1d2e3f-4a5b-6c7d-8e9f-0a1b2c3d4e5f",
"pack_name": "SOC 2 Baseline",
"pack_type": "soc2_baseline",
"rule_count": 12,
"sequence": 20,
"is_active": true
}
],
"created_at": "2026-01-15T09:00:00Z",
"updated_at": "2026-03-01T14:30:00Z"
}
]

PUT /api/admin/policy-chains/org

Replaces the org chain configuration in a single atomic operation. This endpoint controls:

  1. Which packs are in the chain — only packs referenced in packs will be active after the update.
  2. Evaluation order — packs are evaluated in ascending sequence order.
  3. The combining algorithm"first_applicable" or "deny_overrides".

The update is atomic. The previous chain configuration is replaced entirely. Any pack not included in the packs array is removed from the chain (but not deleted).

Request bodyPolicyChainUpdateRequest

FieldTypeRequiredDescription
packsarrayYesOrdered list of {id: UUID, sequence: integer} entries. id is the pack UUID (not the chain entry UUID).
combining_algorithmstringNo"first_applicable" (default) or "deny_overrides". See Overview for semantics.

Pack ordering guidance:

A typical org chain follows this pattern from lowest to highest sequence number:

  1. Custom allowlist / exception rules (sequence 10–30) — narrow ALLOW rules that carve exceptions for specific groups or models. Must be early so they can fire before BLOCK rules when using first_applicable.
  2. Compliance bundle packs (sequence 40–60) — Arbitex-provided packs for active frameworks (SOC 2, HIPAA, etc.).
  3. Custom restriction rules (sequence 70–90) — custom BLOCK, REDACT, and PROMPT rules for your organization’s policies.
  4. Catch-all block (sequence 999, optional) — a pack with a single no-conditions BLOCK rule for a deny-all posture.
Terminal window
curl -X PUT https://api.arbitex.ai/api/admin/policy-chains/org \
-H "Authorization: Bearer arb_live_your-api-key-here" \
-H "Content-Type: application/json" \
-d '{
"packs": [
{ "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", "sequence": 10 },
{ "id": "9c1d2e3f-4a5b-6c7d-8e9f-0a1b2c3d4e5f", "sequence": 20 }
],
"combining_algorithm": "first_applicable"
}'

Response 200 OKPolicyChainResponse reflecting the updated chain.

{
"id": "d4e5f6a7-b8c9-0123-defa-234567890123",
"scope": "org",
"combining_algorithm": "first_applicable",
"packs": [
{
"id": "e5f6a7b8-c9d0-1234-efab-345678901234",
"pack_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"pack_name": "Trading Desk Controls",
"pack_type": "custom",
"rule_count": 4,
"sequence": 10,
"is_active": true
},
{
"id": "f6a7b8c9-d0e1-2345-fabc-456789012345",
"pack_id": "9c1d2e3f-4a5b-6c7d-8e9f-0a1b2c3d4e5f",
"pack_name": "SOC 2 Baseline",
"pack_type": "soc2_baseline",
"rule_count": 12,
"sequence": 20,
"is_active": true
}
],
"created_at": "2026-01-15T09:00:00Z",
"updated_at": "2026-03-09T15:00:00Z"
}

POST /api/admin/policy-chains/simulate

Runs a synthetic request through the full policy evaluation pipeline without forwarding to any AI provider. Use this to verify rule behavior before placing a pack in the active chain, or to debug why a live request was handled in an unexpected way.

The simulator evaluates the same rule evaluation logic as the live gateway. It does not create any audit log entries — simulation results are ephemeral.

Request bodyPolicySimulateRequest

FieldTypeRequiredDescription
promptstring (min length 1)YesThe prompt text to evaluate against the policy chain. Include content that is expected to trigger the rules you are testing.
providerstringYesProvider identifier for the simulated request (e.g., "openai", "anthropic").
modelstringYesModel identifier for the simulated request (e.g., "gpt-4o", "claude-sonnet-4-20250514").
user_groupsstring[]YesList of group names to simulate for the user. These override any real user’s group membership — use this to test rules without needing a real user in the target groups.
Terminal window
curl -X POST https://api.arbitex.ai/api/admin/policy-chains/simulate \
-H "Authorization: Bearer arb_live_your-api-key-here" \
-H "Content-Type: application/json" \
-d '{
"prompt": "Can you help me analyze the MNPI disclosed in the board meeting?",
"provider": "openai",
"model": "gpt-4o",
"user_groups": ["trading-desk", "employees"]
}'

Response 200 OKPolicySimulateResponse

FieldTypeDescription
matchedbooltrue if any rule in the chain produced a terminal match
matched_pack_idUUID | nullPack containing the matched rule. null if no match.
matched_pack_namestring | nullName of the matched pack. null if no match.
matched_rule_idUUID | nullID of the matched rule. null if no match.
matched_rule_namestring | nullName of the matched rule. null if no match.
matched_sequenceinteger | nullSequence number of the matched rule. null if no match.
actionobject | nullThe full action object from the matched rule. null if no match.
match_reasonstring | nullHuman-readable description of why the rule matched. null if no match.
evaluation_tracearrayOrdered list of PolicySimRuleTrace objects — one per rule evaluated, in the order the engine evaluated them.

PolicySimRuleTrace fields:

FieldTypeDescription
pack_idUUIDPack containing this rule
pack_namestringPack name
rule_idUUIDRule identifier
rule_namestringRule name
sequenceintRule sequence number
matchedboolWhether this rule matched the simulated request
match_reasonstring | nullWhy this specific rule matched or did not match. null if the rule did not match.

The evaluation_trace array is the primary debugging tool. Each entry corresponds to one rule that the engine considered, in the order of evaluation. The trace stops at the terminal match — no entries appear after the first matching terminal rule.

A rule entry with "matched": false means the engine evaluated the rule and the conditions were not satisfied. The match_reason is null for non-matching rules.

A rule entry with "matched": true is the rule that fired. The match_reason describes which conditions were met.

If matched is false on the top-level response (no terminal match anywhere in the chain), the trace shows all rules that were evaluated and their outcomes. This is useful for diagnosing why an expected BLOCK rule did not fire — look for the rule in the trace and read its match_reason.

Request:

{
"prompt": "Can you help me analyze the MNPI disclosed in the board meeting?",
"provider": "openai",
"model": "gpt-4o",
"user_groups": ["trading-desk", "employees"]
}

Response:

{
"matched": true,
"matched_pack_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"matched_pack_name": "Trading Desk Controls",
"matched_rule_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"matched_rule_name": "Block MNPI keyword mentions",
"matched_sequence": 10,
"action": {
"type": "BLOCK",
"message": "Requests referencing MNPI cannot be processed through this gateway."
},
"match_reason": "content_regex matched pattern '\\bMNPI\\b' in prompt",
"evaluation_trace": [
{
"pack_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"pack_name": "Trading Desk Controls",
"rule_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"rule_name": "Block MNPI keyword mentions",
"sequence": 10,
"matched": true,
"match_reason": "content_regex matched pattern '\\bMNPI\\b' in prompt"
}
]
}

The trace shows a single evaluated rule. The engine stopped at sequence 10 because it produced a terminal BLOCK match under first_applicable. The SOC 2 Baseline pack (sequence 20) was not reached.

If no rule matches, the top-level matched is false and action is null. The request would proceed to the AI provider on a live request.

{
"matched": false,
"matched_pack_id": null,
"matched_pack_name": null,
"matched_rule_id": null,
"matched_rule_name": null,
"matched_sequence": null,
"action": null,
"match_reason": null,
"evaluation_trace": [
{
"pack_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"pack_name": "Trading Desk Controls",
"rule_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"rule_name": "Block MNPI keyword mentions",
"sequence": 10,
"matched": false,
"match_reason": null
},
{
"pack_id": "9c1d2e3f-4a5b-6c7d-8e9f-0a1b2c3d4e5f",
"pack_name": "SOC 2 Baseline",
"rule_id": "b2c3d4e5-f6a7-8901-bcde-f12345678901",
"rule_name": "Block PII exfiltration — SSN",
"sequence": 10,
"matched": false,
"match_reason": null
}
]
}

GET /api/admin/policy-packs/bundles/

Returns the list of system bundle packs available to your organization. Bundle packs are pre-configured policy packs maintained by Arbitex for specific compliance frameworks (SOC 2, HIPAA, GDPR, and others). Their rules are managed by Arbitex and updated when framework requirements change.

Bundle packs are read-only. You cannot create, modify, or delete bundle packs or their rules. To activate a bundle pack for your organization, add it to your org chain using PUT /api/admin/policy-chains/org.

Terminal window
curl https://api.arbitex.ai/api/admin/policy-packs/bundles/ \
-H "Authorization: Bearer arb_live_your-api-key-here"

Response 200 OK — array of PolicyPackWithRuleCount where pack_type is a bundle type identifier and tenant_id is null.

[
{
"id": "9c1d2e3f-4a5b-6c7d-8e9f-0a1b2c3d4e5f",
"tenant_id": null,
"name": "SOC 2 Baseline",
"description": "Baseline policy rules for SOC 2 Type II compliance. Covers data handling, access restrictions, and audit trail requirements.",
"pack_type": "soc2_baseline",
"compliance_standard": "soc2",
"version": "2.1.0",
"is_active": false,
"rule_count": 12,
"created_at": "2026-01-01T00:00:00Z",
"updated_at": "2026-01-01T00:00:00Z"
},
{
"id": "0a1b2c3d-4e5f-6789-0abc-def123456789",
"tenant_id": null,
"name": "HIPAA Safeguards",
"description": "Policy rules implementing HIPAA minimum necessary and PHI handling requirements.",
"pack_type": "hipaa_safeguards",
"compliance_standard": "hipaa",
"version": "1.3.0",
"is_active": false,
"rule_count": 8,
"created_at": "2026-01-01T00:00:00Z",
"updated_at": "2026-02-15T00:00:00Z"
}
]

The is_active field reflects whether this bundle is currently in your org chain. To see the full rule contents of a bundle pack, use GET /api/admin/policy-packs/{id} with the bundle pack’s id.


StatusDescription
400 Bad RequestMissing required field, invalid field value, or validation failure (e.g., sequence is negative, regex is unsafe)
403 ForbiddenAPI key does not have admin permissions, or the operation is not permitted on the target resource (e.g., attempting to delete a bundle pack)
404 Not FoundPack or rule not found
409 ConflictOperation conflicts with current state (e.g., deleting a pack that is in an active chain)
422 Unprocessable EntityRequest body schema is valid but contains logically invalid values