Curl Post Request With Json Body

7 min read

Curl POST Request with JSON Body: A Complete Guide

When working with REST APIs, sending data from the command line is a common task for developers, DevOps engineers, and system administrators. One of the most powerful tools for this purpose is curl, a command-line utility that supports numerous protocols including HTTP/HTTPS. Among its many capabilities, curl's ability to send POST requests with JSON bodies stands out as one of the most frequently used features. Whether you're testing API endpoints, automating workflows, or integrating services, understanding how to properly construct a curl POST request with a JSON payload is essential knowledge That's the whole idea..

The official docs gloss over this. That's a mistake Simple, but easy to overlook..

This guide covers everything you need to know about making curl POST requests with JSON data — from basic syntax to advanced techniques, error handling, and best practices.


Understanding HTTP POST Requests and JSON

Before diving into curl commands, make sure to understand the fundamentals:

  • An HTTP POST request sends data to a server to create or update a resource.
  • JSON (JavaScript Object Notation) is a lightweight data-interchange format that's easy for humans to read and write, and easy for machines to parse and generate.
  • When sending JSON via POST, the data is included in the request body, and the Content-Type header should be set to application/json.

Curl makes it straightforward to include both headers and body content in your requests, which is crucial when interacting with modern web APIs.


Basic Syntax for Curl POST Request with JSON

The fundamental structure of a curl POST request with a JSON body looks like this:

curl -X POST https://api.example.com/endpoint \
  -H "Content-Type: application/json" \
  -d '{"key": "value"}'

Let's break down each component:

1. -X POST

Specifies the HTTP method. While curl often infers the method from other flags (like -d), explicitly stating -X POST ensures clarity.

2. URL Endpoint

Replace https://api.example.com/endpoint with the actual API endpoint you're targeting.

3. -H "Content-Type: application/json"

Sets the HTTP header indicating that the request body contains JSON data. This is critical because many APIs will reject requests without proper content type headers.

4. -d '{"key": "value"}'

The -d flag stands for "data" and allows you to specify the request body. The JSON string follows immediately after It's one of those things that adds up..

Note: Single quotes around the JSON prevent shell interpretation of special characters like $, !, and {}.


Sending Complex JSON Data

Real-world APIs often require more complex JSON structures. Here's how to handle them:

Nested Objects

curl -X POST https://api.example.com/users \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Alice Johnson",
    "email": "alice@example.com",
    "address": {
      "street": "123 Main St",
      "city": "Springfield",
      "zipcode": "12345"
    },
    "active": true
  }'

Arrays in JSON

curl -X POST https://api.example.com/orders \
  -H "Content-Type: application/json" \
  -d '{
    "customerId": 456,
    "items": [
      {"productId": 1, "quantity": 2},
      {"productId": 3, "quantity": 1}
    ],
    "total": 99.99
  }'

Using External Files

For large or frequently changing JSON payloads, consider storing the data in a file:

curl -X POST https://api.example.com/bulk-import \
  -H "Content-Type: application/json" \
  -d @data.json

The @ symbol tells curl to read the file contents and use them as the request body Worth knowing..


Authentication and Headers

Most APIs require authentication. You can add authentication headers alongside your Content-Type:

Bearer Token Authentication

curl -X POST https://api.example.com/secure-endpoint \
  -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"query": "SELECT * FROM users"}'

API Key Authentication

curl -X POST https://api.example.com/data \
  -H "X-API-Key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"filter": "active"}'

Multiple Headers

You can chain multiple -H flags to include several headers:

curl -X POST https://api.example.com/submit \
  -H "Content-Type: application/json" \
  -H "Accept: application/json" \
  -H "User-Agent: MyApp/1.0" \
  -d '{"status": "completed"}'

Advanced Techniques

Pretty Printing Responses

To make JSON responses easier to read during development:

curl -X POST https://api.example.com/test \
  -H "Content-Type: application/json" \
  -d '{"test": true}' | python -m json.tool

On macOS or with jq installed:

curl -X POST https://api.example.com/test \
  -H "Content-Type: application/json" \
  -d '{"test": true}' | jq .

Verbose Output for Debugging

Use the -v flag to see detailed information about the request and response:

curl -v -X POST https://api.example.com/debug \
  -H "Content-Type: application/json" \
  -d '{"debug": true}'

Saving Response to File

curl -X POST https://api.example.com/export \
  -H "Content-Type: application/json" \
  -d '{"format": "csv"}' \
  -o result.csv

Common Pitfalls and How to Avoid Them

  1. Missing Content-Type Header Many APIs return errors like 415 Unsupported Media Type if you don't specify Content-Type: application/json That alone is useful..

  2. Shell Escaping Issues Special characters in JSON can cause problems. Always use single quotes around JSON strings unless you have specific escaping needs.

  3. Incorrect JSON Formatting Invalid JSON (missing commas, unquoted keys) leads to parsing errors. Validate your JSON using tools like before sending.

  4. URL Encoding Problems If your JSON contains URLs or query parameters, ensure they're properly encoded.


Practical Examples

Creating a User Account

curl -X POST https://api.example.com/register \
  -H "Content-Type: application/json" \
  -d '{
    "username": "johndoe",
    "password": "securePassword123!",
    "email": "john@example.com",
    "preferences": {
      "newsletter": true,
      "notifications": ["email", "sms"]
    }
  }'

Submitting Form Data as JSON

Some APIs accept form-like data but expect JSON format:

curl -X POST https://api.example.com/contact \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Jane Smith",
    "message": "Hello, I have a question about your services.",
    "priority": "medium"
  }'

Batch Processing

curl -X POST https://api.example.com/batch \
  -H "Content-Type: application/json" \
  -d @batch_requests.json

Where batch_requests.json might contain:

[
  {"action": "create", "resource": "user", "data": {"name": "User1"}},
  {"action": "update", "resource": "user", "id": 123, "data": {"status": "active"}}
]

Testing Your Requests

Before deploying to production, test your curl commands thoroughly:

Testing Your Requests

Before deploying to production, test your curl commands thoroughly:

  1. Use a dedicated test environment – Most APIs provide a sandbox or staging endpoint (e.g., https://api.staging.example.com/…). Never run untested requests against your live production service No workaround needed..

  2. Validate JSON before sending – Even a tiny syntax error can cause a 400 Bad Request. Run your payload through a validator:

    echo '{"username":"johndoe","password":"secret"}' | python -m json.tool
    

    If the command exits with a non‑zero status, the JSON is malformed It's one of those things that adds up. Simple as that..

  3. Inspect HTTP status codes – Always check the response code to confirm success (2xx) or diagnose issues (4xx, 5xx):

    curl -s -o /dev/null -w "%{http_code}\n" -X POST https://api.example.com/test \
      -H "Content-Type: application/json" \
      -d '{"test": true}'
    
  4. Capture and review the response body – Even when the status is 200 OK, verify that the returned data matches the expected schema. Pipe the output to a formatter:

    curl -s -X POST https://api.In real terms, example. com/test \
      -H "Content-Type: application/json" \
      -d '{"test": true}' | jq .
    
    
    
  5. Enable verbose logging for debugging – The -v flag shows request headers, timing, redirects, and the full response payload. Use it when a request fails:

    curl -v -X POST https://api.example.com/debug \
      -H "Content-Type: application/json" \
      -d '{"debug": true}'
    
  6. Automate repetitive tests – Write a small script (e.g., a Bash function or a Python script) that loops over a set of test cases, checks status codes, and asserts key fields in the response. Example Bash snippet:

    test_endpoint() {
      local url=$1; shift
      local payload=$1; shift
      local expected_status=${1:-200}
      local response
    
      response=$(curl -s -w "\nHTTPSTATUS:%{http_code}" \
          -X POST "$url" \
          -H "Content-Type: application/json" \
          -d "$payload")
      http_code=$(echo "$response" | tail -n1 | sed 's/HTTPSTATUS://')
      body=$(echo "$response" | sed '$d')
    
      if [[ "$http_code" -ne "$expected_status" ]]; then
        echo "FAIL: $url returned $http_code (expected $expected_status)"
        echo "Response: $body"
        return 1
      else
        echo "PASS: $url returned $http_code"
      fi
    }
    
  7. Keep a changelog of API calls – Document the endpoints you use, the exact JSON payload, and any observed behavior. This speeds up troubleshooting and helps teammates understand the integration.


Conclusion

Mastering curl for JSON‑based POST requests is a foundational skill for interacting with modern REST APIs. By consistently applying proper headers, validating payloads, and rigorously testing each call, you minimize runtime errors and ensure reliable integration with external services. Remember to:

  • Always set the Content-Type: application/json header.
  • Validate JSON with tools like python -m json.tool or jq.
  • Check HTTP status codes and response bodies.
  • Use verbose mode and test environments for debugging.
  • Automate repetitive checks and document your API interactions.

With these practices in place, you’ll be able to build solid, maintainable scripts that communicate effectively with any JSON‑expectant API. Happy coding!

Just Went Online

Freshly Published

See Where It Goes

Others Found Helpful

Thank you for reading about Curl Post Request With Json Body. We hope the information has been useful. Feel free to contact us if you have any questions. See you next time — don't forget to bookmark!
⌂ Back to Home