Plugs into your stack. Alerts where you look.
Pings come in from anything that can make an HTTP request, with official SDKs for the stacks you use most. Alerts go out on nine channels, armed per check or per project.
One line at the end of any job. Exit codes, start signals, and explicit failures are just URL suffixes.
# crontab: ping only when the job succeeds 0 2 * * * /usr/local/bin/backup.sh && curl -fsS https://pingark.com/ping/pk_live_a1b2c3d4/nightly-backup # or report the real exit code (0 = success) /usr/local/bin/backup.sh; curl https://pingark.com/ping/pk_live_a1b2c3d4/nightly-backup/$?Copy
Chain one method onto a scheduled command. Duration, exit codes, and exception context arrive automatically; pingark:sync mirrors the whole schedule.
// composer require pingark/pingark-laravel $schedule->command('backup:run') ->daily() ->pingArk('nightly-backup');Copy
Framework-agnostic core for Node.js 18+, Bun, Deno, and edge runtimes. One monitor() call wraps any job with start, finish, and failure capture.
// npm install pingark import { monitor } from 'pingark' await monitor(() => runNightlyJob(), 'nightly-job')Copy
Wrap a route handler and point a Vercel Cron at it. The wrapper pings around the handler and returns its response unchanged.
// app/api/cron/nightly/route.ts import { withPingArk } from 'pingark/next' export const GET = withPingArk( async () => { await runNightlyJob() return Response.json({ ok: true }) }, { check: 'nightly-job' }, )Copy
Middleware for the route your scheduler hits: start on arrival, success on a normal finish, failure on a 5xx response.
import { pingarkExpress } from 'pingark/express' app.get('/cron/nightly', pingarkExpress('nightly-job'), (req, res) => { runNightlyJob() res.send('ok') })Copy
Wrap a Nitro scheduled task's run function, or any server route a cron service calls. Failures re-throw so your handling is unchanged.
// server/tasks/nightly.ts import { withPingArk } from 'pingark/nuxt' export default defineTask({ meta: { name: 'nightly' }, run: withPingArk(async () => { await runNightlyJob() return { result: 'ok' } }, { check: 'nightly-job' }), })Copy
No SDK needed: one GET on success, the /fail suffix on an exception. Keep the timeout short so a ping can never slow the job.
import requests PING = "https://pingark.com/ping/pk_live_a1b2c3d4/nightly-backup" try: run_nightly_job() requests.get(PING, timeout=5) except Exception: requests.get(PING + "/fail", timeout=5) raiseCopy
The standard library is all it takes. Ping the check URL on success, or its /fail suffix when the job returns an error.
import "net/http" const ping = "https://pingark.com/ping/pk_live_a1b2c3d4/nightly-backup" if err := runNightlyJob(); err != nil { http.Get(ping + "/fail") log.Fatal(err) } http.Get(ping)Copy
Alerts where your team already looks.
Six on every plan, and three premium channels with credits bundled on higher plans. Arm any of them per check or per project.
Per-address delivery with a confirm step before a channel is armed.
Setup guidePost downtime and recovery to any channel via an incoming webhook URL.
Setup guideOpen and resolve incidents so escalation and on-call rotations just work.
Setup guideA WhatsApp message the moment a check goes down, and again on recovery. Your number is verified once with a one-time code.
Setup guideA plain text message to your verified number. Works on any phone, no app required. Each alert uses one message credit.
Setup guideA real phone call that reads the alert out loud, for the pages that must wake someone. Each alert uses one call credit.
Setup guideMore destinations are landing soon. Each is just one more channel class.
A first-class integration, not a curl line in a comment.
The open-source plugin registers every scheduled task as a check, wraps each run with start and finish, and ships duration, exit code, and the exception trace when it throws. Zero config beyond your project key.
Read the Laravel guide// app/Console/Kernel.php $schedule->command('reports:send') ->hourly() ->pingArk('hourly-reports'); // duration, exit code & exceptions: automatic
Management API
Create, pause, and list checks over a clean REST API with read-only and read-write keys per project. Generated docs stay in sync with the routes.
API referenceREADME status badges
pingarkupA live SVG badge per check or project, served from the CDN so thousands of README hits never touch app logic.
Badges guide