API security testing that runs with every regression

Test for BOLA, IDOR, auth bypass, and injection in the same suite as your functional tests. Qodex writes the attack scenarios, replays them on schedule, and refuses to relax a failing security check.

4.9 / 5 from 60 reviews on G2

Security testing is one module of Qodex, the agentic AI QA platform: the same autonomous agent covers UI testing, API testing, and PR review.

acme-api · stagingqodex · security audit
OWASP API Top 10 · weekly auditrun_9c4e1 finding
Auth bypass38 probesclear
BOLA / IDOR31 probes1 finding
Injection28 probesclear
SSRF18 probesclear
Misconfiguration22 probesclear
finding · api1 bola · high

GET /api/v1/invoices/8412 as user B returned 200, expected 403. Cross-user read succeeded; filed with severity, repro steps, and captured evidence.

Request
GET /api/v1/invoices/8412
Authorization: Bearer <user_b>
Response · 200 OK
{ "invoice_id": 8412,
  "customer": "user_a@example.com",
  "total": 1840.00 }
pass = attack blocked · evidence required to filereplay: 0 llm tokens
the proof

See the agent attack a real API

Claims about AI security testing are cheap. The test is whether an agent can take a plain-English request, author an attack scenario, and produce a finding you can verify. Here is Qodex doing exactly that.

api-security-demorecorded product run

What is API security testing?

API security testing sends hostile requests at your API on purpose (foreign object IDs, tampered tokens, oversized payloads, injection strings) and proves the API refuses every one. It is a form of dynamic application security testing (DAST): it exercises the running API rather than scanning source code, and it never stops at the happy path.

The highest-impact API vulnerabilities are authorization failures, one user reading another user's data or a regular role reaching an admin function, and they are invisible to scanners that never authenticate. Qodex writes these attack scenarios, runs them across multiple auth roles, and replays them on every release as part of the wider agentic AI QA platform, in the same suite as your functional API tests.

how it works

Chat, attack scenario, deterministic replay

An autonomous agent replaces the repetitive part of both the yearly pentest and the miss-everything-authenticated scanner with a three-step loop.

01

You name the target in chat

Tell the agent what to attack in plain English: audit /invoices for IDOR, sweep the API for the OWASP Top 10. No DSL, no payload library to wire up.

02

The agent writes an attack scenario

Using your auth profiles, it authors a structured scenario with inverted semantics: goal, ordered steps, and an assertion where a pass means the attack was blocked, plus a runnable script you can read.

03

Replay is deterministic, and free

Once saved, the scenario is plain code: same payloads, same assertions, no model in the loop. Running the full OWASP suite on every deploy costs nothing extra in LLM spend.

A human reviews findings; the agent files them, classifying each replay failure as a real bug, a stale test the API outgrew, or an environment issue.

The six checks that catch real breaches

A useful security test proves the API refuses what it should refuse, including the authorization checks that require logging in as more than one user, which is exactly where the worst bugs hide.

what every security test checkssix checks
Object-level authorizationWhether user B can read or mutate user A's objects by changing an ID. This is BOLA/IDOR, the number one API risk, and it is invisible to scanners that never authenticate as two users.
Authentication strengthWhether protected endpoints reject expired, missing, tampered, and cross-environment tokens instead of trusting anything that looks like a JWT.
Function-level authorizationWhether a regular role can reach admin or internal endpoints, including verb switching like flipping a GET to a DELETE on the same route.
Input validation and injectionWhether injection strings, malformed bodies, and oversized payloads come back inert and structured rather than as a 500, a stack trace, or executed input.
Data exposure and misconfigurationWhether responses leak fields a role should not see, whether errors are verbose, whether CORS is permissive, and whether debug endpoints are reachable.
Resource and flow abuseWhether rate limits, payload caps, and state checks hold when sensitive flows are driven at machine speed and out of order.

The OWASP API Security Top 10

The OWASP API Security Top 10 (2023 edition) is the standard map of how APIs actually get breached. Here is each risk, and how the agent tests for it against your real endpoint inventory, so coverage tracks what your API exposes, not a generic checklist.

owasp api security top 10 · 2023how an agent tests each risk
RiskNameHow an agent tests it
API1:2023Broken Object Level Authorization (BOLA)Request objects owned by user A while authenticated as user B, across every object-bearing endpoint. Pass means the API returns 403/404; a 200 with foreign data files a finding.
API2:2023Broken AuthenticationProbe token handling: expired tokens, missing tokens, tampered signatures, tokens from other environments. Verify protected endpoints reject every variant.
API3:2023Broken Object Property Level AuthorizationSend writes containing fields the role should not control (role, is_admin, price) and read responses for fields it should not see. Pass means extra properties are ignored or rejected.
API4:2023Unrestricted Resource ConsumptionRequest oversized page sizes, deep pagination, and repeated expensive operations; check for rate limits, payload caps, and bounded responses instead of timeouts.
API5:2023Broken Function Level AuthorizationCall admin and internal endpoints with non-admin credentials, including verb switching (GET to DELETE) on the same route. Pass means the role boundary holds per function.
API6:2023Unrestricted Access to Sensitive Business FlowsDrive sensitive flows (checkout, signup, password reset) at machine speed and out of order; verify anti-automation controls and state checks hold.
API7:2023Server Side Request Forgery (SSRF)Submit URLs pointing at internal addresses and metadata services in any URL-accepting parameter; verify the server refuses to fetch them.
API8:2023Security MisconfigurationCheck for verbose error bodies, stack traces, permissive CORS, missing security headers, and enabled debug endpoints across the inventory.
API9:2023Improper Inventory ManagementDiff the discovered endpoint inventory against the documented spec; probe undocumented and versioned-but-forgotten endpoints (/v1 left behind by /v2).
API10:2023Unsafe Consumption of APIsWhere your API ingests third-party data, feed it malformed and malicious upstream responses; verify validation happens at the consumption boundary too.

For the full list with fixes, read the OWASP API Top 10 guide, or the focused breakdown of broken function level authorization.

Pass means the attack was blocked

Security tests have the opposite shape from functional tests. A functional test passes when the request succeeds; a security test passes when the request is refused: the foreign invoice returns 404, the tampered token gets a 401, the injection string comes back inert. Qodex encodes this inversion in the scenarios themselves: pass means blocked, fail means vulnerable.

This matters because AI test tools are built to make failing tests pass, and the cheapest fix for a failing security check is always to relax the assertion and accept the leaked field. Qodex's security skill is explicitly built to never weaken a failing security assertion: a failing security test stays red until the API stops being vulnerable. High and critical findings also require captured evidence before the agent can file them, and repeat observations are deduplicated against open findings instead of flooding the queue.

pass = attack blockedfail = vulnerable

Multi-role auth profiles that cross the streams

You cannot find an IDOR with one set of credentials. The bug is, by definition, about what user B can do with user A's data, so the test has to authenticate as both and cross the streams. This is why unauthenticated scanners structurally miss the number one API risk.

Qodex environments support multiple auth profiles, for example an admin, a regular user, and a viewer, each with its own credentials. The agent uses them in combination: fetch a resource as admin, replay the request as the viewer, assert the boundary holds. Auth setup is handled per environment (HTTP login flows with token extraction, or a real browser login when your auth lives behind a web form), and because these are normal scenarios, every IDOR check you author joins the same scheduled suite as your functional API tests.

auth profiles · stagingadmin · user · viewer
# fetch as admin
GET /api/v1/invoices/8412
Authorization: Bearer {{admin_token}}
→ 200 OK

# replay as another role
GET /api/v1/invoices/8412
Authorization: Bearer {{viewer_token}}
# pass = the boundary holds
→ expected 403 / 404

Run on a schedule, on a webhook, or on demand

Active security scenarios run three ways. Because replay is deterministic, running the full OWASP suite on every deploy is an engineering decision, not a budgeting one.

On a schedule

Cron-based recurring runs: a nightly regression alongside a weekly security audit. Each schedule carries its own notification policy, so results reach the right email or Slack channel on the conditions you choose.

On a webhook

Your CI pipeline or deploy hook triggers a security run with one HTTP call, authenticated by a per-project API key. Ship to staging, fire the webhook, and get a verdict before the change reaches production.

On demand

Ask the agent in chat to audit a single endpoint for IDOR, run a tagged subset, or sweep the full OWASP suite, and watch the findings stream in live.

Plans and usage caps are on the pricing page.

See pricing

Manual vs automated vs continuous penetration testing

The three approaches differ in cadence and in what happens between snapshots. Continuous penetration testing keeps deterministic, scriptable attack scenarios running on every release, and is the only model where a fixed vulnerability stays tested forever.

Manual pentestAutomated scanContinuous (Qodex)
CadenceOnce or twice a year, per engagementWhen someone remembers to run the scannerEvery release, nightly, or on the schedule you set
Who finds the bugsA human expert, for a fixed windowA scanner running canned checksThe agent authors attack scenarios; a human reviews findings
BOLA / IDOR coverageYes, if the tester logs in as two usersUsually missed; most scanners never authenticate twiceBuilt in: multiple auth profiles, role-crossing by default
Exposure windowUp to a year between a regression and its discoveryUntil the next ad-hoc runOne release cycle
Cost per rerunA new engagement and re-test feeA scanner license seatScenarios authored once; replays add no LLM cost
Regression detectionOnly if the next engagement re-tests itOnly if the same scan is re-run unchangedAutomatic: every fixed vulnerability stays tested

This is not an argument against pentests. Keep them, and stop paying them to rediscover bugs a scheduled scenario would have caught in the same week they were introduced. For a tool-by-tool breakdown of the scanning options, see our comparison of API security testing tools.

API security testing FAQ

Comparing tools? See the best API security testing tools roundup.

API security testing sends hostile requests at your API on purpose (foreign object IDs, tampered tokens, oversized payloads, injection strings) and checks that every one of them is rejected. It is a form of dynamic application security testing (DAST): it exercises the running API rather than scanning source code. It targets the bugs scanners miss because they require authentication and context, above all broken authorization (BOLA and IDOR). In Qodex, you describe the target in plain English, the agent writes the attack scenarios, runs them, and triages every finding.

Your attackers test continuously. So should you.

Point the agent at your API, set up your auth roles, and get OWASP-aligned attack scenarios that replay on every release at zero LLM cost.

API1 BOLA · GET /api/v1/invoices/8412 → 200, expected 403