Skip to content

Know before it breaks

The APIs you depend on
are being switched off.

Vendors retire APIs on published schedules. Your code keeps calling them until the day it stops working. Drift Detector finds those calls before that day — down to the exact file:line, each one carrying a link to the vendor's own announcement.

Ask Claude about it Opens Claude with this site's documentation as context — ask instead of reading.

New Now finds leaked credentials across your whole git history, not just today's files — see what's new.

Finds what scanners miss

Dependency scanners read your manifest. This reads your code — the endpoints, versions and AI models you actually call, including ones no package file mentions.

Every date has a receipt

No retirement is recorded without a link to the vendor page it was read from. A date nobody fetched is refused by the tool itself, not by convention.

Says when it cannot see

"Nothing found" and "nothing checked" are different answers, and it never confuses them. Unreadable code and unaudited vendors are reported, not silently passed.

/plugin marketplace add TOPSinfo/drift-detector-scan
/plugin install drift-detector@tops-tools
/drift-detector /path/to/a/folder

Most scanners stop at packages

They tell you a library has a CVE. They cannot tell you that Amazon is retiring /fba/inbound/v0 on a date, that six lines in your codebase call it, or that eBay switched off webservices.ebay.com in 2022 and you are still calling it.

That second layer — retiring vendor APIs — is what this is for. It reads PHP, Python, Ruby, Go, Java, JavaScript, TypeScript and C#, so one scan covers a mixed codebase.

Three rules it will not break

It never invents a retirement date. Every date carries the vendor's own source URL and the day it was checked. A gate refuses any date without a fetched source — so a plausible-but-wrong date cannot enter the catalog, however confident anything was about it.

"Cannot see" is never "clean". A repo it could not fully read comes back UNKNOWN with the reason, not a green tick. Zero findings for a vendor nobody has audited is not evidence of health, and the report says so in those words.

AI proposes; the scanner adjudicates. An AI pass reads your repos for integrations the rules have not learned yet — but it may never state a date, only yes/no/unknown. Certified findings and AI leads live in separate tiers, and a verify invariant proves a lead never reaches the certified data.

How a run works

flowchart LR
    subgraph offline["deterministic · zero LLM tokens"]
        A[ast-grep + manifests] --> B[(inventory.json)]
    end
    subgraph network["audit"]
        B --> C[OSV · endoflife.date<br/>vendor-sunset catalog]
        C --> D[(audit.json)]
    end
    D --> E[(drift.json<br/>the one contract)]
    E --> F[drift.md]
    E --> G[Cockpit]
    E --> H[SARIF · SBOM]
    E --> I[GitLab issues]
    V[verify] -.->|re-parses every surface| E

drift.json is the single contract. Every other surface — the Markdown report, the dashboard, SARIF, SBOM — is a verified projection of it. drift-scan verify re-parses them and fails if any disagrees, so a number cannot drift between the data and the report.

What it found on a real fleet

Run across 34 internal repositories, it surfaced 28 retirements already past their switch-off date — including 11 retired eBay calls (the oldest from 2022), 6 retired Amazon Selling Partner API families, 4 superseded Shopify versions, and three marketplaces that had shut down entirely.


Next

  • Claude Code plugin — installing it, and what each command does
  • FAQ — where the rules live, how the trust tiers work, what happens when it is blind
  • Teaching it a new shape — absorbing a repo the scanner cannot read
  • Glossary — every term this tool uses, what it means, and the mistake it exists to prevent. Start here if a verdict or a badge is not self-explanatory.
  • Evaluating the scanner — the corpus and the recall gate
  • Roadmap — what is next