These curl recipes show you how to add POST data to curl requests. To add URL-encoded form data, use the -d argument. To make curl URL-escape form data for you, use the --data-urlencode argument. To send multipart form data, use the -F argument.

Send Form Data

curl -d 'name=johnny%20depp'

This recipe uses the -d argument to add name=johnny%20depp to the body of a POST request to When using the -d argument, curl automatically adds the Content-Type: application/x-www-form-urlencoded header that tells the web server it's sending URL-encoded form data. Note that the key=value data should be URL-escaped.

URL-encode and Send Form Data

curl --data-urlencode 'name=john depp'

This recipe uses the --data-urlencode argument to add name=john depp form data to a POST request. This argument works just like the -d argument in the previous recipe, except it also URL-encodes the data. Thus, the data this recipe adds to the body of the POST request is name=johnny%20depp and the request is then sent to

Using Multiple -d Arguments

curl -d 'foo=bar' -d 'baz=quux'

The previous two recipes sent just a single variable in the POST request but you can send as many variables as you need. Just specify them one after another. This recipe POSTs two variables, foo=bar and baz=quux.

Send Multipart Data

curl -F 'name=johnny'

This recipe uses the -F argument to send multipart form data in a POST request. When sending multipart data, curl sets the Content-Type header to multipart/form-data. Sending multipart data is useful when you need to upload images or other binary files.

Upload an Image

curl -F 'pic=@me.jpg'

This recipe also uses the -F argument but instead of sending textual data, it sends the file me.jpg. It uploads it to via a POST request. As this recipe uses the -F argument, this image is uploaded as multipart base64-encoded form data.

Upload an Image and Change Its Filename

curl -F 'pic=@me.jpg;filename=x.jpg'

This recipe adds a special argument filename=x.jpg after me.jpg. This tells curl to use a new filename for the attached file. Curl will read me.jpg but tell the server that the filename is x.jpg.

Send JSON Data

curl -H 'Content-Type: application/json' -d '{"query": "cats"}'

This recipe sends a POST request with JSON data in it. It specifies the JSON data itself as the argument to the -d switch, and it also sets the request's content type to application/json via the -H argument so that the web server knew that the incoming data is JSON and not plain text.

Send XML Data

curl -H 'Content-Type: text/xml' -d 'hello'

This recipe sets the content type header to text/xml, which is the MIME type of XML. It then adds <message>hello</message> data to the request and POSTs it to Sending XML data, JSON data, or any other text data is very similar. All you have to do is change the content type header to the correct MIME type so that the server and the application know what type of data it is.

Created by Browserling

These curl recipes were written down by me and my team at Browserling. We use recipes like this every day to get things done and improve our product. Browserling itself is an online cross-browser testing service powered by alien technology. Check it out!

Secret message: If you love my curl recipe, then I love you, too! Use coupon code CURLLING to get a discount at my company.