Open the app

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.

Fleet statement 1–30 Sep 2026 · 1,204 machines

AI spend observed

$48,213.77

Covered by a subscription The tool said so. $31,440.00
Charged to an API key Billed per token, on top of what you already pay. $14,902.11
Against a licence An administrator asserted it. $1,871.66
Nobody said Neither the tool nor an administrator. $0.00

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.

Insights → Breakdown Illustrative

By person · 1 of 312

Ana Oyelaran$4,118.40
Devin Whitlock$3,002.19
svc-nightly-etl$2,884.05
Priya Raghunathan$1,640.77
Unattributed key$1,203.00

By machine · 1 of 1,204

build-07.eng$5,760.12
ana-mbp-14$3,940.88
etl-runner-02$2,884.05
devin-win-ws$1,510.60
qa-sandbox-11$ 902.34

By code path · 1 of 48

search/rerank.ts$6,204.90
etl/enrich_rows.py$2,884.05
support/triage.ts$1,332.10
docs/summarise.go$ 811.55
onboarding/seed.ts$ 402.00

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.

Coverage basis Illustrative
StateWho said soCharged?Example
subscription The tool itselfNo Claude Code on a Max seat
api_key The tool itselfYes Codex CLI with OPENAI_API_KEY set
licence An administratorNo A seat recorded in Settings
unknown NobodyNot 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.

Shadow AI → Applications observed Illustrative
ProcessMachineUserProviderKeyFirst seen
python3.11etl-runner-02svc-nightly-etlapi.openai.comsk-proj-Xk2…7Qa414 Jun
nodebuild-07.engjenkinsapi.anthropic.comsk-ant-9fB…4f2a3 Mar
rubylegacy-crm-01deploygenerativelanguage…28 Aug
curlana-mbp-14ana.oapi.x.aixai-7Hd…1c909 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.

Findings → payments-api Illustrative
select-in-loop src/etl/enrich_rows.py:212
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.

Your source never leaves the machine it is on The scanner runs where the repository already is. It uploads findings — rule, file, line, and the normalised shape of the statement — and nothing else.

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.

Data path

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

No proxyTraffic goes where it was going, by the route it was taking.
No root certificateNothing is installed into any trust store, so no TLS connection is weakened to be read.
No prompts or responsesThe agent cannot see message content, and token counts come from the provider rather than from the wire.
No code storedThe repository scanner reads in place and uploads findings.

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.

Terminal Apple silicon · Intel — resolved on the machine
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

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

macOS arm64 · amd64 Windows amd64 Linux arm64 · amd64
Get your enrolment key Available in the app once a subscription is active.

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.

ProviderUsage granularityKey listKey owner
AnthropicPer API keyYesYes
OpenAIPer API keyYesYes
Google · GeminiPer model
xAI · Grokno usage APIYes

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
Talk to us

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
Talk to us

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.

Open the app hello@shield360.ai