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