A mobile app is a client. A single-page frontend is a client. The logic, the data and the authorisation decisions live on the other side of the network, in an API that answers whatever arrives — not only what the client was written to send. Testing the client tests the client.
APIs are the surface a scope can omit without anyone noticing. CERT-In names them inside the engagement class at §6(xii) of the Comprehensive Cyber Security Audit Policy Guidelines (version 1.0, 25 July 2025), names “API Security Audit” as a declarable audit type at §13.2.3(i)(a), and names APIs again in the scoping clause at §13.1.1(a). OWASP’s ASVS 5.0.0 gives the API its own chapter, separate from the web frontend.
Plain-English explainer · CERT-In Comprehensive Cyber Security Audit Policy Guidelines v1.0 (25 July 2025) · OWASP ASVS 5.0.0 · OWASP API Security Top 10 (2023) · Every clause locator and URL checked 22 September 2026
What is API security testing? Testing the server, not the client
API security testing is the direct examination of an application’s programmatic interface — its endpoints, parameters, tokens and authorisation decisions — by sending requests the client application was never written to send. It covers authentication and token handling, object level and function level authorisation, object property level authorisation and mass assignment, rate limiting and resource consumption, input validation, error handling and information disclosure, and versioned or deprecated endpoints still serving traffic.
It is a separate activity from web application testing and from mobile application testing because a browser and a mobile app are clients of the API. They send a narrow, well-formed subset of the requests the server will accept: the fields the form has, the methods the buttons use, the identifiers the logged-in account owns. An attacker sends the other requests. Every serious API finding lives in the gap between those two sets, which means a test driven through the interface cannot reach it — not because the tester was careless, but because the harness was the wrong shape.
That gap has a commercial shape as well as a technical one. When an API is not named in the scope, the report is not wrong about anything. It simply describes a smaller estate than the one you run, in language that reads like a description of the whole. “Web application penetration testing was performed” is a true sentence about a hostname. Six months later, when a customer’s security questionnaire or an incident forces someone to read the document carefully, the coverage everyone assumed turns out never to have been claimed.
Four things that are easy to get wrong about API testing
Each one is addressed in full further down, with the clause or requirement behind it.
A web application test is not an API test.
OWASP ASVS 5.0.0 keeps them in separate chapters — V3 Web Frontend Security and V4 API and Web Service — and says in terms that for a machine-to-machine API the V3 requirements “will not be relevant”. A scope naming “ASVS” without naming chapters has not made the distinction.
A mobile application test is not an API test either.
OWASP’s Mobile Application Security project keeps network communication with remote endpoints in its own control group, MASVS-NETWORK, alongside storage, cryptography, platform and resilience. Testing the binary tells you about the binary.
One test account makes the largest finding class unreachable.
Object level authorisation is tested by calling an endpoint as account A with an identifier belonging to account B. With one account there is no B. The report will be silent, and silence reads as absence.
You cannot test what you have not enumerated.
The specification drifts from the deployment in both directions. §13.1.1(c) requires the scope to be derived from a consolidated and updated asset inventory, and §13.2.3(ii)(b) requires the as-of date of that inventory to appear in the report. Read the date before you read the findings.
Key Takeaways
- API security testing examines the server directly, by sending requests the client was never written to send. It is a distinct activity from web application testing and from mobile application testing, because a browser and a mobile app are clients of the API rather than the API itself.
- CERT-In names APIs three times in the 2025 audit policy guidelines: inside the engagement class at §6(xii) — “Application security testing (including web applications, mobile applications and APIs)” — as a declarable audit type, “API Security Audit”, at §13.2.3(i)(a), and in the scoping clause at §13.1.1(a).
- OWASP ASVS 5.0.0 separates V3 Web Frontend Security from V4 API and Web Service, and requirement 8.3.1 requires authorisation to be enforced “at a trusted service layer”, not by controls an untrusted consumer can manipulate such as client-side JavaScript. That requirement is the whole argument of this page in one sentence.
- The coverage areas are authentication and token handling, object level authorisation, function level authorisation, object property level authorisation and mass assignment, rate limiting and resource consumption, input validation, error handling and information disclosure, and versioned or deprecated endpoints still serving traffic.
- Object level authorisation needs at least two accounts. One test account makes an entire finding class structurally unreachable, and a report produced that way is silent about it rather than negative on it.
- Discovery is the half of the engagement that decides whether the other half means anything. Specifications drift from deployments in both directions. Enumerate from the specification, the clients, the gateway routes, DNS and the asset inventory, and reconcile every difference to an owner before testing starts. A shadow API is deployed and undocumented, while a zombie API is deprecated and still routed.
- Every API finding needs a CWE, because §16.2(ii) requires the mapping and a defect in your own code has no CVE to fall back on. The page prints the identifiers for each coverage area — CWE-639 and CWE-863 for object level authorisation, CWE-862 and CWE-285 for function level, CWE-915 for mass assignment, CWE-770 and CWE-799 for resource consumption, CWE-209 for error disclosure — and shows one finding written up in full against the thin version of the same finding.
- A tester needs five things, and three decide the engagement: a specification with an honest account of its drift, credentials at every privilege level with at least two accounts at the same level, and a non-production environment that genuinely replicates production — §5(xiv), §15.1.2 and §15.2.3(i).
- CERT-In SAMVAAD 2026 named the auditing of cloud systems, APIs and operational technology among the topics of the presentations selected for the conference, in the Government of India’s own release and in CERT-In’s published proceedings.
- Scoring API findings honestly means accepting that a defect in your own logic has a CWE and no CVE — and therefore no EPSS value, because EPSS estimates exploitation probability for published CVEs. Record “not applicable” rather than inventing a number.
- We deliver CERT-In audits, end to end, with our CERT-In empanelled partners.
Why does testing a web frontend not test the API behind it?
Because the frontend is a filter. It sends a small, well-formed subset of the requests the server will accept, and a test driven through it inherits that subset as its ceiling. The form has four fields, but the handler binds forty. The interface hides the administrative button, but the route still resolves. The account owns its own records, but the endpoint accepts any identifier. None of those three facts is visible from a click path, and all three are ordinary findings on a first API engagement.
This is not a TCSA opinion about how testing ought to be organised. It is how the published standards are organised, and how CERT-In’s own engagement classes are written. Three published documents — OWASP’s ASVS, OWASP’s Mobile Application Security project and CERT-In’s audit policy guidelines — draw the line in their own structure, in five places between them.
| Instrument | Where it draws the line | What it says | What follows for a scope of work |
|---|---|---|---|
| OWASP ASVS 5.0.0 | Two separate chapters | V3 is “Web Frontend Security”. V4 is “API and Web Service”. They are different chapters of the same standard, with different requirements and different levels. The standard’s own guidance on filtering makes the split explicit: “for a machine-to-machine API, the requirements in chapter V3 related to web frontends will not be relevant.” | A scope of work that says “ASVS” without saying which chapters is not a scope. A tester can satisfy V3 completely and never send a request the browser did not already send. |
| OWASP ASVS 5.0.0, requirement 8.3.1 | Authorisation lives on the server | Verify that the application “enforces authorization rules at a trusted service layer and doesn’t rely on controls that an untrusted consumer could manipulate, such as client-side JavaScript.” | The requirement is written against exactly the failure this page is about. If the only enforcement you tested was the one the browser performed, you tested the control the standard tells you not to trust. |
| OWASP Mobile Application Security (MAS) | The network is its own control group | MASVS-NETWORK is a distinct control group covering “secure network communication between the mobile app and remote endpoints”, alongside MASVS-STORAGE, MASVS-CRYPTO, MASVS-AUTH, MASVS-PLATFORM, MASVS-CODE, MASVS-RESILIENCE and MASVS-PRIVACY. | A mobile application security audit that covers storage, platform and resilience has still not covered what the remote endpoint does when a modified request arrives. Ask which control groups were in scope. |
| CERT-In audit policy guidelines, §6(xii) | Named in the engagement class itself | The class is “Application security testing (including web applications, mobile applications and APIs)”. CERT-In put all three inside one class, in one bracket, rather than leaving APIs implicit in “web application”. | You cannot argue that an API is covered by silence. The instrument names it, which means a scope that omits it omits something the instrument expected to see. |
| CERT-In audit policy guidelines, §13.2.3(i)(a) | A declarable type of audit | “API Security Audit” appears in its own right in the list of audit types a scope must declare, alongside Web Application Security Audit and Mobile Application Security Audit. The list ends with “etc.”, so it is not a closed set. | If a proposal declares a Web Application Security Audit and the estate is a single-page frontend over a REST API, the declared type and the real surface do not match. That mismatch is visible on page one of the report. |
What the client can express
- The endpoints the current build calls.
- The HTTP methods the current build uses.
- The fields the current forms send.
- The identifiers the signed-in account owns.
- One request per interaction, at human speed.
- Values that pass client-side validation.
- The tokens the client was issued, unaltered.
What an attacker sends instead
- Endpoints from an older version, an internal tool or the specification.
- Methods the interface never uses on paths it does.
- Fields the model accepts and the form does not show.
- Identifiers belonging to another account, tenant or organisation.
- Thousands of requests, in parallel, at machine speed.
- Types, lengths, encodings and nulls that validation never anticipated.
- Tokens that are expired, revoked, altered or issued for something else.
Read the two columns as a single sentence: everything in the right-hand column is a request your API will receive in production and will never receive from your own client. If the engagement’s harness was the client, the right-hand column is the part of the estate that was not tested — and the report, written accurately, will not say that it was.
How the gap appears in a report as coverage that was never there
The sentences below are ordinary, accurate report language. None of them is a misrepresentation. Each one is read by most buyers as a broader claim than it makes, and the difference between the two readings is where an untested API hides. If you are holding a report right now, this is the table to read it against.
| What the report says | What it is read as | What it actually establishes |
|---|---|---|
| “Web application penetration testing was performed on https://app.example.in.” | The application was tested. | A hostname was tested. If the application is a single-page frontend calling api.example.in, the host that holds the logic is not named in that sentence and may not be in the asset list either. Check the asset list against the hostnames in the evidence. |
| “Testing was performed using an authenticated user account.” | Authorisation was tested. | Singular. One account cannot test object level authorisation, because the test requires a second account’s identifier. Ask how many accounts were issued and at which roles. §15.1.2 governs the issue of those accounts, but the number is a scoping decision, not a technical detail. |
| “All functionality accessible through the user interface was exercised.” | Full coverage. | The interface was the test harness. Everything an attacker does that the interface cannot express — a field the form does not send, a method the button does not use, an identifier the account does not own — is outside that sentence. |
| “No high or critical findings were identified.” | The API is secure. | Nothing of the kind. §10.1(i) of the 2025 guidelines limits an auditor’s responsibility “to reviewing and reporting on the state of security at the point in time of the audit”. Read it with the limitations paragraph §16.1(ii) requires, which is where exemptions and constraints are recorded. |
| “Scope: 12 endpoints.” | The API has twelve endpoints. | Twelve endpoints were tested. Whether the API has twelve is a question about discovery, and §16.1(iii) requires that all assets provided in the scope by the auditee are mentioned in the report — which makes the report a record of what you declared, not of what exists. |
| “The application was tested against the OWASP Top 10.” | A recognised standard was applied. | §8(ii) of the 2025 guidelines states that “the limited lists such as OWASP Top 10, SANS Top 25 and similar, should not be considered as standards or references for audits”. A ranked awareness list has no coverage claim to make. The API Security Top 10 is squarely within “and similar”, and OWASP says the same of itself: the 2023 edition describes itself as “a forward-looking awareness document”. |
| “Testing was conducted on the staging environment.” | Close enough to production. | Only if staging replicates production, which is what §5(xiv) says a staging environment is for. §16.3(v) requires the report to state explicitly where the audit was not conducted on production. Ask which controls exist only in front of production — the gateway, the WAF, the rate limiter — because findings about those were not made. |
The general discipline for reading any of these documents is set out in reading a VAPT report. The short version for an API engagement: read the scope, the limitations and the account list before you read a single finding. §16.1(ii) of the 2025 audit policy guidelines requires the report to carry the detailed scope, the methodologies, the tools, the manual process, the sampling decisions, the manpower involved and the “exemptions, limitations and other constraints”. That last phrase is where an honest firm tells you what it could not reach.
Do I need a separate API test, or is it inside my web test?
It can sit inside the same engagement. It cannot sit inside the same engagement silently, because §13.2.3(i)(a) makes the type of audit something the scope declares before commencement, and declaring one type does not declare another. The answer depends on the shape of your estate rather than on the size of your company, so the table is keyed to shapes. Find your row, then check the last column: it says what a web application audit alone would have to state in its limitations paragraph under §16.1(ii) to be defensible on that estate.
| If your estate is | Declare it separately? | The scoping unit | Minimum accounts | Is a web audit alone defensible? |
|---|---|---|---|---|
| Single-page frontend over a REST API | Yes — declare “API Security Audit” separately. | Route and role. | Two at the same level in different tenants, plus one per role, plus an unauthenticated baseline. | A web application audit alone is not defensible on this estate, because the frontend is the harness and the harness cannot express the requests that find the authorisation classes. To be defensible it would have to say, in the limitations paragraph §16.1(ii) requires, that testing was driven through the client and that object, function and field level authorisation on the API were therefore not exercised. |
| Server-rendered monolith with a handful of AJAX routes | Usually no — but name the AJAX routes in the asset list. | Route and role, for the AJAX routes. Page and role for the rest. | Two at the same level, plus one per role. The tenant question may not arise if the product is single-tenant. | Defensible, provided the handful of routes are enumerated and tested as routes rather than reached through the page. The limitations paragraph should name them and say they were tested directly. |
| Mobile-only client, no web frontend | Yes — and a Mobile Application Security Audit does not cover it. | Route and role, derived from the binary and the gateway rather than from a specification. | As for the single-page case, plus a certificate or debug build if the client pins. | There is no web application audit to be defensible or not. The risk here is the opposite substitution: a mobile application security audit that covers storage, cryptography, platform and resilience and never sends a modified request to the server. Ask which MASVS control groups were in scope and what the server did when a modified request arrived. |
| Public or partner-facing API, with or without a first-party client | Yes, and it is the primary declaration rather than a secondary one. | Route, role, and consumer. | One per role per consumer class, in at least two tenants, plus the unauthenticated baseline. | Not applicable — the API is the product. What needs writing down instead is the §15.2.2(iii) constraint: testing “must not involve external entities such as customers, business partners, vendors, or other third parties, unless specific written consent is obtained”, so a partner’s credentials or a partner’s traffic needs that partner’s consent and not only yours. |
| GraphQL | Yes, and say “GraphQL” in the first scoping call. | Resolver and field, never the path. | As for REST. The account count does not fall because the path count did. | A web application audit that records “1 endpoint” has under-scoped the estate by the ratio of resolvers to paths. ASVS 5.0.0 gives GraphQL its own section at V4.3. A scope that does not name it has not engaged with the shape. |
| Internal service-to-service estate, no external exposure | Yes if the admin, support or partner host is in scope. Otherwise a written exclusion. | Service method, and the calling identity. | Service identities rather than user logins, plus at least one user identity whose permissions the chain is supposed to carry. | There is usually no web audit in view. The decision to make explicitly is the exclusion: §13.1.1(a) puts the entire cyber infrastructure in scope with APIs named in it, so leaving the internal surface out is a decision to write into the scope of work rather than an assumption to inherit. |
The arithmetic test cuts across every row and takes one exchange of emails. Ask how many endpoints are in scope and where that number came from, and ask how many accounts will be issued at how many roles in how many tenants. If the answers are “fifteen screens” and “one login”, the API has not been scoped whatever the proposal is titled.
What does API security testing actually cover?
Eight areas, and the reason the interface reaches none of them
Each area below carries four things: the question it answers, why a browser-driven test misses it, what the evidence for a finding looks like, and the ASVS 5.0.0 requirement to name in a scope of work. The OWASP API Security Top 10 vocabulary is given last in each block, and deliberately last — it is useful for describing a finding and, as §8(ii) of the 2025 guidelines and OWASP itself both say, it is not an audit criterion.
Authentication and token handling
Who is the caller, and how long does the server keep believing it?
What is tested
How credentials are exchanged for a token, what the token asserts, how it is validated on every subsequent request, what happens when it expires, what happens when it is revoked, and what the server does with a token that is well-formed but wrong — signed with the wrong key, issued for a different audience, carrying an altered claim, presented after logout, or replayed from a different network.
Why the interface misses it
The frontend obtains one token, in one way, and sends it back exactly as issued. Every negative case is a request the client was never written to make. A browser session that behaves correctly proves that the happy path works, but it proves nothing about the eleven unhappy paths an attacker has.
What the evidence looks like
Requests and responses for each token state — valid, expired, revoked, tampered signature, wrong audience, none at all — with the HTTP status and body the server returned in each case. A finding here is reproducible with a single request and should be reported as one.
ASVS 5.0.0 anchor
ASVS V6 Authentication, V7 Session Management, V9 Self-contained Tokens (token source, integrity and content) and V10 OAuth and OIDC, whose sections separate the client, the resource server and the authorization server.
OWASP API Security Top 10 vocabulary
API2:2023 Broken Authentication.
Object level authorisation
Can an authenticated caller read or change an object that is not theirs?
What is tested
Every endpoint that takes an identifier — a path segment, a query parameter, a body field, a filter, a batch of identifiers — called with a valid session belonging to one user and an identifier belonging to another. Then the same test across tenants, across organisations, and across the boundary between a normal user and a user of a different product in the same platform.
Why the interface misses it
The interface only ever offers a user their own identifiers. Nothing in a click path produces a request for somebody else’s object, so nothing in a click-driven test produces one either. This is the finding class that is structurally invisible from the frontend: the client never produces the one request that would find it.
What the evidence looks like
A pair of accounts, the identifier that belongs to the second one, the request made as the first, and the response body showing the second account’s data. Redact the data, but keep the identifiers, the status code and the timestamp.
ASVS 5.0.0 anchor
ASVS 8.2.2 — data-specific access restricted to consumers with explicit permissions, named in the requirement as mitigating “insecure direct object reference (IDOR) and broken object level authorization (BOLA)”. ASVS 8.4.1 adds the multi-tenant case: cross-tenant controls so that “consumer operations will never affect tenants with which they do not have permissions to interact”.
OWASP API Security Top 10 vocabulary
API1:2023 Broken Object Level Authorization.
Function level authorisation
Can a caller invoke an operation their role is not supposed to have?
What is tested
Administrative and privileged operations called with a low-privilege token. Method confusion — a GET that is permitted and a DELETE on the same path that was never considered. Endpoints that exist only for an internal tool, a support console or a partner integration, reachable on the same host with the same authentication.
Why the interface misses it
The frontend hides the button. Hiding the button removes the operation from the interface, not from the server. Anyone who has read the JavaScript bundle, the mobile binary or the specification knows the path exists, and the only question that matters is what the controller does when the request arrives.
What the evidence looks like
The operation, the role that should hold it, the role that was used, and the response. A 200 is a finding. A 403 that arrives after the side effect has already happened is a worse one, and it is only detectable if the tester checked the state afterwards rather than the status code.
ASVS 5.0.0 anchor
ASVS 8.2.1 — function-level access restricted to consumers with explicit permissions. ASVS 8.3.1 — rules enforced at a trusted service layer, not by controls an untrusted consumer can manipulate. ASVS 4.1.4 — only HTTP methods explicitly supported are accepted and unused methods are blocked.
OWASP API Security Top 10 vocabulary
API5:2023 Broken Function Level Authorization.
Mass assignment and object property level authorisation
Which fields can a caller write that the form never showed them?
What is tested
Sending fields the client does not send. A profile update that also accepts role, is_admin, account_status, credit_limit, tenant_id or verified because the handler binds the whole request body onto the model. The inverse case too: a response that returns fields the caller is not entitled to read, because the serialiser returns the object rather than a view of it.
Why the interface misses it
The form has four inputs and sends four fields. The model has forty. The gap between those two numbers is the finding, and the frontend never generates a request that reveals it.
What the evidence looks like
The documented request body, the request body that was actually accepted, the field that should not have been writable, and the state of the object afterwards. On the read side: the response body with the fields the role was not entitled to, marked.
ASVS 5.0.0 anchor
ASVS 8.2.3 — field-level access restricted to consumers with explicit permissions “to mitigate broken object property level authorization (BOPLA)”. ASVS 8.1.2 requires the documentation to define field-level read and write rules in the first place, which is the artefact most teams discover they do not have.
OWASP API Security Top 10 vocabulary
API3:2023 Broken Object Property Level Authorization. The 2023 release notes record the merge in OWASP’s own words: “We’ve combined Excessive Data Exposure and Mass Assignment focusing on the common root cause: object property level authorization validation failures.” If a report still speaks of API6:2019 Mass Assignment, it is using the 2019 edition’s numbering.
Rate limiting and resource consumption
What does one caller cost you, and how many times can they do it?
What is tested
Whether limits exist, where they are enforced, and what they are keyed on — account, token, source address, tenant, endpoint. Whether an expensive operation is limited differently from a cheap one. Whether pagination has an upper bound. Whether a search, an export, a report or a nested GraphQL query can be made to cost far more server-side than it costs the caller. Whether an operation that spends real money — an SMS, an email, a third-party API call, a model inference — is bounded at all.
Why the interface misses it
A browser makes one request per click at human speed. The whole class of finding lives above that rate, and a click-driven test never approaches it.
What the evidence looks like
Requests per unit time, the point at which the limit engaged, the response when it engaged, and the cost curve of the expensive operation. Note this is not denial-of-service testing and must not be allowed to become it — see the permission rule below.
ASVS 5.0.0 anchor
ASVS 2.4.1 — anti-automation controls against “excessive calls to application functions that could lead to data exfiltration, garbage-data creation, quota exhaustion, rate-limit breaches, denial-of-service, or overuse of costly resources”. ASVS 4.2.5 also covers over-long URIs and header fields that can be used to force error responses.
OWASP API Security Top 10 vocabulary
API4:2023 Unrestricted Resource Consumption, and API6:2023 Unrestricted Access to Sensitive Business Flows — a category OWASP created in 2023 “to address new threats, including most of those that can be mitigated using rate limiting”.
Input validation
What does the server do with input the client would never have sent?
What is tested
Type confusion, wrong types where a type was assumed, arrays where a scalar was expected, nulls, negative numbers, very large numbers, very long strings, unexpected encodings, duplicated parameters, and injection into every sink the parameter reaches — query, filter, template, command, deserialiser, file path, downstream request.
Why the interface misses it
Client-side validation is the first thing an attacker removes, and it is the only validation a browser-driven test ever exercises. A field that is a dropdown in the interface is a free-text parameter on the wire.
What the evidence looks like
The parameter, the value sent, the sink it reached, and the observable effect. Where the effect is a downstream request rather than a response, the evidence is the downstream log line, which means logging has to be in place before the test window opens.
ASVS 5.0.0 anchor
ASVS V2.2 Input Validation and V1 Encoding and Sanitization for the sinks. ASVS 4.2 covers HTTP message structure validation — request smuggling, response splitting and header injection, which are API-layer problems that no interface exercises.
OWASP API Security Top 10 vocabulary
Injection is not a standalone item in the 2023 edition. It is tested through the categories above and through API8:2023 Security Misconfiguration. Do not report a missing item number for it.
Error handling and information disclosure
What does the server tell a caller when something goes wrong?
What is tested
The body of every error response, not the status code. Stack traces, ORM and SQL fragments, internal hostnames, file paths, library versions, upstream error text, and identifiers that leak the existence of objects. Also the difference between responses: an endpoint that answers 404 for an object that does not exist and 403 for one that does has told an unauthorised caller that the object exists.
Why the interface misses it
The frontend catches the error and renders a friendly sentence. The diagnostic body is still on the wire, and the interface is the one consumer that never shows it to you.
What the evidence looks like
The raw response body, with the disclosed fragment marked, and the request that produced it. For the timing and status-differential cases, the two responses side by side.
ASVS 5.0.0 anchor
ASVS 16.5.1 — a generic message returned on an unexpected or security-sensitive error, “ensuring no exposure of sensitive internal system data such as stack traces, queries, secret keys, and tokens”. ASVS 16.5.3 covers the fail-open case, where the error is disclosed and the transaction proceeds anyway.
OWASP API Security Top 10 vocabulary
API8:2023 Security Misconfiguration.
Versioned and deprecated endpoints still serving traffic
What else is still answering on this host?
What is tested
Older API versions still routed. Staging, beta and partner hosts reachable from the internet. Endpoints removed from the specification and not from the deployment. Debug and health routes. Documentation endpoints. Anything that shares the production database with weaker controls in front of it.
Why the interface misses it
The current client calls the current version. It does not call v1, and it does not know that v1 still resolves. The old version predates the authorisation fix, so a defect closed in the current code is still reachable on the old path — and no test driven through the current client will ever send a request to it.
What the evidence looks like
The host or path, how it was found, the version it serves, whether it shares data with production, and a request showing it responds. Pair it with the date the inventory it should have appeared on was last updated.
ASVS 5.0.0 anchor
ASVS V13 Configuration for what is exposed and how it is configured. The discovery duty itself sits in the CERT-In scoping clauses rather than in ASVS — §13.1.1(c) and §13.2.3(ii)(b) — because enumeration is an inventory obligation before it is a testing technique.
OWASP API Security Top 10 vocabulary
API9:2023 Improper Inventory Management, whose two named blindspot tests and worked beta-host scenario are set out in the Discovery section below.
A note on the Top 10, since it will be in the proposal
The OWASP API Security Top 10 is genuinely useful. Its 2023 edition is the second, published four years after the first, and its release notes are worth reading for the reasoning alone: Excessive Data Exposure and Mass Assignment were combined into API3:2023 Broken Object Property Level Authorization “focusing on the common root cause: object property level authorization validation failures”, and a new category, API6:2023 Unrestricted Access to Sensitive Business Flows, was created “to address new threats, including most of those that can be mitigated using rate limiting”. OWASP describes the result as “a forward-looking awareness document” and says plainly that it “does not replace other TOP 10’s”.
What it is not is an audit criterion, and §8(ii) of the 2025 audit policy guidelines says so for the whole family: “The limited lists such as OWASP Top 10, SANS Top 25 and similar, should not be considered as standards or references for audits.” Use the Top 10 as vocabulary — it is how you and your engineers will name a finding to each other — and name ASVS at a version, with the chapters that apply, as the criterion. Two different jobs, and a scope of work that confuses them has no coverage claim available to it.
The authorisation test matrix, test by test
Authorisation is where the serious API findings are, and it is the work most easily squeezed when a window is short, because every other class produces findings faster. The fourteen tests below are what the work actually consists of. Ask for this matrix, populated, as a deliverable: it is the only honest way to tell testing that was performed from testing that was described.
Two things decide whether any of it is possible. The accounts — two at the same privilege level, in different tenants, plus one per role, issued under §15.1.2. And the ability to observe state, because several of these tests distinguish a real denial from a denial that arrived after the side effect.
| Test | How it is set up | What a pass looks like | What the failure is | Anchor |
|---|---|---|---|---|
| 01 No credential at all | Every protected endpoint, called with no token, no cookie and no API key. | A consistent 401, with no body beyond a generic message. | A 200. Or a 500 whose body names the framework, the query or the file path — which is a disclosure finding sitting inside an authentication finding. | ASVS V6, and 16.5.1 for the error body |
| 02 Own object, own tenant | Account A calling each endpoint with an identifier A owns. | A 200. This is not a test. It is the oracle every later test is compared against. | Nothing. Run it first anyway — without a known-good response you cannot tell a denial from a broken endpoint, and a missing oracle is a common source of false findings. | — |
| 03 Another user’s object, same tenant | Account A calling the endpoint with an identifier owned by account B in the same organisation. | A consistent denial across the whole endpoint family, including the nested and expanded forms. | A 200 returning B’s data, or a 204 having changed it. This is the classic case and it is the reason two accounts are a scoping requirement rather than a convenience. | ASVS 8.2.2 |
| 04 Another tenant’s object | Account A in tenant 1 calling the endpoint with an identifier belonging to tenant 2. | Denial, and ideally the identifier is not even resolvable outside the tenant scope. | A 200. In a multi-tenant product this is the finding a customer security review looks hardest for, and it is typically present on a small number of endpoints rather than across the estate, because the tenant filter lives in a shared query helper that one handler did not use. | ASVS 8.4.1 |
| 05 Denial responses compared | The response for an object that does not exist, against the response for an object that exists and is not yours. | The two are indistinguishable in status, body and timing. | A 404 for one and a 403 for the other. The difference tells an unauthorised caller which identifiers are real, which turns an authorisation control into an enumeration oracle. | ASVS 16.5.1, read with V8 |
| 06 Privileged function, low-privilege token | Every administrative, support and back-office operation, called with an ordinary user’s token. | A denial, and no state change. | A 200 — or a 403 that arrives after the side effect. Check the state afterwards, not the status code. That is why database or log access has to be arranged before the window. | ASVS 8.2.1, 8.3.1 |
| 07 Method swap on a permitted path | A path the role may GET, called with PUT, PATCH, DELETE and an unusual method the framework routes anyway. | Unsupported methods are blocked, and supported ones re-check authorisation for the operation, not for the path. | Authorisation enforced once at the route and not per operation. ASVS 4.1.4 is the hygiene requirement: only methods explicitly supported are accepted and unused methods are blocked. | ASVS 4.1.4, 8.2.1 |
| 08 Writing a field the role may not write | The documented request body plus one extra field — role, status, tenant, price, verified, balance. | The field is ignored or the request is rejected, and the object is unchanged in that respect. | The field persists. Verify by reading the object back as a privileged account rather than trusting the response body, because many handlers echo the input. | ASVS 8.2.3, documented under 8.1.2 |
| 09 Reading a field the role may not read | The same endpoint called at each role, with the response bodies diffed field by field. | Each role receives a view, not the object. | Internal fields — password hashes, tokens, internal identifiers, margin, cost price, another user’s email — present in the response and merely not rendered by the client. | ASVS 8.2.3 |
| 10 Batch and bulk operations | An array of identifiers mixing objects the caller owns with objects they do not. | Documented and consistent behaviour: either the whole request is rejected, or only permitted items are acted on and the response says so. | Partial success that silently includes the unpermitted items, or an error message that confirms which identifiers were real. | ASVS 8.2.2 |
| 11 Indirect reference through a relation | The object reached not by its own endpoint but through an expansion, an include parameter, a nested resource, a search filter or a report export. | The same authorisation decision as the direct route. | A check present on /orders/{id} and absent on /customers/{id}?include=orders. Authorisation implemented per endpoint rather than per object is one shape this defect takes, and it is the shape a route-by-route test plan is built to miss. | ASVS 8.2.2, 8.3.1 |
| 12 Step two without step one | A multi-step flow — checkout, onboarding, approval — with the intermediate call made directly. | The server rejects out-of-order steps. | The flow completes. ASVS 2.3.1 requires business logic flows to be processed “in the expected sequential step order and without skipping steps”, and the interface is the only place that order was ever enforced. | ASVS 2.3.1 |
| 13 Service-to-service call chain | An operation that causes one internal service to call another on the caller’s behalf. | The second service decides on the originating consumer’s permissions. | The second service trusts a machine-to-machine token from the first, so the caller inherits the first service’s privileges. ASVS 8.3.3 sets this out with the same worked example. | ASVS 8.3.3 |
| 14 After the permission is removed | A role or entitlement revoked mid-session, with the previously issued token replayed. | The change takes effect immediately. | The self-contained token keeps working until it expires. ASVS 8.3.2 permits this only with mitigating controls that alert on, and revert, an action taken after authorisation ended — and notes those do not mitigate information leakage. | ASVS 8.3.2, V9 |
Run the count on your own estate before you read a proposal. Routes multiplied by meaningful role pairs multiplied by the test classes above is the size of the authorisation work, and §13.2.2(ii) requires the test plan to state man-hours as well as calendar time so you can divide one by the other. The answer does not have to be large. It has to be a number you can see.
When the response is model-generated, a status code is not evidence
Every test above assumes a deterministic server: the same request produces the same response, so one request is a finding and one response is proof of it. That assumption holds for a database-backed endpoint and fails for an inference endpoint. A retrieval route, a summarisation route or an agentic tool-calling route can return another tenant’s document three times in ten purely because retrieval ranking moved, and a single 200 in that setting is an anecdote rather than a measurement.
The rule is simple to state and has to be agreed before the window opens. Where any part of the response is model-generated, report the finding as successes over attempts at a stated N, in fresh sessions, rather than as a status code — and pin the five fields below, or the reproduction means nothing.
| The model identifier and version string | Exactly as the API returns it, including any dated snapshot suffix. This is the field that decides whether the finding can be retested at all, and a changed string is the first thing to check when a result moves. |
| The system prompt, or a hash of it | A finding is against a configuration, not against a model alone. §15.2.3(ii) already requires application hash values and version numbers to be obtained from the auditee and included in the report. Extending that to the instruction layer is our reading of what the clause is for, not something the clause says. |
| Sampling parameters — temperature, top_p, and a seed where the provider exposes one | Temperature is the dial that turns a reproducible finding into an intermittent one. Measure at the production values, not at zero, and say which were used. |
| The retrieval corpus, as of a date | Which documents were available and which were returned. Without it a retest that does not reproduce tells you nothing, because the corpus moved underneath both runs. §13.2.3(ii)(b) already makes the as-of date of the asset inventory a report field, and the corpus deserves the same. |
| Attempts, successes, and the full prompt and completion | The denominator is the finding. Nineteen successes in twenty fresh sessions and two in twenty are both real and are different findings. Record the text, not a screenshot of a chat window, and say whether the sessions were fresh or continued. |
There is an API-layer consequence that is easy to miss, and it lands on closure. A retest that fails to reproduce is not closure under §16.3(iv) unless all five fields are unchanged, because the corpus and the model move underneath both runs. A fix and a model update are indistinguishable from the outside. That is why an authorisation defect sitting behind a model endpoint has to be confirmed by reading the state afterwards — did the object change, did the row get read, did the tool fire — rather than by reading the response body. The discipline for testing the model layer itself, including reproduction rate over fresh sessions, is set out in red teaming an LLM application.
REST, GraphQL, gRPC, WebSocket and the ones nobody scopes
“API” is not one shape, and the unit a proposal prices against changes with the shape. A quote built on “number of endpoints” prices REST roughly right and prices everything below wrongly — usually downwards, which is why the cheap proposal is often the one that has not understood the estate.
REST / JSON over HTTP
Scoping unit: The route, and the role.
The default case, and the one the rest of this page is written against. Effort scales with routes multiplied by meaningful role pairs, plus parameter count on the write endpoints.
What to watch for
Path parameters are the identifier surface. Query filters and sort fields are a second, quieter one — a filter that accepts a column name is an injection sink and an authorisation bypass at the same time.
GraphQL
Scoping unit: The resolver and the field, not the path.
One POST endpoint, potentially hundreds of resolvers, each with its own authorisation decision. Scoping it as one endpoint under-prices it by an order of magnitude. ASVS 5.0.0 gives GraphQL its own section at V4.3.
What to watch for
Introspection left enabled in production is a free specification for an attacker and a useful one for a tester — establish which it is. Query depth, breadth and aliasing turn a cheap request into an expensive one, which makes resource consumption a first-class question rather than an afterthought.
gRPC and protobuf
Scoping unit: The service method.
Binary framing, so a proxy-and-click approach produces nothing readable without the definitions. The .proto files are the specification and are the first thing to ask for.
What to watch for
Tooling has to be agreed in advance under §13.2.2(iii)–(iv), because the tester will be using something less common and it still needs the licence confirmation, the controlled test and your written approval.
WebSocket and server-sent events
Scoping unit: The message type, and the subscription.
Authorisation is decided at the handshake and then, too often, never again — so a connection established as one user keeps receiving messages after the entitlement changes. ASVS 5.0.0 covers WebSocket at V4.4.
What to watch for
Subscribe to channels the account should not see. Send message types the client never sends. A long-lived connection is a long-lived authorisation decision.
Webhooks and inbound callbacks
Scoping unit: The endpoint, and the signature scheme.
An unauthenticated write path by design, protected by a signature rather than a session. Routinely omitted from both the web scope and the API scope because nobody thinks of it as part of the application.
What to watch for
Replay without a timestamp window. Signature verification that fails open when the header is absent. Comparison that is not constant-time. And the question of what the handler does with the payload, which is an input-validation surface reachable by anyone who learns the URL.
File upload and download endpoints
Scoping unit: The endpoint, the storage path and the signed URL.
Two authorisation decisions rather than one: who may upload, and who may retrieve. Where retrieval goes through object storage with a pre-signed URL, the second decision has left your application entirely.
What to watch for
Signed URL lifetime and scope. Predictable storage keys. And whether the download endpoint re-checks entitlement or simply redirects. ASVS V5 File Handling is the chapter to name.
The API gateway or backend-for-frontend
Scoping unit: The rule set, and what it forwards.
A layer that can enforce authentication, rate limits and schema validation — or that can be bypassed entirely if any service is reachable directly. Whether it is in scope is a decision, and an unstated one usually means it was not tested.
What to watch for
Headers set by the gateway and trusted downstream. ASVS 4.1.3 requires that a header set by an intermediary — X-Real-IP, X-Forwarded-anything, X-User-ID — “cannot be overridden by the end-user”, which is a two-request test with a serious consequence.
You cannot test what you have not enumerated
Every coverage claim an engagement makes is a claim about a denominator. For a web application the denominator feels obvious, because the pages are visible. For an API it is not visible at all, and the document most organisations reach for — the specification — is a statement of intent rather than a statement of fact. Specifications drift from deployments in both directions: endpoints written down and never shipped, endpoints shipped and never written down, and parameters the handler tolerates that the schema does not declare.
§13.1.1(c) of the 2025 audit policy guidelines requires the audit scope to be “derived from the consolidated and updated asset inventory”, and §13.2.3(ii)(b) requires the auditee to state the date up to which the scope and asset inventory have been updated and requires that date to be reflected in the audit reports. Those two clauses are the whole discovery problem, written as an obligation. The scope you can defend is the one derived from an inventory whose date you are willing to print.
| Where you look | What it gets you | What it misses | The check to run |
|---|---|---|---|
| The specification, if there is one | The endpoints somebody wrote down. | Everything added since it was last regenerated, everything removed from it but not from the deployment, and every parameter the handler accepts that the schema does not declare. A specification is a statement of intent. The router is the statement of fact. | Ask when it was generated, from what, and by which build. A specification produced by hand is a document. One produced from the code at build time is evidence. |
| The clients | Every route the current web bundle and the current mobile binary actually call, with the parameters they send and the headers they set. | Routes no current client calls — which is precisely the deprecated and internal surface that matters most. | Proxy a full functional walkthrough of each client, at each role, and diff the resulting route list against the specification. The differences in both directions are findings before any test has run. |
| The gateway, load balancer and routing configuration | What is actually routed, including versions and hosts no client uses. | Anything reachable that does not pass through the gateway — a service exposed directly, a legacy host with its own DNS entry. | Export the route table for each environment and ask which entries are not in the specification. Ask who owns each answer. |
| DNS, certificates and the external estate | Hostnames that exist. Certificate transparency logs and DNS enumeration surface subdomains that nobody meant to leave resolvable. | Internal-only surface, and anything behind an allow-list the tester is not on. | Agree in writing which discovered hosts are in scope before anything is touched. A host you found is not a host you are permitted to test. |
| The asset inventory | What the organisation believes it runs. §13.1.1(c) of the 2025 audit policy guidelines requires the audit scope to be “derived from the consolidated and updated asset inventory”. | Whatever the inventory is behind on — which is why §13.2.3(ii)(b) requires the auditee to state the date up to which the scope and asset inventory have been updated, and requires that date to be reflected in the audit reports. | Read that date before you read the findings. An inventory dated eight months before the test window tells you how much of the estate the scope could not have known about. |
OWASP’s “documentation blindspot” test, as six questions
API9:2023 Improper Inventory Management gates the test on one sentence — an API has a documentation blindspot if “the purpose of an API host is unclear, and there are no explicit answers to the following questions”. OWASP states three of these as questions and three as conditions. They are put here as six questions so the block reads as one checklist. If any answer is “we are not sure”, the discovery pass has work to do before the testing pass is worth buying.
- 01 Which environment is the API running in — production, staging, test or development? (OWASP’s own question)
- 02 Who should have network access to the API — public, internal or partners? (OWASP’s own question)
- 03 Which API version is running? (OWASP’s own question)
- 04 Is there documentation at all, and is the existing documentation updated? (OWASP states this as a condition, not a question)
- 05 Is there a retirement plan for each API version? (OWASP states this as a condition, not a question)
- 06 Is the host inventory present and current? (OWASP states this as a condition, not a question)
The second test, which is easier to miss. API9:2023 defines a parallel “data flow blindspot”: an API has one where there is a sensitive data flow sharing data with a third party and there is no business justification or approval of the flow, no inventory or visibility of it, and no deep visibility of which types of sensitive data are shared. That is the consumption side of the same inventory problem, and it connects directly to API10:2023 Unsafe Consumption of APIs in the edge cases below — the integrations you call are as much an inventory question as the endpoints you publish.
OWASP also names the case that makes enumeration urgent rather than tidy, and this is the one place on this page where it is told in full. Its worked scenario for API9:2023 describes a social network whose rate limiting on password reset was implemented in a component in front of the production API host — and a beta host running the same API, including the same reset mechanism, without that component. A researcher was able to reset any user’s password by brute-forcing a six-digit token. Nothing about the production application was wrong. The finding was a hostname nobody had retired. That is the shape of the class: not a bad line of code, but an asset outside the inventory the scope was drawn from.
Shadow APIs and zombie APIs
Both are industry terms rather than regulatory ones — neither appears in any CERT-In instrument — and they get used interchangeably when they name two different halves of the same inventory problem. A shadow API is deployed and undocumented. A zombie API is deprecated and still routed. The distinction matters because they are found by different means and they fail different clauses.
Shadow API
An endpoint, a service or a whole host that exists in the deployment and in no specification, no asset list and no scope. Added by a team under delivery pressure, exposed by a framework default, stood up for an integration, or split out of a monolith and given its own route.
How it is found
By diffing the gateway route table and the client-derived route list against the specification. Anything in the first two and not the third is a shadow route, and the difference is a finding before any test runs.
The clause it fails
§13.1.1(c) requires the scope to be derived from the consolidated and updated asset inventory. A shadow API is, by definition, outside that inventory — so it is outside the scope the clause contemplates, and the failure is a governance failure before it is a security one.
Zombie API
An older version, a retired endpoint or a decommissioned host that still resolves and still answers, usually against the same production database, usually predating the authorisation fixes applied to the current version. Nothing calls it. Everything can reach it.
How it is found
By enumerating versions and hosts rather than routes — /v1 alongside /v3, beta and staging hostnames in certificate transparency logs, DNS entries pointing at a live load balancer. Then by asking which of them share a datastore with production.
The clause it fails
§13.2.3(ii)(b) requires the auditee to state the date up to which the scope and asset inventory have been updated, and requires that date in the report. A zombie is what the gap between that date and today contains.
OWASP covers both under API9:2023, and the coverage area above on versioned and deprecated endpoints is where the testing of them sits. Neither is findable from the interface. Both are findable by enumeration, which is the whole reason the discovery pass has to be a priced line item rather than a courtesy.
What tools does API security testing use?
Three classes of tool, and the useful thing to know about them is that the third one does not exist off the shelf. No product names here, deliberately: the tool list is a contractual artefact rather than a marketing one, and §13.2.2(iii) requires it to come with written confirmation of intellectual-property and licensing status while §13.2.2(iv) requires the firm to understand each tool’s origin and functionality, to test it in a controlled environment first, and to have the results of that testing “formally reviewed and approved by an authorized representative of the auditee organization”.
An intercepting proxy, for client-derived discovery
Sits between each client and the API and records what the current build actually calls, with the parameters it sends and the headers it sets. This is how the client-derived route list in the discovery table above is produced. Its limit is the same as the client’s: it sees what the client calls and nothing else, which is why it is one input to the inventory rather than the inventory.
A specification-driven request generator, for parameter and method coverage
Takes the OpenAPI document, the GraphQL schema or the .proto definitions and generates requests across parameters, types, methods and boundary values. Good at the input-validation and message-structure classes, but bounded by the specification, so it inherits every drift the reconciliation pass found. This is the class that needs the most care on write endpoints — a misconfigured fuzzer against a write endpoint is a data-integrity incident, not a test result.
A scripted harness, for the authorisation matrix
The fourteen tests above, run as a loop over every route and every role pair, comparing each response against the control case. This class does not exist as a product, and that is the substantive point rather than a complaint about the market: the loop has to be written against your identifiers, your roles and your tenancy model. No scanner knows which identifier belongs to which tenant, so no scanner can distinguish a correct denial from a missing check. Expect this to be bespoke work and expect it to appear in the man-hours as such.
Read the three classes against §8(i), which says solely tools-based testing should be discouraged because tool-based audits “may focus primarily on automated processes and may overlook non-automated or manual components”. On an API engagement that objection has a precise shape: the first two classes cover the surface a tool can reason about, and the third covers the class that carries the serious findings. A proposal whose tool list is long and whose man-hours do not move when the role count doubles has bought the first two and not the third.
The scoping discipline that follows from all of this is the subject of VAPT scoping, and the way the engagement classes divide up is set out in types of VAPT. An API estate that is mostly managed services and cloud-native components also raises questions that belong to cloud security and to a cloud security audit in India, because the control plane is itself an API with its own authorisation model.
What does a tester need before the first request?
Five things, and the first three decide whether the engagement is capable of producing the findings you are paying for. None of them is a technical favour. Each is an obligation the 2025 audit policy guidelines place somewhere specific, and each has a class of finding that becomes unreachable without it. Settle them in the audit engagement letter §14.1(ii) requires, not in an email on day one.
The specification, and the truth about it
A machine-readable specification — OpenAPI, a GraphQL schema, a protobuf definition, a Postman collection, whatever exists — together with an honest statement of how far it has drifted from what is deployed. The scope must be derived from the consolidated and updated asset inventory, and the as-of date of that inventory must appear in the report.
What becomes unreachable without it
The tester spends the first days of the window doing your inventory for you, at testing rates, and the coverage statement at the end of the report is bounded by what they happened to find rather than by what you run.
Credentials at every privilege level, and at least two of each
§15.1.2 reads in full: “If privileged testing is necessary, the auditee organization must provide only temporary access such as login credentials, access tokens, certificates, or secure ID numbers and must ensure that all such privileges are revoked immediately upon completion of the audit.” The clause governs temporariness and revocation and sets no number. The counts below are ours: two accounts at the same level in different tenants or organisations, plus one account per distinct role, plus one unauthenticated baseline.
What becomes unreachable without it
Object level authorisation cannot be tested at all. Testing whether account A can read account B’s object requires account A, account B, and an identifier belonging to B. One read-only login makes an entire finding class — object level authorisation — structurally unreachable, and the report will not say so unless you ask it to.
A non-production environment that matches
The guidelines define a Staging Environment as “a non-production, controlled environment that replicates the production environment, where applications, software, or system configurations are thoroughly tested and validated prior to deployment in the live, operational environment”. §15.2.3(i) requires the auditing organisation to specify the environment — “such as Test, Development, UAT, Pre-Production, or Production” — in which the application was tested.
What becomes unreachable without it
Findings that depend on production configuration are out of reach, and findings that exist only in staging waste everyone’s remediation budget. §16.3(v) requires that where the scope was limited to the staging platform, the report “must explicitly state that the audit was not conducted on production environment”. Ask the one question that matters in the scoping call: what does the tested environment lack that production has? Every gap in the answer is a class of finding the audit could not reach.
Rate limits lifted, or a written agreement about them
Testing an API through a WAF tuned for production traffic tests the WAF. Either the tester is allow-listed and the controls are tested separately, or the report says which findings were reached through the edge and which were not. Explicit written permission is required before denial-of-service, distributed denial-of-service or flood testing over the internet, and in critical environments where availability is the priority, testing “should be conducted in a passive manner”.
What becomes unreachable without it
You get a report that documents your gateway’s behaviour and is silent about your application’s. Resource-consumption testing in particular sits close enough to the prohibited classes that the boundary has to be agreed in writing before the window opens.
Logging on, and someone watching it
§18(iii) states that observations are well supported with objective evidences, compiled carefully and correctly with the report, and §18(iv) requires audit evidence to be stored securely with restricted access. For an API test, a meaningful share of that evidence is server-side: the downstream request that fired, the row that changed, the job that was queued.
What becomes unreachable without it
Half the interesting findings are unprovable. A tester can show you a 200, but only your logs can show you what the 200 did.
§13.2.4(i) calls the failure to settle these the “expectation gap” — “the difference between what the auditee perceives or expects from the audit and what the audit professionals understand the engagement to entail” — and requires it to be reduced or eliminated by explaining the audit process, required artefacts and expected deliverables at the outset. On API engagements the expectation gap is almost always about two numbers: how many endpoints, and how many accounts.
Where do APIs sit in CERT-In’s own documents?
In more places than most scopes of work acknowledge. Most cards below are clause text read from the official PDFs, with the locator rather than a paraphrase. Where the clause does not say something, the card says so — because on this subject the silences matter as much as the statements.
Comprehensive Cyber Security Audit Policy Guidelines, v1.0, 25 July 2025
The instrument’s own words
Application security testing (including web applications, mobile applications and APIs).
One of the twenty-six classes of engagement the document covers — a list §6 itself opens as “including, but not limited to”. APIs are named inside the class rather than left to be inferred from “application”.
Comprehensive Cyber Security Audit Policy Guidelines, v1.0, 25 July 2025
The instrument’s own words
The type of audit must be communicated before commencement — “VAPT …, EAPT …, DLA …, Configuration Audit, Process Audit, Mobile Application Security Audit, Web Application Security Audit, API Security Audit, Compliance audit etc.”
An API Security Audit is a declarable type in its own right. Declare it. The nine named types end with “etc.”, so the list is open, but the declaration is not optional.
Comprehensive Cyber Security Audit Policy Guidelines, v1.0, 25 July 2025
The instrument’s own words
The scope of audits “should include audit of entire cyber infrastructure including system, applications (both Web/Mobile), software, network infrastructure, Operational Technology (OT) / Industrial Control Systems (ICS) environment, cloud architecture, Application Programming Interfaces (APIs), database and hosting infrastructure, code review, application security, data Security, testing of Incident response capability of the auditee.”
APIs are named in the scoping clause as well as in the engagement class. A scope that silently leaves them out is narrower than the clause that governs it, and the narrowing should be written down rather than assumed.
Comprehensive Cyber Security Audit Policy Guidelines, v1.0, 25 July 2025
The instrument’s own words
Version-specific details of web and mobile applications must be explicitly mentioned in the audit scope and report.
Read this one carefully: the clause names web and mobile applications and does not name APIs. APIs are the most heavily versioned surface most organisations run, so we ask for the same discipline by contract rather than by clause — and we label that as our reading, not as CERT-In’s requirement.
CERT-In Directions of 28 April 2022, Annexure I
The instrument’s own words
Attacks or malicious/ suspicious activities affecting Cloud computing systems/servers/software/applications
That is the whole item. It names a class of incident and stops: no addressee, no timeframe, no duty. The duty is a different limb of the same instrument — Direction (ii), which requires the entities it binds to “mandatorily report cyber incidents as mentioned in Annexure I to CERT-In within 6 hours of noticing such incidents or being brought to notice about such incidents.” Annexure I supplies the classes, and Direction (ii) supplies the clock. Why it matters here: CERT-In’s own explanation of item (xviii), in the May 2022 FAQ, opens by naming “Cloud API vulnerabilities” before anything else — ahead of weak cryptography, exposed data repositories and unauthorised access to cloud credentials. The API is not a footnote to the cloud incident class. It is the first thing listed in it.
CERT-In SAMVAAD 2026
Our summary of the document — not clause text
Among the topics of the 87-plus presentations selected from more than 200 submissions, the Government of India’s own release names the auditing of cloud systems, APIs and operational technology. The proceedings published on cert-in.org.in list the same among the conference’s discussion topics.
This block is a summary of two documents rather than a clause, because neither document has clauses. What it establishes is precise: API auditing is named as a subject of the national audit ecosystem’s own annual conference. It creates no obligation, sets no methodology and publishes no standard. Reproduce the release’s hedges — “over”, “more than” — and do not convert them into exact counts.
GIGW 3.0, manual — guideline 5.3.1, developer action
Our summary of the document — not clause text
Among the developer actions listed under guideline 5.3.1 for a Government website, web application, portal or mobile app is the use of encrypted channels for third-party APIs.
A summary of one item in a long developer-action list, not a clause quotation — the list is an enumeration rather than a numbered clause. The point it carries is that the Indian Government guideline governing public-sector applications names the third-party API channel expressly. Take the clause numbers from the GIGW 3.0 manual: the live attributes page mis-numbers the third cybersecurity statement, so 5.3.2 appears on it twice.
Why SAMVAAD 2026 is worth citing, and how far it goes
CERT-In SAMVAAD 2026 was a three-day national annual conference held from 27 to 29 April 2026 at the BITS Pilani K. K. Birla Goa Campus, with over 500 delegates and a theme of “Securing Digital Bharat through Future-Ready Audits: Adapting, Assuring, Advancing”. Over 87 presentations were selected from more than 200 submissions, and the Government of India’s own release lists the topics they covered — among them the auditing of cloud systems, APIs and operational technology. CERT-In’s published conference proceedings carry the same list among the conference’s discussion topics. A panel on securing emerging technologies through next-generation cybersecurity audits sat alongside it.
What that establishes is precise and limited, and it is worth being precise about it rather than overselling it. It establishes that API auditing is named as a subject of the national audit ecosystem’s own annual conference. It does not create an obligation, set a methodology, or publish a standard. The obligations are the ones in the cards above. Read more on the conference and the platform launched at it in CERT-In AMBAK.
Is API security testing mandatory in India, and who has to do one?
There are four answers, and which one applies to you depends on who is asking rather than on what you run. The honest version needs care about what the instruments say and what they do not. CERT-In names APIs in three places — the engagement class at §6(xii), the declarable audit type at §13.2.3(i)(a), and the scoping clause at §13.1.1(a) — and none of those three is a mandate to audit. §4 describes auditee organisations as those “required to or are seeking to evaluate their cyber security posture”. That is the document’s own hedge, and it should not be upgraded into a universal requirement. What creates the obligation is somewhere else: a Government hosting rule, a customer, a tender, or a sectoral regulator.
| If you are | What is actually required | Who may perform it | What you end up holding |
|---|---|---|---|
| A Government department, PSU or agency taking a website, portal, web application or mobile app into production, where an API tier sits behind it | A security audit before hosting in the production environment. GIGW 3.0 guideline 5.3.1 states that the system must have “been Security Audited and an Audit Clearance certificate has been issued by NIC/ STQC/ STQC empanelled laboratory/CERT-In empanelled laboratory before hosting in production environment”, and the evaluator action requires a valid certificate rather than merely a present one. The guideline speaks of the website, web application, portal or app — it does not name the API separately, so whether the API tier is inside the audited system is a scoping question you have to answer and write down. | NIC, STQC, an STQC-empanelled laboratory, or a CERT-In empanelled laboratory. Four bodies, named in the manual’s own evaluator action, and no others. | A report and an audit clearance certificate — what the sector calls a safe-to-host certificate. Ask for the asset list inside it to name the API hostnames, not only the web hostname, or the certificate will describe a narrower system than the one you deployed. |
| A private company with no Government nexus, buying an API test on its own initiative | Nothing statutory compels the engagement. §4 of the 2025 audit policy guidelines describes auditee organisations as those “required to or are seeking to evaluate their cyber security posture” — that “required to or are seeking to” is the document’s own hedge and should not be read as a mandate. §6 states the general expectation that auditee organisations ensure a comprehensive audit covering all aspects of their ICT systems at least once a year, and §13.1.2(ii) treats a stated frequency as a minimum rather than a ceiling. | Any competent testing firm. Empanelment is not a legal precondition here, though an empanelled auditor is bound by published rules of engagement, a declared-manpower rule and a five-day reporting duty that an unempanelled one is not. | A report with findings, evidence, severities, closure timelines and a re-test. There is no statutory certificate at the end of a commercial API engagement, and a firm offering one is describing a document with no instrument behind it. |
| An organisation whose customer questionnaire, tender or sectoral regulator asked for “API penetration testing” | Whatever the demanding document specifies — read it before scoping anything, because “API penetration testing” in a questionnaire is usually shorthand for something narrower or broader than it sounds. The only verified link between empanelment and regulators in the 2025 guidelines is §12.1(i), which says CERT-In’s snapshot information “should be utilized by the organizations or sectoral regulators to identify and select the auditing organizations”. §13.1.2(i) adds that sectoral regulators may increase audit frequency. Neither clause names a regulator. | Determined by that document. Ask the requesting party in writing whether empanelment is a requirement or a preference, and whether they want the API covered inside a web application audit or declared separately under §13.2.3(i)(a). | Usually the report, or a summary of it, rather than a certificate. Ask which artefact satisfies them before you buy one — and if the answer is “evidence that authorisation was tested”, that is the account matrix and the request-and-response pairs, not a cover page. |
| An organisation already mid-audit, where the discovery pass has just found an API nobody scoped | A scope revision, in writing. §14.3 lists three criteria for revisions, and the first is exactly this case: “Discovery of previously unidentified systems or processes that present significant risk.” §14.2 requires the revision to be justified in writing, its impact on timelines, resources and deliverables evaluated by both parties, approved by authorised representatives, and documented as an addendum to the audit engagement letter or through a formal amendment. | The same auditing organisation, under the amended engagement letter §14.1(ii) requires. A second host discovered in week two is not a change request to argue about in week six. | An addendum naming the newly discovered assets, and a report whose asset list matches it — §16.1(iii) requires all assets provided in the scope by the auditee to be mentioned in the report. |
The general version of this question — whether a VAPT is mandatory at all, and whether it has to be CERT-In empanelled — is worked through on what VAPT actually is, and the certificate route for Indian Government websites and apps on the safe-to-host certificate. The API-specific point is the one in the first row: the instruments that create the obligation speak about a website, a web application, a portal or an app, and none of them says whether the API tier behind it is inside that system. That is a scoping answer you supply, and if you do not supply it the scope will answer it by omission.
Which standards should an API scope of work actually name?
§8(ii) of the 2025 audit policy guidelines answers the general question. After ruling out the limited lists, it says audits “should include discovery of all known vulnerabilities based on the comprehensive standards/frameworks” and names them: ISO/IEC standards, the Cyber Security Audit Baseline Requirements, the CSA Cloud Controls Matrix for cloud security, OSSTMM3, the OWASP Web Security Testing Guide, the OWASP Application Security Verification Standard, the OWASP Mobile Security Testing Guide and the OWASP DevSecOps Maturity Model.
For an API engagement the load-bearing one is ASVS. It is a requirements standard with levels, which means a scope can name a version, a level and a set of chapters and a report can be checked against it afterwards. ASVS 5.0.0 contains around 350 requirements across 17 chapters, and its requirement identifiers changed substantially from 4.0.3 — OWASP’s own note is that “requirements that were not substantively modified have different identifiers due to reordering or restructuring”. Name the version as well as the level, or the identifiers in the report will not mean what the scope meant.
| Coverage area | ASVS 5.0.0 chapters and sections | What to know before you cite it |
|---|---|---|
| Authentication and tokens | V6 Authentication · V7 Session Management · V9 Self-contained Tokens · V10 OAuth and OIDC | V10 has seven sections of its own, separating the OAuth client, the resource server, the authorization server, the OIDC client, the OpenID provider and consent management. If your API is an OAuth resource server, V10.3 is the section to name. |
| Object and function level authorisation | V8 Authorization — 8.1 Documentation, 8.2 General Design, 8.3 Operation Level, 8.4 Other | 8.2.2 names IDOR and BOLA. 8.2.3 names BOPLA. 8.3.1 requires enforcement at a trusted service layer. 8.4.1 is the cross-tenant requirement. These four requirement numbers are the whole authorisation argument of this page, in the standard’s own numbering. |
| Mass assignment and field-level exposure | V8.1.2 (documented field-level rules) · V8.2.3 (enforced field-level access) | The documentation requirement comes first for a reason: a tester cannot say a field was written in breach of the rules if nobody wrote the rules down. |
| Rate limiting and resource consumption | V2.3 Business Logic Security · V2.4 Anti-automation | 2.4.1 is the requirement to cite. 2.3.4 covers the limited-quantity case — seats, slots, inventory — where the abuse is logical rather than volumetric. |
| Input validation and message structure | V1 Encoding and Sanitization · V2.2 Input Validation · V4.2 HTTP Message Structure Validation | V4.2 is the API-specific one: request smuggling, response splitting, header injection and over-long URIs and header fields. None of it is reachable from a browser session. |
| Error handling and disclosure | V16.5 Error Handling · V16.2–V16.4 Logging | 16.5.1 is the generic-error requirement. The logging sections matter to an API test twice over: as a control being tested, and as the evidence source for findings whose effect is server-side. |
| The API surface itself | V4 API and Web Service — 4.1 Generic, 4.2 HTTP Message Structure, 4.3 GraphQL, 4.4 WebSocket | The chapter’s own control objective carries the warning worth putting in the scope of work: “authentication, session management, and input validation concerns from other chapters also apply to APIs, so this chapter cannot be taken out of context or tested in isolation.” |
Two practical notes on citing ASVS. First, its levels are not a compliance ladder that anyone else sets for you: the standard says an organisation “should analyze its risks and decide what level it believes it should be at”, and §8(ii) of the 2025 guidelines names ASVS without naming a level. The level is your decision and it belongs in the scope of work. Second, for the mobile client in front of your API, §8(ii) names the OWASP Mobile Security Testing Guide. That material is now published under OWASP’s Mobile Application Security project, whose verification standard groups controls as MASVS-STORAGE, MASVS-CRYPTO, MASVS-AUTH, MASVS-NETWORK, MASVS-PLATFORM, MASVS-CODE, MASVS-RESILIENCE and MASVS-PRIVACY. Naming the guide as §8(ii) names it and then saying where it is published is accurate, but asserting that OWASP renamed something is a step further than the pages show.
An API security testing engagement, step by step
Fourteen steps, and eight of them happen before anyone sends a request. That ratio is not bureaucracy. It is where the coverage of an API engagement is actually decided. A test that begins the week after the purchase order has not been efficient, it has skipped the inventory, the reconciliation, the environment statement, the accounts and the approvals.
Read the owner column before the detail. It follows the split §9.6(i) and §9.3(iii) draw between the auditee’s own work and the auditor’s, and it is the first thing most people want to know about a sequence: which of these are mine. The phases are indicative — the relative order is what the guidelines fix, not the weeks — and the artefact column is what exists afterwards, which is what makes each step checkable rather than aspirational.
| Phase | Step | Whose step it is | What exists afterwards | What the step is, and the clause |
|---|---|---|---|---|
| Week −4 | 01 Declare the audit type | Auditee | Scope of work naming “API Security Audit” as a declared type | Write “API Security Audit” into the scope of work, on its own or beside a web or mobile application audit. §13.2.3(i)(a) of the 2025 audit policy guidelines requires the type of audit to be communicated before commencement, and names API Security Audit as one of the types. A scope that declares only a web application audit over an API-backed estate has declared the wrong thing. |
| Week −4 | 02 Assemble the inventory, and date it | Auditee | A reconciled route inventory, dated | Specification, client-derived route lists, gateway route tables, DNS and certificate findings, and the asset inventory the scope is derived from under §13.1.1(c). §13.2.3(ii)(b) requires the auditee to state the date up to which the scope and asset inventory have been updated, and that date to be reflected in the report. Do this before the price is agreed, because the endpoint count is the price. |
| Week −3 | 03 Reconcile the specification against the deployment | Joint | A reconciled route inventory, dated — the difference list, resolved to owners | Diff the specification against the routes the clients actually call and the routes the gateway actually serves. Endpoints in the specification but not deployed are documentation debt. Endpoints deployed but not in the specification are the finding. Resolve every difference to an owner before testing starts. |
| Week −3 | 04 Fix the environment, and write down what it lacks | Joint | The environment statement, carried into the limitations paragraph §16.1(ii) requires | §15.2.3(i) requires the auditing organisation to specify the environment. Agree it, and agree in the same sentence what the tested environment lacks that production has — the edge controls, the production data shapes, the third-party integrations running in sandbox mode. That list is the known limit of the engagement and belongs in the report under §16.1(ii). |
| Week −2 | 05 Issue the accounts | Auditee | The role and account matrix | One account per distinct role, at least two at the same role in different tenants, and one unauthenticated baseline. §15.1.2 makes these temporary and requires them to be revoked immediately on completion, but the counts are a scoping decision rather than the clause’s. Count the roles. The count is a line item, because effort scales with roles rather than with endpoints alone. |
| Week −2 | 06 Get the approvals in writing | Auditee | Written approvals for penetration testing, tool installation and any availability-affecting class | Written approvals before penetration testing and tool installation under §13.2.2(v), with installation in the presence of your system administrator. Explicit written permission before anything resembling denial-of-service or flood testing over the internet under §15.2.2(ii). Agree the boundary between resource-consumption testing and load testing now, not at 2am. |
| Week −2 | 07 Agree the tools | Auditing organisation proposes, and the auditee approves | The tool list, with approvals | §13.2.2(iii) requires the tool list with written confirmation of intellectual-property and licensing status. §13.2.2(iv) requires the auditing organisation to understand the tools’ origin and functionality, to test them in a controlled environment first, and requires the results of that testing to be “formally reviewed and approved by an authorized representative of the auditee organization”. For API testing this matters more than usual: a misconfigured fuzzer against a write endpoint is a data-integrity incident. |
| Week −1 | 08 Sign the engagement letter | Joint | The audit engagement letter | §14.1(ii) requires the agreed terms to be “formally documented in an audit engagement letter”, reviewed and signed by authorised representatives of both organisations, serving as “a binding reference point throughout the engagement”. §14.3 lists the three triggers for revising scope afterwards, the first of which — “Discovery of previously unidentified systems or processes that present significant risk” — is the API discovery case exactly. |
| Week 0 | 09 Run the enumeration pass first | Auditing organisation | The enumerated route-and-parameter list — the denominator everything later is measured against | Authenticated crawl at each role, parameter discovery per endpoint, and a response-shape inventory. This is the vulnerability-assessment half of the compound, and it produces the denominator that everything after it is measured against. Hand the enumeration to the testers before the test window opens rather than letting them rediscover it at testing rates. |
| In window | 10 Test authorisation before anything else | Auditing organisation | The populated authorisation matrix, with request-and-response pairs per finding | Object level, then function level, then field level, at every role pair. This is where the serious findings are and it is the work most easily squeezed when the window is short. Critical and high findings are “required to be notified by the auditor to the auditee organization during the course of audit on as and when found basis” under §16.3(ii), so a broken tenancy boundary should reach you the day it is found, not in the draft report. |
| In window | 11 Then the rest of the surface | Auditing organisation | Per-finding request and response pairs, plus severity, CWE and, where it exists, CVE | Authentication and token handling, input validation into every sink, resource consumption within the agreed boundary, error bodies, and the deprecated and versioned hosts. Each finding scored with CVSS and supplemented with EPSS, and mapped to a CWE and, where one exists, a CVE, under §16.2(ii). |
| Post-report | 12 Read the report for its limits before its findings | Auditee | A coverage matrix, not a coverage adjective | §16.1(ii) requires the report to carry the detailed scope, duration, methodologies, tools, manual process, findings, prioritisation, sampling decisions, manpower, exemptions, limitations and other constraints. Read the exemptions and limitations first. They tell you what the conclusion is silent about, and on an API engagement they are usually about discovery and about roles. |
| Post-report | 13 Close, then have closure verified | Auditee, then the auditing organisation | The follow-up audit result | §9.3(iii) puts patching and correction of vulnerabilities on the auditee. §16.3(iv) says that after remediation actions, follow-up audits should be performed by auditing organisations to verify closure. §13.1.1(g) says the scope of work should clearly specify the requirement to conduct follow-up audits as part of the engagement, and §9.3(iv) says they should be included within the scope or RFP — and, where they are, must be conducted by the auditing organisation after closure. An authorisation fix is exactly the kind that regresses, because it is usually a check added in one handler out of several. |
| Post-report | 14 Classify every change afterwards | Auditee | A Minor or Major classification on the record, per change | §13.1.2(iii) requires every change to be classified Minor or Major, with a Major Change — “high-risk, impactful to security” — audited before implementation. A new endpoint, a new role, a new field on an existing object, or a new consumer of an existing endpoint each deserve that question. An API acquires new routes, new roles and new consumers on the ordinary release cadence, and none of those changes is visible to anyone reading the user interface — which is how a surface ends up re-tested on a slower clock than it changes on. |
Count the owner column and the ratio the intro claims becomes visible: six of the fourteen steps are yours alone, four need both of you, three belong to the auditing organisation, and one crosses from you to them at closure. An engagement quoted as though it were fourteen auditor steps has mispriced the eleven that are not — and an engagement that starts on the day the purchase order clears has skipped them.
What the arithmetic looks like on a real-sized estate
The engagement below is invented for this page. It is not a client, it is not drawn from any client’s engagement, it does not describe a sector, and it makes no claim about what any engagement achieved. The numbers exist to show how the arithmetic works, and nothing else. Substitute your own.
Take a product with a React single-page frontend, an iOS and an Android client, and a REST API behind all three. Its team believes the estate is “about fifteen screens”. The scoping work turns that into numbers that can be priced.
| Step 1 — What the specification declares | 58 endpoints across 4 tags. Generated by hand, last edited eleven months ago. Treated as a starting list, not as the estate. |
| Step 2 — What the clients actually call | A proxied walkthrough of the web bundle and both mobile clients, at each role, produces 71 distinct routes. 14 of those are not in the specification. 6 endpoints in the specification are called by nothing, and some of the others each serve more than one route. |
| Step 3 — What the gateway routes | 89 routes across three host names: the production API, an internal admin API on the same certificate, and a partner integration host. The admin API was not in anyone’s answer to “what is the API”. |
| Step 4 — What DNS and certificate transparency surface | 2 further hostnames resolve. One is a decommissioned staging host still pointing at a live load balancer. Both are referred to the owner before anything is touched, and one is put out of scope in writing. |
| Step 5 — The reconciled inventory | 89 routes, 3 hosts, dated the day the scope was frozen. That date goes in the scope and, under §13.2.3(ii)(b), into the report. |
| Step 6 — The role matrix | 5 distinct roles: unauthenticated, standard user, organisation administrator, support agent, partner integration. Two tenants. That is 9 accounts to issue, not one — the 4 signed-in roles in tenant A, the same 4 in tenant B, plus the unauthenticated baseline. |
| Step 7 — The combination count | 89 routes × 5 roles is 445 route-and-role combinations. Not all are meaningful — an unauthenticated call to an admin route is one request, not an afternoon — but the number is the thing to hold up against the proposed man-hours. |
| Step 8 — The arithmetic on the proposal | §13.2.2(ii) requires the test plan to state calendar time and man-hours. Divide the man-hours by the combinations that genuinely need manual work. If the answer is minutes, the engagement is an assessment with a penetration-test invoice attached. If it is a meaningful block of time per surface at each privilege level, it is a test. |
| Step 9 — What changed in the scope because of steps 2 to 4 | The declared audit type became “API Security Audit” alongside the web application audit. The admin API and the partner host entered the scope. The decommissioned staging host left it in writing. The endpoint count moved from a belief about screens to a dated route table — which is the entire difference between a scope and a guess. |
Notice what the exercise produced before a single request was sent in anger: three hostnames instead of one, fourteen undocumented routes, six specification entries nobody calls, a decommissioned host still resolving, and nine accounts where the original plan had one. None of that is testing. All of it changes what the testing can find, and all of it changes the price — which is why it belongs in the scoping conversation rather than in the first week of the window.
What one API finding looks like written up properly
The finding below is invented for this page. It is not a client, it is not drawn from any client’s engagement, it does not describe a sector, and it makes no claim about what any engagement found or achieved. The hostnames, identifiers and values are placeholders. What it exists to show is the anatomy.
This page has argued for eight sections that an API finding is a request and a response, and that the CWE is the identifier that carries the meaning. Here is what that produces on the page of a report, against the version of the same finding a buyer is far more likely to receive. The finding is the cross-tenant case from the authorisation matrix: account A in tenant 1, calling with an identifier belonging to tenant 2.
What a thin finding looks like
Title
Broken access control
Severity
Medium
Affected
Application
Description
It was observed that the application does not enforce proper access control, which may allow unauthorised users to access data.
Evidence
Screenshot available on request.
Recommendation
Implement proper access control and follow the principle of least privilege.
Why it fails. No endpoint, so nobody can find it. No request, so nobody can reproduce it. No CWE, so §16.2(ii) is unmet and the finding cannot be counted alongside anything else. No CVSS vector, so the severity cannot be argued with. No evidence in the document, which is what §18(iii) contemplates. And no state check, so a reader cannot tell whether the tester confirmed the read or inferred it from a status code.
What a complete finding looks like
Title
Cross-tenant object level authorisation bypass on the invoice retrieval endpoint
Classification
CWE-639, Authorization Bypass Through User-Controlled Key. No CVE — defect in first-party code, so EPSS: not applicable, no CVE. OWASP vocabulary: API1:2023 Broken Object Level Authorization. Control: ASVS 5.0.0 requirement 8.4.1, cross-tenant.
Severity
High, with the full CVSS vector string printed beside it so the rating can be recomputed, the CVSS version readable from the vector prefix, and the environmental metrics stated as left at default. The qualitative band is FIRST’s scale, not a CERT-In classification.
Affected
One named route on one named host, in the environment named under §15.2.3(i), at the build and hash recorded in the scope section. Two sibling routes tested at the same role pair and not affected, named.
Control case, redacted
GET /v3/invoices/INV-1001 HTTP/1.1
Host: api.example.test
Authorization: Bearer <A, tenant 1 — redacted>
HTTP/1.1 200 OK
{"id":"INV-1001","tenant":"t1", ...}The oracle. Without it a denial and a broken endpoint look the same.
Failing case, redacted
GET /v3/invoices/INV-2044 HTTP/1.1
Host: api.example.test
Authorization: Bearer <A, tenant 1 — redacted>
HTTP/1.1 200 OK
{"id":"INV-2044","tenant":"t2", ...}Same token, an identifier belonging to tenant 2, a 200 and tenant 2’s record. Field values redacted, and the identifiers, the status and the timestamp kept.
State read afterwards
The same object read back as a privileged account in tenant 2 to confirm the record returned was the real one and not an echo. On a write finding this is the step that distinguishes a bypass from a handler that accepted the field and discarded it.
Reproduction
Numbered steps naming the two temporary accounts issued under §15.1.2, their tenants, the identifier substituted, and the expected and actual results stated separately.
Impact and remediation
Impact stated as the business reads it: any authenticated customer can enumerate and read another customer’s invoices. Remediation naming the shared query helper the handler bypassed, and the re-test asked to run at every role pair rather than the one that produced the finding.
Ask for one of these before you sign. A redacted sample finding is the cheapest possible test of whether a firm works this way, and it costs them ten minutes. §18(iii) is the standard and §16.2(ii) is the identifier requirement. The control case beside the failing case is the part nobody can fake after the fact.
What actually drives the price of an API engagement
There is no useful number without a scope, and any figure quoted without one is attached to nothing. What can be answered is what the price is made of. Six inputs, in rough order of how much they move the total.
Endpoints, from a dated inventory
Not screens, not features, not user stories. The route table, reconciled from the specification, the clients and the gateway, with the date §13.2.3(ii)(b) requires in the report.
Distinct privilege levels
The multiplier most quotes ignore. Authorisation testing is combinatorial: every role pair is a test, and the count of meaningful pairs grows faster than the count of roles.
Manual versus tool-assisted split
Enumeration and injection classes are tool-assisted. Authorisation and business-logic classes are not, and cannot be. §13.2.2(ii) makes the test plan state man-hours alongside calendar time so this split is visible.
Protocol shape
REST with one resource per path is the cheap case. GraphQL prices per resolver rather than per path, and ASVS 5.0.0 gives it its own section at V4.3. gRPC, WebSocket and event-driven surfaces each need their own tooling, and V4.4 covers WebSocket.
Environment fidelity
A staging environment that genuinely replicates production, in the §5(xiv) sense, costs less to test than one where half the integrations are stubbed and the tester spends the window establishing which findings are artefacts.
Whether the re-test is inside the price
§13.1.1(g) says the scope of work should clearly specify the requirement to conduct follow-up audits, and §9.3(iv) says they should be included within the scope or RFP — and, where they are, must be conducted by the auditing organisation after closure. §16.3(iv) says follow-up audits should be performed by auditing organisations to verify closure. A proposal without one is priced for half the job, and the half it omits is the half that reduces risk.
On duration, the same discipline applies as to any engagement in this cluster. Calendar time is a scheduling statement. Man-hours divided by the combinations that need manual work is the number that tells you what each surface is getting, and elapsed time from scope freeze to final report is longer than most buyers expect because §13.1.1, §13.1.7, §14.1(ii) and §13.2.2 all sit before the first test day, and because §16.3(v) contemplates the final report issuing after remediation and the follow-up audit rather than after the test.
Three things to ask for, and two checks that need no figure
No rupee figure on this page would survive contact with your scope, so here is the form of the answer instead. Ask the firm for three numbers, all of which §13.2.2(ii) already entitles you to, because it requires the test plan to state man-hours alongside calendar time. First, man-hours per route-and-role combination that receives manual work — not per route, because the role count is the multiplier the quote usually drops. Second, what fraction of the total man-hours is the discovery pass, as a named line item rather than folded into testing. Third, the authorisation matrix hours, stated separately from the rest of the surface, because that is the block that gets squeezed when the window is short and it is the block that carries the serious findings.
Two checks then need no price at all. A discovery line under roughly a tenth of the total, on an estate with no current specification, is a compressed discovery pass — the reconciliation in the worked example above is not a morning’s work. And a proposal whose man-hours do not change when you double the role count has not priced authorisation at all: authorisation testing is combinatorial, so the number has to move. Neither check tells you whether a price is fair. Both tell you whether the price was built from the estate or from a template.
CVSS, EPSS, CWE and the CVE that does not exist
§16.2(ii) of the 2025 audit policy guidelines requires four things of every finding: CVSS for severity, EPSS to supplement it with real-world exploitation likelihood, and a mapping to a CWE and a CVE number. API findings are the case where one of those four frequently has no honest value, and what a firm does about that tells you a great deal about the report you are holding.
| Instrument | What §16.2(ii) requires | What it means for an API finding |
|---|---|---|
| CVSS | §16.2(ii) — observations “must be categorized based on the Common Vulnerability Scoring System (CVSS) for severity”. | Scores fine, with one caveat worth reading twice: the qualitative bands — none, low, medium, high, critical — belong to the CVSS specification’s own severity rating scale published by FIRST, not to CERT-In. §5(xxiv) describes the 0.0 to 10.0 range and its translation into those words, but it does not print the numeric boundaries. Attribute them to FIRST. |
| EPSS | §16.2(ii) — severity “supplemented with the Exploit Prediction Scoring System (EPSS)”. | Frequently unavailable, and honestly so. EPSS estimates the probability that a published CVE will be exploited in the wild in the next thirty days. FIRST’s own FAQ says scoring vulnerabilities with no CVE ID at all “is a longer-term direction”. A broken tenancy boundary in your own code has no CVE, so it has no EPSS value. Record “not applicable — no CVE” rather than inventing a number, and note that an EPSS value is a daily snapshot that needs the date it was pulled. |
| CWE | §16.2(ii) — “Every reported observation / vulnerability shall be mapped with Common Weakness Enumeration (CWE) …” | Always available, and the field that carries the most meaning on an API engagement. CWE is MITRE’s list of weakness types — a weakness being “a condition in a software, firmware, hardware, or service component that, under certain circumstances, could contribute to the introduction of vulnerabilities”. Your authorisation defect is a weakness type even though it is not a published vulnerability. |
| CVE | §16.2(ii) — “… and Common Vulnerabilities and Exposures (CVE) number.” | Applies to the third-party components in the stack — the framework, the gateway, the library, the runtime. It does not apply to a defect in your own business logic, because CVE identifies publicly disclosed vulnerabilities in released products. A report that puts a CVE against a bespoke authorisation flaw has mislabelled it. The right answer is the CWE plus a reproduction. |
One consequence worth stating plainly, because it cuts against the instinct to treat a low score as a low priority. A broken object level authorisation finding in your own code will usually have no CVE, therefore no EPSS value, and a CVSS score computed from base metrics alone. A patchable library vulnerability three versions behind will have all four, and a higher EPSS value, because it is public. The scoring apparatus is better at the second kind of finding than the first, and the first kind is the one that loses customer data. Read the reproduction, not the number. §16.3(iii) says the report should mention appropriate timelines for closure of vulnerabilities according to severity, and sets no number of days — the days are yours to set, in your own policy.
The CWE for each coverage area
Because the CWE is usually the only identifier an API finding has, it is worth naming the ones that actually come up rather than leaving a report to reach for whatever parent class is nearest. The eight coverage areas map to the nine rows below — mass assignment is split into its write and its read side, because they are different weaknesses with different fixes even though OWASP merged them into one category. Each identifier links to MITRE’s own entry, and each title is MITRE’s own wording. Two general notes before the table. Prefer the specific child over the parent, because the parent tells an engineer nothing they did not already know from the title of the finding. And where a finding genuinely spans two weaknesses, name both rather than picking the more alarming one.
| Coverage area | CWE to map to | Which one, and when |
|---|---|---|
| Object level authorisation | CWE-639 is the precise one when the identifier came from the caller. CWE-863 is the right parent when a check ran and reached the wrong answer. | |
| Function level authorisation | CWE-862 where no check exists on the operation at all, and CWE-285 where one exists and is wrong. The distinction is worth making, because the remediation differs. | |
| Mass assignment — the write side of BOPLA | CWE-915 is the general binding case. CWE-1321 is the JavaScript-specific one, and it is a different defect with a different fix — do not use it as a synonym. | |
| Excessive field exposure — the read side of BOPLA | CWE-213 fits the serialiser that returns the object rather than a view of it. CWE-200 is the broader parent and is what most reports reach for. | |
| Rate limiting and resource consumption | CWE-770 for the expensive operation with no ceiling, and CWE-799 for the operation that is cheap individually and unbounded in frequency. | |
| Error handling and information disclosure |
| The stack trace, the SQL fragment, the internal hostname. Where the disclosure is a status differential rather than a body, CWE-200 is the closer fit. |
| Authentication and token handling | CWE-613 is the one for the self-contained token that keeps working after the entitlement was revoked — the fourteenth test in the matrix above. | |
| Input validation |
| A parent class. Where the input reaches a specific sink, map to the sink’s own weakness rather than to CWE-20, which on its own tells an engineer very little. |
| Versioned and deprecated endpoints, and the inventory behind them | The honest position: there is no CWE for “we did not know this host existed”. CWE-1059 carries the documentation limb and CWE-489 the debug and health routes. The substantive finding is usually whatever the zombie endpoint lets a caller do, mapped to that — with the inventory failure stated as the root cause. |
One caveat worth printing rather than burying. CWE is a list of weakness types, and some of what an API engagement finds is not a weakness type at all — the undocumented host, the version nobody retired, the inventory eight months stale. Those have a real consequence and no clean identifier, and the honest treatment is to map the consequence to its own CWE and state the inventory failure as the root cause. A report that forces every finding into a CWE it does not fit has satisfied §16.2(ii) on its face and made the finding harder to act on.
The artefacts a real engagement hands over
Nine documents, each of which a clause either requires or expects. Use the list as an acceptance checklist: agree it before the engagement — §16.1(i) says the report format “should be mutually agreed upon” and finalised before commencement — and check it on delivery.
A reconciled route inventory, dated
Every route, across every host, from the specification, the clients and the gateway, with the date the inventory was current and the differences resolved to an owner. §16.1(iii) requires all assets provided in scope to be mentioned in the report, so this document and the report’s asset list should be the same list.
The role and account matrix
Which roles exist, how many accounts were issued at each, in how many tenants, when they were issued and when they were revoked. This is the document that tells a later reader which authorisation tests were possible.
A coverage matrix, not a coverage adjective
Routes down one axis, test classes across the other, with what was run and what was not. §16.1(ii) requires the report to carry the detailed scope, the sampling decisions and the “exemptions, limitations and other constraints”. A matrix satisfies that honestly, but “comprehensive testing was performed” does not.
Per-finding request and response pairs
Method, path, headers, body, response status and response body, for both the control case and the failing case, redacted where the data is real. §18(iii) expects observations to be “well supported with objective evidences” compiled with the report, presented so decision makers can use them.
The tool list, with approvals
Tools named, licensing and intellectual-property status confirmed in writing, results of the controlled pre-deployment test formally reviewed and approved by an authorised representative on your side, and written approval before penetration testing and tool installation.
Severity, CWE and, where it exists, CVE
CVSS with the version readable from the vector, EPSS where a CVE exists and an explicit “not applicable” where it does not, and a CWE on every finding. The CVSS bands are FIRST’s scale, so say so rather than presenting them as a CERT-In classification.
Closure timelines by severity
The report “should mention appropriate timelines for closure of vulnerabilities according to severity”. That is the whole clause — it fixes no number of days, so the days come from your own policy and should be stated as yours.
An executive summary that translates
A concise overview for the board and top management that turns the technical findings into business risks. On an API engagement the translation usually reduces to one sentence about data exposure between accounts, and it should be written in those terms rather than in CWE numbers.
The follow-up audit result
Verification of closure by the auditing organisation after remediation, against the previous cycle’s observations. For authorisation findings, ask for the re-test to run at every role pair rather than at the pair that produced the original finding.
Seven situations that break the ordinary pattern
Each of these changes either who is responsible, what may be tested, or how the estate can be discovered. All of them are better settled in the engagement letter §14.1(ii) requires than in the second week of a window.
The API is somebody else’s and you only consume it
OWASP added API10:2023 Unsafe Consumption of APIs in the 2023 edition for a stated reason: attackers “have started looking for a target’s integrated services to compromise those, instead of hitting the APIs of their target directly”. Data arriving from a third party is input, and it usually crosses your trust boundary with less validation than a user’s form. §13.1.1(f) puts third-party, vendor and supply-chain risk assessment inside the audit scope. Test what your code does with a hostile response from an integration you trust, and treat a redirect returned by a partner as user input rather than as routing.
You publish the API to partners
A partner-facing API has consumers you do not control and cannot notify. Two consequences. Availability-affecting tests need more care, because the blast radius includes somebody else’s production. And §15.2.2(iii) is explicit that testing “must not involve external entities such as customers, business partners, vendors, or other third parties, unless specific written consent is obtained” — so a test that involves a partner’s credentials or a partner’s traffic needs that partner’s written consent, not just yours.
The gateway is run by a cloud provider
§13.1.5(i) draws the split for one named case: a service or website hosted on a web server owned by another organisation. There, responsibility for auditing “the web server, its operating system, the web hosting application software, and any backend database application software lies with the organization that owns and operates the server”, while the data and software related to the website remain the content owner’s to have audited by a CERT-In empanelled organisation. Reading a managed API gateway the same way is our analogy, not the clause’s own example — the clause enumerates a web server, an operating system, hosting software and a backend database, and a managed gateway is none of those. On that reading the configuration is yours and the platform is theirs. Get the line drawn in the scope either way, because the space between “their platform” and “your configuration” is where a permissive policy survives two audits. The same split is the subject of a cloud security audit — see the cloud pages in this cluster.
Serverless functions with their own URLs
A function exposed directly, outside the gateway, with its own hostname and its own authentication decision, deployed by a team that considered it internal. It does not appear in the API specification, no client calls it, and it is absent from the asset inventory the scope must be derived from. This is the discovery problem in its purest form: the control failure is not in the function, it is in the inventory.
The API requires mutual TLS or a client certificate
The tester needs a certificate, and issuing one is a scoping decision with a lead time. §15.1.2 covers it in terms — temporary access “such as login credentials, access tokens, certificates, or secure ID numbers”, revoked on completion. Arrange it before the window, and arrange one per role rather than one shared certificate, or the authorisation matrix collapses back to a single identity.
The mobile client pins its certificate
Pinning stops a tester proxying the app, which is often how the route list is derived. The answers are a debug build without pinning, a documented bypass, or the specification plus the gateway route table in place of client-derived discovery. Whichever is chosen, §13.2.4(ii) asks the auditing organisation to communicate the resulting limitations clearly — so if pinning was not bypassed, the report should say which routes were therefore never observed.
The endpoint in front of you is a model
An inference endpoint is still an API: it has authentication, authorisation, rate limits, input validation and error handling, and every test in the matrix above is worth running against it. What changes is not the test but the evidence. This page’s standard is that an API finding is reproducible with a single request, but where any part of the response is model-generated, a single 200 is an anecdote. Report the finding as successes over attempts at a stated N in fresh sessions, with the five fields set out under the authorisation matrix pinned, or the reproduction means nothing. The consequence at the API layer is the one most easily missed: a retest that fails to reproduce is not closure under §16.3(iv) unless the model version, the system prompt, the sampling parameters and the corpus are all unchanged, because the corpus and the model move underneath both runs — which is why an authorisation defect behind a model endpoint has to be confirmed by reading the state afterwards rather than by reading the response body. CERT-In treats the model’s own behaviour as its own class at §6(xxiii), AI System Audits — “evaluation of AI systems for security, ethical alignment, transparency, data integrity, and resilience to adversarial manipulation”. Do the API layer first, because a model with a broken tenancy boundary in front of it does not need a clever prompt to leak another customer’s data.
The discipline for the model layer itself, including how a reproduction rate is measured and reported, is set out in red teaming an LLM application.
What to say back when the API is argued out of scope
Eight sentences you will hear, from a vendor or from your own team, and the checkable reply to each. None of the replies is an assertion about good practice. Each points at a clause or a published requirement that can be read in a minute.
| “The frontend validates that.” | The frontend validates it for people using the frontend. ASVS 5.0.0 requirement 8.3.1 — quoted in full in the structural argument at the top of this page — is written against exactly this, and names client-side JavaScript as the thing not to rely on. The reply is not an argument: it is a single request sent without the client, and it takes a minute to demonstrate. |
| “It’s an internal API, it isn’t exposed.” | Then it is one compromised workload away from being exposed, and the audit scope at §13.1.1(a) covers the entire cyber infrastructure with APIs named in it. ASVS 8.3.3 addresses the specific failure: access should be decided on the originating consumer’s permissions rather than an intermediary service’s. Excluding the internal surface is a decision to write down, not an assumption to inherit. |
| “We use OAuth, so authorisation is handled.” | OAuth is how the caller proves who they are and what scope they hold. Whether this caller may read this object is a different question, decided in your handler. ASVS keeps them in different chapters — V10 for OAuth and OIDC, V8 for authorisation — and a valid token is the precondition for a BOLA test rather than a defence against one. |
| “That endpoint isn’t documented.” | Undocumented is not unreachable. OWASP’s API9:2023 exists for exactly this, and its “documentation blindspot” test asks whether there is documentation, whether it is current, and whether each version has a retirement plan. An endpoint absent from the specification and present in the router is a finding in its own right, before anyone tests it. |
| “It’s rate limited at the gateway.” | Then ask which hosts sit behind that gateway. A control enforced per host is a control with a list of hosts, and that list is an inventory question — which is why this objection is answered in the Discovery section rather than here, with OWASP’s own worked scenario for API9:2023. |
| “We had a penetration test last year.” | §10.1(i) of the 2025 guidelines limits an auditor’s responsibility to “reviewing and reporting on the state of security at the point in time of the audit”. §13.1.2(iii) then requires every change to be classified Minor or Major, with a Major Change audited before implementation. An API that shipped new endpoints, a new role or a new consumer since that test has moved past the point in time the report describes. |
| “We tested against the OWASP Top 10.” | A ranked awareness list has no coverage claim to make, and both CERT-In and OWASP say so — §8(ii) rules the limited lists out as audit standards, and OWASP calls its own 2023 API list a forward-looking awareness document. Both statements are quoted in full in the note on the Top 10 above. Ask instead which ASVS chapters, at which version and level, and whether V8 was among them. |
| “The scanner came back clean.” | §8(i) says solely tools-based testing should be discouraged, because tool-based audits “may focus primarily on automated processes and may overlook non-automated or manual components”, which “can result in an incomplete view of the overall security”. The tooling section above sets out why the authorisation class in particular is not reachable by product: the loop has to be written against your identifiers. Read the findings for evidence of manual work — an authorisation boundary crossed, two weaknesses chained, a business rule abused — and read the man-hours for whether that work was paid for. |
Twelve ways an API engagement goes wrong
Almost all of them are decided before testing starts, which is the useful thing about them: each one is preventable with a sentence in a scope of work. Each also carries the signal that shows it in a document you already have, because a failure mode you cannot detect is a warning rather than a check.
The scope counted screens, not endpoints
A proposal priced against “12 screens” for an application whose frontend calls sixty endpoints. Screens are a client-side unit. The estimate, the coverage and the report all inherit the wrong denominator. Price against the endpoint and role matrix that §13.1.1(c) requires the scope to be derived from.
How you spot it
The scope section counts screens, modules, features or user stories, and no number anywhere in the document is a count of routes.
One account, one role
The most consequential scoping failure, because it removes a whole class rather than reducing coverage within one. Object level authorisation is untestable with one account: the test needs account A, account B and an identifier belonging to B. If the engagement issued one login, the report’s silence on BOLA is a silence about what was not attempted.
How you spot it
The methodology says “an authenticated user account”, singular, and no account matrix appears anywhere. Ask how many were issued, at which roles, in how many tenants.
The specification was taken as the estate
Testing what the OpenAPI file declares and nothing else. Every endpoint added since the file was last regenerated, and every parameter the handler tolerates that the schema does not declare, is out of scope by accident.
How you spot it
The report’s endpoint count equals the specification’s endpoint count exactly. An equal count means no reconciliation ran, because reconciliation almost always moves the number in both directions.
Discovery was not priced, so it was not done
Enumeration is real work and it is the work that determines whether any coverage statement is meaningful. When it is unpriced, it is compressed into the first morning and the estate the test covers is whatever was easy to find.
How you spot it
The man-hours table has no enumeration or discovery line item. Or the endpoint count in the report matches the specification exactly, which means the reconciliation never ran.
Testing went through the edge and the report did not say so
The tester was rate-limited and WAF-filtered like any other client. The result documents the edge’s behaviour. Without an allow-list or a stated limitation, a reader cannot tell which findings were absent and which were merely unreachable that week.
How you spot it
The evidence contains 429 responses. Or no request reproduced in the report ever exceeded a limit. Or the methodology section names a WAF or gateway and the limitations paragraph does not mention it.
Only 200s were checked
An authorisation bypass that returns 403 after performing the side effect reads as a pass in a status-code-driven test. The check is the state afterwards, which means database or log access, which means it has to be arranged before the window.
How you spot it
Every authorisation finding’s evidence is a status code and a response body, and none of them reads the object back afterwards as a privileged account.
GraphQL was treated as one endpoint
A single POST path, hundreds of resolvers, and per-resolver authorisation. Scoping it as one endpoint under-prices it by an order of magnitude. ASVS 5.0.0 gives GraphQL its own section at V4.3 for precisely this reason.
How you spot it
The asset list says “1 endpoint” or names a single /graphql path, and no count of resolvers, queries, mutations or fields appears anywhere in the document.
Webhooks and callbacks were nobody’s
The inbound endpoint that receives a third party’s callback is an unauthenticated write path with a signature check, and it is routinely omitted from both the web scope and the API scope because nobody thinks of it as part of the application.
How you spot it
The asset list contains no inbound callback path, and the report never names a signature scheme — no mention of HMAC, a signing secret, a timestamp window or replay.
Internal and service-to-service APIs were assumed trusted
Reachable from any workload in the cluster, authenticated with a long-lived shared secret, and out of scope because they are “internal”. ASVS 8.3.3 is the relevant requirement: access decisions should follow the originating consumer’s permissions rather than an intermediary service’s.
How you spot it
The scope names only internet-facing hostnames, and the exclusions paragraph is silent — an exclusion that was decided should be written down as one.
The old version was never in the inventory
v1 still routes, shares the production database and predates the authorisation fix. It is not in the specification, no client calls it, and it appears in no asset list. This is the finding that turns a routine engagement into an incident, and the only thing that surfaces it is enumeration.
How you spot it
Every path in the asset list carries the same version prefix. One version present means one version looked for, while two or more means somebody went looking.
Findings were reported without a reproduction
An API finding is a request. A report that describes one without the method, path, headers, body and response has not given the engineering team enough to reproduce, and §18(iii) states that observations are well supported with objective evidences, compiled carefully and correctly with the report.
How you spot it
The evidence is screenshots of a browser or of a tool panel, or the phrase “available on request”, rather than the raw request and response pair.
The re-test was a separate purchase order
Six weeks later, at a new price, after the window in which anyone remembered the context. §13.1.1(g) says the scope of work should clearly specify the requirement to conduct follow-up audits, and §9.3(iv) says they should be included within the scope or RFP. A proposal without one is priced for half the job.
How you spot it
Search the proposal for “re-test”, “retest”, “revalidation” and “follow-up”. If the only hits are in a separate commercial section, the re-test is outside the price.
Twelve questions to ask in writing
None of these requires you to be a tester, and all of them are answerable in a sentence. §12.2(iv) of the 2025 guidelines puts the duty of enquiry on you: it is “the responsibility of the auditee organization to check the domain of audit conducted, previous audits conducted and other relevant details”, with a clear understanding of the auditing organisation’s methodology, tools and relevant experience before selecting.
- 01 Is “API Security Audit” declared as a type in the scope of work? §13.2.3(i)(a) names it as a declarable type. If the document says only “web application security audit”, the declared type and the estate do not match.
- 02 How many endpoints, and where did that number come from? Specification, client traffic, gateway routes or an asset inventory. §13.1.1(c) requires the scope to be derived from the consolidated and updated asset inventory, and §13.2.3(ii)(b) requires the as-of date of that inventory in the report.
- 03 How many accounts will be issued, at which roles, and in how many tenants? This number decides whether the authorisation classes are reachable at all. §15.1.2 governs their issue and revocation.
- 04 How many man-hours, alongside the calendar window? §13.2.2(ii) requires the test plan to state both. Divide man-hours by (endpoints × roles) and see what each combination is actually getting.
- 05 Which environment, and what does it lack that production has? §15.2.3(i) requires the auditing organisation to clearly specify the environment in which the application was tested. §16.3(v) is the clause that requires the report to state explicitly where the audit was not conducted on the production environment.
- 06 Will the tester be allow-listed past the WAF and the rate limiter? If not, the engagement tests the edge. Either allow-list and test the edge separately, or record the limitation in the report.
- 07 Which standards are named — and is the API Security Top 10 the criterion or the vocabulary? §8(ii) rules the limited lists out as audit standards and points at the comprehensive frameworks instead. Name ASVS at a version and the chapters that apply, and use the Top 10 to describe findings, not to bound coverage.
- 08 Is the discovery pass a priced line item? If enumeration is not paid for, it will be compressed, and every coverage statement downstream inherits that compression.
- 09 What does the evidence for an authorisation finding look like? Ask for a redacted sample before you sign — it costs them ten minutes. Control case, failing case, both requests and both responses, the two accounts, the identifier, the CWE, the CVSS vector, and the state read afterwards. The worked finding on this page is what one looks like, set beside the thin version of the same finding. §18(iii) sets the standard, and a sample tells you whether the firm meets it.
- 10 Is the re-test in the price? §13.1.1(g) says the scope of work should clearly specify the requirement to conduct follow-up audits, and §9.3(iv) says they should be included within the scope or RFP — and, where they are, must be conducted by the auditing organisation after closure. §16.3(iv) says follow-up audits should be performed by auditing organisations to verify closure.
- 11 Who signs, and are they declared to CERT-In? Where the engagement requires an empanelled auditor, §9.5(iii) restricts signature to manpower declared to CERT-In in the organisation’s snapshot information, with the report signed by the auditors who conducted it, reviewed and signed by a reviewer outside the audit team, and authorised by the head of the auditing organisation.
- 12 Has the five-day CERT-In sharing duty been disclosed to us in advance? §13.2.1(iii) requires the auditor to tell the auditee, before the assignment starts, that audit metadata and reports go to CERT-In within five days of completion. §10.6 and clause 3.2.2 of the empanelment terms set the duty itself.
Who does what, under the 2025 guidelines
The 2025 audit policy guidelines draw a line that is easy to miss and important to get right. §10.5(vii) prohibits an empanelled organisation from sub-letting or outsourcing an audit assignment. §9.6(i) governs the other side of the engagement — the auditee’s own work of scoping, access, evidence and closure — and says that work must not be delegated either, while expressly allowing the organisation to “seek external support for specialized expertise, while retaining full ownership and accountability”. Those are two different clauses about two different bodies of work, and any page that states the first without the second has drawn the line in the wrong place.
| Activity | Whose duty it is | The clause, and what it means in practice |
|---|---|---|
| Deciding what the API estate is | The auditee | §9.6(i) is explicit, subject to one exception. The clause opens: “The complete audit process of the information infrastructure must be undertaken up by the auditee organization itself, except in cases where there is a specific mandate from a Regulator, Government, or relevant stakeholder.” That carve-out is the one most regulated buyers arrive under, and it should be read before the rest. The rest then says that the entire process — defining the audit scope, selecting the auditing organisation, providing access to the information infrastructure, ensuring closure of all audit observations — “must be carried out by the owner of the information infrastructure. This responsibility must not be delegated.” And it closes: the organisation “may seek external support for specialized expertise, while retaining full ownership and accountability for the security of its information infrastructure.” Enumeration, reconciliation and the endpoint-and-role matrix are exactly that kind of external support. |
| Running the audit and signing the report | The auditing organisation | Where empanelment is required, §9.5(iii) restricts signature to manpower declared to CERT-In, with a reviewer outside the audit team and authorisation by the head of the auditing organisation. §10.5(vii) prohibits sub-letting or outsourcing an audit assignment. |
| Fixing what the test found | The auditee | §9.3(iii) puts patching and correction of vulnerabilities on the auditee. §9.2(i) requires risk treatment — retain, avoid, transfer, reduce — for any reported vulnerability or observation to be authorised and accepted by the head of the auditee organisation. |
| Verifying the fix | The auditing organisation, where a follow-up audit is in the scope of work | §16.3(iv) says that after remediation actions, follow-up audits should be performed by auditing organisations to verify closure of vulnerabilities and non-conformities highlighted in the previous audit. Whether there is one to perform is decided earlier: §13.1.1(g) says the scope of work should clearly specify the requirement, and §9.3(iv) says follow-up audits should be included within the scope or RFP — and, where they are, must be conducted by the auditing organisation after closure. Read together, that is why the re-test belongs in the scope of work rather than in a change request afterwards. An authorisation fix, which regresses more readily than most, should be re-tested at every role pair rather than at the one that produced the finding. |
On an API engagement the auditee-side work is where most of the value is, and it is exactly the work §9.6(i) says you may take external support for while keeping ownership: reconciling the specification against the deployment, producing the dated route inventory the scope must be derived from under §13.1.1(c), building the role and account matrix, settling the environment statement, running remediation management with the engineering teams who own the handlers under §9.3(iii), and preparing closure evidence for the follow-up audit §16.3(iv) puts with the auditor. The rules an empanelled auditor works under, and what they may and may not do on your systems, are set out in the rules of engagement.
We deliver CERT-In audits
We deliver CERT-In audits, end to end, with our CERT-In empanelled partners. See how a CERT-In audit runs with us, or read more about our security testing services.
Primary sources and the clauses relied on
Every document below was fetched with redirects followed and checked on content type and byte size as well as status, because cert-in.org.in answers 200 with a small HTML page for unknown paths. Checked 22 September 2026.
- CERT-In, Comprehensive Cyber Security Audit Policy Guidelines, version 1.0, 25 July 2025. 69 pages, 20 numbered sections. The instrument this page is built on. Relied on at §6(xii) (application security testing including APIs), §6 opening (“including, but not limited to”), §5(xiv)–(xv) (staging and production environments), §8(i)–(ii) (tools-only testing, and limited lists are not audit standards), §9.2, §9.3(iii)–(iv), §9.5(iii), §9.6(i), §10.1(i), §10.5(vii), §12.2(iv), §13.1.1(a), (c), (g), §13.1.2(iii), §13.2.1(iii), §13.2.2(ii)–(v), §13.2.3(i)(a) (API Security Audit as a declarable type), §13.2.3(ii)(b)–(c), §13.2.4(i), §14.1(ii), §14.3, §15.1.2, §15.2.2(ii) and (iv), §15.2.3(i), §16.1(ii)–(iii), §16.2(ii), §16.3(ii)–(v), §18(iii)–(iv). cert-in.org.in
- Directions under sub-section (6) of section 70B of the Information Technology Act, 2000, No. 20(3)/2022-CERT-In, 28 April 2022, including Annexure I. Relied on for Annexure I item (xviii), the cloud incident type — which names a class and carries no duty of its own. The duty is Direction (ii), requiring cyber incidents as mentioned in Annexure I to be reported to CERT-In “within 6 hours of noticing such incidents or being brought to notice about such incidents”. Direction (iv) requires logs of all ICT systems to be enabled and maintained securely for a rolling period of 180 days and “the same shall be maintained within the Indian jurisdiction” — the obligation that makes server-side evidence available in the first place. Read the residency limb with FAQ Q35, which states that “The logs may be stored outside India also as long as the obligation to produce logs to CERT-In is adhered to by the entities in a reasonable time”, subject to the FAQ’s own limitation, quoted in the next entry. cert-in.org.in
- CERT-In, FAQ on the Cyber Security Directions of 28.04.2022, May 2022, Annexure-I. CERT-In’s own explanation of incident type (xviii) names “Cloud API vulnerabilities” first, alongside weak cryptography, exposed data repositories and unauthorised access to cloud credentials. The FAQ carries its own limitation, which should be quoted whenever it is relied on: it “is not a legal document and in no way whatsoever replaces, amends or alters any part of the IT Act, 2000” or the CERT-In Rules, 2013. cert-in.org.in
- CERT-In, Empanelment of Information Security Auditing Organisations — Terms and Conditions for Empanelment, version 7.2, April 2024. Relied on at clause 3.2.2 for the five-day duty to share the audit report and audit metadata with CERT-In, and to report critical vulnerabilities with auditee details that were identified but not fixed even during follow-up audits. Also relied on at clause 4.2 for the single sentence an empanelled organisation may use to describe its relationship with CERT-In. cert-in.org.in
- CERT-In, Guidelines for CERT-In Empanelled Information Security Auditing Organizations, version 3.0, May 2018. The 2018 ancestor of the tools rule and of the prohibitions on distributed denial-of-service testing over the internet and on any form of flood testing, and the source of the verification-team-checks-the-audit-team discipline that reappears at §15.2.5(iii) of the 2025 guidelines as maker-checker. cert-in.org.in
- CERT-In, Guidelines for Secure Application Design, Development, Implementation & Operations, updated January 2024. Named at §8(vii) of the 2025 guidelines. §8(viii) states that an application developed without any secure design and development practices “should not be considered for assessment and audits”, with the auditee informed in writing and a copy marked to CERT-In — which is the clause behind refusing to test an API with no specification and no authorisation model at all. cert-in.org.in
- National Security Council Secretariat, Cyber Security Audit Baseline Requirements, publication NSCS-46-16 Rev 1.0, October 2020. Named at §8(iii) and §13.1.8(i) of the 2025 guidelines as the document auditees and auditing organisations should use to build their audit programme. Published on CERT-In’s website, but issued by the National Security Council Secretariat rather than by CERT-In itself. cert-in.org.in
- CERT-In Samvaad 2026, Conference Proceedings, 2nd edition, event dates 27 to 29 April 2026, BITS Pilani K. K. Birla Goa Campus. CERT-In’s own account of the conference. Relied on for the conference’s dates, theme and delegate count and for the list of discussion topics, which names cloud systems, APIs, operational technology, artificial intelligence, IoT, supply chains and space assets. cert-in.org.in
- Press Information Bureau, Government of India, release ID 2256581, 29 April 2026, Ministry of Electronics and Information Technology. The Government of India’s release on CERT-In SAMVAAD 2026. Relied on for the statement that over 87 presentations were selected from more than 200 submissions and for the topic list that names the auditing of cloud systems, APIs and operational technology. The release’s own hedges — “over”, “more than” — are reproduced rather than converted into exact counts. pib.gov.in
- Guidelines for Indian Government Websites and Apps (GIGW 3.0), manual — guideline 5.3.1 developer action. Relied on for one item only: the developer action requiring encrypted channels for third-party APIs. Cite the manual for GIGW clause numbers, not the live attributes page at guidelines.india.gov.in, which mis-numbers the third cybersecurity statement so that 5.3.2 appears on it twice. GIGW 3.0 manual (PDF)
- OWASP Application Security Verification Standard, version 5.0.0 — around 350 requirements across 17 chapters. The criterion this page recommends naming in a scope of work. Every requirement number used here comes from the 5.0.0 document rather than from the project page, so the link is to the v5.0.0 tag, where the seventeen chapter files can be read directly. The project landing page at owasp.org/projects/asvs is the secondary reference and is where the version claim itself was checked. Relied on for the V3 / V4 split, requirement 8.2.1 (function-level access), 8.2.2 (IDOR and BOLA), 8.2.3 (BOPLA), 8.1.2 (documented field-level rules), 8.3.1 (trusted service layer), 8.3.2 (authorisation after revocation), 8.3.3 (originating subject’s permissions), 8.4.1 (cross-tenant), 2.2 (input validation), 2.3.1 and 2.3.4 (business logic), 2.4.1 (anti-automation), 4.1.3 (intermediary-set headers), 4.1.4 (HTTP methods), 4.2 and 4.2.5 (HTTP message structure), 16.5.1 and 16.5.3 (error handling). Named at §8(ii) of the 2025 CERT-In guidelines without a level. The level is the organisation’s own decision. github.com/OWASP/ASVS (v5.0.0 tag)
- OWASP ASVS 5.0.0, chapter V8 “Authorization” — sections 8.1 Documentation, 8.2 General Authorization Design, 8.3 Operation Level Authorization, 8.4 Other Authorization Considerations. Deep-linked because four requirement numbers in this chapter carry the whole authorisation argument of this page — 8.2.2 (IDOR and BOLA), 8.2.3 (BOPLA), 8.3.1 (trusted service layer) and 8.4.1 (cross-tenant) — and none of them can be verified from a project landing page. The chapter file at the v5.0.0 tag is where they are printed. github.com/OWASP/ASVS
- OWASP ASVS 5.0.0, chapter V4 “API and Web Service”, with sections 4.1 Generic Web Service Security, 4.2 HTTP Message Structure Validation, 4.3 GraphQL and 4.4 WebSocket. Quoted for its control objective, which is the sentence to put in a scope of work: “authentication, session management, and input validation concerns from other chapters also apply to APIs, so this chapter cannot be taken out of context or tested in isolation.” github.com/OWASP/ASVS
- OWASP Application Security Verification Standard — project page. The secondary reference for ASVS, kept because it is where OWASP states the current version: the page gave 5.0.0 as the latest stable release when it was checked. It is a landing page rather than the document, so no requirement number on this page is cited to it. owasp.org
- OWASP API Security Top 10, 2023 edition — API1 to API10:2023. Used on this page as vocabulary for naming findings, never as an audit criterion — §8(ii) of the 2025 CERT-In guidelines rules out limited lists “such as OWASP Top 10, SANS Top 25 and similar” as standards or references for audits, and OWASP describes the 2023 edition as “a forward-looking awareness document” that “does not replace other TOP 10’s”. Note that owasp.org/API-Security/ redirects and the document is served from owasp.github.io, and owasp.org/www-project-api-security/ does not resolve. owasp.github.io
- OWASP API Security Top 10, 2023 edition — Release Notes. The source for the 2019-to-2023 changes quoted on this page: Excessive Data Exposure and Mass Assignment combined into object property level authorization, more emphasis on resource consumption, and the new category for sensitive business flows “including most of those that can be mitigated using rate limiting”. owasp.github.io
- OWASP API Security Top 10, 2023 edition — API9:2023 Improper Inventory Management. The source of the “documentation blindspot” test on this page and of the parallel “data flow blindspot” test, and of the worked scenario in which a beta host runs the same password-reset API as production without the rate-limiting component that sits in front of the production host. Note how much of the blindspot test is a quotation: OWASP gates it on “The purpose of an API host is unclear, and there are no explicit answers to the following questions”, then states three questions and three conditions. The six questions on this page put the three conditions into question form, and the page says so. owasp.github.io
- OWASP Mobile Application Security — MASVS control groups, as published on 22 September 2026. Cited for one structural point: MASVS-NETWORK, covering secure network communication between the mobile app and remote endpoints, is one of eight control groups, alongside MASVS-STORAGE, MASVS-CRYPTO, MASVS-AUTH, MASVS-PLATFORM, MASVS-CODE, MASVS-RESILIENCE and MASVS-PRIVACY. The page prints no version number on its face, so none is asserted and the retrieval date above stands in its place — the control-group list is load-bearing structure in three places on this page, so it needs a date even where it cannot carry a version. mas.owasp.org
- OWASP Web Security Testing Guide. Named at §8(ii) of the 2025 guidelines for web application testing. Linked to the project page: the guide’s own /stable/ document paths did not resolve when checked, so only the project page is given here. owasp.org
- FIRST, CVSS v3.1 specification document. Cited for the qualitative severity rating scale. §5(xxiv) of the 2025 CERT-In guidelines describes the 0.0 to 10.0 range and its translation into low, medium, high and critical but does not print the numeric band boundaries. Those belong to this specification and should be attributed to FIRST. §16.2(ii) names CVSS without pinning a version, so a report should say which version it used — the vector prefix makes it readable. first.org
- FIRST, EPSS frequently asked questions. The source for the limits of EPSS relied on here: it “does not measure how much damage successful exploitation would cause, or whether it affects your environment”, it defines no labelled score bands, new scores are published daily, and scoring a vulnerability with no CVE ID at all is described as “a longer-term direction”. That last point is why an API authorisation finding in your own code has no EPSS value. first.org
- MITRE, About CWE, and the individual CWE entries mapped on this page. The About page is quoted for the definition of a weakness — “a condition in a software, firmware, hardware, or service component that, under certain circumstances, could contribute to the introduction of vulnerabilities” — which is why a bespoke API defect has a CWE even when it has no CVE. §5(xix) of the 2025 CERT-In guidelines carries substantially the same definition. Every identifier in the CWE table above links to its own MITRE entry page and takes its title from the document served there: CWE-20, CWE-200, CWE-209, CWE-213, CWE-285, CWE-287, CWE-489, CWE-613, CWE-639, CWE-770, CWE-799, CWE-862, CWE-863, CWE-915, CWE-1059 and CWE-1321. All sixteen were fetched and read against CWE list version 4.20. cwe.mitre.org
Five notes on what is deliberately absent, or is ours rather than an instrument’s. First, no CERT-In document read for this page publishes a methodology specific to API auditing. §6(xii) and §13.2.3(i)(a) name the class and the audit type and stop there, and the methodology material here is drawn from ASVS and from OWASP, which §8(ii) names. Second, §13.2.3(ii)(c) requires version-specific details of web and mobile applications in the scope and report and does not name APIs. Applying the same discipline to API versions is our reading. Third, §15.1.2 governs the temporariness and revocation of test credentials and sets no number of accounts. Every account count on this page is ours. Fourth, §13.1.5(i) draws its responsibility split for a web server owned by another organisation, naming the server, its operating system, the hosting software and the backend database. Reading a managed API gateway the same way is an analogy, and the page says so where it uses it. Fifth, there are no prevalence figures here — no share of findings, no defect rate per endpoint, no claim about what is most common. The OWASP API Security Top 10 cannot supply them either: its own 2023 release notes record that for the first public call for data, “no data was contributed”, and describe the result as a forward-looking awareness document. Clause locators were checked against the PDFs on 22 September 2026. If you find one that has moved, we would rather correct the page than be quoted accurately on something stale.
Frequently Asked Questions
What is API security testing?
Why does testing a web application not test the API behind it?
Is a mobile app penetration test the same as an API test?
Do I need a separate API penetration test, or is it part of the web test?
What is broken object level authorisation, and why can’t the UI find it?
How many test accounts does an API test need?
What is mass assignment, and is it still in the OWASP API Top 10?
How do you test rate limiting without causing an outage?
What is API discovery, and why does it cost money?
Our OpenAPI specification is out of date. Can we still test?
What are shadow APIs and zombie APIs?
Does CERT-In require API security testing?
Is testing against the OWASP API Security Top 10 enough?
Which ASVS chapters apply to an API?
What does a tester need from us before an API engagement starts?
Should the API be tested on staging or production?
How should API findings be scored when there is no CVE?
How do I tell whether our last report actually covered the API?
Are internal and service-to-service APIs in scope?
How does GraphQL change API testing?
How often should an API be re-tested?
What tools are used for API security testing?
How long does an API security test take?
What is the difference between API vulnerability assessment and API penetration testing?
Can our own engineers test our API?
What if our API engagement needs a CERT-In empanelled auditor?
Where to go next. In the testing cluster: what VAPT actually is on the two activities the compound names, VAPT scoping on turning §13.1.1 into a statement of work, types of VAPT on the engagement classes one at a time, VAPT vs penetration testing vs red teaming on which purchase answers which question, and reading a VAPT report on what to believe and what to question.
On the surfaces around the API: what cloud security is and a cloud security audit in India for the control plane, which is itself an API with its own authorisation model, and, where the endpoint in front of you is a model rather than a database, what AI red teaming is, AI red teaming vs VAPT, red teaming an LLM application and AI incidents under CERT-In.
On the regulatory frame: what CERT-In is, the 2022 Directions explained for the six-hour reporting duty and the twenty reportable incident types, the rules an empanelled auditor works under, and the safe-to-host certificate where the application is an Indian Government website or app.
Related Reading
The Types of VAPT
Web, network, mobile, API, cloud configuration and wireless — what each can and cannot find.
Read moreScoping a VAPT
Assets, environments, credentials, exclusions and the rules of engagement to agree before testing starts.
Read moreWhat Cloud Security Covers
The shared responsibility split, the control planes that matter, and where cloud breaches come from.
Read moreRed Teaming an LLM Application
Scoping, attack classes, evidence for a non-deterministic system, severity and retest.
Read moreWhat VAPT Actually Is
Vulnerability assessment and penetration testing are two activities. Why India bundles them, and what a real one covers.
Read moreHow to Read a VAPT Report
Scope, severity, evidence and the parts that reveal a weak test.
Read more