Developer and AI-agent documentation for Gold Coast Window and Pressure Cleaning — the public REST API and its OpenAPI document, the MCP server, structured data, and every machine-readable resource this site publishes. Static HTML, no JavaScript required.
A public, unauthenticated, read-only JSON API at
https://gcwindowandpressurecleaning.com.au/api/v1/. It is
the same five operations as the MCP server below, for clients that speak
plain HTTP — including function-calling LLMs working from the
OpenAPI document. Every operation has a
unique operationId, a description, typed parameters and
typed response schemas. Permissive CORS; no API key.
| Operation | Endpoint | What it answers |
|---|---|---|
getApiIndex | GET /api/v1/ | Every endpoint, with links to this page and the spec |
listServices | GET /api/v1/services | Every service offered and what each includes |
getServiceArea | GET /api/v1/service-area?suburb= | Where the business travels; optional suburb check |
getPricingOptions | GET /api/v1/pricing-options | The exact option values an estimate accepts |
estimateQuote | POST /api/v1/estimate | A GST-inclusive price from the site’s own pricing engine |
getPageMarkdown | GET /api/v1/pages?path= | Any page of this site as clean markdown |
getOpenApiDocument | GET /api/v1/openapi.json | The OpenAPI document (also at /openapi.json) |
curl https://gcwindowandpressurecleaning.com.au/api/v1/services
curl -sX POST https://gcwindowandpressurecleaning.com.au/api/v1/estimate \
-H "Content-Type: application/json" \
-d '{"services":["window"],"propertyType":"house","storeys":"2",
"window":{"panes":"21-30","tint":"no","condition":"regular","french":"none","frequency":"once"}}'
An estimate answers with custom: false and a
total in AUD, or custom: true when the job
deliberately needs a human quote — say so rather than inventing a
figure. GET /api/v1/pricing-options lists every accepted
value. Also on this host: /api/ is a JSON directory
of the APIs here; every other path under /api/ is a
private form handler for this website and not part of the public API.
Read-only by design. No operation creates a booking,
a job, a lead or any record, and none accepts personal information.
Customers book at /instant-quote/.
Every operation is declared
x-openai-isConsequential: false in the spec, so a
function-calling client need not stop and ask before calling one.
Every API response carries an RFC 8631 Link header pointing
at the spec (rel="service-desc"), these docs
(rel="service-doc") and the catalog
(rel="api-catalog"), so a client that has only a response in
hand can still find its way here.
The version is in the path: /api/v1/.
v1 is current and has no sunset date. The same policy
governs the MCP tool set below.
/api/v2/, never in place.
Link with
rel="deprecation" back to this section — and it keeps
answering for at least six months after that. No headers today means
nothing is deprecated today.
The machine-readable form of all of this is the
lifecycle object in
GET /api/v1/ and GET /api/,
and info.x-api-lifecycle in the
OpenAPI document — one object, three places,
so they cannot disagree.
curl -s https://gcwindowandpressurecleaning.com.au/api/v1/ | jq .lifecycle
{
"version": "v1",
"status": "current",
"deprecated": false,
"sunset": null,
"versioningScheme": "url-path",
"minimumNoticeMonths": 6,
"...": "..."
}
There is no per-client quota, and no
RateLimit headers are sent — there is no quota to
report, and advertising a limit that is not applied would be worse than
sending nothing. What is asked instead is that clients be reasonable:
GET responses carry
Cache-Control: public, max-age=300, and the OpenAPI
document max-age=3600. The service list, service area and
pricing options change rarely — re-fetching them per request is waste.
POST /estimate is no-store: price the job
once and keep the answer for the length of the conversation.
Retry-After. If the edge ever
answers 429 or 503, that header says how long
to wait. That response comes from the CDN, not this API, so expect an
edge error page rather than a problem document — back off and retry
once rather than parsing it.
If a legitimate integration needs more than this allows, say so at /contact/ before working around it.
There is a read-only
Model Context Protocol
server at /mcp, using the Streamable HTTP transport, no
authentication. It lets an assistant query this business directly rather
than parsing pages — including a real price from the same engine that
powers the website’s instant quote.
| Tool | What it answers |
|---|---|
list_services | Every service offered and what each includes |
get_service_area | Whether a suburb is covered — check this first |
estimate_quote | A GST-inclusive price from the site’s own pricing engine |
get_pricing_options | The exact option values estimate_quote accepts |
get_page | Any page of this site as clean markdown |
Manifest: /.well-known/mcp — a
GET there returns the manifest, and a POST to
the same URL performs a live MCP handshake, so a client that only knows
the well-known path can connect without reading the manifest first.
/mcp is the canonical endpoint. Handshake:
curl -sX POST https://gcwindowandpressurecleaning.com.au/mcp \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'
Read-only by design. No tool creates a booking, a job or any record, and none accepts personal information. Send customers to /instant-quote/ to submit their own details.
This site is
acceptmarkdown.com
compliant. Send Accept: text/markdown to any page URL and
the server returns the markdown twin of that page with
Content-Type: text/markdown; charset=utf-8 and
Vary: Accept, Accept-Encoding. Quality values are honoured,
and an Accept header that permits neither HTML nor markdown
gets a 406 Not Acceptable.
curl -H "Accept: text/markdown" https://gcwindowandpressurecleaning.com.au/window-cleaning/
Markdown mirrors are also addressable directly — append .md
to any page URL, or append index.md. Both resolve to the
same file.
curl https://gcwindowandpressurecleaning.com.au/window-cleaning.md
curl https://gcwindowandpressurecleaning.com.au/window-cleaning/index.md
Every page advertises its mirror twice: in the document head as
<link rel="alternate" type="text/markdown">, and in an
RFC 8288
Link response header, so a HEAD request finds it
without parsing any HTML. The same header carries
rel="service-desc" (the OpenAPI document),
rel="service-doc" (this page) and
rel="api-catalog".
curl -I https://gcwindowandpressurecleaning.com.au/window-cleaning/
/llms-full.txt lists the markdown URL for every page on the site in one file.
| Resource | URL | Media type |
|---|---|---|
| Site summary for LLMs | /llms.txt | text/plain |
| Markdown mirror index (every page) | /llms-full.txt | text/plain |
| Agent instructions | /agent-instructions.md | text/markdown |
| REST API v1 — endpoint index | /api/v1/ | application/json |
| OpenAPI 3.1 document | /openapi.json | application/json |
| API catalog (RFC 9727) | /.well-known/api-catalog | application/linkset+json |
| API directory | /api/ | application/json |
| MCP server (Streamable HTTP) | /mcp | JSON-RPC 2.0 |
| MCP manifest | /.well-known/mcp | application/json |
| MCP server card (SEP-2127) | /.well-known/mcp/server-card.json | application/json |
| MCP server card (SEP-2127 alias) | /mcp/server-card | application/json |
| ARD catalog | /.well-known/ard.json | application/json |
| ARD catalog (predecessor path) | /.well-known/ai-catalog.json | application/json |
| Privacy policy | /privacy/ | text/html |
| Sitemap index | /sitemap.xml | application/xml |
| Static pages sitemap | /sitemap-static.xml | application/xml |
| Residential pages sitemap | /sitemap-residential.xml | application/xml |
| Commercial pages sitemap | /sitemap-commercial.xml | application/xml |
| Crawler policy | /robots.txt | text/plain |
| Expert guides index | /guides/ | text/html |
| Markdown mirror of any page | <page>.md or <page>/index.md | text/markdown |
The instructions above are also published as an
Agent Skill — the
open SKILL.md format many agent runtimes load on demand —
so a skills-aware client can pick this business up without being pointed
at the docs first.
| Resource | What it is |
|---|---|
/.well-known/agent-skills/index.json |
Discovery index, per the Agent Skills discovery specification (schema 0.2.0). Every entry carries a sha256: digest of its artefact, so a client can verify what it fetched. |
…/gold-coast-window-and-pressure-cleaning/SKILL.md |
The skill itself: what this business covers, when it is not the right answer, how to price a job through the API or MCP, and how to read a custom-quote result. |
The index is generated at build time from the SKILL.md
files themselves, so the digests and descriptions cannot drift from what
is served. The skill is read-only, like everything else here — it
instructs an agent to hand a person off to
/instant-quote/ rather than book anything
on their behalf.
Every agentic resource on this host is listed in an
Agentic Resource Discovery
catalog at /.well-known/ard.json —
one entry each for the MCP server, the
REST API and the Agent Skill.
Each entry carries a domain-anchored urn:air: identifier, the
media type of the artifact it points at, sample queries the resource can
answer, and a trust manifest binding it to this domain. The identical
document is served at
/.well-known/ai-catalog.json
for consumers that still resolve the predecessor path, and every page
advertises the catalog with <link rel="ard">.
The MCP entry points at a
server card
(SEP-2127) at
/.well-known/mcp/server-card.json,
also served at the SEP’s own recommended location
/mcp/server-card. It names the
server, its version, both transport endpoints, the protocol versions they
speak, and every tool with its full input schema — enough to decide
whether to open a connection at all. It is generated from the same tool
definitions the server answers tools/list with, so it cannot
describe a tool that does not exist.
Every page carries JSON-LD in the document head:
Organization, WebSite,
LocalBusiness, Service, Offer,
AggregateRating, GeoCircle and
BreadcrumbList, plus FAQPage on pages with
FAQs. Page content is prerendered into the HTML, so crawlers that do not
execute JavaScript still see the full text.
API errors are RFC 9457
problem documents (application/problem+json), never HTML:
type, title, status and
detail, plus a machine-readable code
(not_found, method_not_allowed,
invalid_json, invalid_request,
unsupported_media_type, unpriceable,
internal_error), a hint saying what to do
instead, and a docs link back here. A 405 carries an
Allow header and an allowed list; a 404 inside
/api/v1/ lists availableEndpoints. Unknown
paths anywhere under /api/ get the same treatment.
curl -s https://gcwindowandpressurecleaning.com.au/api/v1/no-such-thing
{
"type": "https://gcwindowandpressurecleaning.com.au/for-agents/#errors-not-found",
"title": "Not Found",
"status": 404,
"detail": "No endpoint at /api/v1/no-such-thing.",
"instance": "/api/v1/no-such-thing",
"code": "not_found",
"hint": "GET https://gcwindowandpressurecleaning.com.au/api/v1/ lists every endpoint; ...",
"docs": "https://gcwindowandpressurecleaning.com.au/for-agents/#rest-api",
"availableEndpoints": ["GET https://gcwindowandpressurecleaning.com.au/api/v1/", "..."]
}
Nonexistent pages return a genuine HTTP 404, never
a 200 with an app shell. The 404 body lists recovery links,
and clients that asked for markdown get a markdown recovery body.
curl -s -o /dev/null -w "%{http_code}" https://gcwindowandpressurecleaning.com.au/no-such-page
# 404