Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Secure an API by checking authorization on every object, field, and operation—not just by requiring a valid login. Then layer in sound token validation, limits on resource use and abuse-prone workflows, safeguards for outbound requests, secure configuration, an accurate API inventory, and validation of data received from other APIs. The OWASP API Security Top 10’s current edition is the 2023 list; it is an awareness framework, not a measured ranking of how often attacks occur.

What the OWASP API Top 10 covers

APIs expose application data and actions through interfaces that other software can call. API security protects that logic and the sensitive data behind it. OWASP’s API Security Project organizes common API-specific vulnerability categories to help teams understand and mitigate those risks.

The 2023 list has ten categories. Three of its first five concern authorization; the OWASP API Security Project team said in its 2023 release announcement, “Authorization remains the biggest challenge in API Security.” The order is not a frequency ranking: OWASP said the 2023 list received no public data contributions and was built through specialist review and community feedback.

2023 category What can go wrong Main defensive focus
API1: Broken Object Level Authorization (BOLA) A caller accesses another user’s record by changing an object identifier. Authorize every access to an identified object.
API2: Broken Authentication Weak or incorrect authentication lets an attacker compromise a token or act as another user. Implement authentication and token validation correctly.
API3: Broken Object Property Level Authorization Responses expose fields a caller should not see, or updates change fields they should not control. Authorize access to individual properties; allow-list writable fields.
API4: Unrestricted Resource Consumption High-volume or expensive requests exhaust resources or drive up costs. Apply limits, quotas, and monitoring appropriate to the operation.
API5: Broken Function Level Authorization A user invokes an operation reserved for a different role, such as an administrative action. Check privileges for every operation, including less visible endpoints.
API6: Unrestricted Access to Sensitive Business Flows Automation abuses legitimate workflows, for example by scalping limited goods or creating fake accounts. Identify abuse-prone flows and apply workflow-specific controls.
API7: Server-Side Request Forgery (SSRF) A caller steers the server’s outbound request to an unintended destination. Validate destinations before fetching user-supplied URIs.
API8: Security Misconfiguration Unsafe defaults, debug exposure, or inconsistent settings leave an API or its supporting systems vulnerable. Harden and review configuration across environments.
API9: Improper Inventory Management Untracked hosts, endpoints, or versions leave obsolete or debug interfaces exposed. Maintain an accurate, current API inventory and documentation.
API10: Unsafe Consumption of APIs An integration trusts third-party API responses without adequate validation. Treat external API data as untrusted input.

API4 is the 2023 category name for a concern previously described as “lack of resources and rate limiting.” API3 brings together the former excessive-data-exposure and mass-assignment themes.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Start with authentication, then authorize each action

Authentication answers who is calling

Authentication establishes the identity associated with a request. Validate credentials and tokens using the rules for the token type and identity system you actually use. Reject missing, invalid, or expired credentials; do not treat possession of a user ID, account number, or other identifier as proof of identity. Keep authentication checks consistent across routes rather than relying on a client to hide sensitive operations.

Authorization answers what that caller may do

A successfully authenticated caller is not automatically entitled to every record, field, or operation. Make authorization decisions on the server, using the authenticated principal and the requested action against the relevant resource. Apply the check on every request, including requests made through alternate routes or API versions. A prior successful request is not a substitute for checking the next one.

Prevent BOLA: check access to every identified object

BOLA occurs when a request names an object—often through a path parameter, query value, or request-body field—but the API fails to verify that the caller may access that particular object. Hiding identifiers, using unpredictable identifiers, or checking that a user is logged in does not replace object-level authorization.

  1. Find every function that reads or changes data using an identifier supplied by the caller.
  2. Resolve that identifier on the server, then check that the authenticated principal may perform the requested action on the resolved object.
  3. Apply the check to reads, writes, deletes, nested resources, bulk operations, and background actions started through the API.
  4. Test with two principals and records belonging to each: a request that succeeds for one owner should not disclose or change another owner’s record.

For example, an endpoint such as GET /invoices/123 must not rely on the fact that the caller has a valid session. The server must also establish that this principal can view invoice 123. Make the same decision for an update or download of that invoice, rather than assuming the read check covers every operation.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Protect fields and privileged functions

Keep property-level access explicit

Object-level access does not mean every field on the object is appropriate to return or accept. API3 covers both overexposing properties in responses and accepting changes to fields a caller should not control. Return only the properties needed for the caller’s permitted task. For writes, construct updates from an explicit allow-list of editable fields; avoid binding an arbitrary request body directly onto a privileged internal object. Treat fields such as role, ownership, or account status as protected unless the caller is explicitly authorized to change them.

Check permissions on every function

API5 concerns access to operations, not just records. Check roles and privileges for each function that requires them—including administrative functions and endpoints that are not linked from the public interface. A hidden route is still callable if a client can address it. For sensitive operations, make the required permission clear in the server-side policy and test that a lower-privileged principal is denied.

Limit resource use and business-flow abuse

Authentication and authorization do not prevent a permitted user or bot from repeatedly invoking a costly operation or automating a legitimate workflow at harmful scale.

  • For resource consumption (API4): set quotas and throttling for high-volume or expensive operations, cap request sizes where relevant, and monitor use so unusual patterns can be investigated. Choose controls to fit the operation and business risk rather than assuming one global rate limit is sufficient.
  • For sensitive flows (API6): identify workflows that become harmful when automated, such as scalping or fake-account creation. Use controls suited to the workflow, including rate limits and workflow defenses; do not rely on a generic request cap as the only safeguard.

Plan these controls around both abuse and legitimate use. A limit that is too generous may fail to constrain harmful activity; one that is too strict can disrupt valid clients. Monitoring gives operators information to tune limits and investigate exceptions.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Reduce SSRF and integration risk

Validate destinations before the server fetches them

When an API accepts a URI and fetches it from the server, an attacker may try to make that server contact a destination the application did not intend. Validate user-supplied destinations against the use case before issuing the request. Do not treat a syntactically valid URI as automatically safe or assume that a caller-selected destination is trustworthy.

Treat third-party responses as untrusted input

API10 applies at integration boundaries: data from a third-party API needs security validation too. Check that returned data has the expected shape and values before using it in application logic or displaying it. An integration’s familiarity or reputation is not a reason to trust its response more than other external input.

Harden configuration and keep an API inventory

Review the configuration that reaches production

For API8, review the API and its supporting systems for unsafe defaults, exposed debugging information, and security settings that differ between environments. Make the intended secure configuration explicit, and check that deployments preserve it rather than assuming a setting applied in one environment will carry over to another.

Track hosts, routes, and versions

For API9, keep an inventory of deployed hosts, endpoints, and API versions. Maintain documentation that lets teams identify deprecated versions and exposed debug endpoints, then compare the inventory with what is actually deployed. An undocumented or forgotten version remains part of the attack surface while it is reachable.

What’s actually slowing this PC down?

Pick the symptom - the matching free tool is one click away.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
Rank #4
API Security in Action
  • API Security in Action
  • Manning Publications
  • ABIS BOOK

A practical order for an API security review

  1. Inventory the surface. Record hosts, endpoints, versions, sensitive workflows, and integrations. Identify old or debug interfaces that are still deployed.
  2. Trace authorization paths. For each operation, ask which principal may invoke it, which objects it may touch, and which properties it may read or change. Give extra attention to caller-supplied identifiers.
  3. Review identity and tokens. Confirm that protected routes authenticate consistently and that invalid or expired credentials do not become an authenticated identity.
  4. Assess abuse and cost exposure. Find expensive operations and automation-sensitive workflows. Set appropriate quotas, throttles, request-size constraints, and monitoring.
  5. Inspect trust boundaries. Review user-supplied destinations and every third-party response consumed by the application.
  6. Check deployment settings. Look for debug exposure, unsafe defaults, and configuration drift between environments.
  7. Retest with different principals and inputs. Verify allowed and denied actions for multiple users, roles, objects, and fields—not only the intended success path.
Independent reader supportYour contribution helps us test, update, and keep practical guides available for everyone.Support on Ko-Fi

Example: handle an external screenshot API as an integration

A screenshot service illustrates two API-security boundaries: protect the credential used to call it, and validate any URL your own API forwards for capture. Do not accept arbitrary destinations from a public caller and pass them through to a server-side fetch without destination checks; that design can create SSRF risk. Keep the service key on the server, not in browser code, and validate the response before your application uses or serves it.

ScreenshotNeo is a website screenshot API and MCP server. Its API accepts a URL and returns an image or PDF, so using it does not remove the need to control the URLs your application permits users to submit.

Or skip the browser setup

For a direct server-side capture, make one GET request. The target below is a fixed example; substitute only a URL your application is permitted to capture. See the ScreenshotNeo API documentation for request options.

curl -G "https://api.screenshotneo.com/v1/shot" -d access_key=YOUR_API_KEY --data-urlencode url=https://stripe.com -o shot.webp

Python:

import requests

r = requests.get(
    "https://api.screenshotneo.com/v1/shot",
    params={"access_key": "YOUR_API_KEY", "url": "https://stripe.com"},
    timeout=90,
)
open("shot.webp", "wb").write(r.content)

Node.js:

const q = new URLSearchParams({ access_key: 'YOUR_API_KEY', url: 'https://stripe.com' });
const res = await fetch(`https://api.screenshotneo.com/v1/shot?${q}`);
  • It accepts the cookie or consent banner before capture and removes more than 60 known consent platforms, newsletter popups, and chat widgets; each step can be turned off.
  • Bot checks or CAPTCHAs, blank pages, timeouts, failed loads, and cache hits are not billed. Responses identify the page verdict and billing status in X-Page-Verdict and X-Billed headers.
  • An MCP server provides take_screenshot, get_page_info, and capture_pdf tools for Claude, Cursor, and other MCP clients.
  • The Free plan includes 1,000 screenshots a month with no card; paid plans start at $5 for 3,000 shots. Every feature is on every plan.

Sign up for ScreenshotNeo’s free plan to get 1,000 screenshots a month with no card.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

How to compare API security practices

When reviewing an implementation, use five lenses rather than judging it by the presence of a login screen or gateway:

  1. Authorization depth: Are object, property, and function checks enforced for the right principals and actions?
  2. Authentication and tokens: Are identities established and tokens validated consistently?
  3. Abuse resistance: Are resource-heavy operations and sensitive business flows protected in ways matched to their risks?
  4. Coverage: Do configuration review and inventory include deployed hosts, endpoints, and versions?
  5. Trust boundaries: Are outbound destinations validated and third-party responses handled as untrusted data?

Audit logging, rate limiting, and encryption are practical implementation topics explored in API Security in Action by Neil Madden, published by Manning in November 2020.

Troubleshooting common API security failures

  • A user can retrieve another user’s record: the endpoint likely authenticates but does not authorize access to the specific object. Enforce a principal-to-object check wherever caller-supplied identifiers reach a data source.
  • A caller changes a protected field: the API may be accepting more of the request body than intended. Use an explicit writable-field allow-list and enforce property-level permission.
  • A non-admin reaches an administrative action: check authorization at the function itself, not only at the interface or client navigation layer.
  • A service becomes slow or unexpectedly costly: identify high-volume and expensive routes, then review request-size limits, quotas, throttling, and monitoring. Consider separately whether an abuse-prone workflow needs its own defenses.
  • A URL-fetch feature reaches an unintended destination: validate the requested destination before the server makes the outbound request; do not trust caller-provided URIs by default.
  • An old route or debug endpoint is still reachable: compare deployed hosts and endpoints with the documented inventory, identify untracked versions, and remove or secure what should no longer be exposed.
  • An integration behaves unexpectedly on returned data: validate the third-party response’s structure and values before consuming it rather than assuming the upstream service guarantees safe input.
  • Security differs between staging and production: review settings for unsafe defaults, debug exposure, and configuration drift, then make the intended deployment configuration consistent.

Frequently Asked Questions

Is the OWASP API Top 10 a compliance certification?

No. It is a risk-awareness framework, not a certification or proof that an API is secure.

Does passing the Top 10 mean an API cannot be attacked?

No. The categories help focus review, but they do not guarantee security or replace testing against the API’s own architecture and threats.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Quick Recap

Product prices and availability are accurate as of the date/time indicated and are subject to change. Any price and availability information displayed on Amazon at the time of purchase will apply.