Best HTTP Clients for the Terminal
Compare HTTPie, xh, curlie and Posting: CLI and TUI HTTP clients for testing REST APIs from the terminal.
Updated
short verdict
Pick HTTPie if you want the reference implementation of the `http` syntax, or xh if you want the same syntax as a Rust binary. Pick curlie when you need curl's full option set with shorter syntax, and Posting when you want saved, versionable requests in a keyboard-driven TUI instead of one-off commands.
Sending an API request from the terminal usually means raw curl, a HTTPie-style client with a readable request syntax, or a TUI that stores requests like a GUI client does. The four tools here split along those lines. HTTPie, xh and curlie share the HTTPie request syntax but differ in implementation: Python, Rust, or a wrapper around curl. Posting is a Textual-based TUI with YAML request storage.
this page is for
- Developers who test REST endpoints from the shell and want readable, colorized output
- Teams that want API requests stored as files and committed to version control
- Users who want HTTPie syntax without giving up curl options or a single static binary
The original `http`/`https` client, with JSON handling, sessions and offline mode built in.
best for
- Everyday REST API testing
- Workflows that reuse auth and cookies across requests
strengths
- Request items like `name=John` send JSON natively, and `Authorization:'Bearer token123'` sets headers
- Persistent sessions keep state across requests
- Offline mode builds and inspects a request without sending it
- Includes wget-style downloads and proxy support
weaknesses
- Written in Python, so it needs a Python environment, unlike the Rust and Go options
- Buffers output for formatting, which curlie avoids when debugging streamed data
HTTPie's request-item syntax reimplemented in Rust, with HTTP/2 and HTTP/3 support.
best for
- Existing HTTPie users who want a faster drop-in
- Shell scripts and DevOps use across many machines
strengths
- Invoked as `http` or `https`, it runs in strict HTTPie compatibility mode
- Supports basic, bearer and digest auth, HTTP/2 and HTTP/3, and resumable downloads
- Shorthand like `:3000/users` resolves to `localhost:3000/users`, and `xhs` defaults to HTTPS
- Prints curl translations and generates shell completions
weaknesses
- Reimplements HTTPie rather than extending it, so behavior follows HTTPie's interface
- Installs from Homebrew, Cargo or Apt, not from a Python package manager
A frontend that passes requests to curl, so every curl option still works with HTTPie-style syntax.
best for
- curl users who want shorter syntax without losing options
- Debugging streamed responses
strengths
- Keeps all of curl's functionality and performance characteristics
- Formats output on the fly without buffering, which suits streamed data
- The `--curl` option shows the exact curl command it runs
- Installs via Homebrew, Scoop or `go install`
weaknesses
- Requires curl underneath
- Writes headers to stderr, not stdout, which differs from HTTPie when piping output
A TUI HTTP client that stores requests as YAML files, aimed at people who would otherwise use a GUI client.
best for
- Keeping an API request collection in Git
- Working over SSH with keyboard navigation
strengths
- Requests live in local YAML files that are easy to version control and share
- Imports curl commands, Postman collections and OpenAPI specifications
- Runs Python code before and after requests, with environment variables and templating
- Vim keybindings, jump mode, command palette, and $EDITOR/$PAGER integration
weaknesses
- Interactive only, so it does not fit one-line commands in shell scripts the way http or xh do
- Needs Python 3.13 when installed with `uv tool install --python 3.13 posting`
How to choose
The decision mostly depends on whether you work in one-off commands or in saved collections, and on what runtime you want to install.
- One-line requests with the most established syntax: HTTPie
- Speed and a compiled binary with the same syntax: xh
- Full curl option coverage and unbuffered streaming output: curlie
- Saved requests, Postman or OpenAPI import, and Git-friendly storage: Posting
- Drop-in `http` command without Python: xh in HTTPie compatibility mode
When not to use these
- You need load testing or benchmarking, since these tools send single requests and do not report on throughput
- You need a non-HTTP protocol, because none of these tools are documented as supporting one
FAQ
- What is the difference between HTTPie and xh?
- xh reimplements HTTPie's request-item syntax in Rust, with a focus on performance. When invoked as `http` or `https`, it runs in strict HTTPie compatibility mode, so it can replace HTTPie directly.
- Is there a terminal HTTP client with a GUI-style interface?
- Posting is a TUI alternative to graphical API clients. It stores requests in YAML, supports Vim keybindings, and works over SSH.
- Does curlie replace curl?
- No. Curlie runs curl underneath and adds HTTPie-style syntax and formatting. All curl options keep working, and `--curl` prints the underlying command.
- Can I import existing requests into Posting?
- Yes. Posting imports curl commands, Postman collections and OpenAPI specifications, and it can export as well.