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.
Every API here is available over the APIs.io API and to AI agents over MCP.
One button, every client — Claude, Cursor, VS Code and the rest.
https://apis.io/mcp
find_apisBrowse and filter every API in the catalog.get_api_artifactsOne API's artifacts, grouped by type.get_openapiThe primary OpenAPI for this API.find_similar_apisAPIs that look like this one.apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.resolveTurn a domain, URL or GitHub org into the provider it belongs to.find_cohortsEvery scored population of providers in the catalog.curl "https://apis.io/api/v1/apis/maia-analytics-table-api"
curl "https://apis.io/api/v1/apis?limit=25"
Discovery needs no key. Ratings and market analysis are Pro.
Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.
A second provider on the same verified email joins the account you already have.
openapi: 3.2.0
info:
title: MAIA Ah Table API
description: API for MAIA application (migrated from Firebase)
version: 0.1.0
servers:
- url: https://api.maia-analytics.com
description: Base URL declared by the provider in apis.yml (roadmap#122).
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:
FeatureSearchResult:
properties:
featureId:
type: string
title: Featureid
name:
anyOf:
- type: string
- type: 'null'
title: Name
owner:
anyOf:
- type: string
- type: 'null'
title: Owner
address:
anyOf:
- type: string
- type: 'null'
title: Address
parcelnumb:
anyOf:
- type: string
- type: 'null'
title: Parcelnumb
matchField:
type: string
title: Matchfield
type: object
required:
- featureId
- matchField
title: FeatureSearchResult
description: A single hit from GET /table/{layer_id}/search.
CreateLayerFromFeatureResponse:
properties:
layer_id:
type: string
format: uuid
title: Layer Id
layer_name:
type: string
title: Layer Name
type: object
required:
- layer_id
- layer_name
title: CreateLayerFromFeatureResponse
description: 'Response for creating a new typed layer seeded with one Overture feature.
Returned when the user adds a nearby feature whose Overture table has no
layer in the project yet; the client uses ``layer_id`` to focus/refresh the
newly created layer.'
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.
FeatureAddResponse:
properties:
success:
type: boolean
title: Success
data_version:
anyOf:
- type: integer
- type: 'null'
title: Data Version
feature_id:
anyOf:
- type: string
- type: 'null'
title: Feature Id
type: object
required:
- success
title: FeatureAddResponse
description: 'Response model for adding a feature.
``data_version`` is the layer''s new version after a successful add (bumped
in the same transaction). None on failure since a failed create does not
bump. The FE uses this to rotate the tile URL''s ``?v=``.'
ColumnDetail:
properties:
name:
type: string
title: Name
pg_type:
type: string
title: Pg Type
type:
type: string
title: Type
source:
type: string
enum:
- base
- enrichment
- agent
title: Source
display_name:
anyOf:
- type: string
- type: 'null'
title: Display Name
description:
anyOf:
- type: string
- type: 'null'
title: Description
categorical_options:
anyOf:
- items:
additionalProperties: true
type: object
type: array
- type: 'null'
title: Categorical Options
stats:
$ref: '#/components/schemas/ColumnStats'
enrichment:
anyOf:
- $ref: '#/components/schemas/EnrichmentColumnConfig'
- type: 'null'
unit:
anyOf:
- type: string
- type: 'null'
title: Unit
type: object
required:
- name
- pg_type
- type
- source
- stats
title: ColumnDetail
description: Rich per-column metada
# --- 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