# GLØDI public catalogue API

GLØDI public catalogue for Norway. Read-only. Typical paths: find_clinics (near or place) and get_clinic for a clinic; search_treatments, then get_treatment for the options and their option_id, then get_booking_choices for practitioners, add-ons and packages, then find_free_days and find_free_times. Give the person a booking_url: it opens the booking lightbox with the choices made. Take every id (clinic_id, treatment_id, option_id, practitioner_id) from an answer; never build one. Prices are in NOK. A missing fact is null; complete: false means still loading, not unavailable. A free time is not held until the person books it. browse_site lists the categories, body areas and skin concerns for vague needs; find_practitioners finds a practitioner by name and where they can be booked; list_offers, search_products, list_events and list_reviews answer the rest; read_public_page reads any URL an answer returned.

Reads are anonymous. Optional OAuth credentials give the same public data; see https://glodi.no/auth.md. Cookies never select a clinic or an account.

- `GET https://glodi.no/api/agent-access/clinics` (`find_clinics`): Find clinics near a place, in a town or by name, nearest first. Each clinic has its clinic_id, address, distance, phone numbers with call/SMS/WhatsApp channels, hours today, open now and rating. Give near (latitude/longitude) or place (a town, place name or four-digit postal code). With treatment_id, only clinics that offer it now, with their price from.
- `GET https://glodi.no/api/agent-access/clinics/{clinic_id}` (`get_clinic`): One clinic's facts: address, phones, the week's opening hours (also odd and even weeks), closed days, parking, team, treatment categories with prices, current offers, payment methods, cancellation notice, gift cards and subscriptions.
- `GET https://glodi.no/api/agent-access/practitioners` (`find_practitioners`): Find a practitioner by name (at least two letters) and the clinics where each can be booked now. For who can do one treatment option, with prices, use get_booking_choices.
- `GET https://glodi.no/api/agent-access/treatments` (`search_treatments`): Search treatments in Norwegian and English at once; spelling mistakes and compound words are handled. Each result has its treatment_id, category path, price from-to, offer price, duration, clinic count and, with near or place, the nearest clinics. Filter by category, body_area or skin_concern (browse_site lists them). Treatments no clinic can book now are left out unless include_unbookable is true. Without a match: suggestions and categories.
- `GET https://glodi.no/api/agent-access/treatments/{treatment_id}` (`get_treatment`): One treatment: what it is, the procedure, recovery and safety, sessions and interval, its options with option_id, price, offer price and duration, the clinics that offer it and its reviews. Every option has a booking_url.
- `GET https://glodi.no/api/agent-access/booking-choices` (`get_booking_choices`): The choices the booking lightbox offers for one option_id. Without a clinic: every clinic that can book it, with distance, practitioner count and prices. With clinic_id: the practitioners with their own prices (practitioner_id), add-ons, packages, party size, cancellation notice and payment methods.
- `GET https://glodi.no/api/agent-access/free-days` (`find_free_days`): Which days have a free time for one option_id, for up to 60 days, at clinic_id or at the three nearest clinics to near or place. For one practitioner_id or anyone; add_on_ids lengthen the visit. No free day gives a waitlist_url.
- `GET https://glodi.no/api/agent-access/free-times` (`find_free_times`): The free times on a date (or up to 7 days) for one option_id at clinic_id, with the practitioners free at each time and their prices. Every time has a booking_url that opens the booking lightbox with the option, practitioner, day, time and add-ons chosen. A time is not held until the person books it.
- `GET https://glodi.no/api/agent-access/offers` (`list_offers`): The live offers (campaigns), with each treatment or product, its price before and after, and until when it holds. Filter by clinic_id, item_type or item_slug; offer_id reads one offer.
- `GET https://glodi.no/api/agent-access/products` (`search_products`): Search skincare and retail products: GLØDI's marketplace on glodi.no and each clinic's shop on its own site. Filter by brand, category or stock. product_id reads one product with its description, sellers, subscription options, matching treatments and reviews.
- `GET https://glodi.no/api/agent-access/events` (`list_events`): Upcoming arrangements and courses, GLØDI's own and the clinics', with sessions, seats left, price from and registration state. event_id reads one event with its program, prerequisites and price tiers.
- `GET https://glodi.no/api/agent-access/reviews` (`list_reviews`): Published reviews and their summary (average, count, distribution) for one clinic_id, practitioner, treatment_id or product_id.
- `GET https://glodi.no/api/agent-access/site` (`browse_site`): The map of everything public here: every list page with its count, and the treatment categories, body areas and skin concerns with their slugs, for vague needs ("pigmentering", "acne"). Also the contact facts and, on glodi.no, GLØDI's plans for clinics.
- `GET https://glodi.no/api/agent-access/page` (`read_public_page`): Read one public page, normally a URL another answer returned: its text sections, links, schema.org facts and typed data for the page type (clinic, treatment, practitioner, offer, product, brand, event, guide, article, ingredient or job).

Examples: `GET https://glodi.no/api/agent-access/clinics?place=Asker`, `GET https://glodi.no/api/agent-access/treatments?query=laser%20hair%20removal`, `GET https://glodi.no/api/agent-access/free-times?option_id=<option_id>&clinic_id=<clinic_id>&date=<YYYY-MM-DD>`, `GET https://glodi.no/api/agent-access/page?url=https%3A%2F%2Fglodi.no%2Fno`.

A position is `near[latitude]=59.79&near[longitude]=10.33`; a list is comma-separated (`add_on_ids=3,7`). Collections take `page` (default 1) and `page_size` (default 20, at most 50) and answer with `count`, `next`, `previous` and `results`. `locale` (`nb` or `en`) sets the answer language; search reads both languages. A clinic site answers for its clinic only. Page URLs use HTTPS and have no query or fragment.

Booking links open the clinic's booking lightbox with the option, practitioner, day, time and add-ons chosen, and carry `utm_source=<assistant>`, `utm_medium=ai_agent` and `utm_campaign=mcp`. A free time is not held until the person books it. These interfaces book, buy and store nothing.

MCP clients use `https://glodi.no/mcp` (Streamable HTTP, JSON responses). Revision `2026-07-28` is stateless: put the version in `params._meta["io.modelcontextprotocol/protocolVersion"]` and the `MCP-Protocol-Version` header, the method in `Mcp-Method` and the tool name in `Mcp-Name`; `server/discover` lists the versions. Clients of `2025-11-25` and `2025-06-18` initialize as before. Every tool has an `outputSchema` and returns `structuredContent`.

A2A 1.0 clients send JSON-RPC `SendMessage` to `https://glodi.no/a2a` with `A2A-Version: 1.0` and one part: a text part searches treatments; a data part holds `tool` (an MCP tool name) and `arguments`. No tasks, streams or history are kept.

Budget: 600 requests per hour per address, of which 120 free-day or free-time reads. Over budget the answer is HTTP 429 with `Retry-After`.

[OpenAPI schema](https://glodi.no/api/agent-access/openapi.json) · [MCP server card](https://glodi.no/.well-known/mcp/server-card.json) · [Skill](https://glodi.no/.well-known/agent-skills/glodi-public-catalog/SKILL.md)
