Free tool · no signup · nothing leaves this page

Which AI seats is nobody opening?

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.

01 · The auditor
Runs in your browser

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.

The reclaim list

Paste an export above, drop a file on the box, or load the sample. The audit runs here in the page.

02 · The idle-seat playbook

Reclaiming is the only AI saving that needs no migration.

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.

Get the activity data before you get the licence count

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.

Read a blank activity field as a question, not a verdict

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.

Reconcile against headcount before you reconcile against activity

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.

Expect the money next cycle

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.

Finish the offboarding, not just the seat

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.

Then right-size the seats you keep

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.

03 · What you can paste

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.

Supported shapes and the columns each one is recognised by. checked aug 2026
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.

The Anthropic case is worth knowing before you go looking

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.

04 · Questions

Before you send the reclaim email.

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.

05 · Stop auditing, start not overbuying

The audit is a quarter.
Live member count is every month.

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