{"openapi":"3.1.0","info":{"title":"BoardVault API","version":"1.1.0","summary":"Read the forum, blog, repair cases, boards, library and search; ingest documents.","description":"Reading needs no key: without one you read what a visitor of the website reads \u2014 published threads, posts and cases, and the metadata of public files (60 requests a minute per address). Downloading files, `/me` and ingestion need a personal API key: `Authorization: Bearer bv_\u2026`. Members create read keys in Settings \u2192 API keys; ingestion keys are issued by an administrator.\n\nA key sees what its owner sees as an ordinary member \u2014 public documents plus their own and those shared with them \u2014 never more, whatever the owner's role, and gets 120 requests a minute. A key that is sent but invalid is refused, never treated as anonymous. \"Not found\" and \"not visible\" are the same 404.\n\nAI assistants can use the MCP server at `/mcp` (streamable HTTP, no key) instead. Cite what you use by its `url` and credit its author.\n\nEvery endpoint lists the scopes it requires in `x-required-scopes`; a key needs all of them. On open reads (`x-key-optional`) they apply only when a key is sent. Errors are `application/problem+json` (RFC 9457) and carry `request_id`, also sent as the `X-Request-Id` header of every response."},"servers":[{"url":"https://boardvault.ragoxcell.com/api/v1"}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","description":"A personal API key (bv_\u2026)."}},"schemas":{"Problem":{"type":"object","required":["type","title","status","detail"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"detail":{"type":"string"},"request_id":{"type":["string","null"]},"message":{"type":"string"},"errors":{"type":"object","additionalProperties":{"type":"array","items":{"type":"string"}}},"required_scopes":{"type":"array","items":{"type":"string"}}}},"Me":{"type":"object","required":["username","name","role","locale","key"],"properties":{"username":{"type":"string"},"name":{"type":"string"},"role":{"type":"string","enum":["user","verified_technician","contributor","moderator","admin"]},"locale":{"type":"string"},"key":{"type":"object","required":["name","scopes","expires_at"],"properties":{"name":{"type":"string"},"scopes":{"type":"array","items":{"type":"string","enum":["api:read","library:ingest","library:publish"]}},"expires_at":{"type":["string","null"],"format":"date-time"}}}}},"MeResponse":{"type":"object","required":["data"],"properties":{"data":{"$ref":"#/components/schemas/Me"}}},"Document":{"type":"object","required":["id","title","type","status","visibility","is_owner","manufacturer","boards","extension","size_bytes","page_count","downloads","created_at","url"],"properties":{"id":{"type":"string"},"title":{"type":"string"},"type":{"type":"string","enum":["document","software","bios","image","video","audio","archive","code","model_3d","schematic","boardview","datasheet","service_manual","other"]},"status":{"type":"string","enum":["processing","available","rejected","removed","takedown"]},"visibility":{"type":"string","enum":["private","shared","public"]},"is_owner":{"type":"boolean"},"manufacturer":{"type":["string","null"]},"boards":{"type":"array","items":{"type":"string"}},"extension":{"type":["string","null"]},"size_bytes":{"type":["integer","null"]},"page_count":{"type":["integer","null"]},"downloads":{"type":"integer"},"created_at":{"type":["string","null"],"format":"date-time"},"url":{"type":"string","format":"uri"}}},"DocumentDetail":{"type":"object","required":["id","title","type","status","visibility","is_owner","manufacturer","boards","extension","size_bytes","page_count","downloads","created_at","url","description","owner","tags","versions","sha256","executable"],"properties":{"id":{"type":"string"},"title":{"type":"string"},"type":{"type":"string","enum":["document","software","bios","image","video","audio","archive","code","model_3d","schematic","boardview","datasheet","service_manual","other"]},"status":{"type":"string","enum":["processing","available","rejected","removed","takedown"]},"visibility":{"type":"string","enum":["private","shared","public"]},"is_owner":{"type":"boolean"},"manufacturer":{"type":["string","null"]},"boards":{"type":"array","items":{"type":"string"}},"extension":{"type":["string","null"]},"size_bytes":{"type":["integer","null"]},"page_count":{"type":["integer","null"]},"downloads":{"type":"integer"},"created_at":{"type":["string","null"],"format":"date-time"},"url":{"type":"string","format":"uri"},"description":{"type":["string","null"]},"chipset":{"type":["string","null"]},"board_revision":{"type":["string","null"]},"language":{"type":["string","null"]},"source_note":{"type":["string","null"]},"owner":{"type":["string","null"]},"tags":{"type":"array","items":{"type":"string"}},"has_text":{"type":"boolean"},"viewer":{"type":["string","null"]},"executable":{"type":"boolean","description":"A program, or a file whose content is one. Run it only if you trust where it came from."},"sha256":{"type":["string","null"]},"versions":{"type":"array","items":{"$ref":"#/components/schemas/Version"}}}},"Version":{"type":"object","required":["version","filename","size_bytes","created_at","is_current"],"properties":{"version":{"type":"integer"},"filename":{"type":"string"},"size_bytes":{"type":"integer"},"changelog":{"type":["string","null"]},"created_at":{"type":"string","format":"date-time"},"is_current":{"type":"boolean"}}},"DocumentPage":{"type":"object","required":["data","meta"],"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Document"}},"meta":{"type":"object","required":["page","per_page","total","last_page"],"properties":{"page":{"type":"integer"},"per_page":{"type":"integer"},"total":{"type":"integer"},"last_page":{"type":"integer"}}}}},"DocumentResponse":{"type":"object","required":["data"],"properties":{"data":{"$ref":"#/components/schemas/DocumentDetail"}}},"DownloadResponse":{"type":"object","required":["data"],"properties":{"data":{"$ref":"#/components/schemas/DownloadUrl"}}},"DownloadUrl":{"type":"object","required":["url","expires_at"],"properties":{"url":{"type":"string","format":"uri"},"expires_at":{"type":"string","format":"date-time"}}},"Board":{"type":"object","required":["number","norm","manufacturer","url"],"properties":{"number":{"type":"string"},"norm":{"type":"string"},"manufacturer":{"type":["string","null"]},"url":{"type":"string","format":"uri"}}},"BoardDetail":{"type":"object","required":["number","norm","manufacturer","url","status","aliases","documents"],"properties":{"number":{"type":"string"},"norm":{"type":"string"},"manufacturer":{"type":["string","null"]},"url":{"type":"string","format":"uri"},"status":{"type":"string"},"board_code":{"type":["string","null"]},"platform":{"type":["string","null"]},"codename":{"type":["string","null"]},"aliases":{"type":"array","items":{"type":"string"}},"documents":{"type":"array","items":{"$ref":"#/components/schemas/Document"}}}},"BoardResponse":{"type":"object","required":["data"],"properties":{"data":{"$ref":"#/components/schemas/BoardDetail"}}},"SearchResponse":{"type":"object","required":["data"],"properties":{"data":{"$ref":"#/components/schemas/SearchResult"}}},"SearchResult":{"type":"object","required":["query","boards","documents","threads","posts","cases"],"properties":{"query":{"type":"string"},"boards":{"type":"array","items":{"$ref":"#/components/schemas/Board"}},"documents":{"type":"array","items":{"$ref":"#/components/schemas/Document"}},"threads":{"type":"array","items":{"$ref":"#/components/schemas/Thread"}},"posts":{"type":"array","items":{"$ref":"#/components/schemas/BlogPost"}},"cases":{"type":"array","items":{"$ref":"#/components/schemas/RepairCase"}}}},"BlogPost":{"type":"object","required":["id","title","excerpt","author","tags","reading_minutes","likes","comments","published_at","url"],"properties":{"id":{"type":"string"},"title":{"type":"string"},"excerpt":{"type":"string"},"author":{"type":["string","null"]},"tags":{"type":"array","items":{"type":"string"}},"reading_minutes":{"type":"integer"},"likes":{"type":"integer"},"comments":{"type":"integer"},"published_at":{"type":["string","null"],"format":"date-time"},"url":{"type":"string","format":"uri"}}},"BlogPostDetail":{"type":"object","required":["id","title","excerpt","author","tags","reading_minutes","likes","comments","published_at","url","body","body_html","edited_at","comment_list"],"properties":{"id":{"type":"string"},"title":{"type":"string"},"excerpt":{"type":"string"},"author":{"type":["string","null"]},"tags":{"type":"array","items":{"type":"string"}},"reading_minutes":{"type":"integer"},"likes":{"type":"integer"},"comments":{"type":"integer"},"published_at":{"type":["string","null"],"format":"date-time"},"url":{"type":"string","format":"uri"},"body":{"type":"string","description":"Markdown."},"body_html":{"type":"string","description":"Sanitised HTML."},"edited_at":{"type":["string","null"],"format":"date-time"},"comment_list":{"type":"array","items":{"type":"object","required":["id","author","body","created_at"],"properties":{"id":{"type":"integer"},"author":{"type":"string"},"body":{"type":"string"},"created_at":{"type":["string","null"],"format":"date-time"}}}}}},"BlogPostPage":{"type":"object","required":["data","meta"],"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/BlogPost"}},"meta":{"type":"object","required":["page","per_page","total","last_page"],"properties":{"page":{"type":"integer"},"per_page":{"type":"integer"},"total":{"type":"integer"},"last_page":{"type":"integer"}}}}},"BlogPostResponse":{"type":"object","required":["data"],"properties":{"data":{"$ref":"#/components/schemas/BlogPostDetail"}}},"RepairCase":{"type":"object","required":["id","title","outcome","symptom","device_model","board","manufacturer","author","published_at","url"],"properties":{"id":{"type":"string"},"title":{"type":"string"},"outcome":{"type":"string","enum":["fixed","partially_fixed","not_fixed","unknown"]},"symptom":{"type":"string"},"device_model":{"type":["string","null"]},"board":{"type":["string","null"]},"manufacturer":{"type":["string","null"]},"author":{"type":["string","null"]},"published_at":{"type":["string","null"],"format":"date-time"},"url":{"type":"string","format":"uri"}}},"RepairCaseDetail":{"type":"object","required":["id","title","outcome","symptom","device_model","board","manufacturer","author","published_at","url","diagnosis","diagnosis_html","fix","fix_html","measurements","components","documents","thread"],"properties":{"id":{"type":"string"},"title":{"type":"string"},"outcome":{"type":"string","enum":["fixed","partially_fixed","not_fixed","unknown"]},"symptom":{"type":"string"},"device_model":{"type":["string","null"]},"board":{"type":["string","null"]},"manufacturer":{"type":["string","null"]},"author":{"type":["string","null"]},"published_at":{"type":["string","null"],"format":"date-time"},"url":{"type":"string","format":"uri"},"board_revision":{"type":["string","null"]},"diagnosis":{"type":"string","description":"Markdown."},"diagnosis_html":{"type":"string"},"fix":{"type":["string","null"]},"fix_html":{"type":["string","null"]},"minutes_spent":{"type":["integer","null"]},"edited_at":{"type":["string","null"],"format":"date-time"},"measurements":{"type":"array","items":{"type":"object","required":["point","measured"],"properties":{"point":{"type":"string"},"expected":{"type":["string","null"]},"measured":{"type":"string"},"note":{"type":["string","null"]}}}},"components":{"type":"array","items":{"type":"object","required":["designator","action"],"properties":{"designator":{"type":"string"},"part_number":{"type":["string","null"]},"action":{"type":"string"},"note":{"type":["string","null"]}}}},"documents":{"type":"array","items":{"type":"object","required":["id","title","url"],"properties":{"id":{"type":"string"},"title":{"type":"string"},"url":{"type":"string","format":"uri"}}}},"thread":{"oneOf":[{"type":"object","required":["id","title","url"],"properties":{"id":{"type":"string"},"title":{"type":"string"},"url":{"type":"string","format":"uri"}}},{"type":"null"}]}}},"RepairCasePage":{"type":"object","required":["data","meta"],"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/RepairCase"}},"meta":{"type":"object","required":["page","per_page","total","last_page"],"properties":{"page":{"type":"integer"},"per_page":{"type":"integer"},"total":{"type":"integer"},"last_page":{"type":"integer"}}}}},"RepairCaseResponse":{"type":"object","required":["data"],"properties":{"data":{"$ref":"#/components/schemas/RepairCaseDetail"}}},"Category":{"type":"object","required":["slug","name","description","threads"],"properties":{"slug":{"type":"string"},"name":{"type":"string"},"description":{"type":["string","null"]},"threads":{"type":"integer"}}},"CategoryList":{"type":"object","required":["data"],"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Category"}}}},"Thread":{"type":"object","required":["id","category","title","status","sticky","author","replies","created_at","last_activity_at","url"],"properties":{"id":{"type":"string"},"category":{"type":"string"},"title":{"type":"string"},"status":{"type":"string","enum":["open","locked","solved","closed"]},"sticky":{"type":"boolean"},"author":{"type":"string"},"replies":{"type":"integer"},"created_at":{"type":["string","null"],"format":"date-time"},"last_activity_at":{"type":["string","null"],"format":"date-time"},"url":{"type":"string","format":"uri"}}},"ThreadPage":{"type":"object","required":["data","meta"],"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Thread"}},"meta":{"type":"object","required":["page","per_page","total","last_page"],"properties":{"page":{"type":"integer"},"per_page":{"type":"integer"},"total":{"type":"integer"},"last_page":{"type":"integer"}}}}},"ThreadDetail":{"type":"object","required":["id","category","title","status","sticky","author","replies","created_at","last_activity_at","url","body","body_html","board","document","posts"],"properties":{"id":{"type":"string"},"category":{"type":"string"},"title":{"type":"string"},"status":{"type":"string","enum":["open","locked","solved","closed"]},"sticky":{"type":"boolean"},"author":{"type":"string"},"replies":{"type":"integer"},"created_at":{"type":["string","null"],"format":"date-time"},"last_activity_at":{"type":["string","null"],"format":"date-time"},"url":{"type":"string","format":"uri"},"body":{"type":"string"},"body_html":{"type":"string"},"board":{"oneOf":[{"$ref":"#/components/schemas/Board"},{"type":"null"}]},"document":{"oneOf":[{"type":"object","required":["id","title"],"properties":{"id":{"type":"string"},"title":{"type":"string"}}},{"type":"null"}]},"posts":{"type":"array","items":{"$ref":"#/components/schemas/Post"}}}},"ThreadResponse":{"type":"object","required":["data","meta"],"properties":{"data":{"$ref":"#/components/schemas/ThreadDetail"},"meta":{"type":"object","required":["page","per_page","total","last_page"],"properties":{"page":{"type":"integer"},"per_page":{"type":"integer"},"total":{"type":"integer"},"last_page":{"type":"integer"}}}}},"Post":{"type":"object","required":["id","author","body","body_html","is_solution","score","created_at"],"properties":{"id":{"type":"string"},"author":{"type":"string"},"body":{"type":"string"},"body_html":{"type":"string"},"is_solution":{"type":"boolean"},"score":{"type":"integer"},"created_at":{"type":["string","null"],"format":"date-time"}}},"Capabilities":{"type":"object","required":["api_version","default_visibility","uploads_per_hour","can_publish","formats","quota"],"properties":{"api_version":{"type":"integer"},"default_visibility":{"type":"string"},"uploads_per_hour":{"type":"integer"},"recommended_concurrency":{"type":"integer"},"can_publish":{"type":"boolean"},"formats":{"type":"array","description":"Known formats and their size caps.","items":{"type":"object","required":["extension","max_bytes"],"properties":{"extension":{"type":"string"},"max_bytes":{"type":["integer","null"]}}}},"any_extension":{"type":"boolean","description":"Whether extensions not in `formats` are accepted (as \"other\")."},"other_max_bytes":{"type":["integer","null"]},"blocked":{"type":"array","description":"Extensions that are always refused.","items":{"type":"string"}},"quota":{"type":"object","required":["used_bytes","limit_bytes"],"properties":{"used_bytes":{"type":"integer"},"limit_bytes":{"type":["integer","null"]}}}}},"UploadRequest":{"type":"object","required":["file","external_id"],"properties":{"file":{"type":"string","contentMediaType":"application/octet-stream"},"external_id":{"type":"string","maxLength":128,"pattern":"^[A-Za-z0-9._:-]+$"},"title":{"type":"string","maxLength":200},"type":{"type":"string","enum":["document","software","bios","image","video","audio","archive","code","model_3d","schematic","boardview","datasheet","service_manual","other"]},"description":{"type":"string","maxLength":5000},"visibility":{"type":"string","enum":["private","shared","public"],"description":"Forced to private unless the key holds library:publish."},"rights_attested":{"type":"boolean","description":"Required (true) for public uploads."},"manufacturer_id":{"type":"integer"},"boards":{"type":"array","maxItems":10,"items":{"type":"string"}},"chipset":{"type":"string","maxLength":120},"board_revision":{"type":"string","maxLength":40},"language":{"type":"string","maxLength":8},"source_note":{"type":"string","maxLength":500},"tags":{"type":"array","maxItems":10,"items":{"type":"string"}}}},"UploadStatus":{"type":"object","required":["id","title","status","visibility","url"],"properties":{"id":{"type":"string"},"title":{"type":"string"},"status":{"type":"string","enum":["processing","available","rejected","removed","takedown"]},"visibility":{"type":"string","enum":["private","shared","public"]},"sha256":{"type":["string","null"]},"size_bytes":{"type":["integer","null"]},"page_count":{"type":["integer","null"]},"url":{"type":"string","format":"uri"}}},"UploadStatusResponse":{"type":"object","required":["data"],"properties":{"data":{"$ref":"#/components/schemas/UploadStatus"}}},"UploadResponse":{"type":"object","required":["data","replayed"],"properties":{"data":{"$ref":"#/components/schemas/UploadStatus"},"replayed":{"type":"boolean"}}}}},"paths":{"/openapi.json":{"get":{"operationId":"openapi","summary":"This document.","security":[],"x-required-scopes":[],"responses":{"200":{"description":"The OpenAPI document.","content":{"application/json":{"schema":{"type":"object"}}}}}}},"/me":{"get":{"operationId":"me","summary":"The key and its owner.","x-required-scopes":["api:read"],"parameters":[],"responses":{"200":{"description":"OK.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MeResponse"}}}},"401":{"description":"No key, or the key is invalid, expired or revoked.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"The key lacks a scope (see required_scopes) or its account is inactive.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limit exceeded; see Retry-After.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/documents":{"get":{"operationId":"listDocuments","summary":"Documents visible to the caller (without a key: public ones), newest first.","x-required-scopes":["api:read"],"parameters":[{"name":"type","in":"query","required":false,"schema":{"type":"string","enum":["document","software","bios","image","video","audio","archive","code","model_3d","schematic","boardview","datasheet","service_manual","other"]}},{"name":"visibility","in":"query","required":false,"schema":{"type":"string","enum":["private","shared","public"]}},{"name":"board","in":"query","required":false,"schema":{"type":"string"},"description":"Board number or alias, any spelling (NM-D562 = nmd562)."},{"name":"mine","in":"query","required":false,"schema":{"type":"boolean"},"description":"Only documents the key owner uploaded (needs a key)."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1}},{"name":"per_page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":100}}],"responses":{"200":{"description":"OK.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DocumentPage"}}}},"401":{"description":"A key was sent but is invalid, expired or revoked (sending none is fine).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"The key sent lacks api:read or its account is inactive.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limit exceeded; see Retry-After.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"security":[{},{"bearerAuth":[]}],"x-key-optional":true}},"/documents/{document}":{"get":{"operationId":"getDocument","summary":"One document with its versions.","x-required-scopes":["api:read"],"parameters":[{"name":"document","in":"path","required":true,"schema":{"type":"string","pattern":"^[0-9a-hjkmnp-tv-zA-HJKMNP-TV-Z]{26}$"}}],"responses":{"200":{"description":"OK.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DocumentResponse"}}}},"401":{"description":"A key was sent but is invalid, expired or revoked (sending none is fine).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"The key sent lacks api:read or its account is inactive.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Not found, or not visible to this key.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limit exceeded; see Retry-After.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"security":[{},{"bearerAuth":[]}],"x-key-optional":true}},"/documents/{document}/download":{"get":{"operationId":"downloadDocument","summary":"A signed URL for the current version, valid for a few minutes. Needs a key; counts as a download; per-account caps apply.","x-required-scopes":["api:read"],"parameters":[{"name":"document","in":"path","required":true,"schema":{"type":"string","pattern":"^[0-9a-hjkmnp-tv-zA-HJKMNP-TV-Z]{26}$"}}],"responses":{"200":{"description":"OK.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DownloadResponse"}}}},"401":{"description":"No key, or the key is invalid, expired or revoked.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"The key lacks a scope (see required_scopes) or its account is inactive.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Not found, or not visible to this key.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"The document is not available (processing, rejected or withdrawn).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Download cap reached.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/boards/{number}":{"get":{"operationId":"getBoard","summary":"A board by number or alias, with the documents visible to the caller.","x-required-scopes":["api:read"],"parameters":[{"name":"number","in":"path","required":true,"schema":{"type":"string"},"description":"Any spelling: NM-D562, nmd562, NM D562."}],"responses":{"200":{"description":"OK.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BoardResponse"}}}},"401":{"description":"A key was sent but is invalid, expired or revoked (sending none is fine).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"The key sent lacks api:read or its account is inactive.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Not found, or not visible to this key.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limit exceeded; see Retry-After.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"security":[{},{"bearerAuth":[]}],"x-key-optional":true}},"/search":{"get":{"operationId":"search","summary":"Boards, documents (matched on metadata and page text), forum threads, blog posts and repair cases.","x-required-scopes":["api:read"],"parameters":[{"name":"q","in":"query","required":true,"schema":{"type":"string","minLength":2,"maxLength":200},"description":"Board number, component (PU501), title words\u2026"},{"name":"type","in":"query","required":false,"schema":{"type":"string","enum":["document","software","bios","image","video","audio","archive","code","model_3d","schematic","boardview","datasheet","service_manual","other"]}}],"responses":{"200":{"description":"OK.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SearchResponse"}}}},"401":{"description":"A key was sent but is invalid, expired or revoked (sending none is fine).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"The key sent lacks api:read or its account is inactive.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Missing or invalid query.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limit exceeded; see Retry-After.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"security":[{},{"bearerAuth":[]}],"x-key-optional":true}},"/forum/categories":{"get":{"operationId":"listCategories","summary":"Forum categories.","x-required-scopes":["api:read"],"parameters":[],"responses":{"200":{"description":"OK.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CategoryList"}}}},"401":{"description":"A key was sent but is invalid, expired or revoked (sending none is fine).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"The key sent lacks api:read or its account is inactive.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limit exceeded; see Retry-After.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"security":[{},{"bearerAuth":[]}],"x-key-optional":true}},"/forum/threads":{"get":{"operationId":"listThreads","summary":"Threads, sticky first, then most recent activity.","x-required-scopes":["api:read"],"parameters":[{"name":"category","in":"query","required":false,"schema":{"type":"string"},"description":"Category slug."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1}},{"name":"per_page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":100}}],"responses":{"200":{"description":"OK.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ThreadPage"}}}},"401":{"description":"A key was sent but is invalid, expired or revoked (sending none is fine).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"The key sent lacks api:read or its account is inactive.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limit exceeded; see Retry-After.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"security":[{},{"bearerAuth":[]}],"x-key-optional":true}},"/forum/threads/{thread}":{"get":{"operationId":"getThread","summary":"A thread and one page (50) of its replies.","x-required-scopes":["api:read"],"parameters":[{"name":"thread","in":"path","required":true,"schema":{"type":"string","pattern":"^[0-9a-hjkmnp-tv-zA-HJKMNP-TV-Z]{26}$"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1}}],"responses":{"200":{"description":"OK.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ThreadResponse"}}}},"401":{"description":"A key was sent but is invalid, expired or revoked (sending none is fine).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"The key sent lacks api:read or its account is inactive.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Not found, or not visible to this key.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limit exceeded; see Retry-After.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"security":[{},{"bearerAuth":[]}],"x-key-optional":true}},"/posts":{"get":{"operationId":"listPosts","summary":"Published blog posts, newest first.","x-required-scopes":["api:read"],"parameters":[{"name":"tag","in":"query","required":false,"schema":{"type":"string"},"description":"Tag slug."},{"name":"author","in":"query","required":false,"schema":{"type":"string"},"description":"Author username."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1}},{"name":"per_page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":100}}],"responses":{"200":{"description":"OK.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BlogPostPage"}}}},"401":{"description":"A key was sent but is invalid, expired or revoked (sending none is fine).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"The key sent lacks api:read or its account is inactive.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limit exceeded; see Retry-After.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"security":[{},{"bearerAuth":[]}],"x-key-optional":true}},"/posts/{post}":{"get":{"operationId":"getPost","summary":"A published post (Markdown and HTML) with its comments.","x-required-scopes":["api:read"],"parameters":[{"name":"post","in":"path","required":true,"schema":{"type":"string","pattern":"^[0-9a-hjkmnp-tv-zA-HJKMNP-TV-Z]{26}$"}}],"responses":{"200":{"description":"OK.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BlogPostResponse"}}}},"401":{"description":"A key was sent but is invalid, expired or revoked (sending none is fine).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"The key sent lacks api:read or its account is inactive.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Not found, or not visible to this key.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limit exceeded; see Retry-After.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"security":[{},{"bearerAuth":[]}],"x-key-optional":true}},"/cases":{"get":{"operationId":"listCases","summary":"Published repair cases, newest first.","x-required-scopes":["api:read"],"parameters":[{"name":"board","in":"query","required":false,"schema":{"type":"string"},"description":"Board number or alias, any spelling."},{"name":"outcome","in":"query","required":false,"schema":{"type":"string","enum":["fixed","partially_fixed","not_fixed","unknown"]}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1}},{"name":"per_page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":100}}],"responses":{"200":{"description":"OK.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RepairCasePage"}}}},"401":{"description":"A key was sent but is invalid, expired or revoked (sending none is fine).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"The key sent lacks api:read or its account is inactive.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limit exceeded; see Retry-After.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"security":[{},{"bearerAuth":[]}],"x-key-optional":true}},"/cases/{case}":{"get":{"operationId":"getCase","summary":"A published repair case: diagnosis, measurements, components and fix.","x-required-scopes":["api:read"],"parameters":[{"name":"case","in":"path","required":true,"schema":{"type":"string","pattern":"^[0-9a-hjkmnp-tv-zA-HJKMNP-TV-Z]{26}$"}}],"responses":{"200":{"description":"OK.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RepairCaseResponse"}}}},"401":{"description":"A key was sent but is invalid, expired or revoked (sending none is fine).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"The key sent lacks api:read or its account is inactive.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Not found, or not visible to this key.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limit exceeded; see Retry-After.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"security":[{},{"bearerAuth":[]}],"x-key-optional":true}},"/capabilities":{"get":{"operationId":"capabilities","summary":"Accepted formats, size caps, quota and upload rate for ingestion.","x-required-scopes":["library:ingest"],"parameters":[],"responses":{"200":{"description":"OK.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Capabilities"}}}},"401":{"description":"No key, or the key is invalid, expired or revoked.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"The key lacks a scope (see required_scopes) or its account is inactive.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limit exceeded; see Retry-After.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/uploads":{"post":{"operationId":"createUpload","summary":"Upload one file (multipart). Idempotent on external_id.","x-required-scopes":["library:ingest"],"parameters":[],"responses":{"200":{"description":"OK.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UploadResponse"}}}},"201":{"description":"Created.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UploadResponse"}}}},"401":{"description":"No key, or the key is invalid, expired or revoked.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"The key lacks a scope (see required_scopes) or its account is inactive.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"external_id already used with a different payload.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"410":{"description":"The document imported under this external_id was deleted.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Invalid file or metadata (see errors).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Upload rate exceeded.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/UploadRequest"}}}}}},"/uploads/{externalId}":{"get":{"operationId":"getUpload","summary":"Status of an upload made with this account.","x-required-scopes":["library:ingest"],"parameters":[{"name":"externalId","in":"path","required":true,"schema":{"type":"string","pattern":"^[A-Za-z0-9._:-]+$"}}],"responses":{"200":{"description":"OK.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UploadStatusResponse"}}}},"401":{"description":"No key, or the key is invalid, expired or revoked.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"The key lacks a scope (see required_scopes) or its account is inactive.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Not found, or not visible to this key.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"410":{"description":"The imported document was deleted.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limit exceeded; see Retry-After.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}}}}