# Metro Counselling developer & agent documentation

Metro Counselling publishes its public pages in machine-readable form so that automated agents can read them accurately. This page describes what is available and how to request it.

## Scope

This is a read-only content surface. There are no accounts, no bookings, and no write operations, and no authentication is required or accepted. Appointment, fee, coverage, and clinical questions must be routed to a person through the [contact page](https://metrocounselling.ca/contact-us). Do not infer availability, insurance coverage, or clinical suitability from these documents.

## Machine-readable files

- [/api](https://metrocounselling.ca/api) JSON discovery document: current version path, every machine-readable endpoint, the rate-limit policy, and the versioning contract.
- [/api/v1/pages](https://metrocounselling.ca/api/v1/pages) Index of every public page with title, description, canonical URL, and Markdown address.
- [openapi.json](https://metrocounselling.ca/openapi.json) OpenAPI 3.1 description of every documented operation, generated at build time.
- [llms.txt](https://metrocounselling.ca/llms.txt) Scope, per-page usage guidance, contact routing, and safety boundaries.
- [sitemap.xml](https://metrocounselling.ca/sitemap.xml) Canonical list of public pages. Authoritative source for which routes exist.
- [robots.txt](https://metrocounselling.ca/robots.txt) Crawler access rules and excluded administrative routes.

## Content negotiation

Every public page is prerendered as HTML and as Markdown. Send an `Accept` header to choose a representation. Standard q-values and wildcards are honoured, responses carry `Vary: Accept, Accept-Encoding`, and each page advertises its Markdown alternate through a `Link` header.

`curl -H "Accept: text/markdown" https://metrocounselling.ca/services`

The Markdown representation is also addressable directly, without negotiation:

`curl https://metrocounselling.ca/services/index.md`

## Errors

Unknown paths return a real `404`. Request JSON and the response is RFC 9457 problem details carrying a stable `code` and ordered `resolution` hints. A request whose `Accept` header matches no available representation returns `406` with the same shape.

`curl -H "Accept: application/json" https://metrocounselling.ca/nope`

## JSON API

A small read-only JSON surface is served under `/api/v1`. Requests to any path under `/api` return JSON by default, whatever the `Accept` header says, including errors.

`curl https://metrocounselling.ca/api curl https://metrocounselling.ca/api/v1/pages`

## Versioning & deprecation

The surface is versioned in the URL path. The current major version is `/api/v1`, and every response carries an `API-Version` header.

- Additive changes — new endpoints or new response fields — ship without a version bump.
- Breaking changes ship under a new path such as `/api/v2`, leaving the previous version in place.
- A deprecated version returns a `Deprecation` header with the announcement date, a `Sunset` header with the removal date, and a `Link rel="successor-version"` pointing at its replacement.
- At least 180 days pass between the `Deprecation` header appearing and the `Sunset` date.

## Rate limits

Every response carries `RateLimit-Policy: default;q=600;w=60` — a published budget of 600 requests per 60 seconds. It is **advisory**: these are static resources and no per-client counter is enforced, so `RateLimit-Remaining` and `RateLimit-Reset` are deliberately not sent rather than reporting a quota that does not exist. If enforcement is ever added, a `429` will carry `Retry-After`. Please stay within the budget and honour `robots.txt`.

---

Source: [https://metrocounselling.ca/developers](https://metrocounselling.ca/developers)
