Documentation menu

Docs / Clients

HTTP JSON API

Run a statement, an atomic batch or an interactive session over HTTPS with a bearer token.

Available View Markdown
Works
POST /db//sql, POST /db//tx for an atomic list of statements, interactive sessions, GET /db//txn/ for outcome lookup, GET /db//ready.
Differs
This is Gauntlet's own JSON shape. It is not the libSQL (Hrana) protocol.
Missing
A published OpenAPI schema, a libSQL-compatible endpoint, CORS for browsers.
Operational impact
/sql, /tx and sessions activate the database. /ready does not. HTTP requests are not counted against the PostgreSQL connection limit.
Evidence
Covered by the project's gateway tests. The request and response shapes may still change in pre-beta.

All routes are under /db/<name>/ on any node's HTTP listener (port 7101 in the examples). Send the database token as a bearer token over TLS.

#One statement

Shell
curl --cacert ca/ca.crt \
  -H "Authorization: Bearer $GAUNTLET_DATABASE_TOKEN" \
  -H 'Content-Type: application/json' \
  https://n3.example.net:7101/db/app/sql \
  -d '{"sql": "SELECT name FROM items WHERE id = $1", "params": [1]}'

The body is {"sql": "…", "params": […]}; params is optional. A result has columns, rows (an array of arrays) and rows_affected.

#An atomic batch

/tx runs a list of statements as one transaction. Either all commit or none do.

Shell
curl --cacert ca/ca.crt \
  -H "Authorization: Bearer $GAUNTLET_DATABASE_TOKEN" \
  -H 'Content-Type: application/json' \
  https://n3.example.net:7101/db/app/tx \
  -d '{"statements": [
    {"sql": "UPDATE accounts SET balance = balance - 5 WHERE id = $1", "params": [1]},
    {"sql": "UPDATE accounts SET balance = balance + 5 WHERE id = $1", "params": [2]}
  ]}'

The response has one entry in results per statement.

#Sessions

POST /db/<name>/session opens an interactive session and returns its ID; pass "session": <id> in later /sql bodies to run BEGIN … COMMIT across requests. DELETE /db/<name>/session/<id> closes it. Prefer /tx when the statements are known up front: it has no session to leak.

#Errors

An error is a JSON body with an error object that carries the same SQLSTATE code as PostgreSQL wire.

SQLSTATE HTTP status Do
40001 409 Retry the whole transaction
57P03 503 Retry with backoff
40003 504 Look the outcome up. Do not retry
XX… 500 Report it
Any other 400 Fix the request

#Outcome lookup

Shell
curl --cacert ca/ca.crt -H "Authorization: Bearer $GAUNTLET_DATABASE_TOKEN" \
  https://n1.example.net:7101/db/app/txn/<txid>

Returns {"txid": "…", "status": "committed" | "aborted" | "unknown" | "quarantined"}, or HTTP 503 with lookup_failed.

#Readiness without waking

GET /db/<name>/ready with the database token reports that database's readiness without activating it. Use it for health checks; never use SELECT 1 for a fleet-wide probe.

#Values

Integers and floats are JSON numbers, text is a string, a BLOB is {"$blob": "<hex>"}, and infinite floats are {"$float": "Infinity"} or {"$float": "-Infinity"}.

#The CLI

Shell
GAUNTLET_CLIENT_TOKEN=$TOKEN gauntlet sql --url https://n3.example.net:7101/db/app 'SELECT * FROM items'

Search runs in your browser over an index of these pages. No query leaves this site.