Entertainment — entry 005 of 9
JokeAPI
JokeAPI (Sv443) serves programmable jokes across 7 categories — Misc, Programming, Dark, Pun, Spooky, Christmas, and a catch-all Any — with content filtering by flag (nsfw, religious, political, racist, sexist, explicit) so integrators can enforce a safe-mode. A single GET can return the response as JSON, XML, YAML, or plain text via a `format` query parameter, and jokes come as either single one-liners or two-part setup/delivery pairs. It's free, keyless, open source, and self-hosted by its maintainer with no paid tier.
JokeAPI (Sv443) is a keyless joke API filterable by category and content flags. A live GET to /joke/Programming?type=single returned one one-liner joke as JSON, and the same call with format=xml returned the identical joke re-serialized as application/xml — both confirmed by this run's probes, not carried over from the stored summary.
GreatAPIs Score
Auth quickstart
- No API key required — the live probes above returned data with no auth header sent at all.
- Every response carries live rate-limit headers —
ratelimit-limit: 120,ratelimit-remaining,ratelimit-reset, andretry-after: 60— confirmed on this run's probes, so readratelimit-remainingbefore looping calls rather than guessing at a budget.
Your key is stored only in this browser (localStorage) and sent directly to the API — never to greatapis.
Get a single Programming joke as JSON
GEThttps://v2.jokeapi.dev/joke/Programming?type=single
{
"error": false,
"category": "Programming",
"type": "single",
"joke": "Eight bytes walk into a bar.\nThe bartender asks, \"Can I get you anything?\"\n\"Yeah,\" reply the bytes.\n\"Make us a double.\"",
"flags": {
"nsfw": false,
"religious": false,
"political": false,
"racist": false,
"sexist": false,
"explicit": false
},
"id": 34,
"safe": true,
"lang": "en"
}Captured byte-for-byte from this run's live probe; JokeAPI picks randomly from the matching pool per call, so a repeat request can return a different id/joke from the same category.
Try it
Developer reference
https://v2.jokeapi.dev120 requests per 60s window, confirmed live via response headers (ratelimit-limit: 120, ratelimit-remaining, ratelimit-reset, retry-after: 60)
- GET/joke/{category}
- GET/categories
- GET/flags
- GET/info
Gotchas & limits
format=xmlgenuinely changes the wire format, not just a label: a live probe of/joke/Programming?format=xml&type=singlereturnedcontent-type: application/xml; charset=UTF-8with a<data><joke>...</joke></data>body, re-serializing the same fields JSON returns.- A filter combination with zero matches 400s with a structured error, it doesn't fall back to a random joke: a live probe of
/joke/Programming?type=single&contains=zzzznonexistentxyz123returned HTTP 400 with{"error":true,"internalError":false,"code":106,"message":"No matching joke found",...}. - Rate-limit headers are real and live, confirmed on every probe this run:
ratelimit-limit: 120, a decrementingratelimit-remaining, andretry-after: 60(seconds until the window resets) — the field this category'srateLimitentry now cites. - The
api-inforesponse header self-reports the exact running version — this run's probes all returnedapi-info: JokeAPI v2.3.3 (https://v2.jokeapi.dev)— useful for confirming which server build served a given response.
Availability
Changelog
- gained rate limits