# xkcd

> Pull xkcd comics into a workflow: the latest one, any comic by number, a random pick, or the comics from a stretch of the archive or a range of dates. Search all 3,000+ comics by title, hover text or transcript, check whether a new comic has gone up since last time, and download the picture to post or attach. Every comic comes back with its hover text: the joke that isn't in the image. No account or API key required.

App · Film, TV & Fandom · 8 actions. Web page: https://docs.lodol.com/docs/integrations/xkcd

## Actions

### Download comic image

Download a comic's picture as a file, so a later step can attach it to an email, post it to a chat or put it in storage. Use this wherever a link will not do and the picture itself has to travel with the message. No API key required.

**Inputs**

- Comic number (`comic_number`, number): Optional. Which comic to download. Leave blank for the latest one. At least 1.

**Outputs**

- `byte_size` (number): The file's size in bytes.
- `comic` (object): The comic and everything xkcd publishes about it.
- `content_type` (text): The image's media type, e.g. image/png.
- `document_ref` (text): The stored document's reference.
- `documents` (list): The downloaded image as a document, ready to attach to a later step.
- `url` (text): A URL that serves the stored file.

**Example output**

```json
{
  "byte_size": 66677,
  "comic": {
    "alt_text": "If you don't have an extension cord I can get that too. Because we're friends! Right?",
    "comic_url": "https://xkcd.com/614/",
    "explanation_url": "https://www.explainxkcd.com/wiki/index.php/614",
    "image_url": "https://imgs.xkcd.com/comics/woodpecker.png",
    "is_interactive": false,
    "link": null,
    "news": null,
    "number": 614,
    "published_date": "2009-07-24",
    "safe_title": "Woodpecker",
    "title": "Woodpecker",
    "transcript": "[[A man with a beret and a woman are standing on a boardwalk, leaning on a handrail.]]\nMan: A woodpecker!"
  },
  "content_type": "image/png",
  "document_ref": "doc_xkcd_614",
  "documents": [
    {
      "content_type": "image/png",
      "document_ref": "doc_xkcd_614",
      "filename": "xkcd-614-woodpecker.png",
      "size_bytes": 66677,
      "url": "/actions/core/serve-document/doc_xkcd_614"
    }
  ],
  "url": "/actions/core/serve-document/doc_xkcd_614"
}
```

### Get a comic

Get one comic by its number: the number in its address, so https://xkcd.com/614/ is comic 614. Returns the title, hover text, transcript, image and publication date. No API key required.

**Inputs**

- Comic number (`comic_number`, number, required): The comic's number, as it appears in its address. There is no comic 404: xkcd skipped the number as a joke. At least 1.

**Outputs**

- `comic` (object): The comic and everything xkcd publishes about it.

**Example output**

```json
{
  "comic": {
    "alt_text": "If you don't have an extension cord I can get that too. Because we're friends! Right?",
    "comic_url": "https://xkcd.com/614/",
    "explanation_url": "https://www.explainxkcd.com/wiki/index.php/614",
    "image_url": "https://imgs.xkcd.com/comics/woodpecker.png",
    "is_interactive": false,
    "link": null,
    "news": null,
    "number": 614,
    "published_date": "2009-07-24",
    "safe_title": "Woodpecker",
    "title": "Woodpecker",
    "transcript": "[[A man with a beret and a woman are standing on a boardwalk, leaning on a handrail.]]\nMan: A woodpecker!"
  }
}
```

### Get a random comic

Get a comic at random, picked by xkcd's own Random link, with its title, hover text and image. No API key required.

**Inputs**: None.

**Outputs**

- `comic` (object): The comic and everything xkcd publishes about it.

**Example output**

```json
{
  "comic": {
    "alt_text": "If you don't have an extension cord I can get that too. Because we're friends! Right?",
    "comic_url": "https://xkcd.com/614/",
    "explanation_url": "https://www.explainxkcd.com/wiki/index.php/614",
    "image_url": "https://imgs.xkcd.com/comics/woodpecker.png",
    "is_interactive": false,
    "link": null,
    "news": null,
    "number": 614,
    "published_date": "2009-07-24",
    "safe_title": "Woodpecker",
    "title": "Woodpecker",
    "transcript": "[[A man with a beret and a woman are standing on a boardwalk, leaning on a handrail.]]\nMan: A woodpecker!"
  }
}
```

### Get new comics since

Get the comics published since a comic number or a date: the check to run on a schedule. Pass the latest comic number the last run reported, and this returns only what has appeared since. No API key required.

**Inputs**

- Since comic number (`since_comic_number`, number): Comics numbered above this one are new. Use the latest comic number from the previous run. Required unless a date is given instead. At least 0.
- Since date (`since_date`, date): Comics published after this date are new. Use instead of, or together with, a comic number.
- Number of comics (`limit`, number): Optional. How many comics to return (the newest ones). Between 1 and 50; 10 by default. Each comic is fetched individually, so a smaller page is a faster step. From 1 to 50. Default: `10`.

**Outputs**

- `comics` (list): The new comics, newest first, up to the page size.
- `count` (number): How many comics are in this page.
- `has_more` (true/false): True when more comics matched than this page holds.
- `has_new_comics` (true/false): True when anything new was published. Branch on this to stay quiet on the days xkcd doesn't post.
- `latest_comic_number` (number): The number of the newest comic. Store it and pass it back as Since comic number next run.
- `total_count` (number): How many comics matched in total, across every page.

**Example output**

```json
{
  "comics": [
    {
      "alt_text": "If you don't have an extension cord I can get that too. Because we're friends! Right?",
      "comic_url": "https://xkcd.com/614/",
      "explanation_url": "https://www.explainxkcd.com/wiki/index.php/614",
      "image_url": "https://imgs.xkcd.com/comics/woodpecker.png",
      "is_interactive": false,
      "link": null,
      "news": null,
      "number": 614,
      "published_date": "2009-07-24",
      "safe_title": "Woodpecker",
      "title": "Woodpecker",
      "transcript": "[[A man with a beret and a woman are standing on a boardwalk, leaning on a handrail.]]\nMan: A woodpecker!"
    }
  ],
  "count": 1,
  "has_more": false,
  "has_new_comics": true,
  "latest_comic_number": 3287,
  "total_count": 1
}
```

### Get the latest comic

Get the comic currently on xkcd's front page, with its title, hover text, image and publication date. No API key required.

**Inputs**: None.

**Outputs**

- `comic` (object): The comic and everything xkcd publishes about it.

**Example output**

```json
{
  "comic": {
    "alt_text": "If you don't have an extension cord I can get that too. Because we're friends! Right?",
    "comic_url": "https://xkcd.com/614/",
    "explanation_url": "https://www.explainxkcd.com/wiki/index.php/614",
    "image_url": "https://imgs.xkcd.com/comics/woodpecker.png",
    "is_interactive": false,
    "link": null,
    "news": null,
    "number": 614,
    "published_date": "2009-07-24",
    "safe_title": "Woodpecker",
    "title": "Woodpecker",
    "transcript": "[[A man with a beret and a woman are standing on a boardwalk, leaning on a handrail.]]\nMan: A woodpecker!"
  }
}
```

### List comics

List comics by number, newest first, a page at a time. Leave the range blank for the most recent comics, or set it to walk a stretch of the archive. No API key required.

**Inputs**

- From comic number (`from_number`, number): Optional. Only comics numbered this or higher. Leave blank to start at the very first comic. At least 1.
- To comic number (`to_number`, number): Optional. Only comics numbered this or lower. Leave blank to run up to the newest comic. At least 1.
- Oldest first (`oldest_first`, true/false): Optional. Return the oldest comics first instead of the newest. Off by default. Default: `false`.
- Number of comics (`limit`, number): Optional. How many comics to return. Between 1 and 50; 10 by default. Each comic is fetched individually, so a smaller page is a faster step. From 1 to 50. Default: `10`.
- Skip (`offset`, number): Optional. How many matching comics to skip before this page. Use the next offset from the previous result to page through. 0 by default. At least 0. Default: `0`.

**Outputs**

- `comics` (list): The comics in this page.
- `count` (number): How many comics are in this page.
- `has_more` (true/false): True when more comics matched than this page holds.
- `latest_comic_number` (number): The number of the newest comic xkcd has published.
- `next_offset` (number): The offset that fetches the next page. Null when this is the last one.
- `total_count` (number): How many comics matched in total, across every page.

**Example output**

```json
{
  "comics": [
    {
      "alt_text": "If you don't have an extension cord I can get that too. Because we're friends! Right?",
      "comic_url": "https://xkcd.com/614/",
      "explanation_url": "https://www.explainxkcd.com/wiki/index.php/614",
      "image_url": "https://imgs.xkcd.com/comics/woodpecker.png",
      "is_interactive": false,
      "link": null,
      "news": null,
      "number": 614,
      "published_date": "2009-07-24",
      "safe_title": "Woodpecker",
      "title": "Woodpecker",
      "transcript": "[[A man with a beret and a woman are standing on a boardwalk, leaning on a handrail.]]\nMan: A woodpecker!"
    }
  ],
  "count": 1,
  "has_more": true,
  "latest_comic_number": 3287,
  "next_offset": 10,
  "total_count": 3286
}
```

### List comics by date

List the comics published between two dates, newest first: for a monthly digest, a year in review, or finding the comic that ran on a particular day. No API key required.

**Inputs**

- Published on or after (`published_from`, date): Optional. Only comics published on or after this date.
- Published on or before (`published_to`, date): Optional. Only comics published on or before this date.
- Oldest first (`oldest_first`, true/false): Optional. Return the oldest comics first instead of the newest. Off by default. Default: `false`.
- Number of comics (`limit`, number): Optional. How many comics to return. Between 1 and 50; 10 by default. Each comic is fetched individually, so a smaller page is a faster step. From 1 to 50. Default: `10`.
- Skip (`offset`, number): Optional. How many matching comics to skip before this page. Use the next offset from the previous result to page through. 0 by default. At least 0. Default: `0`.

**Outputs**

- `comics` (list): The comics in this page.
- `count` (number): How many comics are in this page.
- `has_more` (true/false): True when more comics matched than this page holds.
- `next_offset` (number): The offset that fetches the next page. Null when this is the last one.
- `published_from` (text): The start of the window that was applied, YYYY-MM-DD. Null when no start was given.
- `published_to` (text): The end of the window that was applied, YYYY-MM-DD. Null when no end was given.
- `total_count` (number): How many comics matched in total, across every page.

**Example output**

```json
{
  "comics": [
    {
      "alt_text": "If you don't have an extension cord I can get that too. Because we're friends! Right?",
      "comic_url": "https://xkcd.com/614/",
      "explanation_url": "https://www.explainxkcd.com/wiki/index.php/614",
      "image_url": "https://imgs.xkcd.com/comics/woodpecker.png",
      "is_interactive": false,
      "link": null,
      "news": null,
      "number": 614,
      "published_date": "2009-07-24",
      "safe_title": "Woodpecker",
      "title": "Woodpecker",
      "transcript": "[[A man with a beret and a woman are standing on a boardwalk, leaning on a handrail.]]\nMan: A woodpecker!"
    }
  ],
  "count": 1,
  "has_more": true,
  "next_offset": 10,
  "published_from": "2009-07-01",
  "published_to": "2009-07-31",
  "total_count": 14
}
```

### Search comics

Find the comics whose title, hover text or transcript contains some text. Searching titles covers every comic ever published; searching the hover text or transcript opens comics one at a time, so narrow it with a number or date range. No API key required.

**Inputs**

- Search text (`query`, text, required): The text to look for. Matching ignores capitals and matches anywhere in the field, so "python" finds "Python Environment".
- Search in (`search_in`, list): Optional. Which parts of a comic to search. Title only by default, which covers every comic in one request. Adding the hover text or transcript means opening comics one by one, bounded by Comics to scan. One or more of: `title`, `alt_text` (Hover text), `transcript`. Default: `["title"]`.
- From comic number (`from_number`, number): Optional. Only comics numbered this or higher. Leave blank to start at the very first comic. At least 1.
- To comic number (`to_number`, number): Optional. Only comics numbered this or lower. Leave blank to run up to the newest comic. At least 1.
- Published on or after (`published_from`, date): Optional. Only comics published on or after this date.
- Published on or before (`published_to`, date): Optional. Only comics published on or before this date.
- Comics to scan (`max_comics_scanned`, number): Optional. The most comics to open when searching the hover text or transcript, newest first. Between 1 and 500; 100 by default. Ignored when only titles are searched, which needs no scanning at all. From 1 to 500. Default: `100`.
- Number of comics (`limit`, number): Optional. How many comics to return. Between 1 and 50; 10 by default. Each comic is fetched individually, so a smaller page is a faster step. From 1 to 50. Default: `10`.
- Skip (`offset`, number): Optional. How many matching comics to skip before this page. Use the next offset from the previous result to page through. 0 by default. At least 0. Default: `0`.

**Outputs**

- `comics` (list): The matching comics in this page.
- `comics_scanned` (number): How many comics were examined. For a title search this is every comic in the range.
- `count` (number): How many comics are in this page.
- `has_more` (true/false): True when more comics matched than this page holds.
- `next_offset` (number): The offset that fetches the next page. Null when this is the last one.
- `query` (text): The text that was searched for.
- `scan_limit_reached` (true/false): True when the scan stopped at Comics to scan before reaching the end of the range, so older matches may exist. Raise the limit or narrow the range to be sure.
- `searched_in` (list): The fields that were searched.
- `total_count` (number): How many comics matched in total, across every page.

**Example output**

```json
{
  "comics": [
    {
      "alt_text": "If you don't have an extension cord I can get that too. Because we're friends! Right?",
      "comic_url": "https://xkcd.com/614/",
      "explanation_url": "https://www.explainxkcd.com/wiki/index.php/614",
      "image_url": "https://imgs.xkcd.com/comics/woodpecker.png",
      "is_interactive": false,
      "link": null,
      "news": null,
      "number": 614,
      "published_date": "2009-07-24",
      "safe_title": "Woodpecker",
      "title": "Woodpecker",
      "transcript": "[[A man with a beret and a woman are standing on a boardwalk, leaning on a handrail.]]\nMan: A woodpecker!"
    }
  ],
  "comics_scanned": 3286,
  "count": 1,
  "has_more": false,
  "next_offset": null,
  "query": "woodpecker",
  "scan_limit_reached": false,
  "searched_in": [
    "title"
  ],
  "total_count": 3
}
```
