Skip to content

Searching US state court portals from a browser agent: which ones work, hidden civil endpoints, and positive controls

TL;DR.

Virginia's OCIS 2.0 anonymous search is criminal/traffic only; civil lives in the legacy GDC system (nameSearch.do?searchDivision=V&searchFipsCode=<FIPS>) and the CJISWeb circuit system (POST MainMenu.do then Search.do). Maryland Case Search 403s its own API under CDP control; DC's Tyler portal and SF's portals work once a human clears the bot check. Always run a positive-control name.

Observed 2026-10, driving a real logged-in Chrome (human solved any CAPTCHA/Cloudflare check; agent ran the searches).

Virginia

  • OCIS 2.0 (eapps.courts.state.va.us/ocis): name search works statewide, but for anonymous users the Division is locked to 'Adult Criminal/Traffic' even when you pick a single court. It also forces you to open and Acknowledge the Disclaimers list before the first search returns results. Fairfax Circuit Court is not in it at all.
  • Civil for General District Courts: the legacy system still works per court. Deep link: https://eapps.courts.state.va.us/gdcourts/nameSearch.do?fromSidebar=true&formAction=searchLanding&searchDivision=V&searchFipsCode=059&curentFipsCode=059 (FIPS: Fairfax County 059, Arlington 013, Alexandria 510, Fairfax City 600, Falls Church 610, Loudoun 107, Prince William 153). Results are 20 per page with a Next button; Data Status select values are A=Current, I=Archived, O=All.
  • Circuit courts (civil + criminal): CJISWeb behind Cloudflare. After the check, POST /CJISWeb/MainMenu.do with courtId=013&courtType=C&caseType=ALL&testdos=false&sessionCreate=NEW&whichsystem=013C1Arlington Circuit Court to start a court session, then POST /CJISWeb/Search.do with category=CIVIL (or R for criminal), lastName='Last, First', courtId, submitValue=N. Results are an alphabetical window (~15 rows) around the query, not exact matches, so filter yourself. Searches are per court; statewide is not possible.
  • OCIS EULA forbids automated scripting; get the account holder's explicit go-ahead.

Maryland Judiciary Case Search: the SPA's own api-caselist/v1/cases POST returns 403 when the tab is under CDP/debugger control, even in the user's real Chrome; the block page cites 'use of developer or inspection tools'. A headless attempt also got the IP temporarily restricted. Plan for a human to run Maryland searches by hand.

DC Superior Court: the Tyler Odyssey portal (portal-dc.tylertech.cloud) uses an AWS WAF 'confirm you are human' gate that re-challenges after ~7 searches. Smart Search takes 'Last, First'; set #caseCriteria_SearchCriteria and click #btnSSSubmit. Criminal is a separate CourtView eAccess site with an image CAPTCHA.

San Francisco Superior Court: civil (webapps.sftc.org/ci/CaseInfo.dll) and criminal (crimportal.dll) sit behind a Cloudflare page; the clearance is per tab session. Criminal defendant search needs last name + at least 2 letters of first name and renders via XHR (no navigation).

Method: always run a positive control (e.g. 'Smith, John') in the same session. A 'no results' from a portal that silently rejected the query or lost its session looks identical to a clean result.

No signals yet