API & app monitoring Β· SaaS

The fastest way to see inside your stack

One plugin for your backend, one SDK for your apps β€” live traffic, errors, latency, consumers, uptime and alerts β€” on a dashboard that answers in milliseconds, not minutes.

Start monitoring free See the engine
$ bun add @sentrinel/plugin
Elysia Β· live today Flutter Β· live today Hono Β· soon Express Β· soon Fastify Β· soon OpenTelemetry Β· soon
app.sentrinel.dev/traffic LIVE
Traffic
Consumers
Request logs
Uptime
Resources
Alerts
Errors
Performance
Requests
184k
Error rate
0.4%
p95
118 ms
Apdex
0.97
Requests Β· last 24 h
EndpointRequestsp95Errors
GET /v1/orders12.4k42 ms0.1%
POST /v1/payments8.1k118 ms1.2%
GET /v1/users6.7k31 ms0.0%
01 β€” Features

Deep monitoring for APIs
and apps. Nothing else.

No session replay, no product analytics, no kitchen sink. Sentrinel does one job β€” the sharpest possible view of your backend and the apps that call it β€” and does it properly.

Endpoint metrics & Apdex

p50 / p95 / p99, throughput and Apdex per endpoint, with banded charts and drill-down modals.

Error tracking

Stacked error charts by status code today; fingerprinted, grouped issues with stack traces next.

Request logs

Search full logs β€” headers, payloads, and the caller's country, IP and serving host β€” down to a drag-selected slice of any chart.

Consumer analytics

See exactly which API clients drive traffic, errors and transfer β€” first-class, not an afterthought.

Uptime & alerts

HTTP checks with uptime strips, plus threshold alerts on error rate, latency and downtime.

Host metrics

CPU and memory for the machines running your apps, as a min–max band rather than a lying average β€” captured by the same plugin, no extra agent.

Postgres monitoring

Slow queries ranked by share of database time, wait events, blocking chains and table bloat. A collector runs next to your database β€” we never connect to it, and query literals are stripped before they leave your host.

Crash reporting

Flutter and browser crashes with the breadcrumb trail that led there. Fatal errors are written to disk before the process dies, so the report survives the crash and arrives on the next launch.

One timeline, phone to database

The SDKs send traceparent, so a tap in your app, the request it caused and the spans underneath land on a single waterfall instead of three disconnected searches.

+ Distributed tracing + Time travel on every view + Drag-to-zoom charts + Multi-tenant orgs & quotas+ Light & dark themes+ Geo & client IP per request
02 β€” The differentiator

Know who is calling, not just how often

Most APM tools tell you your API is slow. Sentrinel tells you it's slow because one consumer is hammering one endpoint. Every request is attributed to the API client behind it.

Traffic, error and data-transfer breakdowns per consumer β€” the view Datadog and Sentry treat as an afterthought is first-class here.

Consumers β€” share of trafficLAST 24 H
acme-prod41% Β· 102k req
mobile-app27% Β· 67k req
partner-api18% Β· 45k req
staging-ci β–² errors9% Β· 22k req
internal-cron5% Β· 12k req
03 β€” The engine

Handles your busiest day
without breaking a sweat

Send us millions of requests a day β€” Sentrinel absorbs them all, keeps your dashboards answering in milliseconds, and cleans up old data automatically. You never manage storage, servers or retention jobs.

Smart sampling keeps your bill flat: routine traffic is sampled, but every error and every slow request is kept β€” and your metrics stay exact. Team workspaces, per-app keys and usage quotas are built in from day one.

Your app@sentrinel/plugin Β· head sampling
β–Ό  HTTPS ingest Β· per-app API key
Sentrinel APIauth Β· quotas Β· batching
β–Ό
Control planeorgs Β· apps Β· alerts Β· rollups
Telemetry enginelogs Β· spans Β· auto-retention
β–²  millisecond queries
Sentrinel dashboardlight Β· fast Β· drag-to-zoom
app.ts// the entire integration
import { Elysia } from "elysia";
import { sentrinel } from "@sentrinel/plugin";

const app = new Elysia()
  .use(sentrinel({
    apiKey: process.env.SENTRINEL_API_KEY,
    sampleRate: 0.25, // errors always kept
  }))
  .get("/", () => "hello")
  .listen(3000);

Keys, environments and sampling are configured from the dashboard once your app connects. Nothing else to deploy.

6,000 rows/s
sustained ingest, verified under load
4–14 ms
dashboard query time over 50,000 rows
100%
of errors and slow requests kept β€” sampling never hides an incident
04 β€” Why not a heavyweight APM?

Focused beats bloated

Sentrinel
Datadog / New Relic
Setup time
βœ“ under 5 minutes
hours of agent & config work
Native SDKs
βœ“ in-process, zero agents
heavy generic agents
Consumer analytics
βœ“ first-class
afterthought
Dashboard speed
βœ“ 4–14 ms queries
often seconds per panel
Cost model
βœ“ sampling keeps bills flat
per-host + per-GB, grows fast
Scope
βœ“ deep API monitoring
everything, shallowly, priced high
05 β€” Pricing

Choose the right plan for you

Try Sentrinel free for 14 days, then decide which plan suits you best. No credit card required at sign up.

Basic

The basics for your side project.

$9/mo
billed monthly
Try for free
βœ“ 1 app βœ“ 1 dashboard user βœ“ 100 API consumers βœ“ Unlimited requests for metrics βœ“ 1M request logs / month βœ“ App logs & traces βœ“ Uptime checks
MOST POPULAR

Starter

For small teams ready to scale.

$29/mo
billed monthly
Get started
βœ“ 3 apps βœ“ 3 dashboard users βœ“ 1,000 API consumers βœ“ Unlimited requests for metrics βœ“ 5M request logs / month Β· then $2 per 1M βœ“ 20M logs & spans / month Β· then $1 per 1M βœ“ Alerts: Slack Β· Discord Β· webhook Β· email

Premium

The full package for growing teams.

$119/mo
billed monthly
Get started
βœ“ 10 apps βœ“ Unlimited dashboard users βœ“ Unlimited API consumers βœ“ Unlimited requests for metrics βœ“ 25M request logs / month Β· then $2 per 1M βœ“ 100M logs & spans / month Β· then $1 per 1M βœ“ Priority support
06 β€” FAQ

Frequently asked questions

Nothing on the request path. Metrics are aggregated in memory and flushed on a timer, so no request waits for a network call to us. If Sentrinel is unreachable the batch is dropped with a single warning rather than backing up your process.
Yes. Counters are computed in your process before sampling, so request counts and error rates stay exact at any sample rate β€” only the individual stored log rows are thinned. Errors and slow requests are never sampled out.
Only if you enable payload capture, and only after masking. Masking runs inside your process before anything is sent, so a masked field never reaches the network β€” it is redacted before it becomes a network packet, not after it arrives.
Elysia is first-class. Express and Next.js have their own adapters, Flutter and Dart have a native SDK, and anything that speaks OpenTelemetry can skip the plugin and export OTLP/HTTP straight to us.
Create an account, add an app, and drop the plugin into your code with the key it gives you. Data appears with the next request β€” there is no agent to install and no config file to write.
Every request row carries the caller's IP and country and the host that served it, and both are filterable. The country comes from a header your edge already sets β€” Cloudflare, Vercel, Fastly or CloudFront β€” rather than from a GeoIP database bundled into your process. Behind no proxy at all the field stays empty, which is deliberate: an honest blank beats a wrong country.
Yes, and it only records what is worth keeping. The browser buffers the DOM in memory and uploads the seconds leading up to an error, so a session that never fails costs nothing and the recordings you keep are the ones you would actually watch. Text and inputs are masked by default β€” you opt individual elements in, not out.
Yes β€” light, dark, or follow your system. It is stored per browser rather than per account, because the right answer usually depends on the screen you are sitting at.
The dashboard is blocked, but telemetry keeps arriving for a grace period, so paying restores an unbroken history rather than one with a hole in it. Nothing already collected is deleted.
Every record knows its neighbours. A log opens the request it was written during; a request opens its trace waterfall; an error occurrence opens the exact request that produced it. You never copy an id into a search box.
Yes. A small collector runs next to your database, reads the pg_stat_* views, and reports slow queries, wait events, blocking chains, connection saturation, cache hit ratio and table bloat. It needs a read-only role holding pg_monitor β€” no superuser, which is what makes it work on RDS, Cloud SQL and Azure too.
No, and it cannot. The collector runs on your side of the network and holds the credentials; nothing here stores a connection string. Telemetry travels one way, out of your infrastructure, so a breach of Sentrinel is not a breach of your database.
No. Literals are stripped before anything is sent β€” WHERE email = 'someone@example.com' becomes WHERE email = ?. That happens in the collector, on your host, so the values never travel. It matters most for currently-running queries, whose text is fully substituted at the moment we read it.

Five minutes from now,
you'll know exactly how your app behaves

Free for your first 100k requests. No credit card, no agents, no YAML.

Start free $ bun add @sentrinel/plugin