{"openapi":"3.1.0","info":{"title":"Brad Paws Public API","version":"1.0.0","summary":"Services, rates, and meet & greet requests for Brad Paws, a one-person dog walking and pet care business in San Francisco.","description":"Read-only service and rate lookup plus a meet & greet request endpoint. No authentication, no API key, no rate plan — call it directly.\n\nFor anything account-specific (a client's bookings, invoices, availability, or making a booking), use the Brad Paws MCP server at https://bradpaws.com/mcp, which authenticates the pet owner over OAuth 2.1 with dynamic client registration.","contact":{"name":"Brad Paws","email":"hello@bradpaws.com","url":"https://bradpaws.com"},"license":{"name":"Proprietary","identifier":"LicenseRef-Proprietary"}},"servers":[{"url":"https://bradpaws.com","description":"Production"}],"externalDocs":{"description":"API and MCP documentation","url":"https://bradpaws.com/docs"},"tags":[{"name":"catalog","description":"Services, rates, and service area."},{"name":"onboarding","description":"Becoming a client."},{"name":"ops","description":"Service health."}],"paths":{"/api/services":{"get":{"operationId":"listServices","tags":["catalog"],"summary":"List services, starting rates, and service area","description":"Returns every service Brad Paws offers with its starting per-unit rate in USD, who can book it, and the San Francisco neighborhoods covered. Use this to answer pricing, availability, and coverage questions without asking the customer.","responses":{"200":{"description":"The service catalog.","content":{"application/json":{"schema":{"type":"object","required":["services","neighborhoods","cancellationPolicy","contact"],"properties":{"services":{"type":"array","items":{"type":"object","required":["id","name","rate","unit","description","availability"],"properties":{"id":{"type":"string","enum":["walk","boarding","house-sit","check-in"],"description":"Stable service identifier, also the booking type used by the MCP server."},"name":{"type":"string","description":"Display name of the service."},"rate":{"type":"number","description":"Starting per-unit rate in USD."},"unit":{"type":"string","enum":["walk","night","visit"],"description":"The unit the rate is quoted in. Boarding and house sitting are per night."},"description":{"type":"string","description":"What the service includes."},"availability":{"type":"string","description":"Who can book it and under what terms."}}}},"neighborhoods":{"type":"array","items":{"type":"string"},"description":"San Francisco neighborhoods served, all walked on foot."},"cancellationPolicy":{"type":"string"},"contact":{"type":"object","properties":{"email":{"type":"string","format":"email"},"instagram":{"type":"string","format":"uri"},"area":{"type":"string"},"hours":{"type":"string"}}}}}}}}}}},"/api/meet-greet":{"post":{"operationId":"requestMeetGreet","tags":["onboarding"],"summary":"Request a free meet & greet","description":"Submits a request for a free 30-minute meet & greet — the only way to become a new client. Brad replies by phone or email within a day or two; this does not book a walk. Rate limited per IP.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["name","phone","petName","neighborhood"],"properties":{"name":{"type":"string","maxLength":120,"description":"The owner's full name."},"phone":{"type":"string","maxLength":40,"description":"Contact phone number."},"email":{"type":"string","format":"email","maxLength":200},"petName":{"type":"string","maxLength":160},"petType":{"type":"string","maxLength":200,"description":"Species or breed, e.g. \"goldendoodle\" or \"cat\"."},"neighborhood":{"type":"string","maxLength":120,"description":"San Francisco neighborhood the pet lives in."},"servicesInterested":{"type":"array","description":"Which services the owner is interested in.","items":{"type":"string","enum":["walks","boarding","house-sitting"]}},"note":{"type":"string","maxLength":2000}}}}}},"responses":{"200":{"description":"Request accepted.","content":{"application/json":{"schema":{"type":"object","required":["ok"],"properties":{"ok":{"type":"boolean"}}}}}},"400":{"description":"The body failed validation.","content":{"application/json":{"schema":{"type":"object","description":"Structured error body returned by every /api endpoint.","required":["error","code"],"properties":{"error":{"type":"string","description":"Human-readable message, safe to show a customer."},"code":{"type":"string","description":"Stable machine-readable code, e.g. not_found, invalid_request, rate_limited."},"hint":{"type":"string","description":"Suggested next step for the caller."}}}}}},"429":{"description":"Too many requests from this IP. Retry after the Retry-After header.","content":{"application/json":{"schema":{"type":"object","description":"Structured error body returned by every /api endpoint.","required":["error","code"],"properties":{"error":{"type":"string","description":"Human-readable message, safe to show a customer."},"code":{"type":"string","description":"Stable machine-readable code, e.g. not_found, invalid_request, rate_limited."},"hint":{"type":"string","description":"Suggested next step for the caller."}}}}}}}}},"/api/health":{"get":{"operationId":"getHealth","tags":["ops"],"summary":"Service health","description":"Reports whether the site and its database are reachable.","responses":{"200":{"description":"Healthy.","content":{"application/json":{"schema":{"type":"object","required":["status"],"properties":{"status":{"type":"string","enum":["ok"]}}}}}},"503":{"description":"Degraded — the database is unreachable.","content":{"application/json":{"schema":{"type":"object","properties":{"status":{"type":"string","enum":["degraded"]},"db":{"type":"string"}}}}}}}}}},"components":{"schemas":{"Service":{"type":"object","required":["id","name","rate","unit","description","availability"],"properties":{"id":{"type":"string","enum":["walk","boarding","house-sit","check-in"],"description":"Stable service identifier, also the booking type used by the MCP server."},"name":{"type":"string","description":"Display name of the service."},"rate":{"type":"number","description":"Starting per-unit rate in USD."},"unit":{"type":"string","enum":["walk","night","visit"],"description":"The unit the rate is quoted in. Boarding and house sitting are per night."},"description":{"type":"string","description":"What the service includes."},"availability":{"type":"string","description":"Who can book it and under what terms."}}},"Error":{"type":"object","description":"Structured error body returned by every /api endpoint.","required":["error","code"],"properties":{"error":{"type":"string","description":"Human-readable message, safe to show a customer."},"code":{"type":"string","description":"Stable machine-readable code, e.g. not_found, invalid_request, rate_limited."},"hint":{"type":"string","description":"Suggested next step for the caller."}}}}}}