piidetectionapi.com
Home
Solutions - Fundamentals
What Is PII Detection? NER vs Regex vs Rules Accuracy, Precision & Recall PII in Test Data
Solutions - Compliance
GDPR Personal Data HIPAA PHI Detection CCPA / CPRA PCI DSS Card Data
Solutions - AI & LLM Safety
LLM Guardrails Chatbot PII Filtering RAG Pipelines
Solutions - Data Discovery & DLP
Data Loss Prevention Log File Scanning Support Tickets Email Scanning Documents & PDFs Database Discovery ETL & Streaming Pipelines
Industries - Financial
Banking Fintech Insurance
Industries - Healthcare
Healthcare Pharma & Clinical Trials Telehealth
Industries - Public Sector & Legal
Government & FOIA Law Enforcement Law Firms & eDiscovery Education (FERPA)
Industries - Technology
SaaS Platforms Cybersecurity & IR Telecommunications Gaming & Platforms
Industries - Other
HR & Recruiting Retail & E-commerce Call Centers & BPO Real Estate Travel & Hospitality Marketing & AdTech
How-to Guides - Identity & Contact
Detect Names Detect Email Addresses Detect Phone Numbers Detect Physical Addresses Detect Dates of Birth
How-to Guides - IDs & Financial
Detect SSNs Detect Passport Numbers Detect Drivers Licenses Detect Credit Card Numbers Detect Bank Accounts & IBAN
How-to Guides - Technical & Health
Detect IP & Device IDs Detect Medical Records & PHI
Resources
Pricing API Docs Supported Entities Languages About Contact Sign In Try the Live Demo Get Started
Law Enforcement Solutions

PII Detection for Law Enforcement

Protect victims, witnesses, and juveniles while meeting records-release obligations. AI-powered detection finds every name, address, and identifier across incident reports, body-cam transcripts, CAD notes, and inter-agency data shares.

Every Police Record Names Someone Who Needs Protection

Law enforcement records are unusual among government data: nearly every document exists because something happened to a specific, named person. An incident report identifies a victim, the witnesses who spoke to officers, the reporting party who asked not to be involved, and often a juvenile. A body-worn camera captures faces, voices, license plates, and the inside of someone's home. A CAD narrative logs the caller's address and callback number. Releasing, sharing, or analyzing any of it means deciding — line by line — whose identity travels with the record.

The pressure on those decisions has never been higher. Body-camera statutes in many states mandate public release of footage on a clock measured in days. Public-records laws reach incident reports, and journalists and civil-rights organizations request them in bulk. Prosecutors need discovery packets fast; regional fusion centers and neighboring agencies need data shared; researchers and city dashboards want crime data opened. Meanwhile victims of domestic violence, confidential informants, minors, and uncharged third parties have statutory and constitutional protections — including Marsy's Law provisions in many states — that make a leaked name a safety issue, not a paperwork issue.

The PII Detection API gives records units an automated first pass. Submit report narratives, transcript text, or CAD notes and receive every detected identifier back with its entity type, exact character offsets, and confidence score, plus an optionally masked version. Records technicians stop hand-searching thousands of pages and start reviewing pre-flagged spans — with the model catching identifiers in exactly the messy, jargon-heavy prose that police narratives are made of.

The Record Types That Carry the Risk

Incident and arrest reports concentrate victim and witness identities in free-text narratives: "victim WHITMORE, Dana, DOB 04/11/1992, of 1622 Corvid Ln, stated her ex-husband..." Names arrive in ALL CAPS, surname-first, with codes and abbreviations no generic tool understands. Body-cam and interview transcripts add spoken identifiers — people announce their names, addresses, and phone numbers on camera, and officers read back driver's license numbers and plates.

CAD and dispatch data logs 911 callers' numbers and locations, which many states protect from disclosure. Jail, booking, and juvenile records mix biometric identifiers, medical screenings, and minors' data with strict sealing rules. Inter-agency shares — fusion centers, task forces, regional analytics — move all of the above across organizational boundaries where the originating agency's redaction duties still apply.

Each channel has its own disclosure rules but the same first step: find every identifier, attribute it to a role — victim, witness, juvenile, officer, suspect — and apply the release policy for that role. Detection automates the finding; your policy engine and records staff apply the role rules.

Police-narrative formats are handled

Context-aware NER recognizes "WHITMORE, Dana" and "W/M, DOB 04-11-92, OLN TX 40118822" as identifiers even though no everyday text looks like that. Formatted and free-form identifiers in the same paragraph resolve to typed entities — PERSON_NAME, DATE_OF_BIRTH, DRIVERS_LICENSE_NUMBER — with offsets your redaction tool can act on.

The Rules Governing Law Enforcement Data

Security policy, records law, and victim-protection statutes all converge on knowing exactly where identifiers sit in every record

CJIS Security Policy

The FBI's CJIS Security Policy governs criminal justice information (CJI) wherever it flows — including to cloud services and vendors. Any system touching CJI needs access control, encryption, auditing, and personnel screening aligned to the policy. Detecting and masking identifiers before data leaves the CJIS boundary shrinks what counts as CJI downstream; on-premise deployment keeps detection itself inside the boundary for agencies that require it.

Victim & Witness Protection

Marsy's Law amendments, domestic-violence confidentiality statutes, sexual-assault victim shield laws, and informant-protection doctrine all restrict disclosure of specific people's identifying information. These duties attach to the person's role, not the document type — which is why entity-level detection plus role attribution is the workable implementation, applied consistently across reports, transcripts, and releases.

Juvenile Records

Juvenile justice records are confidential or sealed in every state, and identifying a minor in a released record — as victim, witness, or suspect — is among the most serious redaction failures an agency can commit. Co-occurring PERSON_NAME and AGE/DATE_OF_BIRTH detections give reviewers an automatic signal to apply juvenile handling before anything goes out the door.

Public Records & Body-Cam Statutes

State public-records acts reach police reports, and a growing set of body-camera laws mandate release of footage — often within statutory deadlines — with personal identifiers and uninvolved parties redacted. FOIA Exemption 7(C) provides the federal analog. Automated detection on report text and footage transcripts is what makes deadline-driven release volumes achievable without staffing a second records unit.

When a Redaction Fails, Someone Gets Hurt

In most industries a missed identifier is a compliance event. In policing it can be a safety event: a domestic-violence victim's new address released to a records requester, an informant named in a discovery packet that reaches a defendant's associates, a juvenile witness identified in footage posted to a transparency portal. Agencies have faced civil liability, suppressed evidence, and — far worse — retaliation against the people the redactions were meant to protect.

The operational cost cuts the other way too. Records units that cannot keep pace with body-cam release deadlines and bulk report requests accumulate statutory violations and litigation. Manual frame-by-frame and page-by-page review is the bottleneck; automating identifier detection on narratives and transcripts is the highest-leverage fix available, because it turns review into verification.

Law Enforcement Data Types We Detect

Entity coverage for the identifiers that appear in reports, transcripts, and criminal justice data

Victims, Witnesses, Suspects
PERSON_NAME
Driver's License Numbers
DRIVERS_LICENSE_NUMBER
Home Addresses
ADDRESS, CITY, ZIP_CODE
Dates of Birth & Ages
DATE_OF_BIRTH, AGE
Caller & Contact Numbers
PHONE_NUMBER, EMAIL_ADDRESS
SSNs & National IDs
SSN, NATIONAL_ID, PASSPORT_NUMBER
Locations & Coordinates
GPS_COORDINATES
Biometric References
BIOMETRIC_DATA
Medical & Mental Health
MEDICAL_DATA, DIAGNOSIS
Digital Evidence Identifiers
IP_ADDRESS, DEVICE_ID, IMEI
Vehicle & Serial Data
SERIAL_NUMBER
Sensitive Attributes
ETHNIC_GROUP, RELIGION

Role-Based Handling, Entity-Based Detection

Release policy in law enforcement is role-driven: a victim's name gets different treatment than an officer's, and a juvenile's different treatment than either. Detection supplies the raw material — every identifier, typed and located — and your workflow applies role rules per record. The table below shows a typical policy matrix agencies implement on top of detection output; the full entity catalog is on the entities page.

Because narratives usually label roles ("victim stated", "witness #2", "reporting officer"), simple proximity rules attribute most detected names to roles automatically, leaving only ambiguous cases for the records technician.

Subject Role Key Entity Types Public Release Posture Governing Authority (typical)
Victim (esp. DV / sexual assault) PERSON_NAME, ADDRESS, PHONE_NUMBER, DATE_OF_BIRTH Redact identity and locators in full Marsy's Law; victim shield statutes
Witness / reporting party PERSON_NAME, ADDRESS, PHONE_NUMBER Redact from public copies; retain in case file Exemption 7(C); state analogs
Juvenile (any role) PERSON_NAME + AGE/DATE_OF_BIRTH co-occurrence Redact or initials-only; sealing rules apply State juvenile codes
911 caller PHONE_NUMBER, ADDRESS, GPS_COORDINATES Redact caller identity and location data State CAD/911 confidentiality statutes
Confidential informant PERSON_NAME and any linked identifier Never released; restrict even internally Informer's privilege; CJIS policy
Officer (official capacity) PERSON_NAME, badge context Generally released; home data always redacted Public-records acts; officer-safety exceptions
Suspect (uncharged) PERSON_NAME, DATE_OF_BIRTH, DRIVERS_LICENSE_NUMBER Redact in public copies pending charges Exemption 7(C) doctrine

Law Enforcement PII Detection Use Cases

Where detection slots into records, evidence, and analytics workflows

1

Incident Report Release Redaction

Scan report narratives before responding to public-records requests. Victim, witness, and juvenile identifiers are pre-flagged with offsets your redaction tool converts to black boxes, and the records technician verifies rather than hunts — cutting per-report processing from tens of minutes to a couple.

Before Detection
Victim WHITMORE, Dana (DOB 04/11/1992) of 1622 Corvid Ln stated her ex-husband violated the protective order.
After Masking
Victim [PERSON_NAME] (DOB [DATE_OF_BIRTH]) of [ADDRESS] stated her ex-husband violated the protective order.
2

Body-Cam Transcript Processing

Transcribe footage, detect identifiers in the transcript, and use the returned offsets against the time-aligned transcript to locate the exact seconds where names, addresses, and license numbers are spoken — driving audio bleeps and caption redaction ahead of statutory release deadlines.

Before Detection
[04:12] OFFICER: Can I get your name? [04:14] SPEAKER 2: Marcus Delaine, 3308 Kessler Ave, apartment 4.
After Masking
[04:12] OFFICER: Can I get your name? [04:14] SPEAKER 2: [PERSON_NAME], [ADDRESS].
3

Victim & Witness Protection in Discovery

Prepare discovery packets and court filings with witness locators removed per protective orders and victim-rights statutes. A verification re-scan of the outbound packet documents that no protected identifier survived — evidence you can point to if a disclosure is ever questioned.

Before Detection
Witness #2: Priya Raman, cell 555-330-9114, works nights at the Elm St depot; fears retaliation.
After Masking
Witness #2: [PERSON_NAME], cell [PHONE_NUMBER], works nights at [ADDRESS]; fears retaliation.
4

Inter-Agency & Fusion Center Sharing

Share incident data with task forces, fusion centers, and neighboring jurisdictions with identifiers masked or consistently hashed. mask_mode: "hash" keeps the same person linkable across contributing agencies' records for pattern analysis without exposing who they are until a legal process justifies unmasking.

Before Detection
Series suspect: Terrence Vole, DOB 02/09/1984, OLN TX 40118822, last seen near I-35 corridor.
After Masking
Series suspect: [a41f9c2e], DOB [7bd210af], OLN [90e33d1c], last seen near I-35 corridor.
5

Crime Analytics & Open Dashboards

Feed de-identified narratives into crime analysis, early-intervention systems, and public transparency dashboards. Offense, location-block, and time patterns survive; the people in the reports do not — the same publication gate our government open-data workflows use.

Before Detection
Burglary series: victim J. Okafor (555-207-4432) reported entry via rear window, 1400 blk Sycamore.
After Masking
Burglary series: victim [PERSON_NAME] ([PHONE_NUMBER]) reported entry via rear window, 1400 blk Sycamore.
150+
Entity Types Detected
90%
Faster Report Redaction Prep
7
Subject Roles in a Typical Policy Matrix
On-Prem
Deployment for CJIS Boundaries

Integrate Detection Into RMS and Evidence Workflows

One JSON endpoint behind your records management system, DEMS, or release portal. Full reference in the API documentation and API overview.

cURL — Scan an Incident Narrative

curl -X POST https://piidetectionapi.com/api/moderate.php \
  -H "Content-Type: application/json" \
  -d '{
    "api_key": "YOUR_API_KEY",
    "api_type": "pii_detection",
    "text": "Victim WHITMORE, Dana (DOB 04/11/1992, OLN TX 40118822) of 1622 Corvid Ln stated her ex-husband violated the protective order. Witness: M. Raman, cell 555-330-9114.",
    "entities": ["PERSON_NAME", "DATE_OF_BIRTH", "DRIVERS_LICENSE_NUMBER", "ADDRESS", "PHONE_NUMBER"],
    "mask_mode": "replace",
    "threshold": 0.4
  }'

Python — Body-Cam Transcript Batch with Time Alignment

import requests

API_URL = "https://piidetectionapi.com/api/moderate.php"

RELEASE_ENTITIES = [
    "PERSON_NAME", "ADDRESS", "ZIP_CODE", "PHONE_NUMBER",
    "DATE_OF_BIRTH", "AGE", "SSN", "DRIVERS_LICENSE_NUMBER",
    "GPS_COORDINATES", "MEDICAL_DATA",
]

def scan_transcript(segments: list) -> list:
    # segments: [{"start_ms": 252000, "end_ms": 258000, "text": "..."}, ...]
    full_text = "\n".join(s["text"] for s in segments)
    resp = requests.post(
        API_URL,
        json={
            "api_key": "YOUR_API_KEY",
            "api_type": "pii_detection",
            "text": full_text,
            "entities": RELEASE_ENTITIES,
            "mask_mode": "replace",
            "threshold": 0.4,
            "custom_instruction": "Do not flag officer names or badge numbers spoken in official capacity.",
        },
        timeout=30,
    )
    hits = resp.json()["detected_entities"]
    # Map each hit's char offsets back to the media timestamps for bleeping
    redaction_cues = []
    cursor = 0
    for seg in segments:
        seg_start, seg_end = cursor, cursor + len(seg["text"])
        for e in hits:
            if e["start"] < seg_end and e["end"] > seg_start:
                redaction_cues.append({
                    "type": e["type"],
                    "bleep_from_ms": seg["start_ms"],
                    "bleep_to_ms": seg["end_ms"],
                })
        cursor = seg_end + 1  # account for the joining newline
    return redaction_cues

print(scan_transcript([
    {"start_ms": 252000, "end_ms": 254000, "text": "OFFICER: Can I get your name?"},
    {"start_ms": 254000, "end_ms": 258000, "text": "SPEAKER 2: Marcus Delaine, 3308 Kessler Ave, apartment 4."},
]))

JavaScript — Records-Request Release Gate

// Verify a report copy is clean before it leaves the records portal
async function verifyReleaseCopy(reportText) {
  const resp = await fetch("https://piidetectionapi.com/api/moderate.php", {
    method: "POST",
    headers: { "Content-Type": "application/json" },
    body: JSON.stringify({
      api_key: process.env.PII_API_KEY,
      api_type: "pii_detection",
      text: reportText,
      entities: [
        "PERSON_NAME", "ADDRESS", "PHONE_NUMBER",
        "DATE_OF_BIRTH", "SSN", "DRIVERS_LICENSE_NUMBER"
      ],
      mask_mode: "redact",
      threshold: 0.4,
      custom_instruction: "Officer names in official capacity are releasable; do not flag them."
    })
  });

  const data = await resp.json();
  if (data.entities_detected > 0) {
    // Residual identifiers found — block release, return spans to the reviewer
    return { release: false, residual: data.detected_entities };
  }
  return { release: true };
}

verifyReleaseCopy("Redacted copy text of report 26-044812...").then(console.log);

Best Practices for Agency Deployments

Run recall-first, verify before release. Use a 0.4 threshold on anything leaving the agency and treat detection as two gates: a flagging pass that proposes redactions for technician review, then a verification pass on the final artifact that must return zero entities before the portal releases it.

Encode officer-name policy in custom instructions. Most jurisdictions release officers' names in their official capacity. An instruction such as "do not flag officer names or badge numbers in official capacity" keeps the review queue focused on the victims, witnesses, and third parties whose protection is the point.

Use hashing for cross-jurisdiction analytics. mask_mode: "hash" replaces each identifier with a consistent token, so the same suspect or address links across agencies' contributions to a fusion-center dataset without any contributing agency exposing raw identities.

Keep detection inside the CJIS boundary where required. For agencies whose counsel treats narrative text as CJI, deploy the engine on-premise or in your authorized government cloud enclave; the API contract is identical, so workflows built against the cloud endpoint move unchanged. Start with the getting-started guide for the integration pattern.

Detection informs, roles decide

The API tells you an identifier exists and what kind it is — it does not know whether the person is a victim, an informant, or an officer. Keep role attribution and release decisions with trained records staff and your policy engine. The combination — automated finding, human role judgment, automated verification — is what stands up in court and in the press.

Law Enforcement PII Detection FAQ

Common questions from records units, IT, and command staff

Is the API compatible with CJIS Security Policy requirements?

The cloud service runs on GDPR-native certified infrastructure with encryption in transit and at rest, and request content is not retained or used for training. Whether a given data flow satisfies CJIS depends on your CSA's interpretation of what constitutes CJI in narrative text and on executing the appropriate agreements. For agencies that keep all CJI processing inside their own boundary, the detection engine deploys on-premise or in a government cloud enclave under your existing CJIS controls — the API contract is identical either way. Contact us via the contact page to involve your CJIS auditor early.

How well does detection handle police report formatting and jargon?

Well — this is where context-aware NER separates from regex tooling. Surname-first ALL-CAPS names ("WHITMORE, Dana"), ten-codes, role labels, and abbreviation-dense strings like "W/F, DOB 04-11-92, OLN TX 40118822" are recognized because the model reads the surrounding structure, not just character patterns. We still recommend validating on a sample of your own reports, since narrative conventions vary by agency; the accuracy measurement guide shows how to score precision and recall on your corpus.

Can it redact body-cam video directly?

The API operates on text, and the effective pattern for footage audio is transcript-driven: transcribe, detect on the transcript, then map the returned character offsets to the transcript's timestamps to drive audio bleeps and caption redaction in your video tool (as in the Python example above). Face and screen blurring remain a video-tool function; spoken identifiers — which are the bulk of what statutes require removed — are handled through this text pipeline.

How do we make sure juveniles are caught?

Request PERSON_NAME, AGE, and DATE_OF_BIRTH together and have your workflow flag any name that co-occurs with an age under 18 or a birth date implying it. Those documents route to juvenile handling — initials-only or full withholding per your state code — before any release. The co-occurrence signal converts a sealing requirement that depends on careful reading into a deterministic routing rule.

Can detection keep identities linkable for crime analysis without exposing them?

Yes — that is what mask_mode: "hash" is for. Each unique identifier maps to a consistent hash, so "Terrence Vole" becomes the same token in every report that mentions him, across every contributing agency using the same configuration. Analysts see patterns (repeat subjects, linked addresses, series behavior) without seeing identities; unmasking happens only back at the originating agency under its own legal process.

What does this cost against a records-unit budget?

Pricing is per-request and volume-tiered — a full year of report and transcript scanning typically costs less than a fraction of one records technician position, while multiplying the unit's throughput. See pricing for tiers, and run representative reports through the live demo first to see hit quality on your own narrative style before committing.

Related Resources

Go deeper on identifier detection and adjacent public-sector workflows

Protect the People in Your Records

Paste a sample narrative into the live demo and watch victim, witness, and juvenile identifiers light up with offsets — then wire the same call into your RMS and release portal.