Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Test REST and GraphQL API endpoints with structured assertions and reporting. Use when a user asks to test an API, hit an endpoint, check if an API works, validate a response, debug an API call, test authentication flows, or verify API contracts. Supports GET, POST, PUT, PATCH, DELETE with headers, body, auth, and response validation.
| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-07 | ✗→✓ | ▲ Improved | 194% | 0% |
| case-08 | ✗→✓ | ▲ Improved | 640% | 0% |
| case-10 | ✗→✓ | ▲ Improved | 66% | 0% |
| case-15 | ✗→✓ | ▲ Improved | 1% | 0% |
| case-03 | ✓→✓ | = Same ✓ | 181% | 0% |
Test API endpoints by sending HTTP requests, validating responses, and reporting results. Supports REST and GraphQL APIs with authentication, custom headers, request bodies, and structured assertions on status codes, headers, and response payloads.
When a user asks you to test or debug an API endpoint, follow these steps:
Determine from the user or codebase:
Using curl (preferred for quick tests):
bash# GET request curl -s -w "\nHTTP Status: %{http_code}\nTime: %{time_total}s\n" \ -H "Authorization: Bearer $TOKEN" \ "https://api.example.com/users?page=1" # POST request with JSON curl -s -w "\nHTTP Status: %{http_code}\nTime: %{time_total}s\n" \ -X POST \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $TOKEN" \ -d '{"name": "Jane", "email": "jane@example.com"}' \ "https://api.example.com/users"
Using Python (for complex flows):
pythonimport requests import json import time def test_endpoint(method, url, headers=None, body=None, expected_status=200): start = time.time() response = requests.request(method, url, headers=headers, json=body, timeout=30) elapsed = time.time() - start result = { "status": response.status_code, "time_ms": round(elapsed * 1000), "headers": dict(response.headers), "body": response.json() if response.headers.get("content-type", "").startswith("application/json") else response.text, } passed = response.status_code == expected_status print(f"{'PASS' if passed else 'FAIL'} | {method} {url} | {response.status_code} | {result['time_ms']}ms") return result, passed
Check these in order:
pythondef validate_response(result, assertions): failures = [] body = result["body"] for field, expected in assertions.items(): actual = body for key in field.split("."): if isinstance(actual, dict): actual = actual.get(key) elif isinstance(actual, list) and key.isdigit(): actual = actual[int(key)] else: actual = None break if actual != expected: failures.append(f" {field}: expected {expected!r}, got {actual!r}") return failures
Format as a clear test report:
API Test Results
================
Endpoint: POST /api/users
Status: 201 Created (expected 201) -- PASS
Time: 142ms
Body: Valid JSON, 3 fields
Assertions:
[PASS] body.id is present
[PASS] body.name == "Jane"
[PASS] body.email == "jane@example.com"
[FAIL] body.role expected "admin", got "user"
Result: 3/4 assertions passedUser request: "Test the users API -- create, read, update, delete"
Output:
API Test Suite: Users CRUD
==========================
1. POST /api/users
Status: 201 Created -- PASS
Time: 156ms
Body: {"id": 42, "name": "Test User", "email": "test@example.com"}
2. GET /api/users/42
Status: 200 OK -- PASS
Time: 38ms
Body: {"id": 42, "name": "Test User", "email": "test@example.com"}
3. PUT /api/users/42
Status: 200 OK -- PASS
Time: 89ms
Body: {"id": 42, "name": "Updated Name", "email": "test@example.com"}
4. DELETE /api/users/42
Status: 204 No Content -- PASS
Time: 45ms
5. GET /api/users/42 (verify deletion)
Status: 404 Not Found -- PASS
Time: 22ms
Result: 5/5 PASSEDUser request: "I'm getting a 401 on POST /api/orders, can you figure out why?"
Output:
Debugging POST /api/orders
===========================
Test 1: No auth header
Status: 401 -- Missing Authorization header (expected)
Test 2: With Bearer token
Status: 401 -- Response: {"error": "Token expired"}
Note: Token exp claim is 2024-01-15T00:00:00Z (expired)
Test 3: With refreshed token
Status: 201 Created -- PASS
Root cause: Your Bearer token has expired.
Fix: Refresh the token using POST /api/auth/refreshdata field separately from errors.Other measured skills in the registry, with their headline benchmark lift.