Skip to content

cURL Examples

This page provides comprehensive cURL examples for testing the JSONPlaceholder API from the command line.

Basic Setup

Choose the appropriate base URL for your use case:

bash
# Set base URL for public API
export BASE_URL="https://api.jsonplaceholder.dev"

# Test connection
curl $BASE_URL/
bash
# Set base URL for local development
export BASE_URL="http://localhost:3000"

# Test connection
curl $BASE_URL/

Users Examples

Get All Users

bash
# Simple GET request
curl $BASE_URL/users

# Pretty print JSON output
curl -s $BASE_URL/users | jq '.'

# Show response headers
curl -i $BASE_URL/users

Get User by ID

bash
# Get specific user
curl $BASE_URL/users/1

# Get user with verbose output
curl -v $BASE_URL/users/1

# Save response to file
curl $BASE_URL/users/1 -o user1.json
bash
# Get user's posts
curl $BASE_URL/users/1/posts

# Get user's albums
curl $BASE_URL/users/1/albums

# Get user's todos
curl $BASE_URL/users/1/todos

Create New User

bash
# Create user with minimal data
curl -X POST $BASE_URL/users \
  -H "Content-Type: application/json" \
  -d '{
    "name": "John Doe",
    "username": "johndoe",
    "email": "[email protected]"
  }'

# Create user with full data
curl -X POST $BASE_URL/users \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Jane Smith",
    "username": "janesmith",
    "email": "[email protected]",
    "address": {
      "street": "123 Main St",
      "suite": "Apt 4B",
      "city": "New York",
      "zipcode": "10001",
      "geo": {
        "lat": "40.7128",
        "lng": "-74.0060"
      }
    },
    "phone": "1-555-123-4567",
    "website": "janesmith.com",
    "company": {
      "name": "Smith Corp",
      "catchPhrase": "Innovation at its best",
      "bs": "revolutionary solutions"
    }
  }'

Update User

bash
# Full update (PUT)
curl -X PUT $BASE_URL/users/1 \
  -H "Content-Type: application/json" \
  -d '{
    "name": "John Doe Updated",
    "username": "johndoe",
    "email": "[email protected]"
  }'

# Partial update (PATCH)
curl -X PATCH $BASE_URL/users/1 \
  -H "Content-Type: application/json" \
  -d '{
    "email": "[email protected]"
  }'

Delete User

bash
# Delete user
curl -X DELETE $BASE_URL/users/1

# Delete with verbose output
curl -X DELETE -v $BASE_URL/users/1

Posts Examples

Get Posts

bash
# Get all posts
curl $BASE_URL/posts

# Get posts by specific user
curl "$BASE_URL/posts?userId=1"

# Get single post
curl $BASE_URL/posts/1

# Get post comments
curl $BASE_URL/posts/1/comments

Create Post

bash
# Create new post
curl -X POST $BASE_URL/posts \
  -H "Content-Type: application/json" \
  -d '{
    "userId": 1,
    "title": "My Amazing Post",
    "body": "This is the content of my amazing post. It contains valuable information!"
  }'

# Create post with data from file
echo '{
  "userId": 1,
  "title": "Post from File",
  "body": "This post was created from a JSON file."
}' > post.json

curl -X POST $BASE_URL/posts \
  -H "Content-Type: application/json" \
  -d @post.json

Update Post

bash
# Update entire post
curl -X PUT $BASE_URL/posts/1 \
  -H "Content-Type: application/json" \
  -d '{
    "userId": 1,
    "title": "Updated Post Title",
    "body": "This is the updated content of the post."
  }'

# Update only title
curl -X PATCH $BASE_URL/posts/1 \
  -H "Content-Type: application/json" \
  -d '{
    "title": "New Title Only"
  }'

Delete Post

bash
# Delete post
curl -X DELETE $BASE_URL/posts/1

Comments Examples

Get Comments

bash
# Get all comments
curl $BASE_URL/comments

# Get comments for specific post
curl "$BASE_URL/comments?postId=1"

# Get single comment
curl $BASE_URL/comments/1

Create Comment

bash
# Add comment to post
curl -X POST $BASE_URL/comments \
  -H "Content-Type: application/json" \
  -d '{
    "postId": 1,
    "name": "Great insights!",
    "email": "[email protected]",
    "body": "Thanks for sharing this valuable information. It really helped me understand the topic better."
  }'

Update Comment

bash
# Update comment
curl -X PATCH $BASE_URL/comments/1 \
  -H "Content-Type: application/json" \
  -d '{
    "body": "Updated comment with new insights."
  }'

Albums & Photos Examples

Albums

bash
# Get all albums
curl $BASE_URL/albums

# Get albums by user
curl "$BASE_URL/albums?userId=1"

# Get single album
curl $BASE_URL/albums/1

# Get album photos
curl $BASE_URL/albums/1/photos

# Create album
curl -X POST $BASE_URL/albums \
  -H "Content-Type: application/json" \
  -d '{
    "userId": 1,
    "title": "My Vacation Photos"
  }'

Photos

bash
# Get photos by album (recommended over getting all 5000 photos)
curl "$BASE_URL/photos?albumId=1"

# Get single photo
curl $BASE_URL/photos/1

# Create photo
curl -X POST $BASE_URL/photos \
  -H "Content-Type: application/json" \
  -d '{
    "albumId": 1,
    "title": "Beautiful sunset",
    "url": "https://via.placeholder.com/600/sunset",
    "thumbnailUrl": "https://via.placeholder.com/150/sunset"
  }'

Todos Examples

Get Todos

bash
# Get all todos
curl $BASE_URL/todos

# Get todos by user
curl "$BASE_URL/todos?userId=1"

# Get single todo
curl $BASE_URL/todos/1

Manage Todos

bash
# Create todo
curl -X POST $BASE_URL/todos \
  -H "Content-Type: application/json" \
  -d '{
    "userId": 1,
    "title": "Learn cURL commands",
    "completed": false
  }'

# Mark todo as completed
curl -X PATCH $BASE_URL/todos/1 \
  -H "Content-Type: application/json" \
  -d '{
    "completed": true
  }'

# Delete todo
curl -X DELETE $BASE_URL/todos/1

Admin Examples

Reset Data

bash
# Reset all data to initial state (only works when ENABLE_UPDATES=1)
curl -X POST $BASE_URL/reset

# Reset with verbose output to see response
curl -X POST -v $BASE_URL/reset

# Check if reset worked by getting user count
curl -s $BASE_URL/users | jq 'length'

Note: The reset endpoint is only available when the server is running with ENABLE_UPDATES=1. In read-only mode, this endpoint will return an error.

Advanced cURL Techniques

Authentication Simulation

bash
# Add custom headers (simulating authentication)
curl $BASE_URL/users \
  -H "Authorization: Bearer fake-token" \
  -H "X-User-ID: 123"

Batch Operations with Shell Scripts

bash
#!/bin/bash
# batch-create-posts.sh

BASE_URL="http://localhost:3000"

posts=(
  '{"userId": 1, "title": "Post 1", "body": "Content 1"}'
  '{"userId": 1, "title": "Post 2", "body": "Content 2"}'
  '{"userId": 2, "title": "Post 3", "body": "Content 3"}'
)

for post in "${posts[@]}"; do
  echo "Creating post: $post"
  curl -X POST $BASE_URL/posts \
    -H "Content-Type: application/json" \
    -d "$post"
  echo -e "\n---"
done

Response Processing

bash
# Extract specific fields with jq
curl -s $BASE_URL/users/1 | jq '.name'

# Count items
curl -s $BASE_URL/posts | jq 'length'

# Filter data
curl -s "$BASE_URL/todos?userId=1" | jq '[.[] | select(.completed == false)]'

# Get only specific fields
curl -s $BASE_URL/users | jq '.[] | {id, name, email}'

Error Handling

bash
# Check HTTP status code
curl -w "%{http_code}" -s -o /dev/null $BASE_URL/users/999

# Show timing information
curl -w "@curl-format.txt" -s $BASE_URL/users/1

# Create curl-format.txt:
cat > curl-format.txt << 'EOF'
Response Time: %{time_total}s
HTTP Status: %{http_code}
Size: %{size_download} bytes
EOF

Testing Error Scenarios

bash
# Test 404 - Not Found
curl -i $BASE_URL/users/999

# Test invalid JSON (should cause 400 error)
curl -X POST $BASE_URL/posts \
  -H "Content-Type: application/json" \
  -d '{"invalid": json}'

# Test missing Content-Type header
curl -X POST $BASE_URL/posts \
  -d '{"userId": 1, "title": "Test"}'

Performance Testing

bash
# Time multiple requests
time for i in {1..10}; do
  curl -s $BASE_URL/users/$i > /dev/null
done

# Parallel requests
curl $BASE_URL/users/1 & \
curl $BASE_URL/users/2 & \
curl $BASE_URL/users/3 & \
wait

# Using curl with URL list
echo -e "$BASE_URL/users/1\n$BASE_URL/users/2\n$BASE_URL/users/3" | \
xargs -I {} -P 3 curl -s {}

Useful cURL Options

bash
# Common useful options:
curl \
  -X POST \                    # HTTP method
  -H "Content-Type: application/json" \  # Headers
  -d '{"data": "value"}' \     # Request body
  -i \                         # Include headers in output
  -s \                         # Silent mode (no progress bar)
  -v \                         # Verbose output
  -w "%{time_total}" \         # Write custom format
  -o output.json \             # Output to file
  -L \                         # Follow redirects
  --max-time 30 \              # Timeout in seconds
  --retry 3 \                  # Retry on failure
  $BASE_URL/endpoint

Environment Setup Script

bash
#!/bin/bash
# setup-api-env.sh

# Set up environment for API testing
export BASE_URL="http://localhost:3000"
export CONTENT_TYPE="Content-Type: application/json"

# Test functions
test_api() {
  echo "Testing API connection..."
  curl -s $BASE_URL/ | jq -r '.message'
}

get_user() {
  curl -s $BASE_URL/users/$1 | jq '.'
}

create_post() {
  curl -X POST $BASE_URL/posts \
    -H "$CONTENT_TYPE" \
    -d "{\"userId\": $1, \"title\": \"$2\", \"body\": \"$3\"}"
}

# Usage examples:
# test_api
# get_user 1
# create_post 1 "My Title" "My Content"

Fast Fake REST API powered by Bun + Elysia.js | Documentation site source: github.com/ckissi/jsonplaceholder