Free & open source · v0.1

One request definition.
Four tools in one.

bolla replaces your API client, load tester, mock server, and CI runner with a single plain-text file in your git repo. No account. No cloud proxy. No vendor lock-in.

bolla — scenario: api-smoke
$ bolla --ci --scenario api-smoke --env staging
 
bolla ci — scenario:api-smoke
status 200 on POST /auth/token
p95 latency 87ms < gate 200ms
error rate 0.0% < gate 1%
throughput 312 req/s > gate 100 req/s
 
All gates passed. Reports: .bolla/runs/abc123/

Today you juggle four separate tools

Each one requires its own definition format, its own sync strategy, its own learning curve — and none of them talk to each other.

🔵

API Client

Bruno / Postman / Insomnia — define your requests, organize collections

🟡

Load Tester

Locust / k6 / Gatling — write Python or JS scripts to describe the same endpoints

🟣

Mock Server

Mockoon / WireMock — configure mocks in yet another format for local dev

🟠

CI Runner

Newman / bru CLI — wire everything together for pipelines, maintain separate gate config

One .bolla.yaml file drives all four

Define a request once. That same definition is your manual test, your load scenario, your mock response template, and your CI assertion. No duplication. No sync issues. Always in git.

Everything you need, nothing you don't

Core features are always on. Every module beyond that is independently toggleable — disable what you don't use and it vanishes from the UI entirely.

Request builder

Full HTTP, GraphQL, WebSocket, and SSE support. Variables, environments, Bearer/Basic/API key/OAuth2 auth. Collections in plain YAML files — git-trackable by design.

Core
🚀

Load & scenarios

Multi-step realistic scenarios. Ramp-up profiles, constant load, or spike bursts. Live p50/p95/p99 latency histograms and RPS charts. Built on HDR histogram — O(1) memory regardless of sample count.

Core
🎭

Smart mock server

Spins up an HTTP mock from your collection on any port. Returns saved examples by name, or auto-generates realistic fake data from field names (email, uuid, phone, price…) — no config needed.

Optional
🔒

CI / CD gates

Headless --ci mode exits 0 or 1. Define latency gates, error rate budgets, and throughput floors per scenario. Outputs JUnit XML + JSON for any CI system. Zero dependencies beyond the binary.

Optional
🔑

OAuth2 engine

Client credentials, authorization code + PKCE, and device flow — all built in. AES-256-GCM encrypted token cache. Google, GitHub, and Microsoft presets. BYO provider.

Optional
📋

OpenAPI contracts

Import any OpenAPI 3.x / Swagger 2.x spec and generate a full collection in one click. Drift detection alerts you when a live response no longer matches the spec — persisted to SQLite for trending.

Optional
📊

History & reports

Browse, filter, and export all past runs. Run-to-run comparison shows exactly where p50/p95 regressed. Export to CSV, HTML, or JSON. Compare two load runs side-by-side with delta percentages.

Optional
🛠

Polish bundle

Code snippet generator (cURL, Python, JS, Go). Import from cURL commands or HAR files. Security linter with 8 rules. Auto-generated HTML docs site from your collection. Team dashboard with aggregate stats.

Optional
🤖

AI assist

BYO Anthropic key — no subscription required. Get assertion suggestions from any response. Plain-English CI report summaries and load test analysis. Key stored in memory only, never written to disk.

Optional

One file. Every capability.

A .bolla.yaml file is the source of truth. Write it by hand, generate it from an OpenAPI spec, or import from a cURL command. It lives in your repo, travels with your code, and stays readable in any text editor.

  • Manual test: send the request directly from the UI
  • Load test: reference it in a scenario with ramp-up and gates
  • Mock: the examples block becomes mock responses
  • CI: run it headlessly with bolla --ci --request <id>
  • Docs: GET /api/polish/docs generates a live HTML docs page
  • Snippet: one click exports cURL, Python, JS, or Go
request.bolla.yaml
scenario.yaml
CI output
id: create-user name: Create user method: POST url: {{base_url}}/users auth: type: bearer token: {{TOKEN}} headers: - name: content-type value: application/json body: type: json content: name: Alice email: alice@example.com assertions: - check: status_code value: 201 - check: body_contains text: id # saved mock examples — served by bolla --mock examples: - name: success status: 201 body: '{"id":"usr_01","name":"Alice"}'
id: user-flow name: User signup flow load: type: ramp start_concurrency: 5 end_concurrency: 50 duration_s: 60 steps: - request_id: create-user extract: USER_ID: $.id - request_id: get-user vars: id: {{USER_ID}} gates: p95_ms: max: 300 error_rate_pct: max: 0.5 rps: min: 100
$ bolla --ci --scenario user-flow --env prod bolla ci running scenario 'User signup flow' 50 VUs · ramp 5→50 · 60s bolla ci — scenario:user-flow p95 latency 142ms ≤ gate 300ms error rate 0.1% ≤ gate 0.5% throughput 287 req/s ≥ gate 100 req/s All gates passed. Reports: .bolla/runs/abc123/ junit.xml → parsed by GitHub Actions / GitLab result.json → custom dashboards $ echo $? 0

How bolla stacks up

bolla isn't just another API client — it's the tool that replaces the whole stack.

Capability
● bolla
Bruno Postman k6 Apidog
Request builder & collections
Load & stress testing paid
Built-in mock server cloud
CI gates (exit 0/1) bru CLI Newman paid
OpenAPI import + drift import only
Git-native plain text optional
Fully offline / no account
Free, no seat limit ✓ forever 1 user 3 users
Single definition for all of the above partial

Up in under a minute

A single static binary. No runtime. No npm install. No Docker required.

🍎 macOS  ·  🐧 Linux  ·  🪟 Windows (WSL)

curl -fsSL https://bolla.cikubo.it/install.sh | sh

The installer detects your OS and architecture, downloads the right binary, and puts it on your PATH.

Replace four tools with one file.

bolla is free for individuals and teams — no seat limits, no cloud subscription, no usage caps. Ever.