> For the complete documentation index, see [llms.txt](https://docs.radar.citadel-ai.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.radar.citadel-ai.com/en/developer-guide/api-endpoints.md).

# API endpoints

{% hint style="info" %}
If there are APIs you would like to use other than the currently published APIs, please contact <support@citadel-ai.com>.
{% endhint %}

In Citadel Radar, you can use API keys to call APIs from applications and monitor user inputs and AI outputs. Target requests can be blocked as needed.

## Run Input Filtering

> Run input-target blocking metrics, return pass/fail, then enqueue input monitoring.

```json
{"openapi":"3.1.0","info":{"title":"Citadel Radar Node Public API","version":"0.1.0"},"security":[{"APIKeyHeader":[]}],"components":{"securitySchemes":{"APIKeyHeader":{"type":"apiKey","in":"header","name":"X-API-Key"}},"schemas":{"InputBlockingRequestBody":{"properties":{"prompt":{"type":"string","minLength":1,"title":"Prompt"},"metadata":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Metadata","description":"Optional arbitrary key-value metadata from the caller (e.g. client IP)."}},"type":"object","required":["prompt"],"title":"InputBlockingRequestBody"},"InputBlockingResponse":{"properties":{"block":{"type":"boolean","title":"Block"},"failed_evaluation_metric_ids":{"items":{"type":"integer"},"type":"array","title":"Failed Evaluation Metric Ids","description":"Core evaluation_metric_id values that did not overall_pass."},"request_id":{"type":"string","format":"uuid","title":"Request Id"}},"type":"object","required":["block","failed_evaluation_metric_ids","request_id"],"title":"InputBlockingResponse","description":"Successful (HTTP 200) response.\n\nNo evaluator failed — ``block`` and ``failed_evaluation_metric_ids`` are\ndecided entirely by metric outcomes."},"InputBlockingPolicyErrorResponse":{"properties":{"block":{"type":"boolean","title":"Block"},"failed_evaluation_metric_ids":{"items":{"type":"integer"},"type":"array","title":"Failed Evaluation Metric Ids","description":"Core evaluation_metric_id values that did not overall_pass."},"request_id":{"type":"string","format":"uuid","title":"Request Id"},"evaluator_errors":{"items":{"$ref":"#/components/schemas/PolicyEvaluatorErrorItem"},"type":"array","title":"Evaluator Errors","description":"Per-metric evaluator failures. At least one entry has ``code='content_policy'`` or ``code='cyber_policy'``."}},"type":"object","required":["block","failed_evaluation_metric_ids","request_id","evaluator_errors"],"title":"InputBlockingPolicyErrorResponse","description":"HTTP 400 response: at least one evaluator hit a content / cyber policy."},"PolicyEvaluatorErrorItem":{"properties":{"evaluation_metric_id":{"type":"integer","title":"Evaluation Metric Id","description":"Core evaluation_metric_id that the evaluator failed to evaluate."},"code":{"type":"string","enum":["content_policy","cyber_policy","other"],"title":"Code","description":"Classified evaluator failure code (no rate_limit on 400)."},"message":{"type":"string","title":"Message","description":"Human-readable failure reason (provider message when available)."}},"type":"object","required":["evaluation_metric_id","code","message"],"title":"PolicyEvaluatorErrorItem","description":"Evaluator failure item for 400 responses (rate_limit excluded).\n\nA response is classified 400 only when no metric hit ``rate_limit``; the\nsurviving codes are policy-related or generic."},"InputBlockingEvaluatorErrorResponse":{"properties":{"block":{"type":"boolean","title":"Block"},"failed_evaluation_metric_ids":{"items":{"type":"integer"},"type":"array","title":"Failed Evaluation Metric Ids","description":"Core evaluation_metric_id values that did not overall_pass."},"request_id":{"type":"string","format":"uuid","title":"Request Id"},"evaluator_errors":{"items":{"$ref":"#/components/schemas/GenericEvaluatorErrorItem"},"type":"array","title":"Evaluator Errors","description":"Per-metric evaluator failures. Every entry has ``code='other'``."}},"type":"object","required":["block","failed_evaluation_metric_ids","request_id","evaluator_errors"],"title":"InputBlockingEvaluatorErrorResponse","description":"HTTP 422 response: evaluator failure that did not match a specific code."},"GenericEvaluatorErrorItem":{"properties":{"evaluation_metric_id":{"type":"integer","title":"Evaluation Metric Id","description":"Core evaluation_metric_id that the evaluator failed to evaluate."},"code":{"type":"string","const":"other","title":"Code","description":"Always ``other`` on 422 responses."},"message":{"type":"string","title":"Message","description":"Human-readable failure reason (provider message when available)."}},"type":"object","required":["evaluation_metric_id","code","message"],"title":"GenericEvaluatorErrorItem","description":"Evaluator failure item for 422 responses (only ``other`` codes).\n\nA response is classified 422 only when every errored metric has the\n``other`` classification (no rate-limit, no content/cyber-policy hit)."},"InputBlockingRateLimitResponse":{"properties":{"block":{"type":"boolean","title":"Block"},"failed_evaluation_metric_ids":{"items":{"type":"integer"},"type":"array","title":"Failed Evaluation Metric Ids","description":"Core evaluation_metric_id values that did not overall_pass."},"request_id":{"type":"string","format":"uuid","title":"Request Id"},"evaluator_errors":{"items":{"$ref":"#/components/schemas/EvaluatorErrorItem"},"type":"array","title":"Evaluator Errors","description":"Per-metric evaluator failures. At least one entry has ``code='rate_limit'``; other entries may carry any code."}},"type":"object","required":["block","failed_evaluation_metric_ids","request_id","evaluator_errors"],"title":"InputBlockingRateLimitResponse","description":"HTTP 429 response: at least one evaluator was rate-limited."},"EvaluatorErrorItem":{"properties":{"evaluation_metric_id":{"type":"integer","title":"Evaluation Metric Id","description":"Core evaluation_metric_id that the evaluator failed to evaluate."},"code":{"type":"string","enum":["rate_limit","content_policy","cyber_policy","other"],"title":"Code","description":"Classified evaluator failure code. One of: rate_limit, content_policy, cyber_policy, other."},"message":{"type":"string","title":"Message","description":"Human-readable failure reason (provider message when available)."}},"type":"object","required":["evaluation_metric_id","code","message"],"title":"EvaluatorErrorItem","description":"Evaluator failure item (any classification code, used in 429 responses)."}}},"paths":{"/apps/{app_id}/input_filtering":{"post":{"tags":["app-filtering"],"summary":"Run Input Filtering","description":"Run input-target blocking metrics, return pass/fail, then enqueue input monitoring.","operationId":"run_input_filtering_apps__app_id__input_filtering_post","parameters":[{"name":"app_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"App Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InputBlockingRequestBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InputBlockingResponse"}}}},"400":{"description":"Content / cyber security policy blocked the evaluator request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InputBlockingPolicyErrorResponse"}}}},"422":{"description":"The evaluator request failed for a non-policy / non-rate-limit reason (connection error, auth error, parse error, misconfigured metric, ...).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InputBlockingEvaluatorErrorResponse"}}}},"429":{"description":"The evaluator provider rate-limited the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InputBlockingRateLimitResponse"}}}}}}}}}
```

## Run Output Filtering

> Run output-target blocking metrics, return pass/fail, then enqueue output monitoring.

```json
{"openapi":"3.1.0","info":{"title":"Citadel Radar Node Public API","version":"0.1.0"},"security":[{"APIKeyHeader":[]}],"components":{"securitySchemes":{"APIKeyHeader":{"type":"apiKey","in":"header","name":"X-API-Key"}},"schemas":{"OutputBlockingRequestBody":{"properties":{"prompt":{"type":"string","minLength":1,"title":"Prompt"},"response":{"type":"string","title":"Response","description":"Assistant / model output to evaluate (may be empty if generation failed).","default":""},"metadata":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Metadata","description":"Optional arbitrary key-value metadata from the caller (e.g. client IP)."}},"type":"object","required":["prompt"],"title":"OutputBlockingRequestBody"},"OutputBlockingResponse":{"properties":{"block":{"type":"boolean","title":"Block"},"failed_evaluation_metric_ids":{"items":{"type":"integer"},"type":"array","title":"Failed Evaluation Metric Ids","description":"Core evaluation_metric_id values that did not overall_pass."},"request_id":{"type":"string","format":"uuid","title":"Request Id"}},"type":"object","required":["block","failed_evaluation_metric_ids","request_id"],"title":"OutputBlockingResponse","description":"Successful (HTTP 200) response.\n\nNo evaluator failed — ``block`` and ``failed_evaluation_metric_ids`` are\ndecided entirely by metric outcomes."},"OutputBlockingPolicyErrorResponse":{"properties":{"block":{"type":"boolean","title":"Block"},"failed_evaluation_metric_ids":{"items":{"type":"integer"},"type":"array","title":"Failed Evaluation Metric Ids","description":"Core evaluation_metric_id values that did not overall_pass."},"request_id":{"type":"string","format":"uuid","title":"Request Id"},"evaluator_errors":{"items":{"$ref":"#/components/schemas/PolicyEvaluatorErrorItem"},"type":"array","title":"Evaluator Errors","description":"Per-metric evaluator failures. At least one entry has ``code='content_policy'`` or ``code='cyber_policy'``."}},"type":"object","required":["block","failed_evaluation_metric_ids","request_id","evaluator_errors"],"title":"OutputBlockingPolicyErrorResponse","description":"HTTP 400 response: at least one evaluator hit a content / cyber policy."},"PolicyEvaluatorErrorItem":{"properties":{"evaluation_metric_id":{"type":"integer","title":"Evaluation Metric Id","description":"Core evaluation_metric_id that the evaluator failed to evaluate."},"code":{"type":"string","enum":["content_policy","cyber_policy","other"],"title":"Code","description":"Classified evaluator failure code (no rate_limit on 400)."},"message":{"type":"string","title":"Message","description":"Human-readable failure reason (provider message when available)."}},"type":"object","required":["evaluation_metric_id","code","message"],"title":"PolicyEvaluatorErrorItem","description":"Evaluator failure item for 400 responses (rate_limit excluded).\n\nA response is classified 400 only when no metric hit ``rate_limit``; the\nsurviving codes are policy-related or generic."},"OutputBlockingEvaluatorErrorResponse":{"properties":{"block":{"type":"boolean","title":"Block"},"failed_evaluation_metric_ids":{"items":{"type":"integer"},"type":"array","title":"Failed Evaluation Metric Ids","description":"Core evaluation_metric_id values that did not overall_pass."},"request_id":{"type":"string","format":"uuid","title":"Request Id"},"evaluator_errors":{"items":{"$ref":"#/components/schemas/GenericEvaluatorErrorItem"},"type":"array","title":"Evaluator Errors","description":"Per-metric evaluator failures. Every entry has ``code='other'``."}},"type":"object","required":["block","failed_evaluation_metric_ids","request_id","evaluator_errors"],"title":"OutputBlockingEvaluatorErrorResponse","description":"HTTP 422 response: evaluator failure that did not match a specific code."},"GenericEvaluatorErrorItem":{"properties":{"evaluation_metric_id":{"type":"integer","title":"Evaluation Metric Id","description":"Core evaluation_metric_id that the evaluator failed to evaluate."},"code":{"type":"string","const":"other","title":"Code","description":"Always ``other`` on 422 responses."},"message":{"type":"string","title":"Message","description":"Human-readable failure reason (provider message when available)."}},"type":"object","required":["evaluation_metric_id","code","message"],"title":"GenericEvaluatorErrorItem","description":"Evaluator failure item for 422 responses (only ``other`` codes).\n\nA response is classified 422 only when every errored metric has the\n``other`` classification (no rate-limit, no content/cyber-policy hit)."},"OutputBlockingRateLimitResponse":{"properties":{"block":{"type":"boolean","title":"Block"},"failed_evaluation_metric_ids":{"items":{"type":"integer"},"type":"array","title":"Failed Evaluation Metric Ids","description":"Core evaluation_metric_id values that did not overall_pass."},"request_id":{"type":"string","format":"uuid","title":"Request Id"},"evaluator_errors":{"items":{"$ref":"#/components/schemas/EvaluatorErrorItem"},"type":"array","title":"Evaluator Errors","description":"Per-metric evaluator failures. At least one entry has ``code='rate_limit'``; other entries may carry any code."}},"type":"object","required":["block","failed_evaluation_metric_ids","request_id","evaluator_errors"],"title":"OutputBlockingRateLimitResponse","description":"HTTP 429 response: at least one evaluator was rate-limited."},"EvaluatorErrorItem":{"properties":{"evaluation_metric_id":{"type":"integer","title":"Evaluation Metric Id","description":"Core evaluation_metric_id that the evaluator failed to evaluate."},"code":{"type":"string","enum":["rate_limit","content_policy","cyber_policy","other"],"title":"Code","description":"Classified evaluator failure code. One of: rate_limit, content_policy, cyber_policy, other."},"message":{"type":"string","title":"Message","description":"Human-readable failure reason (provider message when available)."}},"type":"object","required":["evaluation_metric_id","code","message"],"title":"EvaluatorErrorItem","description":"Evaluator failure item (any classification code, used in 429 responses)."}}},"paths":{"/apps/{app_id}/output_filtering":{"post":{"tags":["app-filtering"],"summary":"Run Output Filtering","description":"Run output-target blocking metrics, return pass/fail, then enqueue output monitoring.","operationId":"run_output_filtering_apps__app_id__output_filtering_post","parameters":[{"name":"app_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"App Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OutputBlockingRequestBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OutputBlockingResponse"}}}},"400":{"description":"Content / cyber security policy blocked the evaluator request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OutputBlockingPolicyErrorResponse"}}}},"422":{"description":"The evaluator request failed for a non-policy / non-rate-limit reason (connection error, auth error, parse error, misconfigured metric, ...).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OutputBlockingEvaluatorErrorResponse"}}}},"429":{"description":"The evaluator provider rate-limited the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OutputBlockingRateLimitResponse"}}}}}}}}}
```
