The Port Authority Governance dataset contains structured records from five major US port authorities — Oakland, Long Beach, Los Angeles, JAXPORT, and the Port Authority of New York and New Jersey. Records cover board meetings, agenda items, minutes, tariff documents, resolutions, leases, and capital projects. Each port uses a purpose-built adapter (Legistar, Granicus, GravityView, AEM, or HTML) that normalizes records into a consistent schema for cross-port queries.
Every record inherits the full APRS envelope (record_id, chunk_id, bitemporal fields, confidence_score, provenance) and carries the join keys documented below.
APRS profile: aprs.port-authority/1.0.0
Covered ports
| Port | Slug | UNLOCODE | Governance model | Adapter |
|---|
| Port of Oakland | oakland | USOAK | Independent authority | Legistar |
| Port of Long Beach | long-beach | USLGB | Municipal department | Granicus |
| Port of Los Angeles | los-angeles | USLAX | Municipal department | AEM |
| JAXPORT | jacksonville | USJAX | Independent authority | GravityView |
| Port Authority of NY & NJ | ny-nj | USNYC | Bi-state compact | HTML |
All five ports have at least 12 months of meeting data. Adapters run daily; tariff snapshots update quarterly.
Tables
The dataset is organized into multiple related tables rather than a single flat file. This structure reflects the natural hierarchy of governance records — meetings contain agenda items, which produce claims and facts.
| Table | Purpose |
|---|
port_authorities | Dimension table. One row per port with metadata, UNLOCODE, and jurisdiction slug. |
port_authority_terminals | Per-port terminal gazetteer with H3 resolution-9 cells and alias arrays. |
port_authority_meetings | Scheduled board meetings — one per session. |
port_authority_agenda_items | Union surface (claim + fact) across all agenda items. |
port_authority_claims | Staff recommendations (pre-vote intent). |
port_authority_facts | Board-vote outcomes (post-vote action). |
port_authority_minutes | Pointer records to published minutes PDFs. |
port_authority_resolutions | Adopted resolutions and ordinances. |
port_authority_tariffs | Whole-document tariff version records. |
port_authority_tariff_items | Line-item records with bitemporal supersession tracking. |
port_authority_leases | Terminal leases (available once PDF extraction ships). |
port_authority_capital_projects | Capital infrastructure projects approved via board action. |
Port authorities (dimension)
| Field | Type | Nullable | Description |
|---|
port_slug | string | no | Canonical port identifier (primary key). |
name | string | no | Full legal name. |
unlocode | string | no | UN/LOCODE 5-character identifier. |
governance_model | enum | no | independent_authority, bi_state_compact, or municipal_department. |
jurisdiction_slug | string | no | Civic jurisdiction key for cross-product joins to Civic Intelligence. |
h3_port_r7 | string | yes | H3 resolution-7 cell at the port’s center of gravity. |
port_page_url | URL | yes | Canonical port homepage. |
Meetings
Board and committee meetings with scheduling, location, and document availability.
| Field | Type | Nullable | Description |
|---|
port_slug | string | no | Port identifier. Foreign key to port_authorities. |
event_id | string | no | Source-native meeting identifier (Legistar event ID, Granicus clip ID). |
event_guid | string | yes | Globally unique source identifier when available. |
body_name | string | yes | Committee or board name (e.g., “Board of Port Commissioners”). |
meeting_type_slug | string | yes | Normalized meeting type (see meeting type slugs). |
event_date | date | yes | Scheduled meeting date. |
event_time | string | yes | Scheduled start time. |
location | string | yes | Meeting venue or “Virtual”. |
video_status | string | yes | Video availability (available, pending, none). |
agenda_status | string | yes | Agenda publication status (published, draft, none). |
minutes_status | string | yes | Minutes publication status (published, draft, none). |
agenda_file_url | URL | yes | Direct link to agenda PDF or HTML. |
minutes_file_url | URL | yes | Direct link to minutes PDF or HTML. |
media_urls | JSON | yes | Array of video or audio recording URLs. |
jurisdiction_slug | string | yes | Civic jurisdiction identifier for cross-dataset joins. |
Agenda items
Individual items from a board meeting agenda, classified by kind.
| Field | Type | Nullable | Description |
|---|
port_slug | string | no | Port identifier. |
event_id | string | no | Parent meeting identifier. |
item_id | string | no | Source-native item identifier. |
agenda_sequence | integer | yes | Position in the agenda. |
agenda_number | string | yes | Display number from the published agenda. |
title | string | yes | Agenda item title. |
kind | enum | no | claim or fact. See claim and fact separation. |
matter_id | string | yes | Source-native matter or legislation identifier. |
matter_type | string | yes | Matter classification from the source system. |
matter_status | string | yes | Current status (pending, approved, deferred, withdrawn). |
consent | boolean | yes | true if the item was on the consent calendar. |
roll_call | JSON | yes | Structured roll call vote data when available. |
Claims
Source assertions — what was proposed or recommended by staff. Claims represent the “before” side of governance actions.
| Field | Type | Nullable | Description |
|---|
port_slug | string | no | Port identifier. |
event_id | string | no | Parent meeting identifier. |
item_id | string | no | Source-native item identifier. |
title | string | yes | Staff recommendation or proposal title. |
matter_file | string | yes | Source document reference number. |
matter_name | string | yes | Source-native matter name. |
matter_type | string | yes | Action category (tariff change, lease action, capital project, contract award). |
matter_status | string | yes | Current status. |
consent | boolean | yes | Whether this appeared on the consent calendar. |
attachments | JSON | yes | Array of attachment URLs and metadata. |
counterparty_urn | string | yes | Entity resolution link to the counterparty (tenant, contractor, vendor). |
Facts
Resolved outcomes — what the board actually decided. Facts represent the “after” side of governance actions and are currently available only for Oakland (Legistar adapter).
| Field | Type | Nullable | Description |
|---|
port_slug | string | no | Port identifier. |
event_id | string | no | Parent meeting identifier. |
item_id | string | no | Source-native item identifier. |
action_text | string | yes | Description of the action taken by the board. |
passed_flag | boolean | yes | true if the item passed, false if it failed. |
mover | string | yes | Name of the commissioner who moved the item. |
seconder | string | yes | Name of the commissioner who seconded. |
vote_tally | string | yes | Vote count (e.g., “7-0”, “5-2”). |
Fact records require vote-tally data from the source system. Currently only the Oakland Legistar adapter surfaces passed_flag and vote_tally. Fact emission for other ports will follow as minutes-PDF extraction (roll-call parsing) is added.
Minutes
Published meeting minutes with document links and status tracking.
| Field | Type | Nullable | Description |
|---|
port_slug | string | no | Port identifier. |
event_id | string | no | Parent meeting identifier. |
body_name | string | yes | Committee or board name. |
meeting_type_slug | string | yes | Normalized meeting type. |
minutes_pdf_url | URL | yes | Direct link to minutes PDF. |
minutes_status | string | yes | Publication status. |
Tariffs
Port tariff documents tracked across revisions. When a new tariff version is published, Codex extracts individual line items and links them to the parent document.
| Field | Type | Nullable | Description |
|---|
port_slug | string | no | Port identifier. |
tariff_year | integer | yes | Tariff calendar year. |
version | string | yes | Version identifier. |
version_label | string | yes | Human-readable version label. |
filename | string | yes | Source filename. |
pdf_url | URL | yes | Direct link to tariff PDF. |
Tariff items
Individual line items from tariff documents with bitemporal supersession tracking. When a rate changes between tariff versions, the old item’s superseded_by field links to the replacement.
| Field | Type | Nullable | Description |
|---|
port_slug | string | no | Port identifier. |
schedule_no | string | yes | Tariff schedule number. |
item_no | string | yes | Line item number within the schedule. |
description | string | yes | Rate description. |
rate | string | yes | Rate value (text to accommodate units and ranges). |
unit | string | yes | Rate unit (per TEU, per metric ton, per day). |
notes | string | yes | Classification tag: REG (rules/regulations), DEF (definitions), CHG (fees/charges), REG_NEW or CHG_NEW (new items in this revision). |
effective_date | date | yes | Date the rate takes effect. |
superseded_by | string | yes | record_id of the item that replaced this one. |
page_number | integer | yes | Source PDF page reference. |
Tariff version tracking
Tariff items use bitemporal supersession to track rate changes across versions. When a newer tariff version lands and the diff engine matches an old item to a new one:
- The old item gets
effective_to set to the new version’s effective date
superseded_by links to the replacement item’s record_id
modified_at is refreshed
Items removed in a newer version get effective_to set but superseded_by remains null.
Query rates in effect at a specific point in time:
SELECT schedule_no, item_no, description, rate, unit
FROM port_authority_tariff_items
WHERE port_slug = 'jacksonville'
AND effective_from <= '2025-11-01'
AND (effective_to IS NULL OR effective_to > '2025-11-01');
Claim and fact separation
Governance records use the claim/fact layer to separate what was proposed from what was decided. Every agenda item is classified as either a claim (staff recommendation, pending proposal) or a fact (board decision with recorded vote). This makes it straightforward to query for approved actions versus pending proposals.
For example, a staff recommendation to approve a terminal lease appears as a claim. If the board votes to approve it, a corresponding fact record captures the vote tally and outcome. You can join claims to facts through the shared event_id and item_id keys.
Enum values
Governance model
| Value | Meaning |
|---|
independent_authority | Authority operates as its own legal entity (Oakland, JAXPORT) |
bi_state_compact | Created by interstate compact (PANYNJ) |
municipal_department | Department of a single municipal government (Long Beach, Los Angeles) |
Meeting type slugs
Stable URL-safe slugs derived from body_name:
| Slug | Source body name |
|---|
board-of-harbor-commissioners | Los Angeles Board of Harbor Commissioners |
board-of-port-commissioners | Board of Port Commissioners (Oakland) |
port-authority-board | Port Authority of NY/NJ board |
harbor-commission | Harbor Commission (Long Beach) |
audit-committee | Audit Committee |
board-workshop | Board Workshop |
board-meeting | Board Meeting (JAXPORT general) |
Unmatched body names fall back to a slugified version of the source text.
Passed flag values
Source-supplied status string, lowercased. Values that indicate an affirmative outcome: pass, passed, adopted, approved. Values that indicate a negative outcome: fail, failed, rejected, denied. Other values are stored verbatim.
Cross-dataset joins
The Port Authority Governance dataset joins to other Codex datasets through two paths.
To AIS Maritime Positions
- Port-level: join
port_authorities.unlocode to vessel port-call attribution in AIS Maritime. For example, UNLOCODE USJAX maps to all vessel calls at Jacksonville.
- Terminal-level: join
port_authority_terminals.h3_r9 to ais_positions.h3_index at H3 resolution 9. A vessel’s position within a terminal’s H3 cell during a port call attributes the call to that terminal, which joins to lease records for “which lessee was operating that terminal at port-call time.”
To Civic Intelligence
port_authority_meetings.jurisdiction_slug aligns with civic_records.jurisdiction_slug from the Civic Intelligence dataset. This enables queries like “all civic actions in Oakland adjacent to port-board actions from the same jurisdiction.”
To Events Timeline
Every fact-kind agenda-item record and every adopted resolution surfaces as an Events Timeline row. The fact’s effective_from becomes the event’s occurred_at.
Join keys
| Key | Presence | Notes |
|---|
record_id | always | APRS URN |
chunk_id | always | Deterministic from record_id |
port_slug | always | Links to port_authorities dimension table |
unlocode | always (dimension) | Cross-product join to AIS Maritime via port-call resolution |
event_id | always | Meeting-level key; joins meetings to agenda items, claims, facts, and minutes |
item_id | often | Item-level key; joins agenda items to claims and facts |
jurisdiction_slug | sometimes | Civic jurisdiction identifier for cross-dataset joins |
counterparty_urn | sometimes | Entity resolution link to tenant, contractor, or vendor |
h3_r9 | terminals | H3 resolution-9 cell for terminal-level AIS joins |
source_version_urn | tariff items | Foreign key to parent tariff document |
superseded_by | tariff items | Self-referencing key across tariff versions |
Example queries
Find all approved lease actions at the Port of Oakland in the last year:
SELECT
f.record_id,
f.occurred_at,
c.title,
c.matter_type,
c.counterparty_urn,
f.passed_flag,
f.vote_tally
FROM port_authority_facts f
JOIN port_authority_claims c
ON c.port_slug = f.port_slug
AND c.event_id = f.event_id
AND c.item_id = f.item_id
WHERE f.port_slug = 'oakland'
AND c.matter_type ILIKE '%lease%'
AND f.passed_flag = true
ORDER BY f.occurred_at DESC;
List all board meetings across ports with published minutes:
SELECT
port_slug,
body_name,
event_date,
agenda_file_url,
minutes_file_url
FROM port_authority_meetings
WHERE minutes_status = 'published'
ORDER BY event_date DESC
LIMIT 25;
Compare tariff rate changes between versions at a specific port:
SELECT
old_item.schedule_no,
old_item.item_no,
old_item.description,
old_item.rate AS old_rate,
new_item.rate AS new_rate,
old_item.effective_date AS old_effective,
new_item.effective_date AS new_effective
FROM port_authority_tariff_items old_item
JOIN port_authority_tariff_items new_item
ON new_item.record_id = old_item.superseded_by
WHERE old_item.port_slug = 'jacksonville'
ORDER BY old_item.schedule_no, old_item.item_no;
Query rates in effect on a given date:
SELECT schedule_no, item_no, description, rate, unit
FROM port_authority_tariff_items
WHERE port_slug = 'jacksonville'
AND effective_from <= '2025-11-01'
AND (effective_to IS NULL OR effective_to > '2025-11-01');
Known limitations
- Fact coverage is port-dependent. Only the Oakland Legistar adapter currently emits fact records with vote tallies and pass/fail outcomes. Other ports will gain fact emission as minutes-PDF extraction is added.
- Tariff items cover JAXPORT only. The tariff parser is currently JAXPORT-shaped. PANYNJ uses a different table layout that requires a separate parser. Other ports (POLA, POLB, Oakland) negotiate pricing via leases rather than publishing item-level tariff schedules.
- Lease and capital project tables are scaffolds. These tables exist in the schema but are not yet populated. Records will appear once the resolution-PDF extractor ships.
- Counterparty resolution is deferred.
counterparty_urn on claims and leases stays null until the corporate-registry entity resolution pipeline is available. Lessee names are stored as raw strings in the meantime.
- Meeting dates may be missing. The NY & NJ adapter does not currently parse event dates from document metadata, so
event_date is null for PANYNJ meetings.
- Adapter coverage varies. Not all adapters surface the same fields. Granicus and HTML adapters do not provide
roll_call or vote_tally data.
- Tariff items are text-based. The
rate field is stored as text to accommodate varied formats (ranges, multi-part rates, conditional pricing). Parse with care when doing numeric comparisons.
- Historical depth varies by port. The initial backfill covers approximately one year of meetings. Older records may be added in future collection runs.
- Undated tariff versions. Some earlier JAXPORT tariff versions lack
effective_from. The superseded_by chain is still correct, but absolute point-in-time queries against undated periods are imprecise. Use the parent tariff’s tariff_year as a fallback.