Free JSON API · No Auth Required
453 classic Bastard Operator From Hell excuses.
One endpoint. Instant nonsense.
{
"data": { "id": 42, "excuse": "Solar flares" },
"meta": { "total": 453 },
"error": null
}
Interactive terminal. Type help for available commands.
Base URL: https://bofh.bombeck.io
/v1/excuses/random
Returns one random excuse.
curl https://bofh.bombeck.io/v1/excuses/random
{
"data": { "id": 42, "excuse": "Solar flares" },
"meta": { "total": 453 },
"error": null
}
/v1/excuses/random?count=N
Returns up to count random excuses (1–50).
curl https://bofh.bombeck.io/v1/excuses/random?count=3
{
"data": [
{ "id": 112, "excuse": "Static buildup ..." },
{ "id": 7, "excuse": "Cosmic rays" },
{ "id": 301, "excuse": "The server ..." }
],
"meta": { "count": 3, "total": 453 },
"error": null
}
/v1/excuses/:id
Returns a specific excuse by ID (1–453).
curl https://bofh.bombeck.io/v1/excuses/42
{
"data": { "id": 42, "excuse": "Solar flares" },
"meta": { "total": 453 },
"error": null
}
/v1/excuses
Returns all 453 excuses.
curl https://bofh.bombeck.io/v1/excuses
/health
Health check. Returns API status and uptime.
{
"data": { "status": "ok", "version": "3.0.0", "uptime": 86400 },
"meta": null,
"error": null
}
1,000 requests per 15 minutes per IP. Standard RateLimit-* headers are included in all responses. The /health endpoint is excluded.
Set Accept: text/plain to get just the excuse text — perfect for shell scripts and CLI tools.
curl -H "Accept: text/plain" https://bofh.bombeck.io/v1/excuses/random
→ Solar flares
All errors follow the same envelope format:
{
"data": null,
"meta": null,
"error": { "code": "NOT_FOUND", "message": "not found" }
}
| Status | Meaning |
|---|---|
| 400 | Invalid parameters |
| 404 | Not found |
| 429 | Rate limit exceeded |
| 500 | Internal error |
Full machine-readable API specification available at /openapi.json. Import into Postman, Insomnia, or use for client generation.
Get a random excuse in your language of choice.
curl -s https://bofh.bombeck.io/v1/excuses/random | jq .
const res = await fetch("https://bofh.bombeck.io/v1/excuses/random");
const { data } = await res.json();
console.log(data.excuse);
import requests
r = requests.get("https://bofh.bombeck.io/v1/excuses/random")
excuse = r.json()["data"]["excuse"]
print(excuse)
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))