A public-record API spares your team the grind of scraping hundreds of government sites one by one. But having an endpoint to call is not the same as having data that fits the workflow you have in mind.
The plumbing can work perfectly while the product still fumbles the basics. Is every jurisdiction you need actually included? Is a single result a person, a property, a filing or an event? What exactly does that update date refer to? Can you trace any returned record back to where it came from?
The same checks apply to most kinds of public data: court files, property records, business registrations, professional licences, permits, government contracts and person-level registries. Answers differ by dataset; the evaluation routine should not.
Begin with the record and the job it has to do
Pin down what the product needs from the data before you start comparing vendors.
A property platform might pull tax assessments by address or assessor’s parcel number. A legal tool might watch court dockets by case number. A marketplace might check that a contractor’s professional licence is live. A civic-data app might crunch federal awards from SAM.gov by agency, recipient or Unique Entity Identifier.
Every one of those jobs calls for a different search and delivery pattern. Looking up one record at a time suits a synchronous API call. Tracking thousands of business filings probably needs a change feed. Crunching several years of permits or court cases usually works better from a bulk file.
Output shape counts as well. Showing a licence’s current status is a very different build from tracing how licence statuses shifted year on year.
Write out your intended queries, volumes, latency targets and storage needs first, then look at API features. Skip that step and a glossy feature list will mask a plain mismatch between the API and your product.
Spell out coverage in the source system’s own terms
“Nationwide coverage” reads well right up to the point where somebody tries to measure it.
Property coverage usually hinges on counties, since county assessors and recorders hold much of the record. Court coverage hinges on specific courts, case types and the years available. Professional-licence coverage shifts by state board and by profession. Permit data tends to be sliced by municipality, department or permit category.
So a coverage claim worth trusting names the units that matter:
- Jurisdictions and agencies covered
- Types of record gathered
- Historical ranges on offer
- Gaps already identified
- Variation in field availability
- Sources currently offline
Ask, too, whether coverage means current records, historical records or the lot. A business-registration API may hold active companies in every state yet know little about dissolved ones. A court API may carry civil cases in one jurisdiction and both civil and criminal dockets in the next.
Any provider that publishes its data collection and processing methodology hands buyers a firmer footing for weighing up those differences.
Work out what a single API record actually is
What counts as a “record” swings wildly between datasets.
In a corporate registry, one company can carry formation documents, amendments, annual reports and Uniform Commercial Code filings. In property data, a parcel can carry several owners, deeds and tax assessments. A court case can hold many parties, hearings and docket entries. One professional can hold several licences.
Raw record counts tell you almost nothing without the data model behind them.
So before you integrate, work out whether the API hands back:
- One row per entity
- One row per filing or event
- A current profile stitched from many records
- A point-in-time version of an entity
- A link between several entities
Identifiers repay a hard look. Parcel numbers, docket numbers, licence numbers, permit IDs and entity IDs can be rock solid inside one source system, then clash across jurisdictions unless they travel with a state, county, court or agency code.
Deduplication raises the same problem. Person-level data tends to need name and identity resolution. Property data needs address and parcel matching. Company data has to separate branches, legal entities and trading names. Ask what the provider merges, what it keeps apart, and which identifiers drive the call.
Dig past the advertised refresh rate
A vendor may badge its data daily, monthly or real time. That badge says nothing about what an update actually does.
Public-record APIs collect in several ways. Some hit the official source live when a request arrives. Some load full snapshots on a timetable. Others apply incremental updates or consume change feeds. Each approach sets different expectations for freshness, history and what happens when a source drops out.
Dates need nailing down too. A response might carry:
- The date the event happened
- The date of filing
- The date a status took effect
- The date the source page changed
- The date the provider collected it
- The date the dataset was published
None of those are swappable.
Ask as well how the provider deals with corrections, lapsed licences, amended contracts, withdrawn filings and records that vanish from the next collection run. If you need history, check whether earlier versions are kept or simply overwritten.
Inspect normalisation without losing the source’s meaning
Government systems almost never share a schema. Dates, addresses, agency codes and status labels diverge even when the underlying events match.
Normalisation makes records far easier to query, but you need to know what was altered. Turning state names into two-letter codes is trivial. Folding a spread of court dispositions or licence statuses into one tidy category involves judgement.
A solid schema review takes in:
- Field definitions and types
- Standardised formats
- Blank and partial values
- Fields unique to a source
- Controlled vocabularies
- Durable record identifiers
- Schema version changes
- Handling of conflicting values
Be wary of clean labels that bury real distinctions. “Inactive” might mean expired, suspended, voluntarily surrendered or administratively closed, depending on where it came from. If that nuance matters to you, insist the raw value ships alongside the normalised one.
Put the search behaviour through its paces
Docs often list the parameters without explaining how they behave together.
A name query may run exact, prefix or fuzzy matching. An address search may expect a formatted street address, coordinates or a parcel. Combine parameters and you may get AND logic, OR logic or a weighted relevance score. Sorting may follow match confidence, filing date or some undocumented default.
Run realistic queries before you design any interface around them:
- Common names and spelling variants
- Records with fields missing
- Addresses in assorted formats
- Case, permit or licence numbers
- Filters stacked together
- Results running across pages
- Searches that find nothing
- Malformed or partial requests
Poke at pagination, maximum response size, rate limits and batch endpoints too. If the API cannot carry your planned volume, plan for bulk delivery or a scheduled pipeline instead.
Insist on provenance with every result
Public-record data is far easier to check when the response keeps its thread back to the originating source.
The provenance fields that earn their keep are source agency, jurisdiction, original record ID, source URL, filing or event date, and the provider’s collection date. They let you chase down an odd result, explain why two sources disagree and spot records hit by a botched update.
The Nannostomus sex offender API, to take one case, serves structured U.S. sex offender registry data with source jurisdiction, download details and links to public profiles where they exist. The principle carries across every public-record category: a normalised response should keep enough context for you to see where the information originated.
A source link makes review possible. It does not promise that the agency page behind it is complete, reachable or current when the user clicks through.
Nail down operational terms and usage limits
Close out the review by examining the conditions wrapped around the data.
Check authentication, rate limits, response times, service monitoring, support routes and how changes get announced. Model total cost at your expected monthly volume, since per-request rates often shift across pricing tiers. Find out whether failed calls are billed and whether sandbox access shares production limits.
Then go through storage, caching, redistribution, attribution and rights over derived data.
Person-level records demand extra caution. Data being public does not make criminal or registry information fit for employment, housing, credit or other eligibility decisions. The provider’s permitted use, the relevant consumer-reporting rules and your own legal sign-off all need to line up before you ship.
Run a representative trial before spending engineering time
Pick known examples spanning several jurisdictions, agencies or record types. Exercise current and historical records, patchy inputs, changed statuses and the failure cases you expect. Hold the returned fields up against the original public source and log every limitation the product will have to absorb.
The point is to find those limitations before they harden into product assumptions.
Wrapping up
A public-record API worth adopting makes its coverage, record model, update cycle, schema, query logic, provenance and usage terms plain. Get those fundamentals nailed down and your engineers can build on the data with far fewer nasty surprises.



