PRACTICAL GUIDE / API testing tutorial

API Testing Tutorial: A Beginner's Complete Guide

API testing tutorial for beginners: learn REST API checks, CRUD test cases, tools, status codes, and a practical checklist for reliable API quality.

By The Testing AcademyUpdated July 9, 202616 min read
All field guides
In this guide23 sections
  1. What Is API Testing?
  2. Why API Testing Matters
  3. API Testing vs UI Testing vs Unit Testing
  4. Core Concepts You Must Know
  5. HTTP Methods
  6. Status Codes
  7. Headers
  8. Payload Contracts
  9. Authentication and Authorization
  10. How to Test REST APIs Step by Step
  11. Step 1: Gather the Contract
  12. Step 2: Set Up Environments
  13. Step 3: Establish Auth
  14. Step 4: Map Resources and Risks
  15. Step 5: Design Test Cases Before Mass Automation
  16. Step 6: Execute Exploratory Requests
  17. Step 7: Automate the Stable, High Value Checks
  18. Step 8: Run in CI
  19. Step 9: Maintain With the Contract
  20. API Test Cases for CRUD Endpoints
  21. Create
  22. Read
  23. Update
  24. Delete
  25. What to Assert in an API Test
  26. Functional vs Non-Functional API Testing
  27. Functional API Testing
  28. Non-Functional API Testing
  29. Tools Used for API Testing
  30. Auth and Permission Testing Essentials
  31. Data Setup and Teardown Strategies
  32. Contract Awareness Without Over Formality
  33. REST API Testing Checklist for QA
  34. Common Mistakes in API Testing
  35. Mistake 1: Only Checking Status Codes
  36. Mistake 2: Testing Only Happy Paths
  37. Mistake 3: Sharing One Mutable Record
  38. Mistake 4: Ignoring Authorization
  39. Mistake 5: Hardcoding Tokens in Collections
  40. Mistake 6: Duplicating UI End to End Through API Noise
  41. Mistake 7: No Environment Parity Notes
  42. Worked Example: Order Creation Flow
  43. High Value Cases
  44. Example Negative Assertion
  45. How Much Automation Is Enough?
  46. Bringing API Testing Into Team Practice
  47. Practice Path
  48. Pagination, Filtering, and Sorting Checks
  49. Idempotency and Retries
  50. Versioning and Breaking Changes
  51. Observability Hooks for Better Failures
  52. Sample Beginner Project Plan
  53. Final Takeaway

What you will learn

  • What Is API Testing?
  • API Testing vs UI Testing vs Unit Testing
  • Core Concepts You Must Know
  • How to Test REST APIs Step by Step

This API testing tutorial is for QA engineers and developers who need a practical path from "I can send a request" to "I can design reliable coverage for REST services." API testing checks the service layer directly: endpoints, methods, headers, authentication, payloads, status codes, and business rules. Done well, it finds defects earlier and more cheaply than driving every rule through a browser.

You will learn what API testing is, how to test REST APIs step by step, how to design CRUD test cases, which tools fit which job, how functional and non-functional checks differ, and a checklist you can reuse on real projects. For hands-on Postman mechanics, pair this guide with the Postman tutorial.

What Is API Testing?

API testing is the practice of verifying that application programming interfaces meet functional and quality expectations. For web systems, that usually means HTTP APIs, often REST style JSON services, sometimes GraphQL, SOAP, or event driven endpoints.

Instead of clicking through a UI, you send requests such as:

HTTP
POST /api/orders
Authorization: Bearer <token>
Content-Type: application/json

{
  "productId": "sku-100",
  "quantity": 2
}

Then you evaluate the response:

HTTP
HTTP/1.1 201 Created
Content-Type: application/json

{
  "id": "ord_9f3a",
  "status": "pending",
  "quantity": 2
}

You care about more than "it returned 200." You care whether the body is correct, whether unauthorized users are rejected, whether invalid data is validated, and whether side effects happened in the system.

Why API Testing Matters

  • Frontends change more often than business contracts.
  • Mobile, web, and partners may share one API.
  • Failures at the API layer cascade to every client.
  • API checks are usually faster and less flaky than UI flows.
  • Security and authorization bugs often appear first at the API.

If your product has a UI and an API, testing only the UI is leaving the foundation under verified.

API Testing vs UI Testing vs Unit Testing

LayerProvesSpeedStabilityBlind spots
UnitFunction logic in isolationFastestHighIntegration and real transport issues
APIService contracts and business rules over HTTPFastHigh when isolatedVisual UX, full browser journeys
UI / E2EReal user journeys through the clientSlowestMore fragileCan miss deep API matrix coverage

A healthy strategy uses all three. API testing is often the highest leverage middle layer for product QA teams.

Core Concepts You Must Know

HTTP Methods

MethodTypical useIdempotent?
GETRead resourceYes
POSTCreate or trigger actionOften no
PUTReplace resourceYes
PATCHPartial updateUsually yes by design intent
DELETERemove resourceYes

Status Codes

Status codes are part of the contract. Learn the common families deeply in REST API status codes. A short map:

RangeMeaningExamples
2xxSuccess200 OK, 201 Created, 204 No Content
3xxRedirect301, 304
4xxClient error400, 401, 403, 404, 409, 422
5xxServer error500, 502, 503

Headers

Important headers often include:

  • Authorization
  • Content-Type
  • Accept
  • Idempotency-Key
  • X-Request-Id
  • Caching headers

Payload Contracts

JSON fields have types, required rules, enums, formats, and nested objects. Your tests should validate both presence and meaning, not only that the response parses.

Authentication and Authorization

Authentication answers who you are. Authorization answers what you may do. API testing must cover both. Dedicated patterns appear in API authentication testing.

How to Test REST APIs Step by Step

Step 1: Gather the Contract

Sources:

  • OpenAPI or Swagger docs
  • API gateway docs
  • Producer team README files
  • Example requests from frontend code
  • Recorded traffic from a working UI

If docs are missing or wrong, write down observed behavior and questions. Testing an undocumented API is possible, but riskier. Always distinguish confirmed contract from reverse engineered guesses.

Step 2: Set Up Environments

Create separate configs for local, staging, and any protected environments:

  • Base URL
  • Auth tokens or credential flow
  • Test tenant ids
  • Feature flags
  • Timeout settings

Never hardcode production secrets into collections committed to git.

Step 3: Establish Auth

Common modes:

  • API key
  • Basic auth
  • Session cookie
  • Bearer token
  • OAuth2 / JWT flows

Automate token acquisition when possible so humans are not copying tokens every hour.

Step 4: Map Resources and Risks

List resources:

  • Users
  • Products
  • Orders
  • Payments
  • Admin settings

For each, note risks:

  • Data loss
  • Money impact
  • Permission escape
  • Idempotency
  • Validation holes
  • Breaking changes for clients

Step 5: Design Test Cases Before Mass Automation

Write cases for:

  • Happy path
  • Validation failures
  • Auth failures
  • Permission denials
  • Not found paths
  • Conflict states
  • Boundary values
  • State transitions

If you need a deeper case design method, see how to write API test cases.

Step 6: Execute Exploratory Requests

Use Postman, Bruno, curl, or a REST client to learn real behavior. Note mismatches between docs and runtime. Capture sample payloads.

Step 7: Automate the Stable, High Value Checks

Automate:

  • Critical CRUD flows
  • Authz rules
  • Regression for past bugs
  • Contract validation for consumer critical fields

Do not automate every exploratory experiment on day one.

Step 8: Run in CI

API suites belong in pull request pipelines because they are fast. Failures should print request id, endpoint, status, and relevant body excerpts.

Step 9: Maintain With the Contract

When fields are added, removed, or made required, update tests in the same change set whenever possible. Orphaned assertions become noise.

API Test Cases for CRUD Endpoints

Assume a simple resource:

Example
POST   /api/products
GET    /api/products/{id}
GET    /api/products
PATCH  /api/products/{id}
DELETE /api/products/{id}

Create

IDCaseExpected
C01Create with valid payload201, body contains id and stored fields
C02Missing required name400 or 422 with clear error
C03Invalid price type400 or 422
C04No auth token401
C05Authenticated but not allowed403
C06Duplicate SKU if unique409 or documented conflict behavior

Read

IDCaseExpected
R01Get existing id200 and correct body
R02Get unknown id404
R03List with default pagination200, array, pagination metadata
R04List with page size boundaryHonors limit rules
R05No auth on private resource401

Update

IDCaseExpected
U01Patch valid field200 or 204, changed field persists on GET
U02Patch unknown id404
U03Patch with empty bodyDocumented behavior, no corruption
U04Patch forbidden field400/403/422 according to contract
U05Concurrent update conflict if supported409 or version rules

Delete

IDCaseExpected
D01Delete existing id200 or 204, later GET is 404
D02Delete unknown id404 or idempotent 204 if documented
D03Delete without permission403
D04Delete already deleted idStable documented behavior

This matrix is a REST API testing checklist starter for one resource. Multiply by roles and states for real systems.

What to Assert in an API Test

A strong API assertion set often includes:

  1. Status code
  2. Response time under a soft threshold when relevant
  3. Content type
  4. Required fields present
  5. Field types and formats
  6. Business values equal expected results
  7. Error shape for negative cases
  8. Side effects through a follow up GET
  9. Headers such as location on create
  10. Non leakage of sensitive data

Example with Playwright request style:

TypeScript
import { test, expect } from "@playwright/test";

test("creates product and reads it back", async ({ request }) => {
  const create = await request.post("/api/products", {
    data: { name: "Trail Runner", price: 12000, sku: `sku-${Date.now()}` },
  });

  expect(create.status()).toBe(201);
  const body = await create.json();
  expect(body.id).toBeTruthy();
  expect(body.name).toBe("Trail Runner");

  const read = await request.get(`/api/products/${body.id}`);
  expect(read.status()).toBe(200);
  expect(await read.json()).toMatchObject({
    id: body.id,
    name: "Trail Runner",
    price: 12000,
  });
});

Notice the follow up read. Create tests that only check 201 without persistence checks miss storage bugs.

Functional vs Non-Functional API Testing

Functional API Testing

Focus:

  • Correctness of business rules
  • Validation logic
  • CRUD integrity
  • Role based access
  • Workflow state changes

Example: an order cannot transition from cancelled to shipped.

Non-Functional API Testing

Focus:

  • Performance and load
  • Reliability under retries
  • Security hardening
  • Scalability limits
  • Availability behavior during dependency failure

Example: p95 latency stays under an agreed budget at a target RPS, or 429 responses appear with retry guidance when rate limited.

TypeQuestion answeredTypical tools
FunctionalDoes it behave correctly?Postman, REST Assured, Playwright, Supertest
PerformanceCan it handle expected load?k6, JMeter, Gatling
SecurityCan it be abused?ZAP, Burp, custom authz suites
ContractDo producer and consumer agree?Pact, OpenAPI validators

Most beginners should master functional coverage first, then add performance and contract testing as the system matures.

Tools Used for API Testing

ToolBest forNotes
PostmanExploratory + team collectionsEasy entry, Newman for CI
Bruno / InsomniaLocal first collectionsGood alternatives
REST AssuredJava coded suitesStrong in JVM shops
SupertestNode HTTP assertionsGreat with Express style apps
Playwright requestHybrid UI + API setupsUseful in end to end repos
KarateGherkin style API testsAll in one style
PactConsumer driven contractsPrevents integration surprises
k6 / JMeterLoad and stressNon-functional focus

Tool choice is secondary to test design. A weak checklist in a fancy tool still yields weak confidence.

Auth and Permission Testing Essentials

Minimum auth matrix for a protected endpoint:

ActorToken stateExpected
AnonymousNone401
Valid userOwn resource200
Valid userSomeone else's resource403 or 404 by design
Expired tokenExpired401
Malformed tokenGarbage401
AdminAdmin only action200
Non adminAdmin only action403

Never assume the UI is the only enforcement point. Always hit the API directly with alternate tokens.

Data Setup and Teardown Strategies

Good API suites create the data they need.

Patterns:

  • Factory endpoints in test environments
  • Admin setup APIs
  • Direct test database seeding in private envs
  • Idempotent create helpers with unique keys

Prefer unique emails, SKUs, and names:

TypeScript
const sku = `sku-${Date.now()}-${Math.floor(Math.random() * 1000)}`;

Clean up when resources are expensive or shared. In fully disposable environments, recreation can be cheaper than perfect teardown, but do not pollute shared staging endlessly.

Contract Awareness Without Over Formality

Even before full contract testing, validate the fields consumers rely on.

Example critical fields for a login response:

  • accessToken
  • expiresIn
  • user.id
  • user.role

A response that returns 200 with a renamed token field still breaks clients. Schema checks catch that class of bug. Later you can deepen this with contract testing with Pact.

REST API Testing Checklist for QA

Use this checklist per endpoint or resource group:

  • Happy path documented and automated
  • Required field validation covered
  • Optional field behavior covered
  • Boundary values covered
  • Auth missing and invalid covered
  • Role permissions covered
  • Not found behavior covered
  • Conflict and duplicate rules covered
  • Pagination filtering sorting covered if present
  • Error response shape consistent
  • Sensitive fields not leaked
  • Idempotency verified where claimed
  • Side effects verified with follow up calls
  • Performance smoke threshold noted if relevant
  • CI runs the stable pack on every PR

Common Mistakes in API Testing

Mistake 1: Only Checking Status Codes

200 with the wrong body is still a bug. Assert meaningful content.

Mistake 2: Testing Only Happy Paths

Attackers and clumsy clients send bad input constantly. Negative cases are not optional.

Mistake 3: Sharing One Mutable Record

Parallel CI will collide. Unique data is mandatory for scale.

Mistake 4: Ignoring Authorization

Many severe defects are IDOR style access problems. Direct object reference checks belong in your default pack.

Mistake 5: Hardcoding Tokens in Collections

Tokens expire and leak. Use environment vaults and scripted auth.

Mistake 6: Duplicating UI End to End Through API Noise

If you already proved a calculation at unit and API layers, maybe the UI only needs to prove wiring once.

Mistake 7: No Environment Parity Notes

Staging may use fake payments and looser rate limits. Document differences so failures are interpreted correctly.

Worked Example: Order Creation Flow

Business rules:

  1. Authenticated buyer can create an order for an in stock product.
  2. Quantity must be at least 1.
  3. Out of stock products are rejected.
  4. Buyers cannot create orders for other buyers.
  5. Created orders start as pending.

High Value Cases

  1. Valid create returns 201 with pending.
  2. Quantity 0 returns 422.
  3. Unknown product returns 404 or 422.
  4. Out of stock returns 409 or 422.
  5. No token returns 401.
  6. Another user's account id in payload is ignored or rejected.
  7. GET order by id returns the same totals.
  8. List orders for buyer includes the new order.

Example Negative Assertion

TypeScript
const res = await request.post("/api/orders", {
  headers: { Authorization: `Bearer ${buyerToken}` },
  data: { productId: "sku-1", quantity: 0 },
});

expect(res.status()).toBe(422);
const error = await res.json();
expect(error.message).toMatch(/quantity/i);

How Much Automation Is Enough?

Enough means:

  • Critical money and auth paths are covered
  • Past production API incidents have regression tests
  • Contract fields consumers need are protected
  • Suite runs fast enough for PR use
  • Failures are trusted

A hundred shallow tests can be weaker than thirty sharp ones. Depth on risk beats vanity counts.

Bringing API Testing Into Team Practice

Practical rollout:

  1. Pick the top five endpoints by business risk.
  2. Build a readable collection or coded suite.
  3. Add CI on pull requests.
  4. Expand CRUD matrices and auth matrices.
  5. Add contract checks for consumer critical payloads.
  6. Only then invest heavily in load testing.

Train manual testers to use API tools so bugs found in UI are reproduced at the service layer when relevant. That skill shortens debugging for everyone.

Practice Path

  1. Choose a public training API or local project.
  2. Document three endpoints by hand.
  3. Write CRUD and auth cases in a table.
  4. Execute them in Postman.
  5. Automate the top ten checks.
  6. Break a validation rule on purpose and confirm the suite catches it.

Then sharpen service layer instincts with QA challenges in QABattle. The best API testers think in contracts, states, and risks, not only in green checkmarks.

If you are preparing for hiring rounds, practice explaining this workflow with API testing interview questions.

Pagination, Filtering, and Sorting Checks

List endpoints hide many defects.

Minimum cases:

  • Default page returns expected shape
  • page and limit boundaries are enforced
  • Out of range pages return empty lists or documented errors
  • Filters combine correctly
  • Sort order is stable for equal keys
  • Total counts match data when claimed

Example assertions:

TypeScript
const res = await request.get("/api/products?limit=2&page=1");
expect(res.status()).toBe(200);
const body = await res.json();
expect(body.items).toHaveLength(2);
expect(body.page).toBe(1);
expect(body.limit).toBe(2);
expect(typeof body.total).toBe("number");

If clients depend on deterministic sort, prove it with seeded data rather than assuming database defaults.

Idempotency and Retries

Payment and order APIs often claim idempotency keys.

Test ideas:

  1. Same idempotency key with same payload returns the same resource.
  2. Same key with different payload is rejected or documented carefully.
  3. Client retries after timeout do not double charge.
  4. Missing key behavior matches docs.

These cases protect real money paths and are hard to cover thoroughly through UI alone.

Versioning and Breaking Changes

If your API uses /v1 and /v2 or header versioning, include:

  • Old clients still work on supported versions
  • Deprecated fields remain until the documented sunset
  • New required fields do not break old payloads unexpectedly
  • Error bodies stay parseable across versions consumers still use

API testing is part of release governance, not only feature QA.

Observability Hooks for Better Failures

When tests fail, request correlation ids make debugging human.

Assert or log:

TypeScript
const requestId = res.headers()["x-request-id"];
console.log("requestId", requestId);

Store those ids in CI logs. Backend engineers can jump straight to matching server traces.

Sample Beginner Project Plan

Week 1:

  • Choose one service
  • Document five endpoints
  • Manual happy paths in a client

Week 2:

  • Add negative and auth cases
  • Build CRUD matrix for one resource

Week 3:

  • Automate top twenty checks
  • Run in CI on each PR

Week 4:

  • Add permission matrix
  • Add one performance smoke threshold
  • Review escaped defects and fill gaps

This plan creates durable skill, not only tool exposure.

Final Takeaway

This API testing tutorial should leave you with a clear method: learn the contract, design risk based cases, validate status and body and side effects, cover auth thoroughly, automate the stable core, and run it in CI. Functional correctness comes first. Non-functional and contract depth follow as the system and team mature.

Master the service layer and you will find higher severity defects earlier, with less flake and more confidence than UI only strategies can provide. Use tools as accelerators. Let checklist discipline and business risk decide what deserves coverage.

// FIELD DISPATCH

Get the QA Field Notes

Weekly QA battles, AI testing guides, and interview drills. Free on Substack.

// LIVE COURSE / THE TESTING ACADEMY

Playwright Automation Mastery

Go beyond Selenium. Master Playwright with JS/TS in 90 days.

From the instructor behind this guide.

Playwright jobs are growing 8x faster than Selenium. 90 days / 75+ live hrs / Tue-Thu-Sat 7 AM IST.

Code PROMODE / 10% offJoin the batch

The Testing Academy editorial desk

Practical QA guidance built around test evidence, production tradeoffs, and interview-ready explanations.

Published July 9, 2026 / Reviewed July 9, 2026

PRIMARY REFERENCES

Verify the details at the source

QABattle guides are practical explanations. Product behavior, standards, and APIs can change, so use these primary references for the canonical details.

  1. 01
    HTTP Semantics

    IETF

    The normative semantics for methods, status codes, fields, and HTTP behavior.

  2. 02
    OWASP API Security Top 10

    OWASP Foundation

    Primary API-specific risk taxonomy and defensive guidance.

FAQ / QUICK ANSWERS

Questions testers ask

What is API testing and why is it important?

API testing verifies that application interfaces behave correctly at the service layer: status codes, payloads, auth, errors, and business rules. It is important because APIs power mobile apps, web frontends, and integrations, and failures there often break users before the UI can compensate.

How do you test REST APIs step by step?

Read the contract, set up environment and auth, send requests for each important endpoint and state, validate status codes and response bodies, check error handling and edge data, then automate stable checks in CI. Cover CRUD flows, permissions, and negative cases, not only happy paths.

What tools are used for API testing?

Common tools include Postman, Bruno, Insomnia, REST Assured, Playwright request, Supertest, Karate, JMeter or k6 for performance, and contract tools like Pact. Choose based on team skills, automation needs, and whether you need exploratory calls, coded suites, or load testing.

What is the difference between functional and non-functional API testing?

Functional API testing checks correctness: business rules, validation, responses, and authorization. Non-functional testing checks qualities such as performance, reliability, security hardening, and scalability. Most teams need both, but they use different techniques and tools.

Can API testing replace UI testing?

No. API testing is faster and more stable for business logic and integrations, but it cannot fully prove layout, client side workflows, or browser specific behavior. Use API tests as the backbone and keep a smaller set of critical UI journeys.

How many API test cases does a CRUD endpoint need?

A practical minimum covers create success, read success, update success, delete success, missing auth, invalid payload, not found ids, and permission denials. Add uniqueness conflicts, pagination, and idempotency where the contract requires them.