{"openapi":"3.1.0","info":{"title":"Zephrture API","description":"Powerful geospatial data API built on Overture Maps. Access place data, street-level imagery, and location intelligence with simple REST endpoints.","version":"1.0.0"},"paths":{"/auth/me":{"get":{"tags":["Authentication"],"summary":"Get User Info","description":"Get current authenticated user information.","operationId":"get_user_info_auth_me_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/auth/status":{"get":{"tags":["Authentication"],"summary":"Get Auth Status","description":"Check authentication status without requiring authentication.","operationId":"get_auth_status_auth_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/views/semantic_heatmap_synchronous":{"get":{"tags":["Views"],"summary":"Get Semantic Heatmap Synchronous","description":"Synchronously process semantic heatmap for street-level views within a bounding box.\n\nThis endpoint processes the request immediately and returns the results using similarity filtering.\nNo object detection or relocalization is performed - returns view coordinates directly.\nSuitable for smaller areas where processing can complete quickly.\n\nArgs:\n    bbox: Bounding box as comma-separated string 'min_lng,min_lat,max_lng,max_lat'\n    search_phrase: Text phrase for semantic search\n    distance_limit_from_search_phrase: Maximum cosine distance from search phrase embedding\n    distance_limit_from_first_result: Maximum euclidean distance from first result's embedding\n    limit: Maximum number of results","operationId":"get_semantic_heatmap_synchronous_views_semantic_heatmap_synchronous_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"bbox","in":"query","required":true,"schema":{"type":"string","description":"Bounding box as 'min_lng,min_lat,max_lng,max_lat'","title":"Bbox"},"description":"Bounding box as 'min_lng,min_lat,max_lng,max_lat'"},{"name":"search_phrase","in":"query","required":true,"schema":{"type":"string","description":"Search phrase for semantic search","title":"Search Phrase"},"description":"Search phrase for semantic search"},{"name":"distance_limit_from_search_phrase","in":"query","required":false,"schema":{"type":"number","description":"Maximum distance from search phrase embedding","default":0.5,"title":"Distance Limit From Search Phrase"},"description":"Maximum distance from search phrase embedding"},{"name":"distance_limit_from_first_result","in":"query","required":false,"schema":{"type":"number","description":"Maximum distance from first result's embedding","default":0.3,"title":"Distance Limit From First Result"},"description":"Maximum distance from first result's embedding"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","description":"Maximum number of results","default":2000,"title":"Limit"},"description":"Maximum number of results"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GeoJSONFeatureCollection"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/views/semantic_heatmap/{task_id}":{"delete":{"tags":["Views"],"summary":"Delete Semantic Heatmap Request","description":"Delete a semantic heatmap request and its cached results.\n\nArgs:\n    task_id: The request ID of the semantic heatmap to delete","operationId":"delete_semantic_heatmap_request_views_semantic_heatmap__task_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"task_id","in":"path","required":true,"schema":{"type":"string","title":"Task Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/views/semantic_heatmap":{"get":{"tags":["Views"],"summary":"Get Semantic Heatmap","description":"Start async processing of semantic heatmap for street-level views within a bounding box.\n\nReturns immediately with a request_id that can be used to poll for results.\nProcessing happens asynchronously in the background.\n\nArgs:\n    bbox: Bounding box as comma-separated string 'min_lng,min_lat,max_lng,max_lat'\n    search_phrase: Text phrase for semantic search\n    limit: Maximum number of results (default: 10, max: 100)\n\nReturns:\n    Async response with request_id and status for polling","operationId":"get_semantic_heatmap_views_semantic_heatmap_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"bbox","in":"query","required":true,"schema":{"type":"string","description":"Bounding box as 'min_lng,min_lat,max_lng,max_lat'","title":"Bbox"},"description":"Bounding box as 'min_lng,min_lat,max_lng,max_lat'"},{"name":"search_phrase","in":"query","required":true,"schema":{"type":"string","description":"Search phrase for semantic similarity","title":"Search Phrase"},"description":"Search phrase for semantic similarity"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","description":"Maximum number of results","default":2000,"title":"Limit"},"description":"Maximum number of results"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SemanticHeatmapAsyncResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/views/semantic_heatmap/{request_id}/results":{"get":{"tags":["Views"],"summary":"Get Semantic Heatmap Results","description":"Get the results of a semantic heatmap request.\n\nArgs:\n    request_id: The request ID returned from the initial semantic_heatmap call\n\nReturns:\n    GeoJSON FeatureCollection with the semantic heatmap results and status information","operationId":"get_semantic_heatmap_results_views_semantic_heatmap__request_id__results_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"request_id","in":"path","required":true,"schema":{"type":"string","title":"Request Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GeoJSONFeatureCollection"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/views/detections_by_overture_id/{overture_id}":{"get":{"tags":["Views"],"summary":"Get Detections By Overture Id","description":"Get all street-level views where a place was detected.\n\nReturns all street-level views that have a positive detection for the given\nOverture ID in the place_streetview_detections table.\n\nArgs:\n    overture_id: The Overture ID of the place to get detections for\n\nReturns:\n    List of StreetLevelView objects where the place was detected","operationId":"get_detections_by_overture_id_views_detections_by_overture_id__overture_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"overture_id","in":"path","required":true,"schema":{"type":"string","title":"Overture Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/StreetLevelView"},"title":"Response Get Detections By Overture Id Views Detections By Overture Id  Overture Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/views/search":{"get":{"tags":["Views"],"summary":"Search Street Level Views","description":"Search for street-level views near a location.\n\nTwo modes supported:\n1. Direct coordinate search: Provide lat/lng\n2. Place-based search: Provide overture_id\n\nOptionally supports semantic search using embeddings.\n\nArgs:\n    lat: Latitude for direct coordinate search\n    lng: Longitude for direct coordinate search\n    overture_id: Place identifier for place-based search\n    distance: Search radius in meters (default: 100m, max: 500m)\n    exclude_linked: Exclude views already linked to the specified place\n                   (only effective in place-based search mode)\n    limit: Maximum number of results (default: 50, max: 100)\n    search_phrase: Text phrase for semantic search (orders by similarity)\n\nReturns:\n    List of StreetLevelView objects matching the search criteria,\n    ordered by distance or semantic similarity if search_phrase provided","operationId":"search_street_level_views_views_search_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"lat","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Lat"}},{"name":"lng","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Lng"}},{"name":"overture_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Overture Id"}},{"name":"distance","in":"query","required":false,"schema":{"type":"number","default":100,"title":"Distance"}},{"name":"exclude_linked","in":"query","required":false,"schema":{"type":"boolean","default":true,"title":"Exclude Linked"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Limit"}},{"name":"search_phrase","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Search Phrase"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/StreetLevelView"},"title":"Response Search Street Level Views Views Search Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/views/{view_id}":{"get":{"tags":["Views"],"summary":"Read View By Id","description":"Get a street-level view by its ID.","operationId":"read_view_by_id_views__view_id__get","parameters":[{"name":"view_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"View Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StreetLevelView"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["Views"],"summary":"Update View Notes","description":"Update notes for a street-level view.\n\nIf a note is provided in the request body, it will be appended to the\nexisting notes list in the view's augmentations field.","operationId":"update_view_notes_views__view_id__patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"view_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"View Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateViewNotesRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StreetLevelView"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Views"],"summary":"Delete Street View","description":"Delete a street-level view and its S3 image (Admin only).\n\nThis endpoint allows administrators to completely remove a street-level view,\nincluding its database record, S3 image, and any place associations.","operationId":"delete_street_view_views__view_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"view_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"View Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StreetViewDeleteResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/views/upload-image":{"post":{"tags":["Views"],"summary":"Upload Image To S3 Endpoint","description":"Upload an image to S3 (Admin only).\n\nThis endpoint allows administrators to upload street-level view images\nto S3 without creating a database record. Returns the S3 URL and metadata\nfor subsequent use with the create-from-s3 endpoint.","operationId":"upload_image_to_s3_endpoint_views_upload_image_post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_upload_image_to_s3_endpoint_views_upload_image_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/S3UploadResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/views/create-from-s3":{"post":{"tags":["Views"],"summary":"Create View From S3","description":"Create a street-level view from an S3 image (Admin only).\n\nThis endpoint creates a database record for a street-level view using\nan image already uploaded to S3. The S3 URL must belong to our\nstreetviews bucket.\n\nIf an overture_id is provided, the view will be linked to that place.","operationId":"create_view_from_s3_views_create_from_s3_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateStreetViewFromS3Request"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StreetLevelView"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/views/{view_id}/presigned-url":{"get":{"tags":["Views"],"summary":"Get View Presigned Url","description":"Generate a presigned URL for accessing a street-level view image.\n\nThis endpoint allows authenticated users to generate temporary URLs for accessing\nprivate S3 images. The URL expires after the specified duration.\n\nAuthorization:\n- Admin users: Can access presigned URLs for any view\n- Regular users: Can only access presigned URLs for views that are linked to places","operationId":"get_view_presigned_url_views__view_id__presigned_url_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"view_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"View Id"}},{"name":"expiration","in":"query","required":false,"schema":{"type":"integer","default":3600,"title":"Expiration"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PresignedUrlResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/places/search":{"get":{"tags":["Places"],"summary":"Search Places","operationId":"search_places_places_search_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"bbox","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Bbox"}},{"name":"lat","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Lat"}},{"name":"lng","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Lng"}},{"name":"distance","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Distance"}},{"name":"h3","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"H3"}},{"name":"category","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category"}},{"name":"name","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"}},{"name":"confidence","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Confidence"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":100,"title":"Limit"}},{"name":"skip","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Skip"}},{"name":"id_prefix","in":"query","required":false,"schema":{"default":"","title":"Id Prefix"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GeoJsonPlaceCollection"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/places/poi-churn-signals":{"get":{"tags":["Places"],"summary":"Get Poi Churn Signals","description":"Get POI churn signals calculated on-the-fly from place_streetview_detections.\n\nCalculates existence status, view counts, and date ranges for POIs based on\ntheir streetview detection history.\n\nArgs:\n    bbox: Bounding box as \"minx,miny,maxx,maxy\" (longitude,latitude coordinates)\n    existence: Filter by existence status (exists,stale,may-not-exist,unknown)\n    confidence: Minimum confidence threshold (0.0-1.0) for overture places\n    source: Filter by view source (hivemapper,mapillary,admin_upload)\n    limit: Maximum number of results (default 100, max 500)","operationId":"get_poi_churn_signals_places_poi_churn_signals_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"bbox","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Bbox"}},{"name":"existence","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Existence"}},{"name":"confidence","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Confidence"}},{"name":"source","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":100,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/places/poi-churn-signals/{overture_id}/views":{"get":{"tags":["Places"],"summary":"Get Poi Churn Signal Views","description":"Get street level views where this POI was detected (detection=true)","operationId":"get_poi_churn_signal_views_places_poi_churn_signals__overture_id__views_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"overture_id","in":"path","required":true,"schema":{"type":"string","title":"Overture Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/StreetLevelView"},"title":"Response Get Poi Churn Signal Views Places Poi Churn Signals  Overture Id  Views Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/places/poi-churn-signals/{overture_id}/views/{view_id}":{"get":{"tags":["Places"],"summary":"Get Poi View Ocr","description":"Get OCR overlays for a view, filtered to show text relevant to the POI.","operationId":"get_poi_view_ocr_places_poi_churn_signals__overture_id__views__view_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"overture_id","in":"path","required":true,"schema":{"type":"string","title":"Overture Id"}},{"name":"view_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"View Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/places/in-view":{"post":{"tags":["Places"],"summary":"Get Places In View","description":"Find places visible from a camera field of view.\n\nThis endpoint accepts either:\n- An existing street view ID to analyze its field of view, OR\n- Direct camera pose parameters (lat/lng/heading/fov)\n\nReturns a list of places that would be visible from the camera's position and orientation.","operationId":"get_places_in_view_places_in_view_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlacesInViewRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/GeoJsonPlaceFeature"},"type":"array","title":"Response Get Places In View Places In View Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/places/{overture_id}/needed_info":{"get":{"tags":["Places"],"summary":"Needed Info","operationId":"needed_info_places__overture_id__needed_info_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"overture_id","in":"path","required":true,"schema":{"type":"string","title":"Overture Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/places/{overture_id}":{"get":{"tags":["Places"],"summary":"Read Place By Overture Id","description":"Get a place by its overture_id (GERS ID)","operationId":"read_place_by_overture_id_places__overture_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"overture_id","in":"path","required":true,"schema":{"type":"string","title":"Overture Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GeoJsonPlaceFeature"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["Places"],"summary":"Update Place","description":"Update a place by its overture_id (admin only)\n\nOnly allows updating custom places with overture_id prefixes 'zephr' or 'pindrop'.\nUpdates the place's augmentations based on provided fields.","operationId":"update_place_places__overture_id__patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"overture_id","in":"path","required":true,"schema":{"type":"string","title":"Overture Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdatePlaceRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GeoJsonPlaceFeature"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Places"],"summary":"Delete Place","description":"Delete a place by its overture_id (admin only)\n\nOnly allows deletion of custom places with overture_id prefixes 'zephr' or 'pindrop'.\nAlso deletes the corresponding overture_places record.","operationId":"delete_place_places__overture_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"overture_id","in":"path","required":true,"schema":{"type":"string","title":"Overture Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/places/{overture_id}/settings/reset":{"post":{"tags":["Places"],"summary":"Reset Place Settings","description":"Reset specific place fields to default values (admin only)\n\nSupported fields:\n- \"geometry\": Reset place geometry to overture_place geometry or bbox centroid\n- \"augmentations\"","operationId":"reset_place_settings_places__overture_id__settings_reset_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"overture_id","in":"path","required":true,"schema":{"type":"string","title":"Overture Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResetPlaceFieldsRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/places/":{"post":{"tags":["Places"],"summary":"Create Place","description":"Create a new place (admin only)\n\nname should look like {\"primary\":\"this is the name\",\"common\":null,\"rules\":null}\ncategories {\"primary\":\"nail_salon\",\"alternate\":[\"beauty_salon\",\"beauty_and_spa\"]}\naddresses  [{\"freeform\":\"3939 69th St W\",\"locality\":\"Edina\",\"postcode\":\"55435-2001\",\"region\":\"MN\",\"country\":\"US\"}]\nwebsites [\"http://www.southdalepethospital.com/\"]\nsocials  [\"https://www.facebook.com/1836059136626338\"]\nphones  [\"+19529261831\"]","operationId":"create_place_places__post","security":[{"HTTPBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreatePlaceRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GeoJsonPlaceFeature"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["Places"],"summary":"Read Places","description":"Get places with pagination.\n\nReturns a GeoJSON FeatureCollection containing place features.","operationId":"read_places_places__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"skip","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Skip"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":100,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GeoJsonPlaceCollection"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/places/{overture_id}/views/{view_id}":{"post":{"tags":["Places"],"summary":"Link Place To View","description":"Link a street level view to a place (admin only)","operationId":"link_place_to_view_places__overture_id__views__view_id__post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"overture_id","in":"path","required":true,"schema":{"type":"string","title":"Overture Id"}},{"name":"view_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"View Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Places"],"summary":"Unlink Place From View","description":"Unlink a street level view from a place (admin only)","operationId":"unlink_place_from_view_places__overture_id__views__view_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"overture_id","in":"path","required":true,"schema":{"type":"string","title":"Overture Id"}},{"name":"view_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"View Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/places/{overture_id}/views":{"get":{"tags":["Places"],"summary":"Get Place Views","description":"Get street level views linked to a place","operationId":"get_place_views_places__overture_id__views_get","parameters":[{"name":"overture_id","in":"path","required":true,"schema":{"type":"string","title":"Overture Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/StreetLevelView"},"title":"Response Get Place Views Places  Overture Id  Views Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/places/views/{view_id}/places":{"get":{"tags":["Places"],"summary":"Get View Places","description":"Get places associated with a street level view.\n\nReturns a GeoJSON FeatureCollection containing place features.","operationId":"get_view_places_places_views__view_id__places_get","parameters":[{"name":"view_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"View Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GeoJsonPlaceCollection"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/places/mapillary/images/{image_id}":{"get":{"tags":["Places"],"summary":"Get Mapillary Image Details","description":"Get detailed information about a specific Mapillary image.\n\nReturns comprehensive metadata for a Mapillary image including geometry,\ncapture details, and thumbnail URLs.","operationId":"get_mapillary_image_details_places_mapillary_images__image_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"image_id","in":"path","required":true,"schema":{"type":"string","title":"Image Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MapillaryImageSearchResult"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/places/{place_id}/nearby-images":{"get":{"tags":["Places"],"summary":"Get Nearby Mapillary Images","description":"Get Mapillary images near a specific place.\n\nSearches for street-level imagery within the specified radius of the place.\nRequires authentication but available to all users.","operationId":"get_nearby_mapillary_images_places__place_id__nearby_images_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"place_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Place Id"}},{"name":"radius","in":"query","required":false,"schema":{"type":"integer","default":100,"title":"Radius"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":10,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/MapillaryImageSearchResult"},"title":"Response Get Nearby Mapillary Images Places  Place Id  Nearby Images Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/places/{overture_id}/import-image":{"post":{"tags":["Places"],"summary":"Import Mapillary Image","description":"Import a single Mapillary image as a StreetLevelView.\n\n**Admin only endpoint** that imports a Mapillary image into the database,\ncreating both StreetLevelView and MapillaryView records and linking\nthem to the specified place.","operationId":"import_mapillary_image_places__overture_id__import_image_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"overture_id","in":"path","required":true,"schema":{"type":"string","title":"Overture Id"}},{"name":"image_id","in":"query","required":true,"schema":{"type":"string","title":"Image Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/places/{overture_id}/street-views":{"get":{"tags":["Places"],"summary":"Get Place Street Views","description":"Get all street-level views associated with a place.\n\nReturns all imported street-level imagery for the specified place,\nfrom all sources (Mapillary, etc.). Returns empty list if no views are associated.","operationId":"get_place_street_views_places__overture_id__street_views_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"overture_id","in":"path","required":true,"schema":{"type":"string","title":"Overture Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/StreetLevelView"},"title":"Response Get Place Street Views Places  Overture Id  Street Views Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/places/{overture_id}/augmentation-status":{"get":{"tags":["Places"],"summary":"Get Augmentation Status","description":"Get the status of augmentation generation for a place by overture_id.\n\nReturns the most recent job status and details.","operationId":"get_augmentation_status_places__overture_id__augmentation_status_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"overture_id","in":"path","required":true,"schema":{"type":"string","title":"Overture Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Augmentation Status Places  Overture Id  Augmentation Status Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/places/{overture_id}/visual-descriptions":{"get":{"tags":["Places"],"summary":"Get Place Visual Descriptions","description":"Get all visual descriptions for a place (Admin only).\n\nReturns all PlaceVisualDescription records associated with the place,\ngrouped by source_data for easy categorization.","operationId":"get_place_visual_descriptions_places__overture_id__visual_descriptions_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"overture_id","in":"path","required":true,"schema":{"type":"string","title":"Overture Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/PlaceVisualDescriptionResponse"},"title":"Response Get Place Visual Descriptions Places  Overture Id  Visual Descriptions Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/places/{overture_id}/visual-descriptions/{description_id}":{"delete":{"tags":["Places"],"summary":"Delete Place Visual Description","description":"Delete a specific visual description (Admin only).\n\nPermanently removes a PlaceVisualDescription record from the database.","operationId":"delete_place_visual_description_places__overture_id__visual_descriptions__description_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"overture_id","in":"path","required":true,"schema":{"type":"string","title":"Overture Id"}},{"name":"description_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Description Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/places/{overture_id}/purgeviews/":{"delete":{"tags":["Places"],"summary":"Purge Mapillary Views Near Place","description":"Delete all Mapillary street level views within a specified radius of a place (Admin only).\n\nThis endpoint removes all StreetLevelView records where source='mapillary'\nwithin the specified radius (in meters) of the place's location.\n\nArgs:\n    overture_id: The Overture ID of the place\n    radius: Radius in meters to purge views (default: 100m, max: 1000m)\n\nReturns:\n    Dictionary with the count of deleted views and operation details","operationId":"purge_mapillary_views_near_place_places__overture_id__purgeviews__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"overture_id","in":"path","required":true,"schema":{"type":"string","title":"Overture Id"}},{"name":"radius","in":"query","required":false,"schema":{"type":"number","default":200.0,"title":"Radius"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/user/api-key":{"post":{"tags":["API Keys"],"summary":"Create User Api Key","description":"Create a new API key for the authenticated user.\n\nCreates an API key in AWS API Gateway with the specified usage tier\nand associates it with the appropriate usage plan.","operationId":"create_user_api_key_user_api_key_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateAPIKeyRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateAPIKeyResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/user/api-keys":{"get":{"tags":["API Keys"],"summary":"Get User Api Keys","description":"Get all active API keys for the authenticated user.","operationId":"get_user_api_keys_user_api_keys_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/UserAPIKeyResponse"},"type":"array","title":"Response Get User Api Keys User Api Keys Get"}}}}},"security":[{"HTTPBearer":[]}]}},"/user/api-key/{api_key_id}/usage":{"get":{"tags":["API Keys"],"summary":"Get Api Key Usage","description":"Get usage statistics for a specific API key.\n\nReturns current quota usage, rate limits, and recent usage patterns.","operationId":"get_api_key_usage_user_api_key__api_key_id__usage_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"api_key_id","in":"path","required":true,"schema":{"type":"string","title":"Api Key Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/APIKeyUsageStats"},{"type":"null"}],"title":"Response Get Api Key Usage User Api Key  Api Key Id  Usage Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/user/api-key/{api_key_id}":{"put":{"tags":["API Keys"],"summary":"Update User Api Key","description":"Update an API key's name, description, or active status.","operationId":"update_user_api_key_user_api_key__api_key_id__put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"api_key_id","in":"path","required":true,"schema":{"type":"string","title":"Api Key Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserAPIKeyUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserAPIKeyResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["API Keys"],"summary":"Delete User Api Key","description":"Delete an API key for the authenticated user.\n\nThis removes the API key from AWS API Gateway and marks it as inactive\nin the database.","operationId":"delete_user_api_key_user_api_key__api_key_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"api_key_id","in":"path","required":true,"schema":{"type":"string","title":"Api Key Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/user/api-key/tiers":{"get":{"tags":["API Keys"],"summary":"Get Api Key Tiers","description":"Get available API key tiers and their limits.","operationId":"get_api_key_tiers_user_api_key_tiers_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/augmentations/places/{overture_id}/generate-augmentations":{"post":{"tags":["Places"],"summary":"Generate Place Augmentations","description":"Queue AI-powered augmentation generation for a place.\n\nThis endpoint queues a background job that will:\n1. Research the place using web search and scraping\n2. Generate comprehensive markdown descriptions and other augmentations\n3. Store the result in the place's augmentations field\n\nReturns immediately with job status. Use the augmentation-status endpoint to check progress.","operationId":"generate_place_augmentations_augmentations_places__overture_id__generate_augmentations_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"overture_id","in":"path","required":true,"schema":{"type":"string","title":"Overture Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Generate Place Augmentations Augmentations Places  Overture Id  Generate Augmentations Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/augmentations/batch":{"post":{"tags":["Augmentations"],"summary":"Generate Batch Augmentations","description":"Queue augmentation generation for multiple places (admin only).\n\nRequest body should contain: {\"overture_ids\": [\"id1\", \"id2\", ...]}\n\nThis endpoint:\n- Limits queue depth to 200 total pending/processing jobs\n- Skips places that already have last_enriched_at set\n- Returns summary of queued vs skipped places","operationId":"generate_batch_augmentations_augmentations_batch_post","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":{"items":{"type":"string"},"type":"array"},"type":"object","title":"Request"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Generate Batch Augmentations Augmentations Batch Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/augmentations/queue-stats":{"get":{"tags":["Augmentations"],"summary":"Get Augmentation Queue Stats","description":"Get current augmentation queue statistics.\n\nAdmin-only endpoint that returns current queue depth, available slots,\nand job status breakdown for monitoring purposes.","operationId":"get_augmentation_queue_stats_augmentations_queue_stats_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Get Augmentation Queue Stats Augmentations Queue Stats Get"}}}}},"security":[{"HTTPBearer":[]}]}},"/augmentations/places/{overture_id}/s3-content":{"get":{"tags":["Places"],"summary":"Get S3 Markdown Content","description":"Retrieve full markdown content from S3 for admin users.\n\n**Admin only endpoint** that fetches the complete AI-generated markdown\ndescription from S3 storage for enhanced place augmentations.","operationId":"get_s3_markdown_content_augmentations_places__overture_id__s3_content_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"overture_id","in":"path","required":true,"schema":{"type":"string","title":"Overture Id"}},{"name":"s3_key","in":"query","required":true,"schema":{"type":"string","title":"S3 Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"string","title":"Response Get S3 Markdown Content Augmentations Places  Overture Id  S3 Content Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/augmentations/generate-by-overture-id":{"post":{"tags":["Augmentations"],"summary":"Generate Augmentations By Overture Id","description":"Queue AI-powered augmentation generation for a place using its overture_id.\n\nThis endpoint queues a background job that will:\n1. Research the place using web search and scraping\n2. Generate comprehensive markdown descriptions and other augmentations\n3. Store the result in the place's augmentations field\n\nRequest body should contain: {\"overture_id\": \"overture_place_id\", \"force\": false}\n\nSet force=true to allow regeneration even if augmentations already exist.\n\nReturns immediately with job status. Use the augmentation-status endpoint to check progress.","operationId":"generate_augmentations_by_overture_id_augmentations_generate_by_overture_id_post","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":{"anyOf":[{"type":"string"},{"type":"boolean"}]},"type":"object","title":"Request"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Generate Augmentations By Overture Id Augmentations Generate By Overture Id Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/":{"get":{"tags":["Health"],"summary":"Read Root","description":"API root endpoint that returns basic information about the Zephrture API.\nReturns:\n    dict: Welcome message and API information","operationId":"read_root__get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/health":{"get":{"tags":["Health"],"summary":"Health Check","description":"Simple health check endpoint that doesn't require database or authentication.\nReturns:\n    dict: Health status and current timestamp","operationId":"health_check_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/debug/environment":{"get":{"tags":["Health"],"summary":"Debug Environment","description":"Debug endpoint to check environment variables (no auth required)","operationId":"debug_environment_debug_environment_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/gps-metrics":{"get":{"summary":"Gps Metrics","description":"Endpoint that fetches GPS test metrics for different configurations.\nReturns a list with 4 dictionaries containing test metrics and statistics.\nCached for 24 hours to reduce Firebase/GCS queries.","operationId":"gps_metrics_gps_metrics_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}}},"components":{"schemas":{"APIKeyTier":{"type":"string","enum":["basic","premium","enterprise"],"title":"APIKeyTier","description":"API key usage tiers."},"APIKeyUsageStats":{"properties":{"api_key_id":{"type":"string","title":"Api Key Id"},"tier":{"type":"string","title":"Tier"},"requests_today":{"type":"integer","title":"Requests Today"},"requests_this_month":{"type":"integer","title":"Requests This Month"},"quota_limit":{"type":"integer","title":"Quota Limit"},"quota_remaining":{"type":"integer","title":"Quota Remaining"},"rate_limit_per_second":{"type":"integer","title":"Rate Limit Per Second"},"burst_limit":{"type":"integer","title":"Burst Limit"},"last_request_time":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Request Time"}},"type":"object","required":["api_key_id","tier","requests_today","requests_this_month","quota_limit","quota_remaining","rate_limit_per_second","burst_limit"],"title":"APIKeyUsageStats","description":"Model for API key usage statistics."},"Body_upload_image_to_s3_endpoint_views_upload_image_post":{"properties":{"image":{"type":"string","format":"binary","title":"Image"}},"type":"object","required":["image"],"title":"Body_upload_image_to_s3_endpoint_views_upload_image_post"},"Coordinates":{"prefixItems":[{"anyOf":[{"type":"number"},{"type":"integer"}],"title":"Lon","ge":-180,"le":180},{"anyOf":[{"type":"number"},{"type":"integer"}],"title":"Lat","ge":-90,"le":90}],"type":"array","maxItems":2,"minItems":2},"CreateAPIKeyRequest":{"properties":{"name":{"type":"string","title":"Name","description":"User-friendly name for the API key"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description","description":"Optional description"},"tier":{"$ref":"#/components/schemas/APIKeyTier","description":"Desired usage tier"}},"type":"object","required":["name","tier"],"title":"CreateAPIKeyRequest","description":"Request model for creating an API key."},"CreateAPIKeyResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"api_key_id":{"type":"string","title":"Api Key Id"},"api_key_value":{"type":"string","title":"Api Key Value"},"tier":{"type":"string","title":"Tier"},"name":{"type":"string","title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"usage_plan_id":{"type":"string","title":"Usage Plan Id"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","api_key_id","api_key_value","tier","name","description","usage_plan_id","created_at"],"title":"CreateAPIKeyResponse","description":"Response model for creating an API key."},"CreatePlaceRequest":{"properties":{"latitude":{"type":"number","title":"Latitude"},"longitude":{"type":"number","title":"Longitude"},"name":{"type":"string","title":"Name","default":""},"category":{"type":"string","title":"Category","default":""},"subcategories":{"type":"string","title":"Subcategories","default":""},"address":{"type":"string","title":"Address","default":""},"confidence":{"type":"number","title":"Confidence","default":0.95},"phone":{"type":"string","title":"Phone","default":""},"website":{"type":"string","title":"Website","default":""}},"type":"object","required":["latitude","longitude"],"title":"CreatePlaceRequest"},"CreateStreetViewFromS3Request":{"properties":{"s3_url":{"type":"string","title":"S3 Url","description":"S3 URL of the uploaded image"},"latitude":{"type":"number","maximum":90.0,"minimum":-90.0,"title":"Latitude","description":"Latitude coordinate"},"longitude":{"type":"number","maximum":180.0,"minimum":-180.0,"title":"Longitude","description":"Longitude coordinate"},"overture_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Overture Id","description":"Overture ID of place to associate with this view"},"heading":{"anyOf":[{"type":"number","exclusiveMaximum":360.0,"minimum":0.0},{"type":"null"}],"title":"Heading","description":"Camera heading in degrees (0-359)"},"pitch":{"anyOf":[{"type":"number","maximum":90.0,"minimum":-90.0},{"type":"null"}],"title":"Pitch","description":"Camera pitch in degrees"},"roll":{"anyOf":[{"type":"number","maximum":180.0,"minimum":-180.0},{"type":"null"}],"title":"Roll","description":"Camera roll in degrees"},"fov":{"anyOf":[{"type":"number","maximum":180.0,"exclusiveMinimum":0.0},{"type":"null"}],"title":"Fov","description":"Field of view in degrees"},"source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source","description":"Data source identifier","default":"admin_upload"},"image_description":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Image Description","description":"Description of the image content"},"auto_associate":{"type":"boolean","title":"Auto Associate","description":"Automatically associate view with places in field of view","default":false},"augmentations":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Augmentations","description":"Additional data and augmentations"}},"type":"object","required":["s3_url","latitude","longitude"],"title":"CreateStreetViewFromS3Request","description":"Request model for creating street-level view from S3 image."},"GeoJSONFeature":{"properties":{"type":{"type":"string","title":"Type","default":"Feature"},"geometry":{"$ref":"#/components/schemas/GeoJSONGeometry"},"properties":{"$ref":"#/components/schemas/GeoJSONProperties"}},"type":"object","required":["geometry","properties"],"title":"GeoJSONFeature"},"GeoJSONFeatureCollection":{"properties":{"type":{"type":"string","title":"Type","default":"FeatureCollection"},"features":{"items":{"$ref":"#/components/schemas/GeoJSONFeature"},"type":"array","title":"Features"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"},"progress":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Progress"},"total":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Total"},"finished":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Finished"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"}},"type":"object","required":["features"],"title":"GeoJSONFeatureCollection"},"GeoJSONGeometry":{"properties":{"type":{"type":"string","title":"Type","default":"Point"},"coordinates":{"items":{"type":"number"},"type":"array","title":"Coordinates"}},"type":"object","required":["coordinates"],"title":"GeoJSONGeometry"},"GeoJSONProperties":{"properties":{"url":{"type":"string","title":"Url"},"view_id":{"type":"string","title":"View Id"},"source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source"}},"type":"object","required":["url","view_id"],"title":"GeoJSONProperties"},"GeoJsonPlaceCollection":{"properties":{"type":{"type":"string","title":"Feature Collection","default":"FeatureCollection"},"features":{"items":{"$ref":"#/components/schemas/GeoJsonPlaceFeature"},"type":"array","title":"Features"},"count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Count"}},"type":"object","required":["features"],"title":"GeoJsonPlaceCollection","description":"GeoJSON FeatureCollection for multiple Places."},"GeoJsonPlaceFeature":{"properties":{"type":{"type":"string","title":"Feature","default":"Feature"},"properties":{"$ref":"#/components/schemas/PlaceProperties"},"geometry":{"$ref":"#/components/schemas/PointModel"}},"type":"object","required":["properties","geometry"],"title":"GeoJsonPlaceFeature","description":"GeoJSON Feature for a Place with proper typing."},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"MapillaryImageSearchResult":{"properties":{"id":{"type":"string","title":"Id","description":"Mapillary image ID"},"thumb_1024_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Thumb 1024 Url","description":"Thumbnail URL"},"captured_at":{"anyOf":[{"type":"string"},{"type":"integer"},{"type":"null"}],"title":"Captured At","description":"Capture timestamp (string or Unix timestamp)"},"compass_angle":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Compass Angle","description":"Compass angle in degrees"},"geometry":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Geometry","description":"GeoJSON geometry"},"sequence":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sequence","description":"Sequence ID"},"organization":{"anyOf":[{"type":"string"},{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Organization","description":"Organization ID or object"},"camera_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Camera Type","description":"Camera type"}},"type":"object","required":["id"],"title":"MapillaryImageSearchResult","description":"Model for Mapillary image search results from the API."},"PlaceProperties":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category"},"primary_category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Primary Category"},"alternate_categories":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Alternate Categories"},"address":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Address"},"full_address":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Full Address"},"locality":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Locality"},"region":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Region"},"postcode":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Postcode"},"overture_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Overture Id"},"augmentations":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Augmentations"},"last_enriched_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Enriched At"},"overture_compat":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Overture Compat"},"overture_geometry":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Overture Geometry"}},"type":"object","required":["id","name"],"title":"PlaceProperties","description":"Properties for a Place GeoJSON feature."},"PlaceVisualDescriptionResponse":{"properties":{"place_id":{"type":"string","format":"uuid","title":"Place Id","description":"ID of the related Place"},"description":{"type":"string","title":"Description","description":"AI-generated visual description of the place"},"confidence_score":{"type":"number","title":"Confidence Score","description":"Confidence score for the description quality (0.0-1.0)"},"ai_model":{"type":"string","title":"Ai Model","description":"Name/version of the AI model used to generate description"},"source_image_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Image Url","description":"URL of the source image used for description generation"},"processing_status":{"type":"string","title":"Processing Status","description":"Status of the processing pipeline: 'complete', 'error', or 'deleted'","default":"complete"},"source_data":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Data","description":"Source data used for description (e.g., 'street_view_images', 'satellite_imagery')"},"processing_metadata":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Processing Metadata","description":"Additional metadata about the processing pipeline"},"id":{"type":"string","format":"uuid","title":"Id"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["place_id","description","confidence_score","ai_model","id","created_at","updated_at"],"title":"PlaceVisualDescriptionResponse","description":"Response model for place visual descriptions."},"PlacesInViewRequest":{"properties":{"streetlevelview_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Streetlevelview Id","description":"ID of existing street view to analyze"},"latitude":{"anyOf":[{"type":"number","maximum":90.0,"minimum":-90.0},{"type":"null"}],"title":"Latitude","description":"Camera latitude coordinate"},"longitude":{"anyOf":[{"type":"number","maximum":180.0,"minimum":-180.0},{"type":"null"}],"title":"Longitude","description":"Camera longitude coordinate"},"heading":{"anyOf":[{"type":"number","exclusiveMaximum":360.0,"minimum":0.0},{"type":"null"}],"title":"Heading","description":"Camera heading in degrees (0-359)"},"fov":{"anyOf":[{"type":"number","maximum":180.0,"exclusiveMinimum":0.0},{"type":"null"}],"title":"Fov","description":"Field of view in degrees"},"max_places":{"anyOf":[{"type":"integer","maximum":100.0,"minimum":1.0},{"type":"null"}],"title":"Max Places","description":"Maximum number of places to return","default":20}},"type":"object","title":"PlacesInViewRequest","description":"Request model for finding places in field of view."},"PointModel":{"properties":{"type":{"type":"string","title":"Point","default":"Point"},"coordinates":{"$ref":"#/components/schemas/Coordinates"}},"type":"object","required":["coordinates"],"title":"PointModel"},"PresignedUrlResponse":{"properties":{"presigned_url":{"type":"string","title":"Presigned Url","description":"Presigned URL for accessing the image"},"expires_in":{"type":"integer","title":"Expires In","description":"URL expiration time in seconds"},"expires_at":{"type":"string","format":"date-time","title":"Expires At","description":"URL expiration timestamp"}},"type":"object","required":["presigned_url","expires_in","expires_at"],"title":"PresignedUrlResponse","description":"Response model for presigned URL generation."},"ResetPlaceFieldsRequest":{"properties":{"fields":{"items":{"type":"string"},"type":"array","title":"Fields"}},"type":"object","required":["fields"],"title":"ResetPlaceFieldsRequest"},"S3UploadResponse":{"properties":{"s3_url":{"type":"string","title":"S3 Url","description":"Full S3 URL of the uploaded image"},"s3_bucket":{"type":"string","title":"S3 Bucket","description":"S3 bucket name"},"s3_key":{"type":"string","title":"S3 Key","description":"S3 object key"},"uploaded_by":{"type":"string","title":"Uploaded By","description":"Admin user ID who uploaded"},"uploaded_at":{"type":"string","format":"date-time","title":"Uploaded At","description":"Upload timestamp"}},"type":"object","required":["s3_url","s3_bucket","s3_key","uploaded_by","uploaded_at"],"title":"S3UploadResponse","description":"Response model for S3 image upload."},"SemanticHeatmapAsyncResponse":{"properties":{"request_id":{"type":"string","title":"Request Id"},"status":{"type":"string","title":"Status","default":"queued"}},"type":"object","required":["request_id"],"title":"SemanticHeatmapAsyncResponse"},"StreetLevelView":{"properties":{"image_url":{"type":"string","title":"Image Url","description":"URL to the street level image"},"image_description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Image Description","description":"Description of the image content"},"latitude":{"type":"number","title":"Latitude","description":"Latitude coordinate (deprecated, use geometry)"},"longitude":{"type":"number","title":"Longitude","description":"Longitude coordinate (deprecated, use geometry)"},"heading":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Heading","description":"Camera heading in degrees"},"pitch":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Pitch","description":"Camera pitch in degrees"},"roll":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Roll","description":"Camera roll in degrees"},"fov":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Fov","description":"Field of view in degrees"},"source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source","description":"Data source (e.g., Google Street View, Mapillary)"},"captured_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Captured At","description":"When the image was captured"},"augmentations":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Augmentations","description":"Additional data and augmentations"},"id":{"type":"string","format":"uuid","title":"Id"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["image_url","latitude","longitude"],"title":"StreetLevelView"},"StreetViewDeleteResponse":{"properties":{"success":{"type":"boolean","title":"Success","description":"Whether deletion was successful"},"view_id":{"type":"string","format":"uuid","title":"View Id","description":"ID of the deleted view"},"s3_deleted":{"type":"boolean","title":"S3 Deleted","description":"Whether S3 object was deleted"},"place_unlinked":{"type":"boolean","title":"Place Unlinked","description":"Whether place association was removed"},"message":{"type":"string","title":"Message","description":"Success or error message"}},"type":"object","required":["success","view_id","s3_deleted","place_unlinked","message"],"title":"StreetViewDeleteResponse","description":"Response model for street-level view deletion."},"UpdatePlaceRequest":{"properties":{"latitude":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Latitude"},"longitude":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Longitude"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category"},"subcategories":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Subcategories"},"address":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Address"},"confidence":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Confidence"},"phone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Phone"},"website":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Website"},"note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Note"}},"type":"object","title":"UpdatePlaceRequest"},"UpdateViewNotesRequest":{"properties":{"note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Note"}},"type":"object","title":"UpdateViewNotesRequest"},"UserAPIKeyResponse":{"properties":{"user_id":{"type":"string","title":"User Id","description":"Firebase user UID"},"user_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Email","description":"Firebase user email for display"},"api_key_id":{"type":"string","title":"Api Key Id","description":"AWS API Gateway API Key ID"},"api_key_value":{"type":"string","title":"Api Key Value","description":"Full API key value for user access"},"usage_plan_id":{"type":"string","title":"Usage Plan Id","description":"AWS API Gateway Usage Plan ID"},"tier":{"type":"string","title":"Tier","description":"Usage tier: basic, premium, or enterprise"},"name":{"type":"string","title":"Name","description":"User-friendly name for the API key"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description","description":"Optional description"},"is_active":{"type":"boolean","title":"Is Active","description":"Whether the API key is currently active","default":true},"last_used_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Used At","description":"Timestamp of last API key usage"},"id":{"type":"string","format":"uuid","title":"Id"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["user_id","api_key_id","api_key_value","usage_plan_id","tier","name","id","created_at","updated_at"],"title":"UserAPIKeyResponse","description":"Model for API key responses (excludes sensitive fields)."},"UserAPIKeyUpdate":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"is_active":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Active"},"last_used_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Used At"}},"type":"object","title":"UserAPIKeyUpdate","description":"Model for updating an existing API key."},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"}},"securitySchemes":{"HTTPBearer":{"type":"http","scheme":"bearer"}}},"tags":[{"name":"Health","description":"API health and status endpoints"},{"name":"Authentication","description":"User authentication and authorization"},{"name":"Places","description":"Search and manage place data from Overture Maps"},{"name":"Views","description":"Street-level imagery management"},{"name":"Segments","description":"Road and street segment data"},{"name":"Tags","description":"Tagging system for places and views"},{"name":"API Keys","description":"API key management for external access"},{"name":"MCP","description":"Model Context Protocol endpoints for AI tools"}]}