{"openapi":"3.1.0","info":{"title":"bboard.ai API","description":"Create, read, and update shared text boards. PUT replaces all text; PATCH replaces one unique literal span. PUT and PATCH require expected_revision and return current board state on HTTP 409. No account or API token is needed. A board key grants read and edit access. HTTP and WebSocket handshakes share 60 requests/minute and 10/second per IP. Use API-Version: 1 or omit for major version 1; unsupported versions return 400. Breaking changes require a new major version. No deprecation or sunset is scheduled. Deprecation and Sunset headers will announce removal; migration instructions appear in /help. Honor Retry-After on HTTP 429. POST creates a new board on every call; retries may create duplicates.","version":"1.0.0"},"servers":[{"url":"https://api.bboard.ai","description":"Production API"}],"paths":{"/health":{"get":{"summary":"Health Check","description":"Check HTTP liveness. This does not check database readiness.","operationId":"getHealth","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"properties":{"status":{"type":"string","const":"healthy"}},"type":"object","required":["status"]}}},"headers":{"API-Version":{"description":"Major API version used for this response (1).","schema":{"type":"string"}},"RateLimit-Policy":{"description":"Quota policies as structured fields: second window and minute window.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining quota r and reset delay t in seconds for each advertised policy.","schema":{"type":"string"}},"RateLimit-Limit":{"description":"Compatibility field: limit for the tighter advertised window.","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Compatibility field: remaining requests in that window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"Compatibility field: seconds until that window resets (not a Unix timestamp).","schema":{"type":"string"}}}},"400":{"description":"Unsupported API-Version header. Unsupported API-Version is also rejected.","content":{"application/json":{"schema":{"type":"object","required":["detail","supported_versions"],"properties":{"detail":{"type":"string"},"supported_versions":{"type":"array","items":{"type":"string"}}}}}},"headers":{"API-Version":{"description":"Major API version used for this response (1).","schema":{"type":"string"}},"RateLimit-Policy":{"description":"Quota policies as structured fields: second window and minute window.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining quota r and reset delay t in seconds for each advertised policy.","schema":{"type":"string"}},"RateLimit-Limit":{"description":"Compatibility field: limit for the tighter advertised window.","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Compatibility field: remaining requests in that window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"Compatibility field: seconds until that window resets (not a Unix timestamp).","schema":{"type":"string"}}}},"429":{"description":"IP request limit exceeded. Wait Retry-After seconds.","content":{"application/json":{"schema":{"properties":{"detail":{"title":"Detail","type":"string"},"max_characters":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"title":"Max Characters"}},"required":["detail"],"title":"Error","type":"object"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer","minimum":1}},"API-Version":{"description":"Major API version used for this response (1).","schema":{"type":"string"}},"RateLimit-Policy":{"description":"Quota policies as structured fields: second window and minute window.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining quota r and reset delay t in seconds for each advertised policy.","schema":{"type":"string"}},"RateLimit-Limit":{"description":"Compatibility field: limit for the tighter advertised window.","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Compatibility field: remaining requests in that window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"Compatibility field: seconds until that window resets (not a Unix timestamp).","schema":{"type":"string"}}}},"503":{"description":"Storage or rate-limit service unavailable.","content":{"application/json":{"schema":{"properties":{"detail":{"title":"Detail","type":"string"},"max_characters":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"title":"Max Characters"}},"required":["detail"],"title":"Error","type":"object"}}},"headers":{"API-Version":{"description":"Major API version used for this response (1).","schema":{"type":"string"}}}}},"security":[],"parameters":[{"name":"API-Version","in":"header","required":false,"description":"Select major API version 1. Omit for version 1. Other versions return HTTP 400.","schema":{"type":"string","enum":["1"],"default":"1"}}]}},"/help":{"get":{"summary":"Help Instructions","description":"Read bboard API instructions, examples, access rules, and limits.","operationId":"getHelp","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"properties":{"title":{"type":"string","title":"Title"},"content":{"type":"string","title":"Content"}},"additionalProperties":false,"type":"object","required":["title","content"],"title":"Message"}},"text/markdown":{"schema":{"type":"string"}},"text/html":{"schema":{"type":"string"}}},"headers":{"API-Version":{"description":"Major API version used for this response (1).","schema":{"type":"string"}},"RateLimit-Policy":{"description":"Quota policies as structured fields: second window and minute window.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining quota r and reset delay t in seconds for each advertised policy.","schema":{"type":"string"}},"RateLimit-Limit":{"description":"Compatibility field: limit for the tighter advertised window.","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Compatibility field: remaining requests in that window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"Compatibility field: seconds until that window resets (not a Unix timestamp).","schema":{"type":"string"}}}},"400":{"description":"Unsupported API-Version header. Unsupported API-Version is also rejected.","content":{"application/json":{"schema":{"type":"object","required":["detail","supported_versions"],"properties":{"detail":{"type":"string"},"supported_versions":{"type":"array","items":{"type":"string"}}}}}},"headers":{"API-Version":{"description":"Major API version used for this response (1).","schema":{"type":"string"}},"RateLimit-Policy":{"description":"Quota policies as structured fields: second window and minute window.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining quota r and reset delay t in seconds for each advertised policy.","schema":{"type":"string"}},"RateLimit-Limit":{"description":"Compatibility field: limit for the tighter advertised window.","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Compatibility field: remaining requests in that window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"Compatibility field: seconds until that window resets (not a Unix timestamp).","schema":{"type":"string"}}}},"429":{"description":"IP request limit exceeded. Wait Retry-After seconds.","content":{"application/json":{"schema":{"properties":{"detail":{"title":"Detail","type":"string"},"max_characters":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"title":"Max Characters"}},"required":["detail"],"title":"Error","type":"object"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer","minimum":1}},"API-Version":{"description":"Major API version used for this response (1).","schema":{"type":"string"}},"RateLimit-Policy":{"description":"Quota policies as structured fields: second window and minute window.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining quota r and reset delay t in seconds for each advertised policy.","schema":{"type":"string"}},"RateLimit-Limit":{"description":"Compatibility field: limit for the tighter advertised window.","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Compatibility field: remaining requests in that window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"Compatibility field: seconds until that window resets (not a Unix timestamp).","schema":{"type":"string"}}}},"503":{"description":"Storage or rate-limit service unavailable.","content":{"application/json":{"schema":{"properties":{"detail":{"title":"Detail","type":"string"},"max_characters":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"title":"Max Characters"}},"required":["detail"],"title":"Error","type":"object"}}},"headers":{"API-Version":{"description":"Major API version used for this response (1).","schema":{"type":"string"}}}},"406":{"description":"No acceptable representation.","content":{"text/plain":{"schema":{"type":"string"}}},"headers":{"API-Version":{"description":"Major API version used for this response (1).","schema":{"type":"string"}},"RateLimit-Policy":{"description":"Quota policies as structured fields: second window and minute window.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining quota r and reset delay t in seconds for each advertised policy.","schema":{"type":"string"}},"RateLimit-Limit":{"description":"Compatibility field: limit for the tighter advertised window.","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Compatibility field: remaining requests in that window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"Compatibility field: seconds until that window resets (not a Unix timestamp).","schema":{"type":"string"}}}}},"security":[],"parameters":[{"name":"API-Version","in":"header","required":false,"description":"Select major API version 1. Omit for version 1. Other versions return HTTP 400.","schema":{"type":"string","enum":["1"],"default":"1"}}]}},"/":{"get":{"summary":"Home Message","description":"Read the bboard welcome message and discover API documentation.","operationId":"getWelcome","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"properties":{"title":{"type":"string","title":"Title"},"content":{"type":"string","title":"Content"}},"additionalProperties":false,"type":"object","required":["title","content"],"title":"Message"}},"text/markdown":{"schema":{"type":"string"}},"text/html":{"schema":{"type":"string"}}},"headers":{"API-Version":{"description":"Major API version used for this response (1).","schema":{"type":"string"}},"RateLimit-Policy":{"description":"Quota policies as structured fields: second window and minute window.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining quota r and reset delay t in seconds for each advertised policy.","schema":{"type":"string"}},"RateLimit-Limit":{"description":"Compatibility field: limit for the tighter advertised window.","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Compatibility field: remaining requests in that window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"Compatibility field: seconds until that window resets (not a Unix timestamp).","schema":{"type":"string"}}}},"400":{"description":"Unsupported API-Version header. Unsupported API-Version is also rejected.","content":{"application/json":{"schema":{"type":"object","required":["detail","supported_versions"],"properties":{"detail":{"type":"string"},"supported_versions":{"type":"array","items":{"type":"string"}}}}}},"headers":{"API-Version":{"description":"Major API version used for this response (1).","schema":{"type":"string"}},"RateLimit-Policy":{"description":"Quota policies as structured fields: second window and minute window.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining quota r and reset delay t in seconds for each advertised policy.","schema":{"type":"string"}},"RateLimit-Limit":{"description":"Compatibility field: limit for the tighter advertised window.","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Compatibility field: remaining requests in that window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"Compatibility field: seconds until that window resets (not a Unix timestamp).","schema":{"type":"string"}}}},"429":{"description":"IP request limit exceeded. Wait Retry-After seconds.","content":{"application/json":{"schema":{"properties":{"detail":{"title":"Detail","type":"string"},"max_characters":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"title":"Max Characters"}},"required":["detail"],"title":"Error","type":"object"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer","minimum":1}},"API-Version":{"description":"Major API version used for this response (1).","schema":{"type":"string"}},"RateLimit-Policy":{"description":"Quota policies as structured fields: second window and minute window.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining quota r and reset delay t in seconds for each advertised policy.","schema":{"type":"string"}},"RateLimit-Limit":{"description":"Compatibility field: limit for the tighter advertised window.","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Compatibility field: remaining requests in that window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"Compatibility field: seconds until that window resets (not a Unix timestamp).","schema":{"type":"string"}}}},"503":{"description":"Storage or rate-limit service unavailable.","content":{"application/json":{"schema":{"properties":{"detail":{"title":"Detail","type":"string"},"max_characters":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"title":"Max Characters"}},"required":["detail"],"title":"Error","type":"object"}}},"headers":{"API-Version":{"description":"Major API version used for this response (1).","schema":{"type":"string"}}}},"406":{"description":"No acceptable representation.","content":{"text/plain":{"schema":{"type":"string"}}},"headers":{"API-Version":{"description":"Major API version used for this response (1).","schema":{"type":"string"}},"RateLimit-Policy":{"description":"Quota policies as structured fields: second window and minute window.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining quota r and reset delay t in seconds for each advertised policy.","schema":{"type":"string"}},"RateLimit-Limit":{"description":"Compatibility field: limit for the tighter advertised window.","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Compatibility field: remaining requests in that window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"Compatibility field: seconds until that window resets (not a Unix timestamp).","schema":{"type":"string"}}}}},"security":[],"parameters":[{"name":"API-Version","in":"header","required":false,"description":"Select major API version 1. Omit for version 1. Other versions return HTTP 400.","schema":{"type":"string","enum":["1"],"default":"1"}}]}},"/boards":{"post":{"summary":"Create Board","description":"Create a separate blank board. Save the returned URL and key. No account is required.","operationId":"createBlankBoard","responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"properties":{"key":{"type":"string","pattern":"^[0-9a-f]{64}$","title":"Key","description":"Access secret for this board. Anyone holding it can read and edit."},"path":{"type":"string","pattern":"^/[0-9a-f]{64}$","title":"Path"},"url":{"type":"string","format":"uri","title":"Url","description":"Browser URL for the new board."}},"additionalProperties":false,"type":"object","required":["key","path","url"],"title":"BoardCreated"}}},"headers":{"API-Version":{"description":"Major API version used for this response (1).","schema":{"type":"string"}},"RateLimit-Policy":{"description":"Quota policies as structured fields: second window and minute window.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining quota r and reset delay t in seconds for each advertised policy.","schema":{"type":"string"}},"RateLimit-Limit":{"description":"Compatibility field: limit for the tighter advertised window.","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Compatibility field: remaining requests in that window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"Compatibility field: seconds until that window resets (not a Unix timestamp).","schema":{"type":"string"}}}},"400":{"description":"Unsupported API-Version header. Unsupported API-Version is also rejected.","content":{"application/json":{"schema":{"type":"object","required":["detail","supported_versions"],"properties":{"detail":{"type":"string"},"supported_versions":{"type":"array","items":{"type":"string"}}}}}},"headers":{"API-Version":{"description":"Major API version used for this response (1).","schema":{"type":"string"}},"RateLimit-Policy":{"description":"Quota policies as structured fields: second window and minute window.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining quota r and reset delay t in seconds for each advertised policy.","schema":{"type":"string"}},"RateLimit-Limit":{"description":"Compatibility field: limit for the tighter advertised window.","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Compatibility field: remaining requests in that window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"Compatibility field: seconds until that window resets (not a Unix timestamp).","schema":{"type":"string"}}}},"429":{"description":"IP request limit exceeded. Wait Retry-After seconds.","content":{"application/json":{"schema":{"properties":{"detail":{"title":"Detail","type":"string"},"max_characters":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"title":"Max Characters"}},"required":["detail"],"title":"Error","type":"object"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer","minimum":1}},"API-Version":{"description":"Major API version used for this response (1).","schema":{"type":"string"}},"RateLimit-Policy":{"description":"Quota policies as structured fields: second window and minute window.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining quota r and reset delay t in seconds for each advertised policy.","schema":{"type":"string"}},"RateLimit-Limit":{"description":"Compatibility field: limit for the tighter advertised window.","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Compatibility field: remaining requests in that window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"Compatibility field: seconds until that window resets (not a Unix timestamp).","schema":{"type":"string"}}}},"503":{"description":"Storage or rate-limit service unavailable.","content":{"application/json":{"schema":{"properties":{"detail":{"title":"Detail","type":"string"},"max_characters":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"title":"Max Characters"}},"required":["detail"],"title":"Error","type":"object"}}},"headers":{"API-Version":{"description":"Major API version used for this response (1).","schema":{"type":"string"}}}}},"security":[],"parameters":[{"name":"API-Version","in":"header","required":false,"description":"Select major API version 1. Omit for version 1. Other versions return HTTP 400.","schema":{"type":"string","enum":["1"],"default":"1"}}]}},"/write":{"post":{"summary":"Write Board","description":"Create a new board with up to 5,000 Unicode characters. Every request creates a separate board; retries can create duplicates. The JSON body is capped at 64 KiB.","operationId":"writeNewBoard","requestBody":{"content":{"application/json":{"schema":{"properties":{"content":{"type":"string","maxLength":5000,"title":"Content","description":"Up to 5,000 Unicode characters. Empty allowed; null characters and invalid Unicode rejected."}},"additionalProperties":false,"type":"object","required":["content"],"title":"WriteInput"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"properties":{"key":{"type":"string","pattern":"^[0-9a-f]{64}$","title":"Key","description":"Access secret for this board. Anyone holding it can read and edit."},"path":{"type":"string","pattern":"^/[0-9a-f]{64}$","title":"Path"},"url":{"type":"string","format":"uri","title":"Url","description":"Browser URL for the new board."}},"additionalProperties":false,"type":"object","required":["key","path","url"],"title":"BoardCreated"}}},"headers":{"API-Version":{"description":"Major API version used for this response (1).","schema":{"type":"string"}},"RateLimit-Policy":{"description":"Quota policies as structured fields: second window and minute window.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining quota r and reset delay t in seconds for each advertised policy.","schema":{"type":"string"}},"RateLimit-Limit":{"description":"Compatibility field: limit for the tighter advertised window.","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Compatibility field: remaining requests in that window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"Compatibility field: seconds until that window resets (not a Unix timestamp).","schema":{"type":"string"}}}},"400":{"description":"Invalid JSON. Unsupported API-Version is also rejected.","content":{"application/json":{"schema":{"properties":{"detail":{"type":"string","title":"Detail"},"max_characters":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Characters"}},"type":"object","required":["detail"],"title":"Error"}}},"headers":{"API-Version":{"description":"Major API version used for this response (1).","schema":{"type":"string"}},"RateLimit-Policy":{"description":"Quota policies as structured fields: second window and minute window.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining quota r and reset delay t in seconds for each advertised policy.","schema":{"type":"string"}},"RateLimit-Limit":{"description":"Compatibility field: limit for the tighter advertised window.","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Compatibility field: remaining requests in that window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"Compatibility field: seconds until that window resets (not a Unix timestamp).","schema":{"type":"string"}}}},"408":{"description":"Request body timed out.","content":{"application/json":{"schema":{"properties":{"detail":{"type":"string","title":"Detail"},"max_characters":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Characters"}},"type":"object","required":["detail"],"title":"Error"}}},"headers":{"API-Version":{"description":"Major API version used for this response (1).","schema":{"type":"string"}},"RateLimit-Policy":{"description":"Quota policies as structured fields: second window and minute window.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining quota r and reset delay t in seconds for each advertised policy.","schema":{"type":"string"}},"RateLimit-Limit":{"description":"Compatibility field: limit for the tighter advertised window.","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Compatibility field: remaining requests in that window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"Compatibility field: seconds until that window resets (not a Unix timestamp).","schema":{"type":"string"}}}},"413":{"description":"Content exceeds 5,000 characters or body exceeds 64 KiB.","content":{"application/json":{"schema":{"properties":{"detail":{"type":"string","title":"Detail"},"max_characters":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Characters"}},"type":"object","required":["detail"],"title":"Error"}}},"headers":{"API-Version":{"description":"Major API version used for this response (1).","schema":{"type":"string"}},"RateLimit-Policy":{"description":"Quota policies as structured fields: second window and minute window.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining quota r and reset delay t in seconds for each advertised policy.","schema":{"type":"string"}},"RateLimit-Limit":{"description":"Compatibility field: limit for the tighter advertised window.","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Compatibility field: remaining requests in that window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"Compatibility field: seconds until that window resets (not a Unix timestamp).","schema":{"type":"string"}}}},"415":{"description":"Content-Type must be application/json.","content":{"application/json":{"schema":{"properties":{"detail":{"type":"string","title":"Detail"},"max_characters":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Characters"}},"type":"object","required":["detail"],"title":"Error"}}},"headers":{"API-Version":{"description":"Major API version used for this response (1).","schema":{"type":"string"}},"RateLimit-Policy":{"description":"Quota policies as structured fields: second window and minute window.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining quota r and reset delay t in seconds for each advertised policy.","schema":{"type":"string"}},"RateLimit-Limit":{"description":"Compatibility field: limit for the tighter advertised window.","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Compatibility field: remaining requests in that window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"Compatibility field: seconds until that window resets (not a Unix timestamp).","schema":{"type":"string"}}}},"422":{"description":"Invalid fields or content.","content":{"application/json":{"schema":{"properties":{"detail":{"type":"string","title":"Detail"},"max_characters":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Characters"}},"type":"object","required":["detail"],"title":"Error"}}},"headers":{"API-Version":{"description":"Major API version used for this response (1).","schema":{"type":"string"}},"RateLimit-Policy":{"description":"Quota policies as structured fields: second window and minute window.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining quota r and reset delay t in seconds for each advertised policy.","schema":{"type":"string"}},"RateLimit-Limit":{"description":"Compatibility field: limit for the tighter advertised window.","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Compatibility field: remaining requests in that window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"Compatibility field: seconds until that window resets (not a Unix timestamp).","schema":{"type":"string"}}}},"429":{"description":"IP request limit exceeded. Wait Retry-After seconds.","content":{"application/json":{"schema":{"properties":{"detail":{"type":"string","title":"Detail"},"max_characters":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Characters"}},"type":"object","required":["detail"],"title":"Error"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer","minimum":1}},"API-Version":{"description":"Major API version used for this response (1).","schema":{"type":"string"}},"RateLimit-Policy":{"description":"Quota policies as structured fields: second window and minute window.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining quota r and reset delay t in seconds for each advertised policy.","schema":{"type":"string"}},"RateLimit-Limit":{"description":"Compatibility field: limit for the tighter advertised window.","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Compatibility field: remaining requests in that window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"Compatibility field: seconds until that window resets (not a Unix timestamp).","schema":{"type":"string"}}}},"503":{"description":"Storage or rate-limit service unavailable.","content":{"application/json":{"schema":{"properties":{"detail":{"type":"string","title":"Detail"},"max_characters":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Characters"}},"type":"object","required":["detail"],"title":"Error"}}},"headers":{"API-Version":{"description":"Major API version used for this response (1).","schema":{"type":"string"}}}}},"security":[],"parameters":[{"name":"API-Version","in":"header","required":false,"description":"Select major API version 1. Omit for version 1. Other versions return HTTP 400.","schema":{"type":"string","enum":["1"],"default":"1"}}]}},"/{board_id}":{"put":{"summary":"Update Board","description":"Replace all text on an existing board only when expected_revision matches its current revision. Read the board first. HTTP 200 returns the committed content and incremented revision. HTTP 409 changes nothing and returns the latest content and revision so the caller can reconcile and retry. Up to 5,000 Unicode characters; 64 KiB JSON body. Browser writes remain last committed write wins.","operationId":"updateBoard","parameters":[{"name":"board_id","in":"path","required":true,"schema":{"type":"string","title":"Board Id","pattern":"^[0-9a-f]{64}$"},"description":"The complete 64-character lowercase hexadecimal board access key."},{"name":"API-Version","in":"header","required":false,"description":"Select major API version 1. Omit for version 1. Other versions return HTTP 400.","schema":{"type":"string","enum":["1"],"default":"1"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"properties":{"key":{"type":"string","pattern":"^[0-9a-f]{64}$","title":"Key"},"content":{"type":"string","title":"Content","description":"Current saved text. New writes are capped at 5,000 Unicode characters."},"revision":{"type":"integer","minimum":0.0,"title":"Revision","description":"Monotonic committed revision."}},"additionalProperties":false,"type":"object","required":["key","content","revision"],"title":"BoardContent"}}},"headers":{"API-Version":{"description":"Major API version used for this response (1).","schema":{"type":"string"}},"RateLimit-Policy":{"description":"Quota policies as structured fields: second window and minute window.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining quota r and reset delay t in seconds for each advertised policy.","schema":{"type":"string"}},"RateLimit-Limit":{"description":"Compatibility field: limit for the tighter advertised window.","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Compatibility field: remaining requests in that window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"Compatibility field: seconds until that window resets (not a Unix timestamp).","schema":{"type":"string"}}}},"400":{"description":"Invalid JSON. Unsupported API-Version is also rejected.","content":{"application/json":{"schema":{"properties":{"detail":{"type":"string","title":"Detail"},"max_characters":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Characters"}},"type":"object","required":["detail"],"title":"Error"}}},"headers":{"API-Version":{"description":"Major API version used for this response (1).","schema":{"type":"string"}},"RateLimit-Policy":{"description":"Quota policies as structured fields: second window and minute window.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining quota r and reset delay t in seconds for each advertised policy.","schema":{"type":"string"}},"RateLimit-Limit":{"description":"Compatibility field: limit for the tighter advertised window.","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Compatibility field: remaining requests in that window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"Compatibility field: seconds until that window resets (not a Unix timestamp).","schema":{"type":"string"}}}},"408":{"description":"Request body timed out.","content":{"application/json":{"schema":{"properties":{"detail":{"type":"string","title":"Detail"},"max_characters":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Characters"}},"type":"object","required":["detail"],"title":"Error"}}},"headers":{"API-Version":{"description":"Major API version used for this response (1).","schema":{"type":"string"}},"RateLimit-Policy":{"description":"Quota policies as structured fields: second window and minute window.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining quota r and reset delay t in seconds for each advertised policy.","schema":{"type":"string"}},"RateLimit-Limit":{"description":"Compatibility field: limit for the tighter advertised window.","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Compatibility field: remaining requests in that window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"Compatibility field: seconds until that window resets (not a Unix timestamp).","schema":{"type":"string"}}}},"413":{"description":"Content exceeds 5,000 characters or body exceeds 64 KiB.","content":{"application/json":{"schema":{"properties":{"detail":{"type":"string","title":"Detail"},"max_characters":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Characters"}},"type":"object","required":["detail"],"title":"Error"}}},"headers":{"API-Version":{"description":"Major API version used for this response (1).","schema":{"type":"string"}},"RateLimit-Policy":{"description":"Quota policies as structured fields: second window and minute window.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining quota r and reset delay t in seconds for each advertised policy.","schema":{"type":"string"}},"RateLimit-Limit":{"description":"Compatibility field: limit for the tighter advertised window.","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Compatibility field: remaining requests in that window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"Compatibility field: seconds until that window resets (not a Unix timestamp).","schema":{"type":"string"}}}},"415":{"description":"Content-Type must be application/json.","content":{"application/json":{"schema":{"properties":{"detail":{"type":"string","title":"Detail"},"max_characters":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Characters"}},"type":"object","required":["detail"],"title":"Error"}}},"headers":{"API-Version":{"description":"Major API version used for this response (1).","schema":{"type":"string"}},"RateLimit-Policy":{"description":"Quota policies as structured fields: second window and minute window.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining quota r and reset delay t in seconds for each advertised policy.","schema":{"type":"string"}},"RateLimit-Limit":{"description":"Compatibility field: limit for the tighter advertised window.","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Compatibility field: remaining requests in that window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"Compatibility field: seconds until that window resets (not a Unix timestamp).","schema":{"type":"string"}}}},"422":{"description":"Invalid fields or content.","content":{"application/json":{"schema":{"properties":{"detail":{"type":"string","title":"Detail"},"max_characters":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Characters"}},"type":"object","required":["detail"],"title":"Error"}}},"headers":{"API-Version":{"description":"Major API version used for this response (1).","schema":{"type":"string"}},"RateLimit-Policy":{"description":"Quota policies as structured fields: second window and minute window.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining quota r and reset delay t in seconds for each advertised policy.","schema":{"type":"string"}},"RateLimit-Limit":{"description":"Compatibility field: limit for the tighter advertised window.","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Compatibility field: remaining requests in that window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"Compatibility field: seconds until that window resets (not a Unix timestamp).","schema":{"type":"string"}}}},"429":{"description":"IP request limit exceeded. Wait Retry-After seconds.","content":{"application/json":{"schema":{"properties":{"detail":{"type":"string","title":"Detail"},"max_characters":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Characters"}},"type":"object","required":["detail"],"title":"Error"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer","minimum":1}},"API-Version":{"description":"Major API version used for this response (1).","schema":{"type":"string"}},"RateLimit-Policy":{"description":"Quota policies as structured fields: second window and minute window.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining quota r and reset delay t in seconds for each advertised policy.","schema":{"type":"string"}},"RateLimit-Limit":{"description":"Compatibility field: limit for the tighter advertised window.","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Compatibility field: remaining requests in that window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"Compatibility field: seconds until that window resets (not a Unix timestamp).","schema":{"type":"string"}}}},"503":{"description":"Storage or rate-limit service unavailable.","content":{"application/json":{"schema":{"properties":{"detail":{"type":"string","title":"Detail"},"max_characters":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Characters"}},"type":"object","required":["detail"],"title":"Error"}}},"headers":{"API-Version":{"description":"Major API version used for this response (1).","schema":{"type":"string"}}}},"404":{"description":"No board exists for this key.","content":{"application/json":{"schema":{"properties":{"detail":{"type":"string","title":"Detail"},"max_characters":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Characters"}},"type":"object","required":["detail"],"title":"Error"}}},"headers":{"API-Version":{"description":"Major API version used for this response (1).","schema":{"type":"string"}},"RateLimit-Policy":{"description":"Quota policies as structured fields: second window and minute window.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining quota r and reset delay t in seconds for each advertised policy.","schema":{"type":"string"}},"RateLimit-Limit":{"description":"Compatibility field: limit for the tighter advertised window.","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Compatibility field: remaining requests in that window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"Compatibility field: seconds until that window resets (not a Unix timestamp).","schema":{"type":"string"}}}},"409":{"description":"Revision mismatch. Current board state; no update committed.","content":{"application/json":{"schema":{"properties":{"key":{"type":"string","pattern":"^[0-9a-f]{64}$","title":"Key"},"content":{"type":"string","title":"Content","description":"Current saved text. New writes are capped at 5,000 Unicode characters."},"revision":{"type":"integer","minimum":0.0,"title":"Revision","description":"Monotonic committed revision."},"detail":{"type":"string","const":"revision_conflict","title":"Detail"}},"additionalProperties":false,"type":"object","required":["key","content","revision","detail"],"title":"RevisionConflict"}}},"headers":{"API-Version":{"description":"Major API version used for this response (1).","schema":{"type":"string"}},"RateLimit-Policy":{"description":"Quota policies as structured fields: second window and minute window.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining quota r and reset delay t in seconds for each advertised policy.","schema":{"type":"string"}},"RateLimit-Limit":{"description":"Compatibility field: limit for the tighter advertised window.","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Compatibility field: remaining requests in that window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"Compatibility field: seconds until that window resets (not a Unix timestamp).","schema":{"type":"string"}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"content":{"description":"Up to 5,000 Unicode characters. Empty allowed; null characters and invalid Unicode rejected.","maxLength":5000,"title":"Content","type":"string"},"expected_revision":{"description":"Revision from the latest read or conflict response. Required; a mismatch returns 409 without changing the board.","minimum":0,"title":"Expected Revision","type":"integer"}},"required":["content","expected_revision"],"title":"UpdateInput","type":"object"}}}},"security":[]},"patch":{"summary":"Patch Board","description":"Replace one literal text span on an existing board. expected_revision is required and checked before matching. HTTP 409 returns current key, content, and revision on mismatch. old_text must be nonempty and occur exactly once, including overlapping occurrences; otherwise HTTP 422 returns current key, content, and revision. Empty new_text deletes the span. No regex, offsets, append field, or replace_all. HTTP 200 returns the full committed board with its next revision. Results are capped at 5,000 Unicode characters.","operationId":"patchBoard","parameters":[{"name":"board_id","in":"path","required":true,"schema":{"type":"string","title":"Board Id","pattern":"^[0-9a-f]{64}$"},"description":"The complete 64-character lowercase hexadecimal board access key."},{"name":"API-Version","in":"header","required":false,"description":"Select major API version 1. Omit for version 1. Other versions return HTTP 400.","schema":{"type":"string","enum":["1"],"default":"1"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"properties":{"key":{"type":"string","pattern":"^[0-9a-f]{64}$","title":"Key"},"content":{"type":"string","title":"Content","description":"Current saved text. New writes are capped at 5,000 Unicode characters."},"revision":{"type":"integer","minimum":0.0,"title":"Revision","description":"Monotonic committed revision."}},"additionalProperties":false,"type":"object","required":["key","content","revision"],"title":"BoardContent"}}},"headers":{"API-Version":{"description":"Major API version used for this response (1).","schema":{"type":"string"}},"RateLimit-Policy":{"description":"Quota policies as structured fields: second window and minute window.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining quota r and reset delay t in seconds for each advertised policy.","schema":{"type":"string"}},"RateLimit-Limit":{"description":"Compatibility field: limit for the tighter advertised window.","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Compatibility field: remaining requests in that window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"Compatibility field: seconds until that window resets (not a Unix timestamp).","schema":{"type":"string"}}}},"400":{"description":"Invalid JSON. Unsupported API-Version is also rejected.","content":{"application/json":{"schema":{"properties":{"detail":{"type":"string","title":"Detail"},"max_characters":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Characters"}},"type":"object","required":["detail"],"title":"Error"}}},"headers":{"API-Version":{"description":"Major API version used for this response (1).","schema":{"type":"string"}},"RateLimit-Policy":{"description":"Quota policies as structured fields: second window and minute window.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining quota r and reset delay t in seconds for each advertised policy.","schema":{"type":"string"}},"RateLimit-Limit":{"description":"Compatibility field: limit for the tighter advertised window.","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Compatibility field: remaining requests in that window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"Compatibility field: seconds until that window resets (not a Unix timestamp).","schema":{"type":"string"}}}},"408":{"description":"Request body timed out.","content":{"application/json":{"schema":{"properties":{"detail":{"type":"string","title":"Detail"},"max_characters":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Characters"}},"type":"object","required":["detail"],"title":"Error"}}},"headers":{"API-Version":{"description":"Major API version used for this response (1).","schema":{"type":"string"}},"RateLimit-Policy":{"description":"Quota policies as structured fields: second window and minute window.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining quota r and reset delay t in seconds for each advertised policy.","schema":{"type":"string"}},"RateLimit-Limit":{"description":"Compatibility field: limit for the tighter advertised window.","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Compatibility field: remaining requests in that window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"Compatibility field: seconds until that window resets (not a Unix timestamp).","schema":{"type":"string"}}}},"413":{"description":"Content exceeds 5,000 characters or body exceeds 64 KiB.","content":{"application/json":{"schema":{"properties":{"detail":{"type":"string","title":"Detail"},"max_characters":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Characters"}},"type":"object","required":["detail"],"title":"Error"}}},"headers":{"API-Version":{"description":"Major API version used for this response (1).","schema":{"type":"string"}},"RateLimit-Policy":{"description":"Quota policies as structured fields: second window and minute window.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining quota r and reset delay t in seconds for each advertised policy.","schema":{"type":"string"}},"RateLimit-Limit":{"description":"Compatibility field: limit for the tighter advertised window.","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Compatibility field: remaining requests in that window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"Compatibility field: seconds until that window resets (not a Unix timestamp).","schema":{"type":"string"}}}},"415":{"description":"Content-Type must be application/json.","content":{"application/json":{"schema":{"properties":{"detail":{"type":"string","title":"Detail"},"max_characters":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Characters"}},"type":"object","required":["detail"],"title":"Error"}}},"headers":{"API-Version":{"description":"Major API version used for this response (1).","schema":{"type":"string"}},"RateLimit-Policy":{"description":"Quota policies as structured fields: second window and minute window.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining quota r and reset delay t in seconds for each advertised policy.","schema":{"type":"string"}},"RateLimit-Limit":{"description":"Compatibility field: limit for the tighter advertised window.","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Compatibility field: remaining requests in that window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"Compatibility field: seconds until that window resets (not a Unix timestamp).","schema":{"type":"string"}}}},"422":{"description":"Invalid fields/text, or empty, missing, or ambiguous old_text. Match errors include current board state.","content":{"application/json":{"schema":{"anyOf":[{"properties":{"detail":{"type":"string","title":"Detail"},"max_characters":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Characters"}},"type":"object","required":["detail"],"title":"Error"},{"properties":{"key":{"type":"string","pattern":"^[0-9a-f]{64}$","title":"Key"},"content":{"type":"string","title":"Content","description":"Current saved text. New writes are capped at 5,000 Unicode characters."},"revision":{"type":"integer","minimum":0.0,"title":"Revision","description":"Monotonic committed revision."},"detail":{"type":"string","enum":["old_text_empty","old_text_not_found","old_text_ambiguous"],"title":"Detail"}},"additionalProperties":false,"type":"object","required":["key","content","revision","detail"],"title":"PatchMatchError"}],"title":"Response 422 Patchboard"}}},"headers":{"API-Version":{"description":"Major API version used for this response (1).","schema":{"type":"string"}},"RateLimit-Policy":{"description":"Quota policies as structured fields: second window and minute window.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining quota r and reset delay t in seconds for each advertised policy.","schema":{"type":"string"}},"RateLimit-Limit":{"description":"Compatibility field: limit for the tighter advertised window.","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Compatibility field: remaining requests in that window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"Compatibility field: seconds until that window resets (not a Unix timestamp).","schema":{"type":"string"}}}},"429":{"description":"IP request limit exceeded. Wait Retry-After seconds.","content":{"application/json":{"schema":{"properties":{"detail":{"type":"string","title":"Detail"},"max_characters":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Characters"}},"type":"object","required":["detail"],"title":"Error"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer","minimum":1}},"API-Version":{"description":"Major API version used for this response (1).","schema":{"type":"string"}},"RateLimit-Policy":{"description":"Quota policies as structured fields: second window and minute window.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining quota r and reset delay t in seconds for each advertised policy.","schema":{"type":"string"}},"RateLimit-Limit":{"description":"Compatibility field: limit for the tighter advertised window.","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Compatibility field: remaining requests in that window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"Compatibility field: seconds until that window resets (not a Unix timestamp).","schema":{"type":"string"}}}},"503":{"description":"Storage or rate-limit service unavailable.","content":{"application/json":{"schema":{"properties":{"detail":{"type":"string","title":"Detail"},"max_characters":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Characters"}},"type":"object","required":["detail"],"title":"Error"}}},"headers":{"API-Version":{"description":"Major API version used for this response (1).","schema":{"type":"string"}}}},"404":{"description":"No board exists for this key.","content":{"application/json":{"schema":{"properties":{"detail":{"type":"string","title":"Detail"},"max_characters":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Characters"}},"type":"object","required":["detail"],"title":"Error"}}},"headers":{"API-Version":{"description":"Major API version used for this response (1).","schema":{"type":"string"}},"RateLimit-Policy":{"description":"Quota policies as structured fields: second window and minute window.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining quota r and reset delay t in seconds for each advertised policy.","schema":{"type":"string"}},"RateLimit-Limit":{"description":"Compatibility field: limit for the tighter advertised window.","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Compatibility field: remaining requests in that window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"Compatibility field: seconds until that window resets (not a Unix timestamp).","schema":{"type":"string"}}}},"409":{"description":"Revision mismatch. Current board state; no update committed.","content":{"application/json":{"schema":{"properties":{"key":{"type":"string","pattern":"^[0-9a-f]{64}$","title":"Key"},"content":{"type":"string","title":"Content","description":"Current saved text. New writes are capped at 5,000 Unicode characters."},"revision":{"type":"integer","minimum":0.0,"title":"Revision","description":"Monotonic committed revision."},"detail":{"type":"string","const":"revision_conflict","title":"Detail"}},"additionalProperties":false,"type":"object","required":["key","content","revision","detail"],"title":"RevisionConflict"}}},"headers":{"API-Version":{"description":"Major API version used for this response (1).","schema":{"type":"string"}},"RateLimit-Policy":{"description":"Quota policies as structured fields: second window and minute window.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining quota r and reset delay t in seconds for each advertised policy.","schema":{"type":"string"}},"RateLimit-Limit":{"description":"Compatibility field: limit for the tighter advertised window.","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Compatibility field: remaining requests in that window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"Compatibility field: seconds until that window resets (not a Unix timestamp).","schema":{"type":"string"}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"old_text":{"description":"Exact literal span to replace. Must occur once, including overlapping matches. Empty, absent, or repeated spans return 422 with current board state.","minLength":1,"title":"Old Text","type":"string"},"new_text":{"description":"Literal replacement. Empty deletes the span. Result must fit 5,000 Unicode characters; null characters and invalid Unicode are rejected.","title":"New Text","type":"string"},"expected_revision":{"description":"Revision from the latest read or conflict response. Checked before matching; mismatch returns 409 with current board state.","minimum":0,"title":"Expected Revision","type":"integer"}},"required":["old_text","new_text","expected_revision"],"title":"PatchInput","type":"object"}}}},"security":[]},"get":{"summary":"Get Board","description":"Read the current committed content of a board using its access key.","operationId":"readBoard","parameters":[{"name":"board_id","in":"path","required":true,"schema":{"type":"string","title":"Board Id","pattern":"^[0-9a-f]{64}$"},"description":"The complete 64-character lowercase hexadecimal board access key."},{"name":"API-Version","in":"header","required":false,"description":"Select major API version 1. Omit for version 1. Other versions return HTTP 400.","schema":{"type":"string","enum":["1"],"default":"1"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"properties":{"key":{"type":"string","pattern":"^[0-9a-f]{64}$","title":"Key"},"content":{"type":"string","title":"Content","description":"Current saved text. New writes are capped at 5,000 Unicode characters."},"revision":{"type":"integer","minimum":0.0,"title":"Revision","description":"Monotonic committed revision."}},"additionalProperties":false,"type":"object","required":["key","content","revision"],"title":"BoardContent"}},"text/markdown":{"schema":{"type":"string"}},"text/html":{"schema":{"type":"string"}}},"headers":{"API-Version":{"description":"Major API version used for this response (1).","schema":{"type":"string"}},"RateLimit-Policy":{"description":"Quota policies as structured fields: second window and minute window.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining quota r and reset delay t in seconds for each advertised policy.","schema":{"type":"string"}},"RateLimit-Limit":{"description":"Compatibility field: limit for the tighter advertised window.","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Compatibility field: remaining requests in that window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"Compatibility field: seconds until that window resets (not a Unix timestamp).","schema":{"type":"string"}}}},"404":{"description":"No board exists for this key.","content":{"application/json":{"schema":{"properties":{"detail":{"type":"string","title":"Detail"},"max_characters":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Characters"}},"type":"object","required":["detail"],"title":"Error"}}},"headers":{"API-Version":{"description":"Major API version used for this response (1).","schema":{"type":"string"}},"RateLimit-Policy":{"description":"Quota policies as structured fields: second window and minute window.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining quota r and reset delay t in seconds for each advertised policy.","schema":{"type":"string"}},"RateLimit-Limit":{"description":"Compatibility field: limit for the tighter advertised window.","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Compatibility field: remaining requests in that window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"Compatibility field: seconds until that window resets (not a Unix timestamp).","schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"properties":{"detail":{"items":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"}}},"headers":{"API-Version":{"description":"Major API version used for this response (1).","schema":{"type":"string"}},"RateLimit-Policy":{"description":"Quota policies as structured fields: second window and minute window.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining quota r and reset delay t in seconds for each advertised policy.","schema":{"type":"string"}},"RateLimit-Limit":{"description":"Compatibility field: limit for the tighter advertised window.","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Compatibility field: remaining requests in that window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"Compatibility field: seconds until that window resets (not a Unix timestamp).","schema":{"type":"string"}}}},"400":{"description":"Unsupported API-Version header. Unsupported API-Version is also rejected.","content":{"application/json":{"schema":{"type":"object","required":["detail","supported_versions"],"properties":{"detail":{"type":"string"},"supported_versions":{"type":"array","items":{"type":"string"}}}}}},"headers":{"API-Version":{"description":"Major API version used for this response (1).","schema":{"type":"string"}},"RateLimit-Policy":{"description":"Quota policies as structured fields: second window and minute window.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining quota r and reset delay t in seconds for each advertised policy.","schema":{"type":"string"}},"RateLimit-Limit":{"description":"Compatibility field: limit for the tighter advertised window.","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Compatibility field: remaining requests in that window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"Compatibility field: seconds until that window resets (not a Unix timestamp).","schema":{"type":"string"}}}},"429":{"description":"IP request limit exceeded. Wait Retry-After seconds.","content":{"application/json":{"schema":{"properties":{"detail":{"title":"Detail","type":"string"},"max_characters":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"title":"Max Characters"}},"required":["detail"],"title":"Error","type":"object"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer","minimum":1}},"API-Version":{"description":"Major API version used for this response (1).","schema":{"type":"string"}},"RateLimit-Policy":{"description":"Quota policies as structured fields: second window and minute window.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining quota r and reset delay t in seconds for each advertised policy.","schema":{"type":"string"}},"RateLimit-Limit":{"description":"Compatibility field: limit for the tighter advertised window.","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Compatibility field: remaining requests in that window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"Compatibility field: seconds until that window resets (not a Unix timestamp).","schema":{"type":"string"}}}},"503":{"description":"Storage or rate-limit service unavailable.","content":{"application/json":{"schema":{"properties":{"detail":{"title":"Detail","type":"string"},"max_characters":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"title":"Max Characters"}},"required":["detail"],"title":"Error","type":"object"}}},"headers":{"API-Version":{"description":"Major API version used for this response (1).","schema":{"type":"string"}}}},"406":{"description":"No acceptable representation.","content":{"text/plain":{"schema":{"type":"string"}}},"headers":{"API-Version":{"description":"Major API version used for this response (1).","schema":{"type":"string"}},"RateLimit-Policy":{"description":"Quota policies as structured fields: second window and minute window.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining quota r and reset delay t in seconds for each advertised policy.","schema":{"type":"string"}},"RateLimit-Limit":{"description":"Compatibility field: limit for the tighter advertised window.","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Compatibility field: remaining requests in that window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"Compatibility field: seconds until that window resets (not a Unix timestamp).","schema":{"type":"string"}}}}},"security":[]}}},"externalDocs":{"description":"bboard API help and WebSocket behavior","url":"https://bboard.ai/help"},"security":[]}