How to install HTTPie CLI: GET and POST examples, headers, JSON body, vs curl
Install http, run GET/POST with JSON, and map commands to curl.
curl can do everything, but flags pile up fast. HTTPie (the http command) uses readable syntax for GET/POST, headers, and JSON bodies, with pretty-printed responses by default. This guide covers install on macOS/Linux/Windows, GET and POST examples, custom headers and JSON payloads, and a curl comparison for hereink readers who debug APIs from the terminal.
The query is how to install HTTPie CLI and send GET POST JSON requests. You should finish with http installed, a first GET to a public endpoint, a JSON POST, and the curl equivalents in mind.
What HTTPie fixes
Readable CLI HTTP
http GET api.example.com/users separates method, URL, and options; JSON responses are colorized and indented without juggling -H and -d order.
Pairs with jq
Pipe http GET … | jq '.data' to keep only the fields you need. Our jq guide covers transforms; HTTPie covers sending the request.
Upstream:
github.com/httpie/cli, docs athttpie.io/docs/cli. Runhttp --versionafter install.
Install HTTPie
- 1macOS (Homebrew)
brew install httpie. Verify withwhich httpandhttp --version. - 2Linux (packages or pip)
Debian/Ubuntu:
sudo apt update && sudo apt install httpie. Fedora:sudo dnf install httpie. Generic:python3 -m pip install --user httpie; ensure~/.local/binis onPATH. - 3Windows
winget install httpie.httpieorpip install httpie. Open a new terminal and runhttp --version. - 4First GET
http GET https://httpbin.org/getshould return JSON mirroring your request headers.
GET and query parameters
http GET https://httpbin.org/get
http GET https://httpbin.org/get page==2 limit==10
http --body GET https://httpbin.org/uuid
http --follow GET https://httpbin.org/redirect/1Omitting the method defaults to GET. For raw downloads or low-level HTTP, curl still wins; for JSON APIs, start with http.
POST and JSON body
http POST https://httpbin.org/post name=Ada role=admin
http POST https://httpbin.org/post tags:='["go","rust"]'
http POST https://httpbin.org/post < payload.json
http --form POST https://httpbin.org/post email=test@example.com= sends string fields; := sends JSON literals. Test against httpbin or staging before hitting production.
Custom headers
http GET https://httpbin.org/headers Authorization:"Bearer YOUR_TOKEN" Accept:application/json
http GET api.example.com/v1/me X-Api-Key:xxx User-Agent:my-cli/1.0
http --download GET https://example.com/file.zipHTTPie vs curl
| Goal | HTTPie | curl |
|---|---|---|
| GET JSON | http GET https://httpbin.org/get | curl -s https://httpbin.org/get | jq . |
| Query string | http GET url q==search | curl -s 'url?q=search' |
| POST JSON | http POST url name=Ada | curl -s -X POST -H 'Content-Type: application/json' -d '{"name":"Ada"}' url |
| Header | http GET url Authorization:"Bearer x" | curl -s -H 'Authorization: Bearer x' url |
| Body only | http --body GET url | curl -s url |
| Multipart | http --form POST url file@./a.png | curl -F file=@./a.png url |
- Fits
- Manual API exploration, copy-paste examples in READMEs, JSON debugging beside jq and ripgrep.
- Does not fit
- Complex OAuth device flows, client-cert TLS, or reproducing full browser cookie jars—use curl or a dedicated client.
http or httpie command?
Package name is often httpie; the binary is http (and https). Run http --help.
Script-friendly output?
Use --body or --print=b, then pipe to jq. Add --check-status when exit codes must reflect HTTP status (see docs).
Replace curl entirely?
Use HTTPie for daily JSON REST; keep curl for legacy scripts, health checks, and edge protocols. Both on PATH is fine.
After the API sketch, align on one board
Once endpoints make sense in the terminal, service boundaries still belong on a shared canvas. See how to create a space.