{"openapi":"3.1.0","info":{"title":"Sturm file API","version":"1.0.0","description":"HMAC protocol and client: worker/README.md. Canonical public files are delivered directly at /f/{id}. Secrets never belong in URLs. Resumable uploads and dynamic S3 are not enabled in the initial phase."},"servers":[{"url":"https://sturmv1.lol"}],"paths":{"/api/v1/health":{"get":{"operationId":"get_api_v1_health","summary":"GET /api/v1/health","tags":["API"],"security":[],"parameters":[],"responses":{"200":{"description":"Operation result.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"A bounded, redacted problem response.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"A bounded, redacted problem response.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"A bounded, redacted problem response.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"A bounded, redacted problem response.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"A bounded, redacted problem response.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"412":{"description":"A bounded, redacted problem response.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"413":{"description":"A bounded, redacted problem response.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"415":{"description":"A bounded, redacted problem response.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"A bounded, redacted problem response.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"428":{"description":"A bounded, redacted problem response.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"A bounded, redacted problem response.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"A bounded, redacted problem response.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"503":{"description":"A bounded, redacted problem response.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/capabilities":{"get":{"operationId":"get_api_v1_capabilities","summary":"GET /api/v1/capabilities","tags":["API"],"security":[],"parameters":[],"responses":{"200":{"description":"Operation result.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"A bounded, redacted problem response.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"A bounded, redacted problem response.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"A bounded, redacted problem response.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"A bounded, redacted problem response.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"A bounded, redacted problem response.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"412":{"description":"A bounded, redacted problem response.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"413":{"description":"A bounded, redacted problem response.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"415":{"description":"A bounded, redacted problem response.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"A bounded, redacted problem response.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"428":{"description":"A bounded, redacted problem response.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"A bounded, redacted problem response.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"A bounded, redacted problem response.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"503":{"description":"A bounded, redacted problem response.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/openapi.json":{"get":{"operationId":"get_api_v1_openapi_json","summary":"GET /api/v1/openapi.json","tags":["API"],"security":[],"parameters":[],"responses":{"200":{"description":"Operation result.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"A bounded, redacted problem response.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"A bounded, redacted problem response.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"A bounded, redacted problem response.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"A bounded, redacted problem response.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"A bounded, redacted problem response.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"412":{"description":"A bounded, redacted problem response.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"413":{"description":"A bounded, redacted problem response.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"415":{"description":"A bounded, redacted problem response.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"A bounded, redacted problem response.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"428":{"description":"A bounded, redacted problem response.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"A bounded, redacted problem response.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"A bounded, redacted problem response.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"503":{"description":"A bounded, redacted problem response.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/f/{id}":{"get":{"operationId":"get_f_id","summary":"GET /f/{id}","tags":["Public downloads"],"security":[],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Authenticated original bytes; no redirect or preview. Public UUID downloads require no credentials.","content":{"application/octet-stream":{"schema":{"type":"string","format":"binary"}}}},"304":{"description":"Logical version is unchanged after checking availability and expiry."},"400":{"description":"A bounded, redacted problem response.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"A bounded, redacted problem response.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"A bounded, redacted problem response.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"A bounded, redacted problem response.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"A bounded, redacted problem response.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"412":{"description":"A bounded, redacted problem response.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"413":{"description":"A bounded, redacted problem response.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"415":{"description":"A bounded, redacted problem response.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"A bounded, redacted problem response.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"428":{"description":"A bounded, redacted problem response.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"A bounded, redacted problem response.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"A bounded, redacted problem response.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"503":{"description":"A bounded, redacted problem response.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}},"head":{"operationId":"head_f_id","summary":"HEAD /f/{id}","tags":["Public downloads"],"security":[],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Authenticated original bytes; no redirect or preview. Public UUID downloads require no credentials."},"304":{"description":"Logical version is unchanged after checking availability and expiry."},"400":{"description":"A bounded, redacted problem response.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"A bounded, redacted problem response.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"A bounded, redacted problem response.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"A bounded, redacted problem response.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"A bounded, redacted problem response.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"412":{"description":"A bounded, redacted problem response.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"413":{"description":"A bounded, redacted problem response.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"415":{"description":"A bounded, redacted problem response.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"A bounded, redacted problem response.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"428":{"description":"A bounded, redacted problem response.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"A bounded, redacted problem response.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"A bounded, redacted problem response.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"503":{"description":"A bounded, redacted problem response.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/files/{id}/content":{"get":{"operationId":"get_api_v1_files_id_content","summary":"GET /api/v1/files/{id}/content","tags":["Public downloads"],"security":[],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Authenticated original bytes; no redirect or preview. Public UUID downloads require no credentials.","content":{"application/octet-stream":{"schema":{"type":"string","format":"binary"}}}},"304":{"description":"Logical version is unchanged after checking availability and expiry."},"400":{"description":"A bounded, redacted problem response.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"A bounded, redacted problem response.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"A bounded, redacted problem response.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"A bounded, redacted problem response.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"A bounded, redacted problem response.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"412":{"description":"A bounded, redacted problem response.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"413":{"description":"A bounded, redacted problem response.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"415":{"description":"A bounded, redacted problem response.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"A bounded, redacted problem response.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"428":{"description":"A bounded, redacted problem response.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"A bounded, redacted problem response.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"A bounded, redacted problem response.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"503":{"description":"A bounded, redacted problem response.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}},"head":{"operationId":"head_api_v1_files_id_content","summary":"HEAD /api/v1/files/{id}/content","tags":["Public downloads"],"security":[],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Authenticated original bytes; no redirect or preview. Public UUID downloads require no credentials."},"304":{"description":"Logical version is unchanged after checking availability and expiry."},"400":{"description":"A bounded, redacted problem response.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"A bounded, redacted problem response.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"A bounded, redacted problem response.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"A bounded, redacted problem response.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"A bounded, redacted problem response.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"412":{"description":"A bounded, redacted problem response.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"413":{"description":"A bounded, redacted problem response.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"415":{"description":"A bounded, redacted problem response.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"A bounded, redacted problem response.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"428":{"description":"A bounded, redacted problem response.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"A bounded, redacted problem response.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"A bounded, redacted problem response.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"503":{"description":"A bounded, redacted problem response.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/files":{"post":{"operationId":"post_api_v1_files","summary":"POST /api/v1/files","tags":["API"],"security":[{"AccessKey":[],"HmacSignature":[],"Timestamp":[],"Nonce":[],"ContentDigest":[]}],"parameters":[{"name":"Idempotency-Key","in":"header","required":true,"schema":{"type":"string","minLength":16,"maxLength":128,"pattern":"^[A-Za-z0-9_-]+$"}},{"name":"X-File-Name","in":"header","required":true,"schema":{"type":"string","maxLength":765},"description":"UTF-8 percent-encoded name, decoded exactly once."},{"name":"X-File-Mime","in":"header","required":false,"schema":{"type":"string","example":"application/octet-stream"}},{"name":"X-File-Size","in":"header","required":false,"schema":{"type":"integer","minimum":0,"maximum":4194304}},{"name":"X-File-Expires-At","in":"header","required":false,"schema":{"type":"string","format":"date-time"}}],"responses":{"200":{"description":"Operation result.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"201":{"description":"Resource created.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"202":{"description":"Durable job accepted; physical work may be pending.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"A bounded, redacted problem response.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"A bounded, redacted problem response.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"A bounded, redacted problem response.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"A bounded, redacted problem response.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"A bounded, redacted problem response.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"412":{"description":"A bounded, redacted problem response.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"413":{"description":"A bounded, redacted problem response.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"415":{"description":"A bounded, redacted problem response.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"A bounded, redacted problem response.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"428":{"description":"A bounded, redacted problem response.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"A bounded, redacted problem response.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"A bounded, redacted problem response.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"503":{"description":"A bounded, redacted problem response.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"requestBody":{"required":true,"content":{"application/octet-stream":{"schema":{"type":"string","format":"binary"}}}}},"get":{"operationId":"get_api_v1_files","summary":"GET /api/v1/files","tags":["API"],"security":[{"AccessKey":[],"HmacSignature":[],"Timestamp":[],"Nonce":[],"ContentDigest":[]}],"parameters":[],"responses":{"200":{"description":"Operation result.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"A bounded, redacted problem response.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"A bounded, redacted problem response.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"A bounded, redacted problem response.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"A bounded, redacted problem response.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"A bounded, redacted problem response.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"412":{"description":"A bounded, redacted problem response.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"413":{"description":"A bounded, redacted problem response.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"415":{"description":"A bounded, redacted problem response.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"A bounded, redacted problem response.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"428":{"description":"A bounded, redacted problem response.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"A bounded, redacted problem response.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"A bounded, redacted problem response.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"503":{"description":"A bounded, redacted problem response.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/files/{id}":{"get":{"operationId":"get_api_v1_files_id","summary":"GET /api/v1/files/{id}","tags":["API"],"security":[{"AccessKey":[],"HmacSignature":[],"Timestamp":[],"Nonce":[],"ContentDigest":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Operation result.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"A bounded, redacted problem response.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"A bounded, redacted problem response.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"A bounded, redacted problem response.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"A bounded, redacted problem response.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"A bounded, redacted problem response.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"412":{"description":"A bounded, redacted problem response.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"413":{"description":"A bounded, redacted problem response.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"415":{"description":"A bounded, redacted problem response.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"A bounded, redacted problem response.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"428":{"description":"A bounded, redacted problem response.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"A bounded, redacted problem response.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"A bounded, redacted problem response.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"503":{"description":"A bounded, redacted problem response.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}},"patch":{"operationId":"patch_api_v1_files_id","summary":"PATCH /api/v1/files/{id}","tags":["API"],"security":[{"AccessKey":[],"HmacSignature":[],"Timestamp":[],"Nonce":[],"ContentDigest":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"If-Match","in":"header","required":true,"schema":{"type":"string","pattern":"^\"[0-9]+\"$","example":"\"1\""}}],"responses":{"200":{"description":"Operation result.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"A bounded, redacted problem response.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"A bounded, redacted problem response.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"A bounded, redacted problem response.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"A bounded, redacted problem response.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"A bounded, redacted problem response.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"412":{"description":"A bounded, redacted problem response.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"413":{"description":"A bounded, redacted problem response.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"415":{"description":"A bounded, redacted problem response.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"A bounded, redacted problem response.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"428":{"description":"A bounded, redacted problem response.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"A bounded, redacted problem response.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"A bounded, redacted problem response.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"503":{"description":"A bounded, redacted problem response.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateFile"}}}}},"delete":{"operationId":"delete_api_v1_files_id","summary":"DELETE /api/v1/files/{id}","tags":["API"],"security":[{"AccessKey":[],"HmacSignature":[],"Timestamp":[],"Nonce":[],"ContentDigest":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Operation result.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"202":{"description":"Durable job accepted; physical work may be pending.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"204":{"description":"Operation completed without response body."},"400":{"description":"A bounded, redacted problem response.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"A bounded, redacted problem response.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"A bounded, redacted problem response.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"A bounded, redacted problem response.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"A bounded, redacted problem response.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"412":{"description":"A bounded, redacted problem response.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"413":{"description":"A bounded, redacted problem response.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"415":{"description":"A bounded, redacted problem response.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"A bounded, redacted problem response.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"428":{"description":"A bounded, redacted problem response.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"A bounded, redacted problem response.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"A bounded, redacted problem response.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"503":{"description":"A bounded, redacted problem response.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/me":{"get":{"operationId":"get_api_v1_me","summary":"GET /api/v1/me","tags":["API"],"security":[{"AccessKey":[],"HmacSignature":[],"Timestamp":[],"Nonce":[],"ContentDigest":[]}],"parameters":[],"responses":{"200":{"description":"Operation result.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"A bounded, redacted problem response.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"A bounded, redacted problem response.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"A bounded, redacted problem response.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"A bounded, redacted problem response.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"A bounded, redacted problem response.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"412":{"description":"A bounded, redacted problem response.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"413":{"description":"A bounded, redacted problem response.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"415":{"description":"A bounded, redacted problem response.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"A bounded, redacted problem response.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"428":{"description":"A bounded, redacted problem response.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"A bounded, redacted problem response.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"A bounded, redacted problem response.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"503":{"description":"A bounded, redacted problem response.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/me/usage":{"get":{"operationId":"get_api_v1_me_usage","summary":"GET /api/v1/me/usage","tags":["API"],"security":[{"AccessKey":[],"HmacSignature":[],"Timestamp":[],"Nonce":[],"ContentDigest":[]}],"parameters":[],"responses":{"200":{"description":"Operation result.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"A bounded, redacted problem response.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"A bounded, redacted problem response.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"A bounded, redacted problem response.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"A bounded, redacted problem response.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"A bounded, redacted problem response.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"412":{"description":"A bounded, redacted problem response.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"413":{"description":"A bounded, redacted problem response.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"415":{"description":"A bounded, redacted problem response.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"A bounded, redacted problem response.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"428":{"description":"A bounded, redacted problem response.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"A bounded, redacted problem response.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"A bounded, redacted problem response.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"503":{"description":"A bounded, redacted problem response.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/credentials/rotate":{"post":{"operationId":"post_api_v1_credentials_rotate","summary":"POST /api/v1/credentials/rotate","tags":["Revocation"],"security":[{"RevocationKey":[]}],"parameters":[{"name":"Idempotency-Key","in":"header","required":true,"schema":{"type":"string","minLength":16,"maxLength":128,"pattern":"^[A-Za-z0-9_-]+$"}}],"responses":{"200":{"description":"Operation result.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"201":{"description":"Resource created.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"202":{"description":"Durable job accepted; physical work may be pending.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"A bounded, redacted problem response.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"A bounded, redacted problem response.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"A bounded, redacted problem response.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"A bounded, redacted problem response.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"A bounded, redacted problem response.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"412":{"description":"A bounded, redacted problem response.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"413":{"description":"A bounded, redacted problem response.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"415":{"description":"A bounded, redacted problem response.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"A bounded, redacted problem response.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"428":{"description":"A bounded, redacted problem response.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"A bounded, redacted problem response.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"A bounded, redacted problem response.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"503":{"description":"A bounded, redacted problem response.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}}},"components":{"schemas":{"Problem":{"type":"object","required":["type","title","status","code","detail","requestId"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"code":{"type":"string"},"detail":{"type":"string"},"requestId":{"type":"string","format":"uuid"}}},"File":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"ownerId":{"type":"string","format":"uuid"},"bucketId":{"type":"string","format":"uuid"},"name":{"type":"string"},"mime":{"type":"string"},"size":{"type":"integer","minimum":0},"status":{"type":"string","enum":["uploading","ready","deleting","deleted","failed"]},"url":{"type":"string","format":"uri","example":"https://sturmv1.lol/f/00000000-0000-4000-8000-000000000001"},"expiresAt":{"type":["string","null"],"format":"date-time"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"version":{"type":"integer","minimum":0}}},"User":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"username":{"type":"string"},"status":{"type":"string","enum":["active","suspended","deleted"]},"quotaBytes":{"type":"integer","minimum":0},"maxFileBytes":{"type":"integer","minimum":0},"version":{"type":"integer","minimum":0}}},"CreateUser":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"username":{"type":"string","minLength":1,"maxLength":64,"pattern":"^[a-zA-Z0-9_-]+$"},"quotaBytes":{"type":"integer","minimum":0,"maximum":9007199254740991},"maxFileBytes":{"type":"integer","minimum":1,"maximum":4194304},"plan":{"default":"lifetime","type":"string","const":"lifetime"}},"required":["username"],"additionalProperties":false},"UpdateUser":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"username":{"type":"string","minLength":1,"maxLength":64,"pattern":"^[a-zA-Z0-9_-]+$"},"status":{"type":"string","enum":["active","suspended"]},"quotaBytes":{"type":"integer","minimum":0,"maximum":9007199254740991},"maxFileBytes":{"type":"integer","minimum":1,"maximum":4194304},"plan":{"type":"string","const":"lifetime"}},"additionalProperties":false,"minProperties":1},"UpdateFile":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"name":{"type":"string"},"expiresAt":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}]}},"additionalProperties":false,"minProperties":1},"CreateBucket":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"name":{"type":"string","minLength":3,"maxLength":63,"pattern":"^[a-z0-9][a-z0-9-]*[a-z0-9]$"},"accountId":{"type":"string","pattern":"^[0-9a-f]{32}$"},"accessKeyId":{"type":"string","minLength":1,"maxLength":256},"secretAccessKey":{"type":"string","minLength":1,"maxLength":1024},"endpoint":{"anyOf":[{"type":"string","maxLength":256,"format":"uri"},{"type":"null"}]},"writable":{"default":true,"type":"boolean"},"quotaBytes":{"default":8000000000,"type":"integer","minimum":0,"maximum":9007199254740991}},"required":["name","accountId","accessKeyId","secretAccessKey"],"additionalProperties":false},"UpdateBucket":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"name":{"type":"string","minLength":3,"maxLength":63,"pattern":"^[a-z0-9][a-z0-9-]*[a-z0-9]$"},"accountId":{"type":"string","pattern":"^[0-9a-f]{32}$"},"accessKeyId":{"type":"string","minLength":1,"maxLength":256},"secretAccessKey":{"type":"string","minLength":1,"maxLength":1024},"endpoint":{"anyOf":[{"type":"string","maxLength":256,"format":"uri"},{"type":"null"}]},"writable":{"default":true,"type":"boolean"},"quotaBytes":{"default":8000000000,"type":"integer","minimum":0,"maximum":9007199254740991}},"additionalProperties":false,"minProperties":1},"UpdateSettings":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"uploadsEnabled":{"type":"boolean"},"maxFileBytes":{"type":"integer","minimum":1,"maximum":4194304},"storageQuotaBytes":{"type":"integer","minimum":0,"maximum":9007199254740991},"defaultRetentionSeconds":{"type":"integer","minimum":1,"maximum":31536000},"maxRetentionSeconds":{"type":"integer","minimum":1,"maximum":31536000},"allowedMimeTypes":{"maxItems":100,"type":"array","items":{"type":"string","maxLength":127,"pattern":"^[a-z0-9][a-z0-9!#$&^_.+-]*\\/[a-z0-9][a-z0-9!#$&^_.+-]*$"}}},"additionalProperties":false,"minProperties":1},"Settings":{"type":"object","additionalProperties":false,"properties":{"uploadsEnabled":{"type":"boolean"},"maxFileBytes":{"type":"integer","minimum":1,"maximum":4194304},"storageQuotaBytes":{"type":"integer","minimum":0},"defaultRetentionSeconds":{"type":"integer","minimum":0},"maxRetentionSeconds":{"type":"integer","minimum":0},"allowedMimeTypes":{"type":"array","items":{"type":"string"}},"version":{"type":"integer","minimum":0}}},"Envelope":{"type":"object","required":["data","requestId"],"properties":{"data":{},"requestId":{"type":"string","format":"uuid"},"page":{"type":"object","properties":{"nextCursor":{"type":["string","null"]},"hasMore":{"type":"boolean"}}}}}},"securitySchemes":{"AccessKey":{"type":"apiKey","in":"header","name":"X-Access-Key"},"HmacSignature":{"type":"apiKey","in":"header","name":"Authorization","description":"Sturm-HMAC-SHA256 followed by the hexadecimal signature. The Secret Key remains local."},"Timestamp":{"type":"apiKey","in":"header","name":"X-Timestamp","description":"Unix seconds; maximum absolute skew 300 seconds."},"Nonce":{"type":"apiKey","in":"header","name":"X-Nonce","description":"Fresh 16-128 character nonce; reuse is rejected."},"ContentDigest":{"type":"apiKey","in":"header","name":"X-Content-SHA256","description":"Verified SHA-256 hex digest of exact request body, including the empty body."},"RevocationKey":{"type":"http","scheme":"bearer","description":"Revocation Key, only accepted for credential rotation."},"AdminSession":{"type":"apiKey","in":"cookie","name":"__Secure-__Host-sturm.session_token"}}}}