A licence count tells you what you bought. An activity export tells you what you use, and the gap between them is usually the largest line item you can delete this quarter without anyone noticing. Paste the export, pick a window, get the reclaim list and the money. The file is parsed in this tab and is never uploaded.
This export names your colleagues. It is read with the browser's own file reader, parsed in memory, and never sent anywhere: the script has no network call in it. Open your network panel and watch it stay empty.
Or drop a .csv, .tsv or .json file here
Thirty days catches abandonment and survives a holiday. Ninety is the setting nobody argues with.
Used only for rows with no cost column. Copilot Business at $19 and Copilot Enterprise at $39 price themselves from plan_type.
Paste an export above, drop a file on the box, or load the sample. The audit runs here in the page.
GitHub documents that last_activity_at only reflects IDE activity when telemetry is enabled in that editor. A blank field is a weak signal, not proof of non use, so treat every never recorded row as a question rather than a verdict.
The Anthropic Console member export carries name, email, role and seat type. There is no activity column in it, so this tool prices the roster and refuses to call anything idle.
claude setup-token credential is valid for a year, is printed once, and typically lives in a CI secret that outlives the account./v1/organizations/usage_report/claude_code returns one day per request with sessions and estimated cost per user by email address; join it to this export on the email column.last_active column and the reclaim list builds itself.Prices: Copilot Business $19 and Copilot Enterprise $39 per granted seat per month, read from GitHub's own plan documentation in August 2026. Every other seat takes the row's own cost column, or the fallback above when there is no cost column.
Annual figures are the monthly figure times twelve. No discount, no proration, no assumption about your contract.
Nothing here was sent anywhere. The parse, the arithmetic and the CSV download all happen in this tab.
No retraining, no negotiation, no change to how anyone works. It comes off a real invoice. Here is the order that survives contact with the people whose seats you are about to remove. More depth in AI seat management.
A seat list is procurement's view and it cannot answer the only question that matters. The two numbers you need per seat are last activity and consumption, and neither is sufficient alone. Last activity catches abandonment. Consumption catches the person on a $200 tier using $30 of it, and the person on a $20 tier who is rate limited every afternoon and has quietly started expensing an API key on the side.
Vendors expose this unevenly. GitHub is the most complete: GET /orgs/{org}/copilot/billing/seats returns each seat with last_activity_at, last_activity_editor, last_authenticated_at, created_at, plan_type and pending_cancellation_date. Anthropic splits it in two: the Console member export gives you the roster, and the Claude Code Analytics API gives you per user sessions and estimated cost per model, one day per request, keyed by email address. Cursor returns per member spend through its admin API. Nothing gives you all of it in one call, which is why this page takes whatever you have.
The single most common way an audit goes wrong is treating a null as proof. GitHub documents plainly that last_activity_at only reflects a user's Copilot activity when telemetry is enabled in their IDE, so a developer who turned telemetry off looks identical to a developer who never opened the tool. A reclaim built on that assumption removes a working seat from someone who is using it, and the cost of that mistake is not the nineteen dollars.
The same caution applies in the other direction. Parental leave, a sabbatical, a long secondment and a three week holiday all present as silence. Ask first. Every time.
The highest value find in this whole exercise needs no activity data at all: people who have left and still hold a live seat. Pull the current headcount export, join it to the seat list on email, and look at the rows that only exist on one side. Those are unambiguous, nobody has to be asked, and they are frequently the largest single number in the audit.
Removing a seat does not stop the bill today. GitHub sets the seat to pending cancellation: the assignment ends at the start of the next billing cycle, the user keeps access until the end of the current one, and no refund is issued for the unused part. Budget the saving from next month, not this one, or the finance conversation goes badly in exactly the week you were hoping to look good.
For anyone who has actually left, the seat is the visible half of the job. The gap is long lived credentials: a token minted by claude setup-token is valid for a year, is printed once rather than stored, and typically ends up in a CI secret that outlives the account. API keys the person created or could have copied get rotated, not deleted if unused. Paired devices on agent workbenches are a real access path. Removing the identity provider account and the vendor seat revokes none of those three.
Reclaiming is the easy half and it only runs once. The stage almost nobody runs is moving people between tiers, and it pays in both directions: reclaimed spend from over provisioned seats, and recovered afternoons from under provisioned ones. A developer hitting their cap weekly is not an overspender, they are the cheapest capacity you have, getting more inference than the seat costs. Right-sizing that is only ever allowed to move downward stops being an audit and becomes something engineers learn to hide from.
The auditor reads the header row and picks a shape. Column names are matched case insensitively with punctuation collapsed, so Last Activity At, last_activity_at and last-activity-at are the same column.
| Shape | Recognised by | Activity signal | Pricing |
|---|---|---|---|
| GitHub Copilot seats, JSON | The seats array from GET /orgs/{org}/copilot/billing/seats, pasted whole |
last_activity_at |
plan_type: business $19, enterprise $39 |
| GitHub Copilot seats, CSV | Any of last_activity_editor, pending_cancellation_date, last_authenticated_at, assignee.login |
last_activity_at |
Same, from plan_type |
| Anthropic Console members | email plus role plus seat type, and no activity column |
none in this export | Your fallback price |
| Generic | Anything else with a name or email column | last_active, last_used, last_seen, last_login |
monthly_cost, else the fallback |
Dates are read as ISO 8601 (2026-08-19 or 2026-08-19T14:02:11Z) or US style (8/19/2026). A cell reading never, none, n/a or blank counts as no recorded activity. A cell that is present but unreadable gets the row skipped, and the count of skipped rows is reported rather than hidden.
Anthropic does document a member export: an admin can download a CSV of the current member list from Organization settings, and it carries member details including name, email address, role and seat type. What it does not carry is any last active or last seen column, which means it can price a roster and reconcile it against headcount but can never prove a seat is idle. The auditor detects that shape and says so instead of quietly treating every row as dormant.
The activity half lives in a different place: /v1/organizations/usage_report/claude_code returns one day per request, one record per actor, with sessions, lines of code, commits, pull requests, and estimated cost per model in cents. Join it to the member export on the email address, add a last_active column, and paste the result back here as the generic shape.
The full lifecycle, the vendor endpoints and the offboarding checklist are in AI seat management.
Call GET /orgs/{org}/copilot/billing/seats and read last_activity_at on each seat object. The same object also carries assignee, last_activity_editor, last_authenticated_at, created_at, plan_type and pending_cancellation_date. Two caveats from GitHub's own documentation change how you read the output: last_activity_at only reflects IDE activity when telemetry is enabled in that editor, so a blank value is a weak signal rather than proof of non use, and a removed seat is billed to the end of the current billing cycle with the user keeping access until then. Paste the JSON response or a CSV of those columns into the auditor above and it builds the reclaim list without sending the file anywhere.
No. The parsing, the arithmetic and the CSV download all happen in the page. The script contains no fetch, no XMLHttpRequest, no beacon and no form post, so the file you drop never leaves the tab. You can verify it: open the network panel, run an audit, and watch it stay empty, or read the script itself at /assets/pages/idle-seat-auditor.js.
At GitHub Copilot Business pricing of $19 per granted seat per month, thirty dormant seats is $570 a month and $6,840 a year. At a $100 per seat premium subscription tier, ten dormant seats is $12,000 a year. Idle seats are the most reliable AI saving available because the number comes off a real invoice rather than out of an efficiency estimate, and reclaiming them needs no migration, no retraining and no negotiation.
A seat with no recorded activity inside your chosen window, which the auditor lets you set at 14, 30, 60 or 90 days. Thirty days catches genuine abandonment while leaving room for a holiday; ninety days is the conservative setting that produces a list nobody will argue with. Whatever the window, the output is a list of questions rather than a list of verdicts, because parental leave, sabbatical and a long secondment are indistinguishable from abandonment in an activity feed.
Reclaiming idle seats works and it only works once per cycle. Continuum Team bills by live member count instead, so a member you remove stops being billed rather than sitting as a dormant licence until somebody runs an audit. Weekly spend caps and model policy per team and per person come with it, and offboarding blocks provider access, revokes devices and tokens, and destroys the content key in one step.
nothing uploaded · no signup · free