{"openapi":"3.1.0","info":{"title":"Locafirms API","version":"1.0.0","description":"Read-only public API. Retrieval and citation with attribution; training/bulk copying not permitted without permission. 60 requests/minute per client."},"servers":[{"url":"https://locafirms.com"}],"paths":{"/api/v1/search":{"get":{"operationId":"searchBusinesses","summary":"Search businesses","parameters":[{"name":"q","in":"query","description":"Keywords or business name","schema":{"type":"string"}},{"name":"category","in":"query","description":"Category slug","schema":{"type":"string"}},{"name":"place","in":"query","description":"City, 'City, ST' or state","schema":{"type":"string"}},{"name":"lat","in":"query","description":"Latitude","schema":{"type":"number"}},{"name":"lon","in":"query","description":"Longitude","schema":{"type":"number"}},{"name":"radius_km","in":"query","description":"Radius, default 25","schema":{"type":"number"}},{"name":"sort","in":"query","description":"relevance|nearest|recent","schema":{"type":"string"}},{"name":"verified_only","in":"query","description":"true to only return verified","schema":{"type":"boolean"}},{"name":"limit","in":"query","description":"1-25","schema":{"type":"integer"}},{"name":"cursor","in":"query","description":"Opaque cursor from next_cursor","schema":{"type":"string"}}],"responses":{"200":{"description":"Results with canonical URLs, status, attribution","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SearchResponse"}}}},"429":{"description":"Rate limited"}}}},"/api/v1/businesses/{id}":{"get":{"operationId":"getBusiness","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Business","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Business"}}}},"404":{"description":"Not found"}}}},"/api/v1/businesses/{id}/locations":{"get":{"operationId":"getBusinessLocations","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Locations"}}}},"/api/v1/categories":{"get":{"operationId":"listCategories","responses":{"200":{"description":"Category groups with counts"}}}},"/api/v1/places":{"get":{"operationId":"listPlaces","parameters":[{"name":"state","in":"query","description":"Two-letter state code to list cities","schema":{"type":"string"}}],"responses":{"200":{"description":"States or cities with counts"}}}},"/api/v1/compare":{"get":{"operationId":"compareBusinesses","parameters":[{"name":"ids","in":"query","description":"2-4 comma-separated UUIDs","schema":{"type":"string"}}],"responses":{"200":{"description":"Facts side by side"}}}},"/api/v1/sources":{"get":{"operationId":"listSources","responses":{"200":{"description":"Data sources, licenses, last import"}}}}},"components":{"schemas":{"Business":{"type":"object","required":["id","name","canonical_url","status","source"],"properties":{"id":{"type":"string","format":"uuid"},"name":{"type":"string"},"canonical_url":{"type":"string","format":"uri"},"website":{"type":["string","null"]},"phone":{"type":["string","null"],"description":"E.164"},"data_confidence":{"type":"number","description":"Completeness of sourced fields (0-1); not a quality rating"},"last_checked":{"type":["string","null"],"format":"date-time"},"status":{"type":"object"},"source":{"type":"object"}}},"SearchResponse":{"type":"object","properties":{"total":{"type":"integer"},"results":{"type":"array","items":{"type":"object"}},"next_cursor":{"type":["string","null"]},"license":{"type":"object"}}}}}}