Skip to content
Offensive testing

API Penetration Testing

Specialized REST, GraphQL, and gRPC API penetration testing focused on authorization flaws, rate limiting, and business logic abuse. OWASP API Top 10, dev-friendly reports.

Quoted on scope, fixed price. Includes the Vexil platform and a hand-verified retest.

Teams who have had us test their systems

  • Riverbed
  • Dynasend
  • Melp
  • Code Avengers
  • AVLOAI
  • Ames d.o.o.
  • Logicdialog
  • Selip & Stylianou, LLP

What this covers

Your API is the backbone of your product - every frontend, mobile app, and integration partner depends on it. It is also the attack surface that gets tested last. While your web app gets tested, your API endpoints often ship with object-level authorization gaps that expose every user's data. We test REST, GraphQL, and gRPC APIs against the OWASP API Security Top 10. Our testing goes far beyond automated scanning: we manually test every endpoint for broken object-level authorization (BOLA/IDOR), broken function-level authorization, mass assignment, and rate-limit abuse. We chain findings into real attack narratives - "an attacker can enumerate user IDs and access any account's private data" - not just "IDOR on /users/{id}." Every finding includes the exact request/response pair, a severity rating, and a framework-specific fix recommendation. A re-test is included in the engagement, after your devs patch.

  • Ship public APIs with confidence that every endpoint is authorization-gated
  • Close enterprise deals faster with a professional API security audit report
  • Catch the #1 API vulnerability (broken object-level auth) before a breach does
  • Get rate-limit and abuse-resistant endpoints your platform team can trust

Scope

What gets tested

Ten areas, agreed on the scoping call and written into the rules of engagement before anything starts.

  • REST API Security

    Endpoint enumeration, method-based auth bypass, content-type abuse, CORS misconfigurations, parameter pollution.

  • GraphQL Security

    Introspection abuse, query depth/alias/cost attacks, field-level auth gaps, batching brute force, subscription exhaustion.

  • gRPC Security

    Service reflection enumeration, protocol buffer fuzzing, metadata-based auth bypass, streaming connection abuse.

  • Authentication & Tokens

    JWT algorithm confusion, weak signing keys, OAuth2/OIDC misconfigurations, API key lifecycle, token storage.

  • Authorization & Object Access

    BOLA across every object type, broken function-level auth for admin endpoints, cross-tenant data access.

  • Rate Limiting & Abuse

    Per-endpoint brute force resistance, resource exhaustion, race conditions, webhook signature validation.

  • Mass Assignment

    Unintended property binding, privilege escalation via request body manipulation, parameter pollution.

  • Injection via API

    SQLi, NoSQLi, command injection through API parameters, headers, and GraphQL arguments.

  • OWASP API Top 10

    Full coverage of the dedicated OWASP API Security standard - all 10 categories.

  • Webhook & Callback Security

    Signature validation, replay protection, IP filtering, malicious webhook registration testing.

Why a scan is not a test

What a scanner misses here

For part of it. But a scanner cannot hold two customers’ tokens and compare what each one is allowed to see. A person can.

Scanner

Finds what is there

  • Endpoints reachable with no token
  • Known CVEs in the gateway
  • Verbose errors and stack traces
  • Missing rate limits on obvious routes
  • TLS and certificate configuration

Fast, and worth running.

Tester

Finds what is broken

  • An object id that returns another tenant’s record
  • A field added to a request that the server trusts
  • A free-tier token accepted on a paid route
  • A GraphQL query nested until the server gives up
  • Pagination that walks the whole customer table

This is where the real risk is.

We run both, in that order. Tool output is kept separate from what a tester wrote, so you always know which is which.

Book a Free Consultation

Methodology

How the work is done

Repeatable, documented, and tracked as coverage inside the platform so you can see what has been looked at.

  1. 01

    API Discovery

    Review OpenAPI/Swagger spec, GraphQL schema, or proto files. If none exist, we map endpoints from the frontend and mobile apps. 30-60 minute walkthrough.

  2. 02

    Auth Matrix Testing

    Test every endpoint with every role (anonymous, user, admin, cross-tenant). Build an authorization gap matrix - this is where most critical findings live.

  3. 03

    Exploit & Chain

    Manual exploitation of every finding. Chain auth issues with business logic flaws for real attack narratives.

  4. 04

    Report & Verify

    Findings with cURL reproduction commands. Fix guidance per framework. Retest included with every engagement.

Why it matters

What you get out of it

  • OWASP API Top 10 Coverage

    BOLA, broken auth, excessive data exposure, lack of resources & rate limiting, broken function-level auth, mass assignment, security misconfigurations, injection, improper asset management, and insufficient logging.

  • BOLA / IDOR Specialization

    Broken Object Level Authorization is the #1 API vulnerability. We have a dedicated test methodology: map every object ID, test cross-tenant access, and validate every authorization boundary.

  • REST, GraphQL, gRPC

    We test them all. GraphQL gets introspection abuse, query depth attacks, and field-level auth checks. gRPC gets protocol-level fuzzing and service reflection enumeration.

  • Rate Limiting & Abuse Testing

    We test for endpoint-specific rate limits, brute-force resistance, resource exhaustion, and business logic abuse (e.g., coupon enumeration, referral fraud, voting manipulation).

  • Token & JWT Analysis

    JWT algorithm confusion, weak signing keys, token lifetime analysis, refresh token rotation gaps, and OAuth2 scope escalation testing.

  • Framework-Specific Fixes

    Fix guidance in Express, Fastify, Django REST, Spring Boot, Rails API, and Go - with code snippets your devs can copy-paste.

What you receive

Delivered in the platform as the work happens, and exportable as a document whenever you need one.

  • API findings report - every endpoint with vulnerabilities, proof-of-concept requests, and fix guidance
  • Authorization matrix - visual map of every role × endpoint tested, showing which roles had excessive access
  • Rate-limiting assessment - per-endpoint analysis of brute-force and abuse resistance
  • JWT/Token audit - algorithm, key strength, lifetime, and rotation analysis
  • Video walkthrough - live demo of critical findings with Burp Suite replay
  • Re-test validation - confirmation report after fixes

Standards we test against

Coverage is tracked against these inside the platform, so “what did you actually check” has an answer.

  • OWASP API Top 10
  • OWASP ASVS
  • NIST SP 800-204
  • PCI-DSS
  • GDPR (API)
  • ISO 27001

The anatomy of a finding

This is one finding.

Not a report. One finding, with every field it carries and why each field is there. Yours will look like this.

Vexil · Finding

Published
Titlewhat it is, in your engineers’ words

A signed-in customer can read and modify another customer’s orders.

Affected assetthe specific endpoint of the application

Both the read and the write path are affected.

  • GET /api/v2/orders/{id}
  • PATCH /api/v2/orders/{id}
Severitycomputed from the vector, never chosen by hand
high
  • CVSS 3.1 · 8.1
  • AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:N
  • CWE-639
Evidencethe request, the response and screenshots, attached to the finding

A session for customer 8842 returns an order owned by customer 7104.

  • GET /api/v2/orders/10318
Impactwhat it costs you, not what the CVE says

Every order is enumerable from one account, and the write path lets a delivery address be changed. A personal data breach, not only a bug.

Remediationfor your stack, not “apply vendor patches”

Scope the lookup to the session’s customer so a foreign identifier returns not-found. This is a class of issue, not one endpoint.

Retesta tester’s verdict, not your self-assessment

Retest passed. Verified by hand, recorded with the date and the tester.

This is the format, not a client’s work - it is written against the demonstration environment we run for the purpose, and a real finding also carries screenshots of the issue alongside the request and response. We don’t publish client findings, redacted or otherwise. If you want to see a real one, email us and we’ll send a redacted sample.

Pricing

What changes the price

Every engagement is quoted on scope rather than hours. These are the four things that move it, and they are what we work through on the call.

  • Endpoints

    How many, documented or not

  • Auth model

    Tokens, scopes, tenancy

  • Protocols

    REST, GraphQL, gRPC

  • Environments

    Staging, production, both

Included with this engagement

Delivered on the Vexil platform

Findings are filed against the endpoint and method they affect, not against "the API", so the team that owns a route sees only what belongs to them.

See the platform

FAQ

Questions about API penetration testing

Do you test GraphQL APIs differently from REST?

Absolutely. GraphQL has unique attack vectors: introspection abuse, query depth/alias/cost attacks, field-level authorization gaps, batching-based brute force, and subscription exhaustion. We test all of them. We also check whether your GraphQL-to-REST resolvers introduce authorization gaps at the data-fetching layer.

We don't have OpenAPI/Swagger docs - can you still test?

Yes, and it is common - undocumented APIs are the normal case rather than the exception. We map endpoints from your frontend and mobile traffic, from any internal docs you have, and from the application itself. Discovery takes longer without a spec, and the scope section of the report names what we enumerated so you can see the coverage rather than assume it. We will also generate a basic OpenAPI spec from what we find.

What's the difference between BOLA and IDOR - and do you test both?

BOLA (Broken Object Level Authorization) is the modern term for IDOR (Insecure Direct Object Reference). We test this extensively - it is the first entry in the OWASP API Security Top 10, and the one automated scanning is least able to find. Our test methodology: for every object ID exposed in your API (user IDs, order IDs, file IDs, etc.), we test whether another user or role can access, modify, or delete it.

Can you test internal/microservice APIs that aren't publicly exposed?

Yes. We can test via VPN, a provided bastion host, or on-site. Internal APIs often have weaker security than public-facing ones - no rate limiting, no auth between services, plain HTTP - because teams assume the network perimeter protects them. After a breach, internal APIs are the attacker's playground. We find those gaps.

How do you handle rate limiting tests without causing a denial of service?

We test rate limits incrementally - starting with low request rates and gradually increasing. We never run denial-of-service attacks. If we find that an endpoint lacks rate limiting, we demonstrate it with a controlled example (e.g., "we enumerated 100 user IDs and accessed their data in 30 seconds") and recommend thresholds. We never take down your production API.

What if we have webhooks or third-party callbacks - do you test those?

Yes. Webhook endpoints are often the least-secured part of an API because they're not documented publicly. We test webhook signature validation, replay protection, IP filtering, and whether attackers can register malicious webhook URLs. Webhook handlers are a common source of high-severity findings, precisely because they are rarely covered by the same review as the public API.