{
  "name": "RunFolio",
  "description": "A portfolio for runners. Each runner logs the races they have finished and gets one public page holding all of them.",
  "url": "https://runfolio.in/",
  "documentation": "https://runfolio.in/api-docs",
  "llms_txt": "https://runfolio.in/llms.txt",
  "sitemap": "https://runfolio.in/sitemap.xml",
  "contact": "mailto:sanket.tambare01@gmail.com",
  "authentication": "none",
  "cors": "*",
  "cache_seconds": 300,
  "endpoints": [
    {
      "id": "runner",
      "method": "GET",
      "url_template": "https://runfolio.in/runner/%7Busername%7D.json",
      "description": "One runner: profile, totals, personal bests, races per year and per city, and every race.",
      "parameters": [
        {
          "name": "username",
          "in": "path",
          "required": true,
          "pattern": "^[a-z0-9-]{3,30}$",
          "description": "The runner's username, as it appears in their page URL."
        }
      ],
      "html_equivalent": "https://runfolio.in/runner/%7Busername%7D"
    },
    {
      "id": "race",
      "method": "GET",
      "url_template": "https://runfolio.in/runner/%7Busername%7D/%7BraceId%7D.json",
      "description": "One race in full, including its photographs.",
      "parameters": [
        {
          "name": "username",
          "in": "path",
          "required": true,
          "pattern": "^[a-z0-9-]{3,30}$"
        },
        {
          "name": "raceId",
          "in": "path",
          "required": true,
          "format": "uuid",
          "description": "The race id from the page URL."
        }
      ],
      "html_equivalent": "https://runfolio.in/runner/%7Busername%7D/%7BraceId%7D"
    },
    {
      "id": "explore",
      "method": "GET",
      "url_template": "https://runfolio.in/api/explore.json%7B?q,city,page}",
      "description": "The directory of runners who have opted into being listed, paginated.",
      "parameters": [
        {
          "name": "q",
          "in": "query",
          "required": false,
          "description": "Matches name or username, case-insensitively."
        },
        {
          "name": "city",
          "in": "query",
          "required": false,
          "description": "The runner's own stated location, matched exactly. The available values are in the response's `cities` array."
        },
        {
          "name": "page",
          "in": "query",
          "required": false,
          "type": "integer",
          "minimum": 1,
          "description": "1-based. Page size is in the response."
        }
      ],
      "html_equivalent": "https://runfolio.in/explore"
    }
  ],
  "not_published": [
    "Dates of birth — the public database view does not carry the column.",
    "Email addresses.",
    "Strava tokens.",
    "Runners who have left the directory: their pages stay public at their own address but are absent from the directory, the directory JSON and the sitemap.",
    "Anything under /dashboard, which requires a session."
  ]
}