
Final Project: Complete API Testing Portfolio
Your comprehensive final project. Test real APIs with cURL and Postman, build a complete collection, handle errors, and demonstrate every skill from the course.
Final Project: Complete API Testing Portfolio
This is your capstone project. You will apply every skill from this course to test three real APIs using both cURL and Postman. By the end, you will have a complete API testing portfolio that demonstrates your competence.
1. Project Overview
You will work with three APIs:
| API | URL | Auth | Focus |
|---|---|---|---|
| JSONPlaceholder | jsonplaceholder.typicode.com | None | CRUD operations |
| GitHub | api.github.com | Optional token | Authentication & query params |
| ReqRes | reqres.in | None | Auth simulation & pagination |
2. Part 1: JSONPlaceholder ā Full CRUD
Complete all operations and record the status codes.
1.1 Create (POST)
curl -s -i -X POST https://jsonplaceholder.typicode.com/posts \
-H "Content-Type: application/json" \
-d '{
"title": "REST API Course Final Project",
"body": "Demonstrating CRUD mastery with real API calls.",
"userId": 1
}'
Record: Status code, the assigned ID, and the Location header (if present).
1.2 Read (GET)
# Read all posts
curl -s https://jsonplaceholder.typicode.com/posts | jq length
# Read a specific post
curl -s https://jsonplaceholder.typicode.com/posts/1 | jq '{title, userId}'
# Read with filtering
curl -s "https://jsonplaceholder.typicode.com/posts?userId=1" | jq length
# Read nested resources
curl -s https://jsonplaceholder.typicode.com/posts/1/comments | jq '.[0].email'
1.3 Update (PUT and PATCH)
# Full replacement
curl -s -X PUT https://jsonplaceholder.typicode.com/posts/1 \
-H "Content-Type: application/json" \
-d '{"id":1,"title":"Complete Replacement","body":"New body","userId":1}' | jq .
# Partial update
curl -s -X PATCH https://jsonplaceholder.typicode.com/posts/1 \
-H "Content-Type: application/json" \
-d '{"title":"Only Title Changed"}' | jq .
1.4 Delete (DELETE)
curl -s -o /dev/null -w "Status: %{http_code}\n" \
-X DELETE https://jsonplaceholder.typicode.com/posts/1
1.5 Error Handling
# Trigger a 404
curl -s -o /dev/null -w "404 Test: %{http_code}\n" \
https://jsonplaceholder.typicode.com/posts/99999
# Check all status codes at once
for method_url in \
"GET https://jsonplaceholder.typicode.com/posts/1" \
"GET https://jsonplaceholder.typicode.com/posts/99999" \
"DELETE https://jsonplaceholder.typicode.com/posts/1"; do
METHOD=$(echo $method_url | cut -d' ' -f1)
URL=$(echo $method_url | cut -d' ' -f2)
CODE=$(curl -s -o /dev/null -w "%{http_code}" -X $METHOD "$URL")
echo "$METHOD $URL ā $CODE"
done
3. Part 2: GitHub API ā Real-World Testing
2.1 Public Endpoints (No Auth)
# Get a user profile
curl -s https://api.github.com/users/octocat | jq '{login, name, public_repos, followers}'
# Search repositories
curl -s "https://api.github.com/search/repositories?q=rest+api&sort=stars&order=desc&per_page=5" \
| jq '.items[] | {name: .full_name, stars: .stargazers_count, language}'
# Get repository details
curl -s https://api.github.com/repos/typicode/json-server \
| jq '{name, description, stars: .stargazers_count, language, license: .license.name}'
2.2 Rate Limit Awareness
# Check current rate limits
curl -s https://api.github.com/rate_limit | jq '.rate'
# Monitor remaining requests
curl -sI https://api.github.com/users/octocat | grep -i "x-ratelimit"
2.3 Response Timing
curl -s -o /dev/null -w "\
GitHub API Performance:\n\
DNS: %{time_namelookup}s\n\
Connect: %{time_connect}s\n\
TLS: %{time_appconnect}s\n\
First Byte: %{time_starttransfer}s\n\
Total: %{time_total}s\n" \
https://api.github.com/users/octocat
2.4 Complex Query Building
# Find JavaScript repos with 1000+ stars, created in 2026
curl -s "https://api.github.com/search/repositories?q=language:javascript+stars:>1000+created:>2026-01-01&sort=stars&per_page=3" \
| jq '.items[] | {name: .full_name, stars: .stargazers_count, description}'
4. Part 3: ReqRes ā Authentication Simulation
ReqRes simulates real authentication flows.
3.1 User Registration
curl -s -X POST https://reqres.in/api/register \
-H "Content-Type: application/json" \
-d '{"email": "eve.holt@reqres.in", "password": "pistol"}' | jq .
3.2 User Login
curl -s -X POST https://reqres.in/api/login \
-H "Content-Type: application/json" \
-d '{"email": "eve.holt@reqres.in", "password": "cityslicka"}' | jq .
3.3 Pagination
# Page 1
curl -s "https://reqres.in/api/users?page=1" | jq '.page, .total_pages, (.data | length)'
# Page 2
curl -s "https://reqres.in/api/users?page=2" | jq '.page, .total_pages, (.data | length)'
3.4 CRUD on ReqRes
# Create
curl -s -X POST https://reqres.in/api/users \
-H "Content-Type: application/json" \
-d '{"name": "Final Project User", "job": "API Tester"}' | jq .
# Update
curl -s -X PATCH https://reqres.in/api/users/2 \
-H "Content-Type: application/json" \
-d '{"name": "Updated Name"}' | jq .
# Delete
curl -s -o /dev/null -w "Delete Status: %{http_code}\n" \
-X DELETE https://reqres.in/api/users/2
3.5 Error Testing
# Login with missing password (should fail)
curl -s -X POST https://reqres.in/api/login \
-H "Content-Type: application/json" \
-d '{"email": "peter@klaven"}' | jq .
# Get non-existent user
curl -s -o /dev/null -w "Status: %{http_code}\n" \
https://reqres.in/api/users/23
5. Part 4: Postman Collection
Build a Postman collection that includes everything above.
Collection Structure
š REST API Course - Final Project
āāā š JSONPlaceholder
ā āāā GET All Posts
ā āāā GET Single Post
ā āāā GET Posts by User
ā āāā GET Post Comments
ā āāā POST Create Post
ā āāā PUT Update Post
ā āāā PATCH Update Post Title
ā āāā DELETE Post
ā āāā GET Non-Existent (404 test)
āāā š GitHub API
ā āāā GET User Profile
ā āāā GET Search Repos
ā āāā GET Repo Details
ā āāā GET Rate Limit
āāā š ReqRes
ā āāā POST Register
ā āāā POST Login
ā āāā GET Users Page 1
ā āāā GET Users Page 2
ā āāā POST Create User
ā āāā PATCH Update User
ā āāā DELETE User
ā āāā POST Invalid Login (error test)
Collection Variables
| Variable | Value |
|---|---|
jsonPlaceholderUrl | https://jsonplaceholder.typicode.com |
githubUrl | https://api.github.com |
reqresUrl | https://reqres.in/api |
Test Scripts to Add
Add test scripts to key requests:
// For all GET requests
pm.test("Status is 200", () => pm.response.to.have.status(200));
pm.test("Response is JSON", () => pm.response.to.have.header("Content-Type", /json/));
pm.test("Response time < 2s", () => pm.expect(pm.response.responseTime).to.be.below(2000));
// For POST requests
pm.test("Status is 201", () => pm.response.to.have.status(201));
pm.test("Response has id", () => pm.expect(pm.response.json()).to.have.property("id"));
// For DELETE requests
pm.test("Status is 200 or 204", () => {
pm.expect(pm.response.code).to.be.oneOf([200, 204]);
});
Export the Collection
- Right-click the collection ā Export ā v2.1
- Save as
rest-api-final-project.postman_collection.json
6. Grading Yourself
| Skill | Test | Pass if... |
|---|---|---|
| GET requests | Retrieve data from 3 APIs | All return 200 |
| POST requests | Create resources on all 3 APIs | All return 201 |
| PUT/PATCH | Update resources | Return 200 with updated data |
| DELETE | Remove resources | Return 200 or 204 |
| Query params | Filter and paginate | Correct filtered results |
| Error handling | Trigger 404 and 400 errors | Recognize and explain |
| Auth | Login on ReqRes | Token received |
| JSON parsing | Use jq for extraction | Correct field values |
| Postman | Complete collection | All requests organized |
| Performance | Measure response times | Under 2 seconds |
Score:
- 8-10 skills: Expert level ā you are ready for professional API work
- 6-7 skills: Proficient ā review the weaker areas
- 4-5 skills: Developing ā re-do the relevant modules
- Below 4: Keep practicing ā this is a skill that improves with repetition
7. What to Do Next
You have completed the Understanding REST APIs course! Here is your roadmap:
graph TD
A["You Are Here<br/>REST API Consumer"] --> B["Build Your Own API<br/>Python FastAPI / Node Express"]
A --> C["Explore GraphQL<br/>Modern alternative to REST"]
A --> D["API Integration<br/>Build apps that connect APIs"]
A --> E["Advanced Testing<br/>Automated API testing suites"]
B --> F["Full Stack Developer"]
C --> F
D --> F
E --> F
style A fill:#059669,color:#fff
style F fill:#4f46e5,color:#fff
Congratulations! You now have the knowledge and practical skills to work with any REST API in the world. Keep practicing, keep building, and keep exploring.
Lesson Review Quiz
?Knowledge Check
What are the three APIs tested in this final project?
?Knowledge Check
Why is it important to add test scripts to your Postman collection?
?Knowledge Check
After completing this course, what should be your next step?