API Security Testing: A Complete Guide

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.

Item
What It Means
Why It Is Specific to APIs
Item

API1 Broken Object Level Authorization

What It Means

One user reads or changes another user’s records by altering an ID in the request

Why It Is Specific to APIs

APIs hand out object IDs openly, so trying a neighboring value costs nothing

Item

API2 Broken Authentication

What It Means

Logins, tokens, or API keys can be forged, reused, or worked around

Why It Is Specific to APIs

APIs authenticate machines with long-lived credentials, not browser sessions

Item

API3 Broken Object Property Level Authorization

What It Means

A response carries fields the caller should never see, or accepts fields they should never set

Why It Is Specific to APIs

APIs return whole objects and leave the client to decide what to display

Item

API4 Unrestricted Resource Consumption

What It Means

Nothing caps how many requests, how large a payload, or how costly an operation may be

Why It Is Specific to APIs

A script can hammer one endpoint far faster than any person could

Item

API5 Broken Function Level Authorization

What It Means

An ordinary user calls an endpoint meant only for administrators

Why It Is Specific to APIs

Admin actions are often just another route, with nothing hiding them

Item

API6 Unrestricted Access to Sensitive Business Flows

What It Means

Automation abuses a legitimate feature at scale, such as buying up limited stock

Why It Is Specific to APIs

The feature behaves exactly as designed, which is why functional tests pass

Item

API7 Server Side Request Forgery

What It Means

Your API fetches a web address supplied by the caller and reaches internal systems

Why It Is Specific to APIs

APIs routinely accept URLs as ordinary input

Item

API8 Security Misconfiguration

What It Means

Default settings, chatty error messages, or missing headers leak information

Why It Is Specific to APIs

Every endpoint and gateway in the chain carries configuration of its own

Item

API9 Improper Inventory Management

What It Means

Retired versions and undocumented endpoints stay reachable

Why It Is Specific to APIs

APIs accumulate versions, and old ones are rarely switched off properly

Item

API10 Unsafe Consumption of APIs

What It Means

Your API trusts whatever a third-party service sends without validating it

Why It Is Specific to APIs

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 role or account_balance that 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.

Protocol
What Changes
Where to Look First
Protocol

REST

What Changes

Resource identifiers sit in plain sight, inside the address

Where to Look First

Whether swapping an ID returns another customer’s data

Protocol

GraphQL

What Changes

A single endpoint, with the client composing its own queries

Where to Look First

Query depth and cost limits, and whether introspection is open to the public

Protocol

gRPC

What Changes

Binary messages with no browser-visible surface

Where to Look First

Whether service reflection is exposed, and whether each method checks permissions

Protocol

SOAP

What Changes

XML envelopes carrying a security layer of their own

Where to Look First

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

This report highlights the exploits we found categorized by severity along with recommendations on how to fix them.
Please enter your business email isn′t a business email