Final Project: Complete API Testing Portfolio

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:

APIURLAuthFocus
JSONPlaceholderjsonplaceholder.typicode.comNoneCRUD operations
GitHubapi.github.comOptional tokenAuthentication & query params
ReqResreqres.inNoneAuth 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

VariableValue
jsonPlaceholderUrlhttps://jsonplaceholder.typicode.com
githubUrlhttps://api.github.com
reqresUrlhttps://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

  1. Right-click the collection → Export → v2.1
  2. Save as rest-api-final-project.postman_collection.json

6. Grading Yourself

SkillTestPass if...
GET requestsRetrieve data from 3 APIsAll return 200
POST requestsCreate resources on all 3 APIsAll return 201
PUT/PATCHUpdate resourcesReturn 200 with updated data
DELETERemove resourcesReturn 200 or 204
Query paramsFilter and paginateCorrect filtered results
Error handlingTrigger 404 and 400 errorsRecognize and explain
AuthLogin on ReqResToken received
JSON parsingUse jq for extractionCorrect field values
PostmanComplete collectionAll requests organized
PerformanceMeasure response timesUnder 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?

Subscribe to our newsletter

Get the latest posts delivered right to your inbox.

Subscribe on LinkedIn