{"openapi":"3.1.0","info":{"title":"Sonar API","version":"1.0.0","description":"Manage the VPN exclusion list of your server from your own plugin, bot or billing system,\nand read your server settings and the messages your players see.\nEvery key works for exactly one server. Keys are created in the dashboard under API.\nThis version offers narrow keys with the scopes `config:read` and `vpn_exclusions:write`.\nEndpoints that change the configuration or the messages are planned and not part of this document yet.\nErrors are JSON with `type`, `title` and `status` (`application/problem+json`, RFC 9457). Check `type`, it never changes.\n"},"servers":[{"url":"https://sonar.top/api/v1/manage"}],"security":[{"bearerAuth":[]}],"paths":{"/whoami":{"get":{"operationId":"whoami","summary":"Test a key without changing anything","description":"Works with any valid key. Returns the server ID (`server_uid`), the key name, the class (always `narrow` today), the scopes (permissions) and the expiry.","responses":{"200":{"description":"The key and its server.","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Whoami"}}}},"401":{"$ref":"#/components/responses/InvalidKey"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/RateLimited"},"503":{"$ref":"#/components/responses/Disabled"},"default":{"$ref":"#/components/responses/Error"}}}},"/servers/{uid}/config":{"get":{"operationId":"getConfig","summary":"Read the plugin configuration","description":"Needs `config:read`. The answer carries a short fingerprint of the current settings (the `ETag` header).\nSend it back in `If-None-Match` to get `304 Not Modified` with an empty body while nothing changed.\n","parameters":[{"$ref":"#/components/parameters/Uid"},{"$ref":"#/components/parameters/IfNoneMatch"}],"responses":{"200":{"description":"The configuration as the plugin receives it.","headers":{"ETag":{"$ref":"#/components/headers/ETag"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerConfig"}}}},"304":{"description":"The configuration did not change."},"401":{"$ref":"#/components/responses/InvalidKey"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/RateLimited"},"503":{"$ref":"#/components/responses/Disabled"},"default":{"$ref":"#/components/responses/Error"}}}},"/servers/{uid}/messages":{"get":{"operationId":"getMessages","summary":"Read the player messages","description":"Needs `config:read`. The `ETag` is the same as for the configuration.","parameters":[{"$ref":"#/components/parameters/Uid"},{"$ref":"#/components/parameters/IfNoneMatch"}],"responses":{"200":{"description":"The messages as the plugin receives them.","headers":{"ETag":{"$ref":"#/components/headers/ETag"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerMessages"}}}},"304":{"description":"The messages did not change."},"401":{"$ref":"#/components/responses/InvalidKey"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/RateLimited"},"503":{"$ref":"#/components/responses/Disabled"},"default":{"$ref":"#/components/responses/Error"}}}},"/servers/{uid}/lists/vpn-exclusions":{"get":{"operationId":"listVpnExclusions","summary":"Read the VPN exclusion list","description":"Needs `config:read`. Players matching an entry skip the VPN and proxy check.\nUsername entries can be spoofed on servers in offline mode: anyone can join with that name.\n","parameters":[{"$ref":"#/components/parameters/Uid"}],"responses":{"200":{"description":"All entries and the limits of the lists.","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VpnExclusionList"}}}},"401":{"$ref":"#/components/responses/InvalidKey"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/RateLimited"},"503":{"$ref":"#/components/responses/Disabled"},"default":{"$ref":"#/components/responses/Error"}}}},"/servers/{uid}/lists/vpn-exclusions/entries":{"post":{"operationId":"addVpnExclusion","summary":"Add a VPN exclusion entry","description":"Needs `vpn_exclusions:write`. Answers `200` whether the entry was added or already there.\nKeys with this scope alone cannot add a CIDR range wider than /24 (IPv4) or /48 (IPv6), and cannot add ASN entries: that answers `403 scope_required`.\nCounts as a write: 30 per minute and 500 per day for the server.\n","parameters":[{"$ref":"#/components/parameters/Uid"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VpnEntry"}}}},"responses":{"200":{"description":"The entry as stored, in normal form.","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VpnEntryResult"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/InvalidKey"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/ListFull"},"422":{"$ref":"#/components/responses/InvalidEntry"},"429":{"$ref":"#/components/responses/RateLimited"},"503":{"$ref":"#/components/responses/Disabled"},"default":{"$ref":"#/components/responses/Error"}}},"delete":{"operationId":"removeVpnExclusion","summary":"Remove a VPN exclusion entry","description":"Needs `vpn_exclusions:write`. Answers `204` whether the entry was removed or already gone.\nCounts as a write: 30 per minute and 500 per day for the server.\n","parameters":[{"$ref":"#/components/parameters/Uid"},{"name":"type","in":"query","required":true,"schema":{"type":"string","enum":["ip","cidr","asn","username"]}},{"name":"value","in":"query","required":true,"schema":{"type":"string","minLength":1}}],"responses":{"204":{"description":"The entry is not in the list any more."},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/InvalidKey"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"422":{"$ref":"#/components/responses/InvalidEntry"},"429":{"$ref":"#/components/responses/RateLimited"},"503":{"$ref":"#/components/responses/Disabled"},"default":{"$ref":"#/components/responses/Error"}}}}},"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"sonar_ followed by 46 Base62 characters (52 in total)","description":"Send the key in the `Authorization` header. Never put it in a URL or a query string.\nA key works for one server only.\n"}},"parameters":{"Uid":{"name":"uid","in":"path","required":true,"description":"Your server ID, a six digit number. It is the only server the key works for. Any other server ID answers 404.","schema":{"type":"string"}},"IfNoneMatch":{"name":"If-None-Match","in":"header","required":false,"description":"The `ETag` of the last answer.","schema":{"type":"string"}}},"headers":{"ETag":{"description":"Fingerprint of the stored configuration, in quotes. Send it back in `If-None-Match`.","schema":{"type":"string"}},"RateLimitLimit":{"description":"Requests per minute for the account that owns the server, across all its keys.","schema":{"type":"integer"}},"RateLimitRemaining":{"description":"Requests left in the current minute.","schema":{"type":"integer"}},"RateLimitReset":{"description":"Seconds until the current minute window ends.","schema":{"type":"integer"}},"RetryAfter":{"description":"Seconds to wait before the next request.","schema":{"type":"integer"}}},"responses":{"InvalidKey":{"description":"The key is missing, malformed, unknown, expired or revoked. The answer is the same for all of them.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"example":{"type":"invalid_key","title":"Unauthorized","status":401}}}},"Forbidden":{"description":"`role_revoked`: the creator of the key lost the needed role on the server.\n`plan_required`: the owner has no plan with API access.\n`scope_required`: the key lacks a scope, listed in `missing_scopes`.\n","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"example":{"type":"scope_required","title":"Forbidden","status":403,"missing_scopes":["config:read"]}}}},"NotFound":{"description":"Unknown path, a server that is not the one of the key, or a server that is deleted, deactivated or paused. All answer alike.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"example":{"type":"not_found","title":"Not Found","status":404}}}},"RateLimited":{"description":"Too many requests, or too many failed key checks from one address.\nThe limit of 300 requests per minute per IP address sends only `Retry-After`.\nThe `RateLimit-*` headers describe the account budget and come with limits applied by the API itself.\n","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"example":{"type":"rate_limited","title":"Too Many Requests","status":429}}}},"BadRequest":{"description":"The body is not valid JSON, or a required parameter is missing.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"example":{"type":"bad_request","title":"Bad Request","status":400}}}},"InvalidEntry":{"description":"`invalid_entry`: the type or the value of the entry is not valid.\n`config_invalid`: a field of the stored configuration no longer validates. `detail` names the fields, never their values. Fix the configuration in the dashboard first.\n","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"example":{"type":"invalid_entry","title":"Unprocessable Content","status":422,"detail":"not an IP address"}}}},"ListFull":{"description":"The list has no room for another entry. `limit` is the maximum size of the list.\n`legacy` is true when the list was already longer than the limit before this request.\n","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"example":{"type":"list_full","title":"Conflict","status":409,"limit":500,"legacy":false}}}},"Error":{"description":"Any other error, as problem details. A request body over 64 KB is refused with 413 by our proxy\nbefore it reaches the API, and that answer may not be problem details.\n","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"Disabled":{"description":"The API is switched off for maintenance.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"example":{"type":"api_disabled","title":"Service Unavailable","status":503}}}}},"schemas":{"Problem":{"type":"object","additionalProperties":false,"required":["type","title","status"],"properties":{"type":{"type":"string","enum":["bad_request","invalid_key","role_revoked","plan_required","scope_required","not_found","invalid_entry","config_invalid","list_full","rate_limited","api_disabled","internal_error"]},"title":{"type":"string"},"status":{"type":"integer"},"detail":{"type":"string"},"missing_scopes":{"type":"array","items":{"type":"string","enum":["config:read","vpn_exclusions:write"]}},"limit":{"type":"integer","description":"list_full only: the maximum size of the list."},"legacy":{"type":"boolean","description":"list_full only: true if the list was already longer than the limit."}}},"Whoami":{"type":"object","additionalProperties":false,"required":["server_uid","name","class","scopes","expires_at"],"properties":{"server_uid":{"type":"string"},"name":{"type":"string"},"class":{"type":"string","enum":["narrow","full"]},"scopes":{"type":"array","items":{"type":"string","enum":["config:read","vpn_exclusions:write"]}},"expires_at":{"type":["string","null"],"format":"date-time","description":"When the key stops working. null for a key that never expires."}}},"VpnEntry":{"type":"object","additionalProperties":false,"required":["type","value"],"description":"`value` is always a string. `ip` is an IPv4 or IPv6 address without prefix, `cidr` has a prefix,\n`asn` is a decimal number from 1 to 4294967295 and `username` has at most 16 characters.\n","properties":{"type":{"type":"string","enum":["ip","cidr","asn","username"]},"value":{"type":"string","minLength":1}},"allOf":[{"if":{"properties":{"type":{"const":"asn"}}},"then":{"properties":{"value":{"pattern":"^([1-9][0-9]{0,8}|[1-3][0-9]{9}|4[01][0-9]{8}|42[0-8][0-9]{7}|429[0-3][0-9]{6}|4294[0-8][0-9]{5}|42949[0-5][0-9]{4}|429496[0-6][0-9]{3}|4294967[01][0-9]{2}|42949672[0-8][0-9]|429496729[0-5])$"}}}},{"if":{"properties":{"type":{"const":"username"}}},"then":{"properties":{"value":{"maxLength":16}}}}],"examples":[{"type":"ip","value":"203.0.113.7"},{"type":"cidr","value":"203.0.113.0/24"},{"type":"username","value":"Steve"}]},"VpnStoredEntry":{"type":"object","additionalProperties":false,"required":["type","value"],"properties":{"type":{"type":"string","enum":["ip","cidr","asn","username"]},"value":{"type":"string","minLength":1}}},"VpnEntryResult":{"type":"object","additionalProperties":false,"required":["entry"],"properties":{"entry":{"$ref":"#/components/schemas/VpnEntry"}}},"VpnExclusionList":{"type":"object","additionalProperties":false,"required":["entries","limits"],"properties":{"entries":{"type":"array","description":"Entries as stored. Entries saved before the current input rules can fall outside them,\nfor example a username longer than 16 characters, so only type and value are guaranteed here.\n","items":{"$ref":"#/components/schemas/VpnStoredEntry"}},"limits":{"type":"object","additionalProperties":false,"required":["ip","asn","username"],"description":"Maximum entries. `ip` counts IP and CIDR entries together.","properties":{"ip":{"type":"integer","const":500},"asn":{"type":"integer","const":200},"username":{"type":"integer","const":500}}}}},"MessageText":{"type":"string","maxLength":32767,"description":"A MiniMessage text."},"ServerConfig":{"type":"object","additionalProperties":false,"required":["haproxy","proxy-detection","ratelimiter","verification","geyser","cloud"],"properties":{"haproxy":{"type":"object","additionalProperties":false,"required":["enabled","block-untrusted-cidrs","whitelisted-cidrs"],"properties":{"enabled":{"type":"boolean"},"block-untrusted-cidrs":{"type":"boolean"},"whitelisted-cidrs":{"type":"array","items":{"type":"string"}}}},"proxy-detection":{"type":"object","additionalProperties":false,"required":["enabled","detection-action","excluded-asns","excluded-ips","excluded-usernames","country-blocking-mode","blocked-country-action","countries"],"properties":{"enabled":{"type":"boolean"},"detection-action":{"type":"integer"},"excluded-asns":{"type":"array","items":{"type":"integer","minimum":1,"maximum":4294967295}},"excluded-ips":{"type":"array","items":{"type":"string"}},"excluded-usernames":{"type":"array","items":{"type":"string"}},"country-blocking-mode":{"type":"integer"},"blocked-country-action":{"type":"integer"},"countries":{"type":"array","items":{"type":"string"}}}},"ratelimiter":{"type":"object","additionalProperties":false,"required":["block-crawlers","login","status","backend-filter","max-online-per-ip"],"properties":{"block-crawlers":{"type":"boolean"},"login":{"type":"object","additionalProperties":false,"required":["duration","max-hit-count"],"properties":{"duration":{"type":"integer"},"max-hit-count":{"type":"integer"}}},"status":{"type":"object","additionalProperties":false,"required":["duration","max-hit-count"],"properties":{"duration":{"type":"integer"},"max-hit-count":{"type":"integer"}}},"backend-filter":{"type":"object","additionalProperties":false,"required":["enabled","max-packets","max-bytes"],"properties":{"enabled":{"type":"boolean"},"max-packets":{"type":"object","additionalProperties":false,"required":["duration","max-hit-count"],"properties":{"duration":{"type":"integer"},"max-hit-count":{"type":"integer"}}},"max-bytes":{"type":"object","additionalProperties":false,"required":["duration","max-hit-count"],"properties":{"duration":{"type":"integer"},"max-hit-count":{"type":"integer"}}}}},"max-online-per-ip":{"type":"integer","minimum":0,"maximum":5000}}},"verification":{"type":"object","additionalProperties":false,"required":["settings","in-game","queue","transfer","attack-tracker","local-storage","exclusions"],"properties":{"settings":{"type":"object","additionalProperties":false,"required":["blocked-protocol-versions","force-key-authentication","read-timeout","write-timeout","verification-fail-action","plan-exhaustion-action","timing"],"properties":{"blocked-protocol-versions":{"type":"array","items":{"type":"integer"}},"force-key-authentication":{"type":"boolean"},"read-timeout":{"type":"integer"},"write-timeout":{"type":"integer"},"verification-fail-action":{"type":"integer"},"plan-exhaustion-action":{"type":"integer"},"timing":{"type":"integer","minimum":0,"maximum":2}}},"in-game":{"type":"object","additionalProperties":false,"required":["world-time","world-dimension","username"],"properties":{"world-time":{"type":"integer"},"world-dimension":{"type":"integer"},"username":{"type":"string"}}},"queue":{"type":"object","additionalProperties":false,"required":["automatic-scaling","login-throughput","timeout"],"properties":{"automatic-scaling":{"type":"boolean"},"login-throughput":{"type":"integer","minimum":1,"maximum":10000},"timeout":{"type":"integer","minimum":1,"maximum":600}}},"transfer":{"type":"object","additionalProperties":false,"required":["enabled","forward-handshake-data","host","port"],"properties":{"enabled":{"type":"boolean"},"forward-handshake-data":{"type":"boolean"},"host":{"type":"string"},"port":{"type":"integer"}}},"attack-tracker":{"type":"object","additionalProperties":false,"required":["baseline-threshold","burst-threshold","grace-period","cooldown-period","captcha-verifying-players"],"properties":{"baseline-threshold":{"type":"integer"},"burst-threshold":{"type":"integer"},"grace-period":{"type":"integer"},"cooldown-period":{"type":"integer"},"captcha-verifying-players":{"type":"boolean"}}},"local-storage":{"type":"object","additionalProperties":false,"required":["blacklist","whitelist"],"properties":{"blacklist":{"type":"object","additionalProperties":false,"required":["duration","unit"],"properties":{"duration":{"type":"integer"},"unit":{"type":"string"}}},"whitelist":{"type":"object","additionalProperties":false,"required":["duration","unit"],"properties":{"duration":{"type":"integer"},"unit":{"type":"string"}}}}},"exclusions":{"type":"object","additionalProperties":false,"required":["excluded-ips","excluded-usernames"],"properties":{"excluded-ips":{"type":"array","items":{"type":"string"}},"excluded-usernames":{"type":"array","items":{"type":"string"}}}}}},"geyser":{"type":"object","additionalProperties":false,"required":["enabled","excluded-proxy-ips"],"properties":{"enabled":{"type":"boolean"},"excluded-proxy-ips":{"type":"array","items":{"type":"string"}}}},"cloud":{"type":"object","additionalProperties":false,"required":["use-cloud-whitelist","sensitivity"],"properties":{"use-cloud-whitelist":{"type":"boolean"},"sensitivity":{"type":"integer"}}}}},"ServerMessages":{"type":"object","additionalProperties":false,"required":["commands","disconnect","verification"],"properties":{"commands":{"type":"object","additionalProperties":false,"required":["prefix","players-only","console-only","invalid-ip","invalid-page","help","version","reload","lockdown","debug","perf","info","cloud","paste","notify","blacklist","whitelist"],"properties":{"prefix":{"$ref":"#/components/schemas/MessageText"},"players-only":{"$ref":"#/components/schemas/MessageText"},"console-only":{"$ref":"#/components/schemas/MessageText"},"invalid-ip":{"$ref":"#/components/schemas/MessageText"},"invalid-page":{"$ref":"#/components/schemas/MessageText"},"help":{"type":"object","additionalProperties":false,"required":["header","body","footer"],"properties":{"header":{"$ref":"#/components/schemas/MessageText"},"body":{"$ref":"#/components/schemas/MessageText"},"footer":{"$ref":"#/components/schemas/MessageText"}}},"version":{"type":"object","additionalProperties":false,"required":["info"],"properties":{"info":{"$ref":"#/components/schemas/MessageText"}}},"reload":{"type":"object","additionalProperties":false,"required":["done"],"properties":{"done":{"$ref":"#/components/schemas/MessageText"}}},"lockdown":{"type":"object","additionalProperties":false,"required":["on","off"],"properties":{"on":{"$ref":"#/components/schemas/MessageText"},"off":{"$ref":"#/components/schemas/MessageText"}}},"debug":{"type":"object","additionalProperties":false,"required":["list","list-empty","enabled","disabled"],"properties":{"list":{"$ref":"#/components/schemas/MessageText"},"list-empty":{"$ref":"#/components/schemas/MessageText"},"enabled":{"$ref":"#/components/schemas/MessageText"},"disabled":{"$ref":"#/components/schemas/MessageText"}}},"perf":{"type":"object","additionalProperties":false,"required":["stats"],"properties":{"stats":{"$ref":"#/components/schemas/MessageText"}}},"info":{"type":"object","additionalProperties":false,"required":["server","ip"],"properties":{"server":{"$ref":"#/components/schemas/MessageText"},"ip":{"$ref":"#/components/schemas/MessageText"}}},"cloud":{"type":"object","additionalProperties":false,"required":["info","reconnect","verify","verify-fail","verify-empty","verify-purge"],"properties":{"info":{"$ref":"#/components/schemas/MessageText"},"reconnect":{"$ref":"#/components/schemas/MessageText"},"verify":{"$ref":"#/components/schemas/MessageText"},"verify-fail":{"$ref":"#/components/schemas/MessageText"},"verify-empty":{"$ref":"#/components/schemas/MessageText"},"verify-purge":{"$ref":"#/components/schemas/MessageText"}}},"paste":{"type":"object","additionalProperties":false,"required":["saved"],"properties":{"saved":{"$ref":"#/components/schemas/MessageText"}}},"notify":{"type":"object","additionalProperties":false,"required":["on","off","layout"],"properties":{"on":{"$ref":"#/components/schemas/MessageText"},"off":{"$ref":"#/components/schemas/MessageText"},"layout":{"type":"object","additionalProperties":false,"required":["normal","attack","animation"],"properties":{"normal":{"$ref":"#/components/schemas/MessageText"},"attack":{"$ref":"#/components/schemas/MessageText"},"animation":{"type":"array","items":{"type":"string"}}}}}},"blacklist":{"type":"object","additionalProperties":false,"required":["add","add-fail","remove","remove-fail","show-header","show-entry","clear","empty","size","check"],"properties":{"add":{"$ref":"#/components/schemas/MessageText"},"add-fail":{"$ref":"#/components/schemas/MessageText"},"remove":{"$ref":"#/components/schemas/MessageText"},"remove-fail":{"$ref":"#/components/schemas/MessageText"},"show-header":{"$ref":"#/components/schemas/MessageText"},"show-entry":{"$ref":"#/components/schemas/MessageText"},"clear":{"$ref":"#/components/schemas/MessageText"},"empty":{"$ref":"#/components/schemas/MessageText"},"size":{"$ref":"#/components/schemas/MessageText"},"check":{"$ref":"#/components/schemas/MessageText"}}},"whitelist":{"type":"object","additionalProperties":false,"required":["add","add-fail","remove","remove-fail","show-header","show-entry","clear","empty","size","check"],"properties":{"add":{"$ref":"#/components/schemas/MessageText"},"add-fail":{"$ref":"#/components/schemas/MessageText"},"remove":{"$ref":"#/components/schemas/MessageText"},"remove-fail":{"$ref":"#/components/schemas/MessageText"},"show-header":{"$ref":"#/components/schemas/MessageText"},"show-entry":{"$ref":"#/components/schemas/MessageText"},"clear":{"$ref":"#/components/schemas/MessageText"},"empty":{"$ref":"#/components/schemas/MessageText"},"size":{"$ref":"#/components/schemas/MessageText"},"check":{"$ref":"#/components/schemas/MessageText"}}}}},"disconnect":{"type":"object","additionalProperties":false,"required":["fast-login","too-many-online","temp-banned","proxy-blocked","country-blocked","checking","failed-verification","passed-verification","online-captcha","cloud-unreachable","invalid-username","incompatible-version","invalid-public-key","missing-public-key","plan-limit-exhausted","locked-down"],"properties":{"fast-login":{"$ref":"#/components/schemas/MessageText"},"too-many-online":{"$ref":"#/components/schemas/MessageText"},"temp-banned":{"$ref":"#/components/schemas/MessageText"},"proxy-blocked":{"$ref":"#/components/schemas/MessageText"},"country-blocked":{"$ref":"#/components/schemas/MessageText"},"checking":{"$ref":"#/components/schemas/MessageText"},"failed-verification":{"$ref":"#/components/schemas/MessageText"},"passed-verification":{"$ref":"#/components/schemas/MessageText"},"online-captcha":{"$ref":"#/components/schemas/MessageText"},"cloud-unreachable":{"$ref":"#/components/schemas/MessageText"},"invalid-username":{"$ref":"#/components/schemas/MessageText"},"incompatible-version":{"$ref":"#/components/schemas/MessageText"},"invalid-public-key":{"$ref":"#/components/schemas/MessageText"},"missing-public-key":{"$ref":"#/components/schemas/MessageText"},"plan-limit-exhausted":{"$ref":"#/components/schemas/MessageText"},"locked-down":{"$ref":"#/components/schemas/MessageText"}}},"verification":{"type":"object","additionalProperties":false,"required":["title"],"properties":{"title":{"type":"object","additionalProperties":false,"required":["title","subtitle","fade-in","stay","fade-out"],"properties":{"title":{"$ref":"#/components/schemas/MessageText"},"subtitle":{"$ref":"#/components/schemas/MessageText"},"fade-in":{"type":"integer","minimum":0,"maximum":600},"stay":{"type":"integer","minimum":0,"maximum":600},"fade-out":{"type":"integer","minimum":0,"maximum":600}}}}}}}}}}