{"openapi":"3.1.0","info":{"title":"Singapore Property Market Data API","description":"Price trends, CAGR, rental yield, and market-segment metrics for Singapore private residential (condo and landed) and HDB resale property. Derived from URA and HDB records, recalculated monthly. See /llms.txt for full documentation.","contact":{"name":"Web Content Creators","url":"https://sgpropertydata.com/","email":"hello@sgpropertydata.com"},"version":"1.0.0"},"paths":{"/":{"get":{"summary":"Home","operationId":"home__get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/favicon.ico":{"get":{"summary":"Favicon","operationId":"favicon_favicon_ico_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/llms.txt":{"get":{"summary":"Llms Txt","operationId":"llms_txt_llms_txt_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/terms":{"get":{"summary":"Terms","operationId":"terms_terms_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/privacy":{"get":{"summary":"Privacy","operationId":"privacy_privacy_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/methodology":{"get":{"summary":"Methodology","operationId":"methodology_methodology_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/robots.txt":{"get":{"summary":"Robots Txt","operationId":"robots_txt_robots_txt_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/sitemap.xml":{"get":{"summary":"Sitemap Xml","operationId":"sitemap_xml_sitemap_xml_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/.well-known/oauth-protected-resource":{"get":{"summary":"Oauth Protected Resource","operationId":"oauth_protected_resource__well_known_oauth_protected_resource_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/.well-known/oauth-authorization-server":{"get":{"summary":"Oauth Authorization Server","operationId":"oauth_authorization_server__well_known_oauth_authorization_server_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/.well-known/security.txt":{"get":{"summary":"Security Txt","operationId":"security_txt__well_known_security_txt_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/.well-known/ai-catalog.json":{"get":{"summary":"Ai Catalog","operationId":"ai_catalog__well_known_ai_catalog_json_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/.well-known/402index-verify.txt":{"get":{"summary":"Four Oh Two Index Verify","operationId":"four_oh_two_index_verify__well_known_402index_verify_txt_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/health":{"get":{"summary":"Health","operationId":"health_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/meta":{"get":{"summary":"Meta","operationId":"meta_meta_get","parameters":[{"name":"x-cloudflare-secret","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Cloudflare-Secret"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/sample/districts/{district}/stats":{"get":{"summary":"Sample District Stats","operationId":"sample_district_stats_sample_districts__district__stats_get","parameters":[{"name":"district","in":"path","required":true,"schema":{"type":"string","title":"District"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/sample/projects/{project}/stats":{"get":{"summary":"Sample Project Stats","operationId":"sample_project_stats_sample_projects__project__stats_get","parameters":[{"name":"project","in":"path","required":true,"schema":{"type":"string","title":"Project"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/sample/projects/{project}/rental-yield":{"get":{"summary":"Sample Project Yield","operationId":"sample_project_yield_sample_projects__project__rental_yield_get","parameters":[{"name":"project","in":"path","required":true,"schema":{"type":"string","title":"Project"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/private/condo/districts/{district}/stats":{"get":{"summary":"District Stats Route","operationId":"district_stats_route_private_condo_districts__district__stats_get","parameters":[{"name":"district","in":"path","required":true,"schema":{"type":"string","title":"District"}},{"name":"tenure","in":"query","required":false,"schema":{"type":"string","default":"ALL","title":"Tenure"}},{"name":"x-cloudflare-secret","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Cloudflare-Secret"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/private/condo/segments/{segment}/stats":{"get":{"summary":"Segment Stats Route","operationId":"segment_stats_route_private_condo_segments__segment__stats_get","parameters":[{"name":"segment","in":"path","required":true,"schema":{"type":"string","title":"Segment"}},{"name":"tenure","in":"query","required":false,"schema":{"type":"string","default":"ALL","title":"Tenure"}},{"name":"x-cloudflare-secret","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Cloudflare-Secret"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/private/condo/projects/{project}/stats":{"get":{"summary":"Project Stats Route","operationId":"project_stats_route_private_condo_projects__project__stats_get","parameters":[{"name":"project","in":"path","required":true,"schema":{"type":"string","title":"Project"}},{"name":"x-cloudflare-secret","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Cloudflare-Secret"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/private/condo/projects/{project}/rental-yield":{"get":{"summary":"Project Yield Route","operationId":"project_yield_route_private_condo_projects__project__rental_yield_get","parameters":[{"name":"project","in":"path","required":true,"schema":{"type":"string","title":"Project"}},{"name":"x-cloudflare-secret","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Cloudflare-Secret"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/private/condo/projects":{"get":{"summary":"List Projects Route","operationId":"list_projects_route_private_condo_projects_get","parameters":[{"name":"district","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"District"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/private/landed/districts/{district}/stats":{"get":{"summary":"District Stats Route","operationId":"district_stats_route_private_landed_districts__district__stats_get","parameters":[{"name":"district","in":"path","required":true,"schema":{"type":"string","title":"District"}},{"name":"tenure","in":"query","required":false,"schema":{"type":"string","default":"ALL","title":"Tenure"}},{"name":"x-cloudflare-secret","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Cloudflare-Secret"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/private/landed/segments/{segment}/stats":{"get":{"summary":"Segment Stats Route","operationId":"segment_stats_route_private_landed_segments__segment__stats_get","parameters":[{"name":"segment","in":"path","required":true,"schema":{"type":"string","title":"Segment"}},{"name":"tenure","in":"query","required":false,"schema":{"type":"string","default":"ALL","title":"Tenure"}},{"name":"x-cloudflare-secret","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Cloudflare-Secret"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/private/landed/projects/{project}/stats":{"get":{"summary":"Project Stats Route","operationId":"project_stats_route_private_landed_projects__project__stats_get","parameters":[{"name":"project","in":"path","required":true,"schema":{"type":"string","title":"Project"}},{"name":"x-cloudflare-secret","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Cloudflare-Secret"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/private/landed/projects/{project}/rental-yield":{"get":{"summary":"Project Yield Route","operationId":"project_yield_route_private_landed_projects__project__rental_yield_get","parameters":[{"name":"project","in":"path","required":true,"schema":{"type":"string","title":"Project"}},{"name":"x-cloudflare-secret","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Cloudflare-Secret"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/private/landed/projects":{"get":{"summary":"List Projects Route","operationId":"list_projects_route_private_landed_projects_get","parameters":[{"name":"district","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"District"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/private/hdb/towns/{town}/stats":{"get":{"summary":"Hdb Town Stats Route","operationId":"hdb_town_stats_route_private_hdb_towns__town__stats_get","parameters":[{"name":"town","in":"path","required":true,"schema":{"type":"string","title":"Town"}},{"name":"flat_type","in":"query","required":false,"schema":{"type":"string","default":"ALL","title":"Flat Type"}},{"name":"x-cloudflare-secret","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Cloudflare-Secret"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/private/hdb/towns":{"get":{"summary":"List Hdb Towns Route","operationId":"list_hdb_towns_route_private_hdb_towns_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/admin/upload":{"post":{"summary":"Admin Upload","description":"Replace all tables from this month's calculated CSVs, in one\ntransaction (via load_db.load - the exact same function the local dev\nloader uses, so there's one implementation of 'replace the tables').","operationId":"admin_upload_admin_upload_post","parameters":[{"name":"x-admin-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Key"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_admin_upload_admin_upload_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}}},"components":{"schemas":{"Body_admin_upload_admin_upload_post":{"properties":{"project_stats_file":{"type":"string","contentMediaType":"application/octet-stream","title":"Project Stats File"},"district_stats_file":{"type":"string","contentMediaType":"application/octet-stream","title":"District Stats File"},"segment_stats_file":{"type":"string","contentMediaType":"application/octet-stream","title":"Segment Stats File"},"project_yield_file":{"type":"string","contentMediaType":"application/octet-stream","title":"Project Yield File"}},"type":"object","required":["project_stats_file","district_stats_file","segment_stats_file","project_yield_file"],"title":"Body_admin_upload_admin_upload_post"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"}}}}