{"openapi":"3.1.0","info":{"title":"Ukraine Proto Fund Data API","version":"1.0.0","description":"Unified, provenance-first access to Ukrainian observations and lossless source records.","license":{"name":"Source-specific open-data terms apply"}},"servers":[{"url":"https://upf-dataukraine-234928894513.europe-west1.run.app"}],"tags":[{"name":"Catalog"},{"name":"Data"},{"name":"Provenance"},{"name":"Operations"}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","description":"Optional UPF API key or Google ID token for higher page limits."}}},"paths":{"/api/v1/sources":{"get":{"tags":["Catalog"],"summary":"List source corners and coverage","responses":{"200":{"description":"Source list"}}}},"/api/v1/datasets":{"get":{"tags":["Catalog"],"summary":"Search datasets","parameters":[{"name":"source","in":"query","schema":{"type":"string"}},{"name":"q","in":"query","schema":{"type":"string"}},{"name":"category","in":"query","schema":{"type":"string"}},{"name":"frequency","in":"query","schema":{"type":"string"}},{"name":"limit","in":"query","schema":{"type":"integer","maximum":500,"default":50}},{"name":"offset","in":"query","schema":{"type":"integer","default":0}}],"responses":{"200":{"description":"Paginated dataset catalog"}}}},"/api/v1/facets":{"get":{"tags":["Catalog"],"summary":"List category and frequency filters","parameters":[{"name":"source","in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"Catalog facets and dataset counts"}}}},"/api/v1/datasets/{dataset_uid}":{"get":{"tags":["Catalog"],"summary":"Dataset metadata and provenance","parameters":[{"name":"dataset_uid","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Dataset"},"404":{"description":"Not found"}}}},"/api/v1/datasets/{dataset_uid}/observations":{"get":{"tags":["Data"],"summary":"Normalized observations","parameters":[{"name":"dataset_uid","in":"path","required":true,"schema":{"type":"string"}},{"name":"start","in":"query","schema":{"type":"string","format":"date"}},{"name":"end","in":"query","schema":{"type":"string","format":"date"}},{"name":"indicator","in":"query","schema":{"type":"string"}},{"name":"region","in":"query","schema":{"type":"string"}},{"name":"format","in":"query","schema":{"enum":["json","csv"]}},{"name":"limit","in":"query","schema":{"type":"integer","maximum":10000,"default":1000}},{"name":"offset","in":"query","schema":{"type":"integer","default":0}}],"responses":{"200":{"description":"Observation page or CSV export"}}}},"/api/v1/datasets/{dataset_uid}/records":{"get":{"tags":["Data"],"summary":"Lossless source records","parameters":[{"name":"dataset_uid","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Raw record page with provenance"}}}},"/api/v1/provenance/{record_uid}":{"get":{"tags":["Provenance"],"summary":"Resolve a UPF record to its source","parameters":[{"name":"record_uid","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Record provenance"},"404":{"description":"Not found"}}}},"/api/v1/audit":{"get":{"tags":["Provenance"],"summary":"Coverage and ingestion audit","responses":{"200":{"description":"Current audit"}}}},"/api/v1/schema":{"get":{"tags":["Operations"],"summary":"Identifier and provenance contract","responses":{"200":{"description":"UPF schema summary"}}}},"/api/v1/auth/session":{"get":{"tags":["Operations"],"summary":"Inspect bearer authentication state","security":[{},{"bearerAuth":[]}],"responses":{"200":{"description":"Current API role"}}}},"/health":{"get":{"tags":["Operations"],"summary":"Cloud Run and Cloud SQL health","responses":{"200":{"description":"Healthy service"}}}},"/openapi.json":{"get":{"tags":["Catalog"],"summary":"OpenAPI 3.1 document","responses":{"200":{"description":"OpenAPI JSON"}}}}}}