Output Schema

JSON Schema

JSON output structure reference

Complete reference for burl's JSON output format.

Standard JSON Output

When using -f json, burl outputs the following structure:

{
  "config": {
    "url": "string",
    "method": "string",
    "connections": "number",
    "duration_ms": "number",
    "timeout_ms": "number",
    "warmup_requests": "number"
  },
  "summary": {
    "total_requests": "number",
    "successful_requests": "number",
    "failed_requests": "number",
    "requests_per_second": "number",
    "bytes_per_second": "number",
    "total_bytes": "number",
    "duration_ms": "number"
  },
  "latency_ms": {
    "min": "number",
    "max": "number",
    "mean": "number",
    "stddev": "number",
    "p50": "number",
    "p75": "number",
    "p90": "number",
    "p95": "number",
    "p99": "number",
    "p999": "number"
  },
  "status_codes": {
    "[code]": "number"
  },
  "errors": {
    "[error_type]": "number"
  }
}

Field Reference

Config Object

FieldTypeDescription
urlstringTarget URL
methodstringHTTP method used
connectionsnumberConcurrent connections
duration_msnumberConfigured duration in milliseconds
timeout_msnumberRequest timeout in milliseconds
warmup_requestsnumberNumber of warmup requests

Summary Object

FieldTypeDescription
total_requestsnumberTotal requests sent (excluding warmup)
successful_requestsnumberRequests with 2xx status
failed_requestsnumberRequests that failed or got non-2xx
requests_per_secondnumberThroughput (req/s)
bytes_per_secondnumberData transfer rate
total_bytesnumberTotal bytes received
duration_msnumberActual test duration

Latency Object

All values in milliseconds.

FieldTypeDescription
minnumberMinimum latency
maxnumberMaximum latency
meannumberAverage latency
stddevnumberStandard deviation
p50number50th percentile (median)
p75number75th percentile
p90number90th percentile
p95number95th percentile
p99number99th percentile
p999number99.9th percentile

Status Codes Object

Map of HTTP status codes to their counts:

{
  "status_codes": {
    "200": 1234,
    "201": 56,
    "404": 2,
    "500": 1
  }
}

Errors Object

Map of error types to their counts:

{
  "errors": {
    "timeout": 5,
    "connection_refused": 2,
    "dns_error": 1
  }
}

Error Types

Error TypeDescription
timeoutRequest exceeded timeout
connection_refusedServer refused connection
connection_resetConnection reset by peer
dns_errorDNS resolution failed
tls_errorTLS/SSL handshake failed
otherOther network errors

Example Output

{
  "config": {
    "url": "https://api.example.com/users",
    "method": "GET",
    "connections": 50,
    "duration_ms": 30000,
    "timeout_ms": 30000,
    "warmup_requests": 10
  },
  "summary": {
    "total_requests": 15234,
    "successful_requests": 15230,
    "failed_requests": 4,
    "requests_per_second": 507.8,
    "bytes_per_second": 1245678,
    "total_bytes": 37370340,
    "duration_ms": 30002
  },
  "latency_ms": {
    "min": 12.3,
    "max": 456.7,
    "mean": 98.2,
    "stddev": 45.6,
    "p50": 89.4,
    "p75": 112.3,
    "p90": 145.6,
    "p95": 178.9,
    "p99": 234.5,
    "p999": 398.2
  },
  "status_codes": {
    "200": 15230,
    "503": 4
  },
  "errors": {
    "timeout": 4
  }
}

Parsing Examples

jq

# Extract P99 latency
burl https://api.example.com -f json | jq '.latency_ms.p99'

# Get success rate
burl https://api.example.com -f json | jq '.summary.successful_requests / .summary.total_requests'

# Check for errors
burl https://api.example.com -f json | jq 'if .summary.failed_requests > 0 then "FAILED" else "OK" end'

JavaScript/TypeScript

import { execSync } from 'child_process';

interface BurlResult {
  summary: {
    requests_per_second: number;
    failed_requests: number;
  };
  latency_ms: {
    p99: number;
  };
}

const output = execSync('burl https://api.example.com -f json').toString();
const result: BurlResult = JSON.parse(output);

if (result.latency_ms.p99 > 200) {
  console.error('P99 latency too high!');
}

Python

import subprocess
import json

result = subprocess.run(
    ['burl', 'https://api.example.com', '-f', 'json'],
    capture_output=True,
    text=True
)
data = json.loads(result.stdout)

print(f"Requests/sec: {data['summary']['requests_per_second']}")
print(f"P99 Latency: {data['latency_ms']['p99']}ms")