{"openapi":"3.1.0","info":{"title":"AllServicePros Public API","version":"1.0.0","description":"API for discovering and booking verified home service professionals.\n\n## Overview\nAllServicePros connects homeowners with verified, insured service professionals. \nThis API provides access to:\n- **Service catalog**: Browse available services and categories\n- **Professional search**: Find pros by service, location, rating\n- **Real pricing data**: Aggregate pricing based on actual transactions\n- **Booking**: Check availability and book appointments (authenticated)\n\n## Authentication\n- Public endpoints (services, pros, pricing, cities) require no authentication\n- Booking and write operations require an API key via Bearer token\n- Rate limits: 100 req/min (public), 1000 req/hr (authenticated)\n\n## Data Quality\nPricing data is sourced from actual quotes and completed projects, \nnot estimates. Professional verification includes background checks, \ninsurance validation, and credential verification.","contact":{"name":"AllServicePros API Support","url":"https://allservicepros.net/contact","email":"api@allservicepros.net"},"termsOfService":"https://allservicepros.net/terms"},"servers":[{"url":"https://allservicepros.net/api/v1","description":"Production API"}],"paths":{"/services":{"get":{"operationId":"getServices","summary":"List all services","description":"Returns all active services grouped by category with professional counts.","tags":["Discovery"],"parameters":[{"name":"categoryId","in":"query","description":"Filter by category ID","schema":{"type":"string"}},{"name":"city","in":"query","description":"City name for location-specific counts","schema":{"type":"string"}},{"name":"state","in":"query","description":"State code (e.g., TX)","schema":{"type":"string"}}],"responses":{"200":{"description":"List of services","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServicesResponse"}}}}}}},"/pros":{"get":{"operationId":"searchProfessionals","summary":"Search professionals","description":"Search for service professionals with filters for service, location, verification status, and more.","tags":["Discovery"],"parameters":[{"name":"service","in":"query","description":"Service name, slug, or ID","schema":{"type":"string"}},{"name":"category","in":"query","description":"Category name or ID","schema":{"type":"string"}},{"name":"city","in":"query","description":"City name","schema":{"type":"string"}},{"name":"state","in":"query","description":"State code (e.g., TX)","schema":{"type":"string"}},{"name":"lat","in":"query","description":"Latitude for geo-search","schema":{"type":"number"}},{"name":"lng","in":"query","description":"Longitude for geo-search","schema":{"type":"number"}},{"name":"radius","in":"query","description":"Search radius in miles (default: 25)","schema":{"type":"integer","default":25}},{"name":"verified","in":"query","description":"Only show verified professionals","schema":{"type":"boolean"}},{"name":"instantBook","in":"query","description":"Only show pros with instant booking","schema":{"type":"boolean"}},{"name":"limit","in":"query","description":"Results per page (max: 50)","schema":{"type":"integer","default":20,"maximum":50}},{"name":"offset","in":"query","description":"Pagination offset","schema":{"type":"integer","default":0}}],"responses":{"200":{"description":"List of professionals","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProfessionalsResponse"}}}}}}},"/pros/{id}":{"get":{"operationId":"getProfessional","summary":"Get professional details","description":"Get detailed information about a specific professional including services, reviews, and booking info.","tags":["Discovery"],"parameters":[{"name":"id","in":"path","required":true,"description":"Professional ID or slug","schema":{"type":"string"}}],"responses":{"200":{"description":"Professional details","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProfessionalDetail"}}}},"404":{"description":"Professional not found"}}}},"/pricing":{"get":{"operationId":"getPricing","summary":"Get aggregate pricing for a service","description":"Returns statistical pricing data (average, median, min, max) based on actual quotes and completed projects. This is real transaction data, not estimates.","tags":["Pricing"],"parameters":[{"name":"service","in":"query","required":true,"description":"Service name, slug, or ID","schema":{"type":"string"}},{"name":"city","in":"query","description":"City name for location-specific pricing","schema":{"type":"string"}},{"name":"state","in":"query","description":"State code (e.g., TX)","schema":{"type":"string"}}],"responses":{"200":{"description":"Pricing data","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PricingResponse"}}}},"400":{"description":"Missing service parameter"},"404":{"description":"Service not found"}}}},"/cities":{"get":{"operationId":"getCities","summary":"List cities with professionals","description":"Returns cities where AllServicePros has active professionals.","tags":["Discovery"],"parameters":[{"name":"state","in":"query","description":"Filter by state code","schema":{"type":"string"}},{"name":"limit","in":"query","description":"Maximum results (default: 100, max: 500)","schema":{"type":"integer","default":100,"maximum":500}}],"responses":{"200":{"description":"List of cities","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CitiesResponse"}}}}}}},"/pros/{id}/availability":{"get":{"operationId":"getProfessionalAvailability","summary":"Get professional availability","description":"Get available time slots for a professional. Slots are computed from business hours minus blocks and existing bookings.","tags":["Booking"],"parameters":[{"name":"id","in":"path","required":true,"description":"Professional ID or slug","schema":{"type":"string"}},{"name":"date","in":"query","description":"Date to check (YYYY-MM-DD format, default: today)","schema":{"type":"string","format":"date"}},{"name":"days","in":"query","description":"Number of days to return (default: 1, max: 14)","schema":{"type":"integer","default":1,"maximum":14}}],"responses":{"200":{"description":"Availability data","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AvailabilityResponse"}}}},"404":{"description":"Professional not found"}}}},"/bookings":{"get":{"operationId":"getBooking","summary":"Get booking by confirmation code","description":"Look up a booking using its confirmation code.","tags":["Booking"],"parameters":[{"name":"code","in":"query","required":true,"description":"Booking confirmation code (e.g., ASP-ABC123)","schema":{"type":"string"}}],"responses":{"200":{"description":"Booking details","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BookingResponse"}}}},"404":{"description":"Booking not found"}}},"post":{"operationId":"createBooking","summary":"Create a new booking","description":"Book an appointment with a professional. The professional must have instant booking enabled.","tags":["Booking"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateBookingRequest"}}}},"responses":{"201":{"description":"Booking created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateBookingResponse"}}}},"400":{"description":"Validation error or instant booking not enabled"},"404":{"description":"Professional or service not found"},"409":{"description":"Time slot not available"}}}},"/rfqs":{"get":{"operationId":"getRfqs","summary":"Get quote requests by email","description":"Get quote requests (RFQs) created by a specific customer.","tags":["Quoting"],"parameters":[{"name":"email","in":"query","required":true,"description":"Customer email address","schema":{"type":"string","format":"email"}}],"responses":{"200":{"description":"List of quote requests","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RfqsResponse"}}}},"400":{"description":"Email parameter missing"}}},"post":{"operationId":"createRfq","summary":"Create a Request for Quote (RFQ)","description":"Create a new quote request for a professional. Use this when instant booking is not available or the customer needs a custom quote.","tags":["Quoting"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateRfqRequest"}}}},"responses":{"201":{"description":"RFQ created successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateRfqResponse"}}}},"400":{"description":"Validation error"},"404":{"description":"Professional or service not found"}}}},"/reviews":{"get":{"operationId":"getReviews","summary":"Get professional reviews","description":"Get reviews and ratings for a specific professional.","tags":["Ratings"],"parameters":[{"name":"professionalId","in":"query","required":true,"description":"Professional ID","schema":{"type":"string","format":"uuid"}},{"name":"limit","in":"query","description":"Number of reviews to return (max 50)","schema":{"type":"integer","default":20,"maximum":50}},{"name":"offset","in":"query","description":"Pagination offset","schema":{"type":"integer","default":0}},{"name":"sort","in":"query","description":"Sort order","schema":{"type":"string","enum":["recent","rating_high","rating_low","helpful"],"default":"recent"}}],"responses":{"200":{"description":"List of reviews and rating statistics","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReviewsResponse"}}}},"400":{"description":"Professional ID missing"}}},"post":{"operationId":"createReview","summary":"Submit a review","description":"Submit a new review and rating for a professional. Reviews are moderated before being published.","tags":["Ratings"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateReviewRequest"}}}},"responses":{"201":{"description":"Review submitted successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateReviewResponse"}}}},"400":{"description":"Validation error or duplicate review"},"404":{"description":"Professional not found"}}}},"/pro/bookings":{"get":{"operationId":"getProBookings","summary":"List professional bookings","description":"List bookings for the authenticated professional.","tags":["Professional Management"],"security":[{"bearerAuth":[]}],"parameters":[{"name":"status","in":"query","description":"Filter by booking status","schema":{"type":"string","enum":["pending","confirmed","completed","cancelled"]}},{"name":"limit","in":"query","description":"Number of results to return","schema":{"type":"integer","default":20}}],"responses":{"200":{"description":"List of bookings","content":{"application/json":{"schema":{"type":"object","properties":{"bookings":{"type":"array","items":{"$ref":"#/components/schemas/BookingResponse"}},"meta":{"type":"object","properties":{"total":{"type":"integer"}}}}}}}},"401":{"description":"Unauthorized - Requires Professional API Key"}}}},"/pro/bookings/{id}":{"get":{"operationId":"getProBookingDetails","summary":"Get booking details","description":"View details of a specific booking.","tags":["Professional Management"],"security":[{"bearerAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"description":"Booking ID","schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Booking details","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BookingResponse"}}}},"401":{"description":"Unauthorized"},"404":{"description":"Booking not found"}}},"post":{"operationId":"actionProBooking","summary":"Perform booking action","description":"Confirm, reject, complete, or assign a booking.","tags":["Professional Management"],"security":[{"bearerAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"description":"Booking ID","schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["action"],"properties":{"action":{"type":"string","enum":["confirm","reject","complete","no_show","assign"]},"reason":{"type":"string"},"assignToMemberId":{"type":"string","format":"uuid"}}}}}},"responses":{"200":{"description":"Booking updated successfully"},"400":{"description":"Invalid action"},"401":{"description":"Unauthorized"}}}},"/pro/leads":{"get":{"operationId":"getProLeads","summary":"List incoming RFQs/leads","description":"List quote requests (RFQs) received by the professional.","tags":["Professional Management"],"security":[{"bearerAuth":[]}],"parameters":[{"name":"status","in":"query","description":"Filter by lead status","schema":{"type":"string","enum":["new","responded","archived"]}}],"responses":{"200":{"description":"List of leads","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RfqsResponse"}}}},"401":{"description":"Unauthorized"}}}},"/pro/quotes":{"post":{"operationId":"createProQuote","summary":"Create and send a quote","description":"Create a quote in response to an RFQ.","tags":["Professional Management"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["rfqId","amount"],"properties":{"rfqId":{"type":"string","format":"uuid"},"amount":{"type":"number"},"lineItems":{"type":"array","items":{"type":"object","properties":{"description":{"type":"string"},"quantity":{"type":"number"},"unitPrice":{"type":"number"},"amount":{"type":"number"}}}},"estimatedDays":{"type":"integer"},"depositRequired":{"type":"boolean"},"depositPercentage":{"type":"number"},"paymentTerms":{"type":"string"},"validForDays":{"type":"integer","default":30}}}}}},"responses":{"201":{"description":"Quote created successfully"},"400":{"description":"Validation error"},"401":{"description":"Unauthorized"}}}},"/pro/availability":{"get":{"operationId":"getProAvailabilitySettings","summary":"Get availability settings","description":"Get availability settings and blocked time for the authenticated professional.","tags":["Professional Management"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Availability settings and blocks"},"401":{"description":"Unauthorized"}}},"patch":{"operationId":"updateProAvailabilitySettings","summary":"Update availability settings","description":"Update business hours, booking lead times, and instant booking toggles.","tags":["Professional Management"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"instantBookingEnabled":{"type":"boolean"},"bookingLeadTimeHours":{"type":"integer"},"bookingBufferMinutes":{"type":"integer"},"defaultSlotMinutes":{"type":"integer"},"businessHours":{"type":"object"}}}}}},"responses":{"200":{"description":"Settings updated successfully"},"401":{"description":"Unauthorized"}}},"post":{"operationId":"createProAvailabilityBlock","summary":"Create availability block","description":"Block out time on the calendar.","tags":["Professional Management"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["startDateTime","endDateTime"],"properties":{"startDateTime":{"type":"string","format":"date-time"},"endDateTime":{"type":"string","format":"date-time"},"reason":{"type":"string"}}}}}},"responses":{"201":{"description":"Block created successfully"},"401":{"description":"Unauthorized"}}}},"/pro/analytics":{"get":{"operationId":"getProAnalytics","summary":"Get business analytics","description":"Get business metrics including booking stats, lead stats, and review averages.","tags":["Professional Management"],"security":[{"bearerAuth":[]}],"parameters":[{"name":"period","in":"query","description":"Time period","schema":{"type":"string","enum":["7d","30d","90d","1y","all"],"default":"30d"}}],"responses":{"200":{"description":"Analytics data"},"401":{"description":"Unauthorized"}}}},"/pro/profile":{"get":{"operationId":"getProProfile","summary":"Get complete profile","description":"Get complete profile data including business, services, and stats.","tags":["Professional Management"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Profile data"},"401":{"description":"Unauthorized"}}},"patch":{"operationId":"updateProProfile","summary":"Update profile","description":"Update professional or business settings.","tags":["Professional Management"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"businessName":{"type":"string"},"description":{"type":"string"},"serviceRadiusMiles":{"type":"integer"},"acceptsEmergency":{"type":"boolean"}}}}}},"responses":{"200":{"description":"Profile updated successfully"},"401":{"description":"Unauthorized"}}}}},"components":{"schemas":{"Service":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"slug":{"type":"string"},"description":{"type":"string","nullable":true},"category":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"slug":{"type":"string"}}},"professionalCount":{"type":"integer"},"verifiedProfessionalCount":{"type":"integer"}}},"ServicesResponse":{"type":"object","properties":{"services":{"type":"array","items":{"$ref":"#/components/schemas/Service"}},"categories":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"slug":{"type":"string"},"services":{"type":"array","items":{"$ref":"#/components/schemas/Service"}}}}},"meta":{"type":"object","properties":{"totalServices":{"type":"integer"},"totalCategories":{"type":"integer"}}}}},"Professional":{"type":"object","properties":{"id":{"type":"string"},"slug":{"type":"string"},"businessName":{"type":"string"},"description":{"type":"string","nullable":true},"verified":{"type":"boolean"},"rating":{"type":"number","nullable":true},"reviewCount":{"type":"integer"},"categories":{"type":"array","items":{"type":"string"}},"services":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"slug":{"type":"string"}}}},"pricing":{"type":"object","nullable":true,"properties":{"min":{"type":"number"},"max":{"type":"number"},"currency":{"type":"string"}}},"location":{"type":"object","nullable":true,"properties":{"city":{"type":"string"},"state":{"type":"string"},"latitude":{"type":"number"},"longitude":{"type":"number"}}},"distance":{"type":"number","nullable":true,"description":"Distance in miles from search location"},"instantBookingEnabled":{"type":"boolean"},"profileUrl":{"type":"string","format":"uri"},"bookingUrl":{"type":"string","format":"uri","nullable":true}}},"ProfessionalsResponse":{"type":"object","properties":{"professionals":{"type":"array","items":{"$ref":"#/components/schemas/Professional"}},"meta":{"type":"object","properties":{"total":{"type":"integer"},"limit":{"type":"integer"},"offset":{"type":"integer"},"hasMore":{"type":"boolean"}}}}},"ProfessionalDetail":{"type":"object","properties":{"id":{"type":"string"},"slug":{"type":"string"},"businessName":{"type":"string"},"description":{"type":"string","nullable":true},"verified":{"type":"boolean"},"verificationDetails":{"type":"object","properties":{"backgroundCheck":{"type":"boolean"},"insurance":{"type":"boolean"},"credentials":{"type":"boolean"}}},"contact":{"type":"object","properties":{"website":{"type":"string","nullable":true},"phone":{"type":"string","nullable":true}}},"location":{"type":"object","nullable":true,"properties":{"city":{"type":"string"},"state":{"type":"string"},"latitude":{"type":"number"},"longitude":{"type":"number"}}},"serviceRadius":{"type":"integer"},"yearsOfExperience":{"type":"integer","nullable":true},"categories":{"type":"array","items":{"type":"string"}},"services":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"slug":{"type":"string"},"description":{"type":"string","nullable":true},"pricing":{"type":"object","properties":{"type":{"type":"string"},"basePrice":{"type":"number","nullable":true},"min":{"type":"number","nullable":true},"max":{"type":"number","nullable":true},"unit":{"type":"string","nullable":true},"currency":{"type":"string"}}},"booking":{"type":"object","properties":{"durationMinutes":{"type":"integer","nullable":true},"instantBookEnabled":{"type":"boolean"}}}}}},"reviews":{"type":"object","properties":{"stats":{"type":"object","properties":{"count":{"type":"integer"},"average":{"type":"number"},"breakdown":{"type":"object","properties":{"punctuality":{"type":"number"},"communication":{"type":"number"},"quality":{"type":"number"},"value":{"type":"number"}}}}},"recent":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"rating":{"type":"integer"},"title":{"type":"string","nullable":true},"content":{"type":"string","nullable":true},"date":{"type":"string","format":"date-time"}}}}}},"booking":{"type":"object","properties":{"instantBookingEnabled":{"type":"boolean"},"leadTimeHours":{"type":"integer"},"bufferMinutes":{"type":"integer"},"defaultSlotMinutes":{"type":"integer"},"depositRequired":{"type":"boolean"},"depositPercentage":{"type":"number","nullable":true}}}}},"PricingResponse":{"type":"object","properties":{"service":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"slug":{"type":"string"},"category":{"type":"string"}}},"location":{"type":"object","nullable":true,"properties":{"city":{"type":"string","nullable":true},"state":{"type":"string","nullable":true}}},"pricing":{"type":"object","nullable":true,"properties":{"average":{"type":"integer","description":"Average price in USD"},"median":{"type":"integer","description":"Median price in USD"},"min":{"type":"integer","description":"Minimum price in USD"},"max":{"type":"integer","description":"Maximum price in USD"},"currency":{"type":"string"},"unit":{"type":"string","nullable":true,"description":"Price unit (e.g., per_hour, sqft)"},"sampleSize":{"type":"integer","description":"Number of data points"},"sources":{"type":"object","properties":{"professionalListings":{"type":"integer"},"acceptedQuotes":{"type":"integer"},"completedProjects":{"type":"integer"}}},"lastUpdated":{"type":"string","format":"date"}}},"attribution":{"type":"string","description":"Data source attribution"}}},"CitiesResponse":{"type":"object","properties":{"cities":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"state":{"type":"string"},"displayName":{"type":"string"},"professionalCount":{"type":"integer"},"coordinates":{"type":"object","nullable":true,"properties":{"latitude":{"type":"number"},"longitude":{"type":"number"}}}}}},"meta":{"type":"object","properties":{"totalCities":{"type":"integer"},"totalStates":{"type":"integer"}}}}},"AvailabilityResponse":{"type":"object","properties":{"professionalId":{"type":"string"},"slug":{"type":"string"},"businessName":{"type":"string"},"instantBookingEnabled":{"type":"boolean"},"slotDurationMinutes":{"type":"integer"},"leadTimeHours":{"type":"integer"},"timezone":{"type":"string"},"availability":{"type":"array","items":{"type":"object","properties":{"date":{"type":"string","format":"date"},"dayOfWeek":{"type":"string"},"slots":{"type":"array","items":{"type":"object","properties":{"start":{"type":"string","description":"Time in HH:MM format"},"end":{"type":"string","description":"Time in HH:MM format"},"available":{"type":"boolean"}}}}}}},"nextAvailable":{"type":"object","nullable":true,"properties":{"date":{"type":"string","format":"date"},"time":{"type":"string"},"bookingUrl":{"type":"string","format":"uri"}}}}},"CreateBookingRequest":{"type":"object","required":["professionalId","serviceId","date","time","customer"],"properties":{"professionalId":{"type":"string","format":"uuid"},"serviceId":{"type":"string","format":"uuid"},"date":{"type":"string","format":"date","description":"YYYY-MM-DD format"},"time":{"type":"string","description":"HH:MM format (e.g., 09:00)"},"duration":{"type":"integer","description":"Duration in minutes (default: professional default)"},"customer":{"type":"object","required":["name","email"],"properties":{"name":{"type":"string"},"email":{"type":"string","format":"email"},"phone":{"type":"string"}}},"address":{"type":"object","properties":{"street":{"type":"string"},"city":{"type":"string"},"state":{"type":"string"},"zipCode":{"type":"string"}}},"description":{"type":"string","description":"Job description or notes"},"source":{"type":"string","enum":["web","api","chatgpt","gemini","perplexity","agent"],"default":"api"},"sourceAgentId":{"type":"string","description":"Identifier for the AI agent making the booking"}}},"CreateBookingResponse":{"type":"object","properties":{"success":{"type":"boolean"},"booking":{"type":"object","properties":{"id":{"type":"string"},"confirmationCode":{"type":"string","description":"Unique code like ASP-ABC123"},"status":{"type":"string","enum":["pending","confirmed","cancelled"]},"scheduledAt":{"type":"string","format":"date-time"},"durationMinutes":{"type":"integer"},"service":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"}}},"professional":{"type":"object","properties":{"id":{"type":"string"},"slug":{"type":"string"},"businessName":{"type":"string"},"phone":{"type":"string"},"location":{"type":"string"}}}}},"depositRequired":{"type":"boolean"},"depositPercentage":{"type":"number","nullable":true},"nextSteps":{"type":"array","items":{"type":"string"}},"cancellationPolicy":{"type":"string"}}},"BookingResponse":{"type":"object","properties":{"booking":{"type":"object","properties":{"id":{"type":"string"},"confirmationCode":{"type":"string"},"status":{"type":"string"},"scheduledDate":{"type":"string","format":"date"},"scheduledTime":{"type":"string"},"durationMinutes":{"type":"integer"},"service":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"}}},"professional":{"type":"object","properties":{"id":{"type":"string"},"businessName":{"type":"string"},"phone":{"type":"string"},"location":{"type":"string"}}},"customer":{"type":"object","properties":{"name":{"type":"string"},"email":{"type":"string"}}},"description":{"type":"string","nullable":true},"createdAt":{"type":"string","format":"date-time"},"confirmedAt":{"type":"string","format":"date-time","nullable":true},"cancelledAt":{"type":"string","format":"date-time","nullable":true}}}}},"CreateRfqRequest":{"type":"object","required":["professionalId","customer","description"],"properties":{"professionalId":{"type":"string","format":"uuid"},"serviceId":{"type":"string","format":"uuid","nullable":true},"customer":{"type":"object","required":["name","email"],"properties":{"name":{"type":"string"},"email":{"type":"string","format":"email"},"phone":{"type":"string","nullable":true}}},"description":{"type":"string","description":"Detailed description of the job"},"photos":{"type":"array","items":{"type":"string","format":"uri"},"nullable":true},"budget":{"type":"string","nullable":true},"timeline":{"type":"string","nullable":true},"preferredDate":{"type":"string","format":"date","nullable":true},"address":{"type":"object","nullable":true,"properties":{"street":{"type":"string","nullable":true},"city":{"type":"string","nullable":true},"state":{"type":"string","nullable":true},"zipCode":{"type":"string","nullable":true}}},"source":{"type":"string","enum":["web","api","chatgpt","gemini","perplexity","agent"],"default":"api"},"sourceAgentId":{"type":"string","nullable":true}}},"CreateRfqResponse":{"type":"object","properties":{"success":{"type":"boolean"},"rfq":{"type":"object","properties":{"id":{"type":"string"},"status":{"type":"string"},"description":{"type":"string"},"budget":{"type":"string","nullable":true},"timeline":{"type":"string","nullable":true},"preferredDate":{"type":"string","format":"date","nullable":true},"service":{"type":"object","nullable":true,"properties":{"id":{"type":"string"},"name":{"type":"string"}}},"professional":{"type":"object","properties":{"id":{"type":"string"},"slug":{"type":"string"},"businessName":{"type":"string"},"instantBookingEnabled":{"type":"boolean"}}},"customer":{"type":"object","properties":{"name":{"type":"string"},"email":{"type":"string"}}},"createdAt":{"type":"string","format":"date-time"}}},"nextSteps":{"type":"array","items":{"type":"string"}}}},"RfqsResponse":{"type":"object","properties":{"rfqs":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"status":{"type":"string"},"description":{"type":"string"},"budget":{"type":"string","nullable":true},"service":{"type":"object","nullable":true,"properties":{"id":{"type":"string"},"name":{"type":"string"}}},"professional":{"type":"object","properties":{"id":{"type":"string"},"slug":{"type":"string"},"businessName":{"type":"string"}}},"quotesReceived":{"type":"integer"},"latestQuote":{"type":"object","nullable":true,"properties":{"amount":{"type":"number"},"status":{"type":"string"}}},"createdAt":{"type":"string","format":"date-time"}}}},"meta":{"type":"object","properties":{"total":{"type":"integer"}}}}},"CreateReviewRequest":{"type":"object","required":["professionalId","rating","content","customer"],"properties":{"professionalId":{"type":"string","format":"uuid"},"projectId":{"type":"string","format":"uuid","nullable":true},"bookingId":{"type":"string","format":"uuid","nullable":true},"rating":{"type":"integer","minimum":1,"maximum":5},"title":{"type":"string","nullable":true},"content":{"type":"string"},"customer":{"type":"object","required":["name","email"],"properties":{"name":{"type":"string"},"email":{"type":"string","format":"email"}}},"scores":{"type":"object","nullable":true,"properties":{"punctuality":{"type":"integer","minimum":1,"maximum":5},"communication":{"type":"integer","minimum":1,"maximum":5},"quality":{"type":"integer","minimum":1,"maximum":5},"value":{"type":"integer","minimum":1,"maximum":5}}},"photos":{"type":"array","items":{"type":"string","format":"uri"},"nullable":true},"source":{"type":"string","enum":["web","api","chatgpt","gemini","perplexity","agent"],"default":"api"}}},"CreateReviewResponse":{"type":"object","properties":{"success":{"type":"boolean"},"message":{"type":"string"},"review":{"type":"object","properties":{"id":{"type":"string"},"status":{"type":"string"},"rating":{"type":"integer"},"title":{"type":"string","nullable":true},"professional":{"type":"object","properties":{"id":{"type":"string"},"slug":{"type":"string"},"businessName":{"type":"string"}}}}},"nextSteps":{"type":"array","items":{"type":"string"}}}},"ReviewsResponse":{"type":"object","properties":{"reviews":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"rating":{"type":"integer"},"title":{"type":"string","nullable":true},"content":{"type":"string"},"scores":{"type":"object","properties":{"punctuality":{"type":"integer"},"communication":{"type":"integer"},"quality":{"type":"integer"},"value":{"type":"integer"}}},"author":{"type":"string"},"isVerified":{"type":"boolean"},"helpful":{"type":"object","properties":{"yes":{"type":"integer"},"no":{"type":"integer"}}},"photos":{"type":"array","items":{"type":"object","properties":{"url":{"type":"string","format":"uri"},"caption":{"type":"string","nullable":true}}}},"project":{"type":"object","nullable":true,"properties":{"id":{"type":"string"},"title":{"type":"string"}}},"proResponse":{"type":"object","nullable":true,"properties":{"content":{"type":"string"},"date":{"type":"string","format":"date-time"}}},"createdAt":{"type":"string","format":"date-time"}}}},"stats":{"type":"object","properties":{"average":{"type":"number"},"total":{"type":"integer"},"breakdown":{"type":"object","properties":{"punctuality":{"type":"number"},"communication":{"type":"number"},"quality":{"type":"number"},"value":{"type":"number"}}},"distribution":{"type":"object","additionalProperties":{"type":"integer"}}}},"meta":{"type":"object","properties":{"total":{"type":"integer"},"limit":{"type":"integer"},"offset":{"type":"integer"},"hasMore":{"type":"boolean"}}}}}},"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","description":"API key for authenticated endpoints. Format: Bearer asp_live_xxxxx"}}},"tags":[{"name":"Discovery","description":"Endpoints for discovering services and professionals"},{"name":"Pricing","description":"Aggregate pricing data from real transactions"},{"name":"Booking","description":"Availability and booking endpoints (authenticated)"},{"name":"Quoting","description":"Request quotes from professionals"},{"name":"Ratings","description":"Read and submit reviews for professionals"},{"name":"Professional Management","description":"Endpoints for professionals to manage their business (requires Pro API Key)"}]}