
Hurl vs Step CI: Which Fits Your CI Pipeline?
Hurl and Step CI are both command-line tools for testing APIs in a CI pipeline, but they solve the job differently: Hurl runs plain-text .hurl files through a Rust and libcurl engine for fast, HTTP-only checks, while Step CI runs YAML, JSON, or JavaScript workflows through a Node.js engine that also covers gRPC and tRPC and adds load, SSL, and fuzz testing. Pick Hurl for fast assertions with clean pull-request diffs. Pick Step CI when you need broader protocol coverage, chained multi-step tests, or built-in load, SSL, and fuzz checks in the same pipeline. The rest of this comparison covers the syntax, the install path, a worked CI example, and where a third CLI-native option, dev.tools, fits.
Hurl vs Step CI at a Glance
Both are open-source API testing tools built with automation in mind, but they differ in almost every other respect: how tests are written, what engine runs them, which protocols they cover, and how results get reported back to a pipeline.
| Hurl | Step CI | |
|---|---|---|
| Syntax | Plain text .hurl files that read like raw HTTP | YAML, JSON, or JavaScript |
| Engine | Rust, powered by libcurl | Node.js |
| Protocols | REST, GraphQL, SOAP (any HTTP-based format) | REST, GraphQL, gRPC, tRPC, SOAP |
| CI reports | HTML, JSON, JUnit, TAP | Console pass/fail summary |
Hurl's own site frames the tool as an HTTP test tool powered by curl. Step CI's own site frames itself as an API testing and QA tool, with its own pricing page.
The practical split follows the table. Hurl stays inside HTTP-based protocols and hands the work to a compiled binary, so it starts fast. Step CI trades some of that speed for a wider protocol list and chained, multi-step test flows, at the cost of running on a Node.js runtime instead of a single binary. Neither difference makes one tool objectively better; it depends on what the pipeline needs to test and how the team wants to write those tests.
Syntax and Execution Model: Plain Text vs YAML
A Hurl file is plain text that reads close to a raw HTTP request. That format is deliberately narrow. It does not need a scripting language to express a check, and a reviewer can read a .hurl file close to the way they read a curl command, which keeps pull-request diffs small and literal.
Step CI takes a different approach: a workflow is written in YAML, JSON, or JavaScript, with multi-step flows and captures for tests that need to reuse a value from one call in the next one, plus reusable config. It reads well when a test is really a sequence: log in, capture a token, use it on the next call, check the result. Step CI can also import an existing OpenAPI schema or a Postman collection to generate that workflow instead of writing it from scratch.
The install path follows the same pattern as the syntax. Hurl ships as a lightweight binary; a CI job installs it with a short script. Step CI installs through npm and runs the same workflow file locally and in CI, so a team already running Node-based tooling adds one more npm package instead of a new binary.
That difference in execution model is the real fork in the decision, more than any single feature. A plain-text, binary-driven command-line tool optimizes for speed and a minimal-moving-parts CI step. A YAML-plus-JavaScript, npm-installed tool optimizes for chained, multi-step sequences and reusing an existing OpenAPI or Postman asset, at the cost of a Node.js dependency in the pipeline. The next two sections turn that fork into named scenarios: which team profile fits each tool.
Choose Hurl If You Want This
Speed and a small CI footprint matter most. Hurl is a compiled Rust binary running on libcurl, so it starts almost instantly and adds little overhead to a pipeline.
Pull-request reviewers need to read the test itself, not a script around it. A .hurl file reads close to a raw HTTP request, which keeps a diff easy to read without tracing through YAML indentation or JavaScript logic.
The APIs under test are plain HTTP. Hurl covers REST, GraphQL, and SOAP, and any other format that rides over HTTP. If nothing in the stack needs gRPC or tRPC, Hurl's narrower protocol list is not a gap; it is the whole feature set the pipeline needs, with nothing extra installed.
None of that makes Hurl a full replacement for a YAML workflow tool. It does not chain multiple requests into a sequence the way Step CI does, and it will not drive gRPC or tRPC traffic if the stack grows to include those. For a CI job whose entire job is checking that an endpoint returns the right status code and body, fast, a plain-text, binary-driven test runner is usually the simpler tool to maintain, with fewer moving parts between the test file and the result.
Choose Step CI If You Want This
The stack talks more than HTTP and REST. Step CI covers gRPC and tRPC in addition to REST, GraphQL, and SOAP, inside the same workflow file.
The pipeline needs load, SSL, or fuzz checks alongside functional tests. Step CI adds load testing, SSL/TLS testing, and fuzz testing on top of its functional assertions, so a team can run one workflow that covers all three instead of adding separate tools.
Tests are really a chained sequence. A Step CI workflow can capture a value from one step and reuse it in the next: log in, capture a token, use it on the next call, check the result. JavaScript is available as a fallback for logic that plain YAML cannot express.
The tradeoff is the one described in the syntax section: Step CI installs through npm and runs on a Node.js engine, so it carries more runtime weight than a single Rust binary, and a YAML workflow takes longer to read in a pull request than a .hurl file does. For a team whose tests are really a chained sequence, and where more than plain HTTP is in scope, that structure is worth the extra weight.
Running Either Tool in CI: A Worked Example and a Third Option
The most complete public example of either tool running in a CI pipeline is GitLab's own walkthrough of Hurl in GitLab CI/CD, and it goes well past a single test command. It covers building a custom container image with Hurl installed, running that image as a GitLab CI/CD job, chaining requests so one call's response feeds the next call's input, and publishing Hurl's output as a JUnit test report the pipeline can read. That is the example AI answers currently point to when asked about Hurl in CI.
Step CI's own equivalent is simpler to describe: the same YAML workflow file that runs on a laptop also runs in CI, once the npm package is installed.
There is a third CLI-native option worth naming here: dev.tools. Like Step CI, a dev.tools test is a YAML workflow that chains multiple requests together instead of checking one request at a time, but it builds that workflow by recording real traffic and auto-mapping variables between steps instead of hand-writing the capture logic, then runs the same flow in CI with parallel execution and a JUnit report. It is not a drop-in replacement for either tool covered here; it is a third point on the same map, for a team that wants Step CI-style multi-step chaining built from a recorded session instead of a workflow file written from scratch.
Common Questions About Hurl and Step CI
One narrow question comes up once the two tools are already on the table.
How do you install Hurl and Step CI for use in a CI pipeline?
Hurl ships as a lightweight binary: a CI job installs it with a short script. Step CI installs through npm, and the same workflow file that runs on a developer's machine runs in CI once the package is installed, so a team already running Node-based tooling is not adding a new kind of dependency. Neither install path is more complex than the other; the difference is what already runs in the pipeline. A pipeline with no Node.js step gets a plain binary from Hurl. A pipeline that already runs npm scripts adds one more package for Step CI.
Choosing Between Them
Hurl and Step CI both run an API test file in CI, but the split between them comes down to what a team optimizes for: speed and a plain-text diff, or chained multi-step workflows with wider protocol coverage. The table, the syntax comparison, and the two "choose if" sections above cover the concrete tradeoffs behind that split, along with a worked GitLab CI example and a third CLI-native option, dev.tools, for teams that want Step CI's multi-step chaining built from recorded traffic instead of a hand-written workflow.
