action and a per-content-part breakdown in input_results. Starfort returns the Guardian’s response body verbatim — no wrapper, no field reshaping.
The action model
The action set depends on the policy type:- PII policies return
PASS/MASK/BLOCK. - Topic policies are 2-state: they return
PASSorBLOCK(a topic classifiedunsafeblocks; everything else passes).
action is the highest severity across everything detected: BLOCK > MASK > PASS. See Actions.
Top-level
Each
input_results[] entry:
MASK example (PII)
[<MASK_WORD>_<n>], numbered per occurrence ([PHONE_NUMBER_1], [PHONE_NUMBER_2], …).
Processed-content egress — what goes out is always processed_content
Starting with v1.4, the content that leaves for an external AI service is never the caller’s original — it’s the processed content (processed_content) that Guardian actually inspected and rebuilt:
- PASS — the processed content is delivered. Even when nothing needed masking and the content reads the same as the original, what’s delivered is Guardian’s rebuilt version.
- MASK — the masked processed content is delivered.
- BLOCK — nothing is delivered (
processed_contentisnull). - Inputs no processed content could be built from (unsupported files, parse or decode failures) — Guardian couldn’t verify the contents, so the field is
null, and the original must not be sent in its place (fail-closed).
What changed from v1.3 — through v1.3,
processed_content was populated only on MASK, and PASS meant the caller’s original went out as-is (the field was null). From v1.4 on, PASS populates the processed content too, and delivering it instead of the original is the contract.BLOCK example (Topic)
detected_items — PII vs. Topic
The fields differ by policy type:
Read the top-level
action first. On PASS and MASK, send processed_content onward instead of the original (see the processed-content egress rule above). On BLOCK, do not call your model. See Actions.PASS always means “analyzed, nothing detected”
A PASS with empty results is never ambiguous: it means the Guardian completed analysis and found nothing — not that it failed to analyze. A request the Guardian cannot analyze returns an HTTP error instead of a degraded 200 (Guardian fail-closed), so a failure can never be mistaken for a clean result. See Errors & states.