AI cost visibility · shadow AI discovery
Every dollar you
spend on AI, and
who spent it.
Shield 360 finds AI usage on every machine you own — including the tools nobody told you about — then says what a subscription covered, what was charged to an API key, and what nobody can account for.
Agents run on macOS, Windows and Linux. No proxy, no root certificate, nothing placed in the path of a request.
AI spend observed
$48,213.77
Illustrative figures. Unknown is a state, not a blank. Most cost tools round it into whichever column keeps the chart tidy; this one makes you look at it.
01 · The gap
Why the invoice and the org chart never line up
Your provider bill proves the spend exists.
It will not tell you whose it is.
The bill has no names on it
A provider invoice is a list of keys and token counts. It knows that sk-ant-…4f2a spent $3,180 last month. It has no idea that the key belongs to a contractor who left in March.
Subscriptions and API keys look identical from the outside
A developer running Claude Code on a seat you already bought costs you nothing extra. The same developer calling the same model through an API key is billed per token. The usage looks the same. The invoice does not.
The expensive AI is the AI nobody installed
Endpoint tools leave transcripts, so they are easy to find. A nightly batch job, a service a contractor left running, a script on a build box — these write nothing, show up on no dashboard, and keep spending.
02 · Attribution
Person, machine, and the code itself
Three answers to “who is spending this”,
because it is three different questions.
A person owns a key. A machine runs a process. And some of the cost belongs to neither — it belongs to a query in a loop that nobody has looked at since it was written. Shield 360 ranks all three, over the same window, from the same events.
By person · 1 of 312
By machine · 1 of 1,204
By code path · 1 of 48
Every list says what it is showing and out of how many. A truncated list that does not admit it is the same fault as a failed request rendering as zero.
Rank by code before you rank by person. A report that opens on a leaderboard of developers gets read as an accusation and stops being used; the same report opened on a list of expensive queries gets fixed.
03 · Coverage
Covered, charged, or genuinely unknown
Four states, and one of them is
an admission.
“Not covered” and “charged” are different questions, and most tools answer the first while printing the second. Shield 360 keeps them apart, and keeps a fourth state for the usage where nothing and nobody has said either way.
| State | Who said so | Charged? | Example |
|---|---|---|---|
| subscription | The tool itself | No | Claude Code on a Max seat |
| api_key | The tool itself | Yes | Codex CLI with OPENAI_API_KEY set |
| licence | An administrator | No | A seat recorded in Settings |
| unknown | Nobody | Not asserted | Usage with no auth type recorded |
A fact beats an assertion: when a tool reports its own auth type, that wins over any rule an administrator wrote. An unknown is never quietly counted as covered.
04 · Shadow AI
The spend that leaves no transcript
Find the AI nobody filed a ticket for.
Endpoint collection reads what AI tools write, so it finds the tools people install and nothing else. An application calling a provider directly writes no transcript and is invisible — while still spending. Shield 360 reads the socket tables the operating system already keeps, and reports which process, on which machine, as which user, talked to which provider.
| Process | Machine | User | Provider | Key | First seen |
|---|---|---|---|---|---|
| python3.11 | etl-runner-02 | svc-nightly-etl | api.openai.com | sk-proj-Xk2…7Qa4 | 14 Jun |
| node | build-07.eng | jenkins | api.anthropic.com | sk-ant-9fB…4f2a | 3 Mar |
| ruby | legacy-crm-01 | deploy | generativelanguage… | — | 28 Aug |
| curl | ana-mbp-14 | ana.o | api.x.ai | xai-7Hd…1c90 | 9 Sep |
The key column holds the last few characters and nothing more — never more than the provider itself publishes about that key. That fragment is what joins an application to the tokens a provider billed.
Reading a socket table and reading a process’s memory are different sizes of thing, so they are two separate switches, both off until an administrator turns them on. The second is labelled reads process memory wherever it appears.
05 · Code cost
Scanned in place; never stored
Some of your bill is a query
inside a loop.
Point the scanner at a repository and it reports the code that costs money to run: queries in loops, indexes made unusable by a function call, joins with no predicate, a connection opened per request. Each finding says what it costs and what to do instead.
for row in rows:
cur.execute("SELECT * FROM accounts WHERE id = %s", (row.id,))
enrich(row, cur.fetchone())
- Why
- A query inside a loop is one round trip per iteration. A hundred rows becomes a hundred round trips, and the cost grows with the data rather than with the code.
- Fix
- Collect the identifiers and issue one query with WHERE id = ANY(...), then join in memory.
Findings carry a normalised fingerprint of the statement — structure kept, literals stripped — so the same problem in forty files is one finding, not forty.
06 · Collection
What the agent does, and what it refuses to do
Nothing sits in the path
of a request.
Most tools that can tell you this much about AI traffic get there by terminating it: a proxy in the middle, a root certificate on every machine, decrypted traffic in somebody’s log. That buys visibility by weakening the thing it is watching. Shield 360 reads only what the operating system already records.
1 · On the machine
The agent reads the socket table the OS keeps anyway — lsof on macOS, /proc/net/tcp on Linux, GetExtendedTcpTable on Windows — plus the files AI tools write about themselves.
2 · On the way out
Process, machine, user, provider hostname, timestamps. No request bodies, no responses, no prompts, no packet capture. Outbound TLS only; nothing listens for inbound connections.
3 · Switched off
A file on the machine, a policy from the server, and a self-disable if a scan ever runs long. The server policy fails to off: if Shield is unreachable, the agent observes nothing.
Never, on any platform
07 · Install
In the app, on macOS, Windows and Linux
One paste per machine.
No administrator rights.
The collector downloads from your own Shield, authenticated by the enrolment key that is already in the command — so getting the agent costs no second credential, and the same paste works on an air-gapped network where your appliance is the only thing reachable.
Downloads live inside the app. Sign in, choose a plan, and Settings → Enrolment hands you a key and the exact command for each platform, already filled in. What is below is that command, so you can read the whole install before you commit to anything.
KEY='shield_ek_…' # Settings → Enrolment ARCH=$(uname -m) case "$ARCH" in aarch64|arm64) ARCH=arm64 ;; *) ARCH=amd64 ;; esac curl -fsSL -H "Authorization: Bearer $KEY" \ https://app.shield360.ai/api/v1/shield/agent/download/darwin-$ARCH -o shield-collector chmod +x shield-collector printf '%s' "$KEY" > /tmp/shield-key ./shield-collector enroll --endpoint https://app.shield360.ai --key-file /tmp/shield-key rm /tmp/shield-key ./shield-collector run --since 2160h # send the last 90 days, once ./shield-collector install # then report hourly
$KEY = 'shield_ek_…' # Settings → Enrolment curl.exe -fsSL -H "Authorization: Bearer $KEY" ` "https://app.shield360.ai/api/v1/shield/agent/download/windows-amd64" -o shield-collector.exe Set-Content -NoNewline "$env:TEMP\shield-key" $KEY .\shield-collector.exe enroll --endpoint https://app.shield360.ai --key-file "$env:TEMP\shield-key" Remove-Item "$env:TEMP\shield-key" .\shield-collector.exe run --since 2160h # send the last 90 days, once .\shield-collector.exe install # then report hourly
KEY='shield_ek_…' # Settings → Enrolment ARCH=$(uname -m) case "$ARCH" in aarch64|arm64) ARCH=arm64 ;; *) ARCH=amd64 ;; esac curl -fsSL -H "Authorization: Bearer $KEY" \ https://app.shield360.ai/api/v1/shield/agent/download/linux-$ARCH -o shield-collector chmod +x shield-collector printf '%s' "$KEY" > /tmp/shield-key ./shield-collector enroll --endpoint https://app.shield360.ai --key-file /tmp/shield-key rm /tmp/shield-key ./shield-collector run --since 2160h # send the last 90 days, once ./shield-collector install # then report hourly
The architecture is resolved on the machine rather than baked into the command. A fleet is not all one shape, and a hard-coded target hands most of an organisation a binary that cannot run.
It schedules itself
install registers a launchd agent on macOS, a systemd user timer on Linux, and a Task Scheduler entry on Windows. It runs as the signed-in user and asks for no administrator rights, so a pilot does not need a change window.
Day one is not empty
The one-off backfill sends the last 90 days. A scheduled run only reaches back 48 hours, so without it a freshly enrolled machine reports almost nothing and the dashboard reads as broken on the day someone installs it. Re-sending is safe — overlapping windows collapse.
The key never hits the process table
The enrolment key reaches the binary through a file, not an argument. Passed on the command line it would sit in the process table, readable by every other user on the machine, and in shell history.
The agent comes from your Shield
Binaries are served by your own deployment, to an active subscription, against a key you issued — not from a public mirror. That is what makes the install work air-gapped, and it means nothing about the agent is exposed to anyone who is not a customer.
Verify what you downloaded
Every build publishes SHA256SUMS, so a download can be checked against something other than the connection that delivered it.
Builds
Rolling out across a fleet? The same binary installs through MDM, Intune or a configuration-management run — talk to us about the deployment path for your estate.
08 · Reach
Providers, and what each one can actually answer
Connected providers say what
they can and cannot report.
Providers differ in what their billing APIs expose, and pretending otherwise produces confident wrong numbers. Every connection in Shield 360 declares its own limits, and a provider with no usage API is shown as unanswerable rather than as zero.
| Provider | Usage granularity | Key list | Key owner |
|---|---|---|---|
| Anthropic | Per API key | Yes | Yes |
| OpenAI | Per API key | Yes | Yes |
| Google · Gemini | Per model | — | — |
| xAI · Grok | no usage API | Yes | — |
Where a provider reports per model rather than per key, the screen says so. An empty list would read as “billed nothing”, which is a different claim entirely.
09 · Governance
Evidence, holds, and horizons that are enforced
Cost is one risk. It is not
the one that ends careers.
Sensitive data, reported
When content matching a sensitive pattern goes to a model, that is recorded as an event with a person, a machine and a time — without changing or blocking the request, and without keeping the content.
Evidence and legal hold
Export the audit trail for a window, a person or a machine. A legal hold pins the records it covers, and the retention sweep reports what it could not delete because of one.
Retention that actually runs
Audit events 730 days, application spans 90, browsing 30, machine state 90 — swept hourly by a scheduled job. A retention promise nothing enforces is the kind of problem that surfaces during an audit rather than on a dashboard.
Shield 360 produces the evidence an auditor asks for. It is not itself a certification, and nothing here should be read as one.
10 · Plans
Priced on enrolled machines
Priced on what you enrol,
not on what you look at.
Reports, findings and screens are never metered. Charging people to look at their own data teaches them not to look, which is the opposite of the point.
Visibility
Per enrolled machine
- Collection across macOS, Windows and Linux
- Cost by person and by machine
- Coverage basis — covered, charged, unknown
- Retention horizons and audit trail
Attribution
Per enrolled machine
- Everything in Visibility
- Shadow AI discovery
- Key fingerprinting and key owners
- Provider connections and invoice reconciliation
- Repository cost scanning
Governance
Per enrolled machine
- Everything in Attribution
- Sensitive-data detection and reporting
- Evidence export and legal hold
- SIEM export
- SSO via your own OIDC or SAML
Find out what the invoice
has not been telling you.
Enrol a handful of machines, connect one provider, and compare what Shield 360 reports against the bill you already have.