Database Connectors
Bring your own PostgreSQL, Supabase, MySQL, SQL Server, Oracle, or MongoDB database into Supero — sync data into a managed schema, or read it live without copying a single row.
Overview
- •PostgreSQL (including Supabase), MySQL, SQL Server (MSSQL), Oracle, and MongoDB source databases
- •Schema discovery: tables, views, columns, and primary keys are introspected automatically
- •AI-assisted schema inference from sampled rows, reviewed before you create anything
- •Sync mode (full CRUD copy) or live-read / live-read-write mode (no local copy)
- •Incremental sync via a cursor column, with configurable lookback for non-unique timestamps
- •Password auth, with cloud IAM and Oracle wallet options handled by the sync worker
ℹ️ Where this fits
Supported Engines
| db_type | Default Port | Notes |
|---|---|---|
| postgresql | 5432 | Native async connection. Default schema "public". |
| supabase | 5432 | PostgreSQL wire protocol with a Supabase-specific connection profile — see the Supabase section below. |
| mysql | 3306 | Native async connection. |
| mssql | 1433 | ODBC Driver 18 for SQL Server. Default schema "dbo". |
| oracle | 1521 (1522 for Autonomous DB over TLS) | Thin-mode client, no Oracle Client install needed. Sync only. |
| mongodb | 27017 | Native async driver, with table_names referring to collections. Sync only. |
ℹ️ Six of the twelve are not in the console picker today
Core Configuration Fields
| Field | Type | Notes |
|---|---|---|
| db_type | string | Required. One of the twelve values above. |
| host | string | Required for an OLTP source. Must resolve to a public, non-internal address — connections to loopback, link-local, private, or cloud-metadata ranges are blocked. |
| port | integer | Optional — defaults to the engine’s standard port. |
| database | string | Required. The database name (Oracle: often the service name). |
| schema | string | Optional. Defaults to "public" for PostgreSQL and Supabase, "dbo" for SQL Server, and the uppercased username for Oracle. |
| username | string | Required. |
| password | string | Required for password auth; optional for MongoDB sources that do not require authentication. |
| query_type | string | "table" (default) or "query". |
| table_names | array of strings | Required when query_type is "table". A list of table (or MongoDB collection) names — not a single table_name. |
| query | string | Required when query_type is "query". A single custom SELECT. |
| batch_size | integer | Rows fetched per batch. Default 1000. The config type allows 100 to 100000; the service clamps the effective value to between 1 and 10000. |
| connection_timeout | integer | Seconds. Default 30. |
| query_timeout | integer | Seconds. Default 3600. |
| ssl_mode | string | See the TLS section below. Default "require". |
| incremental | object | See Incremental Sync below. Passed through to the plugin as-is. |
⚠️ table_names, not table_name
Custom query mode
{
"db_type": "mysql",
"host": "mysql.example.com",
"port": 3306,
"database": "app",
"username": "reader",
"password": "REDACTED",
"query_type": "query",
"query": "SELECT * FROM orders WHERE status = 'completed'",
"batch_size": 5000
}Table mode
{
"db_type": "postgresql",
"host": "db.example.com",
"port": 5432,
"database": "analytics",
"schema": "public",
"username": "reader",
"password": "REDACTED",
"query_type": "table",
"table_names": ["customers", "orders"],
"ssl_mode": "require"
}Creating a Connector
curl -X POST https://api.supero.dev/api/v1/connectors \
-H "X-API-Key: ak_your_api_key" \
-H "Content-Type: application/json" \
-d '{
"name": "billing-postgres",
"display_name": "Billing Postgres",
"project_uuid": "PROJECT_UUID",
"source": {
"plugin": "database",
"config": {
"db_type": "postgresql",
"host": "db.example.com",
"port": 5432,
"database": "billing",
"schema": "public",
"username": "reader",
"password": "REDACTED",
"query_type": "table",
"table_names": ["customers", "invoices"],
"ssl_mode": "require"
}
},
"target": {
"namespace": "billing",
"tables": [
{ "source": "customers", "schema": "Customer", "operation": "upsert", "mode": "sync" },
{ "source": "invoices", "schema": "Invoice", "operation": "upsert", "mode": "sync" }
]
},
"trigger": {
"type": "schedule",
"cron": "0 * * * *",
"timezone": "UTC",
"allow_manual": true
}
}'ℹ️ The create response comes back with null source, target, and trigger
Managing the connector
| Method & Path | Purpose |
|---|---|
| POST /api/v1/connectors | Create a connector |
| GET /api/v1/connectors | List connectors (add ?include_stats=true for run stats) |
| GET /api/v1/connectors/{id} | Get one connector |
| PUT /api/v1/connectors/{id} | Full update — the only update method. PATCH is not routed and returns 405. |
| DELETE /api/v1/connectors/{id} | Delete a connector — see the warning below |
| POST /api/v1/connectors/{id}/enable | Enable |
| POST /api/v1/connectors/{id}/disable | Disable |
| POST /api/v1/connectors/{id}/run | Trigger a run. Body { "full_sync": true } ignores the incremental watermark. Needs the connector enabled and trigger.allow_manual not false. |
| POST /api/v1/connectors/{id}/runs/{execution_id}/cancel | Best-effort cancel of a running execution |
| GET /api/v1/connectors/{id}/status | Status plus recent execution history |
| POST /api/v1/connectors/{id}/test | Re-test a saved connector using its stored credentials |
🚨 Deleting a connector also deletes its object types
⚠️ A config you read back cannot be re-tested
Authentication
ℹ️ These fields are not part of the published database config type
| auth_type | Behavior |
|---|---|
| password | Default. Username and password from config. |
| iam_rds | AWS RDS IAM auth token — generates a short-lived token in place of a static password. Requires IAM auth enabled on the RDS instance. aws_region defaults to us-east-1. |
| iam_gcp | GCP Cloud SQL IAM auth — uses Application Default Credentials to mint an access token. Requires Cloud SQL IAM auth enabled on the instance. |
| iam_azure | Azure AD auth token for Azure Database for PostgreSQL/MySQL. Requires Azure AD auth enabled on the server; optional azure_tenant_id. |
Oracle: wallet and TCPS
| Field | Purpose |
|---|---|
| service_name / sid | Oracle service name (Autonomous Database) or SID (on-prem) to build the connect string. |
| use_tcps | Force TLS (TCPS) explicitly; also inferred automatically for oraclecloud.com hosts. |
| wallet_b64 | Base64-encoded Oracle wallet ZIP for mutual TLS — Autonomous Database’s default posture. Supplying a wallet implies TLS. |
| wallet_password | Password to decrypt the wallet, if the wallet requires one. |
| tns_alias | Alias to resolve via the wallet’s tnsnames.ora instead of building a DSN from host, port, and service. |
⚠️ Autonomous Database needs a wallet
Supabase
| Setting | Use |
|---|---|
| host | The session pooler: aws-0-<region>.pooler.supabase.com |
| port | 5432. Do not use 6543 — the transaction pooler rejects the login. |
| username | postgres.<project_ref> |
| project_ref | Your Supabase project reference, set as its own config field |
| schema | Defaults to "public" |
⚠️ Two Supabase hostnames do not work
⚠️ Row-level security does not apply
TLS (ssl_mode)
| ssl_mode | Behavior |
|---|---|
| disable | Plaintext connection. No encryption. |
| require | Default. Encrypts the connection but does not verify the server certificate — needed for most hosted providers whose certificates do not chain to a standard CA bundle. |
| prefer / allow | Attempts encryption first; falls back to plaintext only if the server genuinely refuses TLS. |
| verify-ca | Encrypts and verifies the server certificate against a CA (supply ssl_ca_cert), without checking the hostname. |
| verify-full | Encrypts, verifies the CA, and verifies the hostname matches the certificate. The strictest mode. |
💡 Managed Postgres/MySQL providers
Sync vs. Live Read
| mode | What happens | Writes |
|---|---|---|
| sync (default) | Rows are copied into a Supero-managed local schema on the configured trigger. Reads and writes hit the local copy. | Full CRUD against the local copy |
| live_read | No local copy. Every read goes straight to the source database in real time. | Blocked — 403 on every write |
| live_readwrite | No local copy. Reads are real-time from the source, and writes are passed through to the source. | Passed through to the source database |
⚠️ Live modes are not available on every engine
⚠️ A live table needs a confirmed binding
Incremental Sync
🚨 mode is the switch, and nothing warns you if it is missing
{
"db_type": "postgresql",
"host": "db.example.com",
"database": "app",
"username": "reader",
"password": "REDACTED",
"query_type": "table",
"table_names": ["orders"],
"incremental": {
"mode": "incremental",
"cursor_column": "updated_at",
"cursor_type": "datetime",
"cursor_order": "asc",
"lookback_seconds": 5
}
}| Field | Purpose |
|---|---|
| mode | Required, and must be the exact string "incremental". This is the switch. Any other value — including omitting it while setting enabled: true — makes the run a full sync with no error and no warning. |
| enabled | Legacy flag, retained for compatibility. It does not turn incremental on by itself — mode does. |
| cursor_column | Required. The column to track — must be strictly increasing (or decreasing) for accuracy. On an http_api source the same field is named cursor_field. |
| cursor_type | How to compare cursor values — "datetime" for a timestamp column, "integer" for a sequence, "string" for anything else. The worker also understands decimal, number, numeric, float, double, and real. An unrecognised spelling is not rejected: it is treated as opaque, meaning any change counts as an advance. |
| cursor_order | "asc" (default) or "desc". |
| cursor_initial_value | Optional starting watermark for the very first run. |
| lookback_seconds | Optional overlap window re-pulled before the stored watermark, so rows sharing the same second as the watermark are not dropped. A small default overlap is applied automatically for timestamp cursors when this is left unset; pass 0 explicitly to opt out. |
ℹ️ There is no watermark view in the console today
💡 Pick a cursor column carefully
Discovery
curl -X POST https://api.supero.dev/api/v1/connectors/CONNECTOR_ID/discover \
-H "X-API-Key: ak_your_api_key" \
-H "Content-Type: application/json" \
-d '{ "streams": ["orders"], "sample_limit": 100, "timeout_seconds": 300, "infer_from": "samples" }'| Method & Path | Purpose |
|---|---|
| GET /api/v1/connectors/{id}/discover/{execution_id} | Poll discovery progress |
| GET /api/v1/connectors/{id}/discover/{execution_id}/results | Discovered streams, inferred schemas, field mappings, warnings, and (optionally) sample rows |
⚠️ Sampled discovery is capped at 100 tables per run
SQL Server and Oracle Notes
⚠️ SQL Server sync is less exercised than its discovery path
MongoDB Notes
| Field | Purpose |
|---|---|
| auth_source | Authentication database. Defaults to "admin". |
| replica_set | Optional replica set name for a replica-set deployment. |
⚠️ MongoDB is sync-only
Next Steps
- •Connectors Overview — the supported-sources matrix, the console walkthrough, and the full control-plane API
- •Live Data, Read-Only & Security — how read-only, tenant isolation, and credential handling are enforced on the live path
- •Warehouse Connectors — the six analytical db_type values and their cost controls
- •Connect Your Database — a worked end-to-end example
- •Schema Design — how the tables and columns discovery finds map onto Supero’s field and reference model
On this page