hurl(1)

πŸ“¦
version 8.1.0 Β· 3 versions
, in arch rolling

πŸ’… hurl(1) Β· Hurl Manual πŸ’…

🌸 NAME 🌸

hurl β€” run and test HTTP requests.

πŸ¦‹ SYNOPSIS πŸ¦‹

hurl [OPTIONS] [FILES...]

hurl --test [OPTIONS] [FILES...]

✨ DESCRIPTION ✨

okay so Hurl is a command line tool that runs HTTP requests defined in a simple plain text format.

It can chain requests, capture values, and evaluate queries on headers and body response. Hurl is super versatile β€” it can fetch data and test HTTP sessions: HTML content, REST / SOAP / GraphQL APIs, or any other XML / JSON based APIs. slay.

$ hurl session.hurl

If no input files are specified, input is read from stdin.

$ echo GET http://httpbin.org/get | hurl
    {
      "args": {},
      "headers": {
        "Accept": "*/*",
        "Accept-Encoding": "gzip",
        "Content-Length": "0",
        "Host": "httpbin.org",
        "User-Agent": "hurl/0.99.10",
        "X-Amzn-Trace-Id": "Root=1-5eedf4c7-520814d64e2f9249ea44e0"
      },
      "origin": "1.2.3.4",
      "url": "http://httpbin.org/get"
    }

Hurl can take files as input, or directories. In the latter case, Hurl will search files with .hurl extension recursively.

Output goes to stdout by default. To have output go to a file, use the -o, --output option:

$ hurl -o output input.hurl

By default, Hurl executes all HTTP requests and outputs the response body of the last HTTP call.

To have a test oriented output, you can use --test option:

$ hurl --test *.hurl

πŸ’– HURL FILE FORMAT πŸ’–

The Hurl file format is fully documented in https://hurl.dev/docs/hurl-file.html.

It consists of one or several HTTP requests:

GET http://example.org/endpoint1
GET http://example.org/endpoint2

πŸŽ€ Capturing values πŸŽ€

A value from an HTTP response can be re-used for successive HTTP requests.

A typical example occurs with CSRF tokens.

GET https://example.org
HTTP 200
# Capture the CSRF token value from html body.
[Captures]
csrf_token: xpath "normalize-
space(//meta[@name='_csrf_token']/@content)"

# Do the login !
POST https://example.org/login?user=toto&password=1234
X-CSRF-TOKEN: {{csrf_token}}

More information on captures can be found here https://hurl.dev/docs/capturing-response.html.

πŸŽ€ Asserts πŸŽ€

The HTTP responses defined in the Hurl file are what Hurl uses to make asserts. Responses are optional.

At the minimum, a response includes an assert on the HTTP status code:

GET http://example.org
HTTP 301

It can also include asserts on the response headers:

GET http://example.org
HTTP 301
Location: http://www.example.org

Explicit asserts can be included by combining a query and a predicate:

GET http://example.org
HTTP 301
[Asserts]
xpath "string(//title)" == "301 Moved"

With the addition of asserts, Hurl can be used as a testing tool to run scenarios.

More information on asserts can be found here https://hurl.dev/docs/asserting-response.html.

🌈 CONFIGURATION 🌈

Options that exist in curl have exactly the same semantics.

Options specified on the command line are defined for every Hurl file’s entry, except if they are tagged as cli-only (can not be defined in the Hurl request [Options] entry).

For instance:

$ hurl --location foo.hurl

will follow redirection for each entry in foo.hurl. You can also define an option only for a particular entry with an [Options] section. For instance, this Hurl file:

GET https://example.org
HTTP 301

GET https://example.org
[Options]
location: true
HTTP 200

will follow a redirection only for the second entry.

Hurl also looks for a configuration file at these spots: $XDG_CONFIG_HOME/hurl/config if $XDG_CONFIG_HOME exists, or $HOME/.config/hurl/config. The configuration file is a list of options added to each Hurl run.

$ cat ~/.config/hurl/config
# Hurl config file
--header x-identifier:quux
--verbose
--delay=1s
--fail-with-body

Most of the options can also be defined with environment variables (like HURL_INSECURE for --insecure). So, in order to configure Hurl, there are four sources from the lowest priority to highest (overrides all others):

  • Configuration file (ex: ~/.config/hurl/config)
  • Environment variables (ex: export HURL_INSECURE=true)
  • Command-line options (ex: hurl --insecure)
  • Options section options (ex: insecure: true in file)

πŸ‘‘ ALL OPTIONS πŸ‘‘

πŸ”₯ HTTP options πŸ”₯

  • --aws-sigv4 <PROVIDER1[:PROVIDER2[:REGION[:SERVICE]]]> β€” Generate an Authorization header with an AWS SigV4 signature. Use -u, --user to specify Access Key Id (username) and Secret Key (password). To use temporary session credentials (e.g. for an AWS IAM Role), add the X-Amz-Security-Token header containing the session token.
  • --cacert <FILE> β€” Specifies the certificate file for peer verification. The file may contain multiple CA certificates and must be in PEM format. Normally Hurl is built to use a default file for this, so this option is typically used to alter that default file.
  • -E, --cert <CERTIFICATE[:PASSWORD]> β€” Client certificate file and password. See also --key.
  • --compressed β€” Request a compressed response using one of the algorithms br, gzip, deflate and automatically decompress the content. Environment variables: HURL_COMPRESSED.
  • --connect-timeout <SECONDS> β€” Maximum time in seconds that you allow Hurl’s connection to take. You can specify time units in the connect timeout expression. Set Hurl to use a connect timeout of 20 seconds with --connect-timeout 20s or set it to 35,000 milliseconds with --connect-timeout 35000ms. No spaces allowed. See also -m, --max-time. Environment variables: HURL_CONNECT_TIMEOUT.
  • --connect-to <HOST1:PORT1:HOST2:PORT2> β€” For a request to the given HOST1:PORT1 pair, connect to HOST2:PORT2 instead. This option can be used several times in a command line. See also --resolve.
  • --digest β€” Tell Hurl to use HTTP Digest authentication.
  • -H, --header <NAME:VALUE> β€” Add an extra header to include in information sent. Can be used several times in a command. Do not add newlines or carriage returns. Environment variables: HURL_HEADER='name1:value1|name2:value2' (headers are separated by |).
  • -0, --http1.0 β€” Tells Hurl to use HTTP version 1.0 instead of using its internally preferred HTTP version. Environment variables: HURL_HTTP10.
  • --http1.1 β€” Tells Hurl to use HTTP version 1.1. Environment variables: HURL_HTTP11.
  • --http2 β€” Tells Hurl to use HTTP version 2. For HTTPS, this means Hurl negotiates HTTP/2 in the TLS handshake. Hurl does this by default. For HTTP, this means Hurl attempts to upgrade the request to HTTP/2 using the Upgrade: request header. Environment variables: HURL_HTTP2.
  • --http2-prior-knowledge β€” Tells Hurl to issue a non-TLS HTTP request using HTTP/2 directly without HTTP/1.1 Upgrade. It requires prior knowledge that the server supports HTTP/2 straight away. HTTPS requests still do HTTP/2 the standard way with negotiated protocol versions in the TLS handshake. Environment variables: HURL_HTTP2_PRIOR_KNOWLEDGE.
  • --http3 β€” Tells Hurl to try HTTP version 3 to the host in the URL, but fallback to earlier HTTP versions if the HTTP/3 connection establishment fails. HTTP/3 is only available for HTTPS and not for HTTP URLs. Environment variables: HURL_HTTP3.
  • -k, --insecure β€” This option explicitly allows Hurl to perform "insecure" SSL connections and transfers. Environment variables: HURL_INSECURE.
  • -4, --ipv4 β€” This option tells Hurl to use IPv4 addresses only when resolving host names, and not for example try IPv6. Environment variables: HURL_IPV4.
  • -6, --ipv6 β€” This option tells Hurl to use IPv6 addresses only when resolving host names, and not for example try IPv4. Environment variables: HURL_IPV6.
  • --key <KEY> β€” Private key file name.
  • --limit-rate <SPEED> β€” Specify the maximum transfer rate you want Hurl to use, for both downloads and uploads. This feature is useful if you have a limited pipe and you would like your transfer not to use your entire bandwidth. To make it slower than it otherwise would be. The given speed is measured in bytes/second. Environment variables: HURL_LIMIT_RATE.
  • -L, --location β€” Follow redirect. To limit the amount of redirects to follow use the --max-redirs option. Environment variables: HURL_LOCATION.
  • --location-trusted β€” Like -L, --location, but allows sending the name + password to all hosts that the site may redirect to. This may or may not introduce a security breach if the site redirects you to a site to which you send your authentication info (which is plaintext in the case of HTTP Basic authentication). Environment variables: HURL_LOCATION_TRUSTED.
  • --max-filesize <BYTES> β€” Specify the maximum size in bytes of a file to download. If the file requested is larger than this value, the transfer does not start. Environment variables: HURL_MAX_FILESIZE. This is a cli-only option.
  • --max-redirs <NUM> β€” Set maximum number of redirection-followings allowed. By default, the limit is set to 50 redirections. Set this option to -1 to make it unlimited. Environment variables: HURL_MAX_REDIRS.
  • -m, --max-time <SECONDS> β€” Maximum time in seconds that you allow a request/response to take. This is the standard timeout. You can specify time units in the maximum time expression. Set Hurl to use a maximum time of 20 seconds with --max-time 20s or set it to 35,000 milliseconds with --max-time 35000ms. No spaces allowed. See also --connect-timeout. Environment variables: HURL_MAX_TIME.
  • --negotiate β€” Tell Hurl to use Negotiate (SPNEGO) authentication.
  • --no-cookie-store β€” the page gives no description for this one, so we’re not inventing anything πŸ‘€.
  • --no-cookie-store β€” bestie, this one says no cookies for you πŸͺπŸ™…β€β™€οΈ. It kills cookie storage for the requests/responses inside a file. By default, all the requests in the same Hurl file share cookie storage β€” this option deactivates the cookie engine entirely.

Environment variables: HURL_NO_COOKIE_STORE

This is a cli-only option.

  • --no-header <NAME> β€” yeets a header out of the info being sent πŸ—‘οΈ. You can stack it, use it several times in one command, no problem.

Environment variables: HURL_NO_HEADER='name1|name2' (the names are separated by |)

  • --no-proxy <HOST(S)> β€” a comma-separated list of hosts that do not go through a proxy 🚫.

Environment variables: no_proxy

This is a cli-only option.

  • --ntlm β€” tells Hurl to use NTLM authentication πŸ”.
  • --path-as-is β€” tells Hurl to not mess with sequences of /../ or /./ in the given URL path. Normally Hurl squashes or merges them according to standards, but with this option you're literally telling it to leave them alone πŸ™ˆ.
  • --pinnedpubkey <HASHES> β€” okay so when negotiating a TLS or SSL connection, the server sends a certificate saying "this is me πŸ’β€β™€οΈ". A public key gets extracted from that certificate, and if it doesn't exactly match the public key you handed to this option, Hurl aborts the connection before sending or receiving any data. Zero data exchanged, periodt πŸ”₯.
  • -x, --proxy <[PROTOCOL://]HOST[:PORT]> β€” use the specified proxy πŸ›°οΈ.

Environment variables: http_proxy https_proxy all_proxy

  • --proxy-header <HEADER> β€” an extra header to include in the request when it's being sent to a proxy πŸŽ€. These headers are only applied when a proxy is involved; if Hurl connects directly to the target server, they're ignored. Rude but true.

Environment variables: HURL_PROXY_HEADER='name1:value1|name2:value2' (headers are separated by |)

This is a cli-only option.

  • --resolve <HOST:PORT:ADDR> β€” gives you a custom address for a specific host + port pair πŸ’…. Using this, you can make the Hurl request(s) use the address you picked and stop the normally-resolved address from being used. Think of it as a little /etc/hosts alternative right there on the command line, iykyk.
  • --ssl-no-revoke β€” (Windows πŸͺŸ) this tells Hurl to disable certificate revocation checks.
⚠️ WARNING: this option loosens the SSL security, and by using this flag you are asking for exactly that. No cap, it's less safe.

This is a cli-only option.

  • --tls-max <VERSION> β€” sets the maximum allowed TLS version 🧚. If the connection is done without TLS, this option has no effect β€” and yes, that includes QUIC-using (HTTP/3) transfers.
    • default β€” Use up to the recommended TLS version.
    • 1.0 β€” Use up to TLSv1.0.
    • 1.1 β€” Use up to TLSv1.1.
    • 1.2 β€” Use up to TLSv1.2.
    • 1.3 β€” Use up to TLSv1.3.

Environment variables: HURL_TLS_MAX

  • --tls-min <VERSION> β€” sets the minimum allowed TLS version 🌸. Same deal β€” if the connection is done without TLS, this option has no effect, and that includes QUIC-using (HTTP/3) transfers.
    • default β€” Use down to the recommended TLS version.
    • 1.0 β€” Use down to TLSv1.0.
    • 1.1 β€” Use down to TLSv1.1.
    • 1.2 β€” Use down to TLSv1.2.
    • 1.3 β€” Use down to TLSv1.3.

Environment variables: HURL_TLS_MIN

  • --unix-socket <PATH> β€” (HTTP) connect through this Unix domain socket instead of using the network πŸ”Œ.
  • -u, --user <USER:PASSWORD> β€” adds a basic Authentication header to each request πŸ”‘.

Environment variables: HURL_USER

  • -A, --user-agent <NAME> β€” specifies the User-Agent string to send to the HTTP server πŸ•΅οΈβ€β™€οΈ.

Environment variables: HURL_USER_AGENT

This is a cli-only option.


πŸŽ€ Output options πŸŽ€

  • --color β€” colorizes standard output and standard error 🌈.

By default, Hurl outputs a prettified and colorized response. But when redirected through pipes, the standard streams are not colorized β€” so this option forces the color back on. Slay.

Environment variables: HURL_COLOR

This is a cli-only option.

  • --curl <FILE> β€” exports each request to a list of curl commands πŸ“. Iconic for when you need to hand a repro to someone.

This is a cli-only option.

  • --error-format <FORMAT> β€” controls the format of the error message (short by default, or long) 😭. When using long, the response body is logged whenever there are errors.

Environment variables: HURL_ERROR_FORMAT

This is a cli-only option.

  • --fail-with-body β€” outputs the body response on standard output if there are any errors πŸ’€. By default, Hurl only outputs the last body response on standard output when a run is successful. So like… this is the "show me the damage anyway" button.

Environment variables: HURL_FAIL_WITH_BODY

  • -i, --include β€” includes the HTTP headers in the output πŸ“‹.

This is a cli-only option.

  • --json β€” outputs each Hurl file result to JSON ✨. The format is very close to HAR format.

This is a cli-only option.

  • --no-color β€” do not colorize standard output nor standard error 🚫🌈.

Environment variables: HURL_NO_COLOR NO_COLOR

This is a cli-only option.

  • --no-output β€” suppresses output entirely 🀐. By default, Hurl outputs the body of the last response.

Environment variables: HURL_NO_OUTPUT

This is a cli-only option.

  • --no-pretty β€” do not prettify response output for supported content types (JSON only for the moment πŸ™ƒ). By default, output is prettified if standard output is a terminal.

Environment variables: HURL_NO_PRETTY

This is a cli-only option.

  • -o, --output <FILE> β€” writes output to FILE instead of stdout πŸ“. Use '-' for stdout in [Options] sections.
  • --pretty β€” prettifies response output for supported content types (JSON only for the moment πŸ’–). By default, a JSON response is prettified if standard output is a terminal, and colorized β€” see --no-color to format without color.

Environment variables: HURL_PRETTY

This is a cli-only option.

  • --progress-bar β€” displays a progress bar in test mode πŸ“Š. The progress bar is displayed only in interactive TTYs, and this option forces it to show up even in non-interactive TTYs.

This is a cli-only option.

  • -v, --verbose β€” turns on verbose output on the standard error stream πŸ—£οΈ. Super useful for debugging.

A line starting with '>' means data sent by Hurl. A line starting with '<' means data received by Hurl. A line starting with '*' means additional info provided by Hurl.

If you only want HTTP headers in the output, -i, --include might be the option you're looking for πŸ‘€.

Environment variables: HURL_VERBOSE

  • --verbosity <LEVEL> β€” sets the verbosity level for debug logs on the standard error stream (brief, verbose or debug) πŸ”.

If you only want HTTP headers in the output, -i, --include might be the option you're looking for. -v, --verbose is an alias for --verbosity verbose, and --very-verbose is an alias for --verbosity debug.

Environment variables: HURL_VERBOSITY

  • --very-verbose β€” turns on more verbose output on the standard error stream 🫣.

In contrast to the --verbose option, this option outputs the full HTTP body request and response on standard error. In addition, lines starting with '**' are libcurl debug logs. It's giving maximal chaos and I love it.

Environment variables: HURL_VERY_VERBOSE


πŸ‘‘ Run options πŸ‘‘

  • --continue-on-error β€” keeps executing requests all the way to the end of the Hurl file even when an assert error occurs πŸƒβ€β™€οΈπŸ’¨. By default, Hurl exits after an assert error in the HTTP response.

Note that this option does not affect the behavior with multiple input Hurl files πŸ“š.

All the input files are executed independently. The result of one file does not affect the execution of the other Hurl files.

Environment variables: HURL_CONTINUE_ON_ERROR

This is a cli-only option.

  • --delay <MILLISECONDS> β€” sets a delay before each request (aka sleep 😴). The delay is not applied to requests that have been retried because of --retry β€” see --retry-interval to space out retried requests.

You can specify time units in the delay expression, bestie ✨. Set Hurl to use a delay of 2 seconds with --delay 2s or set it to 500 milliseconds with --delay 500ms. Supported time units: ms, s, m, h. No spaces allowed 🚫.

Environment variables: HURL_DELAY

  • --from-entry <ENTRY_NUMBER> β€” executes the Hurl file starting from ENTRY_NUMBER (counting starts at 1) πŸ”’.

This is a cli-only option.

  • --jobs <NUM> β€” the maximum number of parallel jobs in parallel mode πŸ§‘β€πŸ€β€πŸ§‘. The default value corresponds (in most cases) to the current amount of CPUs. Set it to 1 to disable parallel execution of files.

See also --parallel.

Environment variables: HURL_JOBS

This is a cli-only option.

  • --no-assert β€” ignores all the asserts defined in the Hurl file πŸ™ˆ. Like, all of them. Zero checks, zero notes.

Environment variables: HURL_NO_ASSERT

This is a cli-only option.

  • --no-jsonpath-coercion β€” disables JSONPath result coercion πŸͺ„.

By default, when JSONPath coercion is enabled, empty JSONPath results are returned as no value and single JSONPath results are returned as a scalar value. With this option, JSONPath results are always returned as arrays. Consistency queen.

Environment variables: HURL_NO_JSONPATH_COERCION

  • --parallel β€” runs files in parallel πŸŽοΈπŸ’¨.

Each Hurl file is executed in its own worker thread, without sharing anything with the other workers. The default run mode is sequential. Parallel execution is the default in --test mode.

See also --jobs.

This is a cli-only option.

  • --repeat <NUM> β€” repeats the input files sequence NUM times, and -1 for an infinite loop ♾️. Given a.hurl, b.hurl, c.hurl as input, repeat two times will run a.hurl, b.hurl, c.hurl, a.hurl, b.hurl, c.hurl.
  • --retry <NUM> β€” maximum number of retries, 0 for no retries, -1 for unlimited retries πŸ”. A retry happens if any error occurs (asserts, captures, runtimes, etc…).

Environment variables: HURL_RETRY

  • --retry-interval <MILLISECONDS> β€” duration in milliseconds between each retry ⏱️. The default is 1000 ms.

You can specify time units in the retry interval expression too 🌸. Set Hurl to use a retry interval of 2 seconds with --retry-interval 2s or set it to 500 milliseconds with --retry-interval 500ms. No spaces allowed 🚫.

  • Environment variables: HURL_RETRY_INTERVAL
  • --secret <NAME=VALUE> β€” defines a secret value that gets redacted from logs and reports πŸ•΅οΈβ€β™€οΈ once it's defined, you can use that secret as a variable literally everywhere variables are allowed. so iconic.
    • Environment variables: HURL_SECRET_name
    • cli-only option, no cap πŸ’…
  • --secrets-file <FILE> β€” points to a secrets file where you define all your secrets at once πŸŽ€ each secret is written as name=value, exactly like you'd do with --secret.
    • heads up bestie: defining the same secret twice throws an error 😭
    • cli-only option ✨
  • --test β€” turns on test mode πŸ§ͺ and here's what changes: the HTTP response is not outputted anymore, progress gets reported for each Hurl file tested, and a text summary pops up once all files have run. very demure, very testy.
    • in test mode, files run in parallel ⚑ want it sequential? use --jobs 1.
    • See also --jobs.
    • Environment variables: HURL_TEST
    • cli-only option 🌸
  • --to-entry <ENTRY_NUMBER> β€” runs the Hurl file up to ENTRY_NUMBER (counting starts at 1 πŸ₯Ί) and ignores the rest of the file. perfect for debugging a session, lowkey a lifesaver.
    • cli-only option πŸ”₯
  • --variable <NAME=VALUE> β€” defines a variable (name/value) for use in Hurl templates ✨
    • Environment variables: HURL_VARIABLE_name
  • --variables-file <FILE> β€” sets a properties file where you define your variables πŸŽ€ each one is written as name=value, exactly like with --variable.
    • note: defining the same variable twice produces an error 😭
    • cli-only option πŸ’œ

πŸŽ€ Report options πŸŽ€

  • --report-html <DIR> β€” generates an HTML report in DIR 🌈 if the HTML report already exists, it gets updated with the new test results. no deleting, just vibes.
    • cli-only option ✨
  • --report-json <DIR> β€” generates a JSON report in DIR πŸ¦‹ if the JSON report already exists, it gets updated with the new test results.
    • cli-only option ✨
  • --report-junit <FILE> β€” generates a JUnit file πŸ‘‘ if the FILE report already exists, it gets updated with the new test results.
    • cli-only option ✨
  • --report-tap <FILE> β€” generates a TAP report πŸ’… if the FILE report already exists, it gets updated with the new test results.
    • cli-only option ✨

πŸ“ Other options πŸ“

  • -b, --cookie <FILE> β€” reads cookies from FILE (Netscape cookie file format, the classic πŸͺ). combine it with -c, --cookie-jar and you can simulate a whole cookie storage between successive Hurl runs. main character cookie behaviour.
    • cli-only option πŸ’œ
  • -c, --cookie-jar <FILE> β€” writes cookies to FILE after the session runs, using the Netscape cookie file format πŸͺ combine it with -b, --cookie and you can simulate a cookie storage between successive Hurl runs.
    • cli-only option πŸ’œ
  • --file-root <DIR> β€” sets the root directory for importing files in Hurl πŸ“ this covers files in multipart form data, request body and response output. if you don't define it explicitly, files are relative to the Hurl file's directory.
    • cli-only option 🌸
  • --glob <GLOB> β€” specifies input files matching the given glob pattern ✨ multiple glob flags are allowed. it supports common Unix glob patterns like *, ? and [].
⚠️ real talk: so your shell doesn't expand glob patterns before Hurl gets to handle them, you must wrap each pattern in single quotes or double quotes. don't let bash steal your moment πŸ’€
  • cli-only option πŸ¦‹
  • -n, --netrc β€” scans the .netrc file in the user's home directory for the username and password πŸ”
    • See also --netrc-file and --netrc-optional.
  • --netrc-file <FILE> β€” like --netrc, but you provide the path to the netrc file yourself 🫢
    • See also --netrc-optional.
  • --netrc-optional β€” similar to --netrc, but makes the .netrc usage optional 🌈
    • See also --netrc-file.
  • -h, --help β€” usage help πŸ₯Ί lists all current command line options with a short description.
  • -V, --version β€” prints version information πŸ‘‘

πŸ’€ EXIT CODES πŸ’€

  • 0 β€” success πŸŽ‰ slay.
  • 1 β€” failed to parse command-line options 😭
  • 2 β€” input file parsing error πŸ™ˆ
  • 3 β€” runtime error (such as failure to connect to host) πŸ’€
  • 4 β€” assert error πŸ”₯

🌈 WWW 🌈

https://hurl.dev


⭐ SEE ALSO ⭐

curl(1) hurlfmt(1)


and that's the whole page bestie, you ate it πŸ’… this was hurl 8.1.0, dated 27 Oct 2026 β€” go be iconic with it πŸŽ€βœ¨πŸ¦‹

πŸ“¦ where this page comes from