Envelope columns
All catalog tables include these columns:| Column | Type | Description |
|---|---|---|
record_id | text | Stable URN for the source document. Format: urn:aprs:record:{namespace}:{source}:{id} |
chunk_id | text | Deterministic SHA-256 URN for vector indexing. Format: urn:aprs:chunk:{hex} |
source_system | text | Originating system name (e.g. granicus, aisstream, derived). |
source_uri | text | URL or URN pointing to the original upstream record. |
schema_version | text | Semver-tagged APRS profile (e.g. aprs.civic/1.0.0). |
normalization_version | text | Semver of the normalization pipeline that produced this row. |
acl_tier | text | Access tier: research, commercial, or internal. |
occurred_at | timestamptz | When the real-world event happened. |
ingested_at | timestamptz | When Axiom first ingested the record. |
modified_at | timestamptz | When the record was last updated in Axiom. |
Schema profiles
Each data domain uses a versioned schema profile inschema_version:
| Profile | Domain |
|---|---|
aprs.civic/1.0.0 | Civic records (meeting minutes, ordinances, filings) |
aprs.permits/1.0.0 | Building permits |
aprs.events/1.0.0 | Axiom-curated events |
aprs.urban/1.0.0 | Cell-level urban scores |
aprs.maritime/1.0.0 | AIS positions and vessel visits |
aprs.complaints/1.0.0 | 311 service requests |
aprs.poi/1.0.0 | Points of interest |
Record ID format
Everyrecord_id follows a deterministic URN pattern so the same real-world record always maps to the same identifier:
urn:aprs:record:civic:granicus:12345— a civic record ingested from Granicusurn:aprs:record:maritime:vessel_visit:9434210:USLAX:7891— a vessel visit keyed by IMO, port, and visit ID
Access tiers
Theacl_tier column controls data visibility:
| Tier | Description |
|---|---|
research | Publicly available data suitable for research and analysis. |
commercial | Licensed data available to commercial-tier subscribers. |
internal | Axiom-internal data not exposed through APIs. |
Querying with envelope fields
You can use envelope columns to filter, sort, and join across any Locus table. For example, to find recently ingested records from a specific source:Compliance enforcement
Every change to collectors, edge functions, and migrations is validated against the APRS standard before it can be merged. The compliance pipeline runs three checks:- Shape check — verifies that every catalog table with data has envelope coverage tracked. If a table has rows but no
record_idpopulation metrics, the change is blocked. - Runtime compliance — samples the last 500 rows per table and validates them against nine APRS rules (valid URN format, non-null
source_uri, valid timestamps, correctacl_tier, temporal ordering, and schema version format). Tables below 95% compliance with critical issues block the change. - Static analysis — flags collector files that write to catalog tables without importing the envelope function. This check is advisory and posts a warning rather than blocking.
Coverage
The APRS envelope is present on all tables registered in the Locus data catalog. Envelope columns are populated automatically for new records at ingestion time. Historical records are being backfilled progressively — checkmodified_at to confirm a row has been fully normalized.