psql, BI tools, notebooks, database drivers — can connect to Lightdash and query your metrics and dimensions with SQL.
Your explores are exposed as tables, and their dimensions and metrics as columns. When you run a query, Lightdash compiles it through the semantic layer, so metric calculations, joins, and access controls are handled for you — you get the same numbers as in the Lightdash UI.
The Metrics SQL API is currently in beta and only available on Lightdash Enterprise plans. It’s disabled by default and must be enabled for your organization by an admin.For more information on our plans, visit our pricing page.
Connect
You can find copy-paste connection details in your project settings under Semantic Layer API. Connect with any Postgres-compatible client using:
As a connection URI:
How queries work
- Tables are explores. Each explore in your project appears as a table, and
FROMtakes a single explore. Fields from tables joined in the explore are included as columns — joins are defined in the semantic layer, not in your SQL. - Columns are field IDs. Dimensions and metrics use their Lightdash field IDs, e.g.
orders_status,orders_total_order_amount. - Metrics are pre-aggregated. Select a metric like any other column and Lightdash computes the aggregation for you.
GROUP BYis optional — results are implicitly grouped by the dimensions you select. If you do write one, it’s validated against yourSELECTlist. - Results are limited to 500 rows by default. Add a
LIMITto override it.
WHERE (=, !=, <, <=, >, >=, IN, LIKE/ILIKE, BETWEEN, IS NULL, AND/OR), HAVING, ORDER BY, LIMIT, and calculated expressions in the SELECT list (arithmetic, functions, CASE, and window functions).
Examples
Discover explores and fields
The catalog is exposed throughinformation_schema. The field_type column on information_schema.columns tells you whether a field is a dimension or a metric:
Query a metric by a dimension
Select the dimensions and metrics you want — noGROUP BY or aggregate functions needed:
Filter and limit
Calculated expressions
Combine metrics and dimensions with expressions in theSELECT list, like table calculations in the Lightdash UI:
Query from Python
Because the interface speaks the Postgres wire protocol, existing Postgres drivers work:Self-hosting
If you self-host Lightdash, the Metrics SQL API server is disabled until you set thePGWIRE_PORT environment variable. TLS is required by default, so you also need to provide a certificate and key (PEM format) for the hostname clients connect to:
PGWIRE_PORT is set without certificate paths and without PGWIRE_SSL_MODE=disabled, Lightdash fails fast at boot with a config error — this is intentional, so a misconfigured deployment can’t accidentally accept Lightdash tokens in plaintext.
- If your certificate is from a public CA (e.g. Let’s Encrypt), clients can use
sslmode=requireorverify-full. - If you use a private CA or a self-signed certificate, clients either pass the CA with
sslrootcert=/path/to/ca.pemfor verification, or usesslmode=require(encrypted, but the server identity isn’t verified).
cert-manager renewals apply without a restart. A failed reload keeps the previously loaded certificate in place and logs an error.
The server starts a separate TCP listener on that port, so you’ll also need to expose it through your load balancer or network configuration alongside the main Lightdash port. It requires a valid LIGHTDASH_LICENSE_KEY — see Enterprise License Keys.
Rejecting plaintext clients
With TLS required (the default), a client that connects withsslmode=disable is rejected before authentication — no password is ever prompted for, so Lightdash tokens cannot be leaked over cleartext:
sslmode=require (or stronger) to fix this.
Limitations
- No explicit joins, subqueries, or CTEs. Queries select from a single explore; joins are defined in the semantic layer.
- No DML. The API is read-only —
SELECTqueries only. - No custom metrics or period-over-period comparisons.
- Simple query protocol only. Prepared statements and bind parameters (the extended query protocol) aren’t supported.
psqland drivers sending plain-text queries work; some GUI tools won’t. - No
pg_catalogemulation. Schema browsers in GUI clients (e.g. DBeaver) won’t populate their sidebar — queryinformation_schema.tablesandinformation_schema.columnsinstead.
Using sslmode=verify-full
Using sslmode=verify-full
sslmode=require encrypts the connection; verify-full additionally verifies the server’s certificate and hostname, protecting against impersonation. On Lightdash Cloud the certificate is publicly trusted (Let’s Encrypt), but some Postgres clients don’t check the system trust store by default:- psql / psycopg (libpq 16+): add
sslrootcert=systemto use the OS trust store. On older libpq, pointsslrootcertat your system CA bundle (e.g./etc/ssl/certs/ca-certificates.crt). - JDBC (DBeaver, DataGrip): add
sslfactory=org.postgresql.ssl.DefaultJavaSSLFactoryto use Java’s built-in trust store. - node-postgres, Go, Rust, .NET: use the runtime’s trust store natively — no extra configuration.