{"openapi":"3.1.0","info":{"title":"UniHosted public website API","version":"1.0.0","description":"Read-only public endpoints for UniHosted website health, blog discovery, and UniFi regulatory channel reference data. This API cannot access or change customer accounts, hosted servers, backups, devices, or network configuration.","termsOfService":"https://www.unihosted.com/legal/terms-and-conditions","contact":{"name":"UniHosted support","email":"support@team.unihosted.com","url":"https://www.unihosted.com/contact"}},"externalDocs":{"description":"UniHosted developer documentation, usage guidance, errors, and lifecycle policy","url":"https://www.unihosted.com/developers"},"servers":[{"url":"https://www.unihosted.com","description":"The origin that served this OpenAPI description"}],"security":[],"tags":[{"name":"System","description":"Public service health information."},{"name":"Content","description":"Public UniHosted editorial content."},{"name":"UniFi reference","description":"Public reference datasets used by UniHosted tools."}],"paths":{"/api/v1/ping":{"get":{"operationId":"getUniHostedApiHealthV1","summary":"Check public API health","description":"Returns a small uncached response confirming that the UniHosted public website API is reachable. This read-only operation requires no authentication.","security":[],"tags":["System"],"responses":{"200":{"description":"The public API is reachable.","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/HealthResponse"}}}},"429":{"$ref":"#/components/responses/TooManyRequests","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"default":{"$ref":"#/components/responses/UnexpectedError","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}}},"/api/v1/blog":{"get":{"operationId":"listUniHostedBlogArticlesV1","summary":"List public UniHosted blog articles","description":"Returns up to 25 public UniHosted blog records for discovery. Follow next_cursor for reliable traversal; the page parameter remains available for compatibility. Use the canonical article URL or RSS feed to retrieve article content. This read-only operation requires no authentication.","security":[],"tags":["Content"],"parameters":[{"in":"query","name":"page","required":false,"deprecated":true,"description":"One-based results page retained for compatibility. Prefer cursor for new integrations. Defaults to 1.","schema":{"type":"integer","minimum":1,"default":1},"example":1},{"in":"query","name":"cursor","required":false,"description":"Opaque continuation token returned as next_cursor. Do not modify its value.","schema":{"type":"string","minLength":1},"example":"cGFnZToy"}],"responses":{"200":{"description":"A page of public blog records and pagination metadata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BlogIndexResponse"}}}},"400":{"$ref":"#/components/responses/BadRequest","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"429":{"$ref":"#/components/responses/TooManyRequests","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"503":{"$ref":"#/components/responses/Unavailable","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"default":{"$ref":"#/components/responses/UnexpectedError","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}}},"/api/v1/country-channels":{"get":{"operationId":"listUniFiCountryChannelsV1","summary":"Get UniFi country channel reference data","description":"Returns UniFi software versions and the public regulatory channel reference data used by the UniHosted Channels Explorer. Omit versionId to use the latest known release. This read-only operation requires no authentication.","security":[],"tags":["UniFi reference"],"parameters":[{"in":"query","name":"versionId","required":false,"description":"Positive version identifier returned by this endpoint's versions array.","schema":{"type":"integer","minimum":1},"example":1}],"responses":{"200":{"description":"Available software versions and country channel data for the selected release.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CountryChannelsResponse"}}}},"400":{"$ref":"#/components/responses/BadRequest","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"429":{"$ref":"#/components/responses/TooManyRequests","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"503":{"$ref":"#/components/responses/Unavailable","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"default":{"$ref":"#/components/responses/UnexpectedError","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}}}},"components":{"headers":{"RateLimitLimit":{"description":"Maximum requests allowed for the current one-minute window.","schema":{"type":"integer","minimum":1}},"RateLimitRemaining":{"description":"Requests remaining for the client in the current window.","schema":{"type":"integer","minimum":0}},"RateLimitReset":{"description":"Seconds until the current rate-limit window resets.","schema":{"type":"integer","minimum":1}}},"responses":{"BadRequest":{"description":"A query parameter is invalid.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"Unavailable":{"description":"The endpoint's upstream data is temporarily unavailable.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"TooManyRequests":{"description":"The client exceeded the public limit of 120 requests per minute.","headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer","minimum":1}},"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/ProblemDetails"}}}},"UnexpectedError":{"description":"An unexpected API error. Inspect the stable code and resolution fields before retrying.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}},"schemas":{"HealthResponse":{"type":"object","additionalProperties":false,"required":["status","timestamp","api_version"],"properties":{"status":{"type":"string","const":"ok"},"timestamp":{"type":"string","format":"date-time"},"api_version":{"type":"string","const":"v1"}}},"BlogIndexResponse":{"type":"object","description":"Public content records plus pagination metadata. Fields can expand as the content service evolves.","required":["data","meta"],"properties":{"data":{"type":"array","items":{"type":"object","required":["slug","title"],"properties":{"slug":{"type":"string"},"title":{"type":"string"},"description":{"type":["string","null"]},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}},"additionalProperties":true}},"meta":{"type":"object","required":["pagination","next_cursor"],"properties":{"pagination":{"type":"object","required":["page","pageCount","pageSize","total"],"properties":{"page":{"type":"integer","minimum":1},"pageCount":{"type":"integer","minimum":0},"pageSize":{"type":"integer","minimum":1,"maximum":25},"total":{"type":"integer","minimum":0}},"additionalProperties":false},"next_cursor":{"type":["string","null"],"description":"Opaque cursor for the next page, or null after the final page."}},"additionalProperties":true}},"additionalProperties":true},"SoftwareVersion":{"type":"object","additionalProperties":false,"required":["id","name","slug","releaseDate"],"properties":{"id":{"type":"integer"},"name":{"type":"string"},"slug":{"type":"string"},"releaseDate":{"type":"string","format":"date-time"}}},"CountryChannel":{"type":"object","description":"Country-specific channel lists and indoor/outdoor availability flags.","required":["code","name","channels_ng","channels_na","channels_6e"],"properties":{"code":{"type":"string"},"name":{"type":"string"},"hints":{"type":"array","items":{"type":"string"}},"channels_ng":{"type":"array","items":{"type":"integer"}},"channels_na":{"type":"array","items":{"type":"integer"}},"channels_6e":{"type":"array","items":{"type":"integer"}},"indoorAllowed":{"type":["boolean","null"]},"outdoorAllowed":{"type":["boolean","null"]}},"additionalProperties":true},"CountryChannelsResponse":{"type":"object","additionalProperties":false,"required":["versions","countries","currentVersion"],"properties":{"versions":{"type":"array","items":{"$ref":"#/components/schemas/SoftwareVersion"}},"countries":{"type":"array","items":{"$ref":"#/components/schemas/CountryChannel"}},"currentVersion":{"oneOf":[{"$ref":"#/components/schemas/SoftwareVersion"},{"type":"null"}]}}},"ProblemDetails":{"type":"object","additionalProperties":false,"required":["type","title","status","detail","instance","code","resolution","documentation_url"],"properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer","minimum":400,"maximum":599},"detail":{"type":"string"},"instance":{"type":"string","format":"uri"},"code":{"type":"string"},"resolution":{"type":"string"},"documentation_url":{"type":"string","format":"uri"}}}}},"x-api-lifecycle":{"current_major_version":"v1","deprecation_policy_url":"https://www.unihosted.com/developers#versioning","policy":"Breaking changes use a new major URL path. Deprecated operations remain available for at least 180 days after notice and return Deprecation, Sunset, and Link headers identifying the successor."},"x-rate-limit":{"limit":120,"window_seconds":60,"scope":"client"}}