Providers and table configuration
A base names a data source and its credentials; a table inside it names one dataset and what to do with it. Both can be created through the REST API or managed in the UI.
Base configuration
Section titled “Base configuration”Common to every base:
| Key | Meaning |
|---|---|
baseId |
The external id. Airtable’s appXXXXXXXX, or a slug you choose |
name |
Display name |
provider |
One of the providers below |
tables |
The tables to sync. Omit for providers that discover them |
cacheHours |
Overrides the global freshness window for this base |
providerConfig |
Provider-specific settings |
public |
Readable without credentials |
orgId |
Owning organization |
activityRetentionDays |
History window; null inherits the org’s, 0 keeps forever |
airtable
Section titled “airtable”{ "baseId": "appXXXXXXXX", "provider": "airtable", "apiKey": "pat…", "airtableUrl": "https://api.airtable.com" }Personal access token or OAuth. Supports webhooks for near-real-time updates, and attachments in both directions. Schema (including single/multi-select options and field types) is read from Airtable’s meta API and surfaced as Esri field metadata.
nocodb
Section titled “nocodb”{ "baseId": "my-project", "provider": "nocodb", "apiKey": "…", "nocodbUrl": "https://app.nocodb.com" }A deployment can set an instance-wide URL and key as fallbacks when a base doesn’t set its own. Webhooks supported; attachments are read-only.
postgres / postgis
Section titled “postgres / postgis”{ "baseId": "warehouse", "provider": "postgis", "host": "db.internal", "port": 5432, "database": "gis", "user": "reader", "password": "…", "providerConfig": { "schema": "public" } }connectionString is accepted in place of the individual host/port/database/user/password
keys. Reads tables and views. postgis adds native geometry — and serves
vector tiles directly from the database with ST_AsMVT, per tile,
rather than building them from a cached copy.
Schema discovery accepts * or a list, in which case tables are registered as
schema.table. Clients may still address one by its bare name when that’s unambiguous.
Both providers have real transactions, which is why they’re the only ones where table- and base-wide rollback can be written back.
{ "baseId": "reporting", "provider": "mssql", "server": "sql.internal", "database": "reporting", "user": "reader", "password": "…", "options": { "encrypt": true, "trustServerCertificate": false } }MS SQL Server, with schema introspection. Geometry via WKB/WKT.
{ "baseId": "open-data", "provider": "fetch", "fetchUrl": "https://example.org/sites.geojson" }Any HTTP endpoint returning GeoJSON or CSV. Read-only — a mirror, not a two-way sync.
A purpose-built adapter for TSIP. Read-only.
Table configuration
Section titled “Table configuration”| Key | Meaning |
|---|---|
name |
Table name — becomes the layer name and the URL segment |
strategy |
What to do with the data (below). Required |
enabled |
Set false to keep the config but skip the table |
format |
geojson (default), csv, or json |
cacheHours |
Per-table freshness override |
provider, providerConfig |
Override the base’s provider for this table |
tableId |
The provider’s own table id, when it differs from the name |
Geometry
Section titled “Geometry”| Key | Meaning |
|---|---|
geometryType |
Point, PolyLine, Polygon, Multi |
geometryField |
A column holding WKT/WKB/GeoJSON geometry |
latitudeField / longitudeField |
Build point geometry from two numeric columns |
spatialReference |
EPSG code of the source coordinates |
A table with no geometry is still served — as a non-spatial table layer, queryable and joinable. A snapshot can supply geometry for one without editing the table config.
Where coordinates need to come from an address or a name, geometryServiceUrl and its
companions (geometryServiceParams, geometryServiceIdField, geometryServiceField,
geometryServiceSourceField) point at a service that resolves them.
Identity and display
Section titled “Identity and display”| Key | Meaning |
|---|---|
idField |
The provider’s stable record key. Drives OBJECTID derivation and the activity log |
displayField |
The field Esri clients use as a label |
typeField |
Subtype/category field |
Relationships
Section titled “Relationships”relations publishes ArcGIS relationships between tables in the same base:
{ "relations": [ { "targetTable": "Regions", "sourceField": "RegionId", "targetField": "Id", "relationType": "one-to-many" }] }one-to-one, one-to-many and many-to-many (via intermediaryTableName) are supported.
Strategies
Section titled “Strategies”| Strategy | Extra keys | What it does |
|---|---|---|
cache |
cacheHours |
Write the GeoJSON to disk. What every read endpoint needs |
publish |
idField, displayField, serviceItemId, apiKey, sharing, sync |
Diff against a hosted ArcGIS feature service and apply adds/updates/deletes |
upload |
— | Bulk-replace an ArcGIS feature service instead of diffing it |
data-pipeline |
geometryType, apiKey, sharing, sync |
Transform on the way through — CSV cleanup, field mapping, geometry derivation |
join |
joinField, tableJoinField |
Merge several sources into one table |
layer |
idField, layerId, sync |
Create and manage one layer of a multi-layer service |
Strategies are mutually exclusive — a table has exactly one.
Publishing to ArcGIS
Section titled “Publishing to ArcGIS”publish is the heaviest of them: it fetches the target service’s current features, computes
the difference against the freshly synced data, and applies only what changed, so an unchanged
sync costs nothing. It needs ArcGIS credentials — AGOL_PORTAL_URL, AGOL_USERNAME and
AGOL_PASSWORD, or per-table apiKey.
In CACHE_ONLY mode the outbound strategies (publish, upload, data-pipeline) are quietly
downgraded to a plain cache, so an instance pointed at production credentials can be run
safely without touching anything.