{"$comment":"Generated by api/generate.mjs from api/model. Do not edit.","openapi":"3.1.0","info":{"title":"Ownsite API","version":"2026-10-17","description":"See https://api.ownsite.me/docs"},"paths":{"/v1/manual":{"get":{"description":"The manual's articles. With `query`: the ones about it, best first (a few words; Chinese\nworks best). Without: every article.","operationId":"ListManualArticles","parameters":[{"name":"query","in":"query","schema":{"type":"string","maxLength":200}},{"name":"maxResults","in":"query","schema":{"type":"number","maximum":100,"minimum":1}},{"name":"nextToken","in":"query","schema":{"type":"string","maxLength":2048,"minLength":1}}],"responses":{"200":{"description":"ListManualArticles 200 response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListManualArticlesResponseContent"}}}},"400":{"description":"ValidationException 400 response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationExceptionResponseContent"}}}},"401":{"description":"UnauthorizedException 401 response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedExceptionResponseContent"}}}},"403":{"description":"AccessDeniedException 403 response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AccessDeniedExceptionResponseContent"}}}},"429":{"description":"ThrottlingException 429 response","headers":{"Retry-After":{"schema":{"type":"number"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ThrottlingExceptionResponseContent"}}}},"500":{"description":"InternalServerException 500 response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerExceptionResponseContent"}}}}},"security":[{"ownsite":[]}]}},"/v1/manual/{articleId}":{"get":{"description":"One whole article.","operationId":"GetManualArticle","parameters":[{"name":"articleId","in":"path","schema":{"type":"string","maxLength":50,"minLength":1,"pattern":"^[a-z0-9](?:[a-z0-9-]{0,48}[a-z0-9])?$"},"required":true}],"responses":{"200":{"description":"GetManualArticle 200 response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetManualArticleResponseContent"}}}},"400":{"description":"ValidationException 400 response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationExceptionResponseContent"}}}},"401":{"description":"UnauthorizedException 401 response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedExceptionResponseContent"}}}},"403":{"description":"AccessDeniedException 403 response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AccessDeniedExceptionResponseContent"}}}},"404":{"description":"ResourceNotFoundException 404 response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResourceNotFoundExceptionResponseContent"}}}},"429":{"description":"ThrottlingException 429 response","headers":{"Retry-After":{"schema":{"type":"number"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ThrottlingExceptionResponseContent"}}}},"500":{"description":"InternalServerException 500 response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerExceptionResponseContent"}}}}},"security":[{"ownsite":[]}]}},"/v1/sites":{"get":{"operationId":"ListSites","parameters":[{"name":"maxResults","in":"query","schema":{"type":"number","maximum":100,"minimum":1}},{"name":"nextToken","in":"query","schema":{"type":"string","maxLength":2048,"minLength":1}}],"responses":{"200":{"description":"ListSites 200 response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListSitesResponseContent"}}}},"400":{"description":"ValidationException 400 response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationExceptionResponseContent"}}}},"401":{"description":"UnauthorizedException 401 response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedExceptionResponseContent"}}}},"403":{"description":"AccessDeniedException 403 response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AccessDeniedExceptionResponseContent"}}}},"429":{"description":"ThrottlingException 429 response","headers":{"Retry-After":{"schema":{"type":"number"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ThrottlingExceptionResponseContent"}}}},"500":{"description":"InternalServerException 500 response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerExceptionResponseContent"}}}}},"security":[{"ownsite":[]}]}},"/v1/sites/{siteId}":{"get":{"operationId":"GetSite","parameters":[{"name":"siteId","in":"path","description":"The site name. It is also part of its addresses (<siteId>.ownsite.me) and never changes.","schema":{"type":"string","maxLength":40,"minLength":1,"pattern":"^[a-z0-9](?:[a-z0-9-]{0,38}[a-z0-9])?$","description":"The site name. It is also part of its addresses (<siteId>.ownsite.me) and never changes."},"required":true}],"responses":{"200":{"description":"GetSite 200 response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetSiteResponseContent"}}}},"400":{"description":"ValidationException 400 response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationExceptionResponseContent"}}}},"401":{"description":"UnauthorizedException 401 response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedExceptionResponseContent"}}}},"403":{"description":"AccessDeniedException 403 response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AccessDeniedExceptionResponseContent"}}}},"404":{"description":"ResourceNotFoundException 404 response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResourceNotFoundExceptionResponseContent"}}}},"429":{"description":"ThrottlingException 429 response","headers":{"Retry-After":{"schema":{"type":"number"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ThrottlingExceptionResponseContent"}}}},"500":{"description":"InternalServerException 500 response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerExceptionResponseContent"}}}}},"security":[{"ownsite":[]}]}},"/v1/sites/{siteId}/activity":{"get":{"operationId":"ListSiteActivity","parameters":[{"name":"siteId","in":"path","description":"The site name. It is also part of its addresses (<siteId>.ownsite.me) and never changes.","schema":{"type":"string","maxLength":40,"minLength":1,"pattern":"^[a-z0-9](?:[a-z0-9-]{0,38}[a-z0-9])?$","description":"The site name. It is also part of its addresses (<siteId>.ownsite.me) and never changes."},"required":true},{"name":"maxResults","in":"query","schema":{"type":"number","maximum":100,"minimum":1}},{"name":"nextToken","in":"query","schema":{"type":"string","maxLength":2048,"minLength":1}}],"responses":{"200":{"description":"ListSiteActivity 200 response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListSiteActivityResponseContent"}}}},"400":{"description":"ValidationException 400 response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationExceptionResponseContent"}}}},"401":{"description":"UnauthorizedException 401 response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedExceptionResponseContent"}}}},"403":{"description":"AccessDeniedException 403 response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AccessDeniedExceptionResponseContent"}}}},"404":{"description":"ResourceNotFoundException 404 response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResourceNotFoundExceptionResponseContent"}}}},"429":{"description":"ThrottlingException 429 response","headers":{"Retry-After":{"schema":{"type":"number"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ThrottlingExceptionResponseContent"}}}},"500":{"description":"InternalServerException 500 response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerExceptionResponseContent"}}}}},"security":[{"ownsite":[]}]}},"/v1/sites/{siteId}/blog":{"get":{"description":"The blog's settings and what the AI needs to write for it: its categories and addresses.","operationId":"GetBlog","parameters":[{"name":"siteId","in":"path","description":"The site name. It is also part of its addresses (<siteId>.ownsite.me) and never changes.","schema":{"type":"string","maxLength":40,"minLength":1,"pattern":"^[a-z0-9](?:[a-z0-9-]{0,38}[a-z0-9])?$","description":"The site name. It is also part of its addresses (<siteId>.ownsite.me) and never changes."},"required":true}],"responses":{"200":{"description":"GetBlog 200 response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetBlogResponseContent"}}}},"400":{"description":"ValidationException 400 response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationExceptionResponseContent"}}}},"401":{"description":"UnauthorizedException 401 response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedExceptionResponseContent"}}}},"403":{"description":"AccessDeniedException 403 response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AccessDeniedExceptionResponseContent"}}}},"404":{"description":"ResourceNotFoundException 404 response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResourceNotFoundExceptionResponseContent"}}}},"429":{"description":"ThrottlingException 429 response","headers":{"Retry-After":{"schema":{"type":"number"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ThrottlingExceptionResponseContent"}}}},"500":{"description":"InternalServerException 500 response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerExceptionResponseContent"}}}}},"security":[{"ownsite":["blog:read"]}]},"patch":{"description":"Sets the blog's name, the line under it, or its look. Readers see the change at once when\nthe blog is public. This is the same setup the person can do in the dashboard; once it is\ndone, the dashboard counts the blog as set up.","operationId":"UpdateBlog","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateBlogRequestContent"}}}},"parameters":[{"name":"siteId","in":"path","description":"The site name. It is also part of its addresses (<siteId>.ownsite.me) and never changes.","schema":{"type":"string","maxLength":40,"minLength":1,"pattern":"^[a-z0-9](?:[a-z0-9-]{0,38}[a-z0-9])?$","description":"The site name. It is also part of its addresses (<siteId>.ownsite.me) and never changes."},"required":true}],"responses":{"200":{"description":"UpdateBlog 200 response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateBlogResponseContent"}}}},"400":{"description":"ValidationException 400 response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationExceptionResponseContent"}}}},"401":{"description":"UnauthorizedException 401 response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedExceptionResponseContent"}}}},"403":{"description":"AccessDeniedException 403 response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AccessDeniedExceptionResponseContent"}}}},"404":{"description":"ResourceNotFoundException 404 response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResourceNotFoundExceptionResponseContent"}}}},"429":{"description":"ThrottlingException 429 response","headers":{"Retry-After":{"schema":{"type":"number"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ThrottlingExceptionResponseContent"}}}},"500":{"description":"InternalServerException 500 response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerExceptionResponseContent"}}}}},"security":[{"ownsite":["blog:write"]}]}},"/v1/sites/{siteId}/home":{"get":{"description":"The home page of a site: which version is live, which one is being changed.","operationId":"GetHome","parameters":[{"name":"siteId","in":"path","description":"The site name. It is also part of its addresses (<siteId>.ownsite.me) and never changes.","schema":{"type":"string","maxLength":40,"minLength":1,"pattern":"^[a-z0-9](?:[a-z0-9-]{0,38}[a-z0-9])?$","description":"The site name. It is also part of its addresses (<siteId>.ownsite.me) and never changes."},"required":true},{"name":"page","in":"query","description":"Another page of the site (`<domain>/<page>`, from GetSite `pages`). Default: the\nhome page itself.","schema":{"type":"string","maxLength":30,"minLength":1,"pattern":"^[a-z0-9](?:[a-z0-9-]{0,28}[a-z0-9])?$","description":"Another page of the site (`<domain>/<page>`, from GetSite `pages`). Default: the\nhome page itself."}}],"responses":{"200":{"description":"GetHome 200 response","headers":{"ETag":{"description":"Changes when the live version changes. Pass it as `If-Match` to PublishHomeVersion\nto publish only if nobody published something else meanwhile.","schema":{"type":"string","description":"Changes when the live version changes. Pass it as `If-Match` to PublishHomeVersion\nto publish only if nobody published something else meanwhile."},"required":true}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetHomeResponseContent"}}}},"400":{"description":"ValidationException 400 response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationExceptionResponseContent"}}}},"401":{"description":"UnauthorizedException 401 response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedExceptionResponseContent"}}}},"403":{"description":"AccessDeniedException 403 response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AccessDeniedExceptionResponseContent"}}}},"404":{"description":"ResourceNotFoundException 404 response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResourceNotFoundExceptionResponseContent"}}}},"429":{"description":"ThrottlingException 429 response","headers":{"Retry-After":{"schema":{"type":"number"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ThrottlingExceptionResponseContent"}}}},"500":{"description":"InternalServerException 500 response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerExceptionResponseContent"}}}}},"security":[{"ownsite":["home:read"]}]}},"/v1/sites/{siteId}/home/edit-jobs":{"post":{"operationId":"StartHomeEditJob","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StartHomeEditJobRequestContent"}}},"required":true},"parameters":[{"name":"siteId","in":"path","description":"The site name. It is also part of its addresses (<siteId>.ownsite.me) and never changes.","schema":{"type":"string","maxLength":40,"minLength":1,"pattern":"^[a-z0-9](?:[a-z0-9-]{0,38}[a-z0-9])?$","description":"The site name. It is also part of its addresses (<siteId>.ownsite.me) and never changes."},"required":true},{"name":"page","in":"query","description":"Another page of the site (`<domain>/<page>`, from GetSite `pages`). Default: the\nhome page itself.","schema":{"type":"string","maxLength":30,"minLength":1,"pattern":"^[a-z0-9](?:[a-z0-9-]{0,28}[a-z0-9])?$","description":"Another page of the site (`<domain>/<page>`, from GetSite `pages`). Default: the\nhome page itself."}}],"responses":{"202":{"description":"StartHomeEditJob 202 response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StartHomeEditJobResponseContent"}}}},"400":{"description":"ValidationException 400 response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationExceptionResponseContent"}}}},"401":{"description":"UnauthorizedException 401 response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedExceptionResponseContent"}}}},"402":{"description":"ServiceQuotaExceededException 402 response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServiceQuotaExceededExceptionResponseContent"}}}},"403":{"description":"AccessDeniedException 403 response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AccessDeniedExceptionResponseContent"}}}},"404":{"description":"ResourceNotFoundException 404 response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResourceNotFoundExceptionResponseContent"}}}},"409":{"description":"ConflictException 409 response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictExceptionResponseContent"}}}},"429":{"description":"ThrottlingException 429 response","headers":{"Retry-After":{"schema":{"type":"number"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ThrottlingExceptionResponseContent"}}}},"500":{"description":"InternalServerException 500 response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerExceptionResponseContent"}}}}},"security":[{"ownsite":["home:write"]}]}},"/v1/sites/{siteId}/home/edit-jobs/{jobId}":{"get":{"operationId":"GetHomeEditJob","parameters":[{"name":"siteId","in":"path","description":"The site name. It is also part of its addresses (<siteId>.ownsite.me) and never changes.","schema":{"type":"string","maxLength":40,"minLength":1,"pattern":"^[a-z0-9](?:[a-z0-9-]{0,38}[a-z0-9])?$","description":"The site name. It is also part of its addresses (<siteId>.ownsite.me) and never changes."},"required":true},{"name":"jobId","in":"path","schema":{"type":"string","pattern":"^[a-z0-9]{12}$"},"required":true},{"name":"page","in":"query","description":"Another page of the site (`<domain>/<page>`, from GetSite `pages`). Default: the\nhome page itself.","schema":{"type":"string","maxLength":30,"minLength":1,"pattern":"^[a-z0-9](?:[a-z0-9-]{0,28}[a-z0-9])?$","description":"Another page of the site (`<domain>/<page>`, from GetSite `pages`). Default: the\nhome page itself."}}],"responses":{"200":{"description":"GetHomeEditJob 200 response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetHomeEditJobResponseContent"}}}},"400":{"description":"ValidationException 400 response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationExceptionResponseContent"}}}},"401":{"description":"UnauthorizedException 401 response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedExceptionResponseContent"}}}},"403":{"description":"AccessDeniedException 403 response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AccessDeniedExceptionResponseContent"}}}},"404":{"description":"ResourceNotFoundException 404 response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResourceNotFoundExceptionResponseContent"}}}},"429":{"description":"ThrottlingException 429 response","headers":{"Retry-After":{"schema":{"type":"number"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ThrottlingExceptionResponseContent"}}}},"500":{"description":"InternalServerException 500 response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerExceptionResponseContent"}}}}},"security":[{"ownsite":["home:read"]}]}},"/v1/sites/{siteId}/home/edit-jobs/{jobId}/stop":{"post":{"description":"Asks a running job to stop. It stops at its next step; nothing it had not saved is kept.","operationId":"StopHomeEditJob","parameters":[{"name":"siteId","in":"path","description":"The site name. It is also part of its addresses (<siteId>.ownsite.me) and never changes.","schema":{"type":"string","maxLength":40,"minLength":1,"pattern":"^[a-z0-9](?:[a-z0-9-]{0,38}[a-z0-9])?$","description":"The site name. It is also part of its addresses (<siteId>.ownsite.me) and never changes."},"required":true},{"name":"jobId","in":"path","schema":{"type":"string","pattern":"^[a-z0-9]{12}$"},"required":true},{"name":"page","in":"query","description":"Another page of the site (`<domain>/<page>`, from GetSite `pages`). Default: the\nhome page itself.","schema":{"type":"string","maxLength":30,"minLength":1,"pattern":"^[a-z0-9](?:[a-z0-9-]{0,28}[a-z0-9])?$","description":"Another page of the site (`<domain>/<page>`, from GetSite `pages`). Default: the\nhome page itself."}}],"responses":{"200":{"description":"StopHomeEditJob 200 response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StopHomeEditJobResponseContent"}}}},"400":{"description":"ValidationException 400 response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationExceptionResponseContent"}}}},"401":{"description":"UnauthorizedException 401 response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedExceptionResponseContent"}}}},"403":{"description":"AccessDeniedException 403 response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AccessDeniedExceptionResponseContent"}}}},"404":{"description":"ResourceNotFoundException 404 response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResourceNotFoundExceptionResponseContent"}}}},"429":{"description":"ThrottlingException 429 response","headers":{"Retry-After":{"schema":{"type":"number"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ThrottlingExceptionResponseContent"}}}},"500":{"description":"InternalServerException 500 response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerExceptionResponseContent"}}}}},"security":[{"ownsite":["home:write"]}]}},"/v1/sites/{siteId}/home/templates":{"get":{"description":"The templates a home page can start from. Each is one structure in a different look; its\ncolors and fonts are all in `src/theme.css`.","operationId":"ListHomeTemplates","parameters":[{"name":"siteId","in":"path","description":"The site name. It is also part of its addresses (<siteId>.ownsite.me) and never changes.","schema":{"type":"string","maxLength":40,"minLength":1,"pattern":"^[a-z0-9](?:[a-z0-9-]{0,38}[a-z0-9])?$","description":"The site name. It is also part of its addresses (<siteId>.ownsite.me) and never changes."},"required":true}],"responses":{"200":{"description":"ListHomeTemplates 200 response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListHomeTemplatesResponseContent"}}}},"400":{"description":"ValidationException 400 response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationExceptionResponseContent"}}}},"401":{"description":"UnauthorizedException 401 response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedExceptionResponseContent"}}}},"403":{"description":"AccessDeniedException 403 response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AccessDeniedExceptionResponseContent"}}}},"404":{"description":"ResourceNotFoundException 404 response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResourceNotFoundExceptionResponseContent"}}}},"429":{"description":"ThrottlingException 429 response","headers":{"Retry-After":{"schema":{"type":"number"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ThrottlingExceptionResponseContent"}}}},"500":{"description":"InternalServerException 500 response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerExceptionResponseContent"}}}}},"security":[{"ownsite":["home:read"]}]}},"/v1/sites/{siteId}/home/unpublish":{"post":{"description":"Takes the home page off its public addresses: they then show the default home (the name,\nthe intro and the latest posts). With `page`, that page is taken offline (not found).\nEvery version stays and can be published again.","operationId":"UnpublishHome","parameters":[{"name":"siteId","in":"path","description":"The site name. It is also part of its addresses (<siteId>.ownsite.me) and never changes.","schema":{"type":"string","maxLength":40,"minLength":1,"pattern":"^[a-z0-9](?:[a-z0-9-]{0,38}[a-z0-9])?$","description":"The site name. It is also part of its addresses (<siteId>.ownsite.me) and never changes."},"required":true},{"name":"page","in":"query","description":"Another page of the site (`<domain>/<page>`, from GetSite `pages`). Default: the\nhome page itself.","schema":{"type":"string","maxLength":30,"minLength":1,"pattern":"^[a-z0-9](?:[a-z0-9-]{0,28}[a-z0-9])?$","description":"Another page of the site (`<domain>/<page>`, from GetSite `pages`). Default: the\nhome page itself."}}],"responses":{"200":{"description":"UnpublishHome 200 response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnpublishHomeResponseContent"}}}},"400":{"description":"ValidationException 400 response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationExceptionResponseContent"}}}},"401":{"description":"UnauthorizedException 401 response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedExceptionResponseContent"}}}},"403":{"description":"AccessDeniedException 403 response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AccessDeniedExceptionResponseContent"}}}},"404":{"description":"ResourceNotFoundException 404 response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResourceNotFoundExceptionResponseContent"}}}},"429":{"description":"ThrottlingException 429 response","headers":{"Retry-After":{"schema":{"type":"number"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ThrottlingExceptionResponseContent"}}}},"500":{"description":"InternalServerException 500 response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerExceptionResponseContent"}}}}},"security":[{"ownsite":["home:publish"]}]}},"/v1/sites/{siteId}/home/versions":{"get":{"description":"Newest first. Versions the person set aside and versions that did not build are left\nout unless asked for.","operationId":"ListHomeVersions","parameters":[{"name":"siteId","in":"path","description":"The site name. It is also part of its addresses (<siteId>.ownsite.me) and never changes.","schema":{"type":"string","maxLength":40,"minLength":1,"pattern":"^[a-z0-9](?:[a-z0-9-]{0,38}[a-z0-9])?$","description":"The site name. It is also part of its addresses (<siteId>.ownsite.me) and never changes."},"required":true},{"name":"page","in":"query","description":"Another page of the site (`<domain>/<page>`, from GetSite `pages`). Default: the\nhome page itself.","schema":{"type":"string","maxLength":30,"minLength":1,"pattern":"^[a-z0-9](?:[a-z0-9-]{0,28}[a-z0-9])?$","description":"Another page of the site (`<domain>/<page>`, from GetSite `pages`). Default: the\nhome page itself."}},{"name":"includeHidden","in":"query","schema":{"type":"boolean"}},{"name":"includeFailed","in":"query","schema":{"type":"boolean"}},{"name":"maxResults","in":"query","schema":{"type":"number","maximum":100,"minimum":1}},{"name":"nextToken","in":"query","schema":{"type":"string","maxLength":2048,"minLength":1}}],"responses":{"200":{"description":"ListHomeVersions 200 response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListHomeVersionsResponseContent"}}}},"400":{"description":"ValidationException 400 response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationExceptionResponseContent"}}}},"401":{"description":"UnauthorizedException 401 response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedExceptionResponseContent"}}}},"403":{"description":"AccessDeniedException 403 response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AccessDeniedExceptionResponseContent"}}}},"404":{"description":"ResourceNotFoundException 404 response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResourceNotFoundExceptionResponseContent"}}}},"429":{"description":"ThrottlingException 429 response","headers":{"Retry-After":{"schema":{"type":"number"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ThrottlingExceptionResponseContent"}}}},"500":{"description":"InternalServerException 500 response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerExceptionResponseContent"}}}}},"security":[{"ownsite":["home:read"]}]},"post":{"description":"Makes a new version from `baseVersionId` (default: the working version) and `changes`.\n\nA site with no version yet starts from a template instead (or a site starts over): pass\n`templateId` (from ListHomeTemplates), with changes or none. The template comes with the\nperson's name and a link to their blog; every other part is empty, and an empty part is not\nshown. `baseVersionId` and `templateId` cannot both be given.\n\nThe changes are checked at once: a path that is not a file of the site, a search text\nthat is not found or not unique, code loaded from another website, or a file the page\npoints to that does not exist is a `ValidationException` and nothing is made. Then the\nversion is built and photographed in the background: it is returned as BUILDING; read\nit with GetHomeVersion until READY or FAILED. Nothing is published.","operationId":"CreateHomeVersion","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateHomeVersionRequestContent"}}}},"parameters":[{"name":"siteId","in":"path","description":"The site name. It is also part of its addresses (<siteId>.ownsite.me) and never changes.","schema":{"type":"string","maxLength":40,"minLength":1,"pattern":"^[a-z0-9](?:[a-z0-9-]{0,38}[a-z0-9])?$","description":"The site name. It is also part of its addresses (<siteId>.ownsite.me) and never changes."},"required":true},{"name":"page","in":"query","description":"Another page of the site (`<domain>/<page>`, from GetSite `pages`). Default: the\nhome page itself.","schema":{"type":"string","maxLength":30,"minLength":1,"pattern":"^[a-z0-9](?:[a-z0-9-]{0,28}[a-z0-9])?$","description":"Another page of the site (`<domain>/<page>`, from GetSite `pages`). Default: the\nhome page itself."}}],"responses":{"202":{"description":"CreateHomeVersion 202 response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateHomeVersionResponseContent"}}}},"400":{"description":"ValidationException 400 response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationExceptionResponseContent"}}}},"401":{"description":"UnauthorizedException 401 response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedExceptionResponseContent"}}}},"403":{"description":"AccessDeniedException 403 response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AccessDeniedExceptionResponseContent"}}}},"404":{"description":"ResourceNotFoundException 404 response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResourceNotFoundExceptionResponseContent"}}}},"409":{"description":"ConflictException 409 response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictExceptionResponseContent"}}}},"429":{"description":"ThrottlingException 429 response","headers":{"Retry-After":{"schema":{"type":"number"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ThrottlingExceptionResponseContent"}}}},"500":{"description":"InternalServerException 500 response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerExceptionResponseContent"}}}}},"security":[{"ownsite":["home:write"]}]}},"/v1/sites/{siteId}/home/versions/{versionId}":{"get":{"operationId":"GetHomeVersion","parameters":[{"name":"siteId","in":"path","description":"The site name. It is also part of its addresses (<siteId>.ownsite.me) and never changes.","schema":{"type":"string","maxLength":40,"minLength":1,"pattern":"^[a-z0-9](?:[a-z0-9-]{0,38}[a-z0-9])?$","description":"The site name. It is also part of its addresses (<siteId>.ownsite.me) and never changes."},"required":true},{"name":"versionId","in":"path","description":"Lowercase letters and digits, random, so a preview address cannot be guessed.","schema":{"type":"string","pattern":"^[a-z0-9]{8}$","description":"Lowercase letters and digits, random, so a preview address cannot be guessed."},"required":true},{"name":"page","in":"query","description":"Another page of the site (`<domain>/<page>`, from GetSite `pages`). Default: the\nhome page itself.","schema":{"type":"string","maxLength":30,"minLength":1,"pattern":"^[a-z0-9](?:[a-z0-9-]{0,28}[a-z0-9])?$","description":"Another page of the site (`<domain>/<page>`, from GetSite `pages`). Default: the\nhome page itself."}}],"responses":{"200":{"description":"GetHomeVersion 200 response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetHomeVersionResponseContent"}}}},"400":{"description":"ValidationException 400 response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationExceptionResponseContent"}}}},"401":{"description":"UnauthorizedException 401 response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedExceptionResponseContent"}}}},"403":{"description":"AccessDeniedException 403 response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AccessDeniedExceptionResponseContent"}}}},"404":{"description":"ResourceNotFoundException 404 response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResourceNotFoundExceptionResponseContent"}}}},"429":{"description":"ThrottlingException 429 response","headers":{"Retry-After":{"schema":{"type":"number"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ThrottlingExceptionResponseContent"}}}},"500":{"description":"InternalServerException 500 response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerExceptionResponseContent"}}}}},"security":[{"ownsite":["home:read"]}]},"patch":{"description":"Sets a version aside (不要了) or restores it, and changes its note. The live version\ncannot be set aside.","operationId":"UpdateHomeVersion","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateHomeVersionRequestContent"}}}},"parameters":[{"name":"siteId","in":"path","description":"The site name. It is also part of its addresses (<siteId>.ownsite.me) and never changes.","schema":{"type":"string","maxLength":40,"minLength":1,"pattern":"^[a-z0-9](?:[a-z0-9-]{0,38}[a-z0-9])?$","description":"The site name. It is also part of its addresses (<siteId>.ownsite.me) and never changes."},"required":true},{"name":"versionId","in":"path","description":"Lowercase letters and digits, random, so a preview address cannot be guessed.","schema":{"type":"string","pattern":"^[a-z0-9]{8}$","description":"Lowercase letters and digits, random, so a preview address cannot be guessed."},"required":true},{"name":"page","in":"query","description":"Another page of the site (`<domain>/<page>`, from GetSite `pages`). Default: the\nhome page itself.","schema":{"type":"string","maxLength":30,"minLength":1,"pattern":"^[a-z0-9](?:[a-z0-9-]{0,28}[a-z0-9])?$","description":"Another page of the site (`<domain>/<page>`, from GetSite `pages`). Default: the\nhome page itself."}}],"responses":{"200":{"description":"UpdateHomeVersion 200 response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateHomeVersionResponseContent"}}}},"400":{"description":"ValidationException 400 response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationExceptionResponseContent"}}}},"401":{"description":"UnauthorizedException 401 response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedExceptionResponseContent"}}}},"403":{"description":"AccessDeniedException 403 response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AccessDeniedExceptionResponseContent"}}}},"404":{"description":"ResourceNotFoundException 404 response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResourceNotFoundExceptionResponseContent"}}}},"409":{"description":"ConflictException 409 response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictExceptionResponseContent"}}}},"429":{"description":"ThrottlingException 429 response","headers":{"Retry-After":{"schema":{"type":"number"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ThrottlingExceptionResponseContent"}}}},"500":{"description":"InternalServerException 500 response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerExceptionResponseContent"}}}}},"security":[{"ownsite":["home:write"]}]}},"/v1/sites/{siteId}/home/versions/{versionId}/files":{"get":{"description":"The files of a version's source, without their content.","operationId":"ListHomeVersionFiles","parameters":[{"name":"siteId","in":"path","description":"The site name. It is also part of its addresses (<siteId>.ownsite.me) and never changes.","schema":{"type":"string","maxLength":40,"minLength":1,"pattern":"^[a-z0-9](?:[a-z0-9-]{0,38}[a-z0-9])?$","description":"The site name. It is also part of its addresses (<siteId>.ownsite.me) and never changes."},"required":true},{"name":"versionId","in":"path","description":"Lowercase letters and digits, random, so a preview address cannot be guessed.","schema":{"type":"string","pattern":"^[a-z0-9]{8}$","description":"Lowercase letters and digits, random, so a preview address cannot be guessed."},"required":true},{"name":"page","in":"query","description":"Another page of the site (`<domain>/<page>`, from GetSite `pages`). Default: the\nhome page itself.","schema":{"type":"string","maxLength":30,"minLength":1,"pattern":"^[a-z0-9](?:[a-z0-9-]{0,28}[a-z0-9])?$","description":"Another page of the site (`<domain>/<page>`, from GetSite `pages`). Default: the\nhome page itself."}},{"name":"maxResults","in":"query","schema":{"type":"number","maximum":100,"minimum":1}},{"name":"nextToken","in":"query","schema":{"type":"string","maxLength":2048,"minLength":1}}],"responses":{"200":{"description":"ListHomeVersionFiles 200 response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListHomeVersionFilesResponseContent"}}}},"400":{"description":"ValidationException 400 response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationExceptionResponseContent"}}}},"401":{"description":"UnauthorizedException 401 response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedExceptionResponseContent"}}}},"403":{"description":"AccessDeniedException 403 response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AccessDeniedExceptionResponseContent"}}}},"404":{"description":"ResourceNotFoundException 404 response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResourceNotFoundExceptionResponseContent"}}}},"409":{"description":"ConflictException 409 response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictExceptionResponseContent"}}}},"429":{"description":"ThrottlingException 429 response","headers":{"Retry-After":{"schema":{"type":"number"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ThrottlingExceptionResponseContent"}}}},"500":{"description":"InternalServerException 500 response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerExceptionResponseContent"}}}}},"security":[{"ownsite":["home:read"]}]}},"/v1/sites/{siteId}/home/versions/{versionId}/files/{path+}":{"get":{"description":"One source file's text.","operationId":"GetHomeVersionFile","parameters":[{"name":"siteId","in":"path","description":"The site name. It is also part of its addresses (<siteId>.ownsite.me) and never changes.","schema":{"type":"string","maxLength":40,"minLength":1,"pattern":"^[a-z0-9](?:[a-z0-9-]{0,38}[a-z0-9])?$","description":"The site name. It is also part of its addresses (<siteId>.ownsite.me) and never changes."},"required":true},{"name":"versionId","in":"path","description":"Lowercase letters and digits, random, so a preview address cannot be guessed.","schema":{"type":"string","pattern":"^[a-z0-9]{8}$","description":"Lowercase letters and digits, random, so a preview address cannot be guessed."},"required":true},{"name":"path+","in":"path","schema":{"type":"string","maxLength":200,"minLength":1,"pattern":"^(index\\.html|src/[A-Za-z0-9._\\-/]+)$"},"required":true},{"name":"page","in":"query","description":"Another page of the site (`<domain>/<page>`, from GetSite `pages`). Default: the\nhome page itself.","schema":{"type":"string","maxLength":30,"minLength":1,"pattern":"^[a-z0-9](?:[a-z0-9-]{0,28}[a-z0-9])?$","description":"Another page of the site (`<domain>/<page>`, from GetSite `pages`). Default: the\nhome page itself."}}],"responses":{"200":{"description":"GetHomeVersionFile 200 response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetHomeVersionFileResponseContent"}}}},"400":{"description":"ValidationException 400 response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationExceptionResponseContent"}}}},"401":{"description":"UnauthorizedException 401 response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedExceptionResponseContent"}}}},"403":{"description":"AccessDeniedException 403 response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AccessDeniedExceptionResponseContent"}}}},"404":{"description":"ResourceNotFoundException 404 response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResourceNotFoundExceptionResponseContent"}}}},"409":{"description":"ConflictException 409 response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictExceptionResponseContent"}}}},"429":{"description":"ThrottlingException 429 response","headers":{"Retry-After":{"schema":{"type":"number"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ThrottlingExceptionResponseContent"}}}},"500":{"description":"InternalServerException 500 response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerExceptionResponseContent"}}}}},"security":[{"ownsite":["home:read"]}]}},"/v1/sites/{siteId}/home/versions/{versionId}/publish":{"post":{"description":"Puts a READY version on the home page's (or the page's) public addresses, worldwide within\nseconds. Rolling back is publishing an older version.","operationId":"PublishHomeVersion","parameters":[{"name":"siteId","in":"path","description":"The site name. It is also part of its addresses (<siteId>.ownsite.me) and never changes.","schema":{"type":"string","maxLength":40,"minLength":1,"pattern":"^[a-z0-9](?:[a-z0-9-]{0,38}[a-z0-9])?$","description":"The site name. It is also part of its addresses (<siteId>.ownsite.me) and never changes."},"required":true},{"name":"versionId","in":"path","description":"Lowercase letters and digits, random, so a preview address cannot be guessed.","schema":{"type":"string","pattern":"^[a-z0-9]{8}$","description":"Lowercase letters and digits, random, so a preview address cannot be guessed."},"required":true},{"name":"page","in":"query","description":"Another page of the site (`<domain>/<page>`, from GetSite `pages`). Default: the\nhome page itself.","schema":{"type":"string","maxLength":30,"minLength":1,"pattern":"^[a-z0-9](?:[a-z0-9-]{0,28}[a-z0-9])?$","description":"Another page of the site (`<domain>/<page>`, from GetSite `pages`). Default: the\nhome page itself."}},{"name":"If-Match","in":"header","description":"The ETag from GetHome: publish only if the live version is still that one.","schema":{"type":"string","description":"The ETag from GetHome: publish only if the live version is still that one."}}],"responses":{"200":{"description":"PublishHomeVersion 200 response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublishHomeVersionResponseContent"}}}},"400":{"description":"ValidationException 400 response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationExceptionResponseContent"}}}},"401":{"description":"UnauthorizedException 401 response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedExceptionResponseContent"}}}},"403":{"description":"AccessDeniedException 403 response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AccessDeniedExceptionResponseContent"}}}},"404":{"description":"ResourceNotFoundException 404 response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResourceNotFoundExceptionResponseContent"}}}},"409":{"description":"ConflictException 409 response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictExceptionResponseContent"}}}},"412":{"description":"PreconditionFailedException 412 response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedExceptionResponseContent"}}}},"429":{"description":"ThrottlingException 429 response","headers":{"Retry-After":{"schema":{"type":"number"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ThrottlingExceptionResponseContent"}}}},"500":{"description":"InternalServerException 500 response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerExceptionResponseContent"}}}}},"security":[{"ownsite":["home:publish"]}]}},"/v1/sites/{siteId}/pages":{"post":{"description":"Makes a new page `<domain>/<page>/` on the site. It is empty, and nothing shows at its\naddress, until a version of it is published: make one with CreateHomeVersion (`page`), then\nPublishHomeVersion. The name follows `PageName` and is never one the site itself uses\n(`blog`, `media`, `home`, `settings`, ...: ValidationException `PAGE_NAME_RESERVED`); a name\nthe site already has is a ConflictException `PAGE_EXISTS`. A page is never deleted.","operationId":"CreatePage","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreatePageRequestContent"}}},"required":true},"parameters":[{"name":"siteId","in":"path","description":"The site name. It is also part of its addresses (<siteId>.ownsite.me) and never changes.","schema":{"type":"string","maxLength":40,"minLength":1,"pattern":"^[a-z0-9](?:[a-z0-9-]{0,38}[a-z0-9])?$","description":"The site name. It is also part of its addresses (<siteId>.ownsite.me) and never changes."},"required":true}],"responses":{"200":{"description":"CreatePage 200 response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreatePageResponseContent"}}}},"400":{"description":"ValidationException 400 response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationExceptionResponseContent"}}}},"401":{"description":"UnauthorizedException 401 response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedExceptionResponseContent"}}}},"403":{"description":"AccessDeniedException 403 response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AccessDeniedExceptionResponseContent"}}}},"404":{"description":"ResourceNotFoundException 404 response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResourceNotFoundExceptionResponseContent"}}}},"409":{"description":"ConflictException 409 response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictExceptionResponseContent"}}}},"429":{"description":"ThrottlingException 429 response","headers":{"Retry-After":{"schema":{"type":"number"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ThrottlingExceptionResponseContent"}}}},"500":{"description":"InternalServerException 500 response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerExceptionResponseContent"}}}}},"security":[{"ownsite":["home:write"]}]}},"/v1/sites/{siteId}/post-images":{"post":{"description":"Gets a short-lived address to PUT one photo to (with the returned headers). Then point a\npost to `/media/<siteId>/<key>` (in the body) or set it as `cover`.","operationId":"CreatePostImageUpload","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreatePostImageUploadRequestContent"}}},"required":true},"parameters":[{"name":"siteId","in":"path","description":"The site name. It is also part of its addresses (<siteId>.ownsite.me) and never changes.","schema":{"type":"string","maxLength":40,"minLength":1,"pattern":"^[a-z0-9](?:[a-z0-9-]{0,38}[a-z0-9])?$","description":"The site name. It is also part of its addresses (<siteId>.ownsite.me) and never changes."},"required":true}],"responses":{"201":{"description":"CreatePostImageUpload 201 response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreatePostImageUploadResponseContent"}}}},"400":{"description":"ValidationException 400 response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationExceptionResponseContent"}}}},"401":{"description":"UnauthorizedException 401 response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedExceptionResponseContent"}}}},"403":{"description":"AccessDeniedException 403 response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AccessDeniedExceptionResponseContent"}}}},"404":{"description":"ResourceNotFoundException 404 response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResourceNotFoundExceptionResponseContent"}}}},"429":{"description":"ThrottlingException 429 response","headers":{"Retry-After":{"schema":{"type":"number"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ThrottlingExceptionResponseContent"}}}},"500":{"description":"InternalServerException 500 response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerExceptionResponseContent"}}}}},"security":[{"ownsite":["blog:write"]}]}},"/v1/sites/{siteId}/posts":{"get":{"operationId":"ListPosts","parameters":[{"name":"siteId","in":"path","description":"The site name. It is also part of its addresses (<siteId>.ownsite.me) and never changes.","schema":{"type":"string","maxLength":40,"minLength":1,"pattern":"^[a-z0-9](?:[a-z0-9-]{0,38}[a-z0-9])?$","description":"The site name. It is also part of its addresses (<siteId>.ownsite.me) and never changes."},"required":true},{"name":"status","in":"query","description":"Only posts in this state.","schema":{"$ref":"#/components/schemas/PostStatus"}},{"name":"maxResults","in":"query","schema":{"type":"number","maximum":100,"minimum":1}},{"name":"nextToken","in":"query","schema":{"type":"string","maxLength":2048,"minLength":1}}],"responses":{"200":{"description":"ListPosts 200 response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListPostsResponseContent"}}}},"400":{"description":"ValidationException 400 response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationExceptionResponseContent"}}}},"401":{"description":"UnauthorizedException 401 response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedExceptionResponseContent"}}}},"403":{"description":"AccessDeniedException 403 response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AccessDeniedExceptionResponseContent"}}}},"404":{"description":"ResourceNotFoundException 404 response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResourceNotFoundExceptionResponseContent"}}}},"429":{"description":"ThrottlingException 429 response","headers":{"Retry-After":{"schema":{"type":"number"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ThrottlingExceptionResponseContent"}}}},"500":{"description":"InternalServerException 500 response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerExceptionResponseContent"}}}}},"security":[{"ownsite":["blog:read"]}]},"post":{"description":"Writes a new post. It is always a DRAFT: publishing is PublishPost.","operationId":"CreatePost","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreatePostRequestContent"}}},"required":true},"parameters":[{"name":"siteId","in":"path","description":"The site name. It is also part of its addresses (<siteId>.ownsite.me) and never changes.","schema":{"type":"string","maxLength":40,"minLength":1,"pattern":"^[a-z0-9](?:[a-z0-9-]{0,38}[a-z0-9])?$","description":"The site name. It is also part of its addresses (<siteId>.ownsite.me) and never changes."},"required":true}],"responses":{"201":{"description":"CreatePost 201 response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreatePostResponseContent"}}}},"400":{"description":"ValidationException 400 response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationExceptionResponseContent"}}}},"401":{"description":"UnauthorizedException 401 response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedExceptionResponseContent"}}}},"403":{"description":"AccessDeniedException 403 response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AccessDeniedExceptionResponseContent"}}}},"404":{"description":"ResourceNotFoundException 404 response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResourceNotFoundExceptionResponseContent"}}}},"409":{"description":"ConflictException 409 response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictExceptionResponseContent"}}}},"429":{"description":"ThrottlingException 429 response","headers":{"Retry-After":{"schema":{"type":"number"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ThrottlingExceptionResponseContent"}}}},"500":{"description":"InternalServerException 500 response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerExceptionResponseContent"}}}}},"security":[{"ownsite":["blog:write"]}]}},"/v1/sites/{siteId}/posts/{slug}":{"get":{"operationId":"GetPost","parameters":[{"name":"siteId","in":"path","description":"The site name. It is also part of its addresses (<siteId>.ownsite.me) and never changes.","schema":{"type":"string","maxLength":40,"minLength":1,"pattern":"^[a-z0-9](?:[a-z0-9-]{0,38}[a-z0-9])?$","description":"The site name. It is also part of its addresses (<siteId>.ownsite.me) and never changes."},"required":true},{"name":"slug","in":"path","description":"Starts with a letter or digit (any language); no `/`, `?`, `#`, `%`, spaces or control\ncharacters; at most 80 characters.","schema":{"type":"string","maxLength":80,"minLength":1,"pattern":"^[\\p{L}\\p{N}][^/\\\\?#%\\s\\p{C}]{0,79}$","description":"Starts with a letter or digit (any language); no `/`, `?`, `#`, `%`, spaces or control\ncharacters; at most 80 characters."},"required":true}],"responses":{"200":{"description":"GetPost 200 response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetPostResponseContent"}}}},"400":{"description":"ValidationException 400 response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationExceptionResponseContent"}}}},"401":{"description":"UnauthorizedException 401 response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedExceptionResponseContent"}}}},"403":{"description":"AccessDeniedException 403 response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AccessDeniedExceptionResponseContent"}}}},"404":{"description":"ResourceNotFoundException 404 response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResourceNotFoundExceptionResponseContent"}}}},"429":{"description":"ThrottlingException 429 response","headers":{"Retry-After":{"schema":{"type":"number"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ThrottlingExceptionResponseContent"}}}},"500":{"description":"InternalServerException 500 response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerExceptionResponseContent"}}}}},"security":[{"ownsite":["blog:read"]}]},"patch":{"description":"Changes a post. Only the fields given change; its state (draft, published, private) stays.\nReaders see the change at once when the post is published.","operationId":"UpdatePost","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdatePostRequestContent"}}}},"parameters":[{"name":"siteId","in":"path","description":"The site name. It is also part of its addresses (<siteId>.ownsite.me) and never changes.","schema":{"type":"string","maxLength":40,"minLength":1,"pattern":"^[a-z0-9](?:[a-z0-9-]{0,38}[a-z0-9])?$","description":"The site name. It is also part of its addresses (<siteId>.ownsite.me) and never changes."},"required":true},{"name":"slug","in":"path","description":"Starts with a letter or digit (any language); no `/`, `?`, `#`, `%`, spaces or control\ncharacters; at most 80 characters.","schema":{"type":"string","maxLength":80,"minLength":1,"pattern":"^[\\p{L}\\p{N}][^/\\\\?#%\\s\\p{C}]{0,79}$","description":"Starts with a letter or digit (any language); no `/`, `?`, `#`, `%`, spaces or control\ncharacters; at most 80 characters."},"required":true},{"name":"If-Match","in":"header","description":"The post's `etag`: fails with 412 if someone saved it since.","schema":{"type":"string","description":"The post's `etag`: fails with 412 if someone saved it since."}}],"responses":{"200":{"description":"UpdatePost 200 response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdatePostResponseContent"}}}},"400":{"description":"ValidationException 400 response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationExceptionResponseContent"}}}},"401":{"description":"UnauthorizedException 401 response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedExceptionResponseContent"}}}},"403":{"description":"AccessDeniedException 403 response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AccessDeniedExceptionResponseContent"}}}},"404":{"description":"ResourceNotFoundException 404 response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResourceNotFoundExceptionResponseContent"}}}},"409":{"description":"ConflictException 409 response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictExceptionResponseContent"}}}},"412":{"description":"PreconditionFailedException 412 response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedExceptionResponseContent"}}}},"429":{"description":"ThrottlingException 429 response","headers":{"Retry-After":{"schema":{"type":"number"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ThrottlingExceptionResponseContent"}}}},"500":{"description":"InternalServerException 500 response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerExceptionResponseContent"}}}}},"security":[{"ownsite":["blog:write"]}]}},"/v1/sites/{siteId}/posts/{slug}/publish":{"post":{"description":"Makes a post public (PUBLISHED). Readers see it at once when the blog is public.","operationId":"PublishPost","parameters":[{"name":"siteId","in":"path","description":"The site name. It is also part of its addresses (<siteId>.ownsite.me) and never changes.","schema":{"type":"string","maxLength":40,"minLength":1,"pattern":"^[a-z0-9](?:[a-z0-9-]{0,38}[a-z0-9])?$","description":"The site name. It is also part of its addresses (<siteId>.ownsite.me) and never changes."},"required":true},{"name":"slug","in":"path","description":"Starts with a letter or digit (any language); no `/`, `?`, `#`, `%`, spaces or control\ncharacters; at most 80 characters.","schema":{"type":"string","maxLength":80,"minLength":1,"pattern":"^[\\p{L}\\p{N}][^/\\\\?#%\\s\\p{C}]{0,79}$","description":"Starts with a letter or digit (any language); no `/`, `?`, `#`, `%`, spaces or control\ncharacters; at most 80 characters."},"required":true}],"responses":{"200":{"description":"PublishPost 200 response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublishPostResponseContent"}}}},"400":{"description":"ValidationException 400 response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationExceptionResponseContent"}}}},"401":{"description":"UnauthorizedException 401 response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedExceptionResponseContent"}}}},"403":{"description":"AccessDeniedException 403 response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AccessDeniedExceptionResponseContent"}}}},"404":{"description":"ResourceNotFoundException 404 response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResourceNotFoundExceptionResponseContent"}}}},"429":{"description":"ThrottlingException 429 response","headers":{"Retry-After":{"schema":{"type":"number"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ThrottlingExceptionResponseContent"}}}},"500":{"description":"InternalServerException 500 response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerExceptionResponseContent"}}}}},"security":[{"ownsite":["blog:publish"]}]}},"/v1/sites/{siteId}/posts/{slug}/unpublish":{"post":{"description":"Takes a post off the blog (back to DRAFT). Nothing is lost.","operationId":"UnpublishPost","parameters":[{"name":"siteId","in":"path","description":"The site name. It is also part of its addresses (<siteId>.ownsite.me) and never changes.","schema":{"type":"string","maxLength":40,"minLength":1,"pattern":"^[a-z0-9](?:[a-z0-9-]{0,38}[a-z0-9])?$","description":"The site name. It is also part of its addresses (<siteId>.ownsite.me) and never changes."},"required":true},{"name":"slug","in":"path","description":"Starts with a letter or digit (any language); no `/`, `?`, `#`, `%`, spaces or control\ncharacters; at most 80 characters.","schema":{"type":"string","maxLength":80,"minLength":1,"pattern":"^[\\p{L}\\p{N}][^/\\\\?#%\\s\\p{C}]{0,79}$","description":"Starts with a letter or digit (any language); no `/`, `?`, `#`, `%`, spaces or control\ncharacters; at most 80 characters."},"required":true}],"responses":{"200":{"description":"UnpublishPost 200 response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnpublishPostResponseContent"}}}},"400":{"description":"ValidationException 400 response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationExceptionResponseContent"}}}},"401":{"description":"UnauthorizedException 401 response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedExceptionResponseContent"}}}},"403":{"description":"AccessDeniedException 403 response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AccessDeniedExceptionResponseContent"}}}},"404":{"description":"ResourceNotFoundException 404 response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResourceNotFoundExceptionResponseContent"}}}},"429":{"description":"ThrottlingException 429 response","headers":{"Retry-After":{"schema":{"type":"number"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ThrottlingExceptionResponseContent"}}}},"500":{"description":"InternalServerException 500 response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerExceptionResponseContent"}}}}},"security":[{"ownsite":["blog:publish"]}]}},"/v1/sites/{siteId}/uploads":{"post":{"description":"Returns an address to PUT the photo's bytes to (for example\n`curl -T photo.jpg -H 'Content-Type: image/jpeg' <uploadUrl>`), within 15 minutes.","operationId":"CreateUpload","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateUploadRequestContent"}}},"required":true},"parameters":[{"name":"siteId","in":"path","description":"The site name. It is also part of its addresses (<siteId>.ownsite.me) and never changes.","schema":{"type":"string","maxLength":40,"minLength":1,"pattern":"^[a-z0-9](?:[a-z0-9-]{0,38}[a-z0-9])?$","description":"The site name. It is also part of its addresses (<siteId>.ownsite.me) and never changes."},"required":true}],"responses":{"201":{"description":"CreateUpload 201 response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateUploadResponseContent"}}}},"400":{"description":"ValidationException 400 response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationExceptionResponseContent"}}}},"401":{"description":"UnauthorizedException 401 response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedExceptionResponseContent"}}}},"403":{"description":"AccessDeniedException 403 response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AccessDeniedExceptionResponseContent"}}}},"404":{"description":"ResourceNotFoundException 404 response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResourceNotFoundExceptionResponseContent"}}}},"429":{"description":"ThrottlingException 429 response","headers":{"Retry-After":{"schema":{"type":"number"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ThrottlingExceptionResponseContent"}}}},"500":{"description":"InternalServerException 500 response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerExceptionResponseContent"}}}}},"security":[{"ownsite":["home:write"]}]}}},"components":{"schemas":{"AccessDeniedExceptionResponseContent":{"type":"object","description":"The token does not have a scope the operation needs (`WWW-Authenticate` lists them), or the\nperson's AI setting for the site does not allow it (`reason`).","properties":{"message":{"type":"string"},"requiredScopes":{"type":"array","items":{"$ref":"#/components/schemas/Scope"}},"reason":{"type":"string","description":"Why, when it is not a scope: `AI_PERMISSION` (the person's AI setting for this site does\nnot allow it) or `APPROVAL_REQUIRED` (it changes what the public sees and the setting asks\nthe person first; the MCP tool makes an approval item for them)."}},"required":["message"]},"ActivityAction":{"type":"string","enum":["VERSION_CREATED","VERSION_HIDDEN","VERSION_RESTORED","HOME_PUBLISHED","HOME_UNPUBLISHED","PAGE_CREATED","EDIT_JOB_STARTED","EDIT_JOB_STOPPED","POST_CREATED","POST_UPDATED","POST_PUBLISHED","POST_UNPUBLISHED","BLOG_UPDATED","CATEGORIES_UPDATED","JOURNAL_ENTRY_CREATED","JOURNAL_ENTRY_UPDATED"]},"ActivityEvent":{"type":"object","description":"One change made to the site: who, when, what.","properties":{"at":{"type":"string","format":"date-time"},"actor":{"$ref":"#/components/schemas/Actor"},"action":{"$ref":"#/components/schemas/ActivityAction"},"page":{"type":"string","maxLength":30,"minLength":1,"pattern":"^[a-z0-9](?:[a-z0-9-]{0,28}[a-z0-9])?$","description":"The page, when the action is about a page other than the home page."},"versionId":{"type":"string","pattern":"^[a-z0-9]{8}$","description":"Lowercase letters and digits, random, so a preview address cannot be guessed."},"versionNumber":{"type":"number","description":"The version's number, when the action is about a version."},"slug":{"type":"string","maxLength":80,"minLength":1,"pattern":"^[\\p{L}\\p{N}][^/\\\\?#%\\s\\p{C}]{0,79}$","description":"The post, when the action is about a post."},"title":{"type":"string","description":"The post's title at the time."},"approvedBy":{"type":"string","description":"The person who approved this action of an AI (it needed their confirmation)."},"requestId":{"type":"string"}},"required":["action","actor","at","requestId"]},"Actor":{"type":"object","description":"Who did something.","properties":{"type":{"$ref":"#/components/schemas/ActorType"},"name":{"type":"string","description":"The person's sign-in name, \"Ownsite AI\", or the name of the app (for example\n\"Claude Code\") as the person saw it when they connected it."}},"required":["name","type"]},"ActorType":{"type":"string","enum":["PERSON","OWNSITE_AI","APP"]},"AiUsage":{"type":"object","description":"Ownsite's AI this month. Its cost counts against a monthly budget.","properties":{"month":{"type":"string","description":"YYYY-MM"},"spentUsd":{"type":"number","format":"double"},"limitUsd":{"type":"number","format":"double"}},"required":["limitUsd","month","spentUsd"]},"BlogTheme":{"type":"string","description":"The blog's looks.","enum":["paper","magazine","minimal"]},"BuildFailure":{"type":"object","properties":{"message":{"type":"string"},"log":{"type":"string","description":"The build output, shortened."}},"required":["message"]},"Category":{"type":"object","properties":{"id":{"type":"string","maxLength":40,"minLength":1},"name":{"type":"string"},"parentId":{"type":"string","maxLength":40,"minLength":1,"description":"A sub-category's parent."}},"required":["id","name"]},"Change":{"description":"One change to the source. Paths are `index.html` or under `src/`.","oneOf":[{"type":"object","title":"edit","properties":{"edit":{"$ref":"#/components/schemas/EditChange"}},"required":["edit"]},{"type":"object","title":"write","properties":{"write":{"$ref":"#/components/schemas/WriteChange"}},"required":["write"]},{"type":"object","title":"delete","properties":{"delete":{"$ref":"#/components/schemas/DeleteChange"}},"required":["delete"]}]},"ConflictExceptionReason":{"type":"string","enum":["EDIT_IN_PROGRESS","VERSION_NOT_READY","VERSION_NOT_EDITABLE","VERSION_IS_LIVE","NO_ADDRESS","NO_VERSION","POST_EXISTS","PAGE_EXISTS","IDEMPOTENCY_MISMATCH","IDEMPOTENT_REQUEST_IN_PROGRESS"]},"ConflictExceptionResponseContent":{"type":"object","description":"The request conflicts with the current state. `reason` says how.","properties":{"message":{"type":"string"},"reason":{"$ref":"#/components/schemas/ConflictExceptionReason"}},"required":["message","reason"]},"CreateHomeVersionRequestContent":{"type":"object","properties":{"baseVersionId":{"type":"string","pattern":"^[a-z0-9]{8}$","description":"Lowercase letters and digits, random, so a preview address cannot be guessed."},"templateId":{"type":"string","pattern":"^[a-z][a-z0-9-]{0,30}$","description":"Start from this template (ListHomeTemplates) instead of a version."},"changes":{"type":"array","items":{"$ref":"#/components/schemas/Change"},"maxItems":50,"description":"At least one change, unless `templateId` is given."},"uploads":{"type":"array","items":{"type":"string","pattern":"^[a-z0-9]{12}$"},"maxItems":10,"description":"Photos to add, from CreateUpload. Each is at `/images/<uploadId>.<ext>` in the\nnew version, so the changes can already point to it."},"note":{"type":"string","maxLength":300},"clientToken":{"type":"string","maxLength":64,"minLength":1,"pattern":"^[A-Za-z0-9_-]+$","description":"A unique string from the caller (a UUID works), so a retry does not do the work twice."}}},"CreateHomeVersionResponseContent":{"type":"object","properties":{"version":{"$ref":"#/components/schemas/HomeVersionDescription"}},"required":["version"]},"CreatePageRequestContent":{"type":"object","properties":{"page":{"type":"string","maxLength":30,"minLength":1,"pattern":"^[a-z0-9](?:[a-z0-9-]{0,28}[a-z0-9])?$","description":"The page's name, part of its address: lowercase letters, digits and `-`."},"label":{"type":"string","maxLength":40,"minLength":1,"description":"How the person names it in their app, e.g. \"Drum\". Optional."},"clientToken":{"type":"string","maxLength":64,"minLength":1,"pattern":"^[A-Za-z0-9_-]+$","description":"A unique string from the caller (a UUID works), so a retry does not do the work twice."}},"required":["page"]},"CreatePageResponseContent":{"type":"object","properties":{"page":{"$ref":"#/components/schemas/PageSummary"}},"required":["page"]},"CreatePostImageUploadRequestContent":{"type":"object","properties":{"contentType":{"$ref":"#/components/schemas/ImageType"},"size":{"type":"number","maximum":4194304,"minimum":1,"description":"Bytes; at most 4 MB."}},"required":["contentType","size"]},"CreatePostImageUploadResponseContent":{"type":"object","properties":{"key":{"type":"string","maxLength":160,"minLength":1,"pattern":"^[\\p{L}\\p{N}][^/\\\\?#%\\s\\p{C}]{0,79}/[a-z0-9][a-z0-9.-]{0,60}\\.(jpg|jpeg|png|webp|gif)$","description":"A photo of this site's blog, at `/media/<siteId>/<key>`. New photos come from\nCreatePostImageUpload (`u/...`)."},"path":{"type":"string","description":"What to write in the post: `/media/<siteId>/<key>`."},"uploadUrl":{"type":"string","description":"An https address."},"uploadHeaders":{"$ref":"#/components/schemas/HeaderMap"},"expiresAt":{"type":"string","format":"date-time"}},"required":["expiresAt","key","path","uploadHeaders","uploadUrl"]},"CreatePostRequestContent":{"type":"object","properties":{"slug":{"type":"string","maxLength":80,"minLength":1,"pattern":"^[\\p{L}\\p{N}][^/\\\\?#%\\s\\p{C}]{0,79}$","description":"Default: made from the title."},"title":{"type":"string","maxLength":200,"minLength":1},"body":{"type":"string","maxLength":200000,"description":"Markdown."},"date":{"type":"string","description":"Default: now.","format":"date-time"},"categories":{"type":"array","items":{"type":"string","maxLength":40,"minLength":1},"maxItems":10,"description":"Ids from GetBlog."},"cover":{"type":"string","maxLength":160,"minLength":1,"pattern":"^[\\p{L}\\p{N}][^/\\\\?#%\\s\\p{C}]{0,79}/[a-z0-9][a-z0-9.-]{0,60}\\.(jpg|jpeg|png|webp|gif)$","description":"A photo of this site's blog, at `/media/<siteId>/<key>`. New photos come from\nCreatePostImageUpload (`u/...`)."},"clientToken":{"type":"string","maxLength":64,"minLength":1,"pattern":"^[A-Za-z0-9_-]+$","description":"A unique string from the caller (a UUID works), so a retry does not do the work twice."}},"required":["body","title"]},"CreatePostResponseContent":{"type":"object","properties":{"post":{"$ref":"#/components/schemas/PostDescription"}},"required":["post"]},"CreateUploadRequestContent":{"type":"object","properties":{"contentType":{"$ref":"#/components/schemas/ImageType"},"size":{"type":"number","maximum":10485760,"minimum":1,"description":"Bytes."}},"required":["contentType","size"]},"CreateUploadResponseContent":{"type":"object","properties":{"uploadId":{"type":"string","pattern":"^[a-z0-9]{12}$"},"path":{"type":"string","description":"Where the photo will be in a version: /images/<uploadId>.<ext>."},"uploadUrl":{"type":"string","description":"An https address."},"uploadHeaders":{"$ref":"#/components/schemas/HeaderMap"},"expiresAt":{"type":"string","format":"date-time"}},"required":["expiresAt","path","uploadHeaders","uploadId","uploadUrl"]},"DeleteChange":{"type":"object","properties":{"path":{"type":"string","maxLength":200,"minLength":1,"pattern":"^(index\\.html|src/[A-Za-z0-9._\\-/]+)$"}},"required":["path"]},"EditChange":{"type":"object","properties":{"path":{"type":"string","maxLength":200,"minLength":1,"pattern":"^(index\\.html|src/[A-Za-z0-9._\\-/]+)$"},"oldText":{"type":"string","maxLength":200000,"minLength":1},"newText":{"type":"string","maxLength":200000}},"required":["newText","oldText","path"]},"FileKind":{"type":"string","enum":["SOURCE","PUBLIC"]},"FileSummary":{"type":"object","properties":{"path":{"type":"string"},"kind":{"$ref":"#/components/schemas/FileKind"},"size":{"type":"number","description":"Bytes, for SOURCE files."}},"required":["kind","path"]},"GetBlogResponseContent":{"type":"object","properties":{"siteId":{"type":"string","maxLength":40,"minLength":1,"pattern":"^[a-z0-9](?:[a-z0-9-]{0,38}[a-z0-9])?$","description":"The site name. It is also part of its addresses (<siteId>.ownsite.me) and never changes."},"title":{"type":"string"},"tagline":{"type":"string"},"language":{"type":"string","description":"Its language, for example `zh-CN` or `en`. Write in it."},"isPublic":{"type":"boolean","description":"True when readers can open the blog. Published posts of a blog that is not public\nare only visible to the person (in the preview)."},"address":{"type":"string","description":"Where readers find it."},"previewAddress":{"type":"string","description":"Where the person sees it (drafts included) while signed in."},"categories":{"type":"array","items":{"$ref":"#/components/schemas/Category"},"description":"The categories a post can be in, by id."},"theme":{"$ref":"#/components/schemas/BlogTheme"}},"required":["address","categories","isPublic","language","siteId","title"]},"GetHomeEditJobResponseContent":{"type":"object","properties":{"job":{"$ref":"#/components/schemas/HomeEditJobDescription"}},"required":["job"]},"GetHomeResponseContent":{"type":"object","properties":{"siteId":{"type":"string","maxLength":40,"minLength":1,"pattern":"^[a-z0-9](?:[a-z0-9-]{0,38}[a-z0-9])?$","description":"The site name. It is also part of its addresses (<siteId>.ownsite.me) and never changes."},"page":{"type":"string","maxLength":30,"minLength":1,"pattern":"^[a-z0-9](?:[a-z0-9-]{0,28}[a-z0-9])?$","description":"The page, when one was asked for."},"addresses":{"type":"array","items":{"type":"string","description":"An https address."},"description":"Its public addresses: `https://<domain>/` for the home page, `https://<domain>/<page>/`\nfor another page. Empty while the site has none."},"isPublic":{"type":"boolean"},"liveVersionId":{"type":"string","pattern":"^[a-z0-9]{8}$","description":"The version on the public addresses."},"liveSince":{"type":"string","format":"date-time"},"workingVersionId":{"type":"string","pattern":"^[a-z0-9]{8}$","description":"The version the next change starts from by default: the newest draft the person\nis working on, else the live one."},"activeEditJobId":{"type":"string","pattern":"^[a-z0-9]{12}$","description":"The edit job of Ownsite's AI that is running now, if any. Only one runs at a time."},"aiUsage":{"$ref":"#/components/schemas/AiUsage"}},"required":["addresses","aiUsage","isPublic","siteId"]},"GetHomeVersionFileResponseContent":{"type":"object","properties":{"path":{"type":"string","maxLength":200,"minLength":1,"pattern":"^(index\\.html|src/[A-Za-z0-9._\\-/]+)$"},"content":{"type":"string"}},"required":["content","path"]},"GetHomeVersionResponseContent":{"type":"object","properties":{"version":{"$ref":"#/components/schemas/HomeVersionDescription"}},"required":["version"]},"GetManualArticleResponseContent":{"type":"object","properties":{"articleId":{"type":"string","maxLength":50,"minLength":1,"pattern":"^[a-z0-9](?:[a-z0-9-]{0,48}[a-z0-9])?$"},"title":{"type":"string"},"section":{"$ref":"#/components/schemas/ManualSection"},"appPath":{"type":"string","description":"Where in the app the article is about, e.g. `/settings/address` (a path on app.<domain>)."},"body":{"type":"string","description":"The article, in Markdown."}},"required":["articleId","body","section","title"]},"GetPostResponseContent":{"type":"object","properties":{"post":{"$ref":"#/components/schemas/PostDescription"}},"required":["post"]},"GetSiteResponseContent":{"type":"object","properties":{"siteId":{"type":"string","maxLength":40,"minLength":1,"pattern":"^[a-z0-9](?:[a-z0-9-]{0,38}[a-z0-9])?$","description":"The site name. It is also part of its addresses (<siteId>.ownsite.me) and never changes."},"title":{"type":"string"},"scopes":{"type":"array","items":{"$ref":"#/components/schemas/Scope"},"description":"The scopes this token has on the site."},"home":{"$ref":"#/components/schemas/HomeSummary"},"pages":{"type":"array","items":{"$ref":"#/components/schemas/PageSummary"},"description":"The site's other pages (`<domain>/<page>/`). Absent when it has none."}},"required":["home","scopes","siteId","title"]},"HeaderMap":{"type":"object","additionalProperties":{"type":"string"},"propertyNames":{"type":"string"}},"HomeEditJobDescription":{"type":"object","properties":{"jobId":{"type":"string","pattern":"^[a-z0-9]{12}$"},"status":{"$ref":"#/components/schemas/HomeEditJobStatus"},"instruction":{"type":"string"},"baseVersionId":{"type":"string","pattern":"^[a-z0-9]{8}$","description":"Lowercase letters and digits, random, so a preview address cannot be guessed."},"reply":{"type":"string","description":"The AI's answer, once it is finished."},"versionId":{"type":"string","pattern":"^[a-z0-9]{8}$","description":"The version it made, when it changed something."},"steps":{"type":"array","items":{"type":"string"},"description":"What it is doing, in order."},"costUsd":{"type":"number","format":"double"},"createdBy":{"$ref":"#/components/schemas/Actor"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}},"required":["costUsd","createdAt","createdBy","instruction","jobId","status","steps","updatedAt"]},"HomeEditJobStatus":{"type":"string","enum":["QUEUED","RUNNING","STOPPING","SUCCEEDED","ANSWERED","FAILED","STOPPED","QUOTA_EXCEEDED"]},"HomeSummary":{"type":"object","properties":{"isPublic":{"type":"boolean","description":"True when the home page is on its public address."},"liveVersionId":{"type":"string","pattern":"^[a-z0-9]{8}$","description":"Lowercase letters and digits, random, so a preview address cannot be guessed."}},"required":["isPublic"]},"HomeTemplate":{"type":"object","properties":{"templateId":{"type":"string","pattern":"^[a-z][a-z0-9-]{0,30}$"},"name":{"type":"string","description":"Its short name, in the site's language."},"description":{"type":"string","description":"What it looks like, in a few words."}},"required":["description","name","templateId"]},"HomeVersionDescription":{"type":"object","properties":{"siteId":{"type":"string","maxLength":40,"minLength":1,"pattern":"^[a-z0-9](?:[a-z0-9-]{0,38}[a-z0-9])?$","description":"The site name. It is also part of its addresses (<siteId>.ownsite.me) and never changes."},"page":{"type":"string","maxLength":30,"minLength":1,"pattern":"^[a-z0-9](?:[a-z0-9-]{0,28}[a-z0-9])?$","description":"The page this version is of; absent for the home page."},"versionId":{"type":"string","pattern":"^[a-z0-9]{8}$","description":"Lowercase letters and digits, random, so a preview address cannot be guessed."},"status":{"$ref":"#/components/schemas/HomeVersionStatus"},"number":{"type":"number","description":"1, 2, 3... in the order versions became READY. Absent until then."},"baseVersionId":{"type":"string","pattern":"^[a-z0-9]{8}$","description":"The version it was made from."},"note":{"type":"string","description":"What changed, in a few words."},"createdBy":{"$ref":"#/components/schemas/Actor"},"createdAt":{"type":"string","format":"date-time"},"isLive":{"type":"boolean","description":"True when this version is on the public addresses."},"hidden":{"type":"boolean","description":"True when the person set it aside (不要了). It is kept and can be restored."},"editable":{"type":"boolean","description":"False for the first uploads, which kept only the built page: such a version can be\npreviewed and published, but not changed."},"previewUrl":{"type":"string","description":"Its own address. Unlisted (not indexed by search engines), but anyone with the link\ncan open it."},"screenshots":{"$ref":"#/components/schemas/Screenshots"},"failure":{"$ref":"#/components/schemas/BuildFailure"}},"required":["createdAt","createdBy","editable","hidden","isLive","siteId","status","versionId"]},"HomeVersionStatus":{"type":"string","enum":["BUILDING","READY","FAILED"]},"ImageType":{"type":"string","enum":["image/jpeg","image/png","image/webp","image/gif"]},"InternalServerExceptionResponseContent":{"type":"object","description":"Something failed on Ownsite's side. Safe to retry.","properties":{"message":{"type":"string"}},"required":["message"]},"ListHomeTemplatesResponseContent":{"type":"object","properties":{"templates":{"type":"array","items":{"$ref":"#/components/schemas/HomeTemplate"}}},"required":["templates"]},"ListHomeVersionFilesResponseContent":{"type":"object","properties":{"files":{"type":"array","items":{"$ref":"#/components/schemas/FileSummary"},"description":"The source files (index.html, src/...), then the files the site serves as they\nare (photos, icons): `kind` tells them apart."},"nextToken":{"type":"string","maxLength":2048,"minLength":1}},"required":["files"]},"ListHomeVersionsResponseContent":{"type":"object","properties":{"versions":{"type":"array","items":{"$ref":"#/components/schemas/HomeVersionDescription"}},"nextToken":{"type":"string","maxLength":2048,"minLength":1}},"required":["versions"]},"ListManualArticlesResponseContent":{"type":"object","properties":{"articles":{"type":"array","items":{"$ref":"#/components/schemas/ManualArticleSummary"}},"nextToken":{"type":"string","maxLength":2048,"minLength":1}},"required":["articles"]},"ListPostsResponseContent":{"type":"object","properties":{"posts":{"type":"array","items":{"$ref":"#/components/schemas/PostSummary"},"description":"Newest date first."},"nextToken":{"type":"string","maxLength":2048,"minLength":1}},"required":["posts"]},"ListSiteActivityResponseContent":{"type":"object","properties":{"events":{"type":"array","items":{"$ref":"#/components/schemas/ActivityEvent"},"description":"Newest first."},"nextToken":{"type":"string","maxLength":2048,"minLength":1}},"required":["events"]},"ListSitesResponseContent":{"type":"object","properties":{"sites":{"type":"array","items":{"$ref":"#/components/schemas/SiteSummary"},"description":"The sites this token may use (one for a token from auth.ownsite.me)."},"nextToken":{"type":"string","maxLength":2048,"minLength":1}},"required":["sites"]},"ManualArticleSummary":{"type":"object","properties":{"articleId":{"type":"string","maxLength":50,"minLength":1,"pattern":"^[a-z0-9](?:[a-z0-9-]{0,48}[a-z0-9])?$"},"title":{"type":"string"},"section":{"$ref":"#/components/schemas/ManualSection"},"snippet":{"type":"string","description":"The line of the article that best matches the query (or its first line)."}},"required":["articleId","section","snippet","title"]},"ManualSection":{"type":"string","description":"Which part of the app an article is about.","enum":["start","home","blog","pages","journal","addresses","visitors","account","ai","mcp"]},"PageSummary":{"type":"object","properties":{"page":{"type":"string","maxLength":30,"minLength":1,"pattern":"^[a-z0-9](?:[a-z0-9-]{0,28}[a-z0-9])?$","description":"A page of a site other than its home page, served at `<domain>/<page>/` (e.g. `drum`).\nNever `blog`, `media` or another name the site itself uses."},"label":{"type":"string","maxLength":40,"minLength":1,"description":"How the person names the page in their app (e.g. \"Drum\"). Absent when they gave none."},"isPublic":{"type":"boolean","description":"True when the page is on its public address."},"liveVersionId":{"type":"string","pattern":"^[a-z0-9]{8}$","description":"Lowercase letters and digits, random, so a preview address cannot be guessed."},"addresses":{"type":"array","items":{"type":"string","description":"An https address."}}},"required":["addresses","isPublic","page"]},"PostDescription":{"type":"object","description":"A whole post.","properties":{"slug":{"type":"string","maxLength":80,"minLength":1,"pattern":"^[\\p{L}\\p{N}][^/\\\\?#%\\s\\p{C}]{0,79}$","description":"Starts with a letter or digit (any language); no `/`, `?`, `#`, `%`, spaces or control\ncharacters; at most 80 characters."},"title":{"type":"string"},"body":{"type":"string","description":"Markdown. Photos are `![](/media/<siteId>/u/...)`."},"status":{"$ref":"#/components/schemas/PostStatus"},"date":{"type":"string","format":"date-time"},"categories":{"type":"array","items":{"type":"string","maxLength":40,"minLength":1},"maxItems":10},"cover":{"type":"string","maxLength":160,"minLength":1,"pattern":"^[\\p{L}\\p{N}][^/\\\\?#%\\s\\p{C}]{0,79}/[a-z0-9][a-z0-9.-]{0,60}\\.(jpg|jpeg|png|webp|gif)$","description":"A photo of this site's blog, at `/media/<siteId>/<key>`. New photos come from\nCreatePostImageUpload (`u/...`)."},"isSample":{"type":"boolean"},"url":{"type":"string","description":"Where readers open it (when PUBLISHED and the blog is public)."},"previewUrl":{"type":"string","description":"Where the person opens it before it is public."},"updatedAt":{"type":"string","format":"date-time"},"updatedBy":{"type":"string","description":"Who saved it last."},"etag":{"type":"string","description":"Pass it as `If-Match` to UpdatePost so a newer save is not overwritten."}},"required":["body","categories","date","etag","isSample","slug","status","title","url"]},"PostStatus":{"type":"string","enum":["DRAFT","PUBLISHED","PRIVATE"]},"PostSummary":{"type":"object","properties":{"slug":{"type":"string","maxLength":80,"minLength":1,"pattern":"^[\\p{L}\\p{N}][^/\\\\?#%\\s\\p{C}]{0,79}$","description":"Starts with a letter or digit (any language); no `/`, `?`, `#`, `%`, spaces or control\ncharacters; at most 80 characters."},"title":{"type":"string"},"status":{"$ref":"#/components/schemas/PostStatus"},"date":{"type":"string","description":"The date shown on the post.","format":"date-time"},"categories":{"type":"array","items":{"type":"string","maxLength":40,"minLength":1},"maxItems":10},"cover":{"type":"string","maxLength":160,"minLength":1,"pattern":"^[\\p{L}\\p{N}][^/\\\\?#%\\s\\p{C}]{0,79}/[a-z0-9][a-z0-9.-]{0,60}\\.(jpg|jpeg|png|webp|gif)$","description":"A photo of this site's blog, at `/media/<siteId>/<key>`. New photos come from\nCreatePostImageUpload (`u/...`)."},"isSample":{"type":"boolean","description":"A sample post every new blog starts with (to show the look); the person removes it."},"updatedAt":{"type":"string","format":"date-time"}},"required":["categories","date","isSample","slug","status","title"]},"PreconditionFailedExceptionResponseContent":{"type":"object","description":"`If-Match` does not match: someone published another version meanwhile.","properties":{"message":{"type":"string"}},"required":["message"]},"PublishHomeVersionResponseContent":{"type":"object","properties":{"liveVersionId":{"type":"string","pattern":"^[a-z0-9]{8}$","description":"Lowercase letters and digits, random, so a preview address cannot be guessed."},"addresses":{"type":"array","items":{"type":"string","description":"An https address."}},"liveSince":{"type":"string","format":"date-time"}},"required":["addresses","liveSince","liveVersionId"]},"PublishPostResponseContent":{"type":"object","properties":{"post":{"$ref":"#/components/schemas/PostDescription"}},"required":["post"]},"ResourceNotFoundExceptionResponseContent":{"type":"object","description":"It does not exist, or this token cannot see it.","properties":{"message":{"type":"string"},"resourceType":{"type":"string"},"resourceId":{"type":"string"}},"required":["message"]},"Scope":{"type":"string","enum":["home:read","home:write","home:publish","blog:read","blog:write","blog:publish"]},"Screenshots":{"type":"object","properties":{"desktop":{"type":"string","description":"1280 pixels wide, the first screen."},"mobile":{"type":"string","description":"390 pixels wide, the first screen."}},"required":["desktop","mobile"]},"ServiceQuotaExceededExceptionResponseContent":{"type":"object","description":"The month's budget for Ownsite's AI is used up.","properties":{"message":{"type":"string"}},"required":["message"]},"SiteSummary":{"type":"object","properties":{"siteId":{"type":"string","maxLength":40,"minLength":1,"pattern":"^[a-z0-9](?:[a-z0-9-]{0,38}[a-z0-9])?$","description":"The site name. It is also part of its addresses (<siteId>.ownsite.me) and never changes."},"title":{"type":"string"}},"required":["siteId","title"]},"StartHomeEditJobRequestContent":{"type":"object","properties":{"instruction":{"type":"string","maxLength":2000,"minLength":1,"description":"What to change, as the person would say it."},"uploads":{"type":"array","items":{"type":"string","pattern":"^[a-z0-9]{12}$"},"maxItems":4,"description":"Photos from CreateUpload to use."},"baseVersionId":{"type":"string","pattern":"^[a-z0-9]{8}$","description":"Default: the working version."},"clientToken":{"type":"string","maxLength":64,"minLength":1,"pattern":"^[A-Za-z0-9_-]+$","description":"A unique string from the caller (a UUID works), so a retry does not do the work twice."}},"required":["instruction"]},"StartHomeEditJobResponseContent":{"type":"object","properties":{"job":{"$ref":"#/components/schemas/HomeEditJobDescription"}},"required":["job"]},"StopHomeEditJobResponseContent":{"type":"object","properties":{"job":{"$ref":"#/components/schemas/HomeEditJobDescription"}},"required":["job"]},"ThrottlingExceptionResponseContent":{"type":"object","description":"Too many requests. Wait `Retry-After` seconds.","properties":{"message":{"type":"string"}},"required":["message"]},"UnauthorizedExceptionResponseContent":{"type":"object","description":"No token, or the token is not valid, has expired or was revoked. The response has a\n`WWW-Authenticate` header that says where to get a token.","properties":{"message":{"type":"string"}},"required":["message"]},"UnpublishHomeResponseContent":{"type":"object","properties":{"isPublic":{"type":"boolean"}},"required":["isPublic"]},"UnpublishPostResponseContent":{"type":"object","properties":{"post":{"$ref":"#/components/schemas/PostDescription"}},"required":["post"]},"UpdateBlogRequestContent":{"type":"object","properties":{"title":{"type":"string","maxLength":80,"minLength":1},"tagline":{"type":"string","maxLength":140},"theme":{"$ref":"#/components/schemas/BlogTheme"}}},"UpdateBlogResponseContent":{"type":"object","properties":{"siteId":{"type":"string","maxLength":40,"minLength":1,"pattern":"^[a-z0-9](?:[a-z0-9-]{0,38}[a-z0-9])?$","description":"The site name. It is also part of its addresses (<siteId>.ownsite.me) and never changes."},"title":{"type":"string"},"tagline":{"type":"string"},"theme":{"$ref":"#/components/schemas/BlogTheme"}},"required":["siteId","title"]},"UpdateHomeVersionRequestContent":{"type":"object","properties":{"hidden":{"type":"boolean"},"note":{"type":"string","maxLength":300}}},"UpdateHomeVersionResponseContent":{"type":"object","properties":{"version":{"$ref":"#/components/schemas/HomeVersionDescription"}},"required":["version"]},"UpdatePostRequestContent":{"type":"object","properties":{"title":{"type":"string","maxLength":200,"minLength":1},"body":{"type":"string","maxLength":200000},"date":{"type":"string","format":"date-time"},"categories":{"type":"array","items":{"type":"string","maxLength":40,"minLength":1},"maxItems":10},"cover":{"type":"string","maxLength":160,"minLength":1,"pattern":"^[\\p{L}\\p{N}][^/\\\\?#%\\s\\p{C}]{0,79}/[a-z0-9][a-z0-9.-]{0,60}\\.(jpg|jpeg|png|webp|gif)$","description":"A photo of this site's blog, at `/media/<siteId>/<key>`. New photos come from\nCreatePostImageUpload (`u/...`)."}}},"UpdatePostResponseContent":{"type":"object","properties":{"post":{"$ref":"#/components/schemas/PostDescription"}},"required":["post"]},"ValidationExceptionField":{"type":"object","properties":{"path":{"type":"string","description":"A JSON pointer into the input, for example `/changes/2/edit/oldText`."},"message":{"type":"string"}},"required":["message","path"]},"ValidationExceptionReason":{"type":"string","enum":["FIELD_VALIDATION_FAILED","CHANGE_NOT_APPLICABLE","MISSING_FILE","EXTERNAL_CODE","NO_CHANGE","UPLOAD_NOT_FOUND","PAGE_NAME_RESERVED","OTHER"]},"ValidationExceptionResponseContent":{"type":"object","description":"The input is not valid. `fieldList` says which parts and why.","properties":{"message":{"type":"string"},"reason":{"$ref":"#/components/schemas/ValidationExceptionReason"},"fieldList":{"type":"array","items":{"$ref":"#/components/schemas/ValidationExceptionField"}}},"required":["message","reason"]},"WriteChange":{"type":"object","properties":{"path":{"type":"string","maxLength":200,"minLength":1,"pattern":"^(index\\.html|src/[A-Za-z0-9._\\-/]+)$"},"content":{"type":"string","maxLength":200000}},"required":["content","path"]}},"securitySchemes":{"ownsite":{"type":"oauth2","description":"OAuth 2.1 authorization code with PKCE. Discovery: https://auth.ownsite.me/.well-known/oauth-authorization-server.","flows":{"authorizationCode":{"authorizationUrl":"https://auth.ownsite.me/oauth/authorize","tokenUrl":"https://auth.ownsite.me/oauth/token","refreshUrl":"https://auth.ownsite.me/oauth/token","scopes":{"blog:publish":"blog:publish","blog:read":"blog:read","blog:write":"blog:write","home:publish":"Publish a version or take the home page offline","home:read":"See the home page, its versions and their source","home:write":"Make new versions (drafts) and use Ownsite AI"}}}}}},"security":[{"ownsite":[]}],"servers":[{"url":"https://api.ownsite.me"}]}