Skip to content

Instantly share code, notes, and snippets.

@ungoldman
Last active July 13, 2026 02:13
Show Gist options
  • Select an option

  • Save ungoldman/11282441 to your computer and use it in GitHub Desktop.

Select an option

Save ungoldman/11282441 to your computer and use it in GitHub Desktop.
post a JSON file with curl

How do you POST a JSON file with curl??

You can post a json file with curl like so:

curl -X POST -H "Content-Type: application/json" -d @FILENAME DESTINATION

so for example:

curl -X POST -H "Content-Type: application/json" -d @../data/cats.json http://localhost:8080/mSfvMwNAfj

you can post a little blob of geojson, like so:

curl -X POST -H "Content-Type: application/json" -d '{"type":"Feature","properties":{"COUNTY":"M","PRECINCT":4505.0,"AREA":24330472.48801},"geometry":{"type":"Polygon","coordinates":[[[-122.579029970781065,45.53373981165327],[-122.579036751674209,45.533742065313575],[-122.579532751335037,45.533906068395808],[-122.579961749295705,45.534067060396104],[-122.580146749064056,45.534114065074704],[-122.581902757566823,45.534772060883959],[-122.582770766094569,45.535128058282019],[-122.583461773870638,45.535383050711246],[-122.584275765662781,45.535596050402262],[-122.584926770675438,45.535732043153857],[-122.585534768605342,45.535823041352423],[-122.586393777046183,45.535863042628513],[-122.586845771939593,45.535841037753478],[-122.587166778711079,45.535850042847976],[-122.587593783117342,45.535829037919441],[-122.587900782381638,45.535804036638346],[-122.588290773918729,45.535750036812139],[-122.588704782064923,45.535671034778389],[-122.589196776268082,45.535561035548149],[-122.589239647326053,45.535550318867173],[-122.589320708749753,45.536124484404517],[-122.589304695035338,45.537268231315537],[-122.59947923271595,45.53740953002616],[-122.599372142997979,45.537656509885132],[-122.601520781310597,45.537617244011571],[-122.601391421360532,45.543541079913162],[-122.578671442407,45.552336859399695],[-122.578672106607101,45.55230042862145],[-122.578693794893084,45.551092987187559],[-122.578713188347777,45.549969468845575],[-122.579029970781065,45.53373981165327]]]}}' http://localhost:8080/mSfvMwNAfj

Don't try to post a big blob, your terminal will hate you and you will hate yourself. It will go on forever and ever.

Use the syntax above (curl -X POST -H "Content-Type: application/json" -d @FILENAME DESTINATION) to specify a file instead.

@laduke

laduke commented Sep 28, 2021

Copy link
Copy Markdown

I googled "curl post json file" and this is the #1 hit 🤙

@roneygomes

Copy link
Copy Markdown

Many thanks!

@Gerst20051

Gerst20051 commented Mar 3, 2022

Copy link
Copy Markdown

You can cat the contents of a json file to curl via the --data-raw parameter

curl https://api.com/route -H 'Content-Type: application/json' --data-raw "$(cat ~/.json/payload-2022-03-03.json | grep -v '^\s*//')"

curl https://api.com/route -H 'Content-Type: application/json' -d @<(jq . ~/.json/payload-2022-03-03.json)

curl https://api.com/route -H 'Content-Type: application/json' -d @<(jq '{"payload": .}' < ~/.json/payload-2022-03-03.json)

Note: comments in the json file are filtered out via grep -v '^\s*//'

You can also pass the data to curl via stdin using grep or cat or jq

grep -v '^\s*//' ~/.json/payload-2022-03-03.json | curl https://api.com/route -H 'Content-Type: application/json' -d @-

cat ~/.json/payload-2022-03-03.json | grep -v '^\s*//' | curl https://api.com/route -H 'Content-Type: application/json' -d @-

jq . ~/.json/payload-2022-03-03.json | curl https://api.com/route -H 'Content-Type: application/json' -d @-

jq '{"payload": .}' < ~/.json/payload-2022-03-03.json | curl https://api.com/route -H 'Content-Type: application/json' -d @-

link to my stackoverflow answer

@moyamos

moyamos commented Jul 13, 2022

Copy link
Copy Markdown

Is it possible to insert data from a file in an already existing JSON structure like this?

curl -X POST --data "{\"data\":@./test.json, \"id\": 10}" DESTINATION

@laduke

laduke commented Jul 13, 2022

Copy link
Copy Markdown

Maybe run it through jq then pipe like in Gerst20051's previous reply

jq '{"data": .}' <./test.json | curl ...

i haven't tried it
https://stackoverflow.com/a/57438049

@moyamos

moyamos commented Jul 16, 2022

Copy link
Copy Markdown

@laduke Thank you. It works!

@ehsanashar

Copy link
Copy Markdown

What if I want to post a file(csv) along with json data? Is that possible? If so how can I do that? Ex:

curl --location --request POST 'abc.com/upload'
--header 'Authorization: Bearer '
--header 'Content-Type: application/json'
--data-raw '{
"user": {"email":"abx@xyz.com"},
"options": {"process":"order_lines","selection":"price","tolerance":"loose","target":"transport_orders"},
"import_file": "/path/to/file.csv"
}'

I want to achieve something like this, how can I do this?

@roneygomes

Copy link
Copy Markdown

@ehsanashar you want the JSON to contain the entire contents of the CSV under the import_file key? I'm not sure you can do that with cURL alone but it shouldn't be very dificult to glue a few shell commands together and achieve the same result.

@weimengxi

Copy link
Copy Markdown

Thanks a lot!

@san9dev

san9dev commented Nov 20, 2023

Copy link
Copy Markdown

What if I want to post a file(csv) along with json data? Is that possible? If so how can I do that? Ex:

curl --location --request POST 'abc.com/upload' --header 'Authorization: Bearer ' --header 'Content-Type: application/json' --data-raw '{ "user": {"email":"abx@xyz.com"}, "options": {"process":"order_lines","selection":"price","tolerance":"loose","target":"transport_orders"}, "import_file": "/path/to/file.csv" }'

I want to achieve something like this, how can I do this?

@ehsanashar if you use linux or macos try this in terminal:

curl -X POST 'http://localhost:3000/admin/news' \
-H 'Authorization: Bearer some.token.here'
-H 'Content-Type: application/json' \
-d '{"user": {"email":"[abx@xyz.com](mailto:abx@xyz.com)"}, \
"options": {"process":"order_lines","selection":"price","tolerance":"loose","target":"transport_orders"}, \
"import_file": "@/path/to/file.csv"}'

@JaSei

JaSei commented Dec 4, 2023

Copy link
Copy Markdown

Btw. curl supports json directly

from man curl:

--json
(HTTP) Sends the specified JSON data in a POST request to the HTTP server. --json works as a shortcut for passing on these three options:

           --data [arg]
           --header "Content-Type: application/json"
           --header "Accept: application/json"

          There is no verification that the passed in data is actual JSON or that the syntax is correct.

          If you start the data with the letter @, the rest should be a file name to read the data from, or a single dash (-) if you want curl to read the data from stdin. Posting data from a file named 'foobar' would thus be done with --json @foobar and to instead read the data from stdin, use --json @-.

          If this option is used more than once on the same command line, the additional data pieces will be concatenated to the previous before sending.

          The headers this option sets can be overridden with -H, --header as usual.

          --json can be used several times in a command line

          Examples:
           curl --json '{ "drink": "coffe" }' https://example.com
           curl --json '{ "drink":' --json ' "coffe" }' https://example.com
           curl --json @prepared https://example.com
           curl --json @- https://example.com < json.txt

          See also --data-binary and --data-raw. This option is mutually exclusive to -F, --form and -I, --head and -T, --upload-file. Added in 7.82.0.

@ungoldman

Copy link
Copy Markdown
Author

@JaSei this is true as of v7.82.0! That feature was released 2022-03-05, so older systems may still benefit from this older advice. 👴

refs:

@thejimbirch

Copy link
Copy Markdown

Thanks, this worked for loading a local file.

curl -X POST -H "Content-Type: application/json" -d @../data/cats.json

@newsworthy39

Copy link
Copy Markdown

I had completely forgotten about the -d @ flag. Thanks!

@lucianozablocki

Copy link
Copy Markdown

thanks man!!

@krono

krono commented Sep 17, 2024

Copy link
Copy Markdown

Why is all that -X POST? --data aka -d automatically makes a POST Request.

So curl -X POST -H "Content-Type: application/json" -d @FILENAME DESTINATION is the same as

curl -H "Content-Type: application/json" -d @FILENAME DESTINATION

Also, new curl (>7.82.x) has --json for exactly that now:

curl --json @FILENAME DESTINATION

@TheStalke

Copy link
Copy Markdown

bro, Thank you

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment