Sensitive data inspection
Sensitive Data scans the prompts and responses your deployment already stores for data that shouldn’t be there: personal data, payment cards and credentials. The Scanner looks at code in a repository. Sensitive Data looks at content: what people and agents actually wrote.
What is inspected
Section titled “What is inspected”Inspection reads content that SDKs and coding agents already recorded in traces when content capture was on. Nothing new is collected to make it work. If a deployment captures no content, a scan finds nothing. That’s the correct answer, not a reason to start capturing.
Only these span attributes are read. The list is fixed, so turning inspection on can’t quietly start reading a field that was never meant to be read:
| Attribute | Contains |
|---|---|
gen_ai.input.messages | Messages sent to a model |
gen_ai.output.messages | Messages a model returned |
gen_ai.prompt | Prompt (older semantic conventions) |
gen_ai.completion | Completion (older semantic conventions) |
coding_agent.user.prompt | What a developer typed to a coding agent |
coding_agent.llm.thought.text | A coding agent’s reasoning text |
Running a scan
Section titled “Running a scan”Open Sensitive Data in the sidebar, choose a time range, and run a scan. A scan reads up to 2,000 spans in the range and up to 256 KB of text per span. Findings are listed most severe first, with counts by kind.
Open a finding to see:
- Where it was found: the source, the field and the span.
- How far it reached: other places the same value appears (“this card number appears in eleven places”), matched by salted hash.
- A redacted excerpt.
If the originating span is past its retention period, the finding says so.
Findings never hold the value
Section titled “Findings never hold the value”A findings table full of the card numbers it found would be a second breach. Every finding stores:
- the kind of entity found (for example
payment_cardorapi_key), - its location (source, field, span),
- a salted hash of the value, so repeats can be linked without keeping the value,
- a redacted sample,
and never the matched text itself.
POST /api/inspection/scan # run a scan over a time windowPOST /api/inspection/findings # summary by kind and severityPOST /api/inspection/findings/detail # individual findings, most severe firstPOST /api/inspection/findings/context # one finding: where the same value reached, and its span