{"openapi":"3.0.3","info":{"title":"myselfapi.top API","version":"1.10.3","description":"Browser-based tools for the small jobs that interrupt real work"},"servers":[{"url":"https://myselfapi.top"}],"components":{"securitySchemes":{"ApiKey":{"type":"apiKey","in":"header","name":"X-Api-Key"}}},"paths":{"/api/v1/hash":{"get":{"summary":"Return the SHA digest of a text.","tags":["Utilities"],"parameters":[{"name":"alg","in":"query","required":false,"description":"sha1, sha256 (default), sha384 or sha512","schema":{"type":"string"}},{"name":"text","in":"query","required":false,"description":"Text to hash (max 4096 chars)","schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/time":{"get":{"summary":"Return the current time, optionally in an IANA time zone.","tags":["Utilities"],"parameters":[{"name":"tz","in":"query","required":false,"description":"IANA zone, e.g. Europe/Berlin (default UTC)","schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/base64/encode":{"get":{"summary":"Encode UTF-8 text as Base64.","tags":["Utilities"],"parameters":[{"name":"text","in":"query","required":false,"description":"Text to encode (max 4096 chars)","schema":{"type":"string"}},{"name":"urlsafe","in":"query","required":false,"description":"Use the URL-safe alphabet","schema":{"type":"boolean"}}],"responses":{"200":{"description":"OK"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/base64/decode":{"get":{"summary":"Decode Base64 into UTF-8 text.","tags":["Utilities"],"parameters":[{"name":"text","in":"query","required":false,"description":"Base64 input (standard or URL-safe)","schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/tools":{"get":{"summary":"List the tools on this site.","tags":["Utilities"],"parameters":[],"responses":{"200":{"description":"OK"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/health":{"get":{"summary":"Check that the API is up.","tags":["Status"],"parameters":[],"responses":{"200":{"description":"OK"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/status":{"get":{"summary":"Return the overall status and the state of each service.","tags":["Status"],"parameters":[],"responses":{"200":{"description":"OK"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/components":{"get":{"summary":"List the services with their 90-day uptime.","tags":["Status"],"parameters":[],"responses":{"200":{"description":"OK"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/incidents":{"get":{"summary":"List recent incidents and their updates.","tags":["Status"],"parameters":[{"name":"limit","in":"query","required":false,"description":"1-50, default 10","schema":{"type":"integer"}}],"responses":{"200":{"description":"OK"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/auth/login":{"post":{"summary":"Sign in with a username and password. Sets a session cookie.","tags":["Account"],"parameters":[],"responses":{"200":{"description":"OK"},"429":{"description":"Rate limit exceeded"}},"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"username":{"type":"string","description":"Account name"},"password":{"type":"string","description":"Account password"}}}}}}}},"/api/v1/auth/me":{"get":{"summary":"Return the signed-in user, or 401 if nobody is signed in.","tags":["Account"],"parameters":[],"responses":{"200":{"description":"OK"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/auth/logout":{"post":{"summary":"Sign out and clear the session cookie.","tags":["Account"],"parameters":[],"responses":{"200":{"description":"OK"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/components/stream":{"get":{"summary":"Live stream of component status changes (Server-Sent Events).","tags":["Streams & jobs"],"parameters":[],"responses":{"200":{"description":"OK"},"401":{"description":"Missing or invalid API key"},"429":{"description":"Rate limit exceeded"}},"security":[{"ApiKey":[]}]}},"/api/v1/events/poll":{"get":{"summary":"Wait for new workspace events after a cursor.","tags":["Streams & jobs"],"parameters":[{"name":"cursor","in":"query","required":false,"description":"Opaque cursor from the previous response","schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"401":{"description":"Missing or invalid API key"},"429":{"description":"Rate limit exceeded"}},"security":[{"ApiKey":[]}]}},"/api/v1/export/jobs":{"post":{"summary":"Start a batch export job.","tags":["Streams & jobs"],"parameters":[],"responses":{"200":{"description":"OK"},"401":{"description":"Missing or invalid API key"},"429":{"description":"Rate limit exceeded"}},"security":[{"ApiKey":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"format":{"type":"string","description":"json or csv"}}}}}}}}}}
