4chan · Schema

CatalogResponse

Top-level response from `/{board}/catalog.json` — an array of pages, each containing OP threads with preview replies.

SocialBulletin BoardImageboardRead OnlyJSONPublic APIsCommunity
View JSON Schema on GitHub

JSON Schema

4chan-api-catalog-response-schema.json Raw ↑
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "title": "CatalogResponse",
  "description": "Top-level response from `/{board}/catalog.json` \u2014 an array of pages, each containing OP threads with preview replies.",
  "$id": "https://raw.githubusercontent.com/api-evangelist/4chan/refs/heads/main/json-schema/4chan-api-catalog-response-schema.json",
  "items": {
    "type": "object",
    "description": "One index page in a catalog response.",
    "required": [
      "page",
      "threads"
    ],
    "properties": {
      "page": {
        "type": "integer",
        "description": "Index page number this catalog page entry belongs to.",
        "example": 1
      },
      "threads": {
        "type": "array",
        "description": "Catalog thread entries (each is an OP `Post` object enriched with `last_replies`).",
        "items": {
          "type": "object",
          "description": "A single post \u2014 either an OP (when `resto == 0`) or a reply (when `resto` is the OP id). Many fields appear only on OPs (`replies`, `images`, `sticky`, `closed`, `archived`, \u2026) or only on posts with an attached file.",
          "required": [
            "no",
            "resto",
            "now",
            "time",
            "name"
          ],
          "properties": {
            "no": {
              "type": "integer",
              "description": "Numeric post ID.",
              "example": 570368
            },
            "resto": {
              "type": "integer",
              "description": "For replies, the OP ID this post replies to. For OPs, `0`.",
              "example": 0
            },
            "sticky": {
              "type": "integer",
              "description": "`1` if the thread is pinned to the top of the board (OP only).",
              "enum": [
                0,
                1
              ],
              "example": 1
            },
            "closed": {
              "type": "integer",
              "description": "`1` if the thread is closed to new replies (OP only).",
              "enum": [
                0,
                1
              ],
              "example": 1
            },
            "now": {
              "type": "string",
              "description": "Localized post timestamp in `MM/DD/YY(Day)HH:MM` (or `HH:MM:SS`) format, EST/EDT.",
              "example": "12/31/18(Mon)17:05:48"
            },
            "time": {
              "type": "integer",
              "description": "UNIX timestamp the post was created.",
              "example": 1546293948
            },
            "name": {
              "type": "string",
              "description": "Display name used for the post (defaults to `Anonymous`).",
              "example": "Anonymous"
            },
            "trip": {
              "type": "string",
              "description": "User tripcode in the form `!tripcode` or `!!securetripcode`.",
              "example": "!K.WeEabc"
            },
            "id": {
              "type": "string",
              "description": "Poster ID (8 chars) \u2014 present only when the board has per-thread poster IDs enabled.",
              "example": "ABcd1234"
            },
            "capcode": {
              "type": "string",
              "description": "Staff capcode on the post.",
              "enum": [
                "mod",
                "admin",
                "admin_highlight",
                "manager",
                "developer",
                "founder"
              ],
              "example": "mod"
            },
            "country": {
              "type": "string",
              "description": "ISO 3166-1 alpha-2 country code of the poster, or `XX` if unknown.",
              "example": "US"
            },
            "country_name": {
              "type": "string",
              "description": "Human-readable country name of the poster.",
              "example": "United States"
            },
            "board_flag": {
              "type": "string",
              "description": "Board-specific flag code (only on boards with board flags enabled).",
              "example": "AB"
            },
            "flag_name": {
              "type": "string",
              "description": "Board-specific flag display name.",
              "example": "Flag Name AB"
            },
            "sub": {
              "type": "string",
              "description": "OP subject (OP only, when set).",
              "example": "Welcome to /po/!"
            },
            "com": {
              "type": "string",
              "description": "Post comment as HTML-escaped string.",
              "example": "Welcome to /po/! We specialize in origami, papercraft, and everything that's relevant to paper engineering."
            },
            "tim": {
              "type": "integer",
              "description": "UNIX timestamp + microtime that the attachment was uploaded \u2014 also the file ID for `i.4cdn.org`.",
              "example": 1546293948883
            },
            "filename": {
              "type": "string",
              "description": "Original filename of the attachment as uploaded.",
              "example": "yotsuba_folding"
            },
            "ext": {
              "type": "string",
              "description": "Attachment file extension.",
              "enum": [
                ".jpg",
                ".png",
                ".gif",
                ".pdf",
                ".swf",
                ".webm"
              ],
              "example": ".png"
            },
            "fsize": {
              "type": "integer",
              "description": "Attachment file size, in bytes.",
              "example": 516657
            },
            "md5": {
              "type": "string",
              "description": "24-character packed base64 MD5 hash of the attachment.",
              "example": "uZUeZeB14FVR+Mc2ScHvVA=="
            },
            "w": {
              "type": "integer",
              "description": "Attachment width in pixels.",
              "example": 530
            },
            "h": {
              "type": "integer",
              "description": "Attachment height in pixels.",
              "example": 449
            },
            "tn_w": {
              "type": "integer",
              "description": "Thumbnail width in pixels.",
              "example": 250
            },
            "tn_h": {
              "type": "integer",
              "description": "Thumbnail height in pixels.",
              "example": 211
            },
            "filedeleted": {
              "type": "integer",
              "description": "`1` if the post had a file and that file has been deleted.",
              "enum": [
                0,
                1
              ],
              "example": 0
            },
            "spoiler": {
              "type": "integer",
              "description": "`1` if the attachment is spoilered.",
              "enum": [
                0,
                1
              ],
              "example": 0
            },
            "custom_spoiler": {
              "type": "integer",
              "description": "Custom spoiler ID `1-10` (only on boards with custom spoilers).",
              "minimum": 1,
              "maximum": 10,
              "example": 1
            },
            "replies": {
              "type": "integer",
              "description": "Total number of replies in the thread (OP only).",
              "example": 2
            },
            "images": {
              "type": "integer",
              "description": "Total number of image replies in the thread (OP only).",
              "example": 2
            },
            "bumplimit": {
              "type": "integer",
              "description": "`1` once the thread has reached its bump limit (OP only).",
              "enum": [
                0,
                1
              ],
              "example": 0
            },
            "imagelimit": {
              "type": "integer",
              "description": "`1` once the thread has reached its image-reply limit (OP only).",
              "enum": [
                0,
                1
              ],
              "example": 0
            },
            "tag": {
              "type": "string",
              "description": "Category of `.swf` upload on `/f/` (OP only, `/f/` only).",
              "example": "Game"
            },
            "semantic_url": {
              "type": "string",
              "description": "SEO-friendly URL slug for the thread (OP only).",
              "example": "welcome-to-po"
            },
            "since4pass": {
              "type": "integer",
              "description": "Year the poster bought a 4chan Pass (only when the poster opted in).",
              "example": 2018
            },
            "unique_ips": {
              "type": "integer",
              "description": "Number of unique posters in the thread (OP only, only when the thread is live).",
              "example": 1
            },
            "m_img": {
              "type": "integer",
              "description": "`1` if a mobile-optimized variant of the attachment exists.",
              "enum": [
                0,
                1
              ],
              "example": 1
            },
            "archived": {
              "type": "integer",
              "description": "`1` once the thread has been archived (OP only).",
              "enum": [
                0,
                1
              ],
              "example": 1
            },
            "archived_on": {
              "type": "integer",
              "description": "UNIX timestamp the thread was archived (OP only).",
              "example": 1566530948
            },
            "omitted_posts": {
              "type": "integer",
              "description": "Replies omitted from a catalog/index preview (OP only on catalog/index responses).",
              "example": 1
            },
            "omitted_images": {
              "type": "integer",
              "description": "Image replies omitted from a catalog/index preview (OP only on catalog/index responses).",
              "example": 1
            },
            "last_modified": {
              "type": "integer",
              "description": "UNIX timestamp the thread was last modified (OP only on catalog/threadlist responses).",
              "example": 1566530948
            },
            "last_replies": {
              "type": "array",
              "description": "Most recent reply objects shown in a catalog preview (OP only on catalog responses).",
              "items": {
                "$ref": "#/components/schemas/Post"
              }
            }
          }
        }
      }
    }
  },
  "type": "array"
}