{"openapi":"3.1.0","info":{"title":"RemitScan Public Data API","description":"## RemitScan Public Data API\n\nFree, read-only API for European generation outage and REMIT disclosure data.\nNo API key required. Rate limit: **60 requests / minute per IP**.\n\n### What this API covers\n\n- **Generation outages** across all 36 ENTSO-E member states, sourced from the ENTSO-E Transparency Platform\n- **UMM publications** (Urgent Market Messages) from authorised Inside Information Platforms (IIPs)\n- **Asset profiles** with installed capacity, fuel type, bidding zone, and live outage status\n- **Country dashboards** with headline KPIs, fuel breakdown, and 30-day outage trend\n\n### Content negotiation\n\nAppend `Accept: application/ld+json` to any entity URL to receive a JSON-LD\nrepresentation. See the [Linked Data routes](#tag/linked-data) for full coverage.\n\n### Rate limits\n\nEvery response includes:\n\n| Header | Description |\n|--------|-------------|\n| `X-Request-ID` | Unique request identifier for support queries |\n| `X-RateLimit-Limit` | Requests allowed per window |\n| `X-RateLimit-Remaining` | Requests remaining in current window |\n\nExceeding the rate limit returns **HTTP 429** with a `Retry-After` header.\n\n### Versioning\n\nThe `/api/public/v1/` prefix is stable. Unversioned `/api/public/` endpoints\nare deprecated and will be removed **2026-11-01** (see `Sunset` header).\n\n### Data sources and licensing\n\nAll data is derived from public sources. See the\n[methodology page](https://remitscan.vercel.app/methodology) for lineage details.\nData is available under **CC-BY-4.0** with attribution to \"RemitScan\".\n\n### Developer resources\n\n- **OpenAPI schema**: `/api/openapi.json`\n- **Swagger UI**: `/api/docs`\n- **ReDoc**: `/api/redoc`\n- **GitHub**: [RemitScan](https://remitscan.vercel.app)","termsOfService":"https://remitscan.eu/terms","contact":{"name":"RemitScan","url":"https://remitscan.vercel.app/","email":"amritbir1@gmail.com"},"license":{"name":"CC-BY-4.0","url":"https://creativecommons.org/licenses/by/4.0/"},"version":"1.0.0"},"servers":[{"url":"https://remitscan.vercel.app/api/proxy","description":"Public proxy (authenticated via Vercel WIF)"}],"paths":{"/asset/{entity_id}":{"get":{"tags":["linked-data"],"summary":"Get Asset","operationId":"get_asset_asset__entity_id__get","parameters":[{"name":"entity_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Entity Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}},"headers":{"X-Request-Id":{"description":"Unique request identifier for error correlation and support queries.","schema":{"type":"string","example":"a3f1b2c4d5e6"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}},"headers":{"X-Request-Id":{"description":"Unique request identifier for error correlation and support queries.","schema":{"type":"string","example":"a3f1b2c4d5e6"}}}}}}},"/asset/eic/{eic_code}":{"get":{"tags":["linked-data"],"summary":"Get Asset By Eic","operationId":"get_asset_by_eic_asset_eic__eic_code__get","parameters":[{"name":"eic_code","in":"path","required":true,"schema":{"type":"string","title":"Eic Code"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}},"headers":{"X-Request-Id":{"description":"Unique request identifier for error correlation and support queries.","schema":{"type":"string","example":"a3f1b2c4d5e6"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}},"headers":{"X-Request-Id":{"description":"Unique request identifier for error correlation and support queries.","schema":{"type":"string","example":"a3f1b2c4d5e6"}}}}}}},"/mp/{entity_id}":{"get":{"tags":["linked-data"],"summary":"Get Mp","operationId":"get_mp_mp__entity_id__get","parameters":[{"name":"entity_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Entity Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}},"headers":{"X-Request-Id":{"description":"Unique request identifier for error correlation and support queries.","schema":{"type":"string","example":"a3f1b2c4d5e6"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}},"headers":{"X-Request-Id":{"description":"Unique request identifier for error correlation and support queries.","schema":{"type":"string","example":"a3f1b2c4d5e6"}}}}}}},"/outage/{entity_id}":{"get":{"tags":["linked-data"],"summary":"Get Outage","operationId":"get_outage_outage__entity_id__get","parameters":[{"name":"entity_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Entity Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}},"headers":{"X-Request-Id":{"description":"Unique request identifier for error correlation and support queries.","schema":{"type":"string","example":"a3f1b2c4d5e6"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}},"headers":{"X-Request-Id":{"description":"Unique request identifier for error correlation and support queries.","schema":{"type":"string","example":"a3f1b2c4d5e6"}}}}}}},"/umm/{entity_id}":{"get":{"tags":["linked-data"],"summary":"Get Umm","operationId":"get_umm_umm__entity_id__get","parameters":[{"name":"entity_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Entity Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}},"headers":{"X-Request-Id":{"description":"Unique request identifier for error correlation and support queries.","schema":{"type":"string","example":"a3f1b2c4d5e6"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}},"headers":{"X-Request-Id":{"description":"Unique request identifier for error correlation and support queries.","schema":{"type":"string","example":"a3f1b2c4d5e6"}}}}}}},"/iip/{entity_id}":{"get":{"tags":["linked-data"],"summary":"Get Iip","operationId":"get_iip_iip__entity_id__get","parameters":[{"name":"entity_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Entity Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}},"headers":{"X-Request-Id":{"description":"Unique request identifier for error correlation and support queries.","schema":{"type":"string","example":"a3f1b2c4d5e6"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}},"headers":{"X-Request-Id":{"description":"Unique request identifier for error correlation and support queries.","schema":{"type":"string","example":"a3f1b2c4d5e6"}}}}}}},"/tso/{entity_id}":{"get":{"tags":["linked-data"],"summary":"Get Tso","operationId":"get_tso_tso__entity_id__get","parameters":[{"name":"entity_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Entity Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}},"headers":{"X-Request-Id":{"description":"Unique request identifier for error correlation and support queries.","schema":{"type":"string","example":"a3f1b2c4d5e6"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}},"headers":{"X-Request-Id":{"description":"Unique request identifier for error correlation and support queries.","schema":{"type":"string","example":"a3f1b2c4d5e6"}}}}}}},"/zone/{entity_id}":{"get":{"tags":["linked-data"],"summary":"Get Zone","operationId":"get_zone_zone__entity_id__get","parameters":[{"name":"entity_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Entity Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}},"headers":{"X-Request-Id":{"description":"Unique request identifier for error correlation and support queries.","schema":{"type":"string","example":"a3f1b2c4d5e6"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}},"headers":{"X-Request-Id":{"description":"Unique request identifier for error correlation and support queries.","schema":{"type":"string","example":"a3f1b2c4d5e6"}}}}}}},"/country/{iso_code}":{"get":{"tags":["linked-data"],"summary":"Get Country","operationId":"get_country_country__iso_code__get","parameters":[{"name":"iso_code","in":"path","required":true,"schema":{"type":"string","title":"Iso Code"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}},"headers":{"X-Request-Id":{"description":"Unique request identifier for error correlation and support queries.","schema":{"type":"string","example":"a3f1b2c4d5e6"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}},"headers":{"X-Request-Id":{"description":"Unique request identifier for error correlation and support queries.","schema":{"type":"string","example":"a3f1b2c4d5e6"}}}}}}},"/api/public/mps":{"get":{"tags":["public"],"summary":"Search Mps","description":"Search active market participants by name or ACER code.","operationId":"search_mps_api_public_mps_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"type":"string","maxLength":200,"default":"","title":"Q"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}},"headers":{"X-Request-Id":{"description":"Unique request identifier for error correlation and support queries.","schema":{"type":"string","example":"a3f1b2c4d5e6"}},"X-RateLimit-Limit":{"description":"Maximum requests allowed per rate-limit window.","schema":{"type":"integer","example":60}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current rate-limit window.","schema":{"type":"integer","example":47}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}},"headers":{"X-Request-Id":{"description":"Unique request identifier for error correlation and support queries.","schema":{"type":"string","example":"a3f1b2c4d5e6"}},"X-RateLimit-Limit":{"description":"Maximum requests allowed per rate-limit window.","schema":{"type":"integer","example":60}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current rate-limit window.","schema":{"type":"integer","example":47}}}}}}},"/api/public/coverage_status":{"get":{"tags":["public"],"summary":"Coverage Status","description":"Live data-coverage transparency endpoint — what the platform can currently see\nand what it cannot. Surfaces the §09 gaps with current numeric impact so regulators\nand MPs can interpret an empty flag inbox correctly.\n\nNo authentication required by design — transparency is the point.","operationId":"coverage_status_api_public_coverage_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}},"headers":{"X-Request-Id":{"description":"Unique request identifier for error correlation and support queries.","schema":{"type":"string","example":"a3f1b2c4d5e6"}},"X-RateLimit-Limit":{"description":"Maximum requests allowed per rate-limit window.","schema":{"type":"integer","example":60}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current rate-limit window.","schema":{"type":"integer","example":47}}}}}}},"/api/public/outages/geojson":{"get":{"tags":["public"],"summary":"Get Outage Geojson","description":"Return all generation outages as a GeoJSON FeatureCollection.\n\nCovers the specified lookback window. No authentication required.\nResponse includes UMM disclosure attribution where available.","operationId":"get_outage_geojson_api_public_outages_geojson_get","parameters":[{"name":"window_days","in":"query","required":false,"schema":{"type":"integer","maximum":90,"minimum":1,"default":30,"title":"Window Days"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":400,"minimum":50,"default":400,"title":"Page Size"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}},"headers":{"X-Request-Id":{"description":"Unique request identifier for error correlation and support queries.","schema":{"type":"string","example":"a3f1b2c4d5e6"}},"X-RateLimit-Limit":{"description":"Maximum requests allowed per rate-limit window.","schema":{"type":"integer","example":60}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current rate-limit window.","schema":{"type":"integer","example":47}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}},"headers":{"X-Request-Id":{"description":"Unique request identifier for error correlation and support queries.","schema":{"type":"string","example":"a3f1b2c4d5e6"}},"X-RateLimit-Limit":{"description":"Maximum requests allowed per rate-limit window.","schema":{"type":"integer","example":60}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current rate-limit window.","schema":{"type":"integer","example":47}}}}}}},"/api/public/umms/geojson":{"get":{"tags":["public"],"summary":"Get Umm Geojson","description":"Return UMM publications as a GeoJSON FeatureCollection.\n\nOne marker per asset (most recent UMM in the window). Includes\nhas_matching_outage flag so the frontend can colour-code overlap.","operationId":"get_umm_geojson_api_public_umms_geojson_get","parameters":[{"name":"window_days","in":"query","required":false,"schema":{"type":"integer","maximum":90,"minimum":1,"default":30,"title":"Window Days"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":5000,"minimum":50,"default":2000,"title":"Page Size"}},{"name":"commodity","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by commodity: 'gas' or 'electricity'","title":"Commodity"},"description":"Filter by commodity: 'gas' or 'electricity'"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}},"headers":{"X-Request-Id":{"description":"Unique request identifier for error correlation and support queries.","schema":{"type":"string","example":"a3f1b2c4d5e6"}},"X-RateLimit-Limit":{"description":"Maximum requests allowed per rate-limit window.","schema":{"type":"integer","example":60}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current rate-limit window.","schema":{"type":"integer","example":47}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}},"headers":{"X-Request-Id":{"description":"Unique request identifier for error correlation and support queries.","schema":{"type":"string","example":"a3f1b2c4d5e6"}},"X-RateLimit-Limit":{"description":"Maximum requests allowed per rate-limit window.","schema":{"type":"integer","example":60}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current rate-limit window.","schema":{"type":"integer","example":47}}}}}}},"/api/public/geoloc-stats":{"get":{"tags":["public"],"summary":"Get Geoloc Stats","description":"Return geolocalization coverage stats for active outages and UMMs.\n\nClassifies each asset as: exact_coords / centroid_only / hidden.","operationId":"get_geoloc_stats_api_public_geoloc_stats_get","parameters":[{"name":"window_days","in":"query","required":false,"schema":{"type":"integer","maximum":90,"minimum":1,"default":30,"title":"Window Days"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}},"headers":{"X-Request-Id":{"description":"Unique request identifier for error correlation and support queries.","schema":{"type":"string","example":"a3f1b2c4d5e6"}},"X-RateLimit-Limit":{"description":"Maximum requests allowed per rate-limit window.","schema":{"type":"integer","example":60}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current rate-limit window.","schema":{"type":"integer","example":47}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}},"headers":{"X-Request-Id":{"description":"Unique request identifier for error correlation and support queries.","schema":{"type":"string","example":"a3f1b2c4d5e6"}},"X-RateLimit-Limit":{"description":"Maximum requests allowed per rate-limit window.","schema":{"type":"integer","example":60}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current rate-limit window.","schema":{"type":"integer","example":47}}}}}}},"/api/public/pulse":{"get":{"tags":["public"],"summary":"European outage pulse","description":"Return aggregate generation outage statistics for the public pulse page.\n\nAll data is country-level or Europe-wide only — no per-market-participant\nor per-asset data is returned.","operationId":"get_pulse_api_public_pulse_get","parameters":[{"name":"window_days","in":"query","required":false,"schema":{"type":"integer","maximum":90,"minimum":1,"default":30,"title":"Window Days"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{},"example":{"summary":{"active_outage_count":47,"total_unavailable_mw":11545,"countries_with_outages":14,"data_freshness":"2026-05-09T11:58:00Z"},"by_country":[{"country_code":"DE","active_outage_count":12,"total_unavailable_mw":3200}],"by_fuel":[{"fuel_type":"natural_gas","active_outage_count":18,"total_unavailable_mw":4500}]}}},"headers":{"X-Request-Id":{"description":"Unique request identifier for error correlation and support queries.","schema":{"type":"string","example":"a3f1b2c4d5e6"}},"X-RateLimit-Limit":{"description":"Maximum requests allowed per rate-limit window.","schema":{"type":"integer","example":60}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current rate-limit window.","schema":{"type":"integer","example":47}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}},"headers":{"X-Request-Id":{"description":"Unique request identifier for error correlation and support queries.","schema":{"type":"string","example":"a3f1b2c4d5e6"}},"X-RateLimit-Limit":{"description":"Maximum requests allowed per rate-limit window.","schema":{"type":"integer","example":60}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current rate-limit window.","schema":{"type":"integer","example":47}}}}}}},"/api/public/asset/{asset_id}":{"get":{"tags":["public"],"summary":"Asset profile","description":"Return a public asset profile with current outage, identifiers, and history.\n\nNo per-market-participant data is returned. Operator name is the only\nMP-derived field.","operationId":"get_asset_api_public_asset__asset_id__get","parameters":[{"name":"asset_id","in":"path","required":true,"schema":{"type":"string","title":"Asset Id"}},{"name":"asset_id","in":"path","example":"3fa85f64-5717-4562-b3fc-2c963f66afa6"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{},"example":{"asset_id":"3fa85f64-5717-4562-b3fc-2c963f66afa6","name":"Kraftwerk Irsching","fuel_type":"natural_gas","installed_capacity_mw":850,"bidding_zone":"DE","country":"DE","latitude":48.82,"longitude":11.62,"commissioning_year":2010,"tso":"TenneT","operator_name":"Uniper","current_outage":{"is_outage":true,"start_date":"2026-05-07T06:00:00Z","unavailable_mw":420,"publication_id":"pub-001","publication_title":"Planned maintenance"},"data_freshness":"2026-05-09T11:58:00Z"}}},"headers":{"X-Request-Id":{"description":"Unique request identifier for error correlation and support queries.","schema":{"type":"string","example":"a3f1b2c4d5e6"}},"X-RateLimit-Limit":{"description":"Maximum requests allowed per rate-limit window.","schema":{"type":"integer","example":60}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current rate-limit window.","schema":{"type":"integer","example":47}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}},"headers":{"X-Request-Id":{"description":"Unique request identifier for error correlation and support queries.","schema":{"type":"string","example":"a3f1b2c4d5e6"}},"X-RateLimit-Limit":{"description":"Maximum requests allowed per rate-limit window.","schema":{"type":"integer","example":60}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current rate-limit window.","schema":{"type":"integer","example":47}}}},"404":{"description":"Asset not found","headers":{"X-Request-Id":{"description":"Unique request identifier for error correlation and support queries.","schema":{"type":"string","example":"a3f1b2c4d5e6"}},"X-RateLimit-Limit":{"description":"Maximum requests allowed per rate-limit window.","schema":{"type":"integer","example":60}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current rate-limit window.","schema":{"type":"integer","example":47}}}}}}},"/api/public/asset/eic/{eic_code}":{"get":{"tags":["public"],"summary":"Get Asset By Eic","description":"Resolve an EIC-W code to the canonical asset_id.","operationId":"get_asset_by_eic_api_public_asset_eic__eic_code__get","parameters":[{"name":"eic_code","in":"path","required":true,"schema":{"type":"string","title":"Eic Code"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}},"headers":{"X-Request-Id":{"description":"Unique request identifier for error correlation and support queries.","schema":{"type":"string","example":"a3f1b2c4d5e6"}},"X-RateLimit-Limit":{"description":"Maximum requests allowed per rate-limit window.","schema":{"type":"integer","example":60}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current rate-limit window.","schema":{"type":"integer","example":47}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}},"headers":{"X-Request-Id":{"description":"Unique request identifier for error correlation and support queries.","schema":{"type":"string","example":"a3f1b2c4d5e6"}},"X-RateLimit-Limit":{"description":"Maximum requests allowed per rate-limit window.","schema":{"type":"integer","example":60}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current rate-limit window.","schema":{"type":"integer","example":47}}}}}}},"/api/public/country/{country_code}":{"get":{"tags":["public"],"summary":"Country outage dashboard","description":"Return aggregate country dashboard data for a single country.\n\nAll data is country-aggregate only — zero per-MP names, scores,\nflags, or detection metadata.","operationId":"get_country_dashboard_api_public_country__country_code__get","parameters":[{"name":"country_code","in":"path","required":true,"schema":{"type":"string","title":"Country Code"}},{"name":"window_days","in":"query","required":false,"schema":{"type":"integer","maximum":90,"minimum":1,"default":30,"title":"Window Days"}},{"name":"country_code","in":"path","example":"DE"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{},"example":{"country_code":"DE","headline":{"active_outage_count":12,"total_unavailable_mw":3200,"countries_with_outages":1},"fuel_breakdown":[{"fuel_type":"natural_gas","outage_count":5,"unavailable_mw":1500}],"daily_timeseries":[{"date":"2026-05-08","outage_count":10,"unavailable_mw":3000}],"active_assets":[{"asset_id":"3fa85f64-5717-4562-b3fc-2c963f66afa6","asset_name":"Kraftwerk Irsching","fuel_type":"natural_gas","unavailable_mw":850,"outage_start":"2026-05-07T06:00:00Z"}],"data_freshness":"2026-05-09T11:58:00Z"}}},"headers":{"X-Request-Id":{"description":"Unique request identifier for error correlation and support queries.","schema":{"type":"string","example":"a3f1b2c4d5e6"}},"X-RateLimit-Limit":{"description":"Maximum requests allowed per rate-limit window.","schema":{"type":"integer","example":60}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current rate-limit window.","schema":{"type":"integer","example":47}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}},"headers":{"X-Request-Id":{"description":"Unique request identifier for error correlation and support queries.","schema":{"type":"string","example":"a3f1b2c4d5e6"}},"X-RateLimit-Limit":{"description":"Maximum requests allowed per rate-limit window.","schema":{"type":"integer","example":60}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current rate-limit window.","schema":{"type":"integer","example":47}}}},"404":{"description":"Country code not found in ontology","headers":{"X-Request-Id":{"description":"Unique request identifier for error correlation and support queries.","schema":{"type":"string","example":"a3f1b2c4d5e6"}},"X-RateLimit-Limit":{"description":"Maximum requests allowed per rate-limit window.","schema":{"type":"integer","example":60}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current rate-limit window.","schema":{"type":"integer","example":47}}}}}}},"/api/public/umms":{"get":{"tags":["public"],"summary":"Get Umm Corpus","description":"List and search UMM publications with structured filters.","operationId":"get_umm_corpus_api_public_umms_get","parameters":[{"name":"country","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country"}},{"name":"fuel_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Fuel Type"}},{"name":"date_from","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Date From"}},{"name":"date_to","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Date To"}},{"name":"mp","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Mp"}},{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Q"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}},"headers":{"X-Request-Id":{"description":"Unique request identifier for error correlation and support queries.","schema":{"type":"string","example":"a3f1b2c4d5e6"}},"X-RateLimit-Limit":{"description":"Maximum requests allowed per rate-limit window.","schema":{"type":"integer","example":60}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current rate-limit window.","schema":{"type":"integer","example":47}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}},"headers":{"X-Request-Id":{"description":"Unique request identifier for error correlation and support queries.","schema":{"type":"string","example":"a3f1b2c4d5e6"}},"X-RateLimit-Limit":{"description":"Maximum requests allowed per rate-limit window.","schema":{"type":"integer","example":60}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current rate-limit window.","schema":{"type":"integer","example":47}}}}}}},"/api/public/umm/{publication_id}":{"get":{"tags":["public"],"summary":"Get Umm Detail","description":"Return full detail for a single UMM publication.","operationId":"get_umm_detail_api_public_umm__publication_id__get","parameters":[{"name":"publication_id","in":"path","required":true,"schema":{"type":"string","title":"Publication Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}},"headers":{"X-Request-Id":{"description":"Unique request identifier for error correlation and support queries.","schema":{"type":"string","example":"a3f1b2c4d5e6"}},"X-RateLimit-Limit":{"description":"Maximum requests allowed per rate-limit window.","schema":{"type":"integer","example":60}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current rate-limit window.","schema":{"type":"integer","example":47}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}},"headers":{"X-Request-Id":{"description":"Unique request identifier for error correlation and support queries.","schema":{"type":"string","example":"a3f1b2c4d5e6"}},"X-RateLimit-Limit":{"description":"Maximum requests allowed per rate-limit window.","schema":{"type":"integer","example":60}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current rate-limit window.","schema":{"type":"integer","example":47}}}}}}},"/api/public/statistics/map-hexbins":{"get":{"tags":["public"],"summary":"Get Map Hexbins","description":"Outage density heatmap data aggregated into spatial grid cells.\n\nPrivacy threshold: cells with fewer than 3 distinct market participants\nare excluded from the response.","operationId":"get_map_hexbins_api_public_statistics_map_hexbins_get","parameters":[{"name":"window_hours","in":"query","required":false,"schema":{"type":"integer","maximum":168,"minimum":1,"default":24,"title":"Window Hours"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}},"headers":{"X-Request-Id":{"description":"Unique request identifier for error correlation and support queries.","schema":{"type":"string","example":"a3f1b2c4d5e6"}},"X-RateLimit-Limit":{"description":"Maximum requests allowed per rate-limit window.","schema":{"type":"integer","example":60}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current rate-limit window.","schema":{"type":"integer","example":47}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}},"headers":{"X-Request-Id":{"description":"Unique request identifier for error correlation and support queries.","schema":{"type":"string","example":"a3f1b2c4d5e6"}},"X-RateLimit-Limit":{"description":"Maximum requests allowed per rate-limit window.","schema":{"type":"integer","example":60}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current rate-limit window.","schema":{"type":"integer","example":47}}}}}}},"/api/public/statistics/mw-intensity":{"get":{"tags":["public"],"summary":"Get Mw Intensity","description":"MW-intensity data aggregated by bidding zone.\n\nPrivacy threshold: zones with fewer than 3 distinct market participants\nhave their intensity_ratio returned as null.","operationId":"get_mw_intensity_api_public_statistics_mw_intensity_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}},"headers":{"X-Request-Id":{"description":"Unique request identifier for error correlation and support queries.","schema":{"type":"string","example":"a3f1b2c4d5e6"}},"X-RateLimit-Limit":{"description":"Maximum requests allowed per rate-limit window.","schema":{"type":"integer","example":60}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current rate-limit window.","schema":{"type":"integer","example":47}}}}}}},"/api/public/statistics/country/{country_code}":{"get":{"tags":["public"],"summary":"Get Country Statistics","description":"Duration and MW distributions for a country.\n\nPrivacy threshold: buckets with fewer than 3 distinct market participants\nare merged into the adjacent higher bucket.","operationId":"get_country_statistics_api_public_statistics_country__country_code__get","parameters":[{"name":"country_code","in":"path","required":true,"schema":{"type":"string","title":"Country Code"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}},"headers":{"X-Request-Id":{"description":"Unique request identifier for error correlation and support queries.","schema":{"type":"string","example":"a3f1b2c4d5e6"}},"X-RateLimit-Limit":{"description":"Maximum requests allowed per rate-limit window.","schema":{"type":"integer","example":60}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current rate-limit window.","schema":{"type":"integer","example":47}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}},"headers":{"X-Request-Id":{"description":"Unique request identifier for error correlation and support queries.","schema":{"type":"string","example":"a3f1b2c4d5e6"}},"X-RateLimit-Limit":{"description":"Maximum requests allowed per rate-limit window.","schema":{"type":"integer","example":60}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current rate-limit window.","schema":{"type":"integer","example":47}}}}}}},"/api/public/assets":{"get":{"tags":["public"],"summary":"List Assets","description":"Return all asset entity IDs and EIC codes for sitemap generation.\n\nLightweight endpoint returning only identifiers and data freshness.\nNo per-MP data; no privacy threshold applies.","operationId":"list_assets_api_public_assets_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}},"headers":{"X-Request-Id":{"description":"Unique request identifier for error correlation and support queries.","schema":{"type":"string","example":"a3f1b2c4d5e6"}},"X-RateLimit-Limit":{"description":"Maximum requests allowed per rate-limit window.","schema":{"type":"integer","example":60}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current rate-limit window.","schema":{"type":"integer","example":47}}}}}}},"/api/public/statistics/asset/{asset_id}":{"get":{"tags":["public"],"summary":"Get Asset Statistics","description":"Per-asset statistical comparison context.\n\nCompares the asset's outage patterns to fuel-type and bidding-zone\naggregates. Privacy threshold: comparison groups with fewer than 3\ndistinct market participants have their aggregate values returned as null.","operationId":"get_asset_statistics_api_public_statistics_asset__asset_id__get","parameters":[{"name":"asset_id","in":"path","required":true,"schema":{"type":"string","title":"Asset Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}},"headers":{"X-Request-Id":{"description":"Unique request identifier for error correlation and support queries.","schema":{"type":"string","example":"a3f1b2c4d5e6"}},"X-RateLimit-Limit":{"description":"Maximum requests allowed per rate-limit window.","schema":{"type":"integer","example":60}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current rate-limit window.","schema":{"type":"integer","example":47}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}},"headers":{"X-Request-Id":{"description":"Unique request identifier for error correlation and support queries.","schema":{"type":"string","example":"a3f1b2c4d5e6"}},"X-RateLimit-Limit":{"description":"Maximum requests allowed per rate-limit window.","schema":{"type":"integer","example":60}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current rate-limit window.","schema":{"type":"integer","example":47}}}}}}},"/api/public/v1/health":{"get":{"tags":["Public API v1","Health"],"summary":"API health check","operationId":"health_api_public_v1_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Health Api Public V1 Health Get"}}},"headers":{"X-Request-Id":{"description":"Unique request identifier for error correlation and support queries.","schema":{"type":"string","example":"a3f1b2c4d5e6"}},"X-RateLimit-Limit":{"description":"Maximum requests allowed per rate-limit window.","schema":{"type":"integer","example":60}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current rate-limit window.","schema":{"type":"integer","example":47}}}}}}},"/api/public/v1/outages/geojson":{"get":{"tags":["Public API v1","Outage Map"],"summary":"Generation outages GeoJSON","description":"Generation outages as a GeoJSON FeatureCollection.\n\nEach feature is an asset with an active or recent outage.","operationId":"get_outage_geojson_v1_api_public_v1_outages_geojson_get","parameters":[{"name":"window_days","in":"query","required":false,"schema":{"type":"integer","maximum":90,"minimum":1,"default":30,"title":"Window Days"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}},"headers":{"X-Request-Id":{"description":"Unique request identifier for error correlation and support queries.","schema":{"type":"string","example":"a3f1b2c4d5e6"}},"X-RateLimit-Limit":{"description":"Maximum requests allowed per rate-limit window.","schema":{"type":"integer","example":60}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current rate-limit window.","schema":{"type":"integer","example":47}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}},"headers":{"X-Request-Id":{"description":"Unique request identifier for error correlation and support queries.","schema":{"type":"string","example":"a3f1b2c4d5e6"}},"X-RateLimit-Limit":{"description":"Maximum requests allowed per rate-limit window.","schema":{"type":"integer","example":60}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current rate-limit window.","schema":{"type":"integer","example":47}}}}}}},"/api/public/v1/statistics/map-hexbins":{"get":{"tags":["Public API v1"],"summary":"Outage density hexbin grid","description":"Outage density heatmap data aggregated into spatial grid cells.\n\nPrivacy threshold: cells with fewer than 3 distinct market participants\nare excluded from the response.","operationId":"get_map_hexbins_v1_api_public_v1_statistics_map_hexbins_get","parameters":[{"name":"window_hours","in":"query","required":false,"schema":{"type":"integer","maximum":168,"minimum":1,"default":24,"title":"Window Hours"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{},"example":{"data":{"hexbins":[{"hex_id":"grid_51.0_10.0","centroid_lat":51.0,"centroid_lon":10.0,"outage_count":12,"total_unavailable_mw":3450,"top_fuel_type":"natural_gas"}]},"meta":{"generated_at":"2026-05-09T12:00:00Z","window_hours":24}}}},"headers":{"X-Request-Id":{"description":"Unique request identifier for error correlation and support queries.","schema":{"type":"string","example":"a3f1b2c4d5e6"}},"X-RateLimit-Limit":{"description":"Maximum requests allowed per rate-limit window.","schema":{"type":"integer","example":60}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current rate-limit window.","schema":{"type":"integer","example":47}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}},"headers":{"X-Request-Id":{"description":"Unique request identifier for error correlation and support queries.","schema":{"type":"string","example":"a3f1b2c4d5e6"}},"X-RateLimit-Limit":{"description":"Maximum requests allowed per rate-limit window.","schema":{"type":"integer","example":60}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current rate-limit window.","schema":{"type":"integer","example":47}}}}}}},"/api/public/v1/statistics/mw-intensity":{"get":{"tags":["Public API v1"],"summary":"Get Mw Intensity V1","description":"MW-intensity data aggregated by bidding zone.\n\nPrivacy threshold: zones with fewer than 3 distinct market participants\nhave their intensity_ratio returned as null.","operationId":"get_mw_intensity_v1_api_public_v1_statistics_mw_intensity_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}},"headers":{"X-Request-Id":{"description":"Unique request identifier for error correlation and support queries.","schema":{"type":"string","example":"a3f1b2c4d5e6"}},"X-RateLimit-Limit":{"description":"Maximum requests allowed per rate-limit window.","schema":{"type":"integer","example":60}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current rate-limit window.","schema":{"type":"integer","example":47}}}}}}},"/api/public/v1/statistics/country/{country_code}":{"get":{"tags":["Public API v1"],"summary":"Get Country Statistics V1","description":"Duration and MW distributions for a country.\n\nPrivacy threshold: buckets with fewer than 3 distinct market participants\nare merged into the adjacent higher bucket.","operationId":"get_country_statistics_v1_api_public_v1_statistics_country__country_code__get","parameters":[{"name":"country_code","in":"path","required":true,"schema":{"type":"string","title":"Country Code"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}},"headers":{"X-Request-Id":{"description":"Unique request identifier for error correlation and support queries.","schema":{"type":"string","example":"a3f1b2c4d5e6"}},"X-RateLimit-Limit":{"description":"Maximum requests allowed per rate-limit window.","schema":{"type":"integer","example":60}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current rate-limit window.","schema":{"type":"integer","example":47}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}},"headers":{"X-Request-Id":{"description":"Unique request identifier for error correlation and support queries.","schema":{"type":"string","example":"a3f1b2c4d5e6"}},"X-RateLimit-Limit":{"description":"Maximum requests allowed per rate-limit window.","schema":{"type":"integer","example":60}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current rate-limit window.","schema":{"type":"integer","example":47}}}}}}},"/api/public/v1/statistics/asset/{asset_id}":{"get":{"tags":["Public API v1"],"summary":"Get Asset Statistics V1","description":"Per-asset statistical comparison context (Public API v1).\n\nCompares the asset's outage patterns to fuel-type and bidding-zone\naggregates. Privacy threshold: comparison groups with fewer than 3\ndistinct market participants have their aggregate values returned as null.","operationId":"get_asset_statistics_v1_api_public_v1_statistics_asset__asset_id__get","parameters":[{"name":"asset_id","in":"path","required":true,"schema":{"type":"string","title":"Asset Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}},"headers":{"X-Request-Id":{"description":"Unique request identifier for error correlation and support queries.","schema":{"type":"string","example":"a3f1b2c4d5e6"}},"X-RateLimit-Limit":{"description":"Maximum requests allowed per rate-limit window.","schema":{"type":"integer","example":60}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current rate-limit window.","schema":{"type":"integer","example":47}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}},"headers":{"X-Request-Id":{"description":"Unique request identifier for error correlation and support queries.","schema":{"type":"string","example":"a3f1b2c4d5e6"}},"X-RateLimit-Limit":{"description":"Maximum requests allowed per rate-limit window.","schema":{"type":"integer","example":60}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current rate-limit window.","schema":{"type":"integer","example":47}}}}}}},"/api/public/v1/statistics/countries":{"get":{"tags":["Public API v1"],"summary":"Get Countries Statistics","description":"Aggregate outage statistics for all countries with active outages.\n\nReturns per-country active outage counts, total unavailable MW,\nand the dominant fuel type by outage count.","operationId":"get_countries_statistics_api_public_v1_statistics_countries_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}},"headers":{"X-Request-Id":{"description":"Unique request identifier for error correlation and support queries.","schema":{"type":"string","example":"a3f1b2c4d5e6"}},"X-RateLimit-Limit":{"description":"Maximum requests allowed per rate-limit window.","schema":{"type":"integer","example":60}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current rate-limit window.","schema":{"type":"integer","example":47}}}}}}},"/api/public/v1/reference/fuel-types":{"get":{"tags":["Public API v1"],"summary":"Get Fuel Types","description":"Reference list of fuel types with active outage counts.\n\nReturns all fuel types that currently have at least one active outage,\nordered by outage count descending.","operationId":"get_fuel_types_api_public_v1_reference_fuel_types_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}},"headers":{"X-Request-Id":{"description":"Unique request identifier for error correlation and support queries.","schema":{"type":"string","example":"a3f1b2c4d5e6"}},"X-RateLimit-Limit":{"description":"Maximum requests allowed per rate-limit window.","schema":{"type":"integer","example":60}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current rate-limit window.","schema":{"type":"integer","example":47}}}}}}},"/api/public/v1/mps":{"get":{"tags":["Public API v1"],"summary":"Search market participants","description":"Search active market participants by name or ACER code.","operationId":"get_mps_v1_api_public_v1_mps_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"type":"string","maxLength":200,"default":"","title":"Q"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}},"headers":{"X-Request-Id":{"description":"Unique request identifier for error correlation and support queries.","schema":{"type":"string","example":"a3f1b2c4d5e6"}},"X-RateLimit-Limit":{"description":"Maximum requests allowed per rate-limit window.","schema":{"type":"integer","example":60}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current rate-limit window.","schema":{"type":"integer","example":47}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}},"headers":{"X-Request-Id":{"description":"Unique request identifier for error correlation and support queries.","schema":{"type":"string","example":"a3f1b2c4d5e6"}},"X-RateLimit-Limit":{"description":"Maximum requests allowed per rate-limit window.","schema":{"type":"integer","example":60}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current rate-limit window.","schema":{"type":"integer","example":47}}}}}}},"/api/public/v1/pulse":{"get":{"tags":["Public API v1"],"summary":"European generation outage pulse","description":"Aggregate generation outage statistics for the pulse dashboard.\n\nAll data is country-level or Europe-wide only — no per-MP or per-asset data.","operationId":"get_pulse_v1_api_public_v1_pulse_get","parameters":[{"name":"window_days","in":"query","required":false,"schema":{"type":"integer","maximum":90,"minimum":1,"default":30,"title":"Window Days"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}},"headers":{"X-Request-Id":{"description":"Unique request identifier for error correlation and support queries.","schema":{"type":"string","example":"a3f1b2c4d5e6"}},"X-RateLimit-Limit":{"description":"Maximum requests allowed per rate-limit window.","schema":{"type":"integer","example":60}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current rate-limit window.","schema":{"type":"integer","example":47}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}},"headers":{"X-Request-Id":{"description":"Unique request identifier for error correlation and support queries.","schema":{"type":"string","example":"a3f1b2c4d5e6"}},"X-RateLimit-Limit":{"description":"Maximum requests allowed per rate-limit window.","schema":{"type":"integer","example":60}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current rate-limit window.","schema":{"type":"integer","example":47}}}}}}},"/api/public/v1/assets":{"get":{"tags":["Public API v1"],"summary":"List all asset identifiers","description":"Return all asset entity IDs and EIC codes for sitemap generation.\n\nLightweight — identifiers only. No per-MP data; no privacy threshold applies.","operationId":"list_assets_v1_api_public_v1_assets_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}},"headers":{"X-Request-Id":{"description":"Unique request identifier for error correlation and support queries.","schema":{"type":"string","example":"a3f1b2c4d5e6"}},"X-RateLimit-Limit":{"description":"Maximum requests allowed per rate-limit window.","schema":{"type":"integer","example":60}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current rate-limit window.","schema":{"type":"integer","example":47}}}}}}},"/api/public/v1/assets/list":{"get":{"tags":["Public API v1"],"summary":"Asset explorer list","description":"Return up to 500 assets with fuel, country, installed capacity, and active outage status.\n\nUsed by the asset explorer UI. Sorted by active unavailable MW desc, then installed capacity desc.","operationId":"list_assets_detail_v1_api_public_v1_assets_list_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}},"headers":{"X-Request-Id":{"description":"Unique request identifier for error correlation and support queries.","schema":{"type":"string","example":"a3f1b2c4d5e6"}},"X-RateLimit-Limit":{"description":"Maximum requests allowed per rate-limit window.","schema":{"type":"integer","example":60}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current rate-limit window.","schema":{"type":"integer","example":47}}}}}}},"/api/public/v1/asset/{asset_id}":{"get":{"tags":["Public API v1"],"summary":"Asset profile","description":"Public asset profile with current outage, identifiers, and 90-day history.\n\nNo per-market-participant scores or flags are returned.","operationId":"get_asset_v1_api_public_v1_asset__asset_id__get","parameters":[{"name":"asset_id","in":"path","required":true,"schema":{"type":"string","title":"Asset Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}},"headers":{"X-Request-Id":{"description":"Unique request identifier for error correlation and support queries.","schema":{"type":"string","example":"a3f1b2c4d5e6"}},"X-RateLimit-Limit":{"description":"Maximum requests allowed per rate-limit window.","schema":{"type":"integer","example":60}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current rate-limit window.","schema":{"type":"integer","example":47}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}},"headers":{"X-Request-Id":{"description":"Unique request identifier for error correlation and support queries.","schema":{"type":"string","example":"a3f1b2c4d5e6"}},"X-RateLimit-Limit":{"description":"Maximum requests allowed per rate-limit window.","schema":{"type":"integer","example":60}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current rate-limit window.","schema":{"type":"integer","example":47}}}}}}},"/api/public/v1/country/{country_code}":{"get":{"tags":["Public API v1"],"summary":"Country outage dashboard","description":"Aggregate country dashboard data — country-level only, no per-MP data.","operationId":"get_country_dashboard_v1_api_public_v1_country__country_code__get","parameters":[{"name":"country_code","in":"path","required":true,"schema":{"type":"string","title":"Country Code"}},{"name":"window_days","in":"query","required":false,"schema":{"type":"integer","maximum":90,"minimum":1,"default":30,"title":"Window Days"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}},"headers":{"X-Request-Id":{"description":"Unique request identifier for error correlation and support queries.","schema":{"type":"string","example":"a3f1b2c4d5e6"}},"X-RateLimit-Limit":{"description":"Maximum requests allowed per rate-limit window.","schema":{"type":"integer","example":60}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current rate-limit window.","schema":{"type":"integer","example":47}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}},"headers":{"X-Request-Id":{"description":"Unique request identifier for error correlation and support queries.","schema":{"type":"string","example":"a3f1b2c4d5e6"}},"X-RateLimit-Limit":{"description":"Maximum requests allowed per rate-limit window.","schema":{"type":"integer","example":60}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current rate-limit window.","schema":{"type":"integer","example":47}}}}}}},"/api/public/v1/umms":{"get":{"tags":["Public API v1"],"summary":"List and search UMM publications","description":"List UMM publications with structured filters. Page size: 50.","operationId":"get_umms_v1_api_public_v1_umms_get","parameters":[{"name":"country","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country"}},{"name":"fuel_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Fuel Type"}},{"name":"date_from","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Date From"}},{"name":"date_to","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Date To"}},{"name":"mp","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Mp"}},{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Q"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}},"headers":{"X-Request-Id":{"description":"Unique request identifier for error correlation and support queries.","schema":{"type":"string","example":"a3f1b2c4d5e6"}},"X-RateLimit-Limit":{"description":"Maximum requests allowed per rate-limit window.","schema":{"type":"integer","example":60}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current rate-limit window.","schema":{"type":"integer","example":47}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}},"headers":{"X-Request-Id":{"description":"Unique request identifier for error correlation and support queries.","schema":{"type":"string","example":"a3f1b2c4d5e6"}},"X-RateLimit-Limit":{"description":"Maximum requests allowed per rate-limit window.","schema":{"type":"integer","example":60}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current rate-limit window.","schema":{"type":"integer","example":47}}}}}}},"/api/public/v1/umm/{publication_id}":{"get":{"tags":["Public API v1"],"summary":"UMM publication detail","description":"Full detail for a single UMM publication including related UMMs.","operationId":"get_umm_detail_v1_api_public_v1_umm__publication_id__get","parameters":[{"name":"publication_id","in":"path","required":true,"schema":{"type":"string","title":"Publication Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}},"headers":{"X-Request-Id":{"description":"Unique request identifier for error correlation and support queries.","schema":{"type":"string","example":"a3f1b2c4d5e6"}},"X-RateLimit-Limit":{"description":"Maximum requests allowed per rate-limit window.","schema":{"type":"integer","example":60}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current rate-limit window.","schema":{"type":"integer","example":47}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}},"headers":{"X-Request-Id":{"description":"Unique request identifier for error correlation and support queries.","schema":{"type":"string","example":"a3f1b2c4d5e6"}},"X-RateLimit-Limit":{"description":"Maximum requests allowed per rate-limit window.","schema":{"type":"integer","example":60}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current rate-limit window.","schema":{"type":"integer","example":47}}}}}}},"/api/public/v1/access/request":{"post":{"tags":["Public API v1"],"summary":"Submit Access Request","description":"Submit a commercial API access request for review.\n\nRate-limited to 5 requests per hour per IP (anti-abuse).\nReturns a request ID and status URL for tracking.","operationId":"submit_access_request_api_public_v1_access_request_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AccessRequestBody"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}},"headers":{"X-Request-Id":{"description":"Unique request identifier for error correlation and support queries.","schema":{"type":"string","example":"a3f1b2c4d5e6"}},"X-RateLimit-Limit":{"description":"Maximum requests allowed per rate-limit window.","schema":{"type":"integer","example":60}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current rate-limit window.","schema":{"type":"integer","example":47}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}},"headers":{"X-Request-Id":{"description":"Unique request identifier for error correlation and support queries.","schema":{"type":"string","example":"a3f1b2c4d5e6"}},"X-RateLimit-Limit":{"description":"Maximum requests allowed per rate-limit window.","schema":{"type":"integer","example":60}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current rate-limit window.","schema":{"type":"integer","example":47}}}}}}},"/api/public/v1/access/status/{request_id}":{"get":{"tags":["Public API v1"],"summary":"Get Access Request Status","description":"Check the status of a commercial API access request.\n\nReturns the current status (pending/approved/denied).\nIf approved, includes the API key prefix for identification.\nThe full API key is delivered by the approving administrator.","operationId":"get_access_request_status_api_public_v1_access_status__request_id__get","parameters":[{"name":"request_id","in":"path","required":true,"schema":{"type":"string","title":"Request Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}},"headers":{"X-Request-Id":{"description":"Unique request identifier for error correlation and support queries.","schema":{"type":"string","example":"a3f1b2c4d5e6"}},"X-RateLimit-Limit":{"description":"Maximum requests allowed per rate-limit window.","schema":{"type":"integer","example":60}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current rate-limit window.","schema":{"type":"integer","example":47}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}},"headers":{"X-Request-Id":{"description":"Unique request identifier for error correlation and support queries.","schema":{"type":"string","example":"a3f1b2c4d5e6"}},"X-RateLimit-Limit":{"description":"Maximum requests allowed per rate-limit window.","schema":{"type":"integer","example":60}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current rate-limit window.","schema":{"type":"integer","example":47}}}}}}},"/api/public/v1/gas-assets/geojson":{"get":{"tags":["Public API v1","Gas Map"],"summary":"Gas infrastructure GeoJSON","description":"ENTSOG pipeline points and GIE storage facilities as a GeoJSON FeatureCollection.\n\nReturns all gas infrastructure assets with known coordinates. Each feature\nincludes name, country, asset_type (pipeline_point, storage_facility,\nlng_terminal, compressor), operator_name, source_system, and eic_code.","operationId":"get_gas_assets_geojson_api_public_v1_gas_assets_geojson_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}},"headers":{"X-Request-Id":{"description":"Unique request identifier for error correlation and support queries.","schema":{"type":"string","example":"a3f1b2c4d5e6"}},"X-RateLimit-Limit":{"description":"Maximum requests allowed per rate-limit window.","schema":{"type":"integer","example":60}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current rate-limit window.","schema":{"type":"integer","example":47}}}}}}},"/api/auth/access-request":{"post":{"tags":["auth"],"summary":"Submit Access Request","description":"Submit a new MP association request.\n\nA user may hold multiple approved MPs; each MP requires a separate request\nand admin approval. Duplicate check is scoped to (firebase_uid, claimed_mp_id)\nso a user can request a second MP while already approved for a first.","operationId":"submit_access_request_api_auth_access_request_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AccessRequestPayload"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}},"headers":{"X-Request-Id":{"description":"Unique request identifier for error correlation and support queries.","schema":{"type":"string","example":"a3f1b2c4d5e6"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}},"headers":{"X-Request-Id":{"description":"Unique request identifier for error correlation and support queries.","schema":{"type":"string","example":"a3f1b2c4d5e6"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/auth/bootstrap-admin":{"post":{"tags":["auth"],"summary":"Bootstrap Admin","description":"Grant superadmin role to the calling user if their email is whitelisted.\n\nGated by SUPERADMIN_BOOTSTRAP_EMAILS env var (comma-separated). Safe to call\nrepeatedly — idempotent. Intended for initial superadmin setup only.","operationId":"bootstrap_admin_api_auth_bootstrap_admin_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}},"headers":{"X-Request-Id":{"description":"Unique request identifier for error correlation and support queries.","schema":{"type":"string","example":"a3f1b2c4d5e6"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/auth/me":{"get":{"tags":["auth"],"summary":"Get Current User Status","description":"Return the current user's auth status and all MP affiliations.\n\nAlways reads from the DB so the response reflects admin approvals immediately,\neven before the user's Firebase token has refreshed (custom claims propagation\ncan take up to 1 hour after approval).","operationId":"get_current_user_status_api_auth_me_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}},"headers":{"X-Request-Id":{"description":"Unique request identifier for error correlation and support queries.","schema":{"type":"string","example":"a3f1b2c4d5e6"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/admin/access-requests":{"get":{"tags":["admin"],"summary":"List Access Requests","operationId":"list_access_requests_api_admin_access_requests_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"status","in":"query","required":false,"schema":{"type":"string","default":"pending","title":"Status"}},{"name":"mp_id","in":"query","required":false,"schema":{"type":"string","default":"","title":"Mp Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}},"headers":{"X-Request-Id":{"description":"Unique request identifier for error correlation and support queries.","schema":{"type":"string","example":"a3f1b2c4d5e6"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}},"headers":{"X-Request-Id":{"description":"Unique request identifier for error correlation and support queries.","schema":{"type":"string","example":"a3f1b2c4d5e6"}}}}}}},"/api/admin/access-requests/{request_id}/approve":{"post":{"tags":["admin"],"summary":"Approve Request","operationId":"approve_request_api_admin_access_requests__request_id__approve_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"request_id","in":"path","required":true,"schema":{"type":"string","title":"Request Id"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApproveBody","default":{"rationale":""}}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}},"headers":{"X-Request-Id":{"description":"Unique request identifier for error correlation and support queries.","schema":{"type":"string","example":"a3f1b2c4d5e6"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}},"headers":{"X-Request-Id":{"description":"Unique request identifier for error correlation and support queries.","schema":{"type":"string","example":"a3f1b2c4d5e6"}}}}}}},"/api/admin/access-requests/{request_id}/reject":{"post":{"tags":["admin"],"summary":"Reject Request","operationId":"reject_request_api_admin_access_requests__request_id__reject_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"request_id","in":"path","required":true,"schema":{"type":"string","title":"Request Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RejectBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}},"headers":{"X-Request-Id":{"description":"Unique request identifier for error correlation and support queries.","schema":{"type":"string","example":"a3f1b2c4d5e6"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}},"headers":{"X-Request-Id":{"description":"Unique request identifier for error correlation and support queries.","schema":{"type":"string","example":"a3f1b2c4d5e6"}}}}}}},"/api/admin/access-requests/pending-count":{"get":{"tags":["admin"],"summary":"Pending Access Request Count","operationId":"pending_access_request_count_api_admin_access_requests_pending_count_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}},"headers":{"X-Request-Id":{"description":"Unique request identifier for error correlation and support queries.","schema":{"type":"string","example":"a3f1b2c4d5e6"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/mp/home":{"get":{"tags":["mp-home"],"summary":"Mp Home","operationId":"mp_home_api_mp_home_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}},"headers":{"X-Request-Id":{"description":"Unique request identifier for error correlation and support queries.","schema":{"type":"string","example":"a3f1b2c4d5e6"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/mp/flags":{"get":{"tags":["mp-flags"],"summary":"List Flags","operationId":"list_flags_api_mp_flags_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"severity","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Severity"}},{"name":"class","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Class"}},{"name":"asset_eic","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Asset Eic"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":50,"title":"Page Size"}},{"name":"sort_by","in":"query","required":false,"schema":{"type":"string","default":"detected_at","title":"Sort By"}},{"name":"sort_order","in":"query","required":false,"schema":{"type":"string","default":"desc","title":"Sort Order"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}},"headers":{"X-Request-Id":{"description":"Unique request identifier for error correlation and support queries.","schema":{"type":"string","example":"a3f1b2c4d5e6"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}},"headers":{"X-Request-Id":{"description":"Unique request identifier for error correlation and support queries.","schema":{"type":"string","example":"a3f1b2c4d5e6"}}}}}}},"/api/mp/flags/{flag_id}":{"get":{"tags":["mp-flags"],"summary":"Get Flag Detail","operationId":"get_flag_detail_api_mp_flags__flag_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"flag_id","in":"path","required":true,"schema":{"type":"string","title":"Flag Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}},"headers":{"X-Request-Id":{"description":"Unique request identifier for error correlation and support queries.","schema":{"type":"string","example":"a3f1b2c4d5e6"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}},"headers":{"X-Request-Id":{"description":"Unique request identifier for error correlation and support queries.","schema":{"type":"string","example":"a3f1b2c4d5e6"}}}}}}},"/api/mp/flags/{flag_id}/activity":{"get":{"tags":["mp-flags"],"summary":"Get Flag Activity","operationId":"get_flag_activity_api_mp_flags__flag_id__activity_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"flag_id","in":"path","required":true,"schema":{"type":"string","title":"Flag Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}},"headers":{"X-Request-Id":{"description":"Unique request identifier for error correlation and support queries.","schema":{"type":"string","example":"a3f1b2c4d5e6"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}},"headers":{"X-Request-Id":{"description":"Unique request identifier for error correlation and support queries.","schema":{"type":"string","example":"a3f1b2c4d5e6"}}}}}}},"/api/mp/flags/bulk":{"post":{"tags":["mp-flags"],"summary":"Bulk Flag Action","description":"Apply an action to multiple flags at once.\n\nExactly one of `flag_ids` or `filter` must be provided.\nAn audit row (review_status update) is written per affected flag.\nRLS: only flags belonging to the authenticated MP are modified.","operationId":"bulk_flag_action_api_mp_flags_bulk_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkFlagAction"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}},"headers":{"X-Request-Id":{"description":"Unique request identifier for error correlation and support queries.","schema":{"type":"string","example":"a3f1b2c4d5e6"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}},"headers":{"X-Request-Id":{"description":"Unique request identifier for error correlation and support queries.","schema":{"type":"string","example":"a3f1b2c4d5e6"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/mp/flags/{flag_id}/status":{"post":{"tags":["mp-flags"],"summary":"Update Flag Status","operationId":"update_flag_status_api_mp_flags__flag_id__status_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"flag_id","in":"path","required":true,"schema":{"type":"string","title":"Flag Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FlagStatusUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}},"headers":{"X-Request-Id":{"description":"Unique request identifier for error correlation and support queries.","schema":{"type":"string","example":"a3f1b2c4d5e6"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}},"headers":{"X-Request-Id":{"description":"Unique request identifier for error correlation and support queries.","schema":{"type":"string","example":"a3f1b2c4d5e6"}}}}}}},"/api/mp/flags/{flag_id}/dispute":{"post":{"tags":["mp-flags"],"summary":"Submit Dispute","operationId":"submit_dispute_api_mp_flags__flag_id__dispute_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"flag_id","in":"path","required":true,"schema":{"type":"string","title":"Flag Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DisputeSubmitRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}},"headers":{"X-Request-Id":{"description":"Unique request identifier for error correlation and support queries.","schema":{"type":"string","example":"a3f1b2c4d5e6"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}},"headers":{"X-Request-Id":{"description":"Unique request identifier for error correlation and support queries.","schema":{"type":"string","example":"a3f1b2c4d5e6"}}}}}}},"/api/mp/evidence-pack":{"post":{"tags":["mp-flags"],"summary":"Generate Evidence Pack","description":"Enqueue an async evidence-pack generation job.\n\nReturns 202 {\"job_id\": \"...\"} immediately. The Cloud Run worker processes\nthe job, writes the PDF to GCS, and updates mp_evidence_pack_job.status.\nPoll GET /api/mp/evidence-pack/{job_id}/status for completion.","operationId":"generate_evidence_pack_api_mp_evidence_pack_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"period","in":"query","required":true,"schema":{"type":"string","pattern":"^\\d{4}-Q[1-4]$","title":"Period"}}],"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{}}},"headers":{"X-Request-Id":{"description":"Unique request identifier for error correlation and support queries.","schema":{"type":"string","example":"a3f1b2c4d5e6"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}},"headers":{"X-Request-Id":{"description":"Unique request identifier for error correlation and support queries.","schema":{"type":"string","example":"a3f1b2c4d5e6"}}}}}}},"/api/mp/evidence-pack/{pack_id}/status":{"get":{"tags":["mp-flags"],"summary":"Get Evidence Pack Status","operationId":"get_evidence_pack_status_api_mp_evidence_pack__pack_id__status_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"pack_id","in":"path","required":true,"schema":{"type":"string","title":"Pack Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}},"headers":{"X-Request-Id":{"description":"Unique request identifier for error correlation and support queries.","schema":{"type":"string","example":"a3f1b2c4d5e6"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}},"headers":{"X-Request-Id":{"description":"Unique request identifier for error correlation and support queries.","schema":{"type":"string","example":"a3f1b2c4d5e6"}}}}}}},"/api/admin/disputes/{dispute_id}/uphold":{"post":{"tags":["admin-disputes"],"summary":"Uphold Dispute","operationId":"uphold_dispute_api_admin_disputes__dispute_id__uphold_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"dispute_id","in":"path","required":true,"schema":{"type":"string","title":"Dispute Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminResolveRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}},"headers":{"X-Request-Id":{"description":"Unique request identifier for error correlation and support queries.","schema":{"type":"string","example":"a3f1b2c4d5e6"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}},"headers":{"X-Request-Id":{"description":"Unique request identifier for error correlation and support queries.","schema":{"type":"string","example":"a3f1b2c4d5e6"}}}}}}},"/api/admin/disputes/{dispute_id}/concede":{"post":{"tags":["admin-disputes"],"summary":"Concede Dispute","operationId":"concede_dispute_api_admin_disputes__dispute_id__concede_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"dispute_id","in":"path","required":true,"schema":{"type":"string","title":"Dispute Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminResolveRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}},"headers":{"X-Request-Id":{"description":"Unique request identifier for error correlation and support queries.","schema":{"type":"string","example":"a3f1b2c4d5e6"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}},"headers":{"X-Request-Id":{"description":"Unique request identifier for error correlation and support queries.","schema":{"type":"string","example":"a3f1b2c4d5e6"}}}}}}},"/api/mp/assets/map":{"get":{"tags":["mp-assets-map"],"summary":"Get Asset Map","operationId":"get_asset_map_api_mp_assets_map_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"include_tp_events","in":"query","required":false,"schema":{"type":"boolean","default":true,"title":"Include Tp Events"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}},"headers":{"X-Request-Id":{"description":"Unique request identifier for error correlation and support queries.","schema":{"type":"string","example":"a3f1b2c4d5e6"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}},"headers":{"X-Request-Id":{"description":"Unique request identifier for error correlation and support queries.","schema":{"type":"string","example":"a3f1b2c4d5e6"}}}}}}},"/api/admin/ingestion/sources":{"get":{"tags":["admin-ingestion"],"summary":"List Sources","operationId":"list_sources_api_admin_ingestion_sources_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}},"headers":{"X-Request-Id":{"description":"Unique request identifier for error correlation and support queries.","schema":{"type":"string","example":"a3f1b2c4d5e6"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/admin/ingestion/kpis":{"get":{"tags":["admin-ingestion"],"summary":"Get Kpis","operationId":"get_kpis_api_admin_ingestion_kpis_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}},"headers":{"X-Request-Id":{"description":"Unique request identifier for error correlation and support queries.","schema":{"type":"string","example":"a3f1b2c4d5e6"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/admin/ingestion/log-tail":{"get":{"tags":["admin-ingestion"],"summary":"Get Log Tail","operationId":"get_log_tail_api_admin_ingestion_log_tail_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}},"headers":{"X-Request-Id":{"description":"Unique request identifier for error correlation and support queries.","schema":{"type":"string","example":"a3f1b2c4d5e6"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/admin/ingestion/drift-events":{"get":{"tags":["admin-ingestion"],"summary":"List Drift Events","operationId":"list_drift_events_api_admin_ingestion_drift_events_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"source_code","in":"query","required":false,"schema":{"type":"string","default":"","title":"Source Code"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}},"headers":{"X-Request-Id":{"description":"Unique request identifier for error correlation and support queries.","schema":{"type":"string","example":"a3f1b2c4d5e6"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}},"headers":{"X-Request-Id":{"description":"Unique request identifier for error correlation and support queries.","schema":{"type":"string","example":"a3f1b2c4d5e6"}}}}}}},"/api/admin/ingestion/drift-events/{drift_id}/acknowledge":{"post":{"tags":["admin-ingestion"],"summary":"Acknowledge Drift","operationId":"acknowledge_drift_api_admin_ingestion_drift_events__drift_id__acknowledge_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"drift_id","in":"path","required":true,"schema":{"type":"string","title":"Drift Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}},"headers":{"X-Request-Id":{"description":"Unique request identifier for error correlation and support queries.","schema":{"type":"string","example":"a3f1b2c4d5e6"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}},"headers":{"X-Request-Id":{"description":"Unique request identifier for error correlation and support queries.","schema":{"type":"string","example":"a3f1b2c4d5e6"}}}}}}},"/api/admin/ingestion/sources/{source_code}/restart":{"post":{"tags":["admin-ingestion"],"summary":"Restart Source","operationId":"restart_source_api_admin_ingestion_sources__source_code__restart_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"source_code","in":"path","required":true,"schema":{"type":"string","title":"Source Code"}}],"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{}}},"headers":{"X-Request-Id":{"description":"Unique request identifier for error correlation and support queries.","schema":{"type":"string","example":"a3f1b2c4d5e6"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}},"headers":{"X-Request-Id":{"description":"Unique request identifier for error correlation and support queries.","schema":{"type":"string","example":"a3f1b2c4d5e6"}}}}}}},"/api/admin/ingestion/sources/{source_code}/backfill":{"post":{"tags":["admin-ingestion"],"summary":"Backfill Source","operationId":"backfill_source_api_admin_ingestion_sources__source_code__backfill_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"source_code","in":"path","required":true,"schema":{"type":"string","title":"Source Code"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BackfillBody"}}}},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{}}},"headers":{"X-Request-Id":{"description":"Unique request identifier for error correlation and support queries.","schema":{"type":"string","example":"a3f1b2c4d5e6"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}},"headers":{"X-Request-Id":{"description":"Unique request identifier for error correlation and support queries.","schema":{"type":"string","example":"a3f1b2c4d5e6"}}}}}}},"/api/admin/ingestion/backfill/mastr-fuel":{"post":{"tags":["admin-ingestion"],"summary":"Backfill Mastr Fuel","operationId":"backfill_mastr_fuel_api_admin_ingestion_backfill_mastr_fuel_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}},"headers":{"X-Request-Id":{"description":"Unique request identifier for error correlation and support queries.","schema":{"type":"string","example":"a3f1b2c4d5e6"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/admin/mapping/proposals":{"get":{"tags":["admin-mapping"],"summary":"List Proposals","operationId":"list_proposals_api_admin_mapping_proposals_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"status","in":"query","required":false,"schema":{"type":"string","default":"open","title":"Status"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Offset"}},{"name":"country","in":"query","required":false,"schema":{"type":"string","default":"","title":"Country"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}},"headers":{"X-Request-Id":{"description":"Unique request identifier for error correlation and support queries.","schema":{"type":"string","example":"a3f1b2c4d5e6"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}},"headers":{"X-Request-Id":{"description":"Unique request identifier for error correlation and support queries.","schema":{"type":"string","example":"a3f1b2c4d5e6"}}}}}}},"/api/admin/mapping/proposals/{relationship_id}/evidence":{"get":{"tags":["admin-mapping"],"summary":"Get Evidence","operationId":"get_evidence_api_admin_mapping_proposals__relationship_id__evidence_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"relationship_id","in":"path","required":true,"schema":{"type":"string","title":"Relationship Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}},"headers":{"X-Request-Id":{"description":"Unique request identifier for error correlation and support queries.","schema":{"type":"string","example":"a3f1b2c4d5e6"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}},"headers":{"X-Request-Id":{"description":"Unique request identifier for error correlation and support queries.","schema":{"type":"string","example":"a3f1b2c4d5e6"}}}}}}},"/api/admin/mapping/proposals/{relationship_id}/accept":{"post":{"tags":["admin-mapping"],"summary":"Accept Proposal","operationId":"accept_proposal_api_admin_mapping_proposals__relationship_id__accept_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"relationship_id","in":"path","required":true,"schema":{"type":"string","title":"Relationship Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AcceptBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}},"headers":{"X-Request-Id":{"description":"Unique request identifier for error correlation and support queries.","schema":{"type":"string","example":"a3f1b2c4d5e6"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}},"headers":{"X-Request-Id":{"description":"Unique request identifier for error correlation and support queries.","schema":{"type":"string","example":"a3f1b2c4d5e6"}}}}}}},"/api/admin/mapping/proposals/{relationship_id}/override":{"post":{"tags":["admin-mapping"],"summary":"Override Proposal","operationId":"override_proposal_api_admin_mapping_proposals__relationship_id__override_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"relationship_id","in":"path","required":true,"schema":{"type":"string","title":"Relationship Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OverrideBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}},"headers":{"X-Request-Id":{"description":"Unique request identifier for error correlation and support queries.","schema":{"type":"string","example":"a3f1b2c4d5e6"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}},"headers":{"X-Request-Id":{"description":"Unique request identifier for error correlation and support queries.","schema":{"type":"string","example":"a3f1b2c4d5e6"}}}}}}},"/api/admin/mapping/proposals/{relationship_id}/ambiguous":{"post":{"tags":["admin-mapping"],"summary":"Ambiguous Proposal","operationId":"ambiguous_proposal_api_admin_mapping_proposals__relationship_id__ambiguous_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"relationship_id","in":"path","required":true,"schema":{"type":"string","title":"Relationship Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AmbiguousBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}},"headers":{"X-Request-Id":{"description":"Unique request identifier for error correlation and support queries.","schema":{"type":"string","example":"a3f1b2c4d5e6"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}},"headers":{"X-Request-Id":{"description":"Unique request identifier for error correlation and support queries.","schema":{"type":"string","example":"a3f1b2c4d5e6"}}}}}}},"/api/admin/mapping/proposals/{relationship_id}/dispute":{"post":{"tags":["admin-mapping"],"summary":"Dispute Proposal","operationId":"dispute_proposal_api_admin_mapping_proposals__relationship_id__dispute_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"relationship_id","in":"path","required":true,"schema":{"type":"string","title":"Relationship Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DisputeBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}},"headers":{"X-Request-Id":{"description":"Unique request identifier for error correlation and support queries.","schema":{"type":"string","example":"a3f1b2c4d5e6"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}},"headers":{"X-Request-Id":{"description":"Unique request identifier for error correlation and support queries.","schema":{"type":"string","example":"a3f1b2c4d5e6"}}}}}}},"/api/admin/mapping/throughput":{"get":{"tags":["admin-mapping"],"summary":"Get Throughput","operationId":"get_throughput_api_admin_mapping_throughput_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}},"headers":{"X-Request-Id":{"description":"Unique request identifier for error correlation and support queries.","schema":{"type":"string","example":"a3f1b2c4d5e6"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/admin/mapping/reviewers":{"get":{"tags":["admin-mapping"],"summary":"Get Reviewers","operationId":"get_reviewers_api_admin_mapping_reviewers_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}},"headers":{"X-Request-Id":{"description":"Unique request identifier for error correlation and support queries.","schema":{"type":"string","example":"a3f1b2c4d5e6"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/admin/mapping/source-record/{source_record_id}":{"get":{"tags":["admin-mapping"],"summary":"Get Source Record","operationId":"get_source_record_api_admin_mapping_source_record__source_record_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"source_record_id","in":"path","required":true,"schema":{"type":"string","title":"Source Record Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}},"headers":{"X-Request-Id":{"description":"Unique request identifier for error correlation and support queries.","schema":{"type":"string","example":"a3f1b2c4d5e6"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}},"headers":{"X-Request-Id":{"description":"Unique request identifier for error correlation and support queries.","schema":{"type":"string","example":"a3f1b2c4d5e6"}}}}}}},"/api/admin/api-keys/access-requests":{"get":{"tags":["admin-api-keys"],"summary":"List Api Access Requests","description":"List API access requests, filterable by status.","operationId":"list_api_access_requests_api_admin_api_keys_access_requests_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"status","in":"query","required":false,"schema":{"type":"string","default":"pending","title":"Status"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}},"headers":{"X-Request-Id":{"description":"Unique request identifier for error correlation and support queries.","schema":{"type":"string","example":"a3f1b2c4d5e6"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}},"headers":{"X-Request-Id":{"description":"Unique request identifier for error correlation and support queries.","schema":{"type":"string","example":"a3f1b2c4d5e6"}}}}}}},"/api/admin/api-keys/access-requests/{request_id}/approve":{"post":{"tags":["admin-api-keys"],"summary":"Approve Api Access Request","description":"Approve an API access request and generate an API key.","operationId":"approve_api_access_request_api_admin_api_keys_access_requests__request_id__approve_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"request_id","in":"path","required":true,"schema":{"type":"string","title":"Request Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApproveAccessBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}},"headers":{"X-Request-Id":{"description":"Unique request identifier for error correlation and support queries.","schema":{"type":"string","example":"a3f1b2c4d5e6"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}},"headers":{"X-Request-Id":{"description":"Unique request identifier for error correlation and support queries.","schema":{"type":"string","example":"a3f1b2c4d5e6"}}}}}}},"/api/admin/api-keys/access-requests/{request_id}/deny":{"post":{"tags":["admin-api-keys"],"summary":"Deny Api Access Request","description":"Deny an API access request.","operationId":"deny_api_access_request_api_admin_api_keys_access_requests__request_id__deny_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"request_id","in":"path","required":true,"schema":{"type":"string","title":"Request Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DenyAccessBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}},"headers":{"X-Request-Id":{"description":"Unique request identifier for error correlation and support queries.","schema":{"type":"string","example":"a3f1b2c4d5e6"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}},"headers":{"X-Request-Id":{"description":"Unique request identifier for error correlation and support queries.","schema":{"type":"string","example":"a3f1b2c4d5e6"}}}}}}},"/api/admin/api-keys/keys":{"get":{"tags":["admin-api-keys"],"summary":"List Api Keys","description":"List all API keys (hashes only, not raw keys).","operationId":"list_api_keys_api_admin_api_keys_keys_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}},"headers":{"X-Request-Id":{"description":"Unique request identifier for error correlation and support queries.","schema":{"type":"string","example":"a3f1b2c4d5e6"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/admin/api-keys/keys/{key_id}/revoke":{"post":{"tags":["admin-api-keys"],"summary":"Revoke Api Key","description":"Revoke an API key.","operationId":"revoke_api_key_api_admin_api_keys_keys__key_id__revoke_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"key_id","in":"path","required":true,"schema":{"type":"string","title":"Key Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}},"headers":{"X-Request-Id":{"description":"Unique request identifier for error correlation and support queries.","schema":{"type":"string","example":"a3f1b2c4d5e6"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}},"headers":{"X-Request-Id":{"description":"Unique request identifier for error correlation and support queries.","schema":{"type":"string","example":"a3f1b2c4d5e6"}}}}}}},"/api/mp/ai/search":{"post":{"tags":["auth"],"summary":"AI natural-language search (SSE)","operationId":"ai_search_api_mp_ai_search_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SearchRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}},"headers":{"X-Request-Id":{"description":"Unique request identifier for error correlation and support queries.","schema":{"type":"string","example":"a3f1b2c4d5e6"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}},"headers":{"X-Request-Id":{"description":"Unique request identifier for error correlation and support queries.","schema":{"type":"string","example":"a3f1b2c4d5e6"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/admin/users/promote":{"post":{"tags":["admin"],"summary":"Promote To Admin","description":"Promote an existing Firebase user to superadmin by email.\n\nThe target user must already have a Firebase account (i.e. have signed up).\nTheir existing claims are replaced with {role: superadmin}. The user will\nneed to sign out and back in (or wait up to 1h for token refresh) to pick\nup the new role.","operationId":"promote_to_admin_api_admin_users_promote_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PromoteBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}},"headers":{"X-Request-Id":{"description":"Unique request identifier for error correlation and support queries.","schema":{"type":"string","example":"a3f1b2c4d5e6"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}},"headers":{"X-Request-Id":{"description":"Unique request identifier for error correlation and support queries.","schema":{"type":"string","example":"a3f1b2c4d5e6"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/admin/users/admins":{"get":{"tags":["admin"],"summary":"List Admins","description":"Return all Firebase users who have role=superadmin in their custom claims.","operationId":"list_admins_api_admin_users_admins_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}},"headers":{"X-Request-Id":{"description":"Unique request identifier for error correlation and support queries.","schema":{"type":"string","example":"a3f1b2c4d5e6"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/mp/settings/notifications/email-prefs":{"get":{"tags":["mp-settings"],"summary":"Get Email Prefs","operationId":"get_email_prefs_api_mp_settings_notifications_email_prefs_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}},"headers":{"X-Request-Id":{"description":"Unique request identifier for error correlation and support queries.","schema":{"type":"string","example":"a3f1b2c4d5e6"}}}}},"security":[{"HTTPBearer":[]}]},"put":{"tags":["mp-settings"],"summary":"Update Email Prefs","operationId":"update_email_prefs_api_mp_settings_notifications_email_prefs_put","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmailPrefsBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}},"headers":{"X-Request-Id":{"description":"Unique request identifier for error correlation and support queries.","schema":{"type":"string","example":"a3f1b2c4d5e6"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}},"headers":{"X-Request-Id":{"description":"Unique request identifier for error correlation and support queries.","schema":{"type":"string","example":"a3f1b2c4d5e6"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/mp/settings/notifications/webhook":{"get":{"tags":["mp-settings"],"summary":"Get Webhook","operationId":"get_webhook_api_mp_settings_notifications_webhook_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}},"headers":{"X-Request-Id":{"description":"Unique request identifier for error correlation and support queries.","schema":{"type":"string","example":"a3f1b2c4d5e6"}}}}},"security":[{"HTTPBearer":[]}]},"put":{"tags":["mp-settings"],"summary":"Upsert Webhook","operationId":"upsert_webhook_api_mp_settings_notifications_webhook_put","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}},"headers":{"X-Request-Id":{"description":"Unique request identifier for error correlation and support queries.","schema":{"type":"string","example":"a3f1b2c4d5e6"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}},"headers":{"X-Request-Id":{"description":"Unique request identifier for error correlation and support queries.","schema":{"type":"string","example":"a3f1b2c4d5e6"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/mp/settings/notifications/webhook/secret":{"get":{"tags":["mp-settings"],"summary":"Get Webhook Secret","operationId":"get_webhook_secret_api_mp_settings_notifications_webhook_secret_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}},"headers":{"X-Request-Id":{"description":"Unique request identifier for error correlation and support queries.","schema":{"type":"string","example":"a3f1b2c4d5e6"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/mp/settings/notifications/webhook/test":{"post":{"tags":["mp-settings"],"summary":"Send Test Webhook","operationId":"send_test_webhook_api_mp_settings_notifications_webhook_test_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}},"headers":{"X-Request-Id":{"description":"Unique request identifier for error correlation and support queries.","schema":{"type":"string","example":"a3f1b2c4d5e6"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/mp/settings/notifications/delivery-logs":{"get":{"tags":["mp-settings"],"summary":"Get Delivery Logs","operationId":"get_delivery_logs_api_mp_settings_notifications_delivery_logs_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}},"headers":{"X-Request-Id":{"description":"Unique request identifier for error correlation and support queries.","schema":{"type":"string","example":"a3f1b2c4d5e6"}}}}},"security":[{"HTTPBearer":[]}]}},"/health":{"get":{"tags":["Public API v1"],"summary":"Health check","description":"Returns `{\"status\": \"ok\"}` when the API is healthy.","operationId":"health_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}},"headers":{"X-Request-Id":{"description":"Unique request identifier for error correlation and support queries.","schema":{"type":"string","example":"a3f1b2c4d5e6"}},"X-RateLimit-Limit":{"description":"Maximum requests allowed per rate-limit window.","schema":{"type":"integer","example":60}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current rate-limit window.","schema":{"type":"integer","example":47}}}}}}}},"components":{"schemas":{"AcceptBody":{"properties":{"rationale":{"type":"string","minLength":10,"title":"Rationale"},"candidate_mp_entity_id":{"type":"string","title":"Candidate Mp Entity Id"}},"type":"object","required":["rationale","candidate_mp_entity_id"],"title":"AcceptBody"},"AccessRequestBody":{"properties":{"organisation_name":{"type":"string","maxLength":255,"minLength":1,"title":"Organisation Name"},"contact_email":{"type":"string","maxLength":255,"minLength":1,"title":"Contact Email"},"contact_name":{"type":"string","maxLength":255,"minLength":1,"title":"Contact Name"},"intended_use":{"type":"string","minLength":1,"title":"Intended Use"},"website":{"anyOf":[{"type":"string","maxLength":512},{"type":"null"}],"title":"Website"},"requested_tier":{"type":"string","title":"Requested Tier","default":"commercial-basic"}},"type":"object","required":["organisation_name","contact_email","contact_name","intended_use"],"title":"AccessRequestBody"},"AccessRequestPayload":{"properties":{"claimed_mp_id":{"type":"string","pattern":"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$","title":"Claimed Mp Id"},"full_name":{"type":"string","maxLength":256,"minLength":1,"title":"Full Name"},"job_title":{"type":"string","maxLength":256,"title":"Job Title","default":""},"company_name":{"type":"string","maxLength":256,"title":"Company Name","default":""}},"type":"object","required":["claimed_mp_id","full_name"],"title":"AccessRequestPayload"},"AdminResolveRequest":{"properties":{"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message"},"resolution_rationale":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Resolution Rationale"}},"type":"object","title":"AdminResolveRequest"},"AmbiguousBody":{"properties":{"rationale":{"type":"string","minLength":10,"title":"Rationale"},"ambiguous_reason":{"type":"string","title":"Ambiguous Reason"}},"type":"object","required":["rationale","ambiguous_reason"],"title":"AmbiguousBody"},"ApproveAccessBody":{"properties":{"tier":{"type":"string","title":"Tier","default":"commercial-basic"},"rate_limit_rpm":{"type":"integer","maximum":6000.0,"minimum":60.0,"title":"Rate Limit Rpm","default":300},"review_notes":{"type":"string","maxLength":2000,"title":"Review Notes","default":""}},"type":"object","title":"ApproveAccessBody"},"ApproveBody":{"properties":{"rationale":{"type":"string","maxLength":2000,"title":"Rationale","default":""}},"type":"object","title":"ApproveBody"},"BackfillBody":{"properties":{"window_start":{"type":"string","title":"Window Start","description":"ISO 8601 start of backfill window"},"window_end":{"type":"string","title":"Window End","description":"ISO 8601 end of backfill window"}},"type":"object","required":["window_start","window_end"],"title":"BackfillBody"},"BulkFlagAction":{"properties":{"flag_ids":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Flag Ids"},"filter":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Filter"},"action":{"type":"string","pattern":"^(acknowledge|close|mark_in_progress)$","title":"Action"}},"type":"object","required":["action"],"title":"BulkFlagAction"},"DenyAccessBody":{"properties":{"review_notes":{"type":"string","maxLength":2000,"minLength":1,"title":"Review Notes"}},"type":"object","required":["review_notes"],"title":"DenyAccessBody"},"DisputeBody":{"properties":{"rationale":{"type":"string","minLength":10,"title":"Rationale"},"disputed_to_uid":{"type":"string","title":"Disputed To Uid"}},"type":"object","required":["rationale","disputed_to_uid"],"title":"DisputeBody"},"DisputeSubmitRequest":{"properties":{"reason":{"type":"string","minLength":50,"title":"Reason"},"attachment_gcs_uri":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Attachment Gcs Uri"}},"type":"object","required":["reason"],"title":"DisputeSubmitRequest"},"EmailPrefsBody":{"properties":{"digest_mode":{"type":"string","title":"Digest Mode","description":"immediate | daily | weekly | off"},"severity_filter":{"type":"string","title":"Severity Filter","description":"critical | warning | all"},"detector_classes":{"additionalProperties":true,"type":"object","title":"Detector Classes"}},"type":"object","required":["digest_mode","severity_filter"],"title":"EmailPrefsBody"},"FlagStatusUpdate":{"properties":{"status":{"type":"string","pattern":"^(in_progress|acknowledged)$","title":"Status"}},"type":"object","required":["status"],"title":"FlagStatusUpdate"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"OverrideBody":{"properties":{"rationale":{"type":"string","minLength":10,"title":"Rationale"},"target_mp_entity_id":{"type":"string","title":"Target Mp Entity Id"},"predicate":{"type":"string","title":"Predicate","default":"owned_by"}},"type":"object","required":["rationale","target_mp_entity_id"],"title":"OverrideBody"},"PromoteBody":{"properties":{"email":{"type":"string","maxLength":256,"minLength":1,"title":"Email"}},"type":"object","required":["email"],"title":"PromoteBody"},"RejectBody":{"properties":{"rationale":{"type":"string","maxLength":2000,"minLength":1,"title":"Rationale"}},"type":"object","required":["rationale"],"title":"RejectBody"},"SearchRequest":{"properties":{"query":{"type":"string","title":"Query"}},"type":"object","required":["query"],"title":"SearchRequest"},"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"},"WebhookBody":{"properties":{"target_url":{"type":"string","title":"Target Url"},"event_types":{"items":{"type":"string"},"type":"array","title":"Event Types"},"active":{"type":"boolean","title":"Active","default":true}},"type":"object","required":["target_url"],"title":"WebhookBody"}},"securitySchemes":{"HTTPBearer":{"type":"http","scheme":"bearer"}}},"tags":[{"name":"public","description":"Unversioned public endpoints (deprecated — use `/api/public/v1/`). Sunset: 2026-11-01.","externalDocs":{"description":"Versioned API","url":"https://remitscan.vercel.app/api/docs#tag/Public-API-v1"}},{"name":"Public API v1","description":"Stable, versioned public data endpoints under `/api/public/v1/`. Envelope format: `{\"data\": ..., \"meta\": {\"generated_at\": ...}}`."},{"name":"linked-data","description":"Content-negotiated entity URIs. Accept `application/ld+json` for JSON-LD, `text/turtle` for Turtle, `application/json` for plain JSON."},{"name":"auth","description":"Firebase-authenticated endpoints for registered market participants."},{"name":"admin","description":"Internal admin endpoints — require admin Firebase token. Not for public use."}]}