Skip to main content
Public records are inherently temporal, and most normalization failures stem from conflating different time dimensions. This page maps every temporal field Codex emits per dataset, so you never have to guess which clock a timestamp is on.

Universal fields

Every Codex record carries up to seven temporal fields where semantically applicable. These extend the normalization standard bitemporal contract.
filed_at is distinct from occurred_at for records where the filing is itself the event (e.g. SEC filings) versus records where filing follows the event (e.g. a council vote happens, minutes are filed days later).

Field availability by dataset

Domain-specific temporal fields

Some datasets carry additional temporal fields beyond the universal set.

AIS Maritime — port-call lifecycle

Port calls have four clocks that must not be conflated: occurred_at is set to ata for port.entered events and atd for port.departed events. ETA/ETD are retained as separate fields, never overwritten by actuals. Use both to analyze punctuality:

Permits — six-stage lifecycle

Each permit record carries up to six stage-specific timestamps. Only filed_at is universally present; others are populated as stages complete. occurred_at is set to the stage-specific timestamp of the event type — a permit.filed event has occurred_at = filed_at, a permit.approved event has occurred_at = approved_at.

Civic Intelligence — publication lag

For council proceedings, the gap between occurred_at (meeting date) and published_at (minutes publication) can be days to weeks. Both fields are always populated so you can analyze either event time or public-record time.

OSHA — case lifecycle

Common pitfalls

Avoid these temporal field mistakes — they are the most common source of data errors in downstream analysis.
  • Single-timestamp fallacy. Do not collapse occurred_at, published_at, and filed_at into one field. They are rarely the same value.
  • Using ingested_at for event-time analysis. ingested_at is the wrong clock for analysis — use occurred_at or the domain-specific actual time.
  • Forgetting modified_at on updates. Every writer must refresh modified_at. Skipping this breaks incremental-sync consumers.
  • Overwriting ETA with ATA. Overwriting the estimate with the actual loses the punctuality signal. Keep both.
  • Confusing applied_at and filed_at. Some jurisdictions distinguish these. Codex publishes one or the other per record, never both with different values.

Example queries

Permits filed but not yet approved after 90 days

Publication lag distribution for council proceedings

Port calls where arrival was more than 12 hours late