For AI agents
A guide for AI assistants acting for someone who wants a home or office clean in Toronto or the GTA.
The quickest way for a person to book
Send them to book online. They choose their service, see their price upfront and choose their time. They complete their booking and card details in BookingKoala. There’s no upfront payment.
If they want a quote first, use the quote API or MCP tool below with their permission. The team replies by email with a price and a booking link for the person to complete the booking.
Start with the site’s own facts
Read our services and pricing, then use the person’s details when requesting their quote.
- Regular Cleaning: Regular visits, weekly, bi-weekly or every 3 or 4 weeks, that keep your kitchen, bathrooms, floors and every reachable surface fresh, by vetted cleaners who bring all the supplies.
- Deep Cleaning: A top-to-bottom reset for the baseboards, vents, door frames and corners everyday cleaning misses, and the right start when your home hasn’t had a professional clean in the past month.
- Move In/Out Cleaning: A top-to-bottom clean of an empty home, before you move in or after you move out, from the kitchen and bathrooms to the baseboards, vents and fans.
- Post-Renovation Cleaning: For the home you’ve just updated, from a new kitchen or bathroom to fresh floors, paint or a finished basement: we lift the renovation dust and residue, room by room.
- Office Cleaning: Offices of any size, from a one-room practice to a large workplace: desks, kitchens, bathrooms and floors cleaned thoroughly, so your team and your clients walk into a space that feels cared for.
For coverage, check our service areas and the service area FAQ. A postal code in the right format is a quote input, not confirmation of coverage.
- What's included
- Extras
- What isn't offered
- Recurring plans
- Payment
- Changes and cancellations
- Re-clean guarantee
See the terms and conditions for the full policies. For a question about the person’s clean, call (647) 424-0355 or email support@torontoshinecleaning.ca.
Request a cleaning quote
Send a POST with Content-Type: application/json to https://torontoshinecleaning.ca/api/agent-quote.php.
Requests can take up to 12 hours to be processed. The team replies by email with the price and a booking link. A received request is a quote request, not a confirmed booking. Preferred dates and times are preferences for the team to review.
The details to send
postal_code: a full Canadian postal code or its first three characters, such asM5V.service:regular(Regular Cleaning),deep(Deep Cleaning),move_in_out(Move In/Out Cleaning),post_renovation(Post-Renovation Cleaning),office(Office Cleaning).bedrooms,bathroomsandsquare_feet: the home’s actual size. Use0bedrooms for a studio; half bathrooms are accepted. For an office, sendsquare_feetand omit bedrooms and bathrooms.client.name,client.emailandagent.reply_email.consent.client_authorized: true: confirmation that the person asked you to send this request and share their details.
Optional frequency: one_time (One-time), weekly (Weekly), biweekly (Bi-weekly), every_4_weeks (Every 4 weeks). If you leave it out, the request is for a one-time clean.
Optional extras, using these IDs:
inside_oven: Inside oveninside_fridge: Inside fridgeinside_cabinets: Inside cabinetswindows_and_tracks: Windows and tracksinterior_walls: Interior wallshand_wiped_baseboards: Hand-wiped baseboardsdishes: Disheslaundry_and_folding: Laundry and foldingextra_appliances: Extra appliancesextra_cupboards: Extra cupboardsfinished_basement: Finished basementpet_hair: Pet hair
You can also send preferred_dates (ISO dates or a description), preferred_times, address (street, unit and city), access_notes, parking_note, pets_note and notes (up to 1,000 characters). Time preferences use Toronto local time.
For a call, set client.callback_requested to true and include client.phone. Add client.preferred_call_times if helpful. The quote is processed either way. A phone number is also required if client.contact_preference is phone or text; the quote reply is still by email.
The agent’s name and operator are optional. agent.reply_email is included for the team’s reference; An optional HTTPS agent.callback_url is stored with the request only. The server does not call it.
See the field contract and OpenAPI specification for types, limits and examples. Unknown fields are rejected.
Example request
curl 'https://torontoshinecleaning.ca/api/agent-quote.php' \
+ -H 'Content-Type: application/json' \
+ -H 'Idempotency-Key: unique-request-20261001-001' \
+ --data-binary '{
"postal_code": "M5V",
"service": "deep",
"bedrooms": 1,
"bathrooms": 1,
"square_feet": 600,
"frequency": "one_time",
"extras": [
"inside_fridge"
],
"preferred_dates": [
"Please ask me about dates"
],
"preferred_times": [
"Weekday daytime"
],
"client": {
"name": "Alex Example",
"email": "alex@example.com",
"contact_preference": "email",
"callback_requested": false
},
"agent": {
"name": "Personal assistant",
"reply_email": "assistant@example.com"
},
"consent": {
"client_authorized": true
}
}' The response and retries
A successful submission returns HTTP 202 with a request_id, status: "received", the processing note, reply_channel: "email", booking_url and docs_url. Keep the request ID when discussing the quote with the team.
Use a fresh Idempotency-Key for each request. Retrying the same key and exact JSON body within 24 hours returns the same receipt without another submission email. Reusing the key with a different body returns 409. If the outcome is unclear, retry the same key and body rather than creating a new request.
The body limit is 16 KB. Accepted quote submissions are limited to five per IP per rolling hour and 40 site-wide, shared with MCP quote calls. Idempotent replays do not use another quote slot. A 429 includes Retry-After; wait before retrying. Field errors return 400, an oversized body 413, and a non-JSON content type 415. If you receive 503, contact the team before resubmitting.
Connect through MCP
The stateless Streamable HTTP endpoint is https://torontoshinecleaning.ca/api/mcp.php, using protocol version 2025-06-18. It accepts JSON-RPC 2.0 POST requests and responds with JSON. It does not open an SSE stream or require a session ID.
request_cleaning_quote accepts the same fields, authorization rule and quote limits as the REST endpoint. get_business_info takes no arguments and returns the site’s services, service area, contact, booking link and policy facts.
A connection configuration may look like this; use your client’s HTTP connection format:
{
"mcpServers": {
"torontoshinecleaning": {
"type": "http",
"url": "https://torontoshinecleaning.ca/api/mcp.php"
}
}
} Supported methods: initialize, notifications/initialized, tools/list, tools/call and ping. Send Content-Type: application/json and Accept: application/json, text/event-stream. After initialization, send MCP-Protocol-Version: 2025-06-18. An initialized notification returns 202 with no body. Other results and errors use JSON-RPC envelopes.
For quote retries, reuse the HTTP Idempotency-Key and identical tool arguments; the JSON-RPC ID may change. Connection and read-only messages have a separate, higher rolling-hour limit. Browser calls are allowed without credentials.
Permission, privacy and accurate answers
- Ask the person before sending a quote request. Do not submit the human quote form or BookingKoala form on their behalf without their consent.
- Use the site’s own facts and link to the relevant page. Never invent a price, available appointment time or booking confirmation.
- Share only the details needed for the quote. Do not send card details, passwords or access codes.
The request is emailed to the team and kept in private storage for quote processing. See our privacy policy for how personal information is handled.
Machine-readable references: llms.txt, OpenAPI and booking fields.