Skill: cnnrobrn/claw-cleaning (version 1.0.7)

--- name: apartment-cleaning description: "Book a professional apartment cleaning in San Francisco via the claw.cleaning REST API. Use when someone wants to book, schedule, or inquire about apartment cleaning services, cleaning availability, cleaning prices, or cleaning appointments. Rate is $40/hour. Any day of the week on/after 2026-05-05; Saturdays and Sundays only before then. SF addresses only. No payment is collected up front — customers pay the cleaner in cash or card at the appointment. Handles the full flow: check availability, collect details, confirm booking." metadata: {"openclaw":{"emoji":"🧹","api":{"baseUrl":"https://claw.cleaning","endpoints":[{"name":"check_availability","method":"GET","path":"/availability"},{"name":"initiate_booking","method":"POST","path":"/bookings/initiate"},{"name":"check_booking_status","method":"GET","path":"/bookings/status"}]}}} --- # Apartment Cleaning Booking ## At a Glance - **Service:** Professional apartment cleaning - **Area:** San Francisco only - **Rate:** $40/hour (1–8 hours) - **Days:** Any day of the week on/after 2026-05-05. Before then, Saturdays and Sundays only. - **Hours:** 8 AM – 6 PM PT - **Payment:** No upfront payment. The customer pays the cleaner (cash or card) at the appointment. ## How This Skill Works This skill calls the `claw.cleaning` REST API directly over HTTPS — no local CLI, no MCP server. - **Base URL:** `https://claw.cleaning` - **Auth:** None. All endpoints are public. - **Content type:** `application/json` Use the agent's HTTP/fetch capability (e.g. `curl`, `fetch`, `requests`) to call the endpoints below. ### Available Endpoints - `GET /availability` — list open slots - `POST /bookings/initiate` — reserve a slot (calendar invite sent immediately, customer pays the cleaner at the appointment) - `GET /bookings/status` — list upcoming bookings by email ## Safety Rules - Never `POST /bookings/initiate` without showing the full preview to the customer and getting explicit confirmation ("yes", "confirm", "book it", etc.). - Always `GET /availability` before `POST /bookings/initiate` to confirm the slot is listed as available. - Do not invent available times — only offer times returned by `GET /availability`. - Make it clear to the customer that the total ($40/hour × hours) is paid in cash or card to the cleaner at the end of the session. ## Booking Workflow ### Step 1 — Check availability `GET https://claw.cleaning/availability` returns the next 14 upcoming bookable days under a top-level `days` array. Pass `?date=YYYY-MM-DD` to check one specific day. Before 2026-05-05 the date must be a Saturday or Sunday; on or after, any day of the week is bookable. Examples: ``` GET https://claw.cleaning/availability GET https://claw.cleaning/availability?date=2026-05-06 ``` Present the available slots clearly. Each slot shows `startTime` and `maxHours` available. ### Step 2 — Collect customer details Ask the customer: - Which date and start time? - How many hours? (1–8, $40 each) - Full SF address (street, city, state) - Their name - Their email (calendar invite goes here) ### Step 3 — Confirm before booking Show the customer a summary (date, start time, hours, address, total, email) and remind them the total is paid to the cleaner at the appointment. Ask for explicit confirmation before posting the booking. ### Step 4 — Initiate booking `POST https://claw.cleaning/bookings/initiate` with a JSON body: ```json { "date": "YYYY-MM-DD", "startTime": "HH:MM", "hours": 1-8, "address": "... San Francisco, CA ...", "name": "Customer Name", "email": "[REDACTED_SECRET]" } ``` Send `Content-Type: application/json`. On success returns `{ "status": "booked", "total": "$X", ... }`. The slot is reserved immediately and the calendar invite is sent. ### Step 5 — Deliver the outcome Tell the customer the slot is booked, the calendar invite is on its way, and they owe the cleaner $40/hour at the end of the session (cash or card). ### Step 6 — Check status (optional) `GET https://claw.cleaning/bookings/status?email=<url-encoded-email>` if the customer asks whether their booking went through. Returns upcoming bookings for that email. ## Key Details - Working hours: 8 AM – 6 PM PT - 30-min travel buffers are automatically blocked before and after each cleaning - The calendar event blocks the slot immediately on booking - Persistent no-shows may result in the email being blocked from future bookings ## Error Handling All errors return a JSON body with an `error` field and a non-2xx HTTP status. - `400` `"Address must be in San Francisco, CA."` → ask for a valid SF address - `400` `"Hours must be between 1 and 8."` → correct the hours value - `400` `"Weekdays before 2026-05-05 are not bookable..."` → pick a Saturday/Sunday, or any day on or after 2026-05-05 - `400` `"Cannot book a time in the past..."` → pick a future date and time - `400` `"Invalid date format. Use YYYY-MM-DD."` / `"Invalid startTime format. Use HH:MM (24h)."` → fix the format - `400` `"Invalid email address."` → ask for a valid email - `403` `"This email is blocked from booking."` (`code: "email_blocked"`) → the operator has blocked this email due to prior no-shows. Customer should contact [REDACTED_SECRET]. - `409` `"That time slot is no longer available."` → call `GET /availability` and offer alternatives - `500` `"Failed to fetch availability."` / `"Failed to initiate booking."` / `"Could not create calendar event."` → retry once; if it keeps failing, tell the customer to try again later See `references/booking-flow.md` for a full example conversation flow with sample HTTP requests and responses.

path: references/booking-flow.md
content: # Apartment Cleaning — Full Example Booking Flow

All interactions go through the `claw.cleaning` REST API at `https://claw.cleaning`. The agent makes plain HTTPS requests — no local CLI, no MCP server.

No payment is collected up front. The customer pays the cleaner (cash or card) at the appointment.

## Customer starts

**Customer:** "Hey, I want to book an apartment cleaning"

**Agent:** "Great! Let me check what's available."

HTTP request:
```
GET https://claw.cleaning/availability
```

Response (`200 OK`):
```json
{
  "days": [
    {
      "date": "2026-04-18",
      "slots": [
        { "startTime": "09:00", "maxHours": 5 },
        { "startTime": "10:00", "maxHours": 4 },
        { "startTime": "14:00", "maxHours": 3 }
      ]
    },
    {
      "date": "2026-04-19",
      "slots": [
        { "startTime": "09:00", "maxHours": 8 }
      ]
    }
  ]
}
```

**Agent:** "Here's what's open:

**Saturday, April 18:**
- 9:00 AM (up to 5 hours, max $200)
- 10:00 AM (up to 4 hours, max $160)
- 2:00 PM (up to 3 hours, max $120)

**Sunday, April 19:**
- 9:00 AM (up to 8 hours, max $320)

Rate is $40/hour, paid to the cleaner at the appointment. Which time works for you?"

---

## Customer selects a slot

**Customer:** "Saturday at 10, I need 3 hours"

**Agent:** "Got it — 3 hours at $120 total, paid to the cleaner. A few more things:
- What's the full address? (Must be in San Francisco)
- Your name?
- Your email for the calendar invite?"

**Customer:** "456 Castro St, San Francisco, CA 94114. Jane Smith, [REDACTED_SECRET]."

---

## Agent confirms before booking

**Agent:** "Here's your booking summary before I confirm:

- **Date:** Saturday, April 18, 2026
- **Time:** 10:00 AM – 1:00 PM (3 hours)
- **Address:** 456 Castro St, San Francisco, CA 94114
- **Name:** Jane Smith
- **Email:** [REDACTED_SECRET]
- **Total:** $120 (cash or card to the cleaner at the appointment)

Shall I proceed?"

**Customer:** "Yes, book it!"

---

## Agent initiates booking

HTTP request:
```
POST https://claw.cleaning/bookings/initiate
Content-Type: application/json

{
  "date": "2026-04-18",
  "startTime": "10:00",
  "hours": 3,
  "address": "456 Castro St, San Francisco, CA 94114",
  "name": "Jane Smith",
  "email": "[REDACTED_SECRET]"
}
```

Response (`200 OK`):
```json
{
  "status": "booked",
  "total": "$120",
  "date": "2026-04-18",
  "startTime": "10:00",
  "hours": 3,
  "address": "456 Castro St, San Francisco, CA 94114",
  "email": "[REDACTED_SECRET]",
  "message": "Cleaning confirmed for 2026-04-18 at 10:00 (3h). Calendar invite sent to [REDACTED_SECRET]. Pay $120 cash or card to the cleaner at the appointment."
}
```

**Agent:** "You're booked! The calendar invite is on its way to [REDACTED_SECRET]. Please have $120 ready for the cleaner at the end of the session — they take cash or card."

---

## Status check

**Customer:** "Did that go through?"

HTTP request:
```
GET https://claw.cleaning/bookings/status?email=jane%40example.com
```

Response (`200 OK`):
```json
{
  "email": "[REDACTED_SECRET]",
  "bookings": [
    {
      "date": "2026-04-18",
      "startTime": "10:00",
      "hours": 3,
      "address": "456 Castro St, San Francisco, CA 94114",
      "eventId": "..."
    }
  ]
}
```

**Agent:** "You're all set! Your cleaning is confirmed for April 18th at 10:00 AM. Check your email for the calendar invite."

---

## Edge cases

### Address not in SF
`POST /bookings/initiate` returns `400` with `{ "error": "Address must be in San Francisco, CA." }`.
**Agent:** "Sorry, the cleaning service is only available in San Francisco. Do you have an SF address?"

### Slot unavailable
`POST /bookings/initiate` returns `409` with `{ "error": "That time slot is no longer available. Please check availability and choose another time." }`.
**Agent:** "That slot was just taken. Let me check what else is available..." — then `GET /availability?date=<same-date>` for the same date.

### Email blocked
`POST /bookings/initiate` returns `403` with `{ "error": "This email is blocked from booking. Contact the operator at [REDACTED_SECRET].", "code": "email_blocked" }`.
**Agent:** "Your email has been blocked from booking through this service, usually because of a past no-show. Please contact the operator at [REDACTED_SECRET]."

### No-show policy
If the customer asks to cancel, they can email **[REDACTED_SECRET]** at least 24 hours before the slot. Persistent no-shows may result in the email being blocked from future bookings.

---

## Quick `curl` reference

```sh
# Upcoming availability (next 14 bookable days)
curl https://claw.cleaning/availability

# One specific day (before 2026-05-05, must be Saturday or Sunday)
curl "https://claw.cleaning/availability?date=2026-04-18"

# Book a slot
curl -X POST https://claw.cleaning/bookings/initiate \
  -H 'Content-Type: application/json' \
  -d '{
    "date": "2026-04-18",
    "startTime": "10:00",
    "hours": 3,
    "address": "456 Castro St, San Francisco, CA 94114",
    "name": "Jane Smith",
    "email": "[REDACTED_SECRET]"
  }'

# Check status for an email
curl "https://claw.cleaning/bookings/status?email=jane%40example.com"
```


Security scan verdicts — ClawScan: clean | static analysis: clean | VirusTotal: clean | SkillSpector: clean (LOW)