Guide
API
SaaS
Debugging

API Request Debugging Workflows

Most API bugs leave clear evidence — in the status code, the response body, and the request headers. This guide shows you how to read that evidence, reproduce the failure, and fix it efficiently — whether it's a 401, a CORS block, a malformed payload, or a query string that doesn't survive encoding.

TL;DR

  • Read the status code first — it tells you which layer is failing (auth, routing, server, client)
  • Inspect headers before the body — Content-Type, Authorization, and CORS headers often reveal the problem
  • Reproduce with cURL to eliminate browser CORS as a variable
  • Pretty-print the response body to spot schema mismatches before writing code
  • Decode query strings — encoding bugs are invisible until you inspect the raw value

Why API Requests Fail

API failures cluster into four layers. Identifying the right layer immediately narrows the search — you don't need to debug your application code if the problem is in the request construction.

Network / Routing

000, timeout, CORS block

The request never reached the API server. Common causes: wrong hostname, missing protocol, CORS policy blocking the browser request, firewall, or the server is simply down.

Authentication / Authorization

401, 403

The request reached the server but was rejected. 401 means credentials are missing or invalid (wrong token, expired JWT, bad API key). 403 means authenticated but not permitted for this resource.

Request Construction

400, 404, 422

The server understood the request but rejected it due to bad input. 400 is a malformed request. 404 is a wrong URL or missing resource ID. 422 is valid JSON but semantically invalid (missing required fields, wrong data types).

Server Error

500, 502, 503

The server received a valid request but failed internally. These are the hardest to debug from the client side — you need server logs. From the client, you can confirm the request was well-formed and reproduced consistently.

Step-by-Step Debugging Workflow

Follow this sequence when an API request isn't working. Each step isolates the problem before you touch application code.

1

Read the status code

The status code tells you which layer is failing. 2xx: success (check the body for content). 4xx: client-side error (your request is wrong). 5xx: server-side error (your request was valid, server failed). 0 or timeout: the request never completed (network issue or CORS).

2

Inspect the response body

Most APIs return a JSON error object with a message, code, or details field. Pretty-print the raw body to read it clearly. Look for field-level validation errors (common in 422 responses) — they tell you exactly which input was wrong.

3

Check the request headers

Verify that Content-Type matches the body format (application/json for JSON payloads, application/x-www-form-urlencoded for form data). Confirm the Authorization header is present and correctly formatted (Bearer TOKEN, not just TOKEN). Check Accept if the server is returning unexpected format.

4

Decode the query string

If the URL includes query parameters, decode them to verify encoding. Spaces encoded as + vs %20, special characters in values, or parameters that should be in the body but ended up in the URL are common sources of 400 and 404 errors.

5

Reproduce with cURL

Send the same request from your terminal using cURL. If cURL succeeds but the browser fails, the problem is CORS — the server is not allowing cross-origin browser requests. If cURL also fails, the problem is in the request itself (wrong URL, bad auth, invalid body).

6

Isolate variables one at a time

Start from the minimal valid request documented in the API reference. Add headers, body fields, and query params one by one. As soon as the request fails, the last change is the cause. This binary search approach finds the issue faster than guessing.

7

Check cookies and session state

For cookie-based authentication, verify that the session cookie is present, not expired, and has the correct path and domain scope. Decode the Cookie header to inspect all attributes. Missing HttpOnly, Secure, or SameSite=Strict can cause cookies to be silently dropped.

Common Failure Categories

CORS

CORS Errors (browser only)

CORS errors occur when your browser blocks a request because the target server has not included the correct Access-Control-Allow-Origin header. The request may succeed in Postman or cURL (which are not browsers) but fail in your application. To confirm: run the same request with cURL — if it succeeds, the problem is CORS on the server, not your client code.

💡 CORS is a server-side policy. The fix must happen on the server (or an API gateway in front of it). From the client you can only work around it by proxying through your own backend.
Auth

Authentication Failures (401)

A 401 means the credentials are missing, expired, or malformed. Check the exact format required — Bearer tokens must include the "Bearer " prefix with a space. JWTs expire (check the exp claim). API keys may be tied to specific environments (staging vs production). Basic auth must be Base64-encoded as username:password.

💡 Check whether your token is being sent — open DevTools → Network → select the request → Headers. Confirm the Authorization header is present in the actual request being sent.
422

Validation Errors (422)

A 422 Unprocessable Entity means your request reached the server and was parsed, but the body fails validation. The response body usually contains a map of field names to error messages. Read the errors directly — they name the exact field and what was wrong (required, too short, invalid format, etc.).

💡 Pretty-print the 422 response body. The error details are in there. Avoid guessing — the API told you exactly what was wrong.
404

Not Found (404)

A 404 from an API usually means: the URL path is wrong (check trailing slashes and path parameter format), the resource ID does not exist in this environment (staging vs production data), or the endpoint was deprecated and moved. Verify the base URL and version prefix.

💡 API 404s are different from web 404s. An API 404 means the resource doesn't exist — not that the server is misconfigured. Check the ID you're requesting against the environment's actual data.
Payload

Payload and Content-Type Mismatches

Sending JSON without Content-Type: application/json causes many servers to reject the body. Sending form-encoded data when the server expects JSON (or vice versa) silently corrupts the payload. The body may parse as an empty object or fail to parse entirely.

💡 Always set Content-Type explicitly. For JSON payloads: Content-Type: application/json. For form submissions: Content-Type: application/x-www-form-urlencoded.

What to Inspect in Every Request

Request headers

  • Content-Type — must match body format
  • Authorization — token format, expiry
  • Accept — expected response format
  • API version header (if used)
  • Custom auth headers (X-API-Key, etc.)

Response headers

  • Content-Type — what format is the body
  • Access-Control-Allow-Origin — CORS policy
  • WWW-Authenticate — auth scheme expected
  • Retry-After — for 429 rate limit errors
  • X-Request-Id — correlation ID for support

Response body

  • Error message or code field
  • Field-level validation details (422)
  • Pagination metadata (page, total)
  • Timestamp and expiry fields
  • Nested error structures from upstream

Best Practices

Always reproduce in cURL first

Build the exact request in cURL before writing any application code. This separates browser CORS, application framework middleware, and API-level issues into distinct failure modes. If cURL works, the problem is in your client code. If cURL fails, the problem is in the API or your credentials.

Read the full response body on errors

Do not stop at the status code. API error responses contain structured data: error codes, messages, and field-level validation failures. Most debugging time is saved by reading the body carefully before writing any fix.

Set Content-Type explicitly

Never rely on defaults. If you're sending JSON, set Content-Type: application/json. If you're sending form data, set Content-Type: application/x-www-form-urlencoded. Implicit content type negotiation is a frequent source of silent payload failures.

Decode query strings before debugging

Query parameters are URL-encoded, which makes them unreadable in raw form. Decode the query string to verify that special characters, spaces, and array parameters are encoded correctly before assuming the API is at fault.

Use environment-specific base URLs

API endpoints, API keys, and data differ between staging and production. A 404 in staging may mean the resource was created in production. A 401 may mean you're using a production API key against a staging endpoint. Always confirm which environment you're hitting.

Log request IDs for support tickets

Most APIs return a request ID or correlation ID in the response headers (X-Request-Id, X-Trace-Id). When filing a support ticket, include this ID — it allows the API provider to look up the server-side trace for your exact request.

Frequently Asked Questions

Try These Tools

Related Guides and Comparisons