Maia-analytics table API
The table API from Maia-analytics — 12 operation(s) for table.
The table API from Maia-analytics — 12 operation(s) for table.
openapi: 3.1.0
info:
title: MAIA Ah table API
description: API for MAIA application (migrated from Firebase)
version: 0.1.0
tags:
- name: table
paths:
/api/v1/table/{layer_id}/features/paginated:
get:
tags:
- table
summary: Get Layer Features Paginated
description: 'Paginated features from the workspace sandbox for AG Grid SSR.
Query params use AG Grid''s native camelCase (``startRow``, ``sortModel``,
etc.) to match the ``IServerSideGetRowsRequest`` shape.'
operationId: get_layer_features_paginated_api_v1_table__layer_id__features_paginated_get
security:
- FirebaseAuthMiddleware: []
parameters:
- name: startRow
in: query
required: false
schema:
anyOf:
- type: integer
minimum: 0
- type: 'null'
default: 0
title: Startrow
- name: endRow
in: query
required: false
schema:
anyOf:
- type: integer
exclusiveMinimum: 0
- type: 'null'
default: 100
title: Endrow
- name: sortModel
in: query
required: false
schema:
anyOf:
- type: string
- type: 'null'
title: Sortmodel
- name: filterModel
in: query
required: false
schema:
anyOf:
- type: string
- type: 'null'
title: Filtermodel
- name: filterId
in: query
required: false
schema:
anyOf:
- type: string
format: uuid
- type: 'null'
title: Filterid
- name: groupKeys
in: query
required: false
schema:
anyOf:
- type: string
- type: 'null'
title: Groupkeys
- name: rowGroupCols
in: query
required: false
schema:
anyOf:
- type: string
- type: 'null'
title: Rowgroupcols
- name: searchText
in: query
required: false
schema:
anyOf:
- type: string
maxLength: 200
- type: 'null'
title: Searchtext
- name: geometry
in: query
required: false
schema:
anyOf:
- type: string
- type: 'null'
title: Geometry
- name: favoritesOnly
in: query
required: false
schema:
anyOf:
- type: boolean
- type: 'null'
default: false
title: Favoritesonly
- name: token
in: query
required: false
schema:
anyOf:
- type: string
- type: 'null'
description: Firebase ID token for MVT authentication
title: Token
description: Firebase ID token for MVT authentication
responses:
'200':
description: Successful Response
content:
application/json:
schema:
$ref: '#/components/schemas/PaginatedFeaturesResponse'
'422':
description: Validation Error
content:
application/json:
schema:
$ref: '#/components/schemas/HTTPValidationError'
/api/v1/table/{layer_id}/columns:
get:
tags:
- table
summary: Get Layer Columns Metadata
description: Column metadata + aggregate stats for a layer, without fetching row data.
operationId: get_layer_columns_metadata_api_v1_table__layer_id__columns_get
security:
- FirebaseAuthMiddleware: []
parameters:
- name: token
in: query
required: false
schema:
anyOf:
- type: string
- type: 'null'
description: Firebase ID token for MVT authentication
title: Token
description: Firebase ID token for MVT authentication
responses:
'200':
description: Successful Response
content:
application/json:
schema:
$ref: '#/components/schemas/ColumnsMetadataResponse'
'422':
description: Validation Error
content:
application/json:
schema:
$ref: '#/components/schemas/HTTPValidationError'
/api/v1/table/{layer_id}/columns/{column_id}/values:
get:
tags:
- table
summary: Get Column Distinct Values
description: Distinct values + counts for a column — populates AG Grid's set filter.
operationId: get_column_distinct_values_api_v1_table__layer_id__columns__column_id__values_get
security:
- FirebaseAuthMiddleware: []
parameters:
- name: column_id
in: path
required: true
schema:
type: string
title: Column Id
- name: search
in: query
required: false
schema:
anyOf:
- type: string
maxLength: 200
- type: 'null'
title: Search
- name: limit
in: query
required: false
schema:
type: integer
maximum: 5000
minimum: 1
default: 500
title: Limit
- name: token
in: query
required: false
schema:
anyOf:
- type: string
- type: 'null'
description: Firebase ID token for MVT authentication
title: Token
description: Firebase ID token for MVT authentication
- name: filterModel
in: query
required: false
schema:
anyOf:
- type: string
- type: 'null'
title: Filtermodel
responses:
'200':
description: Successful Response
content:
application/json:
schema:
$ref: '#/components/schemas/DistinctValuesResponse'
'422':
description: Validation Error
content:
application/json:
schema:
$ref: '#/components/schemas/HTTPValidationError'
/api/v1/table/{layer_id}/features/filtered-ids:
get:
tags:
- table
summary: Get Layer Filtered Ids
description: 'Feature ids matching the current filter set, capped by ``limit``.
Powers map filter sync (which features to show on the map given the
current table filters), spatial polygon filtering (draw polygon →
filter table to features inside it), and enrichment targeting (find
unenriched rows for a given enrichment, capped). ``total`` reflects
the full match count regardless of ``limit``.
Honors ``favoritesOnly`` so map-filter sync and enrichment targeting
stay consistent with the table when the favorites toggle is on.'
operationId: get_layer_filtered_ids_api_v1_table__layer_id__features_filtered_ids_get
security:
- FirebaseAuthMiddleware: []
parameters:
- name: enrichmentState
in: query
required: false
schema:
anyOf:
- type: string
maxLength: 32
- type: 'null'
title: Enrichmentstate
- name: enrichmentName
in: query
required: false
schema:
anyOf:
- type: string
- type: 'null'
title: Enrichmentname
- name: limit
in: query
required: false
schema:
type: integer
maximum: 500000
minimum: 1
default: 100000
title: Limit
- name: startRow
in: query
required: false
schema:
anyOf:
- type: integer
minimum: 0
- type: 'null'
default: 0
title: Startrow
- name: endRow
in: query
required: false
schema:
anyOf:
- type: integer
exclusiveMinimum: 0
- type: 'null'
default: 100
title: Endrow
- name: sortModel
in: query
required: false
schema:
anyOf:
- type: string
- type: 'null'
title: Sortmodel
- name: filterModel
in: query
required: false
schema:
anyOf:
- type: string
- type: 'null'
title: Filtermodel
- name: filterId
in: query
required: false
schema:
anyOf:
- type: string
format: uuid
- type: 'null'
title: Filterid
- name: groupKeys
in: query
required: false
schema:
anyOf:
- type: string
- type: 'null'
title: Groupkeys
- name: rowGroupCols
in: query
required: false
schema:
anyOf:
- type: string
- type: 'null'
title: Rowgroupcols
- name: searchText
in: query
required: false
schema:
anyOf:
- type: string
maxLength: 200
- type: 'null'
title: Searchtext
- name: geometry
in: query
required: false
schema:
anyOf:
- type: string
- type: 'null'
title: Geometry
- name: favoritesOnly
in: query
required: false
schema:
anyOf:
- type: boolean
- type: 'null'
default: false
title: Favoritesonly
- name: token
in: query
required: false
schema:
anyOf:
- type: string
- type: 'null'
description: Firebase ID token for MVT authentication
title: Token
description: Firebase ID token for MVT authentication
responses:
'200':
description: Successful Response
content:
application/json:
schema:
$ref: '#/components/schemas/FilteredIdsResponse'
'422':
description: Validation Error
content:
application/json:
schema:
$ref: '#/components/schemas/HTTPValidationError'
/api/v1/table/{layer_id}/features/filtered-count:
get:
tags:
- table
summary: Get Layer Filtered Count
description: 'Total row count matching the current filter set; no ids materialized.
Counterpart to ``/filtered-ids`` for callers that only need the total —
skips the sort + id fetch. Backs the column-wide bulk-enrich confirm gate.'
operationId: get_layer_filtered_count_api_v1_table__layer_id__features_filtered_count_get
security:
- FirebaseAuthMiddleware: []
parameters:
- name: enrichmentState
in: query
required: false
schema:
anyOf:
- type: string
maxLength: 32
- type: 'null'
title: Enrichmentstate
- name: enrichmentName
in: query
required: false
schema:
anyOf:
- type: string
- type: 'null'
title: Enrichmentname
- name: startRow
in: query
required: false
schema:
anyOf:
- type: integer
minimum: 0
- type: 'null'
default: 0
title: Startrow
- name: endRow
in: query
required: false
schema:
anyOf:
- type: integer
exclusiveMinimum: 0
- type: 'null'
default: 100
title: Endrow
- name: sortModel
in: query
required: false
schema:
anyOf:
- type: string
- type: 'null'
title: Sortmodel
- name: filterModel
in: query
required: false
schema:
anyOf:
- type: string
- type: 'null'
title: Filtermodel
- name: filterId
in: query
required: false
schema:
anyOf:
- type: string
format: uuid
- type: 'null'
title: Filterid
- name: groupKeys
in: query
required: false
schema:
anyOf:
- type: string
- type: 'null'
title: Groupkeys
- name: rowGroupCols
in: query
required: false
schema:
anyOf:
- type: string
- type: 'null'
title: Rowgroupcols
- name: searchText
in: query
required: false
schema:
anyOf:
- type: string
maxLength: 200
- type: 'null'
title: Searchtext
- name: geometry
in: query
required: false
schema:
anyOf:
- type: string
- type: 'null'
title: Geometry
- name: favoritesOnly
in: query
required: false
schema:
anyOf:
- type: boolean
- type: 'null'
default: false
title: Favoritesonly
- name: token
in: query
required: false
schema:
anyOf:
- type: string
- type: 'null'
description: Firebase ID token for MVT authentication
title: Token
description: Firebase ID token for MVT authentication
responses:
'200':
description: Successful Response
content:
application/json:
schema:
$ref: '#/components/schemas/FilteredCountResponse'
'422':
description: Validation Error
content:
application/json:
schema:
$ref: '#/components/schemas/HTTPValidationError'
/api/v1/table/{layer_id}/features/navigate:
get:
tags:
- table
summary: Navigate Layer Feature
description: 'Server-side prev/next cursor for the focused-feature panel.
Runs a single CTE on the current filtered set per call — no cap on
set size and no client-side id materialization, so navigation works
past the old 100k boundary. ``wrap`` controls behavior at the
endpoints (true → loop, false → ``None``).'
operationId: navigate_layer_feature_api_v1_table__layer_id__features_navigate_get
security:
- FirebaseAuthMiddleware: []
parameters:
- name: currentId
in: query
required: true
schema:
type: string
minLength: 1
title: Currentid
- name: wrap
in: query
required: false
schema:
type: boolean
default: true
title: Wrap
- name: enrichmentState
in: query
required: false
schema:
anyOf:
- type: string
maxLength: 32
- type: 'null'
title: Enrichmentstate
- name: enrichmentName
in: query
required: false
schema:
anyOf:
- type: string
- type: 'null'
title: Enrichmentname
- name: startRow
in: query
required: false
schema:
anyOf:
- type: integer
minimum: 0
- type: 'null'
default: 0
title: Startrow
- name: endRow
in: query
required: false
schema:
anyOf:
- type: integer
exclusiveMinimum: 0
- type: 'null'
default: 100
title: Endrow
- name: sortModel
in: query
required: false
schema:
anyOf:
- type: string
- type: 'null'
title: Sortmodel
- name: filterModel
in: query
required: false
schema:
anyOf:
- type: string
- type: 'null'
title: Filtermodel
- name: filterId
in: query
required: false
schema:
anyOf:
- type: string
format: uuid
- type: 'null'
title: Filterid
- name: groupKeys
in: query
required: false
schema:
anyOf:
- type: string
- type: 'null'
title: Groupkeys
- name: rowGroupCols
in: query
required: false
schema:
anyOf:
- type: string
- type: 'null'
title: Rowgroupcols
- name: searchText
in: query
required: false
schema:
anyOf:
- type: string
maxLength: 200
- type: 'null'
title: Searchtext
- name: geometry
in: query
required: false
schema:
anyOf:
- type: string
- type: 'null'
title: Geometry
- name: favoritesOnly
in: query
required: false
schema:
anyOf:
- type: boolean
- type: 'null'
default: false
title: Favoritesonly
- name: token
in: query
required: false
schema:
anyOf:
- type: string
- type: 'null'
description: Firebase ID token for MVT authentication
title: Token
description: Firebase ID token for MVT authentication
responses:
'200':
description: Successful Response
content:
application/json:
schema:
$ref: '#/components/schemas/NavigateCursorResponse'
'422':
description: Validation Error
content:
application/json:
schema:
$ref: '#/components/schemas/HTTPValidationError'
/api/v1/table/{layer_id}/export:
get:
tags:
- table
summary: Export Layer Features
description: 'Stream the filtered layer rows as CSV or XLSX.
Replaces the page-scoped client-side export for SSR-backed layers.
Row shaping mirrors ``client/src/components/Table/csvExportUtils.ts``
— contact/tenant sub-field expansion, reasoning columns, and a
``Favorited`` column when requested. Exceeding
``settings.MAX_EXPORT_ROWS`` returns 413 before any byte streams.'
operationId: export_layer_features_api_v1_table__layer_id__export_get
security:
- FirebaseAuthMiddleware: []
parameters:
- name: token
in: query
required: false
schema:
anyOf:
- type: string
- type: 'null'
description: Firebase ID token for MVT authentication
title: Token
description: Firebase ID token for MVT authentication
- name: startRow
in: query
required: false
schema:
anyOf:
- type: integer
minimum: 0
- type: 'null'
default: 0
title: Startrow
- name: endRow
in: query
required: false
schema:
anyOf:
- type: integer
exclusiveMinimum: 0
- type: 'null'
default: 100
title: Endrow
- name: sortModel
in: query
required: false
schema:
anyOf:
- type: string
- type: 'null'
title: Sortmodel
- name: filterModel
in: query
required: false
schema:
anyOf:
- type: string
- type: 'null'
title: Filtermodel
- name: filterId
in: query
required: false
schema:
anyOf:
- type: string
format: uuid
- type: 'null'
title: Filterid
- name: groupKeys
in: query
required: false
schema:
anyOf:
- type: string
- type: 'null'
title: Groupkeys
- name: rowGroupCols
in: query
required: false
schema:
anyOf:
- type: string
- type: 'null'
title: Rowgroupcols
- name: searchText
in: query
required: false
schema:
anyOf:
- type: string
maxLength: 200
- type: 'null'
title: Searchtext
- name: geometry
in: query
required: false
schema:
anyOf:
- type: string
- type: 'null'
title: Geometry
- name: favoritesOnly
in: query
required: false
schema:
anyOf:
- type: boolean
- type: 'null'
default: false
title: Favoritesonly
- name: format
in: query
required: false
schema:
anyOf:
- enum:
- csv
- xlsx
type: string
- type: 'null'
title: Format
- name: columns
in: query
required: false
schema:
anyOf:
- type: string
- type: 'null'
title: Columns
- name: includeReasoning
in: query
required: false
schema:
anyOf:
- type: boolean
- type: 'null'
default: false
title: Includereasoning
- name: includeProvenance
in: query
required: false
schema:
anyOf:
- type: boolean
- type: 'null'
default: true
title: Includeprovenance
- name: selectedContactFields
in: query
required: false
schema:
anyOf:
- type: string
- type: 'null'
title: Selectedcontactfields
- name: includeFavorites
in: query
required: false
schema:
anyOf:
- type: boolean
- type: 'null'
default: false
title: Includefavorites
responses:
'200':
description: Successful Response
content:
application/json:
schema: {}
'422':
description: Validation Error
content:
application/json:
schema:
$ref: '#/components/schemas/HTTPValidationError'
/api/v1/table/{layer_id}/feature/{feature_id}:
get:
tags:
- table
summary: Get Feature Detail
description: 'Full properties + GeoJSON geometry for a single feature.
Powers the feature detail panel and ``MapboxService.flyToFeature()``.
Enrichment wrappers always include ``reasoning`` and ``citations`` when
a sidecar row exists.'
operationId: get_feature_detail_api_v1_table__layer_id__feature__feature_id__get
security:
- FirebaseAuthMiddleware: []
parameters:
- name: feature_id
in: path
required: true
schema:
type: string
title: Feature Id
- name: token
in: query
required: false
schema:
anyOf:
- type: string
- type: 'null'
description: Firebase ID token for MVT authentication
title: Token
description: Firebase ID token for MVT authentication
responses:
'200':
description: Successful Response
content:
application/json:
schema:
$ref: '#/components/schemas/FeatureDetailResponse'
'422':
description: Validation Error
content:
application/json:
schema:
$ref: '#/components/schemas/HTTPValidationError'
/api/v1/table/{layer_id}/search:
get:
tags:
- table
summary: Search Layer Features
description: Case-insensitive substring search across feature display fields.
operationId: search_layer_features_api_v1_table__layer_id__search_get
security:
- FirebaseAuthMiddleware: []
parameters:
- name: q
in: query
required: true
schema:
type: string
minLength: 1
maxLength: 200
title: Q
- name: fields
in: query
required: false
schema:
anyOf:
- type: array
items:
type: string
- type: 'null'
title: Fields
- name: limit
in: query
required: false
schema:
type: integer
maximum: 200
minimum: 1
default: 50
title: Limit
- name: token
in: query
required: false
schema:
anyOf:
- type: string
- type: 'null'
description: Firebase ID token for MVT authentication
title: Token
description: Firebase ID token for MVT authentication
responses:
'200':
description: Successful Response
content:
application/json:
schema:
$ref: '#/components/schemas/FeatureSearchResponse'
'422':
description: Validation Error
content:
application/json:
schema:
$ref: '#/components/schemas/HTTPValidationError'
/api/v1/table/{layer_id}/features:
post:
tags:
- table
summary: Add Feature To Layer
description: Add a complete GeoJSON feature to a layer.
operationId: add_feature_to_layer_api_v1_table__layer_id__features_post
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/FeatureAddRequest'
required: true
responses:
'200':
description: Successful Response
content:
application/json:
schema:
$ref: '#/components/schemas/FeatureAddResponse'
'422':
description: Validation Error
content:
application/json:
schema:
$ref: '#/components/schemas/HTTPValidationError'
security:
- FirebaseAuthMiddleware: []
/api/v1/table/{project_id}/features/from-source:
post:
tags:
- table
summary: Create Layer From Feature
description: 'Create a new typed layer seeded with one Overture feature.
Used when a nearby-features add targets an Overture table (building/parcel/
place) with no layer in the project yet. Idempotent on the feature ref.'
operationId: create_layer_from_feature_api_v1_table__project_id__features_from_source_post
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/CreateLayerFromFeatureRequest'
required: true
responses:
'200':
description: Successful Response
content:
application/json:
schema:
$ref: '#/components/schemas/CreateLayerFromFeatureResponse'
'422':
description: Validation Error
content:
application/json:
schema:
$ref: '#/components/schemas/HTTPValidationError'
security:
- FirebaseAuthMiddleware: []
/api/v1/table/{project_id}/search/{lat}/{lng}:
get:
tags:
- table
summary: Search Feature
description: Find a feature by latitude, longitude, or address.
operationId: search_feature_api_v1_table__project_id__search__lat___lng__get
security:
- FirebaseAuthMiddleware: []
parameters:
- name: lat
in: path
required: true
schema:
type: number
title: Lat
- name: lng
in: path
required: true
schema:
type: number
title: Lng
responses:
'200':
description: Successful Response
content:
application/json:
schema:
$ref: '#/components/schemas/FindFeatureResponse'
'422':
description: Validation Error
content:
application/json:
schema:
$ref: '#/components/schemas/HTTPValidationError'
components:
schemas:
ValidationError:
properties:
loc:
items:
anyOf:
- type: string
- type: integer
type: array
title: Location
msg:
type: string
title: Message
type:
type: string
title: Error Type
input:
title: Input
ctx:
type: object
title: Context
type: object
required:
- loc
- msg
- type
title: ValidationError
FeatureAddRequest:
properties:
type:
type: string
enum:
- Point
- LineString
- Polygon
- MultiPoint
- MultiLineString
- MultiPolygon
title: Type
coordinates:
items: {}
type: array
title: Coordinates
properties:
additionalProperties: true
type: object
title: Properties
default: {}
layer_id:
type: string
format: uuid
title: Layer Id
source_feature_id:
anyOf:
- type: string
- type: 'null'
title: Source Feature Id
type: object
required:
- type
- coordinates
- layer_id
title: FeatureAddRequest
description: Lightweight request for adding GeoJSON features.
HTTPValidationError:
properties:
detail:
items:
$ref: '#/components/schemas/ValidationError'
type: array
title: Detail
type: object
title: HTTPValidationError
SourceTable:
type: string
enum:
- parcel
- building
- place
- address
title: SourceTable
description: 'The table a resolved feature lives in — what a caller pulls its data from,
and the feature''s kind. A text match in the ``address`` or ``place`` table
resolves (point-in-feature) to a ``parcel``/``building``; a ``parcel`` attribute
match resolves to the parcel itself.'
FeatureDetailResponse:
properties:
properties:
additionalProperties: true
type: object
title: Properties
geometry:
anyOf:
- additionalProperties: true
type: object
- type: 'null'
title: Geometry
enrichments:
additionalProperties:
$ref: '#/components/schemas/EnrichmentValueBaseModel'
type: object
title: Enrichments
type: object
required:
- properties
- geometry
title: FeatureDetailResponse
description: 'Full properties + GeoJSON geometry for a single feature.
Powers the feature detail panel and ``MapboxService.flyToFeature()``.
Base attributes live in ``properties``; enrichment wrappers live in
``enrichments``, keyed by enrichment UUID so consumers can look them up
by ``config.id`` without reconciling column names. The paginated
endpoint keeps column-name-keyed wrappers in row data for AG Grid SSR.'
FeatureSearchResponse:
properties:
results:
items:
$ref: '#/components/schemas/FeatureSearchResult'
type: array
title: Results
type: object
required:
- results
title: FeatureSearchResponse
description: Response for GET /table/{layer_id}/search.
FilteredIdsResponse:
properties:
ids:
items:
type: string
type: array
title: Ids
total:
type: integer
title: Total
type: object
required:
- ids
- total
title: FilteredIdsResponse
description: 'Feature ids matching the current filter set, plus the unfiltered total.
``total`` reflects the full match count even when ``limit`` truncates ``ids`` —
callers use it for "showing X of Y" UI and bulk-action sizing decisions.'
DistinctValuesResponse:
properties:
values:
items:
$ref: '#/components/schemas/DistinctValue'
type: array
title: Values
truncated:
type: boolean
title: Truncated
type: object
required:
- values
- truncated
title: DistinctValuesResponse
description: Respons
# --- truncated at 32 KB (48 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/maia-analytics/refs/heads/main/openapi/maia-analytics-table-api-openapi.yml