Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Some links on this page are affiliate links: if you buy through them we may earn a commission, at no extra cost to you.

Use curl’s built-in --parallel option (or its short form, -Z) to run multiple transfers concurrently in one invocation. Give each response its own output destination, and set --parallel-max when you need to cap the number of transfers running at once.

For example, this downloads two pages concurrently:

curl --parallel 
  https://example.com/one -o one.html 
  https://example.com/two -o two.html

Run a fixed set of URLs with curl

Put --parallel before the URLs, then assign each response a distinct output file with -o. Curl schedules the transfers concurrently and starts further transfers as earlier ones finish. Merely listing several URLs does not request parallel operation; add --parallel when concurrency is what you want. See the curl man page for the option’s current documented behavior.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
curl --parallel 
  https://api.example.test/a -o a.json 
  https://api.example.test/b -o b.json 
  https://api.example.test/c -o c.json

Replace the example host and paths with the endpoints you are authorized to access. Naming each output makes it clear which response belongs to which URL and avoids accidentally directing multiple bodies to one file.

Limit how many transfers run at once

Use --parallel-max N to cap the number of simultaneous transfers:

curl --parallel --parallel-max 4 
  https://api.example.test/a -o a.json 
  https://api.example.test/b -o b.json 
  https://api.example.test/c -o c.json 
  https://api.example.test/d -o d.json 
  https://api.example.test/e -o e.json

The curl project’s current online manual documents a default maximum of 50 simultaneous transfers when parallel mode is used, and a supported maximum setting of 65,535. Those are configuration limits, not sensible targets for every batch. Choose a lower value if the service has rate or concurrency policies, or if local memory, sockets, or bandwidth are constrained. The manual also describes --parallel-max as global across the command line, including option groups separated by --next.

Handle requests with different methods or data

curl options apply to the URL group they precede. Use --next to end one group and start another, resetting method and POST-data state for the next group. Add --parallel separately if the groups should run concurrently. The curl HTTP scripting guide explains how multiple URLs and --next work.

What’s actually slowing this PC down?

Pick the symptom - the matching free tool is one click away.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
curl --parallel 
  -I https://example.test/status 
  --next 
  -d 'name=curl' https://example.test/submit

This example sends a HEAD request to the first URL and a form-encoded POST to the second. It is a command structure to adapt, not a recommendation to submit arbitrary data to a real endpoint. Supply the method, headers, and body each endpoint expects, and consider where response bodies should go if you need to retain them.

Be deliberate with redirects and custom methods

If you combine --request with --location, review the redirect behavior before relying on it. The current curl man page warns that a method string specified with --request is used for all requests; depending on redirect status and curl’s method handling, that can produce unintended follow-up requests. Check the endpoint’s redirect behavior and the exact command rather than assuming the method will change as desired.

Rank #2
Sale
Curly Girl: The Handbook
  • Workman publishing
  • Binding: paperback
  • Language: english

Download a generated list with GNU Parallel

For a list of URLs, or when each item needs its own curl process and custom shell work, GNU Parallel can read jobs from standard input. This example assigns a numbered output filename to each item:

printf '%sn' 'https://example.test/a' 'https://example.test/b' |
  parallel -j 4 curl -fsS {} -o '{#}.body'

Here, -j 4 limits GNU Parallel to four jobs at a time, {} stands for the current input item, and {#} is its job number. The flags -f and -sS ask curl to fail on HTTP errors and keep normal progress output quiet while still showing errors. The GNU Parallel documentation describes URL lists as a typical input and documents its job controls.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Use this as a starting pattern, not a safe parser for every possible URL list. If URLs come from a file or another program, make sure its format and quoting are suitable for the shell and GNU Parallel. Choose output names that cannot collide. GNU Parallel can preserve output ordering, but ordered display does not make concurrent writes to the same file safe.

Choose between curl parallel mode and GNU Parallel

Approach Best fit Concurrency control Trade-off
curl --parallel A fixed group of transfers managed in one curl process --parallel-max; a per-host cap is available on supporting versions Compact command and curl-managed transfer scheduling, but less room for per-URL shell logic
GNU Parallel with curl A URL list, per-item command template, or job-by-job shell workflow GNU Parallel’s job count, such as -j 4 More flexible orchestration, with separate processes and additional quoting and output-handling concerns

Decide based on whether the URL set is fixed or generated, whether requests share options and data, whether each item needs extra shell processing, how you want to name and log outputs, and which tool versions are installed. Neither approach is universally faster; the choice here is about workflow and control.

Check curl version and connection options

Confirm the executable and version available in your environment:

curl --version

The curl man page records --parallel as added in 7.66.0 and --parallel-immediate in 7.68.0. The latter asks curl to prefer opening additional connections immediately instead of waiting to multiplex more streams over an existing connection. It can change connection behavior, so use it only when that is what you intend.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

The per-host option --parallel-max-host was added in 8.16.0. The current manual says it limits concurrent connections to the same protocol, hostname, and port, with a default of 0 (unlimited). For compatibility-sensitive scripts, also check curl --help all or the installed manual; not every machine has the same curl release as the online documentation.

Performance, reliability, and cost considerations

Concurrency can reduce waiting, but is not a guarantee of faster completion

Parallel transfers overlap their work, which can help when requests are independent and time is otherwise spent waiting on separate responses. Actual completion time depends on factors such as the remote server, network path, response sizes, and local capacity. Adding more transfers can also increase contention or trigger service-side limits. There is no universal concurrency setting that is right for every host.

Respect the destination service

  • Start with a modest explicit cap for a large batch, then adjust to the service’s documented policy and your operational needs.
  • Do not assume that the documented default of 50 is approved by a particular API or website.
  • Keep each output destination unique, and choose filenames that remain unique if a batch can overlap with another run.
  • For important workflows, inspect exit status and error output and decide how your script should handle partial success; concurrent requests can have different outcomes.

Estimate what you are actually saving

Parallelism changes when transfers run, not the amount a service charges for them. If an API bills per request, sending the same requests concurrently does not by itself reduce the request count. Check the provider’s own terms for rate limits, quotas, and billing. The curl and GNU Parallel documentation cited here establishes command behavior, not service-specific limits or pricing.

Troubleshooting parallel curl commands

“Unknown option” for --parallel

Your installed curl may be older than 7.66.0, the documented introduction version. Check curl --version and whether another curl executable is earlier in your PATH. Use a version that supports the option, or use an available shell job tool such as GNU Parallel if installing or upgrading curl is not appropriate.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Files are missing, overwritten, or contain the wrong response

Check each URL’s -o destination. Reusing a filename makes responses compete for the same path; use a distinct name for every transfer. With a generated URL list, make sure the filename scheme is unique across all jobs and across overlapping runs.

Some requests fail while others succeed

Parallel mode schedules independent transfers; it does not make them a transaction. Inspect curl’s error output and the HTTP results for each endpoint, then retry only what is appropriate for that service. Be cautious with non-idempotent requests: blindly repeating a POST after an ambiguous failure can duplicate an action.

The destination returns errors or slows down

Reduce --parallel-max or GNU Parallel’s -j value, and check the service’s documented concurrency and rate policies. A concurrency cap controls simultaneous work; it is not a guarantee that requests will be accepted or that a rate limit will not be reached.

A mixed-method command behaves unexpectedly after a redirect

Review the combination of --request, --location, and --next. In particular, inspect curl’s documented behavior for the installed version when a custom method is carried through redirects. Test against a controlled endpoint before using such a command on a production workflow.

Free tools Windows power users keep installed

One-click scans. No signup required.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
Independent reader supportYour contribution helps us test, update, and keep practical guides available for everyone.Support on Ko-Fi

Or skip the browser setup

If the batch you need is website screenshots rather than arbitrary HTTP transfers, ScreenshotNeo is a screenshot API and MCP server for developers. Its one-request pattern returns a screenshot of a URL; this example captures one page, not a parallel batch:

Best Value
curl -G "https://api.screenshotneo.com/v1/shot" -d access_key=YOUR_API_KEY --data-urlencode url=https://stripe.com -o shot.webp

See the ScreenshotNeo documentation for request parameters. Before capture, it accepts the cookie or consent banner like a visitor and removes more than 60 known consent platforms, newsletter popups, and chat widgets; each cleanup step can be turned off. Bot checks, blank pages, timeouts, failed loads, and cache hits cost nothing, and response headers identify the page verdict and billing status. Its MCP server provides take_screenshot, get_page_info, and capture_pdf tools for Claude, Cursor, and other MCP clients.

The free plan includes 1,000 screenshots per month with no card; paid plans start at $5 for 3,000. Sign up for the free plan.

Frequently asked questions

Can parallel requests finish in a different order than the URLs appear?

Yes. Transfers run concurrently, so completion order is not a dependable way to associate a response with an input URL. Use explicit, distinct output filenames or another mapping that ties each result to its request.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Does --parallel-max-host limit requests per domain name alone?

The current curl manual describes its scope as the same protocol, hostname, and port, rather than hostname alone. It is available in curl 8.16.0 and later according to that manual.

Should I use GNU Parallel for every batch?

No. For a small fixed set of straightforward transfers, curl’s own parallel mode is usually the simpler command. GNU Parallel is useful when a generated list or per-item shell workflow needs job-level orchestration.

Quick Recap

SaleBestseller No. 2
Curly Girl: The Handbook
Curly Girl: The Handbook
Workman publishing; Binding: paperback; Language: english
$8.19
Bestseller No. 3
Bestseller No. 4
SaleBestseller No. 5
A Practical Guide to Curl (Programming Series)
A Practical Guide to Curl (Programming Series)
Used Book in Good Condition
$24.99

Product prices and availability are accurate as of the date/time indicated and are subject to change. Any price and availability information displayed on Amazon at the time of purchase will apply.