HTTPie detects whether it’s running in a TTY. When there’s no TTY, like when Claude Code invokes it as a subprocess, HTTPie assumes stdin might have data coming and interprets the request as a POST, even if you meant a GET.

The fix is --ignore-stdin:

http --ignore-stdin GET localhost:3000/things

The catch: once you tell Claude Code to always use --ignore-stdin, it will also use it when piping data, which breaks that use case entirely:

# This will break - --ignore-stdin discards the piped body
cat payload.json | http --ignore-stdin POST localhost:3000/things

So --ignore-stdin is the right default for reads, but it needs to be dropped when actually piping stdin for writes. Worth spelling this out explicitly in your instructions to Claude Code, otherwise it’ll cargo-cult --ignore-stdin everywhere after you mention it once.