Free JSON API · No Auth Required

BOFH Excuses API

453 classic Bastard Operator From Hell excuses.
One endpoint. Instant nonsense.

GET /v1/excuses/random
{
  "data": { "id": 42, "excuse": "Solar flares" },
  "meta": { "total": 453 },
  "error": null
}

Try it

Interactive terminal. Type help for available commands.

bofh-api
Welcome to the BOFH Excuses API. Type help for commands.
$

API Reference

Base URL: https://bofh.bombeck.io

GET /v1/excuses/random

Returns one random excuse.

Request
curl https://bofh.bombeck.io/v1/excuses/random
Response
{
  "data": { "id": 42, "excuse": "Solar flares" },
  "meta": { "total": 453 },
  "error": null
}
GET /v1/excuses/random?count=N

Returns up to count random excuses (1–50).

Request
curl https://bofh.bombeck.io/v1/excuses/random?count=3
Response
{
  "data": [
    { "id": 112, "excuse": "Static buildup ..." },
    { "id": 7, "excuse": "Cosmic rays" },
    { "id": 301, "excuse": "The server ..." }
  ],
  "meta": { "count": 3, "total": 453 },
  "error": null
}
GET /v1/excuses/:id

Returns a specific excuse by ID (1–453).

Request
curl https://bofh.bombeck.io/v1/excuses/42
Response
{
  "data": { "id": 42, "excuse": "Solar flares" },
  "meta": { "total": 453 },
  "error": null
}
GET /v1/excuses

Returns all 453 excuses.

Request
curl https://bofh.bombeck.io/v1/excuses
GET /health

Health check. Returns API status and uptime.

Response
{
  "data": { "status": "ok", "version": "3.0.0", "uptime": 86400 },
  "meta": null,
  "error": null
}

Rate Limiting

1,000 requests per 15 minutes per IP. Standard RateLimit-* headers are included in all responses. The /health endpoint is excluded.

Plain Text Mode

Set Accept: text/plain to get just the excuse text — perfect for shell scripts and CLI tools.

Example
curl -H "Accept: text/plain" https://bofh.bombeck.io/v1/excuses/random
→ Solar flares

Errors

All errors follow the same envelope format:

{
  "data": null,
  "meta": null,
  "error": { "code": "NOT_FOUND", "message": "not found" }
}
StatusMeaning
400Invalid parameters
404Not found
429Rate limit exceeded
500Internal error

OpenAPI Spec

Full machine-readable API specification available at /openapi.json. Import into Postman, Insomnia, or use for client generation.

Quick Start

Get a random excuse in your language of choice.

curl
curl -s https://bofh.bombeck.io/v1/excuses/random | jq .
JavaScript
const res = await fetch("https://bofh.bombeck.io/v1/excuses/random");
const { data } = await res.json();
console.log(data.excuse);
Python
import requests

r = requests.get("https://bofh.bombeck.io/v1/excuses/random")
excuse = r.json()["data"]["excuse"]
print(excuse)
Go
resp, err := http.Get("https://bofh.bombeck.io/v1/excuses/random")
if err != nil {
    log.Fatal(err)
}
defer resp.Body.Close()
body, _ := io.ReadAll(resp.Body)
fmt.Println(string(body))