{
  "openapi": "3.1.0",
  "info": {
    "title": "FOLK (folk.lol) public web API",
    "version": "1.0.0",
    "summary": "The public, machine-readable surface of folk.lol - the weird indie sandbox MMORPG.",
    "description": "Every endpoint here is public, unauthenticated and safe to poll. The game-data collections\nunder /api/v1/meta/* are admin-gated and deliberately absent.\n\nContent negotiation: the pages /, /about, /apps, /wtf, /news, /news/requiem-for-the-nft, /developers are also served as\n`text/markdown` to clients that send `Accept: text/markdown`, or that append `.md` to the path\n(`/index.md` for the home page). Responses carry `Vary: Accept`. See https://acceptmarkdown.com.",
    "contact": {
      "name": "Folk Software",
      "email": "contact@folk.lol",
      "url": "https://folk.lol/developers"
    },
    "termsOfService": "https://folk.lol/terms"
  },
  "externalDocs": {
    "description": "FOLK developer resources",
    "url": "https://folk.lol/developers"
  },
  "servers": [
    {
      "url": "https://folk.lol",
      "description": "Production"
    }
  ],
  "tags": [
    {
      "name": "Agents",
      "description": "Maps of the site, for crawlers and agents."
    },
    {
      "name": "Identity",
      "description": "AT Protocol and standard.site records."
    },
    {
      "name": "App",
      "description": "Endpoints the shipped clients use."
    }
  ],
  "paths": {
    "/llms.txt": {
      "get": {
        "summary": "Get the plain-text site digest for LLM crawlers",
        "description": "What FOLK is, what it costs, where it runs, and every public page - stated directly instead of inferred from marketing copy.",
        "operationId": "llms_txt",
        "tags": [
          "Agents"
        ],
        "responses": {
          "200": {
            "description": "Get the plain-text site digest for LLM crawlers",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "404": {
            "description": "No such resource."
          }
        }
      }
    },
    "/sitemap.xml": {
      "get": {
        "summary": "Get every indexable URL",
        "description": "Standard sitemap. Includes the changelog permalinks, whose lastmod is the post's own date.",
        "operationId": "sitemap_xml",
        "tags": [
          "Agents"
        ],
        "responses": {
          "200": {
            "description": "Get every indexable URL",
            "content": {
              "application/xml": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "404": {
            "description": "No such resource."
          }
        }
      }
    },
    "/robots.txt": {
      "get": {
        "summary": "Get the crawl policy",
        "description": "Public content pages are open; the game, authoring tools, auth flows and API are not.",
        "operationId": "robots_txt",
        "tags": [
          "Agents"
        ],
        "responses": {
          "200": {
            "description": "Get the crawl policy",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "404": {
            "description": "No such resource."
          }
        }
      }
    },
    "/openapi.json": {
      "get": {
        "summary": "Get this document",
        "description": "OpenAPI 3.1 description of every endpoint on this page.",
        "operationId": "openapi_json",
        "tags": [
          "Agents"
        ],
        "responses": {
          "200": {
            "description": "Get this document",
            "content": {
              "application/json": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "404": {
            "description": "No such resource."
          }
        }
      }
    },
    "/.well-known/site.standard.publication": {
      "get": {
        "summary": "Get the standard.site publication AT-URI",
        "description": "Verification endpoint for our site.standard.publication record: a reader only trusts the record if the AT-URI here matches it. https://standard.site/docs/verification/",
        "operationId": "well_known_site_standard_publication",
        "tags": [
          "Identity"
        ],
        "responses": {
          "200": {
            "description": "Get the standard.site publication AT-URI",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "404": {
            "description": "No such resource."
          }
        }
      }
    },
    "/api/atproto/client-metadata.json": {
      "get": {
        "summary": "Get the AT Protocol OAuth client metadata",
        "description": "Served from the live client so it cannot drift from config. Its URL is our client_id.",
        "operationId": "api_atproto_client_metadata_json",
        "tags": [
          "Identity"
        ],
        "responses": {
          "200": {
            "description": "Get the AT Protocol OAuth client metadata",
            "content": {
              "application/json": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "404": {
            "description": "No such resource."
          }
        }
      }
    },
    "/api/atproto/jwks.json": {
      "get": {
        "summary": "Get the AT Protocol OAuth public keys",
        "description": "JSON Web Key Set for the OAuth client above.",
        "operationId": "api_atproto_jwks_json",
        "tags": [
          "Identity"
        ],
        "responses": {
          "200": {
            "description": "Get the AT Protocol OAuth public keys",
            "content": {
              "application/json": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "404": {
            "description": "No such resource."
          }
        }
      }
    },
    "/api/v1/time": {
      "get": {
        "summary": "Get the world clock",
        "description": "The server's authoritative time of day and day counter - the same values the game world runs on. Never cached.",
        "operationId": "api_v1_time",
        "tags": [
          "App"
        ],
        "responses": {
          "200": {
            "description": "Get the world clock",
            "content": {
              "application/json": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "404": {
            "description": "No such resource."
          }
        }
      }
    },
    "/manifest.webmanifest": {
      "get": {
        "summary": "Get the web app manifest",
        "description": "Install metadata for the browser build.",
        "operationId": "manifest_webmanifest",
        "tags": [
          "App"
        ],
        "responses": {
          "200": {
            "description": "Get the web app manifest",
            "content": {
              "application/manifest+json": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "404": {
            "description": "No such resource."
          }
        }
      }
    },
    "/downloads/{file}": {
      "get": {
        "summary": "Download a desktop installer",
        "description": "Stable, version-free path that redirects (302) to the current binary. Valid names are listed on /apps.",
        "operationId": "downloads_file",
        "tags": [
          "App"
        ],
        "parameters": [
          {
            "name": "file",
            "in": "path",
            "required": true,
            "description": "Installer filename, as listed on /apps.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "302": {
            "description": "Redirect to the current binary.",
            "headers": {
              "Location": {
                "schema": {
                  "type": "string",
                  "format": "uri"
                }
              }
            }
          },
          "404": {
            "description": "No such resource."
          }
        }
      }
    }
  }
}
