NpgsqlRest is implemented with the latest .NET with Kestrel Web Server and compiled with Ahead Of Time compiler that produces native binaries. They don't require any additional installation to run, have instant startup times and the architecture is itself extremely optimized to achieve exceptional performance while keeping memory efficiency.
📝
Declarative Database Configuration
NpgsqlRest allows you to configure each Web Endpoint individually and declare them directly in your database, by using a smart comment annotations system. Keep your Web Endpoint configuration declarations together with your data declarations in one, single place. Simply label database object as HTTP and you are good to go.
🚀
Code Generation and End-to-End Static Type Checking
Plugin system with code generators, that can generate frontend code, including TypeScript interfaces and corresponding TypeScript fetch modules. When endpoint definition changes - so will your automatically generated frontend Typescript code and your runtime errors will be reduced thanks to static type checking system.
📡
Feature Rich, Enterprise Ready, Open Source and More
Event streaming and event notifications, advanced security and authentication features, role-based authorization, built-in scalability features, connection and command retries, automatic HTTP files, structured logging, docker-ready containerization, upload endpoints, Excel/CSV processing features, Rate Limiters, OpenAPI, fully free and open-source and under MIT license, and more.
Let's create a simple function, add comment declration to expose HTTP endpoint that only admin role can call:
sql
create function my_todo(_user text)returns table ( what text, who text)language sql as $$select 'Hello World', _user$$;comment on function my_todo(text) is 'HTTP GET /helloauthorize admin';
1 2 3 4 5 6 7 8 9 10 11 12 13
Automatically generated TypeScript fetch module with interface declaration that you can import and use in your Frontend project immediately:
typescript
// autogenerated at 2025-08-23T11:09:22.4550472+00:00import parseQuery from "query";const baseUrl = "http://localhost:8080";interface IPublicMyTodoRequest { user: string | null;}interface IPublicMyTodoResponse { what: string | null; who: string | null;}export const publicMyTodoUrl = (request: IPublicMyTodoRequest) => baseUrl + "/hello" + parseQuery(request);/** * function public.my_todo( * _user text * ) * returns table( * what text, * who text * ) * * @remarks * comment on function public.my_todo is 'HTTP GET /hello * authorize admin'; * * @param request * @returns {status: number, response: IPublicMyTodoResponse[] | string} * * @see FUNCTION public.my_todo */export async function publicMyTodo( request: IPublicMyTodoRequest) : Promise<{status: number, response: IPublicMyTodoResponse[] | string}> { const response = await fetch(publicMyTodoUrl(request), { method: "GET", headers: { "Content-Type": "application/json" }, }); return { status: response.status, response: response.status == 200 ? await response.json() as IPublicMyTodoResponse[] : await response.text() };}