SCP Foundation API

A complete REST API for SCP Wiki data - Items, Tales, Hubs, and Groups of Interest

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

Available Endpoints

GET/api/scp/items
List all SCP Items (metadata)
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/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..."
  }
}
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>"
  }
}
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"
  }
}
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": {
    "created_at": "2014-07-01T23:35:00",
    "creator": "Dr Reach",
    "link": "16th-wondertainment-donation",
    "title": "Sixteenth Wondertainment Donation - SCP Foundation",
    "raw_content": "<html><body><div id=\"page-content\">...</div></body></html>"
  }
}
GET/api/scp/search
Search across SCP content (items and tales)
Parameters:
  • q - Search query (e.g., statue)
  • type - Content type: 'items', 'tales', or 'all' (e.g., items)
  • limit - Number of results to return (e.g., 10)
  • 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
}
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')