Skip to Content

curl: A Handy Guide for Everyday Developers

When you start working with APIs, web servers, or even debugging your own applications, one command-line tool quickly becomes your best friend — curl.

But let’s be honest. Most of us only remember one or two curl commands (like curl -v or a simple curl http://example.com​) and then run to Google whenever we need something more advanced.

So in this blog, I’ll walk you through the most useful curl commands, explained in plain English, with examples that you can try on your own. By the end, you’ll be confident enough to use curl​ like a pro.

What is curl?

curl is a command-line tool used to transfer data from or to a server using many protocols like HTTP, HTTPS, FTP, SCP, LDAP, and more. But most of us use it for HTTP requests — testing APIs, downloading files, and checking headers.

Think of it as a Swiss Army knife for web requests.

Getting Help and Documentation

If you’re just starting out, remember these:

curl -h

curl --help

curl --manual


So the next time you forget a flag, just type curl --help


What’s Happening: Verbose Mode

Sometimes you don’t just want the response, but also what’s happening behind the scenes:

curl -v http://example.com


  • -v → verbose output (headers, connection info).
  • -vv → even more detail.

This is super helpful when debugging issues with APIs or SSL.


Checking Headers Only

Sometimes you don’t need the whole page or response, just the headers:


curl -I http://example.com


This will show you details like server type, cookies, and cache settings.


SSL and Self-Signed Certificates

If you’re testing on a dev or staging server with a self-signed SSL certificate:

curl -k https://server_with_self_signed_cert/


Here -k ​or --insecure​ tells curl to ignore SSL validation. Don’t use this in production unless you know what you’re doing!



Whether you’re a developer testing APIs, a sysadmin debugging servers, or just someone curious about how the web works, curl​ is a tool you’ll always come back to.

It’s lightweight, available on almost every system (Linux, macOS, Windows), and once you get the hang of it, you can do everything from downloading a file to benchmarking API performance.

Next time you see a complicated API call in documentation, don’t panic — just open your terminal and try it with curl​.

Below list has advanced options of curl, with description.

        # redirect output to the file
curl http://url/file > file
# write to file instead of stdout
curl -o file http://url/file
curl --output file http://url/file
# write output to a file named as the remote file
curl -o file http://url/file
curl --output file http://url/file
# execute remote script
bash <(curl -s http://url/myscript.sh)

# download headers
curl -I url             # display header

# basic authentification
curl --user username:password http://example.com/
curl -u username:password http://example.com/

# SSL
# -k, --insecure allow insecure server connections when using SSL
curl -k https://server_with_self_signed_cert/endpoint
curl --insecure https://server_with_self_signed_cert/endpoint

# HTTP request
# -X, --request  specify request command to use
# example:
curl -X GET http://url/endpoint

# HTTP header
# -H, --header 
pass custom header(s) to server # example: curl -H 'user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.163 Safari/537.36' http://url/endpoing # HTTP POST data # -d, --data HTTP POST data # -d, --data @data HTTP POST data from file # example: curl -d '{json}' -H 'Content-Type: application/json' http://url/endpoint # config file curl -K file # #or # Read config from a file curl --config file # $HOME/.curlrc # Default config file in UNIX-like systems ############################################################################## # WRITE OUT PARAMETERS ############################################################################## # -w, --write-out Use output FORMAT after completion # example: curl -w %{size_header} --silent -o /dev/null http://gogle.com # print size of header when you accessing google.com # FORMAT supported: # %{content_type} # shows the Content-Type of the requested document, if there was any. # %{filename_effective} # shows the ultimate filename that curl writes out to. # This is only meaningful if curl is told to write to a file with # the --remote-name or --output option. It's most useful in combination # with the --remote-header-name option. # %{ftp_entry_path} # shows the initial path curl ended up in when logging on to the remote FTP server. # %{response_code} # shows the numerical response code that was found in the last transfer. # %{http_connect} # shows the numerical code that was found in the last response (from a proxy) # to a curl CONNECT request. # %{local_ip} # shows the IP address of the local end of the most recently done connection—can # be either IPv4 or IPv6 # %{local_port} # shows the local port number of the most recently made connection # %{num_connects} # shows the number of new connects made in the recent transfer. # %{num_redirects} # shows the number of redirects that were followed in the request. # %{redirect_url} # shows the actual URL a redirect would take you to when an HTTP request # was made without -L to follow redirects. # %{remote_ip} # shows the remote IP address of the most recently made connection—can be # either IPv4 or IPv6. # %{remote_port} # shows the remote port number of the most recently made connection. # %{size_download} # shows the total number of bytes that were downloaded. # %{size_header} # shows the total number of bytes of the downloaded headers. # %{size_request} # shows the total number of bytes that were sent in the HTTP request. # %{size_upload} # shows the total number of bytes that were uploaded. # %{speed_download} # shows the average download speed that curl measured for the complete download # in bytes per second. # %{speed_upload} # shows the average upload speed that curl measured for the complete upload in # bytes per second. # %{ssl_verify_result} # shows the result of the SSL peer certificate verification that was requested. # 0 means the verification was successful. # %{time_appconnect} # shows the time, in seconds, it took from the start until the SSL/SSH/etc connect/handshake # to the remote host was completed. # %{time_connect} # shows the time, in seconds, it took from the start until the TCP connect to the remote # host (or proxy) was completed. # %{time_namelookup} # shows the time, in seconds, it took from the start until the name resolving was completed. # %{time_pretransfer} # shows the time, in seconds, it took from the start until the file transfer was just about # to begin. This includes all pre-transfer commands and negotiations that are specific to # the particular protocol(s) involved. # %{time_redirect} # shows the time, in seconds, it took for all redirection steps including name lookup, connect, # pre-transfer and transfer before the final transaction was started. time_redirect shows # the complete execution time for multiple redirections. # %{time_starttransfer} # shows the time, in seconds, it took from the start until the first byte was just about to # be transferred. This includes time_pretransfer and also the time the server needed # to calculate the result. # %{time_total} # shows the total time, in seconds, that the full operation lasted. The time will be displayed # with millisecond resolution. # %{url_effective} # shows the URL that was fetched last. This is particularly meaningful if you have told curl # to follow Location: headers (with -L)


Hope you find it helpful!

Docker Commands: Simplified for Everyone