Checklist
API pentesting checklist for SaaS and software teams
An API pentest checks whether your interface only returns and only executes what each account is allowed to. It centres on the risks in the OWASP API Security Top 10, currently the 2023 edition: above all broken authorization at object, property and function level, plus missing limits, server-side request forgery and trusting third-party APIs too readily. The single most important test fits in one sentence: with two accounts in two tenants, swap every object ID from one into a request carrying the other's token, and not one request may succeed.
- APIs expose data and business logic directly. Bypassing authorization needs no user interface, just an HTTP client.
- The OWASP API Security Top 10, 2023 edition, is the common frame of reference. Three of the ten items are about authorization.
- An API pentest needs three things up front: a current specification (such as OpenAPI), test accounts for each role in at least two tenants, and a production-like environment.
- Scanners find misconfigurations and known patterns. They cannot know whether an object belongs to another tenant. People with two accounts test that.
- A useful report shows the exact request, the response, the impact and the fix for every finding, and it ends with a retest.
Why APIs are the main target
Data and logic without going through the UI.
Go to sectionOWASP API Top 10
The ten risks of the 2023 edition at a glance.
Go to sectionScope, accounts, environment
What to settle before the first request.
Go to sectionThe test steps
Concrete, with example requests.
Go to sectionScanners and their limits
What automation covers and what it misses.
Go to sectionThe report
What every finding has to include.
Go to sectionWhy APIs are the main target
In a SaaS product, the user interface is just one client among several. The web front end, the mobile app and customer integrations all talk to the same API, and whatever the interface hides, the API may still return. An attacker opens the browser's developer tools, sees the requests with their IDs and tokens, and replays them with changes. No known library vulnerability is required.
That is why the typical API weaknesses are not exotic coding bugs but gaps in business logic:
- Object level authorization (BOLA). The API checks that someone is logged in, but not that the requested object belongs to them. OWASP ranks this as risk number one.
- Function level authorization. A regular account reaches admin functions because the check lives only in the front end, or because a different HTTP method was left unprotected.
- Mass assignment. The API copies fields from the request straight into the data object, including fields such as role or tenant.
- Server-side request forgery (SSRF). The API fetches a URL supplied by the user, for webhooks or link previews, and can be steered towards internal services.
- Missing limits. Without caps on requests, page sizes or paid follow-up actions such as sending SMS, abuse and cost become a risk.
- Unsafe consumption of third-party APIs. Data from payment providers, CRMs or AI services is often treated as trusted and validated less strictly than user input.
For SaaS vendors, the first item weighs heaviest. If one customer can read another customer's data through the API, the trust promise of the whole platform is broken.
The OWASP API Security Top 10 (2023 edition)
Alongside its well-known Top 10 for web applications, the Open Worldwide Application Security Project (OWASP) publishes a separate list for APIs. The first edition appeared in 2019, the current second edition in 2023. No newer edition has been published on the project site as of 28 October 2026. According to the release notes, no data was contributed for the 2023 edition; the list rests on the project team's experience, review by API security specialists and community feedback. It is an awareness document, not a testing standard with a pass mark.
| No. | Risk | What the test checks |
|---|---|---|
| API1 | Broken Object Level Authorization | Swapping object IDs between accounts and tenants |
| API2 | Broken Authentication | Login, password reset, token validation, brute-force protection |
| API3 | Broken Object Property Level Authorization | Too many fields in responses, writable fields such as role (mass assignment) |
| API4 | Unrestricted Resource Consumption | Rate limits, page sizes, upload caps, spending limits on third-party services |
| API5 | Broken Function Level Authorization | Admin functions with a regular account, alternative HTTP methods |
| API6 | Unrestricted Access to Sensitive Business Flows | Automated abuse of flows such as purchase, booking or invitation |
| API7 | Server Side Request Forgery | Steering user-supplied URLs to internal targets |
| API8 | Security Misconfiguration | TLS, CORS, error messages, unnecessary methods, missing hardening |
| API9 | Improper Inventory Management | Old API versions, exposed test and staging hosts, documentation gaps |
| API10 | Unsafe Consumption of APIs | Validation of data, redirects and timeouts when calling external APIs |
Compared with 2019, OWASP merged "Excessive Data Exposure" and "Mass Assignment" into API3, because both share a root cause: missing authorization at the level of individual properties. API6 and API10 are new in 2023.
How an API pentest works
We cover the general flow of a penetration test, from sign-off to retest, in a separate article: Penetration testing: process, duration and cost. This section is about what is different with APIs. Three things decide how meaningful the test will be.
Scope: specification and inventory
The starting point is an up-to-date description of the interface, usually an OpenAPI specification (formerly Swagger), or the schema for GraphQL. It lists every endpoint, parameter and expected response, which makes the test plannable. Just as important is what the specification leaves out. Under API9, OWASP explicitly names old versions, forgotten hosts and missing documentation as a risk. So agree in writing:
- which hosts and versions are tested, for example
api.example.com/v2, and whether/v1is still reachable, - which endpoints are excluded and why, such as payment execution or bulk messaging,
- which connected third-party services may be touched and which may not,
- who can be reached during the test if something goes wrong.
Roles and test accounts per tenant
Without the right test accounts, an API pentest stays on the surface. A multi-tenant application needs at least two separate tenants, one account per relevant role in each, and real test data in each account, meaning created objects such as projects, invoices or documents. Only then can you check whether tenant A reaches tenant B's objects and whether a basic role reaches the functions of a higher one.
| Account | Tenant | Role | Purpose in the test |
|---|---|---|---|
| A-Admin | A | Administrator | creates objects, baseline for permitted functions |
| A-User | A | basic role | privilege escalation within the tenant |
| B-Admin | B | Administrator | access across the tenant boundary |
| B-User | B | basic role | both combined |
| unauthenticated | none | none | what is reachable without a token |
Environment
A staging environment that matches production in code, configuration and upstream components such as the API gateway and web application firewall works best. If it differs, the test examines a different system. Under API9, OWASP advises against using production data in non-production environments and, where that cannot be avoided, protecting them like production. Payment, email and SMS providers should run in test mode so that checks for API4 and API6 do not trigger real costs or messages.
A note for anyone testing in-house: only test systems for which the operator has given written authorization. That includes connected third-party APIs you do not own.
The test steps in detail
The following steps follow the OWASP API Security Top 10 and the "API Testing" chapter of the OWASP Web Security Testing Guide. The example paths are made up and stand for patterns found in many APIs.
1. Object access: swap IDs between tenants (API1)
The most important single test. Account A creates an object, say an invoice. The same request is then sent with account B's token:
GET /api/v2/invoices/8f3c… with Authorization: Bearer <B-User token>
- Expected:
403or404. A200carrying A's data is a finding. - Every method. Not just reads, but also
PUT,PATCHandDELETEon someone else's objects. An endpoint that checks on read but not on delete is not unusual. - IDs everywhere. IDs appear in the path, query parameters, JSON body, headers and GraphQL queries. Each location is swapped separately.
- Lists and filters. Endpoints such as
GET /api/v2/invoices?customer_id=…or exports often return whole data sets. Check that the filter stays within your own tenant. - Random IDs are not a control. UUIDs make guessing harder, but IDs leak through links, emails, logs and other responses. OWASP recommends them as an addition, not as a replacement for a per-object check.
2. Properties and mass assignment (API3)
- Read the responses. Does
GET /api/v2/users/mecontain fields the user should not see, such as internal flags, hashes or other people's data? The front end may hide them; the API still sends them. - Add fields. Extend an update such as
PATCH /api/v2/users/mewith fields like"role": "admin","tenant_id": "…"or"plan": "enterprise". If the API accepts them, that is mass assignment.
3. Function level: roles and methods (API5)
- Call admin functions with a basic account. Send A-User's token to endpoints only administrators use, such as inviting users, changing roles or exporting all data.
- Switch the method. If
GET /api/v2/users/42is allowed, what happens withDELETEon the same path? - Don't trust the path. OWASP points out that admin functions often do not sit under
/adminbut alongside regular endpoints. - Without a token. Call every endpoint once with no authentication at all.
4. Authentication and tokens (API2)
- Are token signatures validated? Does the API accept a JWT with
"alg": "none"or an expired token? - Are login, password reset and one-time codes protected against mass guessing?
- Do tokens or passwords appear in URLs, where they end up in logs?
- Do sensitive changes such as email address or password require re-confirmation?
5. Limits and sensitive flows (API4, API6)
- Page size. Does
?limit=accept arbitrarily large values? A single request can then pull entire tables and load the database. - Repeated actions. How often can a one-time code be checked, a password reset requested or an invitation sent?
- Paid follow-up actions. Do requests trigger SMS, emails or calls to paid services? OWASP recommends spending limits with the provider, or at least billing alerts.
- Business flows. Can a flow be abused through automation, such as booking every slot or mass-creating trial accounts? This is not a coding bug but a missing limit.
6. Server-side request forgery (API7)
Wherever the API fetches a user-supplied URL, for example webhook targets, import by link, image from URL or link previews:
- Supply internal targets:
localhost, private address ranges and the cloud environment's metadata services. - Test redirects: an allowed external URL that redirects to an internal target. OWASP recommends disabling redirects when fetching.
- Try other schemes and ports, and check whether the target's raw response is passed back to the user.
7. Configuration and inventory (API8, API9)
- Error messages without stack traces or internal paths, TLS throughout, CORS limited to your own origins.
- Older versions such as
/v1switched off or protected exactly like the current one. - Staging, test and debug endpoints not publicly reachable.
8. Third-party APIs (API10)
- Data from connected services is validated like user input before it reaches the database, templates or downstream systems.
- Encrypted connections only, no blind redirect following, timeouts and response size limits in place.
- Webhooks from third parties are checked for a valid signature before the API processes them.
The checklist
| Area | Check |
|---|---|
| Preparation | Current OpenAPI specification or GraphQL schema, hosts and versions in the written scope |
| Preparation | Two tenants, one account per role, test data created, payment and messaging in test mode |
| Object access | Every object ID swapped with the other tenant's token, for every method |
| Object access | Lists, filters and exports limited to your own tenant |
| Properties | No surplus fields in responses, role and tenant not writable by request |
| Functions | Admin functions refused for basic roles and without a token, method switching tested |
| Authentication | Token signature and expiry validated, brute-force protection on login, reset and one-time codes |
| Limits | Rate limits, maximum page size, upload caps, spending limits on third-party services |
| Flows | Sensitive business flows limited against automated abuse |
| SSRF | Fetching user URLs restricted to allowed targets, no redirects, no raw responses |
| Configuration | TLS, CORS, error messages, unnecessary methods disabled |
| Inventory | Old versions and test hosts switched off or equally protected |
| Third-party APIs | Incoming data validated, webhook signatures checked, timeouts set |
What automated scanners find, and what they miss
API scanners and fuzzers are useful, and a good test uses them. They work through the specification, send altered input and compare responses against known patterns. That reliably covers one class of flaws. Authorization logic is not part of it.
| A scanner usually finds | Needs human testing |
|---|---|
| Missing TLS, loose CORS rules, verbose error messages | Whether object 8f3c… belongs to tenant A and must stay hidden from B |
| Known vulnerabilities in server components | Whether a basic role may not call a function that technically works |
| Obvious injection patterns in parameters | Which response fields are sensitive and which may be writable |
| Unauthenticated endpoints, exposed documentation | Whether a business flow can be abused without any error occurring |
The reason is simple: a 200 with data looks correct to a scanner. Whether that data belongs to the requesting account is not in the response; it is in your application's business rules. Only someone who knows which account belongs to which tenant, and who cross-checks the request with two accounts, can judge it. OWASP says as much for function level flaws: the best way to find them is a deep analysis of the authorization mechanism with the role and group hierarchy in mind. For how an automated vulnerability assessment differs from a penetration test overall, see Vulnerability assessment: what it is and when you need one.
For your engineering team, there is a practical upside: the swap test from step 1 can become an automated test in your own pipeline. OWASP recommends writing tests for the authorization mechanism and not shipping changes that make them fail. The pentest finds the gaps; the regression test keeps them from coming back.
What the report should contain
An API pentest report is useful when your engineers can reproduce every finding without asking. For each finding it should include:
- Affected endpoint and method, with version and host.
- The exact request and response as evidence, stating which test account from which tenant was used.
- Impact in plain words, such as "tenant B can read and delete tenant A's invoices", not just a category.
- Severity rating using a transparent method such as CVSS, with reasoning.
- Mapping to the OWASP category, so findings can be matched against questionnaires and internal policies.
- A concrete fix, ideally pointing to the place in code or configuration where it belongs.
Add a management summary, the coverage (which endpoints and roles were tested and which were not) and a retest of the fixes.
API pentest or SaaS pentest?
For many SaaS products the API is the largest part of the attack surface, but not the only one. Tenant isolation also concerns file storage, background jobs, search indexes, exports and support access. If your goal is to show an enterprise customer that no tenant can see another tenant's data, a SaaS penetration test focused on tenant isolation is the right frame, with the API review at its core. For a public or partner API without its own interface, an API pentest on its own is often enough.
Does your API hold the tenant boundary?
We test your API within a scope agreed in writing, along the OWASP API Security Top 10: object and function level authorization with test accounts across several tenants, mass assignment, authentication and tokens, limits, SSRF and how you consume third-party services. Every finding comes with the reproducible request as evidence and a concrete fix. Learn more about SaaS penetration testing and penetration testing.
Request an API pentestCyberSec42 is an independent technical security assessment, not an accredited certification body, and does not provide legal advice. CyberSec42 is not affiliated with the OWASP Foundation.
Frequently asked questions
What is an API pentest?
A penetration test that examines a programming interface directly, without going through the user interface. The core question is whether each account reaches only the objects and functions it is entitled to. It is usually based on the OWASP API Security Top 10 and a specification such as OpenAPI.
Which edition of the OWASP API Security Top 10 is current?
The 2023 edition. It is the second edition, following the first in 2019. As of 28 October 2026, no newer edition has been published on the OWASP project site.
What is BOLA?
Broken Object Level Authorization: the API does not check whether the requested object belongs to the requesting account. Anyone who swaps the ID in a request gets someone else's data. OWASP ranks BOLA as risk number one on the API list.
Is an automated API scanner enough?
A scanner helps with misconfigurations and known patterns. It cannot judge whether an object belongs to another tenant or whether a role may use a function. That requires testing with several accounts and knowledge of the business rules.
Should we test in production or staging?
Usually in a staging environment that matches production in code and configuration, with test data instead of customer data and with payment and messaging providers in test mode. Any differences from production should be known in advance and noted in the report.
What do you need from us for an API pentest?
A current specification of the interface, test accounts per role in at least two tenants with test data in place, access to the test environment, written authorization with the scope, and a contact person for the duration of the test.
Further reading
- OWASP Top 10 2025 explained
- Lovable Security Issues: What Is Documented and How to Fix Them
- Penetration Testing: Process, Duration and What It Costs
- Vulnerability Assessment: what it is and when you need one
- MCP and OAuth: Securing the Trust Anchor
- Service: SaaS penetration testing focused on tenant isolation
Sources
- OWASP API Security Top 10 2023: overview of the ten risks
- OWASP API Security Top 10 2023: release notes
- OWASP API1:2023 Broken Object Level Authorization
- OWASP API5:2023 Broken Function Level Authorization
- OWASP API7:2023 Server Side Request Forgery
- OWASP Web Security Testing Guide: API Broken Object Level Authorization
- OWASP Web Security Testing Guide: API Broken Function Level Authorization
- OWASP API Security Project on GitHub (2019 and 2023 editions)