DJD

Public API

Free, no-auth REST API for Dad Joke Daily. Use it in your apps, bots, or experiments.

Base URLhttps://dadjoke.win/api/v1

Response Format

All endpoints return JSON. Jokes have the following shape:

{
  "id": "number",
  "setup": "string",
  "punchline": "string",
  "date": "YYYY-MM-DD",
  "type": "dad | girl-tea | millennial | dirty | knock-knock"
}

Rate Limits

Informational headers are returned on every response. No hard enforcement currently — please be respectful.

X-RateLimit-Limit: 100
X-RateLimit-Remaining: 99

CORS

All /api/v1 endpoints are open CORS — you can call them from any browser origin.

Endpoints

GEThttps://dadjoke.win/api/v1/jokes

Returns a paginated list of jokes. Filter by type, control page and limit.

Query Parameters

NameTypeRequiredDescription
typestringNodad | girl-tea | millennial | dirty | knock-knock (default: dad)
pagenumberNoPage number, 1-indexed (default: 1)
limitnumberNoResults per page, max 50 (default: 10)

Example

curl "https://dadjoke.win/api/v1/jokes?type=dad&page=1&limit=2"
{
  "jokes": [
    {
      "id": 42,
      "setup": "Why don't scientists trust atoms?",
      "punchline": "Because they make up everything!",
      "date": "2026-03-31",
      "type": "dad"
    },
    {
      "id": 41,
      "setup": "What do you call a fake noodle?",
      "punchline": "An impasta!",
      "date": "2026-03-30",
      "type": "dad"
    }
  ],
  "page": 1,
  "limit": 2,
  "hasMore": true
}
GEThttps://dadjoke.win/api/v1/jokes/random

Returns a single random joke. Optionally filter by type.

Query Parameters

NameTypeRequiredDescription
typestringNodad | girl-tea | millennial | dirty | knock-knock (default: dad)

Example

curl "https://dadjoke.win/api/v1/jokes/random?type=millennial"
{
  "joke": {
    "id": 17,
    "setup": "I'm not lazy, I'm on energy-saving mode.",
    "punchline": "",
    "date": "2026-03-28",
    "type": "millennial"
  }
}
GEThttps://dadjoke.win/api/v1/jokes/:id

Returns a specific joke by its numeric ID.

Query Parameters

NameTypeRequiredDescription
idnumberYesThe joke's numeric ID

Example

curl "https://dadjoke.win/api/v1/jokes/42"
{
  "joke": {
    "id": 42,
    "setup": "Why don't scientists trust atoms?",
    "punchline": "Because they make up everything!",
    "date": "2026-03-31",
    "type": "dad"
  }
}
GEThttps://dadjoke.win/api/v1/jokes/today

Returns today's jokes. Returns all types by default, or filter to one type.

Query Parameters

NameTypeRequiredDescription
typestringNodad | girl-tea | millennial | dirty | knock-knock — omit for all types

Example

curl "https://dadjoke.win/api/v1/jokes/today"
{
  "jokes": [
    {
      "id": 42,
      "setup": "Why don't scientists trust atoms?",
      "punchline": "Because they make up everything!",
      "date": "2026-03-31",
      "type": "dad"
    },
    {
      "id": 38,
      "setup": "My skincare routine has more steps than my career plan.",
      "punchline": "",
      "date": "2026-03-31",
      "type": "girl-tea"
    }
  ]
}

Voting

Upvote or downvote jokes. Votes are anonymous — identity is derived from your IP and user agent. One vote per person per joke.

GEThttps://dadjoke.win/api/v1/votes

Get vote totals and your current vote for a joke.

Query Parameters

NameTypeRequiredDescription
jokeIdnumberYesThe joke's numeric ID

Example

curl "https://dadjoke.win/api/votes?jokeId=42"
{
  "upvotes": 12,
  "downvotes": 3,
  "userVote": 1
}
POSThttps://dadjoke.win/api/v1/votes

Cast or change your vote on a joke. Send 1 for upvote, -1 for downvote. Voting the same direction again is a no-op; voting the opposite direction switches your vote.

Query Parameters

NameTypeRequiredDescription
jokeIdnumberYesThe joke's numeric ID (JSON body)
vote1 | -1Yes1 = upvote, -1 = downvote (JSON body)

Example

curl -X POST "https://dadjoke.win/api/votes" \
  -H "Content-Type: application/json" \
  -d '{"jokeId": 42, "vote": 1}'
{
  "upvotes": 13,
  "downvotes": 3,
  "userVote": 1
}
Note: Vote endpoints use /api/votes, not the /api/v1 base URL.

Embeddable Widget

Embed a random joke on your website with a simple iframe. The widget is minimal — no nav or footer, just the joke with branding.

Basic Embed

<iframe
  src="https://dadjoke.win/embed"
  width="500"
  height="300"
  frameBorder="0"
  style="border: none; border-radius: 12px;"
></iframe>

Filter by Joke Type

Add a ?type= query param to show a specific category.

<!-- Dad jokes (default) -->
<iframe src="https://dadjoke.win/embed" ...></iframe>

<!-- Girl Tea jokes -->
<iframe src="https://dadjoke.win/embed?type=girl-tea" ...></iframe>

<!-- Millennial jokes -->
<iframe src="https://dadjoke.win/embed?type=millennial" ...></iframe>

<!-- Dirty jokes -->
<iframe src="https://dadjoke.win/embed?type=dirty" ...></iframe>

Supported Types

dad (default), girl-tea, millennial, dirty, knock-knock, chistes

Joke Cards

Generate a shareable PNG image of any joke. Great for social media posts.

GEThttps://dadjoke.win/api/v1/joke-card/:id

Returns a PNG image (800x500) of the joke. Use the joke's numeric ID in the URL path.

Query Parameters

NameTypeRequiredDescription
idnumberYesThe joke's numeric ID (URL path param)

Example

curl "https://dadjoke.win/api/joke-card/42" --output joke.png
Binary PNG image (800x500)
Note: The joke card endpoint uses /api/joke-card/:id, not the /api/v1 base URL.

Built something cool with this API? Let us know.