SCP Foundation API

A comprehensive REST API for accessing SCP Foundation data including items, tales, hubs, GOI articles, and supplements.

Quick Navigation
API Overview
This API provides data from the SCP Wiki, updated daily. All endpoints return JSON.

Base URL: https://v0-scp-api.vercel.app/api/scp

Data Source: scp-data/scp-api

Items

GET/api/scp/items
Get all SCP items with pagination
Parameters:
  • limit - Number of items to return (e.g., 10)
  • offset - Pagination offset (e.g., 0)
  • series - Filter by series (e.g., series-1)
  • exclude - Comma-separated list of fields to exclude from response (e.g., history,tags)
Example Response
{
  "data": [
    {
      "content_file": "content_series-1.json",
      "created_at": "2008-07-26T03:27:00",
      "creator": "Dantensen",
      "domain": "scp-wiki.wikidot.com",
      "history": [
        {
          "author": "Dantensen",
          "author_href": "http://www.wikidot.com/user:info/dantensen",
          "comment": "initial commit",
          "date": "2008-07-26T03:27:00"
        }
      ],
      "hubs": [
        "heritage-collection"
      ],
      "images": [
        "http://scp-wiki.wdfiles.com/local--files/scp-002/SCP002.jpg"
      ],
      "link": "scp-002",
      "page_id": 241,
      "rating": 1234,
      "references": [
        "scp-001",
        "scp-003"
      ],
      "scp": "SCP-002",
      "scp_number": 2,
      "series": "series-1",
      "tags": [
        "euclid",
        "building",
        "furniture"
      ],
      "title": "SCP-002",
      "url": "http://www.scpwiki.com/scp-002"
    }
  ],
  "total": 7000,
  "limit": 10,
  "offset": 0
}
GET/api/scp/items/[id]
Get details of a specific SCP Item
Parameters:
  • id - SCP identifier (e.g., scp-173) (e.g., scp-173)
  • exclude - Comma-separated list of fields to exclude from response (e.g., history,images)
Example Response
{
  "data": {
    "content_file": "content_series-1.json",
    "created_at": "2008-07-25T20:49:00",
    "creator": "Lt Masipag",
    "domain": "scp-wiki.wikidot.com",
    "history": [
      {
        "author": "Lt Masipag",
        "author_href": "http://www.wikidot.com/user:info/lt-masipag",
        "comment": "173 WOOT",
        "date": "2008-07-25T20:49:00"
      }
    ],
    "hubs": [
      "heritage-collection"
    ],
    "images": [
      "http://scp-wiki.wdfiles.com/local--files/scp-173/SCP-173.jpg"
    ],
    "link": "scp-173",
    "page_id": 173,
    "rating": 3421,
    "references": [],
    "scp": "SCP-173",
    "scp_number": 173,
    "series": "series-1",
    "tags": [
      "euclid",
      "sculpture",
      "autonomous",
      "statue"
    ],
    "title": "SCP-173",
    "url": "http://www.scpwiki.com/scp-173"
  }
}
GET/api/scp/items/[id]/content
Get full content of an SCP Item including raw HTML and source
Parameters:
  • id - SCP identifier (e.g., scp-173)
  • exclude - Comma-separated list of fields to exclude from response (e.g., history)
Example Response
{
  "data": {
    "content_file": "content_series-1.json",
    "created_at": "2008-07-25T20:49:00",
    "creator": "Lt Masipag",
    "link": "scp-173",
    "scp": "SCP-173",
    "scp_number": 173,
    "title": "SCP-173",
    "raw_content": "<p><strong>Item #:</strong> SCP-173</p>\n<p><strong>Object Class:</strong> Euclid</p>\n<p><strong>Special Containment Procedures:</strong> Item SCP-173 is to be kept in a locked container at all times...</p>",
    "raw_source": "[[include component:image-block name=SCP-173.jpg|caption=SCP-173]]\n\n**Item #:** SCP-173\n\n**Object Class:** Euclid..."
  }
}
GET/api/scp/items/random
Get a random SCP item with optional filters
Parameters:
  • min - Minimum SCP number (e.g., 313 for SCP-313) (e.g., 313)
  • max - Maximum SCP number (e.g., 3245 for SCP-3245) (e.g., 3245)
  • hasImages - Filter by images: 'true' (has images), 'false' (no images), or omit for all (e.g., true)
  • exclude - Comma-separated list of fields to exclude from response (e.g., history,tags)
Example Response
{
  "data": {
    "content_file": "content_series-1.json",
    "created_at": "2008-07-19T17:16:00",
    "creator": "far2",
    "domain": "scp-wiki.wikidot.com",
    "history": [
      {
        "author": "far2",
        "author_href": "http://www.wikidot.com/user:info/far2",
        "comment": "initial commit",
        "date": "2008-07-19T17:16:00"
      }
    ],
    "hubs": [
      "heritage-collection"
    ],
    "images": [
      "http://scp-wiki.wdfiles.com/local--files/scp-173/SCP-173.jpg"
    ],
    "link": "scp-173",
    "page_id": 220,
    "rating": 5678,
    "references": [],
    "scp": "SCP-173",
    "scp_number": 173,
    "series": "series-1",
    "tags": [
      "euclid",
      "sculpture",
      "scp"
    ],
    "title": "The Sculpture - The Original",
    "url": "http://scp-wiki.wikidot.com/scp-173",
    "raw_content": "<p><strong>Item #:</strong> SCP-173</p><p><strong>Object Class:</strong> Euclid</p>...",
    "raw_source": "**Item #:** SCP-173\n\n**Object Class:** Euclid\n\n..."
  }
}

Tales

GET/api/scp/tales
List all Tales (short stories)
Parameters:
  • limit - Number of tales to return (e.g., 10)
  • offset - Pagination offset (e.g., 0)
  • year - Filter by creation year (e.g., 2008)
  • exclude - Comma-separated list of fields to exclude from response (e.g., history,tags)
Example Response
{
  "data": [
    {
      "content_file": "content_2025.json",
      "created_at": "2025-12-09T20:48:00",
      "creator": "XHAWK77X",
      "domain": "scp-wiki.wikidot.com",
      "history": [
        {
          "author": "XHAWK77X",
          "author_href": "http://www.wikidot.com/user:info/xhawk77x",
          "comment": "",
          "date": "2025-12-09T20:48:00"
        }
      ],
      "link": "a-foundation-tale",
      "page_id": 12345,
      "rating": 42,
      "tags": [
        "tale",
        "doctor-bright"
      ],
      "title": "A Foundation Tale",
      "url": "http://www.scpwiki.com/a-foundation-tale"
    }
  ],
  "total": 5000,
  "limit": 10,
  "offset": 0
}
GET/api/scp/tales/[id]
Get details of a specific Tale
Parameters:
  • id - Tale identifier (link field) (e.g., incident-239-b-clef-kondraki)
  • exclude - Comma-separated list of fields to exclude from response (e.g., history)
Example Response
{
  "data": {
    "content_file": "content_2008.json",
    "created_at": "2008-08-21T08:13:00",
    "creator": "AdminBright",
    "domain": "scp-wiki.wikidot.com",
    "link": "incident-239-b-clef-kondraki",
    "page_id": 567,
    "rating": 892,
    "tags": [
      "tale",
      "dr-clef",
      "dr-kondraki",
      "scp-239"
    ],
    "title": "Incident 239-B - Clef-Kondraki",
    "url": "http://www.scpwiki.com/incident-239-b-clef-kondraki"
  }
}
GET/api/scp/tales/[id]/content
Get full content of a Tale including raw HTML and source
Parameters:
  • id - Tale identifier (e.g., incident-239-b-clef-kondraki)
  • exclude - Comma-separated list of fields to exclude from response (e.g., history)
Example Response
{
  "data": {
    "content_file": "content_2008.json",
    "created_at": "2008-08-21T08:13:00",
    "link": "incident-239-b-clef-kondraki",
    "title": "Incident 239-B - Clef-Kondraki",
    "raw_content": "<p>Dr. Clef walked into the containment chamber...</p>",
    "raw_source": "Dr. Clef walked into the containment chamber..."
  }
}

Hubs

GET/api/scp/hubs
List all Hubs (themed collections)
Parameters:
  • limit - Number of hubs to return (e.g., 10)
  • offset - Pagination offset (e.g., 0)
  • exclude - Comma-separated list of fields to exclude from response (e.g., references,tags)
Example Response
{
  "data": [
    {
      "content_file": "content_hubs.json",
      "created_at": "2015-03-15T14:20:00",
      "creator": "WrongJohnSilver",
      "domain": "scp-wiki.wikidot.com",
      "link": "broken-masquerade-hub",
      "page_id": 1234567,
      "rating": 234,
      "references": [
        "scp-001",
        "broken-masquerade"
      ],
      "tags": [
        "hub",
        "broken-masquerade"
      ],
      "title": "Broken Masquerade Hub",
      "url": "http://www.scpwiki.com/broken-masquerade-hub"
    }
  ],
  "total": 500,
  "limit": 10,
  "offset": 0
}
GET/api/scp/hubs/[id]
Get details of a specific Hub
Parameters:
  • id - Hub identifier (link field) (e.g., canon-hub)
  • exclude - Comma-separated list of fields to exclude from response (e.g., references)
Example Response
{
  "data": {
    "content_file": "content_hubs.json",
    "created_at": "2015-03-15T14:20:00",
    "creator": "WrongJohnSilver",
    "domain": "scp-wiki.wikidot.com",
    "link": "canon-hub",
    "page_id": 1234567,
    "rating": 234,
    "references": [
      "scp-001",
      "broken-masquerade"
    ],
    "tags": [
      "hub",
      "broken-masquerade"
    ],
    "title": "Broken Masquerade Hub",
    "url": "http://www.scpwiki.com/broken-masquerade-hub"
  }
}
GET/api/scp/hubs/[id]/content
Get full content of a Hub
Parameters:
  • id - Hub identifier (e.g., canon-hub)
  • exclude - Comma-separated list of fields to exclude from response (e.g., history)
Example Response
{
  "data": {
    "content_file": "content_hubs.json",
    "created_at": "2015-03-15T14:20:00",
    "creator": "WrongJohnSilver",
    "link": "canon-hub",
    "title": "Broken Masquerade Hub",
    "raw_content": "<html><body><div id=\"page-content\">...</div></body></html>"
  }
}

GOI

GET/api/scp/goi
List all GOI (Groups of Interest) articles
Parameters:
  • limit - Number of GOI articles to return (e.g., 10)
  • offset - Pagination offset (e.g., 0)
  • exclude - Comma-separated list of fields to exclude from response (e.g., history,tags)
Example Response
{
  "data": [
    {
      "created_at": "2014-07-01T23:35:00",
      "creator": "Dr Reach",
      "domain": "scp-wiki.wikidot.com",
      "hubs": [
        "goi-formats"
      ],
      "images": [],
      "link": "16th-wondertainment-donation",
      "page_id": "22840540",
      "rating": 118,
      "tags": [
        "_cc",
        "_manna-charitable-foundation",
        "dr-wondertainment",
        "featured",
        "goi-format",
        "goi2014"
      ],
      "title": "Sixteenth Wondertainment Donation - SCP Foundation",
      "url": "https://scp-wiki.wikidot.com/16th-wondertainment-donation"
    }
  ],
  "total": 100,
  "limit": 10,
  "offset": 0
}
GET/api/scp/goi/[id]
Get details of a specific GOI article (includes raw_content)
Parameters:
  • id - GOI article identifier (link field) (e.g., 10-30-a-m)
  • exclude - Comma-separated list of fields to exclude from response (e.g., history)
Example Response
{
  "data": {
    "created_at": "2014-07-01T23:35:00",
    "creator": "Dr Reach",
    "domain": "scp-wiki.wikidot.com",
    "hubs": [
      "goi-formats"
    ],
    "images": [],
    "link": "16th-wondertainment-donation",
    "page_id": "22840540",
    "rating": 118,
    "tags": [
      "_cc",
      "dr-wondertainment",
      "goi-format"
    ],
    "title": "Sixteenth Wondertainment Donation - SCP Foundation",
    "url": "https://scp-wiki.wikidot.com/16th-wondertainment-donation",
    "raw_content": "<div>GOI content...</div>",
    "raw_source": "GOI wikitext..."
  }
}
GET/api/scp/goi/[id]/content
Get full content of a GOI article
Parameters:
  • id - GOI article identifier (e.g., 10-30-a-m)
  • exclude - Comma-separated list of fields to exclude from response (e.g., history)
Example Response
{
  "data": {
    "link": "16th-wondertainment-donation",
    "title": "Sixteenth Wondertainment Donation - SCP Foundation",
    "raw_content": "<div>GOI content...</div>",
    "raw_source": "GOI wikitext..."
  }
}

Supplements

GET/api/scp/supplement
List all Supplement articles
Parameters:
  • limit - Number of supplements to return (e.g., 10)
  • offset - Pagination offset (e.g., 0)
  • exclude - Comma-separated list of fields to exclude from response (e.g., history,tags)
Example Response
{
  "data": [
    {
      "created_at": "2020-05-12T14:30:00",
      "creator": "AuthorName",
      "domain": "scp-wiki.wikidot.com",
      "hubs": [
        "supplemental-reading"
      ],
      "images": [],
      "link": "incident-096-1-a",
      "page_id": "98765",
      "rating": 156,
      "tags": [
        "supplement",
        "meta"
      ],
      "title": "Incident 096-1-A",
      "url": "https://scp-wiki.wikidot.com/incident-096-1-a"
    }
  ],
  "total": 250,
  "limit": 10,
  "offset": 0
}
GET/api/scp/supplement/[id]
Get details of a specific Supplement article (includes raw_content)
Parameters:
  • id - Supplement identifier (link field) (e.g., incident-096-1-a)
  • exclude - Comma-separated list of fields to exclude from response (e.g., history)
Example Response
{
  "data": {
    "created_at": "2020-05-12T14:30:00",
    "creator": "AuthorName",
    "domain": "scp-wiki.wikidot.com",
    "hubs": [
      "supplemental-reading"
    ],
    "images": [],
    "link": "incident-096-1-a",
    "page_id": "98765",
    "rating": 156,
    "tags": [
      "supplement",
      "meta"
    ],
    "title": "Incident 096-1-A",
    "url": "https://scp-wiki.wikidot.com/incident-096-1-a",
    "raw_content": "<div>Supplement content...</div>",
    "raw_source": "Supplement wikitext..."
  }
}
GET/api/scp/supplement/[id]/content
Get full content of a Supplement article
Parameters:
  • id - Supplement identifier (e.g., incident-096-1-a)
  • exclude - Comma-separated list of fields to exclude from response (e.g., history)
Example Response
{
  "data": {
    "link": "incident-096-1-a",
    "title": "Incident 096-1-A",
    "raw_content": "<div>Supplement content...</div>",
    "raw_source": "Supplement wikitext..."
  }
}
Usage Examples
Common API usage patterns with practical examples

Fetch paginated SCP items:

fetch('https://v0-scp-api.vercel.app/api/scp/items?limit=20&offset=40')

Exclude specific fields from response:

// Exclude history and tags to reduce response size fetch('https://v0-scp-api.vercel.app/api/scp/items/scp-173?exclude=history,tags,images')

Get a specific SCP with full content:

// First get metadata const item = await fetch('https://v0-scp-api.vercel.app/api/scp/items/scp-173').then(r => r.json()) // Then get full content const content = await fetch('https://v0-scp-api.vercel.app/api/scp/items/scp-173/content').then(r => r.json())

Search for SCP Items by keyword:

fetch('https://v0-scp-api.vercel.app/api/scp/search?q=keter&type=items')

Filter Tales by year:

fetch('https://v0-scp-api.vercel.app/api/scp/tales?year=2008&limit=50')

Get all hubs with pagination:

async function getAllHubs() { let allHubs = [] let offset = 0 const limit = 50 while (true) { const response = await fetch('https://v0-scp-api.vercel.app/api/scp/hubs?limit=${limit}&offset=${offset}') const data = await response.json() allHubs.push(...data.data) if (data.data.length < limit) break offset += limit } return allHubs }

Search with field exclusion for performance:

// Exclude heavy fields when you only need basic info fetch('https://v0-scp-api.vercel.app/api/scp/search?q=doctor+bright&type=all&exclude=history,references')

Get GOI articles with minimal data:

// Exclude raw_content and raw_source for listing fetch('https://v0-scp-api.vercel.app/api/scp/goi?limit=20&exclude=raw_content,raw_source,history')

Fetch paginated Supplement articles:

fetch('https://v0-scp-api.vercel.app/api/scp/supplement?limit=20&offset=40')

Get a specific Supplement article with full content:

// First get metadata const supplement = await fetch('https://v0-scp-api.vercel.app/api/scp/supplement/supplement-example').then(r => r.json()) // Then get full content const supplementContent = await fetch('https://v0-scp-api.vercel.app/api/scp/supplement/supplement-example/content').then(r => r.json())