A dataset in, a priced API out.
Drop a file; we code, host, back up and serve the endpoints. You set the price and keep all of it.
Your event data is already the answer.
Register it once as type ch. Every table is served as REST routes and as MCP tools, merged by default and raw on request.
Every role, decided on the table. Every call, on the record. The rows stay in your ClickHouse; nothing is copied out of it.
Minimal Core is in beta. Licences are set up with you in a session, or email us. What Minimal Core is.
The same call
The Book’s worked Acme database runs on Postgres. Move the same table to ClickHouse and the call changes in one place: pg becomes ch. The request, the role checks and the response stay the same, so moving a database is a configuration change, not a rewrite of the code that calls it.
GET /minimal/api/rest/auto/v1/acme/people/ch/acme/employee?fc=id,full_name,department_id&oy=id.as&ps=5&pg=0 HTTP/1.1
Host: api.acme.example
LB-Access-Token: <your-access-token>[
{ "id": 1, "full_name": "Rafael Delacroix", "department_id": 11 },
{ "id": 2, "full_name": "Rafael Müller", "department_id": 7 },
{ "id": 3, "full_name": "Rafael Novak", "department_id": 8 },
{ "id": 4, "full_name": "Kwame Haddad", "department_id": 6 },
{ "id": 5, "full_name": "Rafael Haddad", "department_id": 6 }
]DELETE /minimal/api/rest/auto/v1/acme/people/ch/acme/employee?id=eq.5 HTTP/1.1
Host: api.acme.example
LB-Access-Token: <token · roles hr-analyst · key_type -r-->{
"code": 403,
"status": "Forbidden",
"message": "insufficient permissions for this operation on this table, got [hr-analyst]"
}Acme’s employee table, as printed for Postgres in the Book of Minimal; only the type segment differs. Add uf=false to a read to get every stored row instead of the merged view. Vol. I, Chapter 5 is the full query language.
What differs
The code is ch
ch is the path segment and the MCP type argument. The registration surface spells it clickhouse under the field db_type. A project can address Postgres and ClickHouse together; Acme’s people project does.
Merged by default, raw on request
A table whose engine merges rows in the background (replacing, summing, collapsing, coalescing) reads in its fully merged form. uf=false reads every stored row, superseded ones included. On a non-merging table it does nothing; on a write it is refused with 400.
No transactions
ClickHouse has no transaction concept. A multi-row insert, and a PUT or DELETE that matches many rows, get no all-or-none guarantee, and a Custom API definition’s steps do not roll back as they do on every other database.
Schema runs can stop partway
A multi-statement schema run can leave some statements applied and later ones failed, so read each statement’s status in the run record. TRUNCATE, RENAME or DETACH combined with DATABASE is refused on ClickHouse only.
The boundary
The Auto API reads and writes one table per call: no joins, no subqueries, no aggregate functions. A join belongs in a view, or in a Custom API definition. Minimal Core does not issue your users’ credentials and does not connect your third-party services; both stay where they already are.
Also: Postgres · MySQL and MariaDB · All of Minimal Core · Pricing
Put it in front of a ClickHouse database.
Next on the shelf
Drop a file; we code, host, back up and serve the endpoints. You set the price and keep all of it.
Fill in a form and an agent runs the job over your own database, under an identity you scope.
The Minimal Core agent skill: session rule, discovery order, headers and refusals.