Status page and uptime monitoring for NestJS apps
Monitor NestJS controllers, providers, microservices, and BullMQ workers. Terminus-style health endpoints map naturally to our JSON assertions.
Three ways to ship a status page for NestJS
Pick the level of control you need — zero-code, low-code, or full headless.
Hosted
Add your NestJS endpoint, point a CNAME at status.yourdomain.com, done. Works in 5 minutes.
Headless
Use our public API to build your own UI inside your NestJS app. Full control over design and branding.
See the APIEmbedded badges
Drop SVG uptime and status badges into your README or landing page. Auto-updates every 5 minutes.
Drop this health endpoint into your NestJS app
Copy, paste, point PulseAPI at the URL. Returns 200 when healthy, 503 when degraded.
import { Controller, Get } from '@nestjs/common'
import {
HealthCheck,
HealthCheckService,
TypeOrmHealthIndicator,
MemoryHealthIndicator,
} from '@nestjs/terminus'
@Controller('health')
export class HealthController {
constructor(
private health: HealthCheckService,
private db: TypeOrmHealthIndicator,
private memory: MemoryHealthIndicator,
) {}
@Get()
@HealthCheck()
check() {
return this.health.check([
() => this.db.pingCheck('database'),
() => this.memory.checkHeap('memory_heap', 300 * 1024 * 1024),
])
}
}Terminus already returns the shape PulseAPI asserts on — `$.details.database.status == "up"` works out of the box.
What breaks in NestJS apps — and how to catch it
Terminus indicators that pass while the app is broken
A db ping can succeed while a critical service is down. Layer HTTP pings and schema assertions for realistic coverage.
Microservice transport failures
gRPC or Redis transport drops cause silent timeouts. Monitor each microservice endpoint directly.
BullMQ processors crashing
A worker can exit and the API stays up. Expose a processor heartbeat and alert when it stops.
Don't like our status page? Build your own in NestJS.
Our API returns the same data our hosted UI consumes. Full OpenAPI spec documented at api.pulseapi.tech/docs.
import { Controller, Get } from '@nestjs/common'
import { HttpService } from '@nestjs/axios'
import { firstValueFrom } from 'rxjs'
@Controller('status')
export class StatusController {
constructor(private http: HttpService) {}
@Get()
async status() {
const res = await firstValueFrom(
this.http.get('https://api.pulseapi.tech/status/acme', { timeout: 5000 }),
)
return res.data
}
}NestJS monitoring — FAQ
Does it work with Terminus out of the box?
Yes. The default Terminus response shape maps to our JSON-path assertions directly.
Can I monitor microservices?
Yes. Expose each microservice health check over HTTP and add them as separate endpoints in PulseAPI.
Does it support GraphQL?
Yes. POST a query and assert on the JSON response shape.
Can I render the status page from NestJS?
Yes. Hit the API in a controller and return JSON, or render with Handlebars/MJML.
Start monitoring your NestJS app in 5 minutes
Free tier. No credit card. Add your endpoint and get alerts when it breaks.