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.

Studio · Preview

The same YAML,
in a native app.

curl-runner studio opens a folder of request files as a collection. Edit with live validation, run one request or all of them, and read every check, retry and timing. A macOS preview for now: no download yet, you build it from source.

curl-runner studio running the Payments API collection: fourteen requests in four folders pass one after another, the progress bar fills green and the summary reads 14 passed, 0 failed.

macOS only and not distributed yet. Build it from source with cargo run -p curl-runner-studio.

Write your first suite in a minute.