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 | bashglobal:
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$ 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 successfullyExample request timings are illustrative.
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.
steps:
- uses: actions/checkout@v7
- run: curl -fsSL https://www.curl-runner.com/install.sh | bash
- run: curl-runner tests/ --strict-exit --output results.jsonCI-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.