{"openapi":"3.1.0","info":{"title":"HireLocksmiths Agent Lead API","description":"Find listed U.S. locksmiths and request a quote (creates a lead). Two doors, one engine: the same data powers the human site and this agent API.","version":"1.8.6","contact":{"url":"https:\/\/hirelocksmiths.com"}},"servers":[{"url":"https:\/\/hirelocksmiths.com\/wp-json\/hl\/v1"}],"paths":{"\/agent\/search":{"get":{"operationId":"search_locksmiths","summary":"Search listed locksmiths by location, service and urgency.","parameters":[{"name":"location","in":"query","required":true,"schema":{"type":"string"},"description":"5-digit ZIP or US city name."},{"name":"service","in":"query","required":false,"schema":{"type":"string"},"description":"e.g. lockout, automotive, residential, commercial, rekey, install, safe."},{"name":"urgency","in":"query","required":false,"schema":{"type":"string"},"description":"e.g. emergency, today, scheduled."},{"name":"budget","in":"query","required":false,"schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":20,"default":5}}],"responses":{"200":{"description":"Ranked list of listed locksmiths."}}}},"\/agent\/locksmith\/{id}":{"get":{"operationId":"get_locksmith","summary":"Full profile for one locksmith by id.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Provider profile."},"404":{"description":"Not found."}}}},"\/agent\/quote":{"post":{"operationId":"request_quote","summary":"Create a lead: ask a specific locksmith for a quote. Only call when the user wants to be contacted.","requestBody":{"required":true,"content":{"application\/json":{"schema":{"type":"object","required":["locksmith_id"],"properties":{"locksmith_id":{"type":"string","description":"id from search_locksmiths\/get_locksmith."},"service":{"type":"string"},"zip":{"type":"string"},"name":{"type":"string"},"phone":{"type":"string","description":"The customer's REAL mobile number \u2014 the locksmith calls it back. Placeholders (555-01xx, 555-1234, 000-0000) are rejected with 400 contact_required. Phone or a real email required."},"email":{"type":"string"},"details":{"type":"string","description":"Free-text job description."},"urgency":{"type":"string"}}}}}},"responses":{"200":{"description":"Lead created; locksmith notified."},"400":{"description":"Missing contact or invalid input."},"404":{"description":"Unknown locksmith."},"402":{"description":"Payment required (only if x402 metering is enabled)."}}}},"\/agent\/book":{"post":{"operationId":"book_job","summary":"Create a booking-intent lead (firmer than a quote; supports preferred_time). Confirmed by the locksmith \u2014 not a guaranteed appointment. Only call when the user wants to book.","requestBody":{"required":true,"content":{"application\/json":{"schema":{"type":"object","required":["locksmith_id"],"properties":{"locksmith_id":{"type":"string"},"name":{"type":"string"},"phone":{"type":"string","description":"The customer's REAL mobile number (placeholders are rejected). Phone or a real email required."},"email":{"type":"string"},"zip":{"type":"string"},"service":{"type":"string"},"preferred_time":{"type":"string","description":"Requested time window, e.g. \"today 3-5pm\"."},"details":{"type":"string"},"urgency":{"type":"string"}}}}}},"responses":{"200":{"description":"Booking request created; locksmith notified."},"400":{"description":"Missing contact."},"404":{"description":"Unknown locksmith."}}}},"\/agent\/availability":{"get":{"operationId":"check_availability","summary":"Coverage signal for a provider or area. Live availability is confirmed at request_quote (not pre-tracked).","parameters":[{"name":"id","in":"query","required":false,"schema":{"type":"string"},"description":"Locksmith id; or use location."},{"name":"location","in":"query","required":false,"schema":{"type":"string"},"description":"5-digit ZIP or city."}],"responses":{"200":{"description":"Coverage + emergency-capability summary."}}}},"\/agent\/eta":{"get":{"operationId":"get_eta","summary":"Coverage\/emergency proxy for a location. eta_minutes is null \u2014 a live ETA comes from the locksmith after request_quote.","parameters":[{"name":"location","in":"query","required":true,"schema":{"type":"string"},"description":"5-digit ZIP or city."}],"responses":{"200":{"description":"Provider count + emergency coverage; eta_minutes null."}}}}}}