API: Data Sources
Create, test, and sync connections. All endpoints require authentication unless noted. 28 endpoints.
GET /api/sources
Section titled “GET /api/sources”List data sources
Responses: 200 · 400 · 401
POST /api/sources
Section titled “POST /api/sources”Create a new data source
Request body (JSON)
| Field | Type | Required | Description |
|---|---|---|---|
name |
string | yes | |
type |
"postgresql" | "redshift" | "cockroachdb" | "timescaledb" | "greenplum" | "yugabytedb" | "risingwave" | "questdb" | "hologres" | "neon" | "supabase" | "alloydb" | "materialize" | "azure_postgres" | "rds_postgres" | "cloudsql_postgres" | "mysql" | "mariadb" | "tidb" | "singlestore" | "starrocks" | "doris" | "oceanbase" | "planetscale" | "azure_mysql" | "rds_mysql" | "cloudsql_mysql" | "mssql" | "azure_sql" | "azure_synapse" | "fabric_warehouse" | "snowflake" | "bigquery" | "s3" | "azure_blob" | "adls_gen2" | "gcs" | "sftp" | "webhook" | "salesforce" | "hubspot" | "stripe" | "ga4" | "shopify" | "jira" | "clickhouse" | "oracle" | "ibm_db2" | "trino" | "presto" | "starburst" | "elasticsearch" | "opensearch" | "druid" | "databend" | "cratedb" | "tinybird" | "dremio" | "pinot" | "drill" | "sap_hana" | "exasol" | "vertica" | "amazon_athena" | "databricks" | "duckdb" | "motherduck" |
yes | |
config |
object | yes |
Responses: 201 · 400 · 401 · 409
GET /api/sources/{id}
Section titled “GET /api/sources/{id}”Get data source by ID
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
id |
string | yes |
Responses: 200 · 400 · 401 · 404
PUT /api/sources/{id}
Section titled “PUT /api/sources/{id}”Update a data source
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
id |
string | yes |
Request body (JSON)
| Field | Type | Required | Description |
|---|---|---|---|
name |
string | no | |
type |
"postgresql" | "redshift" | "cockroachdb" | "timescaledb" | "greenplum" | "yugabytedb" | "risingwave" | "questdb" | "hologres" | "neon" | "supabase" | "alloydb" | "materialize" | "azure_postgres" | "rds_postgres" | "cloudsql_postgres" | "mysql" | "mariadb" | "tidb" | "singlestore" | "starrocks" | "doris" | "oceanbase" | "planetscale" | "azure_mysql" | "rds_mysql" | "cloudsql_mysql" | "mssql" | "azure_sql" | "azure_synapse" | "fabric_warehouse" | "snowflake" | "bigquery" | "s3" | "azure_blob" | "adls_gen2" | "gcs" | "sftp" | "webhook" | "salesforce" | "hubspot" | "stripe" | "ga4" | "shopify" | "jira" | "clickhouse" | "oracle" | "ibm_db2" | "trino" | "presto" | "starburst" | "elasticsearch" | "opensearch" | "druid" | "databend" | "cratedb" | "tinybird" | "dremio" | "pinot" | "drill" | "sap_hana" | "exasol" | "vertica" | "amazon_athena" | "databricks" | "duckdb" | "motherduck" |
no | |
config |
object | no |
Responses: 200 · 400 · 401 · 404
DELETE /api/sources/{id}
Section titled “DELETE /api/sources/{id}”Delete a data source
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
id |
string | yes |
Responses: 204 — No content · 401 · 404
POST /api/sources/{id}/discover
Section titled “POST /api/sources/{id}/discover”Start async schema discovery (returns jobId to poll)
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
id |
string | yes |
Responses: 202 · 400 · 401
GET /api/sources/{id}/discover/{jobId}
Section titled “GET /api/sources/{id}/discover/{jobId}”Poll schema discovery job status
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
id |
string | yes | |
jobId |
string | yes |
Responses: 200 · 400 · 401 · 404
GET /api/sources/{id}/objects
Section titled “GET /api/sources/{id}/objects”List objects in a registered object store (importable ones flagged)
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
id |
string | yes |
Query parameters
| Name | Type | Required | Description |
|---|---|---|---|
prefix |
string | no | |
limit |
integer | no |
Responses: 200
POST /api/sources/{id}/resync
Section titled “POST /api/sources/{id}/resync”Re-pull a staged source now (atomic table swap)
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
id |
string | yes |
Responses: 200 · 400 · 401 · 404
GET /api/sources/{id}/schemas
Section titled “GET /api/sources/{id}/schemas”List discovered schemas for a data source
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
id |
string | yes |
Responses: 200 · 400 · 401
GET /api/sources/{id}/schemas/{schema}/tables
Section titled “GET /api/sources/{id}/schemas/{schema}/tables”List tables for a discovered schema
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
id |
string | yes | |
schema |
string | yes |
Responses: 200 · 400 · 401
GET /api/sources/{id}/schemas/{schema}/tables/{table}/columns
Section titled “GET /api/sources/{id}/schemas/{schema}/tables/{table}/columns”List columns for a discovered table
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
id |
string | yes | |
schema |
string | yes | |
table |
string | yes |
Responses: 200 · 400 · 401 · 404
GET /api/sources/{id}/sync-logs
Section titled “GET /api/sources/{id}/sync-logs”Get schema sync history
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
id |
string | yes |
Query parameters
| Name | Type | Required | Description |
|---|---|---|---|
limit |
integer | no | |
offset |
integer | no |
Responses: 200 · 400 · 401
GET /api/sources/{id}/sync-runs
Section titled “GET /api/sources/{id}/sync-runs”Re-sync run history
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
id |
string | yes |
Query parameters
| Name | Type | Required | Description |
|---|---|---|---|
limit |
integer | no | |
offset |
integer | no |
Responses: 200 · 400 · 401
PUT /api/sources/{id}/sync-schedule
Section titled “PUT /api/sources/{id}/sync-schedule”Schedule automatic re-sync (hourly/daily/weekly; null clears)
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
id |
string | yes |
Request body (JSON)
| Field | Type | Required | Description |
|---|---|---|---|
schedule |
"hourly" | "daily" | "weekly" |
yes |
Responses: 200 · 400 · 401 · 404
POST /api/sources/{id}/sync-trigger
Section titled “POST /api/sources/{id}/sync-trigger”Signed inbound refresh trigger (no auth — HMAC verified)
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
id |
string | yes |
Responses: 200 · 400 · 401 · 404
PUT /api/sources/{id}/sync-trigger
Section titled “PUT /api/sources/{id}/sync-trigger”Enable/disable the signed inbound refresh trigger
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
id |
string | yes |
Request body (JSON)
| Field | Type | Required | Description |
|---|---|---|---|
enabled |
boolean | yes |
Responses: 200 · 400 · 401 · 404
POST /api/sources/{id}/test
Section titled “POST /api/sources/{id}/test”Test a saved data source connection
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
id |
string | yes |
Responses: 200 · 400 · 401 · 404
POST /api/sources/import-object
Section titled “POST /api/sources/import-object”Import one object from a store into a staged, queryable data source
Request body (JSON)
| Field | Type | Required | Description |
|---|---|---|---|
name |
string | yes | |
sourceId |
string | yes | |
key |
string | yes | |
recordsPath |
string | no |
Responses: 201 · 400 · 401 · 409
POST /api/sources/import-object-prefix
Section titled “POST /api/sources/import-object-prefix”Import every object under a prefix as one staged, queryable data source
Request body (JSON)
| Field | Type | Required | Description |
|---|---|---|---|
name |
string | yes | |
sourceId |
string | yes | |
prefix |
string | yes | |
recordsPath |
string | no |
Responses: 201 · 400 · 401 · 409
POST /api/sources/ingest-google-sheets
Section titled “POST /api/sources/ingest-google-sheets”Create a data source from a Google Sheet
Request body (JSON)
| Field | Type | Required | Description |
|---|---|---|---|
name |
string | yes | |
spreadsheetId |
string | yes | |
credentials |
string | yes |
Responses: 201 · 400 · 401 · 409
POST /api/sources/ingest-rest
Section titled “POST /api/sources/ingest-rest”Create a data source from a JSON REST endpoint
Request body (JSON)
| Field | Type | Required | Description |
|---|---|---|---|
name |
string | yes | |
url |
string | yes | |
headers |
object | no | |
recordsPath |
string | no | |
tableName |
string | no |
Responses: 201 · 400 · 401 · 409
POST /api/sources/test
Section titled “POST /api/sources/test”Test a data source connection
Request body (JSON)
| Field | Type | Required | Description |
|---|---|---|---|
type |
"postgresql" | "redshift" | "cockroachdb" | "timescaledb" | "greenplum" | "yugabytedb" | "risingwave" | "questdb" | "hologres" | "neon" | "supabase" | "alloydb" | "materialize" | "azure_postgres" | "rds_postgres" | "cloudsql_postgres" | "mysql" | "mariadb" | "tidb" | "singlestore" | "starrocks" | "doris" | "oceanbase" | "planetscale" | "azure_mysql" | "rds_mysql" | "cloudsql_mysql" | "mssql" | "azure_sql" | "azure_synapse" | "fabric_warehouse" | "snowflake" | "bigquery" | "s3" | "azure_blob" | "adls_gen2" | "gcs" | "sftp" | "webhook" | "salesforce" | "hubspot" | "stripe" | "ga4" | "shopify" | "jira" | "clickhouse" | "oracle" | "ibm_db2" | "trino" | "presto" | "starburst" | "elasticsearch" | "opensearch" | "druid" | "databend" | "cratedb" | "tinybird" | "dremio" | "pinot" | "drill" | "sap_hana" | "exasol" | "vertica" | "amazon_athena" | "databricks" | "duckdb" | "motherduck" |
yes | |
host |
string | no | |
port |
integer | no | |
database |
string | no | |
user |
string | no | |
username |
string | no | |
password |
string | no | |
encrypt |
boolean | no | |
trustServerCertificate |
boolean | no | |
account |
string | no | |
warehouse |
string | no | |
role |
string | no | |
schema |
string | no | |
httpPath |
string | no | |
token |
string | no | |
catalog |
string | no | |
projectId |
string | no | |
credentials |
string | no | |
location |
string | no | |
dataset |
string | no |
Responses: 200 · 400 · 401 · 404
POST /api/sources/upload
Section titled “POST /api/sources/upload”Create a data source by uploading a CSV file
Multipart form with a file (CSV) and a name field. The file’s rows are loaded into a managed staging table and registered as a ‘csv’ data source.
Responses: 201 · 400 · 401 · 409
POST /api/sources/upload-excel
Section titled “POST /api/sources/upload-excel”Create a data source by uploading an Excel (.xlsx) workbook
Multipart form with a file (.xlsx) and a name field. Every non-empty sheet is loaded into a per-source staging schema and registered as an ‘excel’ data source.
Responses: 201 · 400 · 401 · 409
POST /api/sources/upload-json
Section titled “POST /api/sources/upload-json”Create a data source by uploading a JSON/NDJSON file
Multipart form with a file (.json/.ndjson), a name field, and an optional recordsPath (dot path to the record array). Staged as one ‘json_file’ data source.
Responses: 201 · 400 · 401 · 409
POST /api/sources/upload-parquet
Section titled “POST /api/sources/upload-parquet”Create a data source by uploading a Parquet (.parquet) file
Multipart form with a file (.parquet) and a name field. The file is decoded in memory and staged as one table registered as a ‘parquet’ data source.
Responses: 201 · 400 · 401 · 409
POST /api/sources/upload-sqlite
Section titled “POST /api/sources/upload-sqlite”Create a data source by uploading a SQLite database file
Multipart form with a file (.sqlite/.db) and a name field. Every table in the file is loaded into a per-source staging schema and registered as a ‘sqlite’ data source.
Responses: 201 · 400 · 401 · 409