You’ve undoubtedly heard of curl, as it’s one of the most popular HTTP utilities used on Linux and uther unix-based systems. You may not know that it is able to transfer data for a rather generous list of protocols (you can find the whole list at the cURL website). It’s also a widely used library in software applications, but today we’re going to stick to the command line utility.

cURL Examples

Below are a list of cURL showing common use cases you’ll encounter. I’ve preferred to use the long-style argument names as I feel they’re easier to remember.

One note, you’ll see a lot of examples for POST that involve using a flag like -X POST. As also noted in the official cURL man page, this only changes the method name in the request, it does not change cURL’s behavior. You’re usually better-off using options like --data to POST, and --head to make HEAD requests, as -X,--request can provide unexpected results:

This option only changes the actual word used in the HTTP request, it does not alter the way curl behaves. So for example if you want to make a proper HEAD request, using -X HEAD will not suffice. You need to use the -I, –head option.

The method string you set with -X, –request will be used for all requests, which if you for example use -L, –location may cause unintended side-effects when curl doesn’t change request method according to the HTTP 30x response codes - and similar.

GET Examples

GET a page, show response body:


GET a page, show headers and response body:

curl --include

GET a page, show just the headers:

curl --head

GET a file, don’t show progress meter or errors:

curl --silent

GET a page, following redirects, show only the response body:

curl --location

GET a page over HTTPS w/o verifying the certificate:

curl --insecure

GET a page using a specific network interface:

curl --interface eth0

GET a page, only resolving IPv4 addresses:

curl --ipv4

GET a page, only resolving IPv6 addresses:

curl --ipv6

GET a page silently, without printing errors or progress:

curl --silent

GET a page that requires basic authentication:

curl --user=michael:password123

GET a page and save it to a file of the same name (like wget):

curl -O

GET a page and save it to a specified filename:

curl -o new_name.txt

GET a page with URL-encoded key/value pair options in the URL:

curl --get --data-urlencode key0=value0 --data-urlencode key1=value1

POST Examples

POST JSON to an endpoint and specify the header:

curl --header "Content-type: application/json" --data '{"key":"value"}'

POST JSON from a file to an endpoint and specify the header:

curl --header "Content-type: application/json" --data @/home/michael/json.txt

POST URL-encoded key/value pair options to an endpoint:

curl --data-urlencode key0=value0 --data-urlencode key1=value1