Skip to main content
The Red Team API was rebuilt. The current API lives on /rt/*. The previous API on /redteam/* is archived and still documented under Red Team (Legacy). New work should use /rt. This is not a version bump of the old paths. /rt is a new contract: new resources, new payload, new report shape. A body written for /redteam will 422 if you post it to /rt. This page is the map: what changed, what each old field and test became, and a side-by-side payload you can translate from.

Quickstart

Submit, track, and read a /rt/redteam run

Payload Guide

The four blocks of a current payload

API Reference

Full /rt schemas

What changed

The revamp also adds four entry points the previous API did not have:
  • Threat modeling — generate or analyse a dataset without attacking
  • Playground — probe one goal against a target
  • Eval — score prompt/response pairs you already have
  • Relay — reach an LLM inside a private network over one outbound connection

Endpoint map

New on /rt — the previous API had no equivalent: The Relay bridge is new too, but it is not under /rt — it kept its own prefix:

At the gateway

/rt is served through the same API gateway as /redteam, and a few things that look like backend behaviour are decided there. Auth is unchanged. The same API key, in the same apikey header, on every /rt endpoint. The one addition: GET /rt/runs/{run_id}/stream also accepts ?apikey= in the query string, because a browser EventSource cannot set request headers. Two legacy shapes are still accepted, so a partial port does not have to be all-or-nothing:
  • A top-level model object is read as target.
  • A target_model_configuration block is converted to target — but only when target is absent, and only if the model is expressible as one (see the warning below). An explicit target always wins.
Everything else legacy — test_name, dataset_configuration, redteam_test_configurations, endpoint_configuration — still 422s. X-Enkrypt-Policy still works. Name a saved Code of Conduct policy in the header and the gateway renders it into context for you — a Policy Wizard policy as the structured context.policy_rules, an older Policy Atomizer one as the free-text context.policy_description, with the other field cleared. A header policy outranks both the context you sent and the one a saved model was stored with. POST /rt/redteam probes your target before it accepts the run. An unreachable endpoint or a bad key comes back as a 400 on submit rather than a run that fails minutes later. The other endpoints are not probed — /rt/playground answers synchronously anyway, and /rt/model-health is the probe. Attacks that are not yet generally available are rejected at the gateway with a 400 naming the attack, before anything is charged. hades is the only one today.

What costs credits

Charged: POST /rt/redteam, /rt/eval, /rt/threat-modeling, /rt/threat-modeling/data, /rt/playground, and POST /rt/runs/{run_id}/resume (free by default — a resume re-drives work you already paid for). Everything else is free. Every GET — status, results, records, compliance, datasets, the SSE stream, /rt/health, /rt/status-check — plus the POSTs that are not work:
  • POST /rt/model-health — a single probe call
  • POST /rt/findings and POST /rt/risk-mitigation/* — reporting over a run you already paid for
  • POST /rt/threat-modeling/categories — analysis only; nothing is generated or stored
  • POST /rt/runs/{run_id}/signal/{name} — a control verb
The /rt/model/* saved-model variants are priced exactly like their inline twins: the gateway resolves the saved model before pricing, so an agent target earns the same multiplier either way. Rates are in Credits.

Payload map

Side by side

Current payload (`/rt`)

Field by field

target is a projection of the old model block, not a rename. Custom cURL, custom headers, JWT auth, auth_data provider blobs, and proxying are not expressible on /rt and are rejected up front with a 400 that names the field. Use the Relay bridge for a model that is not reachable from the public internet.

Test map

The previous API scoped by closed test IDs. /rt scopes by category; the old test is a sub-category (or a phrase you pass in sub_categories) inside that category. Agent-only tests from the previous API (governance_test, tool_misuse_test, tool_extraction_test, access_control_and_permissions_test, agent_behaviour_test, agent_output_quality_test, privacy_test, reliability_and_observability_test) have no 1:1 ID. Set target.system_type to agent, pass tools, and pick the categories above — security_fraud covers tool extraction and misuse, privacy_data_protection covers agent privacy, performance_reliability_quality covers output quality. See the Agent Testing Guide. Categories the previous API did not name as tests, now first-class:
  • legal_ip_liability — defamation, unlawful advice, TOS circumvention
  • product_misuse_abuse — policy circumvention, capability abuse, generic jailbreaks
  • brand_reputation_trust — brand voice, competitor disparagement, trust erosion
Or skip categories entirely and pass compliance_frameworks: owasp_llm_top10, eu_ai_act, nist_ai_rmf, mitre_atlas, iso_42001, aiuc_1.

Attack map

The previous API put each encoding and each language in its own method under static / dynamic. /rt has 21 attack IDs. Encodings and languages are options on encoding and lang. New attack IDs — the previous API had no keyword for these: graph, rt_agent, rt_agent_v2, derail_yourself, camo, fc, long_character, attack_in_the_middle, audio_goat.
attack_config must be an object, not a list. {"basic": {}} is valid; ["basic"] is a 422.

Behaviour changes worth a rewrite

  1. One scope kind. risk_categories and compliance_frameworks are mutually exclusive. The previous API let you list many tests in one object; /rt still lets you list many categories, but not categories and frameworks together.
  2. Attacks live on the category. There is no run-level attack list on /rt/redteam. Playground is the exception — attack_config is top-level there, next to goal.
  3. sub_categories are phrases, not IDs. Take them from /rt/threat-modeling/categories (or type them). The IDs in the Risk Category Catalog are how results are reported.
  4. Unknown keys 422. A leftover test_name, dataset_configuration, or endpoint_configuration on a /rt body is rejected, not ignored. The two exceptions the gateway converts for you are model and target_model_configuration — see At the gateway.
  5. Reads are free, and so are several POSTs. Findings, risk mitigation, model health, and threat-modeling categories cost nothing. See What costs credits.
  6. Saved-model targets the previous API accepted may 400 on /rt. If the saved model used custom cURL, JWT, or auth_data, recreate it as a standard target or put it behind Relay.