Skip to content
curl-runner 2.0 — rewritten in Rust on libcurl

API tests as YAML.
Run them anywhere.

Describe requests in plain YAML, validate every response, and run whole suites in parallel — on your laptop or in CI. One native binary, no runtime.

curl -fsSL https://www.curl-runner.com/install.sh | bash
api.yaml
global:
  variables:
    BASE: https://api.example.com
  execution: parallel

requests:
  - name: List users
    url: ${BASE}/users
    expect:
      status: 200
      responseTime: "< 500"

  - name: Create user
    url: ${BASE}/users
    method: POST
    body: { name: Ada }
    retry: { count: 3 }
    expect:
      status: 201
terminal
$ curl-runner api.yaml
ℹ Found 1 YAML file(s)
ℹ Processing: api.yaml

✓ List users [api]
   ├─ GET: https://api.example.com/users
   ├─ ✓ Status: 200
   └─ Duration: 84ms | 2.10 KB

✓ Create user [api]
   ├─ POST: https://api.example.com/users
   ├─ ✓ Status: 201
   └─ Duration: 112ms | 96.00 B

Summary: 2 requests completed successfully

Example request timings are illustrative.

Install withbrewnpmbunpnpmcargoinstall.shPowerShell

Features

Everything an API suite needs. Nothing it doesn’t.

  • yaml

    Plain YAML suites

    Requests, headers, bodies and uploads in files your team can review in a pull request.

  • expect

    Response validation

    Assert status, headers, body fields and response time. Failures say exactly what differed.

  • parallel

    Parallel or sequential

    Run a whole directory at once, or in order when requests depend on each other.

  • store / when

    Chained requests

    Store values from one response, reuse them in the next, and run steps conditionally.

  • retry

    Retries and timeouts

    Per-request retries with delays, and real millisecond timeouts for slow endpoints.

  • snapshot

    Snapshots and diffs

    Save a baseline, then see what changed between runs or environments.

  • --profile

    Performance profiling

    Repeat requests, measure latency percentiles and export the results.

  • --watch

    Watch mode

    Re-run the suite every time a YAML file changes while you build the API.

  • convert

    From curl to YAML

    Paste a curl command or a shell script and get a ready-to-run suite back.

Native

libcurl inside.
Rust around it.

The same battle-tested transfer engine as curl, statically linked into a single binary. HTTP/2, the operating system’s trust store, and nothing to install first — not Node, not Bun, not even curl.

static binary per platform
1
runtime dependencies
0
startup
< 7 ms
peak memory, 100 requests
13.5 MB

Median of repeated runs on an Apple M2 Max against a local server. Reproduce with scripts/bench.sh.

.github/workflows/api.yml
steps:
  - uses: actions/checkout@v7
  - run: curl -fsSL https://www.curl-runner.com/install.sh | bash
  - run: curl-runner tests/ --strict-exit --output results.json

CI-ready

Smoke tests that fail the build — for the right reasons.

Deterministic exit codes, failure thresholds, retries for flaky networks, and one JSON report for every file in the run. Drop it into any pipeline.

Write your first suite in a minute.