Skip to main content
Complete reference for every field the Red Team API accepts. For an orientation to how these fit together, start with the Payload Guide.
Every block below rejects unknown fields. A misspelled key returns 422 Unprocessable Entity — it is not silently ignored.

Top level

risk_categories and compliance_frameworks are mutually exclusive and one is required. Supplying both, or neither, is a validation error.

target

The system being tested.
system_description on the target is copied into context.system_description (clipped to 2000 characters) when you have not set one explicitly. Setting either is enough.

target.tools

Required when system_type is agent. Each entry describes one tool the agent can call.
See the Agent Testing Guide for how tools shape the tests generated.

target.metadata.relay

For targets that are not reachable from the public internet. Requires connect_via_relay: true, which stays at the root of target.
target.metadata accepts relay and nothing else. Any other key — metadata.tenant_id, metadata.aws_region, provider-specific metadata in general — is a 422. The Red Team target has no way to express provider metadata, so accepting it silently would let the run attack a differently-configured target and report success on it. Use the Archived Red Team API for a target that needs provider metadata. Unknown keys inside relay are a 422 too, and there is no relay endpoint, token, timeout or offline-grace setting to configure: the relay address is fixed infrastructure and the timeouts are server-side.
target.relay — the bare spelling, without metadata — is the older form and is still accepted, so nothing that works today breaks. Prefer target.metadata.relay: it is the spelling used everywhere else, including what a saved model stores as model_config.metadata.relay. Sending both is fine only if they carry the same block; if they disagree the request is a 422 naming the conflict.

Validation errors

An inline target is validated by the Red Team service, which answers 422 with a detail array. These are the exact strings: The Value error, prefix is part of the returned msg; the same sentence without it is repeated in ctx.error. The last element of loc names your offending key. A saved model is projected into a target by the gateway before the service sees it, so the equivalent failures there are 400s whose message names the model — for example Saved model 'internal-llm' sets connect_via_relay but carries no metadata.relay block naming the bridge to route through. The full list is in Red Teaming Through the Relay Bridge. For the end-to-end walkthrough — running the bridge, confirming it is connected, and the saved-model form — see Red Teaming Through the Relay Bridge. The endpoints themselves are Relay Bridge Connect and Relay Bridge Status.

Saved models

Rather than sending target inline, you can reference a model saved through the Models API using the saved-model endpoints, which take no target block at all:

risk_categories

An object keyed by category ID. Each value configures that category.
sub_categories entries are natural-language phrases, not the sub-category IDs used in reporting. They are intended to come from the profile returned by POST /rt/threat-modeling/categories, edited as you see fit. Omit the field to expand the category’s full taxonomy.
attack_config must be an object keyed by attack ID. A bare list — ["basic"] — is rejected. On /rt/threat-modeling and /rt/threat-modeling/categories each category must instead be an empty object {}; passing attack_config or sub_categories there is rejected.
Valid category and sub-category IDs: Risk Category Catalog. Valid attack IDs: Attack Methods Reference.

compliance_frameworks

An array of framework IDs. The platform expands each into the categories and sub-categories its controls map onto.

context

Grounds prompt generation in what your system actually is. Optional, but generated prompts are substantially more relevant with it — particularly for brand_reputation_trust and product_misuse_abuse.

policy_description or policy_rules

Two shapes for the same thing. Send one, not both. policy_description is free text — paste your rules as prose. Simplest, and what most callers want. policy_rules carries each rule as its own object, so a judge can cite the rule it fired on rather than a line out of a blob:
text is the only field that has to be there. risk_category is one of the eight risk category ids; severity is critical / high / medium / low; frameworks holds framework codes (hipaa, finra, gdpr, ccpa, owasp_llm_2025, nist_ai_rmf, eu_ai_act, iso_42001). Anything else you attach to a rule is carried through untouched. You rarely have to build this by hand. Name a saved Code of Conduct policy in the X-Enkrypt-Policy header and the gateway fills whichever shape fits: a Policy Wizard policy arrives as policy_rules, an older Policy Atomizer one as policy_description, and the other field is cleared. Anything you sent in context for that field is overwritten — the header means run against this saved policy.

generation_config

Controls how the prompt set is produced.
dataset_name is mutually exclusive with max_prompts and seed_prompts — you are either reusing a dataset or generating a new one.
include_standard_library is also accepted under its older name include_standard_data.

seed_prompts


comprehensiveness

How exhaustively to test. Affects the number of prompts, the attack budget, run duration and cost. Omit the field entirely to use the service default.

user_metadata

Arbitrary tracking fields of your own. Echoed back on the queued response, the status response, the results and — where the request was well-formed enough to read it — on error responses.
Lists do not add a nesting level; only nested objects count toward the depth limit.

Other endpoints

POST /rt/playground

A single ad-hoc probe. No categories, no generation.
run_id lets you subscribe to the log stream before submitting, since the Playground only names the job once the probe finishes. A UUID already in use returns 409 RUN_ID_CONFLICT — retry with a fresh one.

POST /rt/eval

Score prompt/response pairs you already have. Each sample:

POST /rt/threat-modeling/data

Phase 2 of the two-phase flow. Takes the phase-1 profile back.
At least one sub-category phrase must be supplied across all categories, or the request is rejected.