Your existing checks probably prove a single thing well: the service behaves correctly for anyone who follows the rules. Whether it also turns away the people who don’t is a different question, and one most release cycles never reach. API security testing looks at whether someone who already knows how to talk to your endpoints can make them misbehave.
It examines how you handle logins and tokens, whether each request is allowed to do what it asks, how much traffic you permit, and what your responses give away. This work has its own risk list, the OWASP API Security Top 10. It isn’t the same as the general web application version most checklists follow.
Three of the ten API risks are authorization failures, where the service knows exactly who is asking and still hands over records belonging to somebody else. A web application checklist folds all of that into one broad category. We look for those failures during everyday QA, and we run penetration testing services when a release calls for a deeper, scoped review.
The rest of this guide is about how to check for each one.
How API Security Testing Differs From Web App Security Testing
Web application security testing assumes a person in a browser. Someone fills in a form, submits it, and the screen decides what to show them. Therefore, much of the protection lives in that page: fields you can’t edit, buttons you never see, menus that hide anything you aren’t meant to reach.
An API has none of that. It answers whoever sends a correctly formed request, and the caller is usually a script rather than a person. So what is API security testing in practice? It’s the work of proving your API turns down the requests it ought to refuse, even when they come from an account that logged in successfully.
This is the shift that catches teams by surprise. Classic web testing spends most of its effort on keeping strangers out. By contrast, on an API you start from the opposite premise: the caller already has a valid token. The interesting question is no longer how they got there but how much they can reach now that they have.
That has two practical consequences:
- Your business logic sits exposed rather than wrapped in an interface, so a front-end check protects nothing.
- A script can repeat a single request thousands of times a minute, which turns a small oversight into a large one.
The two OWASP lists reflect this split. On the web application side, broken access control is a single entry covering everything from a hidden admin page to a tampered record ID. The API version breaks the same ground into three separate risks, because those failures look and behave differently here. For the web equivalent, our web application penetration testing checklist walks through it, while our security testing practice covers both surfaces.
What Is the OWASP API Security Top 10?
The OWASP API Security Top 10 is the reference for this work, currently in its 2023 edition. The security testing of API endpoints tends to follow it closely, because every item names a failure you can go and check rather than a principle to bear in mind.
One naming point is worth clearing up first. If you’ve read about “excessive data exposure” as an API risk, that was the 2019 edition’s third item. It got merged into API3 during the 2023 revision, so the older term still turns up in articles and tools while the current list calls it something else.
API1 Broken Object Level Authorization
One user reads or changes another user’s records by altering an ID in the request
APIs hand out object IDs openly, so trying a neighboring value costs nothing
API2 Broken Authentication
Logins, tokens, or API keys can be forged, reused, or worked around
APIs authenticate machines with long-lived credentials, not browser sessions
API3 Broken Object Property Level Authorization
A response carries fields the caller should never see, or accepts fields they should never set
APIs return whole objects and leave the client to decide what to display
API4 Unrestricted Resource Consumption
Nothing caps how many requests, how large a payload, or how costly an operation may be
A script can hammer one endpoint far faster than any person could
API5 Broken Function Level Authorization
An ordinary user calls an endpoint meant only for administrators
Admin actions are often just another route, with nothing hiding them
API6 Unrestricted Access to Sensitive Business Flows
Automation abuses a legitimate feature at scale, such as buying up limited stock
The feature behaves exactly as designed, which is why functional tests pass
API7 Server Side Request Forgery
Your API fetches a web address supplied by the caller and reaches internal systems
APIs routinely accept URLs as ordinary input
API8 Security Misconfiguration
Default settings, chatty error messages, or missing headers leak information
Every endpoint and gateway in the chain carries configuration of its own
API9 Improper Inventory Management
Retired versions and undocumented endpoints stay reachable
APIs accumulate versions, and old ones are rarely switched off properly
API10 Unsafe Consumption of APIs
Your API trusts whatever a third-party service sends without validating it
Integrations get treated as trustworthy in a way user input never is
The Three Ways API Authorization Fails
These entries describe the same underlying mistake at different scales. Together they’re where most real API incidents begin, and they explain why this risk profile can’t simply inherit a web application checklist.
- API1, object-level. Your API identifies the caller, then fails to ask whether they own the particular record they requested. For example, a lookup for invoice 1041 succeeds, so somebody tries 1042 and receives a stranger’s bill. Finding it is unglamorous and effective: sign in as one customer, collect the identifiers you legitimately hold, then request the ones you don’t and watch what returns. A correct API answers with a refusal. The vulnerable one hands over data.
- API3, property-level. Here the record does belong to you, but the exchange carries more than it should in one direction or the other. A customer profile might return an internal risk score or a reset token alongside the name and address, because the endpoint sends the whole object and trusts the app to display only part of it. The reverse happens too, where an update accepts a field such as
roleoraccount_balancethat no client should be able to set. Both directions need testing, because a response the app never displays has still left your server. - API5, function-level. This time the operation is off limits rather than the record. A standard account calls an administrator’s route and it works, because nothing behind it re-checks who is asking. On a website an admin screen stays hidden from the navigation and mostly forgotten. An API has no menu, so every privileged action needs its own guard, and each one has to be tried from an ordinary account.
Notice what the three have in common: nothing was broken into. Every request was correctly formed, properly authenticated, and answered exactly as the code intended. That’s why they survive functional testing so comfortably, and why catching them takes a case that deliberately asks for something it shouldn’t receive.
What to Check for the Remaining Seven Risks
These still matter, though each needs less unpacking.
- API2, authentication. Look at how tokens get issued, how long they stay valid, whether one still works after logout, and whether a password reset flow can be walked backwards.
- API4, resource consumption. Send more traffic than any real client would, oversized payloads, and queries you know are expensive. You want a clear refusal rather than a slow collapse.
- API6, business flows. Ask what a competitor or a reseller could do with unlimited automated access to a feature that works correctly. Ticket buying and voucher redemption are the usual examples.
- API7, request forgery. Anywhere your API accepts a web address, point it at internal infrastructure and see whether it obliges.
- API8, configuration. Chatty errors, absent headers, and rules that let any website call your API all live here. Our explainer on security misconfiguration covers the pattern in more depth.
- API9, inventory. Find out what remains reachable. Old versions, staging routes, and endpoints missing from the documentation are common, and whatever nobody maintains also goes unpatched.
- API10, unsafe consumption. Treat data arriving from outside services with the suspicion you apply to user input, because a trusted integration can still send you something malformed.
How REST, GraphQL, gRPC, and SOAP Change What You Test
The OWASP list is deliberately protocol-neutral, which helps with planning and falls short of execution. API security testing has to account for how your service actually communicates, because the same risk surfaces somewhere different depending on the technology underneath.
REST
Resource identifiers sit in plain sight, inside the address
Whether swapping an ID returns another customer’s data
GraphQL
A single endpoint, with the client composing its own queries
Query depth and cost limits, and whether introspection is open to the public
gRPC
Binary messages with no browser-visible surface
Whether service reflection is exposed, and whether each method checks permissions
SOAP
XML envelopes carrying a security layer of their own
Envelope validation, and whether WS-Security is genuinely enforced
REST and GraphQL
REST is where object-level authorization goes wrong most often, for structural reasons rather than cultural ones. A REST address names the thing you’re asking for, so the identifier sits right there to be edited. Nothing about the style makes it less safe, but it does make one particular mistake unusually easy to commit and simple to find. The detailed version of that check belongs in a REST-specific security checklist.
GraphQL moves the exposure somewhere else. Because the client composes its own query, a single request can ask for deeply nested, costly data that no REST route would permit. That turns API4 into a design decision rather than a rate-limit setting. The other frequent oversight is introspection: the feature that lets any client ask the API to describe its own structure. Left publicly enabled, it hands a visitor a complete map of your data model.
gRPC and SOAP
gRPC looks safer by default, largely because there’s no convenient browser tooling and the messages are unreadable to a person. That works against you during testing more than it helps you in production. Service reflection, which lets a caller list every available method, hands an outsider a complete map of your service if you leave it switched on. Permissions then have to be checked on each one rather than assumed from the transport.
SOAP arrives with a security specification built in, called WS-Security, and that creates a trap of its own. Configuring it isn’t the same as applying it to every operation. XML parsers also bring a family of problems that services built on JSON never meet.
Why Does API Security Testing Belong Inside QA?
The most common mistake we see is treating API security testing as a one-off project instead of routine work. It gets scheduled once a year, handled by outside specialists, and written up weeks after the release it describes.
That arrangement misses the authorization failures almost entirely, for a straightforward reason. Finding them depends on understanding what the product is meant to do. Yet a reviewer arriving for two weeks has no way to tell which fields a customer should see, which routes are admin only, or who owns which record. Your QA engineers know all of it, because they wrote the functional tests that encode those rules.
The fix is one small habit on every release. Whoever checks an endpoint also asks for a record they don’t own, and confirms the refusal. Our API testing work is built that way, with the security cases running beside the everyday ones instead of behind them.
We saw that on Union54, a card-issuing API for African fintechs, tested with no interface at all. Some of the defects we reported were authorization failures between different types of users. None of it came out of a dedicated security review. Instead, those findings belonged to QA engineers who knew the product well enough to notice when the wrong person got the right answer.
That doesn’t make specialist work redundant. A scoped penetration test still earns its place before a major launch, or when a regulator or a large customer asks for one. However, it pays off more once the obvious gaps are closed. The specialists then spend their time on problems only they can find.
How to Build an API Security Testing Checklist
Knowing how to test API security turns out to be less about what the list contains and more about who owns it. Plenty of teams have a document, but hardly anyone opens it during a release.
Organize yours around the OWASP categories rather than your endpoints. A route-by-route inventory goes stale the week after you write it, while those risk groupings hold steady across releases and technologies. Under each one, record what gets checked, which paths it applies to, and who signs it off.
Four decisions do more for a checklist than its contents:
- Give it one owner with the authority to block a launch, never a shared inbox.
- Tie it to the release process your team already follows instead of a separate security calendar.
- Write each entry as a request plus an expected refusal, so anyone can run it and read the result.
- Revisit it whenever you add a route, change a permission model, or take on a new third-party integration.
Two adjacent pieces are worth keeping open beside it:
- Our REST API testing checklist covers the reliability half, and the overlap is useful, since a security case is often a functional one with the expected outcome inverted.
- Our work on API performance testing belongs here too, because whatever limits abuse also carries you through a traffic spike.
A word of caution about tooling. Scanners do well on misconfiguration and token handling, where mistakes follow recognizable patterns. They’re close to useless on the three authorization risks, because no tool can tell who should own a given invoice. Only your team has that knowledge, so the work belongs inside quality assurance rather than outside it.
We audit APIs against the OWASP list at whatever stage your product has reached, whether the build is finished or the endpoints are still being written. To find out what your API hands over to a caller who asks for more than they should, talk to our QA team.
What is API security testing?
API security testing checks whether an API can be misused by a caller that already holds valid credentials. It covers authentication, authorization on every request, rate and payload limits, and what responses reveal. The reference framework is the OWASP API Security Top 10, which differs from the general web application list because API risk concentrates in authorization rather than injection.
Does GraphQL need different security testing than REST?
Yes, though the OWASP list applies to both. REST exposes record identifiers in the address, so the first check is whether swapping one returns another customer’s data. GraphQL lets the client compose its own request, which moves the risks to query depth, cost limits, and whether introspection is public.
How is the OWASP API list different from the web application Top 10?
The web application list treats access control as one broad category. The API list splits it into three: object level, object property level, and function level. That reflects how API failures actually happen, where a properly authenticated caller receives records belonging to somebody else. Injection and scripting risks, which dominate web testing, matter less on most APIs.
Can functional QA find API security problems?
Yes, and for authorization flaws it’s usually the most effective place to look. Finding them means knowing who should see each record, and your QA engineers already encode those rules in functional tests. Writing the negative case beside the positive one catches most of those authorization failures long before a specialist review would.
How often should API security testing run?
Run the authorization and input checks on every release, inside your normal test cycle, because a single permission change can open a gap. Reserve scoped penetration testing for major launches, architecture changes, or a compliance requirement. Annual testing on its own leaves you exposed for the eleven months when the product keeps changing.
See a sample of our security code review of a US-based e-commerce platform