Identity
Scoped API keys, reusable roles, named administrators with owner, admin, developer and auditor roles. App users by JWT / JWKS.
Write the SQL once. QueryAPIGate publishes it as a REST endpoint, an MCP tool for AI agents, a live event stream and a scheduled export. Each call checks who is asking and what they may see, and leaves a record.
PostgreSQL, MySQL, SQLite, DuckDB, ClickHouse and MongoDB are Tier 1: under the compatibility promise and tested against the real database in CI. Trino, H2 and generic JDBC are experimental, and labelled so in the product. Files in S3, GCS, R2, over HTTPS or on disk read through DuckDB.
GET /q/<name>MCPqueryapigate mcpEventsGET /eventsExportsqueryapigate exportManagement/api/v1One saved query behind every door, and the same eight stages on every call: identity, policy, execution, record.
Follow a call through the stages →Paged by default. Constant-memory streaming with ?stream=true for CSV, TSV, NDJSON and Parquet, however large the result; queryapigate export writes the same formats to a file, a bucket or a folder.
Every server publishes a complete OpenAPI 3.0 spec with each saved query as its own typed endpoint. Point OpenAPI Generator at it and every query becomes a typed method, with parameter rules checked before the request is sent.
Generate a client →Short how-to guides in seven categories, from the first endpoint to a SIEM stream, each run against a real server in CI. Five reading paths put them in order, and every box of the architecture diagram has a path of its own.
All guides, with times and outcomes →Every front door runs the same checks, so an AI agent's call is governed exactly like an app's. The core is the product; the front doors and drivers plug into it. Write the SQL once; QueryAPIGate publishes it as a REST endpoint, an MCP tool, a live event stream and a scheduled export, and reports every call to the systems you name. An optional Rust data plane serves saved-query reads from the core's own decisions, and an optional ClickHouse run store keeps every run's record at that rate. Both are experimental.
The same saved query behind every door, and the same eight stages on every call: identity, policy, execution, record. Pick a door, follow one call through, see what each stage produces, and what the call gets back when a stage refuses.
Read-only by default. A single-statement SQL guard blocks writes and multi-statement injection unless a connection or key explicitly opts in. Every call passes the same four controls whether it comes from an app, a partner key or an AI agent. The security model →
Native drivers, plus generic JDBC for anything with a driver jar. Point a connection at a folder or bucket of Parquet, CSV or JSON and each file becomes a view, through DuckDB.
{{ catNote }}
Tier 1 · every feature, tested against a real server in CIexp · experimental, may change in a minor release
The whole setup as one YAML file with no secret in it: diffed on every pull request, applied all or nothing on merge, and locked on prod if you want it.
A Helm chart for one pod or several. Argo CD or Flux syncing it is the deploy, configuration included.
Every store from an earlier release upgrades, or refuses clearly, tested in CI. A written compatibility promise, and rolling upgrades on several instances.
Each column is something you would build and maintain per endpoint, and what QueryAPIGate gives every saved query instead.
/api/v1.Guide 13 →Every server publishes a complete OpenAPI 3.0 spec, checked against the official validator in CI, with each saved query as its own typed endpoint. Point OpenAPI Generator at it and get a client in any of its roughly 50 languages: methods named after your queries, parameters typed from their rules, nothing written by hand.
✓ generated and called against a live server. Generate with a partner's key and their client contains only the queries that key may call. Regenerate when you publish a new query version.
Apache-2.0 since 0.39: use, modify and redistribute it for any purpose, including as a service. Issues, discussions and 65 how-to guides live on GitHub. See what it's built with →