🥳Join the Scrapeless Community and Claim Your Free Trial to Access Our Powerful Web Scraping Toolkit!
Back to Blog

How to Send HTTP Headers With cURL: A Comprehensive Guide

Michael Lee
Michael Lee

Expert Network Defense Engineer

22-Sep-2025

Key Takeaways:

  • HTTP headers are crucial for client-server communication, conveying essential metadata about requests and responses.
  • cURL provides the -H or --header option to easily send custom HTTP headers with your requests.
  • You can send multiple headers by using the -H option multiple times.
  • Understanding and manipulating headers is vital for web scraping, API testing, and debugging network issues.
  • Viewing response headers with cURL helps in debugging and understanding server behavior.

Introduction

cURL (Client URL) is a powerful command-line tool for transferring data with URLs, supporting protocols like HTTP, HTTPS, and FTP. For developers and system administrators, cURL is indispensable. Its ability to send and receive HTTP headers is fundamental for defining client-server interactions. This guide provides a comprehensive overview of how to send HTTP headers with cURL, covering various scenarios, practical examples, and best practices.

What Are HTTP Headers?

HTTP headers are a fundamental part of HTTP requests and responses, carrying essential metadata about the transaction. They act as the

envelope and postage information for a letter, while the body is the letter itself. They enable features like caching, authentication, and content negotiation.

Types of HTTP Headers:

  • Request Headers: Sent by client (e.g., User-Agent, Authorization).
  • Response Headers: Sent by server (e.g., Content-Type, Set-Cookie).
  • General Headers: Apply to both (e.g., Date, Connection).
  • Entity Headers: Describe the body (e.g., Content-Length).

Manipulating request headers is crucial for debugging, API testing, and mimicking specific client behaviors.

Basic Syntax: Sending a Single Header

To send an HTTP header with cURL, use the -H or --header option followed by "Header-Name: Header-Value".

Syntax:

bash Copy
curl -H "Header-Name: Header-Value" [URL]

Example 1: Setting a Custom User-Agent

Override cURL's default User-Agent to mimic a web browser:

bash Copy
curl -H "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36" https://www.example.com

This makes the request appear to originate from a Chrome browser, useful for interacting with websites that block non-browser user agents.

Example 2: Setting the Accept Header

Specify preferred content types, such as JSON:

bash Copy
curl -H "Accept: application/json" https://api.example.com/data

This requests data in JSON format from the API endpoint.

Sending Multiple HTTP Headers

Send multiple headers by using the -H option multiple times in a single command.

Syntax:

bash Copy
curl -H "Header-Name-1: Header-Value-1" \
     -H "Header-Name-2: Header-Value-2" \
     [URL]

Example 3: POST Request with Authentication and Content-Type

For API calls, include Authorization and Content-Type headers:

bash Copy
curl -X POST \
     -H "Content-Type: application/json" \
     -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
     -d '{"name": "John Doe", "age": 30}' \
     https://api.example.com/users

This sends a POST request with JSON data, authenticated by a bearer token.

Overwriting Default Headers

cURL sends some default headers. Override them by specifying your custom value with -H. Your custom header takes precedence.

Example 4: Overwriting the User-Agent Header

bash Copy
curl -H "User-Agent: MyCustomApp/1.0" https://www.example.com

This identifies your client as MyCustomApp/1.0 to the server.

Example 5: Removing a Default Header

To remove a header cURL would normally send, use a semicolon without a value:

bash Copy
curl -H "Accept-Encoding;" https://www.example.com

This explicitly tells cURL not to send the Accept-Encoding header.

Sending Headers with Different HTTP Methods

cURL supports all standard HTTP methods using the -X option, with headers added via -H.

Example 6: PUT Request with Headers

bash Copy
curl -X PUT \
     -H "Content-Type: application/json" \
     -H "Authorization: Bearer YOUR_AUTH_TOKEN" \
     -d '{"status": "active"}' \
     https://api.example.com/items/123

This updates a resource, ensuring correct content interpretation and authentication.

Example 7: DELETE Request with Headers

bash Copy
curl -X DELETE \
     -H "Authorization: Bearer YOUR_AUTH_TOKEN" \
     https://api.example.com/items/456

This performs an authenticated DELETE request for a resource.

Handling Cookies with cURL

Cookies are special HTTP headers for session management. cURL offers specific options to send and receive them.

Example 8: Sending a Cookie

Use -H "Cookie: ..." or the more convenient -b (or --cookie) option:

bash Copy
curl -b "session_id=abc123xyz" https://www.example.com/dashboard

Example 9: Storing and Sending Cookies from a File

First, save cookies received from a server to cookies.txt:

bash Copy
curl -c cookies.txt https://www.example.com/login

Then, send these cookies in subsequent requests:

bash Copy
curl -b cookies.txt https://www.example.com/profile

This is fundamental for simulating logged-in user sessions.

Viewing Response Headers

Viewing response headers is crucial for debugging and understanding server behavior. Use -i or -I.

Example 10: Viewing All Response Headers and Body

Use -i (or --include) to display both headers and the response body:

bash Copy
curl -i https://www.example.com

Example 11: Viewing Only Response Headers (HEAD Request)

Use -I (or --head) to send a HEAD request and get only headers, without the body:

bash Copy
curl -I https://www.example.com

This is efficient for checking resource status or caching headers.

Example 12: Saving Headers to a File

Use -D or --dump-header to save response headers to a file:

bash Copy
curl -D headers.txt https://www.example.com

This saves headers to headers.txt while printing the body to standard output.

Practical Use Cases for Sending HTTP Headers with cURL

Custom headers are indispensable for various applications:

1. API Testing and Debugging

Send specific headers for authentication or custom parameters to test API endpoints.

Example: Testing an API with an X-API-Key.

bash Copy
curl -H "X-API-Key: your_secret_api_key" https://api.example.com/v1/data

2. Web Scraping and Data Extraction

Mimic a real browser to avoid detection by setting User-Agent, Referer, and Cookie headers.

Example: Scraping with a browser-like User-Agent and session cookie.

bash Copy
curl -H "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36" \
     -b "session_id=your_session_id" \
     https://www.example.com/protected_data

3. Simulating Browser Behavior

Simulate interactions like form submissions, where headers play a critical role.

Example: Simulating a form submission with application/x-www-form-urlencoded.

bash Copy
curl -X POST \
     -H "Content-Type: application/x-www-form-urlencoded" \
     -d "username=testuser&password=testpass" \
     https://www.example.com/login

4. Testing Web Server Configurations

Test server configurations, caching policies, and security settings.

Example: Checking caching behavior with If-Modified-Since.

bash Copy
curl -I -H "If-Modified-Since: Wed, 21 Oct 2015 07:28:00 GMT" https://www.example.com/static/image.jpg

Best Practices and Troubleshooting

To ensure effective and responsible use of cURL with HTTP headers, consider these best practices and troubleshooting tips:

Best Practices:

  • Be Specific: Only send necessary headers. Excessive headers can trigger anti-bot mechanisms.
  • Use User-Agent Wisely: Mimic a popular browser for web scraping to avoid blocks, but be aware of targeted bot detection.
  • Handle Cookies Correctly: Use -c (cookie-jar) and -b (cookie) options for session management, rather than manual Cookie headers.
  • Inspect Responses: Always use -i or -I to view response headers for debugging and understanding server behavior.
  • URL Encode: Properly URL-encode parameters in query strings or form data to prevent issues with special characters.
  • Respect robots.txt: Ethically, check and adhere to a website's robots.txt guidelines for automated tasks.

Troubleshooting Common Issues:

  • "403 Forbidden" or "401 Unauthorized" Errors:
    • Verify Authorization header (token validity).
    • Check User-Agent and Referer headers.
    • Consider IP blocking; use proxies or wait.
  • Incorrect Content or Empty Responses:
    • Confirm Content-Type and Accept headers match server expectations.
    • JavaScript Rendering: cURL fetches raw HTML. If content is JS-rendered, consider headless browsers or specialized scraping APIs.
    • Follow Redirects: Use -L or --location to make cURL follow HTTP 3xx redirects.
  • Connection Timeouts or Refused Connections:
    • Ensure URL is correct and server is reachable.
    • Check local firewall or network proxy.
    • Server might be temporarily down or overloaded.

Using the verbose output (-v) option in cURL can provide invaluable detailed information for debugging.

Conclusion and Call to Action

Sending HTTP headers with cURL is a fundamental skill for anyone working with web technologies. From basic User-Agent manipulation to complex authentication schemes and cookie management, cURL provides the flexibility and power to craft precise HTTP requests. Mastering these techniques is essential for effective API testing, robust web scraping, and thorough network debugging.

By understanding the role of each header and utilizing cURL's versatile options, you can gain greater control over your client-server interactions. Remember to always adhere to best practices, respect website policies, and leverage cURL's debugging features to ensure your requests are both effective and responsible.

Ready to elevate your cURL skills?

Experiment with the examples provided in this guide, explore cURL's extensive documentation, and integrate these techniques into your daily workflow. The ability to precisely control HTTP headers will undoubtedly make you a more efficient and capable web professional.

Frequently Asked Questions (FAQ)

Q1: What is the difference between -H and -b for sending headers?

-H (or --header) is a general-purpose option for sending any custom HTTP header in "Header-Name: Header-Value" format. -b (or --cookie) is specifically for sending cookies, often more convenient when dealing exclusively with them, especially from a file.

Q2: How can I see all headers that cURL sends by default?

Use the -v (or --verbose) option with your cURL command. This provides detailed output, including the full request cURL sends (with all default headers), connection process, and the server's full response.

Q3: Can cURL handle HTTP/2 or HTTP/3 headers?

Yes, cURL supports HTTP/2 and HTTP/3 (QUIC). It often negotiates to use these protocols automatically. The -H option for specifying headers remains the same, as cURL handles the protocol-specific framing internally.

Q4: How do I send a header with an empty value?

To send a header with an empty value, specify it as "Header-Name:" (with a colon but no value). To remove a header cURL would normally send, use "Header-Name;" (with a semicolon), which tells cURL to suppress that header entirely.

Q5: Is it possible to send non-ASCII characters in headers?

HTTP headers are traditionally ASCII-only. Non-ASCII characters should be URL-encoded or Base64-encoded, depending on the header and its use. For most common cases, sticking to ASCII in header values is recommended for compatibility.

At Scrapeless, we only access publicly available data while strictly complying with applicable laws, regulations, and website privacy policies. The content in this blog is for demonstration purposes only and does not involve any illegal or infringing activities. We make no guarantees and disclaim all liability for the use of information from this blog or third-party links. Before engaging in any scraping activities, consult your legal advisor and review the target website's terms of service or obtain the necessary permissions.

Most Popular Articles

Catalogue