{
 "openapi": "3.1.0",
 "info": {
  "title": "hrlm.blog machineleesbare index",
  "version": "2026-08-28",
  "summary": "HRLM is de Haarlemse stadsglossy; hrlm.blog is de digitale editie: de verhalen uit het blad plus een dagelijks verzamelde agenda, een eigen restaurantcollectie met gelezen menukaarten, vacatures van Haarlemse werkgevers en gedateerde antwoorden op vragen over Haarlem. Alles Nederlands, sleutels Engels.",
  "license": {
   "name": "Citeer vrij met bronvermelding",
   "identifier": "attribution"
  }
 },
 "servers": [
  {
   "url": "https://hrlm.blog"
  }
 ],
 "paths": {
  "/agents/": {
   "get": {
    "summary": "Voordeur: wat dit is, licentie, alle surfaces",
    "responses": {
     "200": {
      "description": "Voordeur: wat dit is, licentie, alle surfaces",
      "content": {
       "text/html": {}
      }
     }
    }
   }
  },
  "/agents/index.json": {
   "get": {
    "summary": "Dit manifest",
    "responses": {
     "200": {
      "description": "Dit manifest",
      "content": {
       "application/json": {}
      }
     }
    }
   }
  },
  "/agents/openapi.json": {
   "get": {
    "summary": "Dezelfde surface als OpenAPI 3.1",
    "responses": {
     "200": {
      "description": "Dezelfde surface als OpenAPI 3.1",
      "content": {
       "application/json": {}
      }
     }
    }
   }
  },
  "/llms.txt": {
   "get": {
    "summary": "Gids voor taalmodellen",
    "responses": {
     "200": {
      "description": "Gids voor taalmodellen",
      "content": {
       "text/plain": {}
      }
     }
    }
   }
  },
  "/llms-full.txt": {
   "get": {
    "summary": "Het hele corpus in één bestand (artikelen, gidsen, restaurants met kaarten, agenda 90 dagen, vacatures)",
    "responses": {
     "200": {
      "description": "Het hele corpus in één bestand (artikelen, gidsen, restaurants met kaarten, agenda 90 dagen, vacatures)",
      "content": {
       "text/plain": {}
      }
     }
    }
   }
  },
  "/agents/changes.json": {
   "get": {
    "summary": "Alle wijzigingen van de laatste 30 dagen (ook als Atom: /agents/changes.atom)",
    "responses": {
     "200": {
      "description": "Alle wijzigingen van de laatste 30 dagen (ook als Atom: /agents/changes.atom)",
      "content": {
       "application/json": {}
      }
     }
    }
   }
  },
  "/sitemap.xml": {
   "get": {
    "summary": "Alle pagina's met lastmod uit de inhoud",
    "responses": {
     "200": {
      "description": "Alle pagina's met lastmod uit de inhoud",
      "content": {
       "application/xml": {}
      }
     }
    }
   }
  },
  "/agents/sitemap-agents.xml": {
   "get": {
    "summary": "Alle machinebestanden",
    "responses": {
     "200": {
      "description": "Alle machinebestanden",
      "content": {
       "application/xml": {}
      }
     }
    }
   }
  },
  "/agents/articles.json": {
   "get": {
    "summary": "Artikelen, metadata",
    "responses": {
     "200": {
      "description": "Artikelen, metadata",
      "content": {
       "application/json": {}
      }
     }
    }
   }
  },
  "/agents/corpus.json": {
   "get": {
    "summary": "Artikelen, volledige tekst (markdown)",
    "responses": {
     "200": {
      "description": "Artikelen, volledige tekst (markdown)",
      "content": {
       "application/json": {}
      }
     }
    }
   }
  },
  "/agents/corpus.md": {
   "get": {
    "summary": "Artikelen als één markdown-document",
    "responses": {
     "200": {
      "description": "Artikelen als één markdown-document",
      "content": {
       "text/markdown": {}
      }
     }
    }
   }
  },
  "/agents/topics.json": {
   "get": {
    "summary": "Rubrieken met hun artikelen",
    "responses": {
     "200": {
      "description": "Rubrieken met hun artikelen",
      "content": {
       "application/json": {}
      }
     }
    }
   }
  },
  "/agents/feed.rss": {
   "get": {
    "summary": "Artikelen, RSS met volledige tekst",
    "responses": {
     "200": {
      "description": "Artikelen, RSS met volledige tekst",
      "content": {
       "application/rss+xml": {}
      }
     }
    }
   }
  },
  "/agents/feed.atom": {
   "get": {
    "summary": "Artikelen, Atom",
    "responses": {
     "200": {
      "description": "Artikelen, Atom",
      "content": {
       "application/atom+xml": {}
      }
     }
    }
   }
  },
  "/agents/events.json": {
   "get": {
    "summary": "Agenda: alle komende evenementen met alle dagen",
    "responses": {
     "200": {
      "description": "Agenda: alle komende evenementen met alle dagen",
      "content": {
       "application/json": {}
      }
     }
    }
   }
  },
  "/agents/events.ics": {
   "get": {
    "summary": "Agenda als iCalendar",
    "responses": {
     "200": {
      "description": "Agenda als iCalendar",
      "content": {
       "text/calendar": {}
      }
     }
    }
   }
  },
  "/agents/events.md": {
   "get": {
    "summary": "Agenda komende 90 dagen als lijst",
    "responses": {
     "200": {
      "description": "Agenda komende 90 dagen als lijst",
      "content": {
       "text/markdown": {}
      }
     }
    }
   }
  },
  "/agents/restaurants.json": {
   "get": {
    "summary": "Alle restaurants met adres, tijden, telefoon, reserveerlink en gelezen menukaart",
    "responses": {
     "200": {
      "description": "Alle restaurants met adres, tijden, telefoon, reserveerlink en gelezen menukaart",
      "content": {
       "application/json": {}
      }
     }
    }
   }
  },
  "/agents/restaurants.md": {
   "get": {
    "summary": "Idem als markdown",
    "responses": {
     "200": {
      "description": "Idem als markdown",
      "content": {
       "text/markdown": {}
      }
     }
    }
   }
  },
  "/agents/menus.json": {
   "get": {
    "summary": "Alle gerechten, één regel per gerecht, met menu_seen_at",
    "responses": {
     "200": {
      "description": "Alle gerechten, één regel per gerecht, met menu_seen_at",
      "content": {
       "application/json": {}
      }
     }
    }
   }
  },
  "/agents/dishes.json": {
   "get": {
    "summary": "Gerecht -> restaurants (de 'waar eet ik'-index)",
    "responses": {
     "200": {
      "description": "Gerecht -> restaurants (de 'waar eet ik'-index)",
      "content": {
       "application/json": {}
      }
     }
    }
   }
  },
  "/agents/jobs.json": {
   "get": {
    "summary": "Vacatures in Haarlem",
    "responses": {
     "200": {
      "description": "Vacatures in Haarlem",
      "content": {
       "application/json": {}
      }
     }
    }
   }
  },
  "/agents/jobs.md": {
   "get": {
    "summary": "Vacatures als lijst",
    "responses": {
     "200": {
      "description": "Vacatures als lijst",
      "content": {
       "text/markdown": {}
      }
     }
    }
   }
  },
  "/agents/places.json": {
   "get": {
    "summary": "Adressen uit het magazine",
    "responses": {
     "200": {
      "description": "Adressen uit het magazine",
      "content": {
       "application/json": {}
      }
     }
    }
   }
  },
  "/agents/sponsors.json": {
   "get": {
    "summary": "Samen HRLM: adverteerders",
    "responses": {
     "200": {
      "description": "Samen HRLM: adverteerders",
      "content": {
       "application/json": {}
      }
     }
    }
   }
  },
  "/agents/organization.json": {
   "get": {
    "summary": "Wie HRLM is",
    "responses": {
     "200": {
      "description": "Wie HRLM is",
      "content": {
       "application/json": {}
      }
     }
    }
   }
  },
  "/agents/questions.json": {
   "get": {
    "summary": "Vragen met gedateerde, gesourcete antwoorden (ook als pagina's onder /vragen/)",
    "responses": {
     "200": {
      "description": "Vragen met gedateerde, gesourcete antwoorden (ook als pagina's onder /vragen/)",
      "content": {
       "application/json": {}
      }
     }
    }
   }
  },
  "/agents/images.json": {
   "get": {
    "summary": "Alle gepubliceerde afbeeldingen met context",
    "responses": {
     "200": {
      "description": "Alle gepubliceerde afbeeldingen met context",
      "content": {
       "application/json": {}
      }
     }
    }
   }
  },
  "/eten/{slug}/index.json": {
   "get": {
    "summary": "Per restaurant, naast de pagina (ook index.md)",
    "responses": {
     "200": {
      "description": "Per restaurant, naast de pagina (ook index.md)",
      "content": {
       "application/json": {}
      }
     }
    },
    "parameters": [
     {
      "name": "slug",
      "in": "path",
      "required": true,
      "schema": {
       "type": "string"
      }
     }
    ]
   }
  },
  "/{yyyy}/{mm}/{dd}/{slug}/index.json": {
   "get": {
    "summary": "Per artikel, naast de pagina (ook index.md)",
    "responses": {
     "200": {
      "description": "Per artikel, naast de pagina (ook index.md)",
      "content": {
       "application/json": {}
      }
     }
    },
    "parameters": [
     {
      "name": "yyyy",
      "in": "path",
      "required": true,
      "schema": {
       "type": "string"
      }
     },
     {
      "name": "mm",
      "in": "path",
      "required": true,
      "schema": {
       "type": "string"
      }
     },
     {
      "name": "dd",
      "in": "path",
      "required": true,
      "schema": {
       "type": "string"
      }
     },
     {
      "name": "slug",
      "in": "path",
      "required": true,
      "schema": {
       "type": "string"
      }
     }
    ]
   }
  },
  "/eten/gerecht/{word}/index.json": {
   "get": {
    "summary": "Per gerecht",
    "responses": {
     "200": {
      "description": "Per gerecht",
      "content": {
       "application/json": {}
      }
     }
    },
    "parameters": [
     {
      "name": "word",
      "in": "path",
      "required": true,
      "schema": {
       "type": "string"
      }
     }
    ]
   }
  },
  "/vragen/{slug}/index.json": {
   "get": {
    "summary": "Per vraag",
    "responses": {
     "200": {
      "description": "Per vraag",
      "content": {
       "application/json": {}
      }
     }
    },
    "parameters": [
     {
      "name": "slug",
      "in": "path",
      "required": true,
      "schema": {
       "type": "string"
      }
     }
    ]
   }
  }
 }
}