---
title: "Admin Overview"
method: GET
path: "/api/v1/admin/overview"
tags: ["admin"]
---

# Admin Overview

`GET /api/v1/admin/overview`

## Request

- Base URL: `https://api.nudgelink.co` (the document declares no server; this is the origin it was published from)
- URL: `https://api.nudgelink.co/api/v1/admin/overview`
- Auth: HTTP bearer

Operator landing page: headline KPIs + the "needs attention" queue.

Paying subscriptions = clients with a Stripe sub (comped/pilot excluded, see
the billing-overview note). "Out of credits" = on a plan but balance <= 0
(stalled or in overage).

## Response `200`

Successful Response

- AdminOverview
  - `total_clients` integer, required
  - `paying_subscriptions` integer, required
  - `active_pilots` integer, required
  - `comped_plans` integer, required
  - `new_signups_7d` integer, required
  - `mrr_30d_usd` number, required
  - `ai_cost_30d_usd` number, required
  - `active_sequences` integer, required
  - `stalled_sequences` integer, required
  - `unhealthy_accounts` integer, required
  - `pilots_expiring_7d` integer, required
  - `out_of_credit_clients` integer, required
  - `admin_actions_7d` integer, required
  - `pilots_expiring_sample` OverviewPilotExpiring[], required
    - `client_id` string, uuid, required
    - `email` string, required
    - `company_name` string, required
    - `pilot_expires_at` string, date-time, required
    - `days_left` integer, required
  - `out_of_credit_sample` OverviewOutOfCredit[], required
    - `client_id` string, uuid, required
    - `email` string, required
    - `company_name` string, required
    - `credits_balance` integer, required
    - `subscription_plan` string, nullable, required
  - `outreach` OutreachStats, required
    - `invites` InviteStats: Connection requests. ``*_pct`` are None (never 0.0) on an empty base. THREE outcomes, not two (added 2026-08-07 after the first production backfill). An invite we sent is in exactly one of: * **accepted** — ``invite_accepted_at`` is stamped. * **declined** — we looked AFTER inviting and they are still not a connection. "Declined" is shorthand: it also covers ignored. * **unknown** — we have no observation since the invite went out. That third bucket is not a technicality. Relationship distance is only refreshed by the DM gate, which runs when a sequence reaches ``linkedin_followup_1``; ``warmup_view``'s blob is written BEFORE the invite and carries no timestamp at all. So a lead whose follow-up is still sitting in the preview queue has never been re-checked, and folding those into the denominator reports them as rejections. The first prod run showed exactly that: 379 invites, 376 "not 1st-degree", an 0.8% accept rate. Real cold-invite accept rates are 15-40%. Nearly all of that 376 was "we never looked", and dividing by it would have put a catastrophic-looking number in front of clients. So ``accept_rate_pct`` divides by **accepted + declined** — what we actually know — and ``unknown`` is reported alongside so the number can be read with its own confidence attached. The bucket shrinks toward zero once PR 2's ``relation.new`` webhook lands, which is the real fix.
      - `sent` integer
      - `with_note` integer
      - `without_note` integer
      - `accepted` integer
      - `accepted_with_note` integer
      - `accepted_without_note` integer
      - `declined` integer
      - `unknown` integer
      - `judged` integer
      - `judged_with_note` integer
      - `judged_without_note` integer
      - `accept_rate_pct` number, nullable
      - `accept_rate_with_note_pct` number, nullable
      - `accept_rate_without_note_pct` number, nullable
    - `replies` ReplyStats: Messages sent and what came back. ``contacted`` counts SEQUENCES (people) reached by any substantive step, not messages — an invite plus two follow-ups to one lead is one person. ``silent`` is the complement, so positive + neutral + negative + unclassified + silent == contacted.
      - `dms_sent` integer
      - `emails_sent` integer
      - `contacted` integer
      - `replied` integer
      - `reply_rate_pct` number, nullable
      - `positive` integer
      - `neutral` integer
      - `negative` integer
      - `unclassified` integer
      - `silent` integer
    - `comments_sent` integer

---

[API](https://skmtc.dev/nudgelink/apis/nudgelink-api.md) · [All operations](https://skmtc.dev/nudgelink/apis/nudgelink-api/llms.txt) · [OpenAPI document](https://skmtc.dev/nudgelink/apis/nudgelink-api/revisions/baa46e6db986?raw)
