Monitoring & Analytics

Every deployed project gets uptime probes every five minutes, live server metrics from your own Render service, and optional privacy-friendly product analytics fed by a one-line beacon snippet. These endpoints expose all of it, plus the account-wide dashboard stats.

Monitoring is keyed by repository id (from GET /repos), not deployment id — a project's health outlives any single deployment. For the dashboard-level walkthrough, see the Monitoring & Analytics guide.

Project monitoring#

Returns the project's health snapshot: current status and 24-hour uptime series for the frontend and backend, live CPU/memory from the Render service (last hour), the last successful deployment, and the latest deployment attempt of any status. Returns 404 if the repository does not exist or belongs to another user.

FieldTypeDescription
projectobject{ id, name, fullName } of the repository.
frontend / backendobjectPer-target health: url (nullable), current { ok, httpStatus, latencyMs, checkedAt } or null when no probe has run, uptime24h (percentage, one decimal, null without samples), and series of { t, ok, latencyMs } probe points over the last 24 hours.
serverobject | nullLive Render metrics: state, plus cpu and memory arrays of { timestamp, value } for the last hour. Null when there is no Render service or metrics are unavailable.
lastDeploymentobject | nullLatest COMPLETED deployment — { id, at, branch }. Defines the URLs being monitored.
latestAttemptobject | nullLatest deployment of any status — { id, status, error, branch, at, isNewerThanLive }. isNewerThanLive is true when this attempt is not the live deployment (in progress or failed after the last success).
request
curl https://www.deplo.in/api/v1/projects/cm5xb2c3d0002njk8p4q5r6s7/monitoring \
  -H "Authorization: Bearer $DEPLO_TOKEN"
response · 200
{
  "project": {
    "id": "cm5xb2c3d0002njk8p4q5r6s7",
    "name": "acme-shop",
    "fullName": "adalovelace/acme-shop"
  },
  "frontend": {
    "url": "https://deplo-acme-shop-web.vercel.app",
    "current": { "ok": true, "httpStatus": 200, "latencyMs": 84, "checkedAt": "2026-08-07T09:10:00.000Z" },
    "uptime24h": 100,
    "series": [
      { "t": "2026-08-07T08:55:00.000Z", "ok": true, "latencyMs": 91 },
      { "t": "2026-08-07T09:00:00.000Z", "ok": true, "latencyMs": 88 },
      { "t": "2026-08-07T09:05:00.000Z", "ok": true, "latencyMs": 79 },
      { "t": "2026-08-07T09:10:00.000Z", "ok": true, "latencyMs": 84 }
    ]
  },
  "backend": {
    "url": "https://deplo-acme-shop-api.onrender.com",
    "current": { "ok": true, "httpStatus": 200, "latencyMs": 132, "checkedAt": "2026-08-07T09:10:00.000Z" },
    "uptime24h": 99.7,
    "series": [
      { "t": "2026-08-07T09:05:00.000Z", "ok": true, "latencyMs": 141 },
      { "t": "2026-08-07T09:10:00.000Z", "ok": true, "latencyMs": 132 }
    ]
  },
  "server": {
    "state": "deployed",
    "cpu": [{ "timestamp": "2026-08-07T09:10:00Z", "value": 0.02 }],
    "memory": [{ "timestamp": "2026-08-07T09:10:00Z", "value": 268435456 }]
  },
  "lastDeployment": {
    "id": "cm5xc4d5e0003njk8t8u9v0w1",
    "at": "2026-08-06T18:33:11.000Z",
    "branch": "main"
  },
  "latestAttempt": {
    "id": "cm5xc4d5e0003njk8t8u9v0w1",
    "status": "COMPLETED",
    "error": null,
    "branch": "main",
    "at": "2026-08-06T18:30:02.000Z",
    "isNewerThanLive": false
  }
}

Product analytics#

Aggregated product analytics for the project over the requested window: totals, a daily views/visitors series, top pages, top referrers, and the ready-to-paste tracking snippet. Data comes from the public insights beacon below — no cookies, visitors are counted via a daily-rotating hash. Returns 404 for repositories you do not own.

Query paramTypeDescription
daysnumberOptional. Window size in days, 1–30. Defaults to 7; out-of-range values are clamped.
request
curl "https://www.deplo.in/api/v1/projects/cm5xb2c3d0002njk8p4q5r6s7/analytics?days=7" \
  -H "Authorization: Bearer $DEPLO_TOKEN"
response · 200
{
  "days": 7,
  "totals": { "views": 1284, "visitors": 342 },
  "daily": [
    { "day": "2026-08-01T00:00:00.000Z", "views": 158, "visitors": 49 },
    { "day": "2026-08-02T00:00:00.000Z", "views": 203, "visitors": 61 }
  ],
  "topPaths": [
    { "path": "/", "views": 612 },
    { "path": "/pricing", "views": 231 }
  ],
  "topReferrers": [
    { "referrer": "(direct)", "views": 540 },
    { "referrer": "https://news.ycombinator.com/", "views": 187 }
  ],
  "snippet": "<script defer src=\"https://www.deplo.in/api/v1/public/insights.js\" data-deplo-key=\"cm5xb2c3d0002njk8p4q5r6s7\"></script>"
}

The insights beacon#

Analytics is opt-in: add the snippet from the analytics response to your deployed site and the two public endpoints below do the rest. Neither requires authentication.

The tracking script (~500 bytes of vanilla JS, cached for one hour). It reads the repository id from the script tag's data-deplo-key attribute, sends a beacon on load, and hooks pushState/replaceState/popstate so SPA navigations are counted too.

embed
<script defer src="https://www.deplo.in/api/v1/public/insights.js" data-deplo-key="cm5xb2c3d0002njk8p4q5r6s7"></script>

Beacon ingest — the script calls this via navigator.sendBeacon (POST) or an image request (GET; both methods behave identically). Always responds 204 immediately, whatever happens: bot user agents and DNT: 1 requests are silently dropped, unknown repo ids are ignored, and ingest failures never surface. Visitors are deduplicated with a daily-rotating hash of IP + user agent + repo id — no cookies, no stored IPs.

Query paramTypeDescription
pathstringPage path being viewed. Defaults to /; truncated to 512 chars.
refstringDocument referrer. Optional; truncated to 512 chars.
request
curl -X POST "https://www.deplo.in/api/v1/public/insights/cm5xb2c3d0002njk8p4q5r6s7?path=%2Fpricing&ref=https%3A%2F%2Fnews.ycombinator.com%2F"
response · 204
HTTP/1.1 204 No Content
Access-Control-Allow-Origin: *
Note
The beacon endpoints are rate-limited like everything else (200 requests / 15 min / IP), which is ample for real visitors — each pageview is a single request from the visitor's own IP.

Account stats#

GET/api/v1/statsBearer token

Account-wide dashboard counters for the authenticated user. Active means any non-terminal status: PENDING, ANALYZING, WAITING_FOR_ENV, DEPLOYING_BACKEND, BACKEND_READY, or DEPLOYING_FRONTEND.

request
curl https://www.deplo.in/api/v1/stats \
  -H "Authorization: Bearer $DEPLO_TOKEN"
response · 200
{
  "totalDeployments": 27,
  "activeDeployments": 1,
  "failedDeployments": 3,
  "connectedRepos": 42
}

Platform-wide totals used by the marketing site. No authentication, cached for five minutes both in-process and via Cache-Control. avgMinutesToProduction is the mean time from deployment creation to completion across all successful deployments, rounded up to whole minutes; it is null until at least one deployment has completed.

request
curl https://www.deplo.in/api/v1/public/stats
response · 200
{
  "deployments": 1284,
  "avgMinutesToProduction": 3
}