prest is a free, open source api development & testing project written in Go and released under MIT. It has 4,618 GitHub stars, 322 forks and 153 open issues, and was last pushed 3 hours ago. On this registry it ranks #53 of 154 tracked projects in API Development & Testing, with 5 head-to-head comparisons available.

What is prest?

pREST (PostgreSQL + REST) is a production-ready, MIT-licensed Go service that exposes an instant REST API and a read-only Model Context Protocol (MCP) endpoint on top of any existing or new PostgreSQL database, built for teams that want CRUD, custom SQL routes, authentication and access control without hand-writing a backend.

What it is

pREST, also published as pRESTd, is a Go application that sits in front of a PostgreSQL database of version 9.5 or higher and turns its schemas and tables into HTTP resources. It is distributed as a Docker image, a Homebrew formula named prestd, and an installable Go package, with configuration supplied through PREST_PG_URL, the pg.* keys, or DATABASE_URL. Alongside the REST surface it serves MCP over HTTP, documented for AI clients such as Cursor and Claude, and it supports working against more than one database at a time. Full documentation lives at docs.prestd.com, with the project homepage at prestd.com.

The concrete problem it solves is the hand-written backend that normally has to be built and maintained before any application can read or write its own data. Instead of writing and deploying controllers, models, authentication plumbing and authorization rules for each table, a team points pREST at the database it already has and calls GET /{database}/{schema}/{table} to obtain CRUD behaviour immediately. Where the generated routes are not enough, custom SQL routes are defined as _QUERIES script templates, so the API layer is configured rather than compiled.

Key capabilities

  • Instant CRUD over HTTP against existing tables, addressed as GET /{database}/{schema}/{table}, with no hand-written handlers.
  • Custom SQL routes built from _QUERIES script templates, using the helpers {{sqlVal "key"}} for a single value, {{sqlList "key"}} for a repeated query parameter such as ?tag=a&tag=b, and {{ident "key"}} for table or column names that cannot be bound.
  • Parameter binding that carries values to Postgres out of band, so free-form input is never parsed as SQL.
  • An interpolation screen that refuses values containing quotes, -- or ::, and refuses multi-word values containing a SQL keyword, failing the request with 400 when such a value is interpolated.
  • Authentication and access control, listed as JWT in the project topics and as auth and ACL in the README.
  • A read-only MCP endpoint over HTTP, documented under MCP over HTTP and aimed at AI clients including Cursor and Claude.
  • Values and headers reachable from templates, including {{sqlVal "header.X-Application"}}, while credential headers such as Authorization and Cookie are always withheld.

Who uses it and how

  • Teams that want a realtime RESTful API backed by Heroku Postgres can use the one-click Heroku deploy template, prest-heroku, rather than provisioning a separate backend service.
  • Backend and microservice developers, per the project topics, run it as a container in Docker alongside their database and expose it as the data access tier.
  • Organisations with an existing Postgres database adopt it to add an API surface without rewriting or migrating their schema.
  • AI-assisted development workflows connect MCP clients such as Cursor and Claude through the MCP over HTTP endpoint for read-only access to data.
  • Multi-tenant or multi-service deployments use the multi-database configuration to serve several databases from one instance.

Getting started

Install and run through Docker, the Homebrew formula prestd, or the Go toolchain as described in the Get pREST guide, then point it at Postgres with PREST_PG_URL, the pg.* keys, or DATABASE_URL before calling GET /{database}/{schema}/{table}. A Heroku one-click deploy option is also offered for a realtime RESTful API backed by Heroku Postgres.

How it compares

No comparable or competing products are named in the facts for this entry, and no list of paid products it replaces has been supplied, so it stands alone in this registry on that axis. It is MIT licensed and self-hostable, with the source and configuration under the operator's control.

When to use it — and when not to

A self-hoster must operate a PostgreSQL database of version 9.5 or higher and configure its connection details, authentication and ACL rules, so teams without Postgres operations experience should weigh that before adopting it. Anyone planning to interpolate user-supplied values into _QUERIES templates should expect the interpolation screen to reject ordinary search phrases containing words such as do, as or or with a 400, and should prefer binding through sqlVal and sqlList instead; the README also notes a contributor licence agreement for those who want to contribute code. The tracker currently carries 153 open issues, which is worth reviewing against specific requirements before a production rollout.

project readme (upstream, from github) — read inline

pRESTd

Unit tests Go Reference Go Report Card codecov Homebrew Discord

pREST (PostgreSQL REST) is a production-ready API that delivers instant REST and Model Context Protocol (MCP) APIs on top of your existing or new Postgres database—CRUD, custom SQL routes, auth, ACL, and a read-only MCP endpoint—without hand-writing a backend.

PostgreSQL version 9.5 or higher

Contributor License Agreement — CLA assistant

pREST - instant, realtime, high-performance on PostgreSQL | Product Hunt

Documentation

Full documentation lives at docs.prestd.com.

Topic Link
Get pREST (Docker, Homebrew, Go) Get pREST
Configuration Configuring pREST
API reference API Reference
MCP over HTTP MCP over HTTP
Multi-database Multi-database
Databases & roadmap Databases · Roadmap
AI clients (Cursor, Claude, …) AI and MCP

Quick start

Install and run options (Docker, Homebrew, or Go) are documented in Get pREST. Point pREST at Postgres (PREST_PG_URL or pg.* / DATABASE_URL), then call:

GET /{database}/{schema}/{table}

See Configuring pREST for auth, ACL, custom queries, and MCP.

Passing values to query scripts

Values a _QUERIES script template interpolates become part of the SQL text, so pREST screens them: anything carrying quotes, --, ::, or — for multi-word values — a SQL keyword is refused, and a refused value that is interpolated fails the request with 400.

Bind free-form values instead, and the screen does not apply at all. A bound value travels to Postgres out of band, where it can never be parsed as SQL:

-- interpolated: screened, and rejected for values like 'compra do mes'
SELECT * FROM articles WHERE slug = '{{.slug}}'

-- bound: the caller's value arrives verbatim, whatever it contains
SELECT * FROM articles WHERE slug = {{sqlVal "slug"}}
Helper Use for Renders
{{sqlVal "key"}} a single value $1
{{sqlList "key"}} a repeated query parameter (?tag=a&tag=b) ($1,$2)
{{ident "key"}} a table/column name, which cannot be bound "public"."users"

sqlVal and sqlList also reach headers as {{sqlVal "header.X-Application"}}. Credential headers (Authorization, Cookie, …) are always withheld.

Prefer binding for anything user-supplied — search phrases especially, since a phrase containing a common word such as do, as or or is exactly what the interpolation screen refuses.

1-Click Deploy

Heroku

Deploy to Heroku and get a realtime RESTful API backed by Heroku Postgres:

Deploy to Heroku

More: Deploy in Heroku.

Contributing

Contributions are welcome. See the Development Guide and Contributing to pREST. Please sign the CLA.

Questions? GitHub Discussions or Discord.

Testing

Run unit tests locally:

make test-unit

Run integration suites inside Docker (no local Postgres required):

# Postgres (full stack: default, auth, multicluster, queries) — also: make test-integration
make test-integration-postgres

# TimescaleDB (Timescale-specific E2E only)
make test-integration-timescaledb

Or with Docker Compose:

docker compose -f integration/postgres/docker-compose.yml up -d --wait \
  postgres postgres-b db-init prestd prestd-multicluster prestd-auth prestd-queries
docker compose -f integration/postgres/docker-compose.yml run --rm --no-deps tests
docker compose -f integration/postgres/docker-compose.yml down -v --remove-orphans

Postgres compose runs ./integration/suites/... and ./integration/postgres/.... TimescaleDB compose runs ./integration/timescaledb/... only (see .github/workflows/test-integration-timescaledb.yml). Network tests require PREST_TEST_URL (and flavor-specific URLs for the Postgres job); outside Compose those tests skip when the URLs are unset.

Example: Docker Build

Build the Docker image locally for development (compiles from source):

docker build -t prest/prest:latest .

For release builds, GoReleaser uses the same Dockerfile / Dockerfile.noplugins with a pre-built prestd binary. Local source builds can pass version metadata via build arguments:

docker build \
  --build-arg VERSION=v1.0.0 \
  --build-arg COMMIT=hash \
  --build-arg DATE=2026-02-11 \
  -t prest/prest:latest .

Frequently asked questions

Is prest free to use?

prest is open source under the MIT licence. There is no licence fee and no seat count — you can self-host it or, where the project offers one, pay a vendor for a managed version instead.

What does prest do?

PostgreSQL ➕ REST, low-code, simplify and accelerate development, ⚡ instant, realtime, high-performance on any Postgres application, existing or new, MCP server

What is prest written in?

prest is primarily written in Go. Its source is publicly available at https://github.com/prest/prest, and it has 4,618 GitHub stars.