This project demonstrates a complete **API Automation Framework in Postman**, covering:
- π Bearer Token Authentication (dummy simulation)
- π Full CRUD Operations (Create, Read, Update, Delete)
- π§© Data Chaining between requests
- π§ Advanced Test Assertions (status, schema, content)
- π§° Data-driven execution (via CSV)
- βοΈ CI/CD Integration (Newman + GitHub Actions)
The collection is designed for **learning and showcasing real-world API automation practices** while using a **mock REST API** (`https://jsonplaceholder.typicode.com`).
## Technical Specifications
| Component | Tool / Library |
| --- | --- |
| API Tool | Postman |
| Command-line Runner | Newman |
| CI/CD | GitHub Actions |
| Mock API | JSONPlaceholder |
| Language | JavaScript (Postman test scripts) |
## Test Coverage Summary
| Category | Assertions Used |
| --- | --- |
| Status Codes | pm.response.to.have.status(200/201) |
| Schema Validation | pm.response.to.have.jsonSchema(schema) |
| Header Validation | pm.response.headers.get('Content-Type') |
| Field Existence | pm.expect(response).to.have.property('title') |
| Dynamic Data | pm.environment.set("postId", ...) |
These validations ensure the correctness, structure, and integrity of API responses throughout the workflow.
| Summary Item | Total | Failed |
|---|---|---|
| Requests | 10 | 0 |
| Prerequest Scripts | 0 | 0 |
| Test Scripts | 8 | 0 |
| Assertions | 20 | 0 |
| Skipped Tests | 0 | - |
## Purpose
Simulates token-based authentication setup.
No real authentication is performed β this request simply demonstrates the use of a Bearer token in headers.
## Method
GET https://jsonplaceholder.typicode.com/users
## Headers
- Authorization: Bearer 12345dummybearertoken
## Expected Response
Status: 200 OK
Returns a list of users (mock data).
## Notes
- No test script because this is a dummy authentication request.
- Demonstrates how Authorization headers are passed to protected endpoints.
| Header Name | Header Value |
|---|---|
| Authorization | Bearer 12345dummybearertoken |
| User-Agent | PostmanRuntime/7.39.1 |
| Accept | */* |
| Cache-Control | no-cache |
| Postman-Token | 4a8bfa4e-df58-4abd-9cb2-9f25c92fa7eb |
| Host | jsonplaceholder.typicode.com |
| Accept-Encoding | gzip, deflate, br |
| Connection | keep-alive |
| Header Name | Header Value |
|---|---|
| Date | Wed, 01 Apr 2026 04:44:04 GMT |
| Content-Type | application/json; charset=utf-8 |
| Content-Length | 1847 |
| Connection | keep-alive |
| access-control-allow-credentials | true |
| cache-control | max-age=43200 |
| Content-Encoding | gzip |
| etag | W/"160d-1eMSsxeJRfnVLRBmYJSbCiJZ1qQ" |
| expires | -1 |
| nel | {"report_to":"heroku-nel","response_headers":["Via"],"max_age":3600,"success_fraction":0.01,"failure_fraction":0.1} |
| pragma | no-cache |
| report-to | {"group":"heroku-nel","endpoints":[{"url":"https://nel.heroku.com/reports?s=ea%2Be7%2F6gXr6R5vPiEDkO8k5EJ4j%2BMfB%2FfhXDGHeYYUQ%3D\u0026sid=e11707d5-02a7-43ef-b45e-2cf4d2036f7d\u0026ts=1771948610"}],"max_age":3600} |
| reporting-endpoints | heroku-nel="https://nel.heroku.com/reports?s=ea%2Be7%2F6gXr6R5vPiEDkO8k5EJ4j%2BMfB%2FfhXDGHeYYUQ%3D&sid=e11707d5-02a7-43ef-b45e-2cf4d2036f7d&ts=1771948610" |
| Server | cloudflare |
| vary | Origin, Accept-Encoding |
| via | 2.0 heroku-router |
| x-content-type-options | nosniff |
| x-powered-by | Express |
| x-ratelimit-limit | 1000 |
| x-ratelimit-remaining | 999 |
| x-ratelimit-reset | 1771948651 |
| Age | 7844 |
| Accept-Ranges | bytes |
| cf-cache-status | HIT |
| CF-RAY | 9e54efbe7ff0d6a0-IAD |
| alt-svc | h3=":443"; ma=86400 |
[
{
"id": 1,
"name": "Leanne Graham",
"username": "Bret",
"email": "Sincere@april.biz",
"address": {
"street": "Kulas Light",
"suite": "Apt. 556",
"city": "Gwenborough",
"zipcode": "92998-3874",
"geo": {
"lat": "-37.3159",
"lng": "81.1496"
}
},
"phone": "1-770-736-8031 x56442",
"website": "hildegard.org",
"company": {
"name": "Romaguera-Crona",
"catchPhrase": "Multi-layered client-server neural-net",
"bs": "harness real-time e-markets"
}
},
{
"id": 2,
"name": "Ervin Howell",
"username": "Antonette",
"email": "Shanna@melissa.tv",
"address": {
"street": "Victor Plains",
"suite": "Suite 879",
"city": "Wisokyburgh",
"zipcode": "90566-7771",
"geo": {
"lat": "-43.9509",
"lng": "-34.4618"
}
},
"phone": "010-692-6593 x09125",
"website": "anastasia.net",
"company": {
"name": "Deckow-Crist",
"catchPhrase": "Proactive didactic contingency",
"bs": "synergize scalable supply-chains"
}
},
{
"id": 3,
"name": "Clementine Bauch",
"username": "Samantha",
"email": "Nathan@yesenia.net",
"address": {
"street": "Douglas Extension",
"suite": "Suite 847",
"city": "McKenziehaven",
"zipcode": "59590-4157",
"geo": {
"lat": "-68.6102",
"lng": "-47.0653"
}
},
"phone": "1-463-123-4447",
"website": "ramiro.info",
"company": {
"name": "Romaguera-Jacobson",
"catchPhrase": "Face to face bifurcated interface",
"bs": "e-enable strategic applications"
}
},
{
"id": 4,
"name": "Patricia Lebsack",
"username": "Karianne",
"email": "Julianne.OConner@kory.org",
"address": {
"street": "Hoeger Mall",
"suite": "Apt. 692",
"city": "South Elvis",
"zipcode": "53919-4257",
"geo": {
"lat": "29.4572",
"lng": "-164.2990"
}
},
"phone": "493-170-9623 x156",
"website": "kale.biz",
"company": {
"name": "Robel-Corkery",
"catchPhrase": "Multi-tiered zero tolerance productivity",
"bs": "transition cutting-edge web services"
}
},
{
"id": 5,
"name": "Chelsey Dietrich",
"username": "Kamren",
"email": "Lucio_Hettinger@annie.ca",
"address": {
"street": "Skiles Walks",
"suite": "Suite 351",
"city": "Roscoeview",
"zipcode": "33263",
"geo": {
"lat": "-31.8129",
"lng": "62.5342"
}
},
"phone": "(254)954-1289",
"website": "demarco.info",
"company": {
"name": "Keebler LLC",
"catchPhrase": "User-centric fault-tolerant solution",
"bs": "revolutionize end-to-end systems"
}
},
{
"id": 6,
"name": "Mrs. Dennis Schulist",
"username": "Leopoldo_Corkery",
"email": "Karley_Dach@jasper.info",
"address": {
"street": "Norberto Crossing",
"suite": "Apt. 950",
"city": "South Christy",
"zipcode": "23505-1337",
"geo": {
"lat": "-71.4197",
"lng": "71.7478"
}
},
"phone": "1-477-935-8478 x6430",
"website": "ola.org",
"company": {
"name": "Considine-Lockman",
"catchPhrase": "Synchronised bottom-line interface",
"bs": "e-enable innovative applications"
}
},
{
"id": 7,
"name": "Kurtis Weissnat",
"username": "Elwyn.Skiles",
"email": "Telly.Hoeger@billy.biz",
"address": {
"street": "Rex Trail",
"suite": "Suite 280",
"city": "Howemouth",
"zipcode": "58804-1099",
"geo": {
"lat": "24.8918",
"lng": "21.8984"
}
},
"phone": "210.067.6132",
"website": "elvis.io",
"company": {
"name": "Johns Group",
"catchPhrase": "Configurable multimedia task-force",
"bs": "generate enterprise e-tailers"
}
},
{
"id": 8,
"name": "Nicholas Runolfsdottir V",
"username": "Maxime_Nienow",
"email": "Sherwood@rosamond.me",
"address": {
"street": "Ellsworth Summit",
"suite": "Suite 729",
"city": "Aliyaview",
"zipcode": "45169",
"geo": {
"lat": "-14.3990",
"lng": "-120.7677"
}
},
"phone": "586.493.6943 x140",
"website": "jacynthe.com",
"company": {
"name": "Abernathy Group",
"catchPhrase": "Implemented secondary concept",
"bs": "e-enable extensible e-tailers"
}
},
{
"id": 9,
"name": "Glenna Reichert",
"username": "Delphine",
"email": "Chaim_McDermott@dana.io",
"address": {
"street": "Dayna Park",
"suite": "Suite 449",
"city": "Bartholomebury",
"zipcode": "76495-3109",
"geo": {
"lat": "24.6463",
"lng": "-168.8889"
}
},
"phone": "(775)976-6794 x41206",
"website": "conrad.com",
"company": {
"name": "Yost and Sons",
"catchPhrase": "Switchable contextually-based project",
"bs": "aggregate real-time technologies"
}
},
{
"id": 10,
"name": "Clementina DuBuque",
"username": "Moriah.Stanton",
"email": "Rey.Padberg@karina.biz",
"address": {
"street": "Kattie Turnpike",
"suite": "Suite 198",
"city": "Lebsackbury",
"zipcode": "31428-2261",
"geo": {
"lat": "-38.2386",
"lng": "57.2232"
}
},
"phone": "024-648-3804",
"website": "ambrose.net",
"company": {
"name": "Hoeger LLC",
"catchPhrase": "Centralized empowering task-force",
"bs": "target end-to-end models"
}
}
]
## Purpose
Creates a new post and stores its ID for use in subsequent requests (data chaining).
## Method
POST https://jsonplaceholder.typicode.com/posts
## Headers
- Authorization: Bearer 12345dummybearertoken
- Content-Type: application/json
## Request Body
{
"title": "First post from CSV",
"body": "This is a sample post body",
"userId": 1
}
## Expected Response
Status: 201 Created
Body example:
{
"title": "Sample Post",
"body": "This is a test post",
"userId": 1,
"id": 101
}
## Tests Performed
- β
Status code = 201
- β
Required fields: title, body, userId
- β
JSON schema validation (flexible types)
- β
Saves `postId` dynamically to environment
## Notes
- JSONPlaceholder always returns `id = 101`.
Test script auto-fixes it to `1` for chaining:
`pm.environment.set("postId", response.id > 100 ? 1 : response.id);`
| Header Name | Header Value |
|---|---|
| Authorization | Bearer 12345dummybearertoken |
| Content-Type | application/json |
| User-Agent | PostmanRuntime/7.39.1 |
| Accept | */* |
| Cache-Control | no-cache |
| Postman-Token | c5b7fb24-c65d-480b-9d53-e74bc7074a60 |
| Host | jsonplaceholder.typicode.com |
| Accept-Encoding | gzip, deflate, br |
| Connection | keep-alive |
| Content-Length | 102 |
{
"title": "First post from CSV",
"body": "This is a sample post body",
"userId": "{{userID}}"
}
| Header Name | Header Value |
|---|---|
| Date | Wed, 01 Apr 2026 04:44:04 GMT |
| Content-Type | application/json; charset=utf-8 |
| Content-Length | 115 |
| Connection | keep-alive |
| access-control-allow-credentials | true |
| access-control-expose-headers | Location |
| Cache-Control | no-cache |
| etag | W/"73-BELDTqaj/U+xzkE1USIttDS9FxY" |
| expires | -1 |
| location | https://jsonplaceholder.typicode.com/posts/101 |
| nel | {"report_to":"heroku-nel","response_headers":["Via"],"max_age":3600,"success_fraction":0.01,"failure_fraction":0.1} |
| pragma | no-cache |
| report-to | {"group":"heroku-nel","endpoints":[{"url":"https://nel.heroku.com/reports?s=WxSDHNp0ZgxrM6iCKk4P%2FItFcM9HF4YRzvTbbfwGnxo%3D\u0026sid=e11707d5-02a7-43ef-b45e-2cf4d2036f7d\u0026ts=1775018644"}],"max_age":3600} |
| reporting-endpoints | heroku-nel="https://nel.heroku.com/reports?s=WxSDHNp0ZgxrM6iCKk4P%2FItFcM9HF4YRzvTbbfwGnxo%3D&sid=e11707d5-02a7-43ef-b45e-2cf4d2036f7d&ts=1775018644" |
| Server | cloudflare |
| vary | Origin, X-HTTP-Method-Override, Accept-Encoding |
| via | 2.0 heroku-router |
| x-content-type-options | nosniff |
| x-powered-by | Express |
| x-ratelimit-limit | 1000 |
| x-ratelimit-remaining | 999 |
| x-ratelimit-reset | 1775018652 |
| cf-cache-status | DYNAMIC |
| CF-RAY | 9e54efbea88cd6a0-IAD |
| alt-svc | h3=":443"; ma=86400 |
{
"title": "First post from CSV",
"body": "This is a sample post body",
"userId": "{{userID}}",
"id": 101
}
| Name | Passed | Failed | Skipped |
|---|---|---|---|
| Status code is 201 | 1 | 0 | 0 |
| Response has correct fields | 1 | 0 | 0 |
| Response schema is valid | 1 | 0 | 0 |
| Total | 3 | 0 | 0 |
| Test Name | Assertion Error |
|---|
## Purpose
Retrieves details of the created post using the dynamic postId saved in the environment.
## Method
GET https://jsonplaceholder.typicode.com/posts/1
## Headers
- Authorization: Bearer 12345dummybearertoken
## Expected Response
Status: 200 OK
Body example:
{
"userId": 1,
"id": 1,
"title": "Sample title",
"body": "Sample content"
}
## Tests Performed
- β
Status code = 200
- β
Content-Type is JSON
- β
Schema validation (checks title, body, id, userId)
## Notes
- Works after Create Post (uses the saved `postId`).
- Returns 404 if `postId = 101` (handled via auto-fix in POST test).
| Header Name | Header Value |
|---|---|
| Authorization | Bearer 12345dummybearertoken |
| User-Agent | PostmanRuntime/7.39.1 |
| Accept | */* |
| Cache-Control | no-cache |
| Postman-Token | b816ddd5-b766-4550-9a04-ece2dfa63c23 |
| Host | jsonplaceholder.typicode.com |
| Accept-Encoding | gzip, deflate, br |
| Connection | keep-alive |
| Header Name | Header Value |
|---|---|
| Date | Wed, 01 Apr 2026 04:44:04 GMT |
| Content-Type | application/json; charset=utf-8 |
| Transfer-Encoding | chunked |
| Connection | keep-alive |
| access-control-allow-credentials | true |
| Cache-Control | max-age=43200 |
| etag | W/"124-yiKdLzqO5gfBrJFrcdJ8Yq0LGnU" |
| expires | -1 |
| nel | {"report_to":"heroku-nel","response_headers":["Via"],"max_age":3600,"success_fraction":0.01,"failure_fraction":0.1} |
| pragma | no-cache |
| report-to | {"group":"heroku-nel","endpoints":[{"url":"https://nel.heroku.com/reports?s=4oKp81I3%2FyO0agNThScyLMTNw3yaVTmN6W%2FHVN9vC6w%3D\u0026sid=e11707d5-02a7-43ef-b45e-2cf4d2036f7d\u0026ts=1773731816"}],"max_age":3600} |
| reporting-endpoints | heroku-nel="https://nel.heroku.com/reports?s=4oKp81I3%2FyO0agNThScyLMTNw3yaVTmN6W%2FHVN9vC6w%3D&sid=e11707d5-02a7-43ef-b45e-2cf4d2036f7d&ts=1773731816" |
| Server | cloudflare |
| vary | Origin, Accept-Encoding |
| via | 2.0 heroku-router |
| x-content-type-options | nosniff |
| x-powered-by | Express |
| x-ratelimit-limit | 1000 |
| x-ratelimit-remaining | 999 |
| x-ratelimit-reset | 1773731861 |
| Age | 20991 |
| cf-cache-status | HIT |
| Content-Encoding | br |
| CF-RAY | 9e54efbf2a08d6a0-IAD |
| alt-svc | h3=":443"; ma=86400 |
{
"userId": 1,
"id": 1,
"title": "sunt aut facere repellat provident occaecati excepturi optio reprehenderit",
"body": "quia et suscipit\nsuscipit recusandae consequuntur expedita et cum\nreprehenderit molestiae ut ut quas totam\nnostrum rerum est autem sunt rem eveniet architecto"
}
| Name | Passed | Failed | Skipped |
|---|---|---|---|
| Status code is 200 | 1 | 0 | 0 |
| Content-Type is JSON | 1 | 0 | 0 |
| Response schema is valid | 1 | 0 | 0 |
| Total | 3 | 0 | 0 |
| Test Name | Assertion Error |
|---|
## Purpose
Updates an existing post using the stored postId.
## Method
PUT https://jsonplaceholder.typicode.com/posts/1
## Headers
- Authorization: Bearer 12345dummybearertoken
- Content-Type: application/json
## Request Body
{
"id": 1,
"title": "Updated - First post from CSV",
"body": "This is a sample post body",
"userId": 1
}
## Expected Response
Status: 200 OK
Body example:
{
"id": 1,
"title": "Updated - Sample Post",
"body": "This is a test post",
"userId": 1
}
## Tests Performed
- β
Status code = 200
- β
Title contains "Updated"
## Notes
- Dummy update (data not really changed on server).
- Helps verify PUT method and response structure.
| Header Name | Header Value |
|---|---|
| Authorization | Bearer 12345dummybearertoken |
| Content-Type | application/json |
| User-Agent | PostmanRuntime/7.39.1 |
| Accept | */* |
| Cache-Control | no-cache |
| Postman-Token | b6470b4c-4c57-4a27-aaf4-0bee77c095a1 |
| Host | jsonplaceholder.typicode.com |
| Accept-Encoding | gzip, deflate, br |
| Connection | keep-alive |
| Content-Length | 114 |
{
"id": 1,
"title": "Updated - First post from CSV",
"body": "This is a sample post body",
"userId": "1"
}
| Header Name | Header Value |
|---|---|
| Date | Wed, 01 Apr 2026 04:44:04 GMT |
| Content-Type | application/json; charset=utf-8 |
| Transfer-Encoding | chunked |
| Connection | keep-alive |
| access-control-allow-credentials | true |
| Cache-Control | no-cache |
| etag | W/"72-K17JhdDoJB6MUvsigO0n9q1/Gvs" |
| expires | -1 |
| nel | {"report_to":"heroku-nel","response_headers":["Via"],"max_age":3600,"success_fraction":0.01,"failure_fraction":0.1} |
| pragma | no-cache |
| report-to | {"group":"heroku-nel","endpoints":[{"url":"https://nel.heroku.com/reports?s=WxSDHNp0ZgxrM6iCKk4P%2FItFcM9HF4YRzvTbbfwGnxo%3D\u0026sid=e11707d5-02a7-43ef-b45e-2cf4d2036f7d\u0026ts=1775018644"}],"max_age":3600} |
| reporting-endpoints | heroku-nel="https://nel.heroku.com/reports?s=WxSDHNp0ZgxrM6iCKk4P%2FItFcM9HF4YRzvTbbfwGnxo%3D&sid=e11707d5-02a7-43ef-b45e-2cf4d2036f7d&ts=1775018644" |
| Server | cloudflare |
| vary | Origin, Accept-Encoding |
| via | 2.0 heroku-router |
| x-content-type-options | nosniff |
| x-powered-by | Express |
| x-ratelimit-limit | 1000 |
| x-ratelimit-remaining | 998 |
| x-ratelimit-reset | 1775018652 |
| cf-cache-status | DYNAMIC |
| Content-Encoding | br |
| CF-RAY | 9e54efbf7abfd6a0-IAD |
| alt-svc | h3=":443"; ma=86400 |
{
"id": 1,
"title": "Updated - First post from CSV",
"body": "This is a sample post body",
"userId": "1"
}
| Name | Passed | Failed | Skipped |
|---|---|---|---|
| Status code is 200 | 1 | 0 | 0 |
| Title was updated successfully | 1 | 0 | 0 |
| Total | 2 | 0 | 0 |
| Test Name | Assertion Error |
|---|
## Purpose
Deletes the created post (simulated).
Confirms that the DELETE endpoint responds correctly.
## Method
DELETE https://jsonplaceholder.typicode.com/posts/1
## Headers
- Authorization: Bearer 12345dummybearertoken
## Expected Response
Status: 200 OK
Body example:
{}
## Tests Performed
- β
Status code = 200
- β
Response body is empty (`{}`)
## Notes
- JSONPlaceholder doesnβt truly delete records.
- Request demonstrates DELETE operation flow.
| Header Name | Header Value |
|---|---|
| Authorization | Bearer 12345dummybearertoken |
| User-Agent | PostmanRuntime/7.39.1 |
| Accept | */* |
| Cache-Control | no-cache |
| Postman-Token | 208ff4b6-9c75-40c9-8e61-67554dd12eec |
| Host | jsonplaceholder.typicode.com |
| Accept-Encoding | gzip, deflate, br |
| Connection | keep-alive |
| Header Name | Header Value |
|---|---|
| Date | Wed, 01 Apr 2026 04:44:04 GMT |
| Content-Type | application/json; charset=utf-8 |
| Content-Length | 2 |
| Connection | keep-alive |
| access-control-allow-credentials | true |
| Cache-Control | no-cache |
| etag | W/"2-vyGp6PvFo4RvsFtPoIWeCReyIC8" |
| expires | -1 |
| nel | {"report_to":"heroku-nel","response_headers":["Via"],"max_age":3600,"success_fraction":0.01,"failure_fraction":0.1} |
| pragma | no-cache |
| report-to | {"group":"heroku-nel","endpoints":[{"url":"https://nel.heroku.com/reports?s=WxSDHNp0ZgxrM6iCKk4P%2FItFcM9HF4YRzvTbbfwGnxo%3D\u0026sid=e11707d5-02a7-43ef-b45e-2cf4d2036f7d\u0026ts=1775018644"}],"max_age":3600} |
| reporting-endpoints | heroku-nel="https://nel.heroku.com/reports?s=WxSDHNp0ZgxrM6iCKk4P%2FItFcM9HF4YRzvTbbfwGnxo%3D&sid=e11707d5-02a7-43ef-b45e-2cf4d2036f7d&ts=1775018644" |
| Server | cloudflare |
| vary | Origin, Accept-Encoding |
| via | 2.0 heroku-router |
| x-content-type-options | nosniff |
| x-powered-by | Express |
| x-ratelimit-limit | 1000 |
| x-ratelimit-remaining | 997 |
| x-ratelimit-reset | 1775018652 |
| cf-cache-status | DYNAMIC |
| CF-RAY | 9e54efbfbba7d6a0-IAD |
| alt-svc | h3=":443"; ma=86400 |
{}
| Name | Passed | Failed | Skipped |
|---|---|---|---|
| Status code is 200 | 1 | 0 | 0 |
| Response body is empty | 1 | 0 | 0 |
| Total | 2 | 0 | 0 |
| Test Name | Assertion Error |
|---|
## Purpose
Simulates token-based authentication setup.
No real authentication is performed β this request simply demonstrates the use of a Bearer token in headers.
## Method
GET https://jsonplaceholder.typicode.com/users
## Headers
- Authorization: Bearer 12345dummybearertoken
## Expected Response
Status: 200 OK
Returns a list of users (mock data).
## Notes
- No test script because this is a dummy authentication request.
- Demonstrates how Authorization headers are passed to protected endpoints.
| Header Name | Header Value |
|---|---|
| Authorization | Bearer 12345dummybearertoken |
| User-Agent | PostmanRuntime/7.39.1 |
| Accept | */* |
| Cache-Control | no-cache |
| Postman-Token | 7d181b90-7efd-4dd8-8566-451e2043291f |
| Host | jsonplaceholder.typicode.com |
| Accept-Encoding | gzip, deflate, br |
| Connection | keep-alive |
| Header Name | Header Value |
|---|---|
| Date | Wed, 01 Apr 2026 04:44:04 GMT |
| Content-Type | application/json; charset=utf-8 |
| Content-Length | 1847 |
| Connection | keep-alive |
| access-control-allow-credentials | true |
| cache-control | max-age=43200 |
| Content-Encoding | gzip |
| etag | W/"160d-1eMSsxeJRfnVLRBmYJSbCiJZ1qQ" |
| expires | -1 |
| nel | {"report_to":"heroku-nel","response_headers":["Via"],"max_age":3600,"success_fraction":0.01,"failure_fraction":0.1} |
| pragma | no-cache |
| report-to | {"group":"heroku-nel","endpoints":[{"url":"https://nel.heroku.com/reports?s=ea%2Be7%2F6gXr6R5vPiEDkO8k5EJ4j%2BMfB%2FfhXDGHeYYUQ%3D\u0026sid=e11707d5-02a7-43ef-b45e-2cf4d2036f7d\u0026ts=1771948610"}],"max_age":3600} |
| reporting-endpoints | heroku-nel="https://nel.heroku.com/reports?s=ea%2Be7%2F6gXr6R5vPiEDkO8k5EJ4j%2BMfB%2FfhXDGHeYYUQ%3D&sid=e11707d5-02a7-43ef-b45e-2cf4d2036f7d&ts=1771948610" |
| Server | cloudflare |
| vary | Origin, Accept-Encoding |
| via | 2.0 heroku-router |
| x-content-type-options | nosniff |
| x-powered-by | Express |
| x-ratelimit-limit | 1000 |
| x-ratelimit-remaining | 999 |
| x-ratelimit-reset | 1771948651 |
| Age | 0 |
| Accept-Ranges | bytes |
| cf-cache-status | HIT |
| CF-RAY | 9e54efbffc40d6a0-IAD |
| alt-svc | h3=":443"; ma=86400 |
[
{
"id": 1,
"name": "Leanne Graham",
"username": "Bret",
"email": "Sincere@april.biz",
"address": {
"street": "Kulas Light",
"suite": "Apt. 556",
"city": "Gwenborough",
"zipcode": "92998-3874",
"geo": {
"lat": "-37.3159",
"lng": "81.1496"
}
},
"phone": "1-770-736-8031 x56442",
"website": "hildegard.org",
"company": {
"name": "Romaguera-Crona",
"catchPhrase": "Multi-layered client-server neural-net",
"bs": "harness real-time e-markets"
}
},
{
"id": 2,
"name": "Ervin Howell",
"username": "Antonette",
"email": "Shanna@melissa.tv",
"address": {
"street": "Victor Plains",
"suite": "Suite 879",
"city": "Wisokyburgh",
"zipcode": "90566-7771",
"geo": {
"lat": "-43.9509",
"lng": "-34.4618"
}
},
"phone": "010-692-6593 x09125",
"website": "anastasia.net",
"company": {
"name": "Deckow-Crist",
"catchPhrase": "Proactive didactic contingency",
"bs": "synergize scalable supply-chains"
}
},
{
"id": 3,
"name": "Clementine Bauch",
"username": "Samantha",
"email": "Nathan@yesenia.net",
"address": {
"street": "Douglas Extension",
"suite": "Suite 847",
"city": "McKenziehaven",
"zipcode": "59590-4157",
"geo": {
"lat": "-68.6102",
"lng": "-47.0653"
}
},
"phone": "1-463-123-4447",
"website": "ramiro.info",
"company": {
"name": "Romaguera-Jacobson",
"catchPhrase": "Face to face bifurcated interface",
"bs": "e-enable strategic applications"
}
},
{
"id": 4,
"name": "Patricia Lebsack",
"username": "Karianne",
"email": "Julianne.OConner@kory.org",
"address": {
"street": "Hoeger Mall",
"suite": "Apt. 692",
"city": "South Elvis",
"zipcode": "53919-4257",
"geo": {
"lat": "29.4572",
"lng": "-164.2990"
}
},
"phone": "493-170-9623 x156",
"website": "kale.biz",
"company": {
"name": "Robel-Corkery",
"catchPhrase": "Multi-tiered zero tolerance productivity",
"bs": "transition cutting-edge web services"
}
},
{
"id": 5,
"name": "Chelsey Dietrich",
"username": "Kamren",
"email": "Lucio_Hettinger@annie.ca",
"address": {
"street": "Skiles Walks",
"suite": "Suite 351",
"city": "Roscoeview",
"zipcode": "33263",
"geo": {
"lat": "-31.8129",
"lng": "62.5342"
}
},
"phone": "(254)954-1289",
"website": "demarco.info",
"company": {
"name": "Keebler LLC",
"catchPhrase": "User-centric fault-tolerant solution",
"bs": "revolutionize end-to-end systems"
}
},
{
"id": 6,
"name": "Mrs. Dennis Schulist",
"username": "Leopoldo_Corkery",
"email": "Karley_Dach@jasper.info",
"address": {
"street": "Norberto Crossing",
"suite": "Apt. 950",
"city": "South Christy",
"zipcode": "23505-1337",
"geo": {
"lat": "-71.4197",
"lng": "71.7478"
}
},
"phone": "1-477-935-8478 x6430",
"website": "ola.org",
"company": {
"name": "Considine-Lockman",
"catchPhrase": "Synchronised bottom-line interface",
"bs": "e-enable innovative applications"
}
},
{
"id": 7,
"name": "Kurtis Weissnat",
"username": "Elwyn.Skiles",
"email": "Telly.Hoeger@billy.biz",
"address": {
"street": "Rex Trail",
"suite": "Suite 280",
"city": "Howemouth",
"zipcode": "58804-1099",
"geo": {
"lat": "24.8918",
"lng": "21.8984"
}
},
"phone": "210.067.6132",
"website": "elvis.io",
"company": {
"name": "Johns Group",
"catchPhrase": "Configurable multimedia task-force",
"bs": "generate enterprise e-tailers"
}
},
{
"id": 8,
"name": "Nicholas Runolfsdottir V",
"username": "Maxime_Nienow",
"email": "Sherwood@rosamond.me",
"address": {
"street": "Ellsworth Summit",
"suite": "Suite 729",
"city": "Aliyaview",
"zipcode": "45169",
"geo": {
"lat": "-14.3990",
"lng": "-120.7677"
}
},
"phone": "586.493.6943 x140",
"website": "jacynthe.com",
"company": {
"name": "Abernathy Group",
"catchPhrase": "Implemented secondary concept",
"bs": "e-enable extensible e-tailers"
}
},
{
"id": 9,
"name": "Glenna Reichert",
"username": "Delphine",
"email": "Chaim_McDermott@dana.io",
"address": {
"street": "Dayna Park",
"suite": "Suite 449",
"city": "Bartholomebury",
"zipcode": "76495-3109",
"geo": {
"lat": "24.6463",
"lng": "-168.8889"
}
},
"phone": "(775)976-6794 x41206",
"website": "conrad.com",
"company": {
"name": "Yost and Sons",
"catchPhrase": "Switchable contextually-based project",
"bs": "aggregate real-time technologies"
}
},
{
"id": 10,
"name": "Clementina DuBuque",
"username": "Moriah.Stanton",
"email": "Rey.Padberg@karina.biz",
"address": {
"street": "Kattie Turnpike",
"suite": "Suite 198",
"city": "Lebsackbury",
"zipcode": "31428-2261",
"geo": {
"lat": "-38.2386",
"lng": "57.2232"
}
},
"phone": "024-648-3804",
"website": "ambrose.net",
"company": {
"name": "Hoeger LLC",
"catchPhrase": "Centralized empowering task-force",
"bs": "target end-to-end models"
}
}
]
## Purpose
Creates a new post and stores its ID for use in subsequent requests (data chaining).
## Method
POST https://jsonplaceholder.typicode.com/posts
## Headers
- Authorization: Bearer 12345dummybearertoken
- Content-Type: application/json
## Request Body
{
"title": "Second post from CSV",
"body": "Another test post body",
"userId": 2
}
## Expected Response
Status: 201 Created
Body example:
{
"title": "Sample Post",
"body": "This is a test post",
"userId": 1,
"id": 101
}
## Tests Performed
- β
Status code = 201
- β
Required fields: title, body, userId
- β
JSON schema validation (flexible types)
- β
Saves `postId` dynamically to environment
## Notes
- JSONPlaceholder always returns `id = 101`.
Test script auto-fixes it to `1` for chaining:
`pm.environment.set("postId", response.id > 100 ? 1 : response.id);`
| Header Name | Header Value |
|---|---|
| Authorization | Bearer 12345dummybearertoken |
| Content-Type | application/json |
| User-Agent | PostmanRuntime/7.39.1 |
| Accept | */* |
| Cache-Control | no-cache |
| Postman-Token | 8138f1d4-f19e-46bf-9df3-16835b019629 |
| Host | jsonplaceholder.typicode.com |
| Accept-Encoding | gzip, deflate, br |
| Connection | keep-alive |
| Content-Length | 99 |
{
"title": "Second post from CSV",
"body": "Another test post body",
"userId": "{{userID}}"
}
| Header Name | Header Value |
|---|---|
| Date | Wed, 01 Apr 2026 04:44:04 GMT |
| Content-Type | application/json; charset=utf-8 |
| Content-Length | 112 |
| Connection | keep-alive |
| access-control-allow-credentials | true |
| access-control-expose-headers | Location |
| Cache-Control | no-cache |
| etag | W/"70-32K2/ksfKVVBnsV/oTkZ08pO/1Q" |
| expires | -1 |
| location | https://jsonplaceholder.typicode.com/posts/101 |
| nel | {"report_to":"heroku-nel","response_headers":["Via"],"max_age":3600,"success_fraction":0.01,"failure_fraction":0.1} |
| pragma | no-cache |
| report-to | {"group":"heroku-nel","endpoints":[{"url":"https://nel.heroku.com/reports?s=WxSDHNp0ZgxrM6iCKk4P%2FItFcM9HF4YRzvTbbfwGnxo%3D\u0026sid=e11707d5-02a7-43ef-b45e-2cf4d2036f7d\u0026ts=1775018644"}],"max_age":3600} |
| reporting-endpoints | heroku-nel="https://nel.heroku.com/reports?s=WxSDHNp0ZgxrM6iCKk4P%2FItFcM9HF4YRzvTbbfwGnxo%3D&sid=e11707d5-02a7-43ef-b45e-2cf4d2036f7d&ts=1775018644" |
| Server | cloudflare |
| vary | Origin, X-HTTP-Method-Override, Accept-Encoding |
| via | 2.0 heroku-router |
| x-content-type-options | nosniff |
| x-powered-by | Express |
| x-ratelimit-limit | 1000 |
| x-ratelimit-remaining | 996 |
| x-ratelimit-reset | 1775018652 |
| cf-cache-status | DYNAMIC |
| CF-RAY | 9e54efc01c9cd6a0-IAD |
| alt-svc | h3=":443"; ma=86400 |
{
"title": "Second post from CSV",
"body": "Another test post body",
"userId": "{{userID}}",
"id": 101
}
| Name | Passed | Failed | Skipped |
|---|---|---|---|
| Status code is 201 | 1 | 0 | 0 |
| Response has correct fields | 1 | 0 | 0 |
| Response schema is valid | 1 | 0 | 0 |
| Total | 3 | 0 | 0 |
| Test Name | Assertion Error |
|---|
## Purpose
Retrieves details of the created post using the dynamic postId saved in the environment.
## Method
GET https://jsonplaceholder.typicode.com/posts/1
## Headers
- Authorization: Bearer 12345dummybearertoken
## Expected Response
Status: 200 OK
Body example:
{
"userId": 1,
"id": 1,
"title": "Sample title",
"body": "Sample content"
}
## Tests Performed
- β
Status code = 200
- β
Content-Type is JSON
- β
Schema validation (checks title, body, id, userId)
## Notes
- Works after Create Post (uses the saved `postId`).
- Returns 404 if `postId = 101` (handled via auto-fix in POST test).
| Header Name | Header Value |
|---|---|
| Authorization | Bearer 12345dummybearertoken |
| User-Agent | PostmanRuntime/7.39.1 |
| Accept | */* |
| Cache-Control | no-cache |
| Postman-Token | b3980863-06f7-4368-b64b-b319560ac593 |
| Host | jsonplaceholder.typicode.com |
| Accept-Encoding | gzip, deflate, br |
| Connection | keep-alive |
| Header Name | Header Value |
|---|---|
| Date | Wed, 01 Apr 2026 04:44:04 GMT |
| Content-Type | application/json; charset=utf-8 |
| Transfer-Encoding | chunked |
| Connection | keep-alive |
| access-control-allow-credentials | true |
| Cache-Control | max-age=43200 |
| etag | W/"124-yiKdLzqO5gfBrJFrcdJ8Yq0LGnU" |
| expires | -1 |
| nel | {"report_to":"heroku-nel","response_headers":["Via"],"max_age":3600,"success_fraction":0.01,"failure_fraction":0.1} |
| pragma | no-cache |
| report-to | {"group":"heroku-nel","endpoints":[{"url":"https://nel.heroku.com/reports?s=4oKp81I3%2FyO0agNThScyLMTNw3yaVTmN6W%2FHVN9vC6w%3D\u0026sid=e11707d5-02a7-43ef-b45e-2cf4d2036f7d\u0026ts=1773731816"}],"max_age":3600} |
| reporting-endpoints | heroku-nel="https://nel.heroku.com/reports?s=4oKp81I3%2FyO0agNThScyLMTNw3yaVTmN6W%2FHVN9vC6w%3D&sid=e11707d5-02a7-43ef-b45e-2cf4d2036f7d&ts=1773731816" |
| Server | cloudflare |
| vary | Origin, Accept-Encoding |
| via | 2.0 heroku-router |
| x-content-type-options | nosniff |
| x-powered-by | Express |
| x-ratelimit-limit | 1000 |
| x-ratelimit-remaining | 999 |
| x-ratelimit-reset | 1773731861 |
| Age | 20991 |
| cf-cache-status | HIT |
| Content-Encoding | br |
| CF-RAY | 9e54efc05d57d6a0-IAD |
| alt-svc | h3=":443"; ma=86400 |
{
"userId": 1,
"id": 1,
"title": "sunt aut facere repellat provident occaecati excepturi optio reprehenderit",
"body": "quia et suscipit\nsuscipit recusandae consequuntur expedita et cum\nreprehenderit molestiae ut ut quas totam\nnostrum rerum est autem sunt rem eveniet architecto"
}
| Name | Passed | Failed | Skipped |
|---|---|---|---|
| Status code is 200 | 1 | 0 | 0 |
| Content-Type is JSON | 1 | 0 | 0 |
| Response schema is valid | 1 | 0 | 0 |
| Total | 3 | 0 | 0 |
| Test Name | Assertion Error |
|---|
## Purpose
Updates an existing post using the stored postId.
## Method
PUT https://jsonplaceholder.typicode.com/posts/1
## Headers
- Authorization: Bearer 12345dummybearertoken
- Content-Type: application/json
## Request Body
{
"id": 1,
"title": "Updated - Second post from CSV",
"body": "Another test post body",
"userId": 2
}
## Expected Response
Status: 200 OK
Body example:
{
"id": 1,
"title": "Updated - Sample Post",
"body": "This is a test post",
"userId": 1
}
## Tests Performed
- β
Status code = 200
- β
Title contains "Updated"
## Notes
- Dummy update (data not really changed on server).
- Helps verify PUT method and response structure.
| Header Name | Header Value |
|---|---|
| Authorization | Bearer 12345dummybearertoken |
| Content-Type | application/json |
| User-Agent | PostmanRuntime/7.39.1 |
| Accept | */* |
| Cache-Control | no-cache |
| Postman-Token | a5d5c560-a013-4d91-b408-eb5292a2ec79 |
| Host | jsonplaceholder.typicode.com |
| Accept-Encoding | gzip, deflate, br |
| Connection | keep-alive |
| Content-Length | 111 |
{
"id": 1,
"title": "Updated - Second post from CSV",
"body": "Another test post body",
"userId": "2"
}
| Header Name | Header Value |
|---|---|
| Date | Wed, 01 Apr 2026 04:44:04 GMT |
| Content-Type | application/json; charset=utf-8 |
| Transfer-Encoding | chunked |
| Connection | keep-alive |
| access-control-allow-credentials | true |
| Cache-Control | no-cache |
| etag | W/"6f-rsDLqJS3REZnklmVgUV7fHg2PZc" |
| expires | -1 |
| nel | {"report_to":"heroku-nel","response_headers":["Via"],"max_age":3600,"success_fraction":0.01,"failure_fraction":0.1} |
| pragma | no-cache |
| report-to | {"group":"heroku-nel","endpoints":[{"url":"https://nel.heroku.com/reports?s=WxSDHNp0ZgxrM6iCKk4P%2FItFcM9HF4YRzvTbbfwGnxo%3D\u0026sid=e11707d5-02a7-43ef-b45e-2cf4d2036f7d\u0026ts=1775018644"}],"max_age":3600} |
| reporting-endpoints | heroku-nel="https://nel.heroku.com/reports?s=WxSDHNp0ZgxrM6iCKk4P%2FItFcM9HF4YRzvTbbfwGnxo%3D&sid=e11707d5-02a7-43ef-b45e-2cf4d2036f7d&ts=1775018644" |
| Server | cloudflare |
| vary | Origin, Accept-Encoding |
| via | 2.0 heroku-router |
| x-content-type-options | nosniff |
| x-powered-by | Express |
| x-ratelimit-limit | 1000 |
| x-ratelimit-remaining | 995 |
| x-ratelimit-reset | 1775018652 |
| cf-cache-status | DYNAMIC |
| Content-Encoding | br |
| CF-RAY | 9e54efc08dfdd6a0-IAD |
| alt-svc | h3=":443"; ma=86400 |
{
"id": 1,
"title": "Updated - Second post from CSV",
"body": "Another test post body",
"userId": "2"
}
| Name | Passed | Failed | Skipped |
|---|---|---|---|
| Status code is 200 | 1 | 0 | 0 |
| Title was updated successfully | 1 | 0 | 0 |
| Total | 2 | 0 | 0 |
| Test Name | Assertion Error |
|---|
## Purpose
Deletes the created post (simulated).
Confirms that the DELETE endpoint responds correctly.
## Method
DELETE https://jsonplaceholder.typicode.com/posts/1
## Headers
- Authorization: Bearer 12345dummybearertoken
## Expected Response
Status: 200 OK
Body example:
{}
## Tests Performed
- β
Status code = 200
- β
Response body is empty (`{}`)
## Notes
- JSONPlaceholder doesnβt truly delete records.
- Request demonstrates DELETE operation flow.
| Header Name | Header Value |
|---|---|
| Authorization | Bearer 12345dummybearertoken |
| User-Agent | PostmanRuntime/7.39.1 |
| Accept | */* |
| Cache-Control | no-cache |
| Postman-Token | 51e31491-9b3d-495e-ac04-fbda8412a282 |
| Host | jsonplaceholder.typicode.com |
| Accept-Encoding | gzip, deflate, br |
| Connection | keep-alive |
| Header Name | Header Value |
|---|---|
| Date | Wed, 01 Apr 2026 04:44:04 GMT |
| Content-Type | application/json; charset=utf-8 |
| Content-Length | 2 |
| Connection | keep-alive |
| access-control-allow-credentials | true |
| Cache-Control | no-cache |
| etag | W/"2-vyGp6PvFo4RvsFtPoIWeCReyIC8" |
| expires | -1 |
| nel | {"report_to":"heroku-nel","response_headers":["Via"],"max_age":3600,"success_fraction":0.01,"failure_fraction":0.1} |
| pragma | no-cache |
| report-to | {"group":"heroku-nel","endpoints":[{"url":"https://nel.heroku.com/reports?s=WxSDHNp0ZgxrM6iCKk4P%2FItFcM9HF4YRzvTbbfwGnxo%3D\u0026sid=e11707d5-02a7-43ef-b45e-2cf4d2036f7d\u0026ts=1775018644"}],"max_age":3600} |
| reporting-endpoints | heroku-nel="https://nel.heroku.com/reports?s=WxSDHNp0ZgxrM6iCKk4P%2FItFcM9HF4YRzvTbbfwGnxo%3D&sid=e11707d5-02a7-43ef-b45e-2cf4d2036f7d&ts=1775018644" |
| Server | cloudflare |
| vary | Origin, Accept-Encoding |
| via | 2.0 heroku-router |
| x-content-type-options | nosniff |
| x-powered-by | Express |
| x-ratelimit-limit | 1000 |
| x-ratelimit-remaining | 994 |
| x-ratelimit-reset | 1775018652 |
| cf-cache-status | DYNAMIC |
| CF-RAY | 9e54efc0ce93d6a0-IAD |
| alt-svc | h3=":443"; ma=86400 |
{}
| Name | Passed | Failed | Skipped |
|---|---|---|---|
| Status code is 200 | 1 | 0 | 0 |
| Response body is empty | 1 | 0 | 0 |
| Total | 2 | 0 | 0 |
| Test Name | Assertion Error |
|---|