curl POST Request Guide

Learn about cURL POST Request, what it is, how to send a POST request with cURL, and more.
12 min read
curl post request guide

curl is a command line tool for transferring data using various network protocols. Available on all major operating systems, curl has become the standard tool for sending HTTP requests from the command line.

curl’s cross-platform utility supports protocols like HTTP, HTTPS, FTP, and IMAP, making it easy to send requests to APIs and scrape websites using curl. With its wide availability and support for multiple protocols, you’ll often find curl referenced in REST API documentation as a quick way to test API calls directly from the command line:

learn how to send POST requests using curl from the command line

In this article, you’ll learn how to send POST requests using curl from the command line.

What Is a POST Request

A POST request is an HTTP method to send data to a server and is one of the most common HTTP methods.

When you send a POST request, the transmitted data is included in the request body. This lets you send data more discreetly than sending it in the URL (like you would with a GET request). You can also send significantly more data in a POST request, circumventing the URL length restrictions imposed by browsers for GET requests.

You’ll often find POST requests used to submit forms, upload files, or send JSON data to an API. Compared to GET, POST requests are typically not cached, and the data isn’t shown in your browser history since the request data is in the body of the request.

How to Send a POST Request with curl

Before you begin this tutorial, you need to install curl on your computer. Run the following command to check if curl is installed:

curl --version

If you get an error saying the command could not be found, you need to install the utility.

Install curl

Following are the instructions on how to install curl on all major operating systems:

Windows

On Windows, you can use WinGet, the default package manager in Windows 11, to install curl:

winget install curl.curl

Chocolatey is another package manager for Windows that lets you install curl using the following command:

choco install curl

Linux

curl is available in most Linux package managers. On Ubuntu/Debian, use the following command to install curl:

apt-get install curl

Red Hat Enterprise Linux (RHEL), CentOS, and Fedora let you install curl using the Yellowdog Updater Modified (YUM), like this:

yum install curl

If you’re running OpenSUSE, you can install curl using the following terminal command:

zypper install curl

Finally, Arch Linux lets you use pacman to install curl with this command:

pacman -Sy curl

macOS

Homebrew is the easiest way to install curl on macOS. Make sure you have Homebrew installed, and then run the following command:

brew install curl

Now that you’ve installed curl on your operating system, you’re ready to learn how to make POST requests.

Make a POST Request

curl lets you specify several options when sending POST requests. The following sections will show some common curl features you might come across when making POST requests using the utility.

Specify the POST Method

When making HTTP requests using curl, you need to specify the HTTP method you want to perform. HTTP methods include GET, POST, PUT, and DELETE. curl lets you specify the HTTP method you wish to use using the -X command line flag.

For example, to send a POST request to https://httpbin.org/anything, you can execute the following curl command in your terminal:

curl -X POST https://httpbin.org/anything

httpbin.org echoes the request body and headers in the response. Your response should look like this:

{
  "args": {},
  "data": "",
  "files": {},
  "form": {},
  "headers": {
    "Accept": "*/*",
    "Host": "httpbin.org",
    "User-Agent": "curl/8.1.2",
    "X-Amzn-Trace-Id": "Root=1-11111111-111111111111111111111111"
  },
  "json": null,
  "method": "POST",
  "origin": "0.0.0.0",
  "url": "https://httpbin.org/anything"
}

The -X POST flag is the equivalent of using the --request POST flag, so you could also execute the following command and get the same result:

curl --request POST https://httpbin.org/anything

The response looks the same as the previous one.

You can read more about the -X and --request flags in the official documentation.

Set the Content-Type

When sending a POST request, it’s important to specify the type of content you’re sending in the body of the request so that the server can interpret the request body correctly. You can use MIME types in the Content-Type header in an HTTP request to specify the request body format.

For example, if you’re sending JSON in the request body, you need to tell the web server to expect JSON content by setting the Content-Type header to application/json. If you were sending XML, your Content-Type header should be application/xml. For more information, check out the official documentation discussing Content-Type.

curl lets you specify headers for an HTTP request using the -H flag. As an example, if you’re sending JSON in a POST request, the following curl command shows how you can set the Content-Type header for the request:

curl -X POST -H 'Content-Type: application/json' -d '{}' https://httpbin.org/anything

In the response, you can see the Content-Type header set to application/json:

{
  "args": {},
  "data": "{}",
  "files": {},
  "form": {},
  "headers": {
    "Accept": "*/*",
    "Content-Length": "2",
    "Content-Type": "application/json",
    "Host": "httpbin.org",
    "User-Agent": "curl/8.1.2",
    "X-Amzn-Trace-Id": "Root=-11111111-111111111111111111111111"
  },
  "json": {},
  "method": "POST",
  "origin": "0.0.0.0",
  "url": "https://httpbin.org/anything"
}

The -H flag can also be specified using the longer --header flag. In this case, your curl command would look like this:

curl -X POST --header 'Content-Type: application/json' -d '{}' https://httpbin.org/anything

Your response would look the same as the previous one.

Send Data

You might have noticed the earlier commands had a -d flag. This flag lets you specify the data to send in the request body. You can use the flag to pass any string of values surrounded by quotations, like this:

curl -X POST -H 'Content-Type: application/json' -d '{
    "FirstName": "Joe", 
    "LastName": "Soap" 
}' https://httpbin.org/anything

You’ll notice that httpbin.org shows the body data you sent in the data property of the response.

If you have a file with data that you want curl to send in the body, specify the file name prefixed with the @ character. The following command reads the contents of body.json and sends it through the request body:

curl -X POST -H 'Content-Type: application/json' -d @body.json https://httpbin.org/anything

In this case, the body.json file contains the following:

{
    "FirstName": "Joe",
    "LastName": "Soap"
}

When sending this, httpbin.org should return the following response:

{
  "args": {},
  "data": "{\t\"FirstName\": \"Joe\",\t\"LastName\": \"Soap\"}",
  "files": {},
  "form": {},
  "headers": {
    "Accept": "*/*",
    "Content-Length": "41",
    "Content-Type": "application/json",
    "Host": "httpbin.org",
    "User-Agent": "curl/8.1.2",
    "X-Amzn-Trace-Id": "Root=1-11111111-111111111111111111111111"
  },
  "json": {
    "FirstName": "Joe",
    "LastName": "Soap"
  },
  "method": "POST",
  "origin": "0.0.0.0",
  "url": "https://httpbin.org/anything"
}

The --data flag behaves the same as -d, so you can use them interchangeably.

Send JSON Data

In the previous section, you saw how you could send JSON data by setting the Content-Type header to application/json and then passing in the JSON data using the -d flag. When sending a request, it’s also important to let the web server know what format of data you expect in response. You can use the Accept header with the value application/json to let the web server know you’d like to receive a JSON response.

The following command sends a JSON request to the server and lets the server know you’d like to receive JSON in response:

curl -X POST -H 'Content-Type: application/json' -H 'Accept: application/json' -d '{
    "FirstName": "Joe",
    "LastName": "Soap"
}' https://httpbin.org/anything

You’ll notice the data and json properties in the response body contain the JSON data you sent in the request:

{
  "args": {},
  "data": "{\n    \"FirstName\": \"Joe\",\n    \"LastName\": \"Soap\"\n}",
  "files": {},
  "form": {},
  "headers": {
    "Accept": "application/json",
    "Content-Length": "50",
    "Content-Type": "application/json",
    "Host": "httpbin.org",
    "User-Agent": "curl/8.1.2",
    "X-Amzn-Trace-Id": "Root=1-11111111-111111111111111111111111"
  },
  "json": {
    "FirstName": "Joe",
    "LastName": "Soap"
  },
  "method": "POST",
  "origin": "0.0.0.0",
  "url": "https://httpbin.org/anything"
}

Sending and receiving JSON data is common when sending HTTP requests, so curl offers a --json flag that sets the Content-Type and Accept headers for you and sends the JSON data in the request body. Using this flag, you can shorten your command to send JSON in a POST request:

curl -X POST --json '{
    "FirstName": "Joe",
    "LastName": "Soap"
}' https://httpbin.org/anything

This yields the same response as before:

{
  "args": {},
  "data": "{\n    \"FirstName\": \"Joe\",\n    \"LastName\": \"Soap\"\n}",
  "files": {},
  "form": {},
  "headers": {
    "Accept": "application/json",
    "Content-Length": "50",
    "Content-Type": "application/json",
    "Host": "httpbin.org",
    "User-Agent": "curl/8.1.2",
    "X-Amzn-Trace-Id": "Root=1-11111111-111111111111111111111111"
  },
  "json": {
    "FirstName": "Joe",
    "LastName": "Soap"
  },
  "method": "POST",
  "origin": "0.0.0.0",
  "url": "https://httpbin.org/anything"
}

The --json flag was released in version 7.82 of curl in March 2022, so make sure you have the latest version of curl installed before you use it.

Send XML Data

curl also lets you send data in other formats, such as XML. To send XML data, you need to set your Content-Type header to application/xml and pass the XML data in the request body using the -d flag. You can also tell the web server you expect the response to be XML by setting the Accept header to application/xml.

The following command shows how you can send an XML object in a POST request using curl:

curl -X POST -H 'Content-Type: application/xml' -H 'Accept: application/xml' -d '<Person>
    <FirstName>Joe</FirstName>
    <LastName>Soap</LastName>
</Person>' https://httpbin.org/anything

You’ll find the XML request data in the data property returned by httpbin.org:

{
  "args": {},
  "data": "<Person>\n    <FirstName>Joe</FirstName>\n    <LastName>Soap</LastName>\n</Person>",
  "files": {},
  "form": {},
  "headers": {
    "Accept": "application/xml",
    "Content-Length": "79",
    "Content-Type": "application/xml",
    "Host": "httpbin.org",
    "User-Agent": "curl/8.1.2",
    "X-Amzn-Trace-Id": "Root=1-11111111-111111111111111111111111"
  },
  "json": null,
  "method": "POST",
  "origin": "0.0.0.0",
  "url": "https://httpbin.org/anything"
}
Send FormData

You can use FormData to send key-value pairs of data to a web server. As the name implies, you use this data format when submitting a form on a web page. The key-value pairs have a field name and value.

curl lets you specify FormData using the -F or --form flag. When using the flag, specify the field name and value in the following format: -F <name=content> or --form <name=content>.

The next snippet shows a curl command that sends a POST request using FormData with FirstName and LastName fields:

curl -X POST -F FirstName=Joe -F LastName=Soap https://httpbin.org/anything

You’ll find the form field names and values in the form property of the httpbin.org response object:

{
  "args": {},
  "data": "",
  "files": {},
  "form": {
    "FirstName": "Joe",
    "LastName": "Soap"
  },
  "headers": {
    "Accept": "*/*",
    "Content-Length": "248",
    "Content-Type": "multipart/form-data; boundary=------------------------e2bb56049a60b8b8",
    "Host": "httpbin.org",
    "User-Agent": "curl/8.1.2",
    "X-Amzn-Trace-Id": "Root=1-11111111-111111111111111111111111"
  },
  "json": null,
  "method": "POST",
  "origin": "0.0.0.0",
  "url": "https://httpbin.org/anything"
}

You use the -F flag for every field you want to send to the server.

Upload Files

You can use FormData to upload files in a POST request by attaching the file to a field. To let curl know a FormData field holds a file, enter the path to the file in the field value prefixed with the @ character.

The following curl command uploads a file called Contract.pdf in your working directory. The command uses a field called File to upload the file:

curl -X POST -F [email protected] https://httpbin.org/anything

The response contains the whole file, so it’s long, but it should look like this:

{
  "args": {},
  "data": "",
  "files": {
    "File": "..."
  },
  "form": {},
  "headers": {
    "Accept": "*/*",
    "Content-Length": "246",
    "Content-Type": "multipart/form-data; boundary=------------------------19ed1fc3be4d30c7",
    "Host": "httpbin.org",
    "User-Agent": "curl/8.1.2",
    "X-Amzn-Trace-Id": "Root=1-11111111-111111111111111111111111"
  },
  "json": null,
  "method": "POST",
  "origin": "0.0.0.0",
  "url": "https://httpbin.org/anything"
}

Send Credentials

Many HTTP endpoints require authentication to send requests. The web server decides what authentication method you should use. One such authentication method is the basic authentication scheme, which lets you send credentials consisting of a username and password in your request. The server then verifies the credentials and, if correct, processes the request.

curl simplifies sending basic authentication credentials using the -u or --user flag. You then specify the username and password and separate them with a : (colon), like this: -u <username:password>.

The following snippet uses curl to send a POST request with user credentials and a JSON body:

curl -X POST -u 'admin:password123' --json '{
    "FirstName": "Joe",
    "LastName": "Soap"
}' https://httpbin.org/anything

Notice how curl encodes the username and password and sends it in the Authorization header:

{
  "args": {},
  "data": "{\n    \"FirstName\": \"Joe\",\n    \"LastName\": \"Soap\"\n}",
  "files": {},
  "form": {},
  "headers": {
    "Accept": "application/json",
    "Authorization": "Basic YWRtaW46cGFzc3dvcmQxMjM=",
    "Content-Length": "50",
    "Content-Type": "application/json",
    "Host": "httpbin.org",
    "User-Agent": "curl/8.1.2",
    "X-Amzn-Trace-Id": "Root=1-11111111-111111111111111111111111"
  },
  "json": {
    "FirstName": "Joe",
    "LastName": "Soap"
  },
  "method": "POST",
  "origin": "0.0.0.0",
  "url": "https://httpbin.org/anything"
}

Conclusion

This article showed you how to send POST requests using the curl command line utility. You learned how to use the -X flag to specify that you want to send a POST request. You also set the Content-Type and Accept headers using the -H and --header flags so that the web server knows what format the data is in. To send data in the request body, you used the -d flag along with the data you wanted to send.

You also saw a few examples of how to send several types of data, including JSON, XML, and FormData, and learned how to send basic authentication credentials in your request using the -u and --user flags.

While this article demonstrated the basic flags included in curl and how to use them, curl offers more features that you might want to explore, including using variables, sending cookies with requests, and sending requests using a proxy. Many programming languages also provide libraries that let you work with curl from that programming language, including Python, Node.js, and Rust.

Looking for a scraping solution? Talk to one of our data experts and see which one of our products best suits your needs.