{"openapi":"3.1.0","info":{"title":"SportyPlus Website","summary":"Pages, markdown representations and content feeds served by www.sporty.plus.","description":"The public HTTP surface of the SportyPlus marketing site and blog.\n\nEvery page is available as HTML or as markdown from the same canonical URL\n(`Accept: text/markdown`, per https://acceptmarkdown.com), or from the same path\nwith a `.md` suffix.\n\nThis describes the website only. The SportyPlus product API is a separate,\nauthenticated service and is not documented here — write to info@sporty.plus\nabout API access.\n\n## Versioning\n\nThis contract is version `1`. Every response carries an\n`API-Version` header, and a request may pin the version by sending the same\nheader; a version this site does not serve is refused with 400 rather than answered\nwith a different one. This document is also published at a version-pinned URL,\n/v1/openapi.json.\n\nThe page URLs themselves are canonical and are never versioned — what the version\nnames is the contract around them: the markdown representation, the `.md` alias, the\nerror body and the discovery documents.\n\n## Deprecation\n\nBreaking changes to this contract ship as a new API-Version; additive changes do not. A superseded version keeps working for at least 6 months from the announcement. While a version is being retired, its responses carry `Deprecation` and `Sunset` headers (RFC 9745, RFC 8594) and the change is noted in /llms.txt.","version":"1.1.0","x-api-version":"1","x-deprecation-policy":"Breaking changes to this contract ship as a new API-Version; additive changes do not. A superseded version keeps working for at least 6 months from the announcement. While a version is being retired, its responses carry `Deprecation` and `Sunset` headers (RFC 9745, RFC 8594) and the change is noted in /llms.txt.","contact":{"name":"SportyPlus","email":"info@sporty.plus","url":"https://www.sporty.plus/contact"},"license":{"name":"Proprietary — content © Inspirium d.o.o.","url":"https://www.sporty.plus/terms"}},"servers":[{"url":"https://www.sporty.plus","description":"Production"}],"security":[],"externalDocs":{"description":"SportyPlus product documentation","url":"https://docs.sporty.plus"},"tags":[{"name":"pages","description":"Human-readable pages, negotiable as markdown."},{"name":"discovery","description":"Machine-readable descriptions of the site."},{"name":"content","description":"Blog content, syndicated."}],"paths":{"/":{"get":{"tags":["pages"],"operationId":"getHome","summary":"Product overview (home page)","parameters":[{"name":"Accept","in":"header","required":false,"description":"Send `text/markdown` for the markdown representation. Anything else gets HTML.","schema":{"type":"string","enum":["text/html","text/markdown"],"default":"text/html"}},{"$ref":"#/components/parameters/ApiVersion"}],"responses":{"200":{"description":"The page, in whichever representation the Accept header selected.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Vary":{"schema":{"type":"string","example":"Accept"}},"Link":{"description":"On the HTML representation, points at the `.md` alias (RFC 8288).","schema":{"type":"string","example":"</pricing.md>; rel=\"alternate\"; type=\"text/markdown\""}}},"content":{"text/html":{"schema":{"type":"string"}},"text/markdown":{"schema":{"type":"string"}}}},"400":{"$ref":"#/components/responses/UnsupportedVersion"},"404":{"$ref":"#/components/responses/NotFound"},"406":{"$ref":"#/components/responses/NotAcceptable"},"default":{"$ref":"#/components/responses/Error"}}}},"/{page}":{"get":{"tags":["pages"],"operationId":"getPage","summary":"Any marketing page","description":"Enumerate the available pages from /sitemap_index.xml or /llms.txt.","parameters":[{"name":"page","in":"path","required":true,"description":"Page path, e.g. `pricing`, `modules/court_booking`, `blog/court-booking-management`.","schema":{"type":"string"},"example":"pricing"},{"name":"Accept","in":"header","required":false,"description":"Send `text/markdown` for the markdown representation. Anything else gets HTML.","schema":{"type":"string","enum":["text/html","text/markdown"],"default":"text/html"}},{"$ref":"#/components/parameters/ApiVersion"}],"responses":{"200":{"description":"The page, in whichever representation the Accept header selected.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Vary":{"schema":{"type":"string","example":"Accept"}},"Link":{"description":"On the HTML representation, points at the `.md` alias (RFC 8288).","schema":{"type":"string","example":"</pricing.md>; rel=\"alternate\"; type=\"text/markdown\""}}},"content":{"text/html":{"schema":{"type":"string"}},"text/markdown":{"schema":{"type":"string"}}}},"400":{"$ref":"#/components/responses/UnsupportedVersion"},"404":{"$ref":"#/components/responses/NotFound"},"406":{"$ref":"#/components/responses/NotAcceptable"},"default":{"$ref":"#/components/responses/Error"}}}},"/{page}.md":{"get":{"tags":["pages"],"operationId":"getPageAsMarkdown","summary":"Markdown alias for a page","description":"Same content as `/{page}` with `Accept: text/markdown`, for clients that send no Accept header. The homepage alias is `/index.md`.","parameters":[{"name":"page","in":"path","required":true,"schema":{"type":"string"},"example":"pricing"},{"$ref":"#/components/parameters/ApiVersion"}],"responses":{"200":{"description":"The page as markdown — prose only, no navigation, scripts or layout markup.","content":{"text/markdown":{"schema":{"type":"string"},"example":"---\ntitle: \"SportyPlus\"\ncanonical: \"https://www.sporty.plus/\"\n---\n\n# One application, all possibilities!\n"}}},"400":{"$ref":"#/components/responses/UnsupportedVersion"},"404":{"$ref":"#/components/responses/NotFound"},"default":{"$ref":"#/components/responses/Error"}}}},"/llms.txt":{"get":{"tags":["discovery"],"operationId":"getLlmsTxt","summary":"What SportyPlus is, and which pages matter","parameters":[{"$ref":"#/components/parameters/ApiVersion"}],"responses":{"200":{"description":"llms.txt","content":{"text/plain":{"schema":{"type":"string"}}}},"400":{"$ref":"#/components/responses/UnsupportedVersion"},"default":{"$ref":"#/components/responses/Error"}}}},"/openapi.json":{"get":{"tags":["discovery"],"operationId":"getOpenApi","summary":"This document","parameters":[{"$ref":"#/components/parameters/ApiVersion"}],"responses":{"200":{"description":"OpenAPI 3.1 document","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"$ref":"#/components/responses/UnsupportedVersion"},"default":{"$ref":"#/components/responses/Error"}}}},"/robots.txt":{"get":{"tags":["discovery"],"operationId":"getRobotsTxt","summary":"Crawl policy","parameters":[{"$ref":"#/components/parameters/ApiVersion"}],"responses":{"200":{"description":"robots.txt","content":{"text/plain":{"schema":{"type":"string"}}}},"400":{"$ref":"#/components/responses/UnsupportedVersion"},"default":{"$ref":"#/components/responses/Error"}}}},"/sitemap_index.xml":{"get":{"tags":["discovery"],"operationId":"getSitemapIndex","summary":"Sitemap index — one sitemap per locale","parameters":[{"$ref":"#/components/parameters/ApiVersion"}],"responses":{"200":{"description":"Sitemap index","content":{"application/xml":{"schema":{"type":"string"}}}},"400":{"$ref":"#/components/responses/UnsupportedVersion"},"default":{"$ref":"#/components/responses/Error"}}}},"/__sitemap__/{locale}.xml":{"get":{"tags":["discovery"],"operationId":"getLocaleSitemap","summary":"Every canonical URL for one locale","parameters":[{"name":"locale","in":"path","required":true,"schema":{"type":"string","enum":["hr","en","sl","sr","sr-latn","mk","de","pt","pt-pt","it","es","fr","sk","el","cs","da","et"]},"example":"en"},{"$ref":"#/components/parameters/ApiVersion"}],"responses":{"200":{"description":"Sitemap","content":{"application/xml":{"schema":{"type":"string"}}}},"400":{"$ref":"#/components/responses/UnsupportedVersion"},"default":{"$ref":"#/components/responses/Error"}}}},"/feed.xml":{"get":{"tags":["content"],"operationId":"getRssFeed","summary":"Blog feed (RSS 2.0)","parameters":[{"$ref":"#/components/parameters/ApiVersion"}],"responses":{"200":{"description":"RSS feed","content":{"application/rss+xml":{"schema":{"type":"string"}}}},"400":{"$ref":"#/components/responses/UnsupportedVersion"},"default":{"$ref":"#/components/responses/Error"}}}},"/feed.atom":{"get":{"tags":["content"],"operationId":"getAtomFeed","summary":"Blog feed (Atom 1.0)","parameters":[{"$ref":"#/components/parameters/ApiVersion"}],"responses":{"200":{"description":"Atom feed","content":{"application/atom+xml":{"schema":{"type":"string"}}}},"400":{"$ref":"#/components/responses/UnsupportedVersion"},"default":{"$ref":"#/components/responses/Error"}}}},"/feed.json":{"get":{"tags":["content"],"operationId":"getJsonFeed","summary":"Blog feed (JSON Feed 1.1)","parameters":[{"$ref":"#/components/parameters/ApiVersion"}],"responses":{"200":{"description":"JSON feed","content":{"application/feed+json":{"schema":{"$ref":"#/components/schemas/JsonFeed"}}}},"400":{"$ref":"#/components/responses/UnsupportedVersion"},"default":{"$ref":"#/components/responses/Error"}}}}},"components":{"parameters":{"ApiVersion":{"name":"API-Version","in":"header","required":false,"description":"Pin the contract version. Omit it to get the current version. A value this site does not serve is refused with 400 rather than answered with a different version.","schema":{"type":"string","enum":["1"],"example":"1"}}},"headers":{"ApiVersion":{"description":"The contract version that produced this response. Currently always `1`.","schema":{"type":"string","enum":["1"],"example":"1"}}},"responses":{"NotFound":{"description":"No such page. The markdown representation lists where to look instead; a client that accepts application/json gets the error object.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}},"text/markdown":{"schema":{"type":"string"}},"text/html":{"schema":{"type":"string"}}}},"NotAcceptable":{"description":"The Accept header rules out every representation this resource has.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}},"text/plain":{"schema":{"type":"string"}}}},"UnsupportedVersion":{"description":"The API-Version request header named a version this site does not serve.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}},"text/plain":{"schema":{"type":"string"}}}},"Error":{"description":"Any other error.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}},"text/markdown":{"schema":{"type":"string"}},"text/html":{"schema":{"type":"string"}}}}},"schemas":{"Error":{"type":"object","title":"Error","description":"The error body served to a client that accepts application/json. Clients that accept markdown get the same failure as a markdown document with links onward; browsers get the HTML error page.","required":["error","statusCode","message"],"additionalProperties":false,"properties":{"error":{"type":"boolean","const":true,"description":"Always true — lets a client branch without reading the status line."},"statusCode":{"type":"integer","minimum":400,"maximum":599,"example":404},"statusMessage":{"type":"string","example":"Page not found: /nope"},"message":{"type":"string","example":"Page not found: /nope"},"url":{"type":"string","format":"uri","description":"The URL that failed."},"data":{"type":"object","additionalProperties":true,"description":"Error-specific detail. For a 404 this carries the requested `path`.","example":{"path":"/nope"}}}},"JsonFeed":{"type":"object","description":"JSON Feed 1.1 — https://www.jsonfeed.org/version/1.1/","properties":{"version":{"type":"string","const":"https://jsonfeed.org/version/1.1"},"title":{"type":"string"},"home_page_url":{"type":"string","format":"uri"},"feed_url":{"type":"string","format":"uri"},"items":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"url":{"type":"string","format":"uri"},"title":{"type":"string"},"summary":{"type":"string"},"date_published":{"type":"string","format":"date-time"},"authors":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"}}}}}}}}}}}}