Every tool on this page is real and useful. None of them finds the bug that matters most on an API — a valid 200 OK returned to the wrong caller — unless you give it two accounts and tell it what to compare. This is what each category actually covers, and what you still have to do yourself.
The four categories, and what each one can honestly find
1. Proxies and manual testing platforms
Burp Suite and OWASP ZAP sit between the client and the API and let you see, replay and modify every request. This is where real API testing happens, because it is the only category that lets you ask an arbitrary question. Their automated scanners find injection, reflected input and hygiene issues; their value for authorisation comes from replay — send the same request with a different session and look at what comes back.
For authorisation specifically, the Burp extension Autorize is the one to know: you give it a low-privilege session, browse as the high-privilege user, and it replays each request as the low user and flags where responses match. ZAP's access-control testing add-on does the same thing with a context and two users. Both need you to define the accounts — which is the whole point.
2. Spec-driven fuzzers
Schemathesis and similar tools read your OpenAPI or GraphQL schema and generate requests that conform to it — and requests that deliberately do not. They are excellent at finding 500s, schema violations, and endpoints that accept values the spec says are impossible. They run in CI, they are fast, and they require no credentials beyond a token.
Their blind spot is the same one: a fuzzer checks that a response matches the schema, not that the response belongs to the caller. An endpoint that cheerfully returns another tenant's invoice is schema-valid.
3. Template scanners
Nuclei matches thousands of community templates against a target: exposed Swagger UI, public GraphQL introspection, default credentials on management endpoints, known CVEs in API gateways, leaked .env files. On an API perimeter this is genuinely high yield and takes minutes — see the Nuclei guide for how to run it sanely. It finds known things in known shapes; your custom authorisation logic is neither.
4. Injection specialists
sqlmap goes far deeper on a suspected SQL injection than any general scanner: it confirms, fingerprints and demonstrates exploitability. Use it as the second step after a general probe raises a signal, pointed at one parameter — not as a broad sweep.
The gap every category shares
Broken object level authorization — IDOR/BOLA, the number-one item in the OWASP API Top 10 — produces a response that is syntactically perfect. There is no error string, no payload reflection, no anomalous status code. The only signal is semantic: this data belongs to someone else. A tool can only detect it if it holds two authenticated sessions simultaneously and has an oracle for deciding when one received the other's data.
That oracle is harder than it sounds. Comparing whole response bodies fails immediately, because two tenants routinely get the same rows in a different order, and timestamps or session identifiers differ on every request. What works is marking account A's data — an email, an account number, an invoice reference — and asking whether those markers appear in account B's response, plus an order-independent comparison of the returned record set. Get that wrong in either direction and you either miss real leaks or drown the report in noise.
A stack that covers the ground
- Perimeter, weekly, no credentials: certificate transparency for forgotten
api-staging.hosts, plus TLS, headers and cookie flags on each one. Cheap, automatable, and where the embarrassing findings live. - Inventory, per release: OpenAPI + GraphQL introspection + endpoints extracted from the front-end JS bundle, merged and de-duplicated. The bundle is the source that catches undocumented routes.
- Schema fuzzing, in CI: Schemathesis against the spec, failing the build on 5xx.
- Authorisation matrix, per release: two accounts, every id-scoped endpoint, four requests each — owner, other account, unauthenticated, low-privilege on a privileged-looking path.
- Business logic, twice a year: a human with your domain context.
# The minimum CI test almost nobody writes — ten lines, catches the number-one API risk
def test_other_account_cannot_read_invoice(client, invoice_of_user_a, session_b):
r = client.get(f"/api/invoices/{invoice_of_user_a.id}", headers=session_b)
assert r.status_code == 404 # same 404 as a non-existent id, never 403What our tooling does — and does not — cover
Our free tools are deliberately the perimeter half, because that half can be run without your credentials and without your permission being in question. The subdomain finder reads certificate transparency logs and shows which api./staging. hosts are publicly visible; the security score covers transport, headers, cookies and exposed files on a host; the CSP checker grades the policy. One request per host, nothing crafted, no login.
The authorisation half is not something a free tool can do, because it requires accounts on your system and your written authorisation. That is what our deep audit is: the endpoint inventory, then the two-account matrix, then proof in the report rather than a severity label.
Deep audit: endpoint inventory from spec + bundle, two-account authorisation matrix (BOLA, BFLA, excessive data exposure), read-only injection probes, and a report that shows 'logged in as B, read A's invoice' rather than a CVSS number. Quoted per application, from €900.
Ask about a deep audit →If you are choosing where to start, read the API security testing guide for the order that costs least, and attack surface management for keeping the perimeter half from drifting between releases; the API security checklist turns both into lines you can tick off.