Gold Coast Window and Pressure Cleaning — Agent & Developer Resources

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.

Start here

REST API (v1, read-only)

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.

OperationEndpointWhat it answers
getApiIndexGET /api/v1/Every endpoint, with links to this page and the spec
listServicesGET /api/v1/servicesEvery service offered and what each includes
getServiceAreaGET /api/v1/service-area?suburb=Where the business travels; optional suburb check
getPricingOptionsGET /api/v1/pricing-optionsThe exact option values an estimate accepts
estimateQuotePOST /api/v1/estimateA GST-inclusive price from the site’s own pricing engine
getPageMarkdownGET /api/v1/pages?path=Any page of this site as clean markdown
getOpenApiDocumentGET /api/v1/openapi.jsonThe 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.

Versioning and deprecation policy

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.

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,
  "...": "..."
}

Rate limits and caching

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:

If a legitimate integration needs more than this allows, say so at /contact/ before working around it.

MCP server

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.

ToolWhat it answers
list_servicesEvery service offered and what each includes
get_service_areaWhether a suburb is covered — check this first
estimate_quoteA GST-inclusive price from the site’s own pricing engine
get_pricing_optionsThe exact option values estimate_quote accepts
get_pageAny 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.

Markdown content negotiation

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 index

ResourceURLMedia type
Site summary for LLMs/llms.txttext/plain
Markdown mirror index (every page)/llms-full.txttext/plain
Agent instructions/agent-instructions.mdtext/markdown
REST API v1 — endpoint index/api/v1/application/json
OpenAPI 3.1 document/openapi.jsonapplication/json
API catalog (RFC 9727)/.well-known/api-catalogapplication/linkset+json
API directory/api/application/json
MCP server (Streamable HTTP)/mcpJSON-RPC 2.0
MCP manifest/.well-known/mcpapplication/json
MCP server card (SEP-2127)/.well-known/mcp/server-card.jsonapplication/json
MCP server card (SEP-2127 alias)/mcp/server-cardapplication/json
ARD catalog/.well-known/ard.jsonapplication/json
ARD catalog (predecessor path)/.well-known/ai-catalog.jsonapplication/json
Privacy policy/privacy/text/html
Sitemap index/sitemap.xmlapplication/xml
Static pages sitemap/sitemap-static.xmlapplication/xml
Residential pages sitemap/sitemap-residential.xmlapplication/xml
Commercial pages sitemap/sitemap-commercial.xmlapplication/xml
Crawler policy/robots.txttext/plain
Expert guides index/guides/text/html
Markdown mirror of any page<page>.md or <page>/index.mdtext/markdown

Agent Skill

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.

ResourceWhat 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.

Discovery catalog (ARD)

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.

Structured data

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.

Error handling

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