When debugging APIs or checking server responses, we often only need the HTTP status code without all the header noise. The standard curl -I
command gives us too much information:
curl -I http://example.com/api
HTTP/1.1 200 OK
Server: nginx
Date: Mon, 15 Aug 2022 14:23:01 GMT
Content-Type: application/json
Connection: keep-alive
Here are three professional approaches to get just the status code:
# Method 1: Using --write-out
curl -o /dev/null -s -w "%{http_code}\n" http://example.com
# Method 2: Parsing with awk
curl -I http://example.com 2>/dev/null | head -n 1 | awk '{print $2}'
# Method 3: Combining with jq (for JSON APIs)
curl -s http://example.com/api | jq -r '.status // .code // "200"'
For scripting and automation, consider these robust implementations:
#!/bin/bash
# Function that returns only status code
get_status() {
local url=$1
local status=$(curl -o /dev/null -s -w "%{http_code}" "$url")
echo $status
}
# Usage example
API_STATUS=$(get_status "https://api.example.com/health")
if [ "$API_STATUS" -ne 200 ]; then
echo "API is down! Status: $API_STATUS"
exit 1
fi
For complete reliability, handle these scenarios:
# Follow redirects and get final status
curl -o /dev/null -s -w "%{http_code}" -L http://example.com/redirect
# Get both status and time taken
curl -o /dev/null -s -w "Status: %{http_code}\nTime: %{time_total}s\n" http://example.com
# Handle connection failures
curl -o /dev/null -s -w "%{http_code}" http://example.com || echo "000"
For complex requirements:
# Get status code + specific header
curl -o /dev/null -s -w "%{http_code} %{content_type}\n" http://example.com
# Batch process URLs from file
while read url; do
echo "$url: $(curl -o /dev/null -s -w "%{http_code}" "$url")"
done < urls.txt
When working with API testing or server monitoring scripts, we often need to quickly check HTTP status codes without processing full response headers. The default curl -I
or curl --head
command outputs all header information, which can be too verbose for automated scripts.
The most efficient way to get just the status code is combining these curl flags:
curl -s -o /dev/null -w "%{http_code}" http://example.com
Let's break down what each parameter does:
-s
: Silent mode (no progress meter or errors)-o /dev/null
: Redirects output to null-w "%{http_code}"
: Writes just the HTTP status code
Basic status check:
status=$(curl -s -o /dev/null -w "%{http_code}" https://api.example.com)
echo $status # Outputs: 200
With error handling:
status=$(curl -s -o /dev/null -w "%{http_code}" https://nonexistent.url || echo "000")
if [ "$status" -eq 200 ]; then
echo "Server is healthy"
else
echo "Server returned $status"
fi
For those preferring other tools:
# Using wget
wget --spider --server-response http://example.com 2>&1 | awk '/^ HTTP/{print $2}' | tail -1
# Using HTTPie (modern alternative to curl)
http --print=h HEAD http://example.com | grep HTTP | cut -d' ' -f2
- CI/CD pipeline health checks
- Automated monitoring scripts
- API response validation
- Load balancer backend checks
- Webhook endpoint verification
When running these checks in loops:
# Add --connect-timeout to prevent hanging
curl -s -o /dev/null -w "%{http_code}" --connect-timeout 5 http://example.com
# For HTTP/2 servers, add --http2
curl -s -o /dev/null -w "%{http_code}" --http2 https://example.com