What is API Testing?
API testing is the practice of sending requests to an application programming interface and verifying that the responses match the expected behavior defined by the contract. Unlike UI testing, API tests skip the browser and talk directly to endpoints, catching wrong status codes, missing fields, and broken integrations before they reach users.
The five types of API testing
API testing is not one thing — it is five different practices that each catch a different class of bug. Most engineering teams use two or three in combination.
1. Functional testing
Checks that each endpoint returns the right response for a set of known inputs. The simplest and most common form of API testing. Tools: Postman, REST Assured, pytest-requests, Keploy (auto-generated).
2. Integration testing
Checks that a group of endpoints works together, including calls to databases, queues, and downstream services. This is where most bugs actually live — the interface between a service and its dependencies. See What is Integration Testing?
3. Contract testing
Checks that the shape of requests and responses matches a published specification (OpenAPI, Protobuf, GraphQL schema). Catches breaking changes before they ship. Tools: Pact, Spring Cloud Contract, Keploy contract testing.
4. Performance testing
Measures latency and throughput under load. Typically done with k6, Locust, or JMeter. Not usually part of every PR — runs on a separate cadence against a dedicated environment.
5. Security testing
Checks authentication, authorization, input validation, and rate-limiting against known attack patterns (OWASP API Top 10). Tools: OWASP ZAP, Burp Suite, Invicti. Often run as a separate pipeline stage with human review of findings.
API testing vs UI testing
The common question every team hits when deciding a testing strategy: should we write tests at the API layer or the UI layer? The answer is almost always "both, with a strong bias toward API."
| Dimension | API tests | UI tests |
|---|---|---|
| Speed | Milliseconds per test | Seconds to minutes per test |
| Flakiness | Low | High (timing, DOM races) |
| Catches rendering bugs | No | Yes |
| Coupled to HTML structure | No | Yes |
| Cost per endpoint | Low (especially auto-generated) | High (setup, page objects, waits) |
| Right layer for 80% of coverage | Yes | No |
How Keploy automates API testing
Traditional API testing tools require engineers to write each test by hand. For a service with 100 endpoints and a reasonable amount of branching, that is 300-500 test cases someone has to author and maintain. Keploy takes a different approach: it captures the HTTP, gRPC, WebSocket, and GraphQL traffic that already flows through your service using eBPF at the Linux kernel level, and generates test cases from that captured traffic automatically.
The capture mechanism needs no SDK, no proxy, and no application code changes. Point Keploy at a running process and it produces a YAML test file for every unique request path it sees, with auto-generated mocks for every downstream dependency (databases, queues, external APIs). A 15-minute capture session in staging typically reaches 90% API coverage — no test scripts, no manual assertion writing.
For the two hard problems in traffic-based testing — non-deterministic data (timestamps, UUIDs, session tokens) and secret handling (API keys, PII, payment data) — Keploy ships with auto-detection for the common patterns and a config file for application-specific cases. See Noise & Secret Management for the full mechanism.
Next steps: run a capture session with keploy record -c "./your-app", commit the generated keploy/ directory to git, and add the GitHub Actions workflow to gate pull requests on replay results.