The same governed front, with the vendor's own driver behind it
QueryAPIGate loads the vendor's JDBC driver into a JVM in its own process, so nothing is installed on the database. Keys, limits, quotas, caching and audit work as for any connection. Where it can't check something on JDBC (column masking, table allow-lists), it refuses the caller rather than serving them unfiltered. The database user you give it, read-only, is the real safeguard.
pool · idle connections kept and reusedClasspath fixed when the JVM starts: a new jar needs a restart.Columns come back as the driver names them: PO_ID.
erp-db.internal:1521/ERPuser api_readonly · SELECT onlythe real safeguard
PURCHASE_ORDERSSUPPLIERSINVOICESGL_ENTRIES
statement timeout · set it hereOr SQL Server, DB2, Snowflake: any database with a JDBC driver.
On a jdbc connectionwhere it can't check, it refuses
Refused, never weakenedmask rules → 403 mask_unresolvableallowed_tables → 403 table_check_unsupportedschema browser → 400 unsupported_operationYours to seta database user that can only reada statement timeout in the database
Expmay change in a minor releaseTested in CI with H2's driver standing in for a vendor. The full comparison is in the support matrix →
Who asksApps, partners, analystsThe same keys, limits and quotas as on any connection.
↓
The governed coreGrant → SQL guard → maskingA write is refused. A caller with mask rules is refused too: on JDBC masking can't be traced, so nothing is served unmasked.
↓
An embedded JVM ExpThe vendor's own driverA jar, its class and a JDBC URL, in the server's process. A new jar needs a restart.
↓
The database you don't changeNothing installed on itGive it a user that can only read, and a statement timeout of its own.
↓
Refused, or yours to setMasking, table allow-lists, schema browsing: refusedA read-only user and a statement timeout: set in the database.
whokey procurementdoorGET /q/open_purchase_ordersvendor's driver via JDBC ✓database user read-only ✓fails closed where it can't check ✓dataOracle · erp (jdbc)
For legacy and vendor databasesEXPERIMENTAL
Put a governed API in front of a database you can't change
The core system runs on Oracle, SQL Server or DB2, and nobody wants to touch it. Generic JDBC loads the vendor's own driver, so that data can be served through saved queries with the same keys, limits, quotas and audit as any other connection.
✓A jdbc connection takes the vendor's driver .jar, its driver class and a JDBC URL. Run the image's -h2 variant, which includes Java.
✓Saved queries, grants, rate limits, quotas, caching, run history and the audit log work as on every other connection. Column masking and table allow-lists can't be checked on JDBC, so a caller with them is refused, never served unfiltered.
✓Known limits, verified: no query time limit (set one in the database), and no table allow-lists or schema browser on JDBC connections.
✓Experimental: CI tests JDBC with H2's driver standing in for a vendor. Connect with a database user that can only read.
The example APIs ship with a generated database and one scoped key per scenario, so you can try each of these in a few minutes without connecting anything of your own.