diff --git a/AGENTS.md b/AGENTS.md index a8eba7511..ca8c4d3b9 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -57,7 +57,7 @@ npm run typecheck:api # Typecheck API layer separately npm run test:data # Run unit/integration tests npm run test:sidecar # Run sidecar + API handler tests npm run test:e2e # Run all Playwright E2E tests -make generate # Regenerate proto stubs (requires buf + sebuf plugins) +make generate # Regenerate proto stubs + per-service & unified OpenAPI specs (requires buf + sebuf v0.11.0 plugins) ``` ## Architecture Rules diff --git a/CHANGELOG.md b/CHANGELOG.md index 4e2661188..3fc6058cd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,7 @@ All notable changes to World Monitor are documented here. ### Added +- **Unified OpenAPI bundle** — `docs/api/worldmonitor.openapi.yaml` is now emitted alongside per-service specs, merging every WorldMonitor RPC into a single OpenAPI 3.1 document (190 operations). Powered by sebuf v0.11.1's origin-level bundle support ([SebastienMelki/sebuf#158](https://github.com/SebastienMelki/sebuf/issues/158)). Bumps `SEBUF_VERSION` in the Makefile from v0.7.0 to v0.11.1 — rerun `make install-plugins` after pulling. - **Route Explorer**: standalone full-screen modal (CMD+K) for planning shipments between any two countries. Includes Current/Alternatives/Land/Impact tabs, keyboard-first navigation, URL state sharing, strategic-product trade data, dependency flags, and free-tier blur with public route highlight (#2980, #2982, #2994, #2996, #2997, #2998) - US Treasury customs revenue in Trade Policy panel with monthly data, FYTD year-over-year comparison, and revenue spike highlighting (#1663) - Security advisories gold standard migration: Railway cron seed fetches 24 government RSS feeds hourly, Vercel reads Redis only (#1637) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index affe0e6d7..6faebf2fd 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -234,6 +234,19 @@ make install-buf # Install buf CLI (requires Go) make install-plugins # Install sebuf protoc-gen plugins (requires Go) ``` +The pinned sebuf version is set by `SEBUF_VERSION` in the `Makefile` (currently **v0.11.1**). All three plugins — `protoc-gen-ts-client`, `protoc-gen-ts-server`, `protoc-gen-openapiv3` — must be installed from the same sebuf release. If you see codegen drift after pulling, rerun `make install-plugins` to resync. + +### OpenAPI Output + +`make generate` (i.e. `cd proto && buf generate`) produces: + +| File | Purpose | +| --- | --- | +| `docs/api/{Service}.openapi.yaml` / `.json` | Per-service specs — referenced individually by Mintlify in `docs/docs.json` | +| `docs/api/worldmonitor.openapi.yaml` | **Unified bundle** spanning every service (sebuf ≥ v0.11.0) — use this for external consumers, API explorers, or anywhere you want a single spec covering all RPCs | + +The unified bundle is emitted by a third `protoc-gen-openapiv3` invocation in `proto/buf.gen.yaml` using `bundle=true`, `bundle_only=true`, and `strategy: all`. Regenerate alongside the per-service files; do not edit by hand. + ## Adding Data Sources To add a new data layer to the map: diff --git a/Makefile b/Makefile index e523efda9..382e581bd 100644 --- a/Makefile +++ b/Makefile @@ -14,7 +14,7 @@ GO_INSTALL := $(GO_PROXY) $(GO_PRIVATE) go install # Required tool versions BUF_VERSION := v1.64.0 -SEBUF_VERSION := v0.7.0 +SEBUF_VERSION := v0.11.1 help: ## Show this help message @echo 'Usage: make [target]' @@ -55,7 +55,6 @@ lint: ## Lint protobuf files generate: clean ## Generate code from proto definitions @mkdir -p $(GEN_CLIENT_DIR) $(GEN_SERVER_DIR) $(DOCS_API_DIR) cd $(PROTO_DIR) && buf generate - @find $(GEN_CLIENT_DIR) $(GEN_SERVER_DIR) -name '*.ts' -exec sed -i.bak '1s;^;// @ts-nocheck\n;' {} \; -exec rm -f {}.bak \; @echo "Code generation complete!" breaking: ## Check for breaking changes against main diff --git a/docs/api/AviationService.openapi.json b/docs/api/AviationService.openapi.json index 290d03aa5..b77c406bc 100644 --- a/docs/api/AviationService.openapi.json +++ b/docs/api/AviationService.openapi.json @@ -1 +1 @@ -{"components":{"schemas":{"AirportDelayAlert":{"description":"AirportDelayAlert represents a flight delay advisory at an airport.\n Sourced from FAA and Eurocontrol.","properties":{"avgDelayMinutes":{"description":"Average delay in minutes.","format":"int32","type":"integer"},"cancelledFlights":{"description":"Number of cancelled flights.","format":"int32","type":"integer"},"city":{"description":"City where the airport is located.","type":"string"},"country":{"description":"Country code (ISO 3166-1 alpha-2).","type":"string"},"delayType":{"description":"FlightDelayType represents the type of flight delay.","enum":["FLIGHT_DELAY_TYPE_UNSPECIFIED","FLIGHT_DELAY_TYPE_GROUND_STOP","FLIGHT_DELAY_TYPE_GROUND_DELAY","FLIGHT_DELAY_TYPE_DEPARTURE_DELAY","FLIGHT_DELAY_TYPE_ARRIVAL_DELAY","FLIGHT_DELAY_TYPE_GENERAL","FLIGHT_DELAY_TYPE_CLOSURE"],"type":"string"},"delayedFlightsPct":{"description":"Percentage of delayed flights.","format":"double","type":"number"},"iata":{"description":"IATA airport code (e.g., \"JFK\").","type":"string"},"icao":{"description":"ICAO airport code (e.g., \"KJFK\").","type":"string"},"id":{"description":"Unique alert identifier.","minLength":1,"type":"string"},"location":{"$ref":"#/components/schemas/GeoCoordinates"},"name":{"description":"Airport name.","type":"string"},"reason":{"description":"Human-readable reason for delays.","type":"string"},"region":{"description":"AirportRegion represents the geographic region of an airport.","enum":["AIRPORT_REGION_UNSPECIFIED","AIRPORT_REGION_AMERICAS","AIRPORT_REGION_EUROPE","AIRPORT_REGION_APAC","AIRPORT_REGION_MENA","AIRPORT_REGION_AFRICA"],"type":"string"},"severity":{"description":"FlightDelaySeverity represents the severity of flight delays at an airport.\n Maps to TS union: 'normal' | 'minor' | 'moderate' | 'major' | 'severe'.","enum":["FLIGHT_DELAY_SEVERITY_UNSPECIFIED","FLIGHT_DELAY_SEVERITY_NORMAL","FLIGHT_DELAY_SEVERITY_MINOR","FLIGHT_DELAY_SEVERITY_MODERATE","FLIGHT_DELAY_SEVERITY_MAJOR","FLIGHT_DELAY_SEVERITY_SEVERE"],"type":"string"},"source":{"description":"FlightDelaySource represents the source of delay data.","enum":["FLIGHT_DELAY_SOURCE_UNSPECIFIED","FLIGHT_DELAY_SOURCE_FAA","FLIGHT_DELAY_SOURCE_EUROCONTROL","FLIGHT_DELAY_SOURCE_COMPUTED","FLIGHT_DELAY_SOURCE_AVIATIONSTACK","FLIGHT_DELAY_SOURCE_NOTAM"],"type":"string"},"totalFlights":{"description":"Total flights scheduled.","format":"int32","type":"integer"},"updatedAt":{"description":"Last data update time, as Unix epoch milliseconds.. Warning: Values \u003e 2^53 may lose precision in JavaScript","format":"int64","type":"integer"}},"required":["id"],"type":"object"},"AirportOpsSummary":{"description":"AirportOpsSummary contains operational health metrics for a single airport.","properties":{"avgDelayMinutes":{"description":"Average delay in minutes across delayed flights.","format":"int32","type":"integer"},"cancellationRate":{"description":"Cancellation rate as a percentage (0-100).","format":"double","type":"number"},"closureStatus":{"description":"Whether the airport is currently closed.","type":"boolean"},"delayPct":{"description":"Percentage of flights currently delayed (0-100).","format":"double","type":"number"},"iata":{"description":"IATA airport code.","type":"string"},"icao":{"description":"ICAO airport code.","type":"string"},"name":{"description":"Airport name.","type":"string"},"notamFlags":{"items":{"description":"Active NOTAM summary flags (e.g., \"RWY 06/24 CLSD\", \"LOW VIS OPS\").","type":"string"},"type":"array"},"severity":{"description":"FlightDelaySeverity represents the severity of flight delays at an airport.\n Maps to TS union: 'normal' | 'minor' | 'moderate' | 'major' | 'severe'.","enum":["FLIGHT_DELAY_SEVERITY_UNSPECIFIED","FLIGHT_DELAY_SEVERITY_NORMAL","FLIGHT_DELAY_SEVERITY_MINOR","FLIGHT_DELAY_SEVERITY_MODERATE","FLIGHT_DELAY_SEVERITY_MAJOR","FLIGHT_DELAY_SEVERITY_SEVERE"],"type":"string"},"source":{"description":"Data source identifier.","type":"string"},"timezone":{"description":"IANA timezone (e.g., \"Europe/Istanbul\").","type":"string"},"topDelayReasons":{"items":{"description":"Top reasons for delays.","type":"string"},"type":"array"},"totalFlights":{"description":"Total flights in the observation window.","format":"int32","type":"integer"},"updatedAt":{"description":"Last update time as Unix epoch milliseconds.. Warning: Values \u003e 2^53 may lose precision in JavaScript","format":"int64","type":"integer"}},"type":"object"},"AirportRef":{"description":"AirportRef is a lightweight reference to an airport.","properties":{"iata":{"description":"IATA airport code (e.g., \"IST\").","type":"string"},"icao":{"description":"ICAO airport code (e.g., \"LTFM\").","type":"string"},"name":{"description":"Airport name (e.g., \"Istanbul Airport\").","type":"string"},"timezone":{"description":"IANA timezone (e.g., \"Europe/Istanbul\").","type":"string"}},"type":"object"},"AviationNewsItem":{"description":"AviationNewsItem represents a single aviation news article or press release.","properties":{"id":{"description":"Unique item identifier (hash of URL).","type":"string"},"imageUrl":{"description":"Article image URL (if available).","type":"string"},"matchedEntities":{"items":{"description":"Entities matched from the query (airport codes, airline names).","type":"string"},"type":"array"},"publishedAt":{"description":"Publication time as Unix epoch milliseconds.. Warning: Values \u003e 2^53 may lose precision in JavaScript","format":"int64","type":"integer"},"snippet":{"description":"Short text snippet or description.","type":"string"},"sourceName":{"description":"Name of the news source (e.g., \"FlightGlobal\").","type":"string"},"title":{"description":"Article title.","type":"string"},"url":{"description":"Article URL.","type":"string"}},"type":"object"},"Carrier":{"description":"Carrier represents an airline or aircraft operator.","properties":{"iataCode":{"description":"IATA two-letter airline code (e.g., \"TK\").","type":"string"},"icaoCode":{"description":"ICAO three-letter airline code (e.g., \"THY\").","type":"string"},"name":{"description":"Full airline name (e.g., \"Turkish Airlines\").","type":"string"}},"type":"object"},"CarrierOpsSummary":{"description":"CarrierOpsSummary contains delay and cancellation metrics for a carrier at an airport.","properties":{"airport":{"description":"Airport IATA code this summary applies to.","type":"string"},"avgDelayMinutes":{"description":"Average delay in minutes across delayed flights.","format":"int32","type":"integer"},"cancellationRate":{"description":"Cancellation rate (0-100).","format":"double","type":"number"},"cancelledCount":{"description":"Number of cancelled flights.","format":"int32","type":"integer"},"carrier":{"$ref":"#/components/schemas/Carrier"},"delayPct":{"description":"Delay percentage (0-100).","format":"double","type":"number"},"delayedCount":{"description":"Number of delayed flights.","format":"int32","type":"integer"},"totalFlights":{"description":"Total flights observed.","format":"int32","type":"integer"},"updatedAt":{"description":"Last update time as Unix epoch milliseconds.. Warning: Values \u003e 2^53 may lose precision in JavaScript","format":"int64","type":"integer"}},"type":"object"},"DatePriceEntry":{"description":"DatePriceEntry pairs a departure date (and optional return date) with its cheapest price.","properties":{"date":{"description":"Departure date in YYYY-MM-DD format.","type":"string"},"price":{"format":"double","type":"number"},"returnDate":{"description":"Return date in YYYY-MM-DD format; empty for one-way results.","type":"string"}},"type":"object"},"Error":{"description":"Error is returned when a handler encounters an error. It contains a simple error message that the developer can customize.","properties":{"message":{"description":"Error message (e.g., 'user not found', 'database connection failed')","type":"string"}},"type":"object"},"FieldViolation":{"description":"FieldViolation describes a single validation error for a specific field.","properties":{"description":{"description":"Human-readable description of the validation violation (e.g., 'must be a valid email address', 'required field missing')","type":"string"},"field":{"description":"The field path that failed validation (e.g., 'user.email' for nested fields). For header validation, this will be the header name (e.g., 'X-API-Key')","type":"string"}},"required":["field","description"],"type":"object"},"FlightInstance":{"description":"FlightInstance represents a specific occurrence of a flight on a given date.","properties":{"actualArrival":{"description":"Actual arrival time as Unix epoch milliseconds (UTC).. Warning: Values \u003e 2^53 may lose precision in JavaScript","format":"int64","type":"integer"},"actualDeparture":{"description":"Actual departure time as Unix epoch milliseconds (UTC).. Warning: Values \u003e 2^53 may lose precision in JavaScript","format":"int64","type":"integer"},"aircraftIcao24":{"description":"ICAO 24-bit transponder address of the aircraft (hex, e.g., \"4b1805\").","type":"string"},"aircraftType":{"description":"Aircraft type designator (e.g., \"B738\").","type":"string"},"cancelled":{"description":"Whether the flight is cancelled.","type":"boolean"},"codeshareFlightNumbers":{"items":{"description":"Codeshare flight numbers marketed under this operating flight.","type":"string"},"type":"array"},"date":{"description":"Departure date in ISO 8601 format (e.g., \"2026-03-05\").","type":"string"},"delayMinutes":{"description":"Delay in minutes (0 if on time, negative if early).","format":"int32","type":"integer"},"destination":{"$ref":"#/components/schemas/AirportRef"},"diverted":{"description":"Whether the flight has been diverted.","type":"boolean"},"estimatedArrival":{"description":"Estimated arrival time as Unix epoch milliseconds (UTC).. Warning: Values \u003e 2^53 may lose precision in JavaScript","format":"int64","type":"integer"},"estimatedDeparture":{"description":"Estimated departure time as Unix epoch milliseconds (UTC).. Warning: Values \u003e 2^53 may lose precision in JavaScript","format":"int64","type":"integer"},"flightNumber":{"description":"IATA flight number (e.g., \"TK1952\").","type":"string"},"gate":{"description":"Departure gate (if available).","type":"string"},"operatingCarrier":{"$ref":"#/components/schemas/Carrier"},"origin":{"$ref":"#/components/schemas/AirportRef"},"scheduledArrival":{"description":"Scheduled arrival time as Unix epoch milliseconds (UTC).. Warning: Values \u003e 2^53 may lose precision in JavaScript","format":"int64","type":"integer"},"scheduledDeparture":{"description":"Scheduled departure time as Unix epoch milliseconds (UTC).. Warning: Values \u003e 2^53 may lose precision in JavaScript","format":"int64","type":"integer"},"source":{"description":"Data source provider name.","type":"string"},"status":{"description":"FlightInstanceStatus represents the operational status of a flight occurrence.","enum":["FLIGHT_INSTANCE_STATUS_UNSPECIFIED","FLIGHT_INSTANCE_STATUS_SCHEDULED","FLIGHT_INSTANCE_STATUS_BOARDING","FLIGHT_INSTANCE_STATUS_DEPARTED","FLIGHT_INSTANCE_STATUS_AIRBORNE","FLIGHT_INSTANCE_STATUS_LANDED","FLIGHT_INSTANCE_STATUS_ARRIVED","FLIGHT_INSTANCE_STATUS_CANCELLED","FLIGHT_INSTANCE_STATUS_DIVERTED","FLIGHT_INSTANCE_STATUS_UNKNOWN"],"type":"string"},"terminal":{"description":"Departure terminal (if available).","type":"string"},"updatedAt":{"description":"Last update time as Unix epoch milliseconds.. Warning: Values \u003e 2^53 may lose precision in JavaScript","format":"int64","type":"integer"}},"type":"object"},"GeoCoordinates":{"description":"GeoCoordinates represents a geographic location using WGS84 coordinates.","properties":{"latitude":{"description":"Latitude in decimal degrees (-90 to 90).","format":"double","maximum":90,"minimum":-90,"type":"number"},"longitude":{"description":"Longitude in decimal degrees (-180 to 180).","format":"double","maximum":180,"minimum":-180,"type":"number"}},"type":"object"},"GetAirportOpsSummaryRequest":{"description":"GetAirportOpsSummaryRequest specifies which airports to summarize.","properties":{"airports":{"items":{"description":"IATA airport codes to query (e.g., [\"IST\", \"ESB\", \"LHR\"]).","maxItems":20,"minItems":1,"type":"string"},"maxItems":20,"minItems":1,"type":"array"}},"type":"object"},"GetAirportOpsSummaryResponse":{"description":"GetAirportOpsSummaryResponse contains operational summaries for requested airports.","properties":{"cacheHit":{"description":"Whether the response was served from cache.","type":"boolean"},"summaries":{"items":{"$ref":"#/components/schemas/AirportOpsSummary"},"type":"array"}},"type":"object"},"GetCarrierOpsRequest":{"description":"GetCarrierOpsRequest specifies parameters for carrier operations metrics.","properties":{"airports":{"items":{"description":"IATA airport codes to aggregate carrier metrics from.","maxItems":20,"minItems":1,"type":"string"},"maxItems":20,"minItems":1,"type":"array"},"minFlights":{"description":"Minimum number of flights required to include a carrier (default: 1).","format":"int32","minimum":0,"type":"integer"}},"type":"object"},"GetCarrierOpsResponse":{"description":"GetCarrierOpsResponse contains carrier operations metrics.","properties":{"carriers":{"items":{"$ref":"#/components/schemas/CarrierOpsSummary"},"type":"array"},"source":{"description":"Data source identifier.","type":"string"},"updatedAt":{"description":"Last update time as Unix epoch milliseconds.. Warning: Values \u003e 2^53 may lose precision in JavaScript","format":"int64","type":"integer"}},"type":"object"},"GetFlightStatusRequest":{"description":"GetFlightStatusRequest specifies a flight to look up.","properties":{"date":{"description":"Departure date in ISO 8601 format (e.g., \"2026-03-05\").","type":"string"},"flightNumber":{"description":"IATA flight number (e.g., \"TK1952\").","maxLength":10,"minLength":3,"type":"string"},"origin":{"description":"Optional origin airport IATA code to disambiguate.","type":"string"}},"required":["flightNumber","date"],"type":"object"},"GetFlightStatusResponse":{"description":"GetFlightStatusResponse contains flight status results.","properties":{"cacheHit":{"description":"Whether the response was served from cache.","type":"boolean"},"flights":{"items":{"$ref":"#/components/schemas/FlightInstance"},"type":"array"},"source":{"description":"Data source identifier.","type":"string"}},"type":"object"},"GetYoutubeLiveStreamInfoRequest":{"description":"GetYoutubeLiveStreamInfoRequest parameters for detecting live status.","properties":{"channel":{"description":"YouTube channel handle or ID.","type":"string"},"videoId":{"description":"Specific video ID to check.","type":"string"}},"type":"object"},"GetYoutubeLiveStreamInfoResponse":{"description":"GetYoutubeLiveStreamInfoResponse containing detection results.","properties":{"channelExists":{"description":"Whether the channel exists.","type":"boolean"},"channelName":{"description":"Human-readable channel name.","type":"string"},"error":{"description":"Optional error message.","type":"string"},"hlsUrl":{"description":"HLS manifest URL (if available).","type":"string"},"isLive":{"description":"Whether the stream is currently live.","type":"boolean"},"title":{"description":"Stream title.","type":"string"},"videoId":{"description":"Video ID of the live stream (if found).","type":"string"}},"type":"object"},"GoogleFlightLeg":{"description":"GoogleFlightLeg represents a single flight segment (one plane, one takeoff and landing).","properties":{"airlineCode":{"type":"string"},"arrivalAirport":{"type":"string"},"arrivalDatetime":{"type":"string"},"departureAirport":{"type":"string"},"departureDatetime":{"description":"ISO 8601 local datetime, e.g. \"2025-06-01T08:45\".","type":"string"},"durationMinutes":{"format":"int32","type":"integer"},"flightNumber":{"type":"string"}},"type":"object"},"GoogleFlightResult":{"description":"GoogleFlightResult represents a complete itinerary (one or more legs).","properties":{"durationMinutes":{"format":"int32","type":"integer"},"legs":{"items":{"$ref":"#/components/schemas/GoogleFlightLeg"},"type":"array"},"price":{"format":"double","type":"number"},"stops":{"format":"int32","type":"integer"}},"type":"object"},"ListAirportDelaysRequest":{"description":"ListAirportDelaysRequest specifies filters for retrieving airport delay alerts.","properties":{"cursor":{"description":"Cursor for next page.","type":"string"},"minSeverity":{"description":"FlightDelaySeverity represents the severity of flight delays at an airport.\n Maps to TS union: 'normal' | 'minor' | 'moderate' | 'major' | 'severe'.","enum":["FLIGHT_DELAY_SEVERITY_UNSPECIFIED","FLIGHT_DELAY_SEVERITY_NORMAL","FLIGHT_DELAY_SEVERITY_MINOR","FLIGHT_DELAY_SEVERITY_MODERATE","FLIGHT_DELAY_SEVERITY_MAJOR","FLIGHT_DELAY_SEVERITY_SEVERE"],"type":"string"},"pageSize":{"description":"Maximum items per page (1-100).","format":"int32","type":"integer"},"region":{"description":"AirportRegion represents the geographic region of an airport.","enum":["AIRPORT_REGION_UNSPECIFIED","AIRPORT_REGION_AMERICAS","AIRPORT_REGION_EUROPE","AIRPORT_REGION_APAC","AIRPORT_REGION_MENA","AIRPORT_REGION_AFRICA"],"type":"string"}},"type":"object"},"ListAirportDelaysResponse":{"description":"ListAirportDelaysResponse contains airport delay alerts matching the request.","properties":{"alerts":{"items":{"$ref":"#/components/schemas/AirportDelayAlert"},"type":"array"},"pagination":{"$ref":"#/components/schemas/PaginationResponse"}},"type":"object"},"ListAirportFlightsRequest":{"description":"ListAirportFlightsRequest specifies parameters for retrieving recent flights at an airport.","properties":{"airport":{"description":"IATA airport code (e.g., \"IST\").","maxLength":4,"minLength":3,"type":"string"},"direction":{"description":"FlightDirection specifies whether to retrieve departures, arrivals, or both.","enum":["FLIGHT_DIRECTION_UNSPECIFIED","FLIGHT_DIRECTION_DEPARTURE","FLIGHT_DIRECTION_ARRIVAL","FLIGHT_DIRECTION_BOTH"],"type":"string"},"limit":{"description":"Maximum number of flights to return (1-100).","format":"int32","maximum":100,"minimum":1,"type":"integer"}},"required":["airport"],"type":"object"},"ListAirportFlightsResponse":{"description":"ListAirportFlightsResponse contains recent flights at an airport.","properties":{"flights":{"items":{"$ref":"#/components/schemas/FlightInstance"},"type":"array"},"source":{"description":"Data source identifier.","type":"string"},"totalAvailable":{"description":"Total number of flights available from the provider.","format":"int32","type":"integer"},"updatedAt":{"description":"Last update time as Unix epoch milliseconds.. Warning: Values \u003e 2^53 may lose precision in JavaScript","format":"int64","type":"integer"}},"type":"object"},"ListAviationNewsRequest":{"description":"ListAviationNewsRequest specifies filters for aviation news retrieval.","properties":{"entities":{"items":{"description":"Entities to filter by (airline names, airport codes, route strings).","maxItems":10,"minItems":1,"type":"string"},"maxItems":10,"minItems":1,"type":"array"},"maxItems":{"description":"Maximum number of news items to return (1-50).","format":"int32","maximum":50,"minimum":1,"type":"integer"},"windowHours":{"description":"Time window in hours to look back (1-168).","format":"int32","maximum":168,"minimum":1,"type":"integer"}},"type":"object"},"ListAviationNewsResponse":{"description":"ListAviationNewsResponse contains filtered aviation news items.","properties":{"items":{"items":{"$ref":"#/components/schemas/AviationNewsItem"},"type":"array"},"source":{"description":"Data source identifier.","type":"string"},"updatedAt":{"description":"Last update time as Unix epoch milliseconds.. Warning: Values \u003e 2^53 may lose precision in JavaScript","format":"int64","type":"integer"}},"type":"object"},"PaginationResponse":{"description":"PaginationResponse contains pagination metadata returned alongside list results.","properties":{"nextCursor":{"description":"Cursor for fetching the next page. Empty string indicates no more pages.","type":"string"},"totalCount":{"description":"Total count of items matching the query, if known. Zero if the total is unknown.","format":"int32","type":"integer"}},"type":"object"},"PositionSample":{"description":"PositionSample represents a single aircraft position observation.","properties":{"altitudeM":{"description":"Barometric altitude in metres.","format":"double","type":"number"},"callsign":{"description":"ATC callsign (e.g., \"THY7CX\").","type":"string"},"groundSpeedKts":{"description":"Ground speed in knots.","format":"double","type":"number"},"icao24":{"description":"ICAO 24-bit transponder address (hex, e.g., \"4b1805\").","type":"string"},"lat":{"description":"Latitude in decimal degrees.","format":"double","type":"number"},"lon":{"description":"Longitude in decimal degrees.","format":"double","type":"number"},"observedAt":{"description":"Observation time as Unix epoch milliseconds.. Warning: Values \u003e 2^53 may lose precision in JavaScript","format":"int64","type":"integer"},"onGround":{"description":"Whether the aircraft is on the ground.","type":"boolean"},"source":{"description":"PositionSource identifies the provider of aircraft position data.","enum":["POSITION_SOURCE_UNSPECIFIED","POSITION_SOURCE_OPENSKY","POSITION_SOURCE_WINGBITS","POSITION_SOURCE_SIMULATED"],"type":"string"},"trackDeg":{"description":"True track over ground in degrees (0 = North, clockwise).","format":"double","type":"number"},"verticalRate":{"description":"Vertical rate in metres per second (positive = climbing).","format":"double","type":"number"}},"type":"object"},"PriceQuote":{"description":"PriceQuote represents a single flight price offer from a provider.","properties":{"bookingUrl":{"description":"Booking URL or deep-link (if available).","type":"string"},"cabin":{"description":"CabinClass represents the travel class for a flight ticket.","enum":["CABIN_CLASS_UNSPECIFIED","CABIN_CLASS_ECONOMY","CABIN_CLASS_PREMIUM_ECONOMY","CABIN_CLASS_BUSINESS","CABIN_CLASS_FIRST"],"type":"string"},"carrier":{"$ref":"#/components/schemas/Carrier"},"checkoutRef":{"description":"Reference used during the checkout process (for follow-up actions).","type":"string"},"currency":{"description":"ISO 4217 currency code (e.g., \"EUR\", \"USD\", \"TRY\").","type":"string"},"departureDate":{"description":"Outbound departure date (ISO 8601).","type":"string"},"destination":{"description":"Destination airport IATA code.","type":"string"},"durationMinutes":{"description":"Total travel duration in minutes.","format":"int32","type":"integer"},"expiresAt":{"description":"Time when this quote expires, as Unix epoch milliseconds.. Warning: Values \u003e 2^53 may lose precision in JavaScript","format":"int64","type":"integer"},"id":{"description":"Unique quote identifier.","type":"string"},"isIndicative":{"description":"Whether the price is indicative rather than bookable.","type":"boolean"},"observedAt":{"description":"Time when this quote was observed, as Unix epoch milliseconds.. Warning: Values \u003e 2^53 may lose precision in JavaScript","format":"int64","type":"integer"},"origin":{"description":"Origin airport IATA code.","type":"string"},"priceAmount":{"description":"Total price amount.","format":"double","type":"number"},"provider":{"description":"Provider name (e.g., \"amadeus\", \"demo\").","type":"string"},"returnDate":{"description":"Return date (ISO 8601), empty for one-way.","type":"string"},"stops":{"description":"Number of stops (0 = nonstop).","format":"int32","type":"integer"}},"type":"object"},"SearchFlightPricesRequest":{"description":"SearchFlightPricesRequest specifies parameters for a flight price search.","properties":{"adults":{"description":"Number of adult passengers (1-9).","format":"int32","maximum":9,"minimum":1,"type":"integer"},"cabin":{"description":"CabinClass represents the travel class for a flight ticket.","enum":["CABIN_CLASS_UNSPECIFIED","CABIN_CLASS_ECONOMY","CABIN_CLASS_PREMIUM_ECONOMY","CABIN_CLASS_BUSINESS","CABIN_CLASS_FIRST"],"type":"string"},"currency":{"description":"ISO 4217 currency code for prices (e.g., \"usd\", \"eur\", \"try\").","type":"string"},"departureDate":{"description":"Outbound departure date (ISO 8601).","type":"string"},"destination":{"description":"Destination airport IATA code.","maxLength":4,"minLength":3,"type":"string"},"market":{"description":"Market/locale code (e.g., \"us\", \"tr\").","type":"string"},"maxResults":{"description":"Maximum number of quotes to return (1-50).","format":"int32","maximum":50,"minimum":1,"type":"integer"},"nonstopOnly":{"description":"Whether to restrict to nonstop flights only.","type":"boolean"},"origin":{"description":"Origin airport IATA code.","maxLength":4,"minLength":3,"type":"string"},"returnDate":{"description":"Return date (ISO 8601), empty for one-way.","type":"string"}},"required":["origin","destination","departureDate"],"type":"object"},"SearchFlightPricesResponse":{"description":"SearchFlightPricesResponse contains flight price offers.","properties":{"isDemoMode":{"description":"Whether results are from demo/simulated mode.","type":"boolean"},"isIndicative":{"description":"Whether returned prices are indicative (subject to change).","type":"boolean"},"provider":{"description":"Provider name (e.g., \"amadeus\", \"demo\").","type":"string"},"quotes":{"items":{"$ref":"#/components/schemas/PriceQuote"},"type":"array"},"updatedAt":{"description":"Last update time as Unix epoch milliseconds.. Warning: Values \u003e 2^53 may lose precision in JavaScript","format":"int64","type":"integer"}},"type":"object"},"SearchGoogleDatesRequest":{"description":"SearchGoogleDatesRequest specifies parameters for a Google Flights date-range price search.","properties":{"airlines":{"items":{"description":"Airline IATA codes to filter by (e.g. [\"BA\", \"AA\"]).","type":"string"},"type":"array"},"cabinClass":{"description":"Cabin class: ECONOMY, PREMIUM_ECONOMY, BUSINESS, or FIRST.","type":"string"},"departureWindow":{"description":"Departure time window in HH-HH format (e.g. \"6-20\").","type":"string"},"destination":{"description":"Arrival airport IATA code (e.g. \"LHR\").","type":"string"},"endDate":{"description":"End of date range in YYYY-MM-DD format.","type":"string"},"isRoundTrip":{"description":"Whether to search for round-trip flights.","type":"boolean"},"maxStops":{"description":"Stop filter: ANY, NON_STOP, ONE_STOP, or TWO_PLUS_STOPS.","type":"string"},"origin":{"description":"Departure airport IATA code (e.g. \"JFK\").","type":"string"},"passengers":{"description":"Number of adult passengers (1-9).","format":"int32","type":"integer"},"sortByPrice":{"description":"Whether to sort results by price (lowest first).","type":"boolean"},"startDate":{"description":"Start of date range in YYYY-MM-DD format.","type":"string"},"tripDuration":{"description":"Trip duration in days (required for round-trip searches).","format":"int32","type":"integer"}},"type":"object"},"SearchGoogleDatesResponse":{"description":"SearchGoogleDatesResponse contains cheapest-date results from Google Flights.","properties":{"dates":{"items":{"$ref":"#/components/schemas/DatePriceEntry"},"type":"array"},"degraded":{"type":"boolean"},"error":{"type":"string"}},"type":"object"},"SearchGoogleFlightsRequest":{"description":"SearchGoogleFlightsRequest specifies parameters for a Google Flights search.","properties":{"airlines":{"items":{"description":"Airline IATA codes to filter by (e.g. [\"BA\", \"AA\"]).","type":"string"},"type":"array"},"cabinClass":{"description":"Cabin class: ECONOMY, PREMIUM_ECONOMY, BUSINESS, or FIRST.","type":"string"},"departureDate":{"description":"Departure date in YYYY-MM-DD format.","type":"string"},"departureWindow":{"description":"Departure time window in HH-HH format (e.g. \"6-20\").","type":"string"},"destination":{"description":"Arrival airport IATA code (e.g. \"LHR\").","type":"string"},"maxStops":{"description":"Stop filter: ANY, NON_STOP, ONE_STOP, or TWO_PLUS_STOPS.","type":"string"},"origin":{"description":"Departure airport IATA code (e.g. \"JFK\").","type":"string"},"passengers":{"description":"Number of adult passengers (1-9).","format":"int32","type":"integer"},"returnDate":{"description":"Return date in YYYY-MM-DD format; omit for one-way.","type":"string"},"sortBy":{"description":"Sort order: CHEAPEST, DURATION, DEPARTURE_TIME, or ARRIVAL_TIME.","type":"string"}},"type":"object"},"SearchGoogleFlightsResponse":{"description":"SearchGoogleFlightsResponse contains flight results from Google Flights.","properties":{"degraded":{"type":"boolean"},"error":{"type":"string"},"flights":{"items":{"$ref":"#/components/schemas/GoogleFlightResult"},"type":"array"}},"type":"object"},"TrackAircraftRequest":{"description":"TrackAircraftRequest specifies an aircraft to track.","properties":{"callsign":{"description":"ATC callsign (e.g., \"THY7CX\").","type":"string"},"icao24":{"description":"ICAO 24-bit transponder address (hex, e.g., \"4b1805\").","type":"string"},"neLat":{"description":"Optional bounding box north-east latitude.","format":"double","type":"number"},"neLon":{"description":"Optional bounding box north-east longitude.","format":"double","type":"number"},"swLat":{"description":"Optional bounding box south-west latitude.","format":"double","type":"number"},"swLon":{"description":"Optional bounding box south-west longitude.","format":"double","type":"number"}},"type":"object"},"TrackAircraftResponse":{"description":"TrackAircraftResponse contains aircraft position observations.","properties":{"positions":{"items":{"$ref":"#/components/schemas/PositionSample"},"type":"array"},"source":{"description":"Data source identifier.","type":"string"},"updatedAt":{"description":"Last update time as Unix epoch milliseconds.. Warning: Values \u003e 2^53 may lose precision in JavaScript","format":"int64","type":"integer"}},"type":"object"},"ValidationError":{"description":"ValidationError is returned when request validation fails. It contains a list of field violations describing what went wrong.","properties":{"violations":{"description":"List of validation violations","items":{"$ref":"#/components/schemas/FieldViolation"},"type":"array"}},"required":["violations"],"type":"object"}}},"info":{"title":"AviationService API","version":"1.0.0"},"openapi":"3.1.0","paths":{"/api/aviation/v1/get-airport-ops-summary":{"get":{"description":"GetAirportOpsSummary returns operational health metrics for watched airports.","operationId":"GetAirportOpsSummary","parameters":[{"description":"IATA airport codes to query (e.g., [\"IST\", \"ESB\", \"LHR\"]).","in":"query","name":"airports","required":false,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetAirportOpsSummaryResponse"}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}},"description":"Validation error"},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error response"}},"summary":"GetAirportOpsSummary","tags":["AviationService"]}},"/api/aviation/v1/get-carrier-ops":{"get":{"description":"GetCarrierOps returns delay and cancellation metrics grouped by carrier.","operationId":"GetCarrierOps","parameters":[{"description":"IATA airport codes to aggregate carrier metrics from.","in":"query","name":"airports","required":false,"schema":{"type":"string"}},{"description":"Minimum number of flights required to include a carrier (default: 1).","in":"query","name":"min_flights","required":false,"schema":{"format":"int32","type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetCarrierOpsResponse"}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}},"description":"Validation error"},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error response"}},"summary":"GetCarrierOps","tags":["AviationService"]}},"/api/aviation/v1/get-flight-status":{"get":{"description":"GetFlightStatus looks up the current status of a specific flight.","operationId":"GetFlightStatus","parameters":[{"description":"IATA flight number (e.g., \"TK1952\").","in":"query","name":"flight_number","required":false,"schema":{"type":"string"}},{"description":"Departure date in ISO 8601 format (e.g., \"2026-03-05\").","in":"query","name":"date","required":false,"schema":{"type":"string"}},{"description":"Optional origin airport IATA code to disambiguate.","in":"query","name":"origin","required":false,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetFlightStatusResponse"}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}},"description":"Validation error"},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error response"}},"summary":"GetFlightStatus","tags":["AviationService"]}},"/api/aviation/v1/get-youtube-live-stream-info":{"get":{"description":"GetYoutubeLiveStreamInfo retrieves information about a YouTube live stream (status, title, etc).","operationId":"GetYoutubeLiveStreamInfo","parameters":[{"description":"YouTube channel handle or ID.","in":"query","name":"channel","required":false,"schema":{"type":"string"}},{"description":"Specific video ID to check.","in":"query","name":"video_id","required":false,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetYoutubeLiveStreamInfoResponse"}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}},"description":"Validation error"},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error response"}},"summary":"GetYoutubeLiveStreamInfo","tags":["AviationService"]}},"/api/aviation/v1/list-airport-delays":{"get":{"description":"ListAirportDelays retrieves current airport delay alerts.","operationId":"ListAirportDelays","parameters":[{"description":"Maximum items per page (1-100).","in":"query","name":"page_size","required":false,"schema":{"format":"int32","type":"integer"}},{"description":"Cursor for next page.","in":"query","name":"cursor","required":false,"schema":{"type":"string"}},{"description":"Optional region filter.","in":"query","name":"region","required":false,"schema":{"type":"string"}},{"description":"Optional minimum severity filter.","in":"query","name":"min_severity","required":false,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListAirportDelaysResponse"}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}},"description":"Validation error"},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error response"}},"summary":"ListAirportDelays","tags":["AviationService"]}},"/api/aviation/v1/list-airport-flights":{"get":{"description":"ListAirportFlights retrieves recent flights at a specific airport.","operationId":"ListAirportFlights","parameters":[{"description":"IATA airport code (e.g., \"IST\").","in":"query","name":"airport","required":false,"schema":{"type":"string"}},{"description":"Direction filter.","in":"query","name":"direction","required":false,"schema":{"type":"string"}},{"description":"Maximum number of flights to return (1-100).","in":"query","name":"limit","required":false,"schema":{"format":"int32","type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListAirportFlightsResponse"}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}},"description":"Validation error"},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error response"}},"summary":"ListAirportFlights","tags":["AviationService"]}},"/api/aviation/v1/list-aviation-news":{"get":{"description":"ListAviationNews retrieves filtered aviation news articles.","operationId":"ListAviationNews","parameters":[{"description":"Entities to filter by (airline names, airport codes, route strings).","in":"query","name":"entities","required":false,"schema":{"type":"string"}},{"description":"Time window in hours to look back (1-168).","in":"query","name":"window_hours","required":false,"schema":{"format":"int32","type":"integer"}},{"description":"Maximum number of news items to return (1-50).","in":"query","name":"max_items","required":false,"schema":{"format":"int32","type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListAviationNewsResponse"}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}},"description":"Validation error"},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error response"}},"summary":"ListAviationNews","tags":["AviationService"]}},"/api/aviation/v1/search-flight-prices":{"get":{"description":"SearchFlightPrices searches for flight price offers on a route.","operationId":"SearchFlightPrices","parameters":[{"description":"Origin airport IATA code.","in":"query","name":"origin","required":false,"schema":{"type":"string"}},{"description":"Destination airport IATA code.","in":"query","name":"destination","required":false,"schema":{"type":"string"}},{"description":"Outbound departure date (ISO 8601).","in":"query","name":"departure_date","required":false,"schema":{"type":"string"}},{"description":"Return date (ISO 8601), empty for one-way.","in":"query","name":"return_date","required":false,"schema":{"type":"string"}},{"description":"Number of adult passengers (1-9).","in":"query","name":"adults","required":false,"schema":{"format":"int32","type":"integer"}},{"description":"Desired cabin class.","in":"query","name":"cabin","required":false,"schema":{"type":"string"}},{"description":"Whether to restrict to nonstop flights only.","in":"query","name":"nonstop_only","required":false,"schema":{"type":"boolean"}},{"description":"Maximum number of quotes to return (1-50).","in":"query","name":"max_results","required":false,"schema":{"format":"int32","type":"integer"}},{"description":"ISO 4217 currency code for prices (e.g., \"usd\", \"eur\", \"try\").","in":"query","name":"currency","required":false,"schema":{"type":"string"}},{"description":"Market/locale code (e.g., \"us\", \"tr\").","in":"query","name":"market","required":false,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SearchFlightPricesResponse"}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}},"description":"Validation error"},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error response"}},"summary":"SearchFlightPrices","tags":["AviationService"]}},"/api/aviation/v1/search-google-dates":{"get":{"description":"SearchGoogleDates finds the cheapest travel dates across a flexible date range via Google Flights.","operationId":"SearchGoogleDates","parameters":[{"description":"Departure airport IATA code (e.g. \"JFK\").","in":"query","name":"origin","required":false,"schema":{"type":"string"}},{"description":"Arrival airport IATA code (e.g. \"LHR\").","in":"query","name":"destination","required":false,"schema":{"type":"string"}},{"description":"Start of date range in YYYY-MM-DD format.","in":"query","name":"start_date","required":false,"schema":{"type":"string"}},{"description":"End of date range in YYYY-MM-DD format.","in":"query","name":"end_date","required":false,"schema":{"type":"string"}},{"description":"Trip duration in days (required for round-trip searches).","in":"query","name":"trip_duration","required":false,"schema":{"format":"int32","type":"integer"}},{"description":"Whether to search for round-trip flights.","in":"query","name":"is_round_trip","required":false,"schema":{"type":"boolean"}},{"description":"Cabin class: ECONOMY, PREMIUM_ECONOMY, BUSINESS, or FIRST.","in":"query","name":"cabin_class","required":false,"schema":{"type":"string"}},{"description":"Stop filter: ANY, NON_STOP, ONE_STOP, or TWO_PLUS_STOPS.","in":"query","name":"max_stops","required":false,"schema":{"type":"string"}},{"description":"Departure time window in HH-HH format (e.g. \"6-20\").","in":"query","name":"departure_window","required":false,"schema":{"type":"string"}},{"description":"Airline IATA codes to filter by (e.g. [\"BA\", \"AA\"]).","in":"query","name":"airlines","required":false,"schema":{"type":"string"}},{"description":"Whether to sort results by price (lowest first).","in":"query","name":"sort_by_price","required":false,"schema":{"type":"boolean"}},{"description":"Number of adult passengers (1-9).","in":"query","name":"passengers","required":false,"schema":{"format":"int32","type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SearchGoogleDatesResponse"}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}},"description":"Validation error"},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error response"}},"summary":"SearchGoogleDates","tags":["AviationService"]}},"/api/aviation/v1/search-google-flights":{"get":{"description":"SearchGoogleFlights searches Google Flights for available itineraries on a specific date.","operationId":"SearchGoogleFlights","parameters":[{"description":"Departure airport IATA code (e.g. \"JFK\").","in":"query","name":"origin","required":false,"schema":{"type":"string"}},{"description":"Arrival airport IATA code (e.g. \"LHR\").","in":"query","name":"destination","required":false,"schema":{"type":"string"}},{"description":"Departure date in YYYY-MM-DD format.","in":"query","name":"departure_date","required":false,"schema":{"type":"string"}},{"description":"Return date in YYYY-MM-DD format; omit for one-way.","in":"query","name":"return_date","required":false,"schema":{"type":"string"}},{"description":"Cabin class: ECONOMY, PREMIUM_ECONOMY, BUSINESS, or FIRST.","in":"query","name":"cabin_class","required":false,"schema":{"type":"string"}},{"description":"Stop filter: ANY, NON_STOP, ONE_STOP, or TWO_PLUS_STOPS.","in":"query","name":"max_stops","required":false,"schema":{"type":"string"}},{"description":"Departure time window in HH-HH format (e.g. \"6-20\").","in":"query","name":"departure_window","required":false,"schema":{"type":"string"}},{"description":"Airline IATA codes to filter by (e.g. [\"BA\", \"AA\"]).","in":"query","name":"airlines","required":false,"schema":{"type":"string"}},{"description":"Sort order: CHEAPEST, DURATION, DEPARTURE_TIME, or ARRIVAL_TIME.","in":"query","name":"sort_by","required":false,"schema":{"type":"string"}},{"description":"Number of adult passengers (1-9).","in":"query","name":"passengers","required":false,"schema":{"format":"int32","type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SearchGoogleFlightsResponse"}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}},"description":"Validation error"},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error response"}},"summary":"SearchGoogleFlights","tags":["AviationService"]}},"/api/aviation/v1/track-aircraft":{"get":{"description":"TrackAircraft retrieves live position stream for a specific aircraft hex.","operationId":"TrackAircraft","parameters":[{"description":"ICAO 24-bit transponder address (hex, e.g., \"4b1805\").","in":"query","name":"icao24","required":false,"schema":{"type":"string"}},{"description":"ATC callsign (e.g., \"THY7CX\").","in":"query","name":"callsign","required":false,"schema":{"type":"string"}},{"description":"Optional bounding box south-west latitude.","in":"query","name":"sw_lat","required":false,"schema":{"format":"double","type":"number"}},{"description":"Optional bounding box south-west longitude.","in":"query","name":"sw_lon","required":false,"schema":{"format":"double","type":"number"}},{"description":"Optional bounding box north-east latitude.","in":"query","name":"ne_lat","required":false,"schema":{"format":"double","type":"number"}},{"description":"Optional bounding box north-east longitude.","in":"query","name":"ne_lon","required":false,"schema":{"format":"double","type":"number"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TrackAircraftResponse"}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}},"description":"Validation error"},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error response"}},"summary":"TrackAircraft","tags":["AviationService"]}}}} \ No newline at end of file +{"components":{"schemas":{"AirportDelayAlert":{"description":"AirportDelayAlert represents a flight delay advisory at an airport.\n Sourced from FAA and Eurocontrol.","properties":{"avgDelayMinutes":{"description":"Average delay in minutes.","format":"int32","type":"integer"},"cancelledFlights":{"description":"Number of cancelled flights.","format":"int32","type":"integer"},"city":{"description":"City where the airport is located.","type":"string"},"country":{"description":"Country code (ISO 3166-1 alpha-2).","type":"string"},"delayType":{"description":"FlightDelayType represents the type of flight delay.","enum":["FLIGHT_DELAY_TYPE_UNSPECIFIED","FLIGHT_DELAY_TYPE_GROUND_STOP","FLIGHT_DELAY_TYPE_GROUND_DELAY","FLIGHT_DELAY_TYPE_DEPARTURE_DELAY","FLIGHT_DELAY_TYPE_ARRIVAL_DELAY","FLIGHT_DELAY_TYPE_GENERAL","FLIGHT_DELAY_TYPE_CLOSURE"],"type":"string"},"delayedFlightsPct":{"description":"Percentage of delayed flights.","format":"double","type":"number"},"iata":{"description":"IATA airport code (e.g., \"JFK\").","type":"string"},"icao":{"description":"ICAO airport code (e.g., \"KJFK\").","type":"string"},"id":{"description":"Unique alert identifier.","minLength":1,"type":"string"},"location":{"$ref":"#/components/schemas/GeoCoordinates"},"name":{"description":"Airport name.","type":"string"},"reason":{"description":"Human-readable reason for delays.","type":"string"},"region":{"description":"AirportRegion represents the geographic region of an airport.","enum":["AIRPORT_REGION_UNSPECIFIED","AIRPORT_REGION_AMERICAS","AIRPORT_REGION_EUROPE","AIRPORT_REGION_APAC","AIRPORT_REGION_MENA","AIRPORT_REGION_AFRICA"],"type":"string"},"severity":{"description":"FlightDelaySeverity represents the severity of flight delays at an airport.\n Maps to TS union: 'normal' | 'minor' | 'moderate' | 'major' | 'severe'.","enum":["FLIGHT_DELAY_SEVERITY_UNSPECIFIED","FLIGHT_DELAY_SEVERITY_NORMAL","FLIGHT_DELAY_SEVERITY_MINOR","FLIGHT_DELAY_SEVERITY_MODERATE","FLIGHT_DELAY_SEVERITY_MAJOR","FLIGHT_DELAY_SEVERITY_SEVERE"],"type":"string"},"source":{"description":"FlightDelaySource represents the source of delay data.","enum":["FLIGHT_DELAY_SOURCE_UNSPECIFIED","FLIGHT_DELAY_SOURCE_FAA","FLIGHT_DELAY_SOURCE_EUROCONTROL","FLIGHT_DELAY_SOURCE_COMPUTED","FLIGHT_DELAY_SOURCE_AVIATIONSTACK","FLIGHT_DELAY_SOURCE_NOTAM"],"type":"string"},"totalFlights":{"description":"Total flights scheduled.","format":"int32","type":"integer"},"updatedAt":{"description":"Last data update time, as Unix epoch milliseconds.. Warning: Values \u003e 2^53 may lose precision in JavaScript","format":"int64","type":"integer"}},"required":["id"],"type":"object"},"AirportOpsSummary":{"description":"AirportOpsSummary contains operational health metrics for a single airport.","properties":{"avgDelayMinutes":{"description":"Average delay in minutes across delayed flights.","format":"int32","type":"integer"},"cancellationRate":{"description":"Cancellation rate as a percentage (0-100).","format":"double","type":"number"},"closureStatus":{"description":"Whether the airport is currently closed.","type":"boolean"},"delayPct":{"description":"Percentage of flights currently delayed (0-100).","format":"double","type":"number"},"iata":{"description":"IATA airport code.","type":"string"},"icao":{"description":"ICAO airport code.","type":"string"},"name":{"description":"Airport name.","type":"string"},"notamFlags":{"items":{"description":"Active NOTAM summary flags (e.g., \"RWY 06/24 CLSD\", \"LOW VIS OPS\").","type":"string"},"type":"array"},"severity":{"description":"FlightDelaySeverity represents the severity of flight delays at an airport.\n Maps to TS union: 'normal' | 'minor' | 'moderate' | 'major' | 'severe'.","enum":["FLIGHT_DELAY_SEVERITY_UNSPECIFIED","FLIGHT_DELAY_SEVERITY_NORMAL","FLIGHT_DELAY_SEVERITY_MINOR","FLIGHT_DELAY_SEVERITY_MODERATE","FLIGHT_DELAY_SEVERITY_MAJOR","FLIGHT_DELAY_SEVERITY_SEVERE"],"type":"string"},"source":{"description":"Data source identifier.","type":"string"},"timezone":{"description":"IANA timezone (e.g., \"Europe/Istanbul\").","type":"string"},"topDelayReasons":{"items":{"description":"Top reasons for delays.","type":"string"},"type":"array"},"totalFlights":{"description":"Total flights in the observation window.","format":"int32","type":"integer"},"updatedAt":{"description":"Last update time as Unix epoch milliseconds.. Warning: Values \u003e 2^53 may lose precision in JavaScript","format":"int64","type":"integer"}},"type":"object"},"AirportRef":{"description":"AirportRef is a lightweight reference to an airport.","properties":{"iata":{"description":"IATA airport code (e.g., \"IST\").","type":"string"},"icao":{"description":"ICAO airport code (e.g., \"LTFM\").","type":"string"},"name":{"description":"Airport name (e.g., \"Istanbul Airport\").","type":"string"},"timezone":{"description":"IANA timezone (e.g., \"Europe/Istanbul\").","type":"string"}},"type":"object"},"AviationNewsItem":{"description":"AviationNewsItem represents a single aviation news article or press release.","properties":{"id":{"description":"Unique item identifier (hash of URL).","type":"string"},"imageUrl":{"description":"Article image URL (if available).","type":"string"},"matchedEntities":{"items":{"description":"Entities matched from the query (airport codes, airline names).","type":"string"},"type":"array"},"publishedAt":{"description":"Publication time as Unix epoch milliseconds.. Warning: Values \u003e 2^53 may lose precision in JavaScript","format":"int64","type":"integer"},"snippet":{"description":"Short text snippet or description.","type":"string"},"sourceName":{"description":"Name of the news source (e.g., \"FlightGlobal\").","type":"string"},"title":{"description":"Article title.","type":"string"},"url":{"description":"Article URL.","type":"string"}},"type":"object"},"Carrier":{"description":"Carrier represents an airline or aircraft operator.","properties":{"iataCode":{"description":"IATA two-letter airline code (e.g., \"TK\").","type":"string"},"icaoCode":{"description":"ICAO three-letter airline code (e.g., \"THY\").","type":"string"},"name":{"description":"Full airline name (e.g., \"Turkish Airlines\").","type":"string"}},"type":"object"},"CarrierOpsSummary":{"description":"CarrierOpsSummary contains delay and cancellation metrics for a carrier at an airport.","properties":{"airport":{"description":"Airport IATA code this summary applies to.","type":"string"},"avgDelayMinutes":{"description":"Average delay in minutes across delayed flights.","format":"int32","type":"integer"},"cancellationRate":{"description":"Cancellation rate (0-100).","format":"double","type":"number"},"cancelledCount":{"description":"Number of cancelled flights.","format":"int32","type":"integer"},"carrier":{"$ref":"#/components/schemas/Carrier"},"delayPct":{"description":"Delay percentage (0-100).","format":"double","type":"number"},"delayedCount":{"description":"Number of delayed flights.","format":"int32","type":"integer"},"totalFlights":{"description":"Total flights observed.","format":"int32","type":"integer"},"updatedAt":{"description":"Last update time as Unix epoch milliseconds.. Warning: Values \u003e 2^53 may lose precision in JavaScript","format":"int64","type":"integer"}},"type":"object"},"DatePriceEntry":{"description":"DatePriceEntry pairs a departure date (and optional return date) with its cheapest price.","properties":{"date":{"description":"Departure date in YYYY-MM-DD format.","type":"string"},"price":{"format":"double","type":"number"},"returnDate":{"description":"Return date in YYYY-MM-DD format; empty for one-way results.","type":"string"}},"type":"object"},"Error":{"description":"Error is returned when a handler encounters an error. It contains a simple error message that the developer can customize.","properties":{"message":{"description":"Error message (e.g., 'user not found', 'database connection failed')","type":"string"}},"type":"object"},"FieldViolation":{"description":"FieldViolation describes a single validation error for a specific field.","properties":{"description":{"description":"Human-readable description of the validation violation (e.g., 'must be a valid email address', 'required field missing')","type":"string"},"field":{"description":"The field path that failed validation (e.g., 'user.email' for nested fields). For header validation, this will be the header name (e.g., 'X-API-Key')","type":"string"}},"required":["field","description"],"type":"object"},"FlightInstance":{"description":"FlightInstance represents a specific occurrence of a flight on a given date.","properties":{"actualArrival":{"description":"Actual arrival time as Unix epoch milliseconds (UTC).. Warning: Values \u003e 2^53 may lose precision in JavaScript","format":"int64","type":"integer"},"actualDeparture":{"description":"Actual departure time as Unix epoch milliseconds (UTC).. Warning: Values \u003e 2^53 may lose precision in JavaScript","format":"int64","type":"integer"},"aircraftIcao24":{"description":"ICAO 24-bit transponder address of the aircraft (hex, e.g., \"4b1805\").","type":"string"},"aircraftType":{"description":"Aircraft type designator (e.g., \"B738\").","type":"string"},"cancelled":{"description":"Whether the flight is cancelled.","type":"boolean"},"codeshareFlightNumbers":{"items":{"description":"Codeshare flight numbers marketed under this operating flight.","type":"string"},"type":"array"},"date":{"description":"Departure date in ISO 8601 format (e.g., \"2026-03-05\").","type":"string"},"delayMinutes":{"description":"Delay in minutes (0 if on time, negative if early).","format":"int32","type":"integer"},"destination":{"$ref":"#/components/schemas/AirportRef"},"diverted":{"description":"Whether the flight has been diverted.","type":"boolean"},"estimatedArrival":{"description":"Estimated arrival time as Unix epoch milliseconds (UTC).. Warning: Values \u003e 2^53 may lose precision in JavaScript","format":"int64","type":"integer"},"estimatedDeparture":{"description":"Estimated departure time as Unix epoch milliseconds (UTC).. Warning: Values \u003e 2^53 may lose precision in JavaScript","format":"int64","type":"integer"},"flightNumber":{"description":"IATA flight number (e.g., \"TK1952\").","type":"string"},"gate":{"description":"Departure gate (if available).","type":"string"},"operatingCarrier":{"$ref":"#/components/schemas/Carrier"},"origin":{"$ref":"#/components/schemas/AirportRef"},"scheduledArrival":{"description":"Scheduled arrival time as Unix epoch milliseconds (UTC).. Warning: Values \u003e 2^53 may lose precision in JavaScript","format":"int64","type":"integer"},"scheduledDeparture":{"description":"Scheduled departure time as Unix epoch milliseconds (UTC).. Warning: Values \u003e 2^53 may lose precision in JavaScript","format":"int64","type":"integer"},"source":{"description":"Data source provider name.","type":"string"},"status":{"description":"FlightInstanceStatus represents the operational status of a flight occurrence.","enum":["FLIGHT_INSTANCE_STATUS_UNSPECIFIED","FLIGHT_INSTANCE_STATUS_SCHEDULED","FLIGHT_INSTANCE_STATUS_BOARDING","FLIGHT_INSTANCE_STATUS_DEPARTED","FLIGHT_INSTANCE_STATUS_AIRBORNE","FLIGHT_INSTANCE_STATUS_LANDED","FLIGHT_INSTANCE_STATUS_ARRIVED","FLIGHT_INSTANCE_STATUS_CANCELLED","FLIGHT_INSTANCE_STATUS_DIVERTED","FLIGHT_INSTANCE_STATUS_UNKNOWN"],"type":"string"},"terminal":{"description":"Departure terminal (if available).","type":"string"},"updatedAt":{"description":"Last update time as Unix epoch milliseconds.. Warning: Values \u003e 2^53 may lose precision in JavaScript","format":"int64","type":"integer"}},"type":"object"},"GeoCoordinates":{"description":"GeoCoordinates represents a geographic location using WGS84 coordinates.","properties":{"latitude":{"description":"Latitude in decimal degrees (-90 to 90).","format":"double","maximum":90,"minimum":-90,"type":"number"},"longitude":{"description":"Longitude in decimal degrees (-180 to 180).","format":"double","maximum":180,"minimum":-180,"type":"number"}},"type":"object"},"GetAirportOpsSummaryRequest":{"description":"GetAirportOpsSummaryRequest specifies which airports to summarize.","properties":{"airports":{"items":{"description":"IATA airport codes to query (e.g., [\"IST\", \"ESB\", \"LHR\"]).","maxItems":20,"minItems":1,"type":"string"},"maxItems":20,"minItems":1,"type":"array"}},"type":"object"},"GetAirportOpsSummaryResponse":{"description":"GetAirportOpsSummaryResponse contains operational summaries for requested airports.","properties":{"cacheHit":{"description":"Whether the response was served from cache.","type":"boolean"},"summaries":{"items":{"$ref":"#/components/schemas/AirportOpsSummary"},"type":"array"}},"type":"object"},"GetCarrierOpsRequest":{"description":"GetCarrierOpsRequest specifies parameters for carrier operations metrics.","properties":{"airports":{"items":{"description":"IATA airport codes to aggregate carrier metrics from.","maxItems":20,"minItems":1,"type":"string"},"maxItems":20,"minItems":1,"type":"array"},"minFlights":{"description":"Minimum number of flights required to include a carrier (default: 1).","format":"int32","minimum":0,"type":"integer"}},"type":"object"},"GetCarrierOpsResponse":{"description":"GetCarrierOpsResponse contains carrier operations metrics.","properties":{"carriers":{"items":{"$ref":"#/components/schemas/CarrierOpsSummary"},"type":"array"},"source":{"description":"Data source identifier.","type":"string"},"updatedAt":{"description":"Last update time as Unix epoch milliseconds.. Warning: Values \u003e 2^53 may lose precision in JavaScript","format":"int64","type":"integer"}},"type":"object"},"GetFlightStatusRequest":{"description":"GetFlightStatusRequest specifies a flight to look up.","properties":{"date":{"description":"Departure date in ISO 8601 format (e.g., \"2026-03-05\").","type":"string"},"flightNumber":{"description":"IATA flight number (e.g., \"TK1952\").","maxLength":10,"minLength":3,"type":"string"},"origin":{"description":"Optional origin airport IATA code to disambiguate.","type":"string"}},"required":["flightNumber","date"],"type":"object"},"GetFlightStatusResponse":{"description":"GetFlightStatusResponse contains flight status results.","properties":{"cacheHit":{"description":"Whether the response was served from cache.","type":"boolean"},"flights":{"items":{"$ref":"#/components/schemas/FlightInstance"},"type":"array"},"source":{"description":"Data source identifier.","type":"string"}},"type":"object"},"GetYoutubeLiveStreamInfoRequest":{"description":"GetYoutubeLiveStreamInfoRequest parameters for detecting live status.","properties":{"channel":{"description":"YouTube channel handle or ID.","type":"string"},"videoId":{"description":"Specific video ID to check.","type":"string"}},"type":"object"},"GetYoutubeLiveStreamInfoResponse":{"description":"GetYoutubeLiveStreamInfoResponse containing detection results.","properties":{"channelExists":{"description":"Whether the channel exists.","type":"boolean"},"channelName":{"description":"Human-readable channel name.","type":"string"},"error":{"description":"Optional error message.","type":"string"},"hlsUrl":{"description":"HLS manifest URL (if available).","type":"string"},"isLive":{"description":"Whether the stream is currently live.","type":"boolean"},"title":{"description":"Stream title.","type":"string"},"videoId":{"description":"Video ID of the live stream (if found).","type":"string"}},"type":"object"},"GoogleFlightLeg":{"description":"GoogleFlightLeg represents a single flight segment (one plane, one takeoff and landing).","properties":{"airlineCode":{"type":"string"},"arrivalAirport":{"type":"string"},"arrivalDatetime":{"type":"string"},"departureAirport":{"type":"string"},"departureDatetime":{"description":"ISO 8601 local datetime, e.g. \"2025-06-01T08:45\".","type":"string"},"durationMinutes":{"format":"int32","type":"integer"},"flightNumber":{"type":"string"}},"type":"object"},"GoogleFlightResult":{"description":"GoogleFlightResult represents a complete itinerary (one or more legs).","properties":{"durationMinutes":{"format":"int32","type":"integer"},"legs":{"items":{"$ref":"#/components/schemas/GoogleFlightLeg"},"type":"array"},"price":{"format":"double","type":"number"},"stops":{"format":"int32","type":"integer"}},"type":"object"},"ListAirportDelaysRequest":{"description":"ListAirportDelaysRequest specifies filters for retrieving airport delay alerts.","properties":{"cursor":{"description":"Cursor for next page.","type":"string"},"minSeverity":{"description":"FlightDelaySeverity represents the severity of flight delays at an airport.\n Maps to TS union: 'normal' | 'minor' | 'moderate' | 'major' | 'severe'.","enum":["FLIGHT_DELAY_SEVERITY_UNSPECIFIED","FLIGHT_DELAY_SEVERITY_NORMAL","FLIGHT_DELAY_SEVERITY_MINOR","FLIGHT_DELAY_SEVERITY_MODERATE","FLIGHT_DELAY_SEVERITY_MAJOR","FLIGHT_DELAY_SEVERITY_SEVERE"],"type":"string"},"pageSize":{"description":"Maximum items per page (1-100).","format":"int32","type":"integer"},"region":{"description":"AirportRegion represents the geographic region of an airport.","enum":["AIRPORT_REGION_UNSPECIFIED","AIRPORT_REGION_AMERICAS","AIRPORT_REGION_EUROPE","AIRPORT_REGION_APAC","AIRPORT_REGION_MENA","AIRPORT_REGION_AFRICA"],"type":"string"}},"type":"object"},"ListAirportDelaysResponse":{"description":"ListAirportDelaysResponse contains airport delay alerts matching the request.","properties":{"alerts":{"items":{"$ref":"#/components/schemas/AirportDelayAlert"},"type":"array"},"pagination":{"$ref":"#/components/schemas/PaginationResponse"}},"type":"object"},"ListAirportFlightsRequest":{"description":"ListAirportFlightsRequest specifies parameters for retrieving recent flights at an airport.","properties":{"airport":{"description":"IATA airport code (e.g., \"IST\").","maxLength":4,"minLength":3,"type":"string"},"direction":{"description":"FlightDirection specifies whether to retrieve departures, arrivals, or both.","enum":["FLIGHT_DIRECTION_UNSPECIFIED","FLIGHT_DIRECTION_DEPARTURE","FLIGHT_DIRECTION_ARRIVAL","FLIGHT_DIRECTION_BOTH"],"type":"string"},"limit":{"description":"Maximum number of flights to return (1-100).","format":"int32","maximum":100,"minimum":1,"type":"integer"}},"required":["airport"],"type":"object"},"ListAirportFlightsResponse":{"description":"ListAirportFlightsResponse contains recent flights at an airport.","properties":{"flights":{"items":{"$ref":"#/components/schemas/FlightInstance"},"type":"array"},"source":{"description":"Data source identifier.","type":"string"},"totalAvailable":{"description":"Total number of flights available from the provider.","format":"int32","type":"integer"},"updatedAt":{"description":"Last update time as Unix epoch milliseconds.. Warning: Values \u003e 2^53 may lose precision in JavaScript","format":"int64","type":"integer"}},"type":"object"},"ListAviationNewsRequest":{"description":"ListAviationNewsRequest specifies filters for aviation news retrieval.","properties":{"entities":{"items":{"description":"Entities to filter by (airline names, airport codes, route strings).","maxItems":10,"minItems":1,"type":"string"},"maxItems":10,"minItems":1,"type":"array"},"maxItems":{"description":"Maximum number of news items to return (1-50).","format":"int32","maximum":50,"minimum":1,"type":"integer"},"windowHours":{"description":"Time window in hours to look back (1-168).","format":"int32","maximum":168,"minimum":1,"type":"integer"}},"type":"object"},"ListAviationNewsResponse":{"description":"ListAviationNewsResponse contains filtered aviation news items.","properties":{"items":{"items":{"$ref":"#/components/schemas/AviationNewsItem"},"type":"array"},"source":{"description":"Data source identifier.","type":"string"},"updatedAt":{"description":"Last update time as Unix epoch milliseconds.. Warning: Values \u003e 2^53 may lose precision in JavaScript","format":"int64","type":"integer"}},"type":"object"},"PaginationResponse":{"description":"PaginationResponse contains pagination metadata returned alongside list results.","properties":{"nextCursor":{"description":"Cursor for fetching the next page. Empty string indicates no more pages.","type":"string"},"totalCount":{"description":"Total count of items matching the query, if known. Zero if the total is unknown.","format":"int32","type":"integer"}},"type":"object"},"PositionSample":{"description":"PositionSample represents a single aircraft position observation.","properties":{"altitudeM":{"description":"Barometric altitude in metres.","format":"double","type":"number"},"callsign":{"description":"ATC callsign (e.g., \"THY7CX\").","type":"string"},"groundSpeedKts":{"description":"Ground speed in knots.","format":"double","type":"number"},"icao24":{"description":"ICAO 24-bit transponder address (hex, e.g., \"4b1805\").","type":"string"},"lat":{"description":"Latitude in decimal degrees.","format":"double","type":"number"},"lon":{"description":"Longitude in decimal degrees.","format":"double","type":"number"},"observedAt":{"description":"Observation time as Unix epoch milliseconds.. Warning: Values \u003e 2^53 may lose precision in JavaScript","format":"int64","type":"integer"},"onGround":{"description":"Whether the aircraft is on the ground.","type":"boolean"},"source":{"description":"PositionSource identifies the provider of aircraft position data.","enum":["POSITION_SOURCE_UNSPECIFIED","POSITION_SOURCE_OPENSKY","POSITION_SOURCE_WINGBITS","POSITION_SOURCE_SIMULATED"],"type":"string"},"trackDeg":{"description":"True track over ground in degrees (0 = North, clockwise).","format":"double","type":"number"},"verticalRate":{"description":"Vertical rate in metres per second (positive = climbing).","format":"double","type":"number"}},"type":"object"},"PriceQuote":{"description":"PriceQuote represents a single flight price offer from a provider.","properties":{"bookingUrl":{"description":"Booking URL or deep-link (if available).","type":"string"},"cabin":{"description":"CabinClass represents the travel class for a flight ticket.","enum":["CABIN_CLASS_UNSPECIFIED","CABIN_CLASS_ECONOMY","CABIN_CLASS_PREMIUM_ECONOMY","CABIN_CLASS_BUSINESS","CABIN_CLASS_FIRST"],"type":"string"},"carrier":{"$ref":"#/components/schemas/Carrier"},"checkoutRef":{"description":"Reference used during the checkout process (for follow-up actions).","type":"string"},"currency":{"description":"ISO 4217 currency code (e.g., \"EUR\", \"USD\", \"TRY\").","type":"string"},"departureDate":{"description":"Outbound departure date (ISO 8601).","type":"string"},"destination":{"description":"Destination airport IATA code.","type":"string"},"durationMinutes":{"description":"Total travel duration in minutes.","format":"int32","type":"integer"},"expiresAt":{"description":"Time when this quote expires, as Unix epoch milliseconds.. Warning: Values \u003e 2^53 may lose precision in JavaScript","format":"int64","type":"integer"},"id":{"description":"Unique quote identifier.","type":"string"},"isIndicative":{"description":"Whether the price is indicative rather than bookable.","type":"boolean"},"observedAt":{"description":"Time when this quote was observed, as Unix epoch milliseconds.. Warning: Values \u003e 2^53 may lose precision in JavaScript","format":"int64","type":"integer"},"origin":{"description":"Origin airport IATA code.","type":"string"},"priceAmount":{"description":"Total price amount.","format":"double","type":"number"},"provider":{"description":"Provider name (e.g., \"amadeus\", \"demo\").","type":"string"},"returnDate":{"description":"Return date (ISO 8601), empty for one-way.","type":"string"},"stops":{"description":"Number of stops (0 = nonstop).","format":"int32","type":"integer"}},"type":"object"},"SearchFlightPricesRequest":{"description":"SearchFlightPricesRequest specifies parameters for a flight price search.","properties":{"adults":{"description":"Number of adult passengers (1-9).","format":"int32","maximum":9,"minimum":1,"type":"integer"},"cabin":{"description":"CabinClass represents the travel class for a flight ticket.","enum":["CABIN_CLASS_UNSPECIFIED","CABIN_CLASS_ECONOMY","CABIN_CLASS_PREMIUM_ECONOMY","CABIN_CLASS_BUSINESS","CABIN_CLASS_FIRST"],"type":"string"},"currency":{"description":"ISO 4217 currency code for prices (e.g., \"usd\", \"eur\", \"try\").","type":"string"},"departureDate":{"description":"Outbound departure date (ISO 8601).","type":"string"},"destination":{"description":"Destination airport IATA code.","maxLength":4,"minLength":3,"type":"string"},"market":{"description":"Market/locale code (e.g., \"us\", \"tr\").","type":"string"},"maxResults":{"description":"Maximum number of quotes to return (1-50).","format":"int32","maximum":50,"minimum":1,"type":"integer"},"nonstopOnly":{"description":"Whether to restrict to nonstop flights only.","type":"boolean"},"origin":{"description":"Origin airport IATA code.","maxLength":4,"minLength":3,"type":"string"},"returnDate":{"description":"Return date (ISO 8601), empty for one-way.","type":"string"}},"required":["origin","destination","departureDate"],"type":"object"},"SearchFlightPricesResponse":{"description":"SearchFlightPricesResponse contains flight price offers.","properties":{"isDemoMode":{"description":"Whether results are from demo/simulated mode.","type":"boolean"},"isIndicative":{"description":"Whether returned prices are indicative (subject to change).","type":"boolean"},"provider":{"description":"Provider name (e.g., \"amadeus\", \"demo\").","type":"string"},"quotes":{"items":{"$ref":"#/components/schemas/PriceQuote"},"type":"array"},"updatedAt":{"description":"Last update time as Unix epoch milliseconds.. Warning: Values \u003e 2^53 may lose precision in JavaScript","format":"int64","type":"integer"}},"type":"object"},"SearchGoogleDatesRequest":{"description":"SearchGoogleDatesRequest specifies parameters for a Google Flights date-range price search.","properties":{"airlines":{"items":{"description":"Airline IATA codes to filter by (e.g. [\"BA\", \"AA\"]).","type":"string"},"type":"array"},"cabinClass":{"description":"Cabin class: ECONOMY, PREMIUM_ECONOMY, BUSINESS, or FIRST.","type":"string"},"departureWindow":{"description":"Departure time window in HH-HH format (e.g. \"6-20\").","type":"string"},"destination":{"description":"Arrival airport IATA code (e.g. \"LHR\").","type":"string"},"endDate":{"description":"End of date range in YYYY-MM-DD format.","type":"string"},"isRoundTrip":{"description":"Whether to search for round-trip flights.","type":"boolean"},"maxStops":{"description":"Stop filter: ANY, NON_STOP, ONE_STOP, or TWO_PLUS_STOPS.","type":"string"},"origin":{"description":"Departure airport IATA code (e.g. \"JFK\").","type":"string"},"passengers":{"description":"Number of adult passengers (1-9).","format":"int32","type":"integer"},"sortByPrice":{"description":"Whether to sort results by price (lowest first).","type":"boolean"},"startDate":{"description":"Start of date range in YYYY-MM-DD format.","type":"string"},"tripDuration":{"description":"Trip duration in days (required for round-trip searches).","format":"int32","type":"integer"}},"type":"object"},"SearchGoogleDatesResponse":{"description":"SearchGoogleDatesResponse contains cheapest-date results from Google Flights.","properties":{"dates":{"items":{"$ref":"#/components/schemas/DatePriceEntry"},"type":"array"},"degraded":{"type":"boolean"},"error":{"type":"string"}},"type":"object"},"SearchGoogleFlightsRequest":{"description":"SearchGoogleFlightsRequest specifies parameters for a Google Flights search.","properties":{"airlines":{"items":{"description":"Airline IATA codes to filter by (e.g. [\"BA\", \"AA\"]).","type":"string"},"type":"array"},"cabinClass":{"description":"Cabin class: ECONOMY, PREMIUM_ECONOMY, BUSINESS, or FIRST.","type":"string"},"departureDate":{"description":"Departure date in YYYY-MM-DD format.","type":"string"},"departureWindow":{"description":"Departure time window in HH-HH format (e.g. \"6-20\").","type":"string"},"destination":{"description":"Arrival airport IATA code (e.g. \"LHR\").","type":"string"},"maxStops":{"description":"Stop filter: ANY, NON_STOP, ONE_STOP, or TWO_PLUS_STOPS.","type":"string"},"origin":{"description":"Departure airport IATA code (e.g. \"JFK\").","type":"string"},"passengers":{"description":"Number of adult passengers (1-9).","format":"int32","type":"integer"},"returnDate":{"description":"Return date in YYYY-MM-DD format; omit for one-way.","type":"string"},"sortBy":{"description":"Sort order: CHEAPEST, DURATION, DEPARTURE_TIME, or ARRIVAL_TIME.","type":"string"}},"type":"object"},"SearchGoogleFlightsResponse":{"description":"SearchGoogleFlightsResponse contains flight results from Google Flights.","properties":{"degraded":{"type":"boolean"},"error":{"type":"string"},"flights":{"items":{"$ref":"#/components/schemas/GoogleFlightResult"},"type":"array"}},"type":"object"},"TrackAircraftRequest":{"description":"TrackAircraftRequest specifies an aircraft to track.","properties":{"callsign":{"description":"ATC callsign (e.g., \"THY7CX\").","type":"string"},"icao24":{"description":"ICAO 24-bit transponder address (hex, e.g., \"4b1805\").","type":"string"},"neLat":{"description":"Optional bounding box north-east latitude.","format":"double","type":"number"},"neLon":{"description":"Optional bounding box north-east longitude.","format":"double","type":"number"},"swLat":{"description":"Optional bounding box south-west latitude.","format":"double","type":"number"},"swLon":{"description":"Optional bounding box south-west longitude.","format":"double","type":"number"}},"type":"object"},"TrackAircraftResponse":{"description":"TrackAircraftResponse contains aircraft position observations.","properties":{"positions":{"items":{"$ref":"#/components/schemas/PositionSample"},"type":"array"},"source":{"description":"Data source identifier.","type":"string"},"updatedAt":{"description":"Last update time as Unix epoch milliseconds.. Warning: Values \u003e 2^53 may lose precision in JavaScript","format":"int64","type":"integer"}},"type":"object"},"ValidationError":{"description":"ValidationError is returned when request validation fails. It contains a list of field violations describing what went wrong.","properties":{"violations":{"description":"List of validation violations","items":{"$ref":"#/components/schemas/FieldViolation"},"type":"array"}},"required":["violations"],"type":"object"}}},"info":{"title":"AviationService API","version":"1.0.0"},"openapi":"3.1.0","paths":{"/api/aviation/v1/get-airport-ops-summary":{"get":{"description":"GetAirportOpsSummary returns operational health metrics for watched airports.","operationId":"GetAirportOpsSummary","parameters":[{"description":"IATA airport codes to query (e.g., [\"IST\", \"ESB\", \"LHR\"]).","explode":true,"in":"query","name":"airports","required":false,"schema":{"items":{"type":"string"},"type":"array"},"style":"form"}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetAirportOpsSummaryResponse"}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}},"description":"Validation error"},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error response"}},"summary":"GetAirportOpsSummary","tags":["AviationService"]}},"/api/aviation/v1/get-carrier-ops":{"get":{"description":"GetCarrierOps returns delay and cancellation metrics grouped by carrier.","operationId":"GetCarrierOps","parameters":[{"description":"IATA airport codes to aggregate carrier metrics from.","explode":true,"in":"query","name":"airports","required":false,"schema":{"items":{"type":"string"},"type":"array"},"style":"form"},{"description":"Minimum number of flights required to include a carrier (default: 1).","in":"query","name":"min_flights","required":false,"schema":{"format":"int32","type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetCarrierOpsResponse"}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}},"description":"Validation error"},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error response"}},"summary":"GetCarrierOps","tags":["AviationService"]}},"/api/aviation/v1/get-flight-status":{"get":{"description":"GetFlightStatus looks up the current status of a specific flight.","operationId":"GetFlightStatus","parameters":[{"description":"IATA flight number (e.g., \"TK1952\").","in":"query","name":"flight_number","required":false,"schema":{"type":"string"}},{"description":"Departure date in ISO 8601 format (e.g., \"2026-03-05\").","in":"query","name":"date","required":false,"schema":{"type":"string"}},{"description":"Optional origin airport IATA code to disambiguate.","in":"query","name":"origin","required":false,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetFlightStatusResponse"}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}},"description":"Validation error"},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error response"}},"summary":"GetFlightStatus","tags":["AviationService"]}},"/api/aviation/v1/get-youtube-live-stream-info":{"get":{"description":"GetYoutubeLiveStreamInfo retrieves information about a YouTube live stream (status, title, etc).","operationId":"GetYoutubeLiveStreamInfo","parameters":[{"description":"YouTube channel handle or ID.","in":"query","name":"channel","required":false,"schema":{"type":"string"}},{"description":"Specific video ID to check.","in":"query","name":"video_id","required":false,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetYoutubeLiveStreamInfoResponse"}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}},"description":"Validation error"},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error response"}},"summary":"GetYoutubeLiveStreamInfo","tags":["AviationService"]}},"/api/aviation/v1/list-airport-delays":{"get":{"description":"ListAirportDelays retrieves current airport delay alerts.","operationId":"ListAirportDelays","parameters":[{"description":"Maximum items per page (1-100).","in":"query","name":"page_size","required":false,"schema":{"format":"int32","type":"integer"}},{"description":"Cursor for next page.","in":"query","name":"cursor","required":false,"schema":{"type":"string"}},{"description":"Optional region filter.","in":"query","name":"region","required":false,"schema":{"type":"string"}},{"description":"Optional minimum severity filter.","in":"query","name":"min_severity","required":false,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListAirportDelaysResponse"}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}},"description":"Validation error"},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error response"}},"summary":"ListAirportDelays","tags":["AviationService"]}},"/api/aviation/v1/list-airport-flights":{"get":{"description":"ListAirportFlights retrieves recent flights at a specific airport.","operationId":"ListAirportFlights","parameters":[{"description":"IATA airport code (e.g., \"IST\").","in":"query","name":"airport","required":false,"schema":{"type":"string"}},{"description":"Direction filter.","in":"query","name":"direction","required":false,"schema":{"type":"string"}},{"description":"Maximum number of flights to return (1-100).","in":"query","name":"limit","required":false,"schema":{"format":"int32","type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListAirportFlightsResponse"}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}},"description":"Validation error"},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error response"}},"summary":"ListAirportFlights","tags":["AviationService"]}},"/api/aviation/v1/list-aviation-news":{"get":{"description":"ListAviationNews retrieves filtered aviation news articles.","operationId":"ListAviationNews","parameters":[{"description":"Entities to filter by (airline names, airport codes, route strings).","explode":true,"in":"query","name":"entities","required":false,"schema":{"items":{"type":"string"},"type":"array"},"style":"form"},{"description":"Time window in hours to look back (1-168).","in":"query","name":"window_hours","required":false,"schema":{"format":"int32","type":"integer"}},{"description":"Maximum number of news items to return (1-50).","in":"query","name":"max_items","required":false,"schema":{"format":"int32","type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListAviationNewsResponse"}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}},"description":"Validation error"},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error response"}},"summary":"ListAviationNews","tags":["AviationService"]}},"/api/aviation/v1/search-flight-prices":{"get":{"description":"SearchFlightPrices searches for flight price offers on a route.","operationId":"SearchFlightPrices","parameters":[{"description":"Origin airport IATA code.","in":"query","name":"origin","required":false,"schema":{"type":"string"}},{"description":"Destination airport IATA code.","in":"query","name":"destination","required":false,"schema":{"type":"string"}},{"description":"Outbound departure date (ISO 8601).","in":"query","name":"departure_date","required":false,"schema":{"type":"string"}},{"description":"Return date (ISO 8601), empty for one-way.","in":"query","name":"return_date","required":false,"schema":{"type":"string"}},{"description":"Number of adult passengers (1-9).","in":"query","name":"adults","required":false,"schema":{"format":"int32","type":"integer"}},{"description":"Desired cabin class.","in":"query","name":"cabin","required":false,"schema":{"type":"string"}},{"description":"Whether to restrict to nonstop flights only.","in":"query","name":"nonstop_only","required":false,"schema":{"type":"boolean"}},{"description":"Maximum number of quotes to return (1-50).","in":"query","name":"max_results","required":false,"schema":{"format":"int32","type":"integer"}},{"description":"ISO 4217 currency code for prices (e.g., \"usd\", \"eur\", \"try\").","in":"query","name":"currency","required":false,"schema":{"type":"string"}},{"description":"Market/locale code (e.g., \"us\", \"tr\").","in":"query","name":"market","required":false,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SearchFlightPricesResponse"}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}},"description":"Validation error"},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error response"}},"summary":"SearchFlightPrices","tags":["AviationService"]}},"/api/aviation/v1/search-google-dates":{"get":{"description":"SearchGoogleDates finds the cheapest travel dates across a flexible date range via Google Flights.","operationId":"SearchGoogleDates","parameters":[{"description":"Departure airport IATA code (e.g. \"JFK\").","in":"query","name":"origin","required":false,"schema":{"type":"string"}},{"description":"Arrival airport IATA code (e.g. \"LHR\").","in":"query","name":"destination","required":false,"schema":{"type":"string"}},{"description":"Start of date range in YYYY-MM-DD format.","in":"query","name":"start_date","required":false,"schema":{"type":"string"}},{"description":"End of date range in YYYY-MM-DD format.","in":"query","name":"end_date","required":false,"schema":{"type":"string"}},{"description":"Trip duration in days (required for round-trip searches).","in":"query","name":"trip_duration","required":false,"schema":{"format":"int32","type":"integer"}},{"description":"Whether to search for round-trip flights.","in":"query","name":"is_round_trip","required":false,"schema":{"type":"boolean"}},{"description":"Cabin class: ECONOMY, PREMIUM_ECONOMY, BUSINESS, or FIRST.","in":"query","name":"cabin_class","required":false,"schema":{"type":"string"}},{"description":"Stop filter: ANY, NON_STOP, ONE_STOP, or TWO_PLUS_STOPS.","in":"query","name":"max_stops","required":false,"schema":{"type":"string"}},{"description":"Departure time window in HH-HH format (e.g. \"6-20\").","in":"query","name":"departure_window","required":false,"schema":{"type":"string"}},{"description":"Airline IATA codes to filter by (e.g. [\"BA\", \"AA\"]).","explode":true,"in":"query","name":"airlines","required":false,"schema":{"items":{"type":"string"},"type":"array"},"style":"form"},{"description":"Whether to sort results by price (lowest first).","in":"query","name":"sort_by_price","required":false,"schema":{"type":"boolean"}},{"description":"Number of adult passengers (1-9).","in":"query","name":"passengers","required":false,"schema":{"format":"int32","type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SearchGoogleDatesResponse"}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}},"description":"Validation error"},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error response"}},"summary":"SearchGoogleDates","tags":["AviationService"]}},"/api/aviation/v1/search-google-flights":{"get":{"description":"SearchGoogleFlights searches Google Flights for available itineraries on a specific date.","operationId":"SearchGoogleFlights","parameters":[{"description":"Departure airport IATA code (e.g. \"JFK\").","in":"query","name":"origin","required":false,"schema":{"type":"string"}},{"description":"Arrival airport IATA code (e.g. \"LHR\").","in":"query","name":"destination","required":false,"schema":{"type":"string"}},{"description":"Departure date in YYYY-MM-DD format.","in":"query","name":"departure_date","required":false,"schema":{"type":"string"}},{"description":"Return date in YYYY-MM-DD format; omit for one-way.","in":"query","name":"return_date","required":false,"schema":{"type":"string"}},{"description":"Cabin class: ECONOMY, PREMIUM_ECONOMY, BUSINESS, or FIRST.","in":"query","name":"cabin_class","required":false,"schema":{"type":"string"}},{"description":"Stop filter: ANY, NON_STOP, ONE_STOP, or TWO_PLUS_STOPS.","in":"query","name":"max_stops","required":false,"schema":{"type":"string"}},{"description":"Departure time window in HH-HH format (e.g. \"6-20\").","in":"query","name":"departure_window","required":false,"schema":{"type":"string"}},{"description":"Airline IATA codes to filter by (e.g. [\"BA\", \"AA\"]).","explode":true,"in":"query","name":"airlines","required":false,"schema":{"items":{"type":"string"},"type":"array"},"style":"form"},{"description":"Sort order: CHEAPEST, DURATION, DEPARTURE_TIME, or ARRIVAL_TIME.","in":"query","name":"sort_by","required":false,"schema":{"type":"string"}},{"description":"Number of adult passengers (1-9).","in":"query","name":"passengers","required":false,"schema":{"format":"int32","type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SearchGoogleFlightsResponse"}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}},"description":"Validation error"},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error response"}},"summary":"SearchGoogleFlights","tags":["AviationService"]}},"/api/aviation/v1/track-aircraft":{"get":{"description":"TrackAircraft retrieves live position stream for a specific aircraft hex.","operationId":"TrackAircraft","parameters":[{"description":"ICAO 24-bit transponder address (hex, e.g., \"4b1805\").","in":"query","name":"icao24","required":false,"schema":{"type":"string"}},{"description":"ATC callsign (e.g., \"THY7CX\").","in":"query","name":"callsign","required":false,"schema":{"type":"string"}},{"description":"Optional bounding box south-west latitude.","in":"query","name":"sw_lat","required":false,"schema":{"format":"double","type":"number"}},{"description":"Optional bounding box south-west longitude.","in":"query","name":"sw_lon","required":false,"schema":{"format":"double","type":"number"}},{"description":"Optional bounding box north-east latitude.","in":"query","name":"ne_lat","required":false,"schema":{"format":"double","type":"number"}},{"description":"Optional bounding box north-east longitude.","in":"query","name":"ne_lon","required":false,"schema":{"format":"double","type":"number"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TrackAircraftResponse"}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}},"description":"Validation error"},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error response"}},"summary":"TrackAircraft","tags":["AviationService"]}}}} \ No newline at end of file diff --git a/docs/api/AviationService.openapi.yaml b/docs/api/AviationService.openapi.yaml index f423b13b9..5f46d446b 100644 --- a/docs/api/AviationService.openapi.yaml +++ b/docs/api/AviationService.openapi.yaml @@ -67,8 +67,12 @@ paths: in: query description: IATA airport codes to query (e.g., ["IST", "ESB", "LHR"]). required: false + style: form + explode: true schema: - type: string + type: array + items: + type: string responses: "200": description: Successful response @@ -146,8 +150,12 @@ paths: in: query description: IATA airport codes to aggregate carrier metrics from. required: false + style: form + explode: true schema: - type: string + type: array + items: + type: string - name: min_flights in: query description: 'Minimum number of flights required to include a carrier (default: 1).' @@ -426,8 +434,12 @@ paths: in: query description: Entities to filter by (airline names, airport codes, route strings). required: false + style: form + explode: true schema: - type: string + type: array + items: + type: string - name: window_hours in: query description: Time window in hours to look back (1-168). @@ -515,8 +527,12 @@ paths: in: query description: Airline IATA codes to filter by (e.g. ["BA", "AA"]). required: false + style: form + explode: true schema: - type: string + type: array + items: + type: string - name: sort_by in: query description: 'Sort order: CHEAPEST, DURATION, DEPARTURE_TIME, or ARRIVAL_TIME.' @@ -616,8 +632,12 @@ paths: in: query description: Airline IATA codes to filter by (e.g. ["BA", "AA"]). required: false + style: form + explode: true schema: - type: string + type: array + items: + type: string - name: sort_by_price in: query description: Whether to sort results by price (lowest first). diff --git a/docs/api/EconomicService.openapi.json b/docs/api/EconomicService.openapi.json index b4da915ae..dcb018fb8 100644 --- a/docs/api/EconomicService.openapi.json +++ b/docs/api/EconomicService.openapi.json @@ -1 +1 @@ -{"components":{"schemas":{"BigMacCountryPrice":{"properties":{"available":{"type":"boolean"},"code":{"type":"string"},"currency":{"type":"string"},"flag":{"type":"string"},"fxRate":{"format":"double","type":"number"},"localPrice":{"format":"double","type":"number"},"name":{"type":"string"},"sourceSite":{"type":"string"},"usdPrice":{"format":"double","type":"number"},"wowPct":{"format":"double","type":"number"}},"type":"object"},"BisCreditToGdp":{"description":"BisCreditToGdp represents total credit as percentage of GDP from BIS.","properties":{"countryCode":{"description":"ISO 2-letter country code.","type":"string"},"countryName":{"description":"Country or region name.","type":"string"},"creditGdpRatio":{"description":"Total credit as percentage of GDP.","format":"double","type":"number"},"date":{"description":"Date as YYYY-QN.","type":"string"},"previousRatio":{"description":"Previous quarter ratio.","format":"double","type":"number"}},"type":"object"},"BisExchangeRate":{"description":"BisExchangeRate represents effective exchange rate indices from BIS.","properties":{"countryCode":{"description":"ISO 2-letter country code.","type":"string"},"countryName":{"description":"Country or region name.","type":"string"},"date":{"description":"Date as YYYY-MM.","type":"string"},"nominalEer":{"description":"Nominal effective exchange rate index.","format":"double","type":"number"},"realChange":{"description":"Percentage change from previous period (real).","format":"double","type":"number"},"realEer":{"description":"Real effective exchange rate index.","format":"double","type":"number"}},"type":"object"},"BisPolicyRate":{"description":"BisPolicyRate represents a central bank policy rate from BIS.","properties":{"centralBank":{"description":"Central bank name (e.g. \"Federal Reserve\").","type":"string"},"countryCode":{"description":"ISO 2-letter country code (US, GB, JP, etc.)","type":"string"},"countryName":{"description":"Country or region name.","type":"string"},"date":{"description":"Date as YYYY-MM.","type":"string"},"previousRate":{"description":"Previous period rate percentage.","format":"double","type":"number"},"rate":{"description":"Current policy rate percentage.","format":"double","type":"number"}},"type":"object"},"BlsObservation":{"description":"BlsObservation is a single BLS data point.","properties":{"period":{"description":"Period code (e.g. \"M01\" for January, \"A01\" for annual).","type":"string"},"periodName":{"description":"Human-readable period name.","type":"string"},"value":{"description":"Observed value.","type":"string"},"year":{"description":"Year of the observation.","type":"string"}},"type":"object"},"BlsSeries":{"description":"BlsSeries is a BLS time series with metadata and observations.","properties":{"observations":{"items":{"$ref":"#/components/schemas/BlsObservation"},"type":"array"},"seriesId":{"description":"BLS series ID (e.g. \"CES0500000001\").","type":"string"},"title":{"description":"Human-readable series title.","type":"string"},"units":{"description":"Unit of measure.","type":"string"}},"type":"object"},"CountriesEntry":{"properties":{"key":{"type":"string"},"value":{"$ref":"#/components/schemas/EurostatCountryEntry"}},"type":"object"},"CountryBasket":{"properties":{"code":{"type":"string"},"currency":{"type":"string"},"flag":{"type":"string"},"fxRate":{"format":"double","type":"number"},"items":{"items":{"$ref":"#/components/schemas/GroceryItemPrice"},"type":"array"},"name":{"type":"string"},"totalUsd":{"format":"double","type":"number"},"wowPct":{"format":"double","type":"number"}},"type":"object"},"CrudeInventoryWeek":{"description":"CrudeInventoryWeek represents one week of US crude oil stockpile data from EIA WCRSTUS1.","properties":{"period":{"description":"ISO week period (YYYY-MM-DD, Monday of the EIA report week).","type":"string"},"stocksMb":{"description":"Total crude oil stocks in millions of barrels.","format":"double","type":"number"},"weeklyChangeMb":{"description":"Week-over-week change in millions of barrels. Positive = build (bearish), negative = draw (bullish).\n Absent for the oldest week when no prior week is available for comparison.","format":"double","type":"number"}},"type":"object"},"CrudeInventoryWeekRef":{"properties":{"period":{"type":"string"},"stocksMb":{"format":"double","type":"number"},"weeklyChangeMb":{"format":"double","type":"number"}},"type":"object"},"EcbFxRate":{"description":"EcbFxRate is a single ECB official reference rate for a currency pair.","properties":{"change1d":{"description":"1-day change in rate (absolute).","format":"double","type":"number"},"date":{"description":"Date of the observation in YYYY-MM-DD format.","type":"string"},"pair":{"description":"Currency pair label, e.g. \"EURUSD\".","type":"string"},"rate":{"description":"Exchange rate (units of quote currency per 1 EUR).","format":"double","type":"number"}},"type":"object"},"EconomicEvent":{"properties":{"actual":{"type":"string"},"country":{"type":"string"},"date":{"type":"string"},"estimate":{"type":"string"},"event":{"type":"string"},"impact":{"type":"string"},"previous":{"type":"string"},"unit":{"type":"string"}},"type":"object"},"EconomicStressComponent":{"properties":{"id":{"type":"string"},"label":{"type":"string"},"missing":{"type":"boolean"},"rawValue":{"format":"double","type":"number"},"score":{"format":"double","type":"number"},"weight":{"format":"double","type":"number"}},"type":"object"},"EnergyCapacitySeries":{"properties":{"data":{"items":{"$ref":"#/components/schemas/EnergyCapacityYear"},"type":"array"},"energySource":{"type":"string"},"name":{"type":"string"}},"type":"object"},"EnergyCapacityYear":{"properties":{"capacityMw":{"format":"double","type":"number"},"year":{"format":"int32","type":"integer"}},"type":"object"},"EnergyCrisisPolicy":{"description":"EnergyCrisisPolicy represents a single government policy response to the 2026 energy crisis.","properties":{"category":{"description":"Policy category: \"conservation\" or \"consumer_support\".","type":"string"},"country":{"description":"Country name.","type":"string"},"countryCode":{"description":"ISO 3166-1 alpha-2 country code.","type":"string"},"dateAnnounced":{"description":"Date announced in ISO-8601 (YYYY-MM-DD) format.","type":"string"},"measure":{"description":"Description of the policy measure.","type":"string"},"sector":{"description":"Affected sector: transport, buildings, industry, electricity, agriculture, general.","type":"string"},"status":{"description":"Status of the policy: active, planned, or ended.","type":"string"}},"type":"object"},"EnergyPrice":{"description":"EnergyPrice represents a current energy commodity price from EIA.","properties":{"change":{"description":"Percentage change from previous period.","format":"double","type":"number"},"commodity":{"description":"Energy commodity identifier.","minLength":1,"type":"string"},"name":{"description":"Human-readable name (e.g., \"WTI Crude Oil\", \"Henry Hub Natural Gas\").","type":"string"},"price":{"description":"Current price in USD.","format":"double","type":"number"},"priceAt":{"description":"Price date, as Unix epoch milliseconds.. Warning: Values \u003e 2^53 may lose precision in JavaScript","format":"int64","type":"integer"},"unit":{"description":"Unit of measurement (e.g., \"$/barrel\", \"$/MMBtu\").","type":"string"}},"required":["commodity"],"type":"object"},"Error":{"description":"Error is returned when a handler encounters an error. It contains a simple error message that the developer can customize.","properties":{"message":{"description":"Error message (e.g., 'user not found', 'database connection failed')","type":"string"}},"type":"object"},"EuFsiObservation":{"properties":{"date":{"type":"string"},"value":{"format":"double","type":"number"}},"type":"object"},"EuGasStorageHistoryEntry":{"description":"EuGasStorageHistoryEntry represents one day of EU aggregate gas storage data.","properties":{"date":{"description":"Calendar date (YYYY-MM-DD).","type":"string"},"fillPct":{"description":"Storage fill level as a percentage of working gas volume capacity.","format":"double","type":"number"},"gasTwh":{"description":"Working gas volume in storage (TWh).","format":"double","type":"number"}},"type":"object"},"EuYieldCurveData":{"description":"EuYieldCurveData holds a single observation of the ECB Euro Area AAA yield curve.","properties":{"date":{"description":"Date of the observation (YYYY-MM or YYYY-MM-DD).","type":"string"},"rates":{"additionalProperties":{"format":"double","type":"number"},"description":"Spot rates by tenor. Keys: \"1Y\", \"2Y\", \"5Y\", \"10Y\", \"20Y\", \"30Y\".","type":"object"},"source":{"description":"Data source identifier (e.g. \"ecb-aaa\").","type":"string"},"updatedAt":{"description":"ISO 8601 timestamp when this was last seeded.","type":"string"}},"type":"object"},"EurostatCountryEntry":{"description":"EurostatCountryEntry holds all available metrics for one EU country.","properties":{"cpi":{"$ref":"#/components/schemas/EurostatMetric"},"gdpGrowth":{"$ref":"#/components/schemas/EurostatMetric"},"unemployment":{"$ref":"#/components/schemas/EurostatMetric"}},"type":"object"},"EurostatMetric":{"description":"EurostatMetric holds a single economic metric value for a country.","properties":{"date":{"description":"Period string (e.g. \"2024-01\" for monthly, \"2024-Q1\" for quarterly).","type":"string"},"hasPrior":{"description":"True when prior_value is present (proto3 can't distinguish 0 from absent).","type":"boolean"},"priorValue":{"description":"Prior period value for delta calculation (e.g. previous month/quarter).","format":"double","type":"number"},"unit":{"description":"Unit of measurement (e.g. \"%\").","type":"string"},"value":{"description":"Numeric value (e.g. 2.3 for 2.3%).","format":"double","type":"number"}},"type":"object"},"FaoFoodPricePoint":{"properties":{"cereals":{"format":"double","type":"number"},"dairy":{"format":"double","type":"number"},"date":{"type":"string"},"ffpi":{"format":"double","type":"number"},"meat":{"format":"double","type":"number"},"oils":{"format":"double","type":"number"},"sugar":{"format":"double","type":"number"}},"type":"object"},"FearGreedHistoryEntry":{"description":"FearGreedHistoryEntry is a single day's Fear \u0026 Greed index reading.","properties":{"date":{"description":"Date string (YYYY-MM-DD).","type":"string"},"value":{"description":"Index value (0-100).","format":"int32","maximum":100,"minimum":0,"type":"integer"}},"type":"object"},"FearGreedSignal":{"description":"FearGreedSignal tracks the Crypto Fear \u0026 Greed index.","properties":{"history":{"items":{"$ref":"#/components/schemas/FearGreedHistoryEntry"},"type":"array"},"status":{"description":"Classification label (e.g., \"Extreme Fear\", \"Greed\").","type":"string"},"value":{"description":"Current index value (0-100).","format":"int32","type":"integer"}},"type":"object"},"FieldViolation":{"description":"FieldViolation describes a single validation error for a specific field.","properties":{"description":{"description":"Human-readable description of the validation violation (e.g., 'must be a valid email address', 'required field missing')","type":"string"},"field":{"description":"The field path that failed validation (e.g., 'user.email' for nested fields). For header validation, this will be the header name (e.g., 'X-API-Key')","type":"string"}},"required":["field","description"],"type":"object"},"FlowStructureSignal":{"description":"FlowStructureSignal compares BTC vs QQQ 5-day returns.","properties":{"btcReturn5":{"description":"BTC 5-day return percentage.","format":"double","type":"number"},"qqqReturn5":{"description":"QQQ 5-day return percentage.","format":"double","type":"number"},"status":{"description":"\"PASSIVE GAP\", \"ALIGNED\", or \"UNKNOWN\".","type":"string"}},"type":"object"},"FredObservation":{"description":"FredObservation represents a single data point from a FRED economic series.","properties":{"date":{"description":"Observation date as YYYY-MM-DD string.","type":"string"},"value":{"description":"Observation value.","format":"double","type":"number"}},"type":"object"},"FredSeries":{"description":"FredSeries represents a FRED time series with metadata.","properties":{"frequency":{"description":"Data frequency (e.g., \"Monthly\", \"Quarterly\").","type":"string"},"observations":{"items":{"$ref":"#/components/schemas/FredObservation"},"type":"array"},"seriesId":{"description":"Series identifier (e.g., \"GDP\", \"UNRATE\", \"CPIAUCSL\").","minLength":1,"type":"string"},"title":{"description":"Series title.","type":"string"},"units":{"description":"Unit of measurement.","type":"string"}},"required":["seriesId"],"type":"object"},"FuelCountryPrice":{"properties":{"code":{"type":"string"},"currency":{"type":"string"},"diesel":{"$ref":"#/components/schemas/FuelPrice"},"flag":{"type":"string"},"fxRate":{"format":"double","type":"number"},"gasoline":{"$ref":"#/components/schemas/FuelPrice"},"name":{"type":"string"}},"type":"object"},"FuelPrice":{"properties":{"available":{"type":"boolean"},"grade":{"type":"string"},"localPrice":{"format":"double","type":"number"},"observedAt":{"type":"string"},"source":{"type":"string"},"usdPrice":{"format":"double","type":"number"},"wowPct":{"format":"double","type":"number"}},"type":"object"},"GetBisCreditRequest":{"description":"GetBisCreditRequest requests credit-to-GDP ratio data.","type":"object"},"GetBisCreditResponse":{"description":"GetBisCreditResponse contains BIS credit-to-GDP data.","properties":{"entries":{"items":{"$ref":"#/components/schemas/BisCreditToGdp"},"type":"array"}},"type":"object"},"GetBisExchangeRatesRequest":{"description":"GetBisExchangeRatesRequest requests effective exchange rates.","type":"object"},"GetBisExchangeRatesResponse":{"description":"GetBisExchangeRatesResponse contains BIS effective exchange rate data.","properties":{"rates":{"items":{"$ref":"#/components/schemas/BisExchangeRate"},"type":"array"}},"type":"object"},"GetBisPolicyRatesRequest":{"description":"GetBisPolicyRatesRequest requests central bank policy rates.","type":"object"},"GetBisPolicyRatesResponse":{"description":"GetBisPolicyRatesResponse contains BIS policy rate data.","properties":{"rates":{"items":{"$ref":"#/components/schemas/BisPolicyRate"},"type":"array"}},"type":"object"},"GetBlsSeriesRequest":{"description":"GetBlsSeriesRequest specifies which BLS series to retrieve.","properties":{"limit":{"description":"Maximum number of observations to return. Defaults to 60.","format":"int32","type":"integer"},"seriesId":{"description":"BLS series ID (e.g. \"CES0500000001\", \"CIU1010000000000A\").","type":"string"}},"type":"object"},"GetBlsSeriesResponse":{"description":"GetBlsSeriesResponse contains the requested BLS series data.","properties":{"series":{"$ref":"#/components/schemas/BlsSeries"}},"type":"object"},"GetCrudeInventoriesRequest":{"description":"GetCrudeInventoriesRequest is the request message for GetCrudeInventories.","type":"object"},"GetCrudeInventoriesResponse":{"description":"GetCrudeInventoriesResponse contains the 8 most recent weeks of US crude oil inventory data.","properties":{"latestPeriod":{"description":"Timestamp of the most recent EIA data point (ISO 8601).","type":"string"},"weeks":{"items":{"$ref":"#/components/schemas/CrudeInventoryWeek"},"type":"array"}},"type":"object"},"GetEcbFxRatesRequest":{"description":"GetEcbFxRatesRequest is empty; returns all tracked EUR pairs.","type":"object"},"GetEcbFxRatesResponse":{"description":"GetEcbFxRatesResponse contains the latest ECB reference rates.","properties":{"rates":{"items":{"$ref":"#/components/schemas/EcbFxRate"},"type":"array"},"seededAt":{"description":"Unix ms when the data was last seeded.","format":"int64","type":"string"},"unavailable":{"description":"True when Redis key is missing or data is unavailable.","type":"boolean"},"updatedAt":{"description":"ISO 8601 timestamp of the ECB publication.","type":"string"}},"type":"object"},"GetEconomicCalendarRequest":{"properties":{"fromDate":{"type":"string"},"toDate":{"type":"string"}},"type":"object"},"GetEconomicCalendarResponse":{"properties":{"events":{"items":{"$ref":"#/components/schemas/EconomicEvent"},"type":"array"},"fromDate":{"type":"string"},"toDate":{"type":"string"},"total":{"format":"int32","type":"integer"},"unavailable":{"type":"boolean"}},"type":"object"},"GetEconomicStressRequest":{"type":"object"},"GetEconomicStressResponse":{"properties":{"components":{"items":{"$ref":"#/components/schemas/EconomicStressComponent"},"type":"array"},"compositeScore":{"format":"double","type":"number"},"label":{"type":"string"},"seededAt":{"type":"string"},"unavailable":{"type":"boolean"}},"type":"object"},"GetEnergyCapacityRequest":{"properties":{"energySources":{"items":{"description":"Energy source codes to query (e.g., \"SUN\", \"WND\", \"COL\").\n Empty returns all tracked sources (SUN, WND, COL).","type":"string"},"type":"array"},"years":{"description":"Number of years of historical data. Default 20 if not set.","format":"int32","type":"integer"}},"type":"object"},"GetEnergyCapacityResponse":{"properties":{"series":{"items":{"$ref":"#/components/schemas/EnergyCapacitySeries"},"type":"array"}},"type":"object"},"GetEnergyCrisisPoliciesRequest":{"description":"GetEnergyCrisisPoliciesRequest allows optional filtering by country or category.","properties":{"category":{"description":"Optional category filter: \"conservation\" or \"consumer_support\".","type":"string"},"countryCode":{"description":"Optional ISO-2 country code filter.","type":"string"}},"type":"object"},"GetEnergyCrisisPoliciesResponse":{"description":"GetEnergyCrisisPoliciesResponse contains energy crisis policy data from the IEA tracker.","properties":{"context":{"description":"Context description.","type":"string"},"policies":{"items":{"$ref":"#/components/schemas/EnergyCrisisPolicy"},"type":"array"},"source":{"description":"Source attribution.","type":"string"},"sourceUrl":{"description":"Source URL.","type":"string"},"unavailable":{"description":"True when upstream seed data is unavailable (fallback result).","type":"boolean"},"updatedAt":{"description":"UTC ISO-8601 timestamp when this data was last updated.","type":"string"}},"type":"object"},"GetEnergyPricesRequest":{"description":"GetEnergyPricesRequest specifies which energy commodities to retrieve.","properties":{"commodities":{"items":{"description":"Optional commodity filter. Empty returns all tracked commodities.","type":"string"},"type":"array"}},"type":"object"},"GetEnergyPricesResponse":{"description":"GetEnergyPricesResponse contains energy price data.","properties":{"prices":{"items":{"$ref":"#/components/schemas/EnergyPrice"},"type":"array"}},"type":"object"},"GetEuFsiRequest":{"type":"object"},"GetEuFsiResponse":{"properties":{"history":{"items":{"$ref":"#/components/schemas/EuFsiObservation"},"type":"array"},"label":{"type":"string"},"latestDate":{"type":"string"},"latestValue":{"format":"double","type":"number"},"seededAt":{"type":"string"},"unavailable":{"type":"boolean"}},"type":"object"},"GetEuGasStorageRequest":{"description":"GetEuGasStorageRequest is empty — returns latest EU aggregate snapshot.","type":"object"},"GetEuGasStorageResponse":{"description":"GetEuGasStorageResponse contains the EU aggregate gas storage snapshot.","properties":{"fillPct":{"description":"Current storage fill level as a percentage of working gas volume (0–100).","format":"double","type":"number"},"fillPctChange1d":{"description":"1-day change in fill percentage (positive = injecting, negative = withdrawing).","format":"double","type":"number"},"gasDaysConsumption":{"description":"Approximate days of consumption remaining at average EU winter drawdown rate.","format":"double","type":"number"},"history":{"items":{"$ref":"#/components/schemas/EuGasStorageHistoryEntry"},"type":"array"},"seededAt":{"description":"UTC ms timestamp when seed data was written.","format":"int64","type":"string"},"trend":{"description":"Current storage trend: \"injecting\", \"withdrawing\", or \"stable\".","type":"string"},"unavailable":{"description":"True when upstream data is unavailable (fallback result).","type":"boolean"},"updatedAt":{"description":"Calendar date of the most recent data point (YYYY-MM-DD).","type":"string"}},"type":"object"},"GetEuYieldCurveRequest":{"description":"GetEuYieldCurveRequest fetches the ECB Euro Area AAA sovereign yield curve.","type":"object"},"GetEuYieldCurveResponse":{"description":"GetEuYieldCurveResponse contains the latest ECB Euro Area AAA sovereign yield curve.","properties":{"data":{"$ref":"#/components/schemas/EuYieldCurveData"},"unavailable":{"description":"True if data is not yet available in cache.","type":"boolean"}},"type":"object"},"GetEurostatCountryDataRequest":{"description":"GetEurostatCountryDataRequest requests Eurostat per-country economic data.","type":"object"},"GetEurostatCountryDataResponse":{"description":"GetEurostatCountryDataResponse contains per-country CPI, unemployment, and GDP growth.","properties":{"countries":{"additionalProperties":{"$ref":"#/components/schemas/EurostatCountryEntry"},"description":"Map of ISO2 country code to economic metrics (e.g. \"DE\", \"FR\", \"IT\").","type":"object"},"seededAt":{"description":"UTC ms timestamp when seed data was written.","format":"int64","type":"string"},"unavailable":{"description":"True when upstream data is unavailable (fallback result).","type":"boolean"}},"type":"object"},"GetFaoFoodPriceIndexRequest":{"type":"object"},"GetFaoFoodPriceIndexResponse":{"properties":{"currentFfpi":{"format":"double","type":"number"},"fetchedAt":{"type":"string"},"momPct":{"format":"double","type":"number"},"points":{"items":{"$ref":"#/components/schemas/FaoFoodPricePoint"},"type":"array"},"yoyPct":{"format":"double","type":"number"}},"type":"object"},"GetFredSeriesBatchRequest":{"description":"GetFredSeriesBatchRequest looks up multiple FRED series in a single call.","properties":{"limit":{"description":"Maximum number of observations per series. Defaults to 120.","format":"int32","type":"integer"},"seriesIds":{"items":{"description":"FRED series IDs (e.g., \"WALCL\", \"FEDFUNDS\"). Max 10.","maxItems":10,"minItems":1,"type":"string"},"maxItems":10,"minItems":1,"type":"array"}},"type":"object"},"GetFredSeriesBatchResponse":{"description":"GetFredSeriesBatchResponse contains the requested FRED series data.","properties":{"fetched":{"description":"Number of series successfully fetched.","format":"int32","type":"integer"},"requested":{"description":"Number of series requested.","format":"int32","type":"integer"},"results":{"additionalProperties":{"$ref":"#/components/schemas/FredSeries"},"description":"Map of series_id -\u003e FRED series for found series.","type":"object"}},"type":"object"},"GetFredSeriesRequest":{"description":"GetFredSeriesRequest specifies which FRED series to retrieve.","properties":{"limit":{"description":"Maximum number of observations to return. Defaults to 120.","format":"int32","type":"integer"},"seriesId":{"description":"FRED series ID (e.g., \"GDP\", \"UNRATE\", \"CPIAUCSL\").","minLength":1,"type":"string"}},"required":["seriesId"],"type":"object"},"GetFredSeriesResponse":{"description":"GetFredSeriesResponse contains the requested FRED series data.","properties":{"series":{"$ref":"#/components/schemas/FredSeries"}},"type":"object"},"GetMacroSignalsRequest":{"description":"GetMacroSignalsRequest requests the current macro signal dashboard.","type":"object"},"GetMacroSignalsResponse":{"description":"GetMacroSignalsResponse contains the full macro signal dashboard with 7 signals and verdict.","properties":{"bullishCount":{"description":"Number of bullish signals.","format":"int32","type":"integer"},"meta":{"$ref":"#/components/schemas/MacroMeta"},"signals":{"$ref":"#/components/schemas/MacroSignals"},"timestamp":{"description":"ISO 8601 timestamp of computation.","type":"string"},"totalCount":{"description":"Total number of evaluated signals (excluding UNKNOWN).","format":"int32","type":"integer"},"unavailable":{"description":"True when upstream data is unavailable (fallback result).","type":"boolean"},"verdict":{"description":"Overall verdict: \"BUY\", \"CASH\", or \"UNKNOWN\".","type":"string"}},"type":"object"},"GetNatGasStorageRequest":{"description":"GetNatGasStorageRequest is the request message for GetNatGasStorage.","type":"object"},"GetNatGasStorageResponse":{"description":"GetNatGasStorageResponse contains the 8 most recent weeks of US natural gas storage data.","properties":{"latestPeriod":{"description":"Timestamp of the most recent EIA data point (ISO 8601).","type":"string"},"weeks":{"items":{"$ref":"#/components/schemas/NatGasStorageWeek"},"type":"array"}},"type":"object"},"GetNationalDebtRequest":{"description":"GetNationalDebtRequest requests national debt data for all countries.","type":"object"},"GetNationalDebtResponse":{"description":"GetNationalDebtResponse wraps the full list of national debt entries.","properties":{"entries":{"items":{"$ref":"#/components/schemas/NationalDebtEntry"},"type":"array"},"seededAt":{"description":"ISO 8601 timestamp when seed data was written.","type":"string"},"unavailable":{"description":"True when upstream data is unavailable (fallback result).","type":"boolean"}},"type":"object"},"GetOilInventoriesRequest":{"type":"object"},"GetOilInventoriesResponse":{"properties":{"crudeWeeks":{"items":{"$ref":"#/components/schemas/CrudeInventoryWeekRef"},"type":"array"},"euGas":{"$ref":"#/components/schemas/OilInventoriesEuGas"},"ieaStocks":{"$ref":"#/components/schemas/OilInventoriesIeaStocks"},"natGasWeeks":{"items":{"$ref":"#/components/schemas/NatGasWeekRef"},"type":"array"},"refinery":{"$ref":"#/components/schemas/OilInventoriesRefinery"},"spr":{"$ref":"#/components/schemas/OilInventoriesSprSnapshot"},"updatedAt":{"type":"string"}},"type":"object"},"GetOilStocksAnalysisRequest":{"description":"GetOilStocksAnalysisRequest is empty — returns the latest global analysis snapshot.","type":"object"},"GetOilStocksAnalysisResponse":{"description":"GetOilStocksAnalysisResponse contains the IEA oil stocks days-of-cover analysis.","properties":{"belowObligation":{"items":{"description":"ISO2 codes of countries currently below the 90-day obligation.","type":"string"},"type":"array"},"dataMonth":{"description":"Data month in YYYY-MM format (source: IEA monthly release).","type":"string"},"ieaMembers":{"items":{"$ref":"#/components/schemas/OilStocksAnalysisMember"},"type":"array"},"regionalSummary":{"$ref":"#/components/schemas/OilStocksRegionalSummary"},"unavailable":{"description":"True when upstream seed data is unavailable (fallback result).","type":"boolean"},"updatedAt":{"description":"UTC ISO-8601 timestamp when this analysis was written.","type":"string"}},"type":"object"},"GroceryItemPrice":{"properties":{"available":{"type":"boolean"},"currency":{"type":"string"},"itemId":{"type":"string"},"itemName":{"type":"string"},"localPrice":{"format":"double","type":"number"},"sourceSite":{"type":"string"},"unit":{"type":"string"},"usdPrice":{"format":"double","type":"number"}},"type":"object"},"HashRateSignal":{"description":"HashRateSignal tracks Bitcoin hash rate momentum.","properties":{"change30d":{"description":"Hash rate change over 30 days as percentage.","format":"double","type":"number"},"status":{"description":"\"GROWING\", \"DECLINING\", \"STABLE\", or \"UNKNOWN\".","type":"string"}},"type":"object"},"LiquiditySignal":{"description":"LiquiditySignal tracks JPY 30d rate of change as a liquidity proxy.","properties":{"sparkline":{"items":{"description":"Last 30 JPY close prices.","format":"double","type":"number"},"type":"array"},"status":{"description":"\"SQUEEZE\", \"NORMAL\", or \"UNKNOWN\".","type":"string"},"value":{"description":"JPY 30d ROC percentage, absent if unavailable.","format":"double","type":"number"}},"type":"object"},"ListBigMacPricesRequest":{"type":"object"},"ListBigMacPricesResponse":{"properties":{"cheapestCountry":{"type":"string"},"countries":{"items":{"$ref":"#/components/schemas/BigMacCountryPrice"},"type":"array"},"fetchedAt":{"type":"string"},"mostExpensiveCountry":{"type":"string"},"prevFetchedAt":{"type":"string"},"wowAvailable":{"type":"boolean"},"wowAvgPct":{"format":"double","type":"number"}},"type":"object"},"ListFuelPricesRequest":{"type":"object"},"ListFuelPricesResponse":{"properties":{"cheapestDiesel":{"type":"string"},"cheapestGasoline":{"type":"string"},"countries":{"items":{"$ref":"#/components/schemas/FuelCountryPrice"},"type":"array"},"countryCount":{"format":"int32","type":"integer"},"fetchedAt":{"type":"string"},"mostExpensiveDiesel":{"type":"string"},"mostExpensiveGasoline":{"type":"string"},"prevFetchedAt":{"type":"string"},"sourceCount":{"format":"int32","type":"integer"},"wowAvailable":{"type":"boolean"}},"type":"object"},"ListGroceryBasketPricesRequest":{"type":"object"},"ListGroceryBasketPricesResponse":{"properties":{"cheapestCountry":{"type":"string"},"countries":{"items":{"$ref":"#/components/schemas/CountryBasket"},"type":"array"},"fetchedAt":{"type":"string"},"mostExpensiveCountry":{"type":"string"},"prevFetchedAt":{"type":"string"},"upstreamUnavailable":{"type":"boolean"},"wowAvailable":{"type":"boolean"},"wowAvgPct":{"format":"double","type":"number"}},"type":"object"},"ListWorldBankIndicatorsRequest":{"description":"ListWorldBankIndicatorsRequest specifies filters for retrieving World Bank data.","properties":{"countryCode":{"description":"Optional country filter (ISO 3166-1 alpha-2).","type":"string"},"cursor":{"description":"Cursor for next page.","type":"string"},"indicatorCode":{"description":"World Bank indicator code (e.g., \"NY.GDP.MKTP.CD\").","minLength":1,"type":"string"},"pageSize":{"description":"Maximum items per page.","format":"int32","type":"integer"},"year":{"description":"Optional year filter. Defaults to latest available.","format":"int32","type":"integer"}},"required":["indicatorCode"],"type":"object"},"ListWorldBankIndicatorsResponse":{"description":"ListWorldBankIndicatorsResponse contains World Bank indicator data.","properties":{"data":{"items":{"$ref":"#/components/schemas/WorldBankCountryData"},"type":"array"},"pagination":{"$ref":"#/components/schemas/PaginationResponse"}},"type":"object"},"MacroMeta":{"description":"MacroMeta contains supplementary chart data.","properties":{"qqqSparkline":{"items":{"description":"Last 30 QQQ close prices for sparkline.","format":"double","type":"number"},"type":"array"}},"type":"object"},"MacroRegimeSignal":{"description":"MacroRegimeSignal compares QQQ vs XLP 20-day rate of change.","properties":{"qqqRoc20":{"description":"QQQ 20d ROC percentage.","format":"double","type":"number"},"status":{"description":"\"RISK-ON\", \"DEFENSIVE\", or \"UNKNOWN\".","type":"string"},"xlpRoc20":{"description":"XLP 20d ROC percentage.","format":"double","type":"number"}},"type":"object"},"MacroSignals":{"description":"MacroSignals contains all 7 individual signal computations.","properties":{"fearGreed":{"$ref":"#/components/schemas/FearGreedSignal"},"flowStructure":{"$ref":"#/components/schemas/FlowStructureSignal"},"hashRate":{"$ref":"#/components/schemas/HashRateSignal"},"liquidity":{"$ref":"#/components/schemas/LiquiditySignal"},"macroRegime":{"$ref":"#/components/schemas/MacroRegimeSignal"},"priceMomentum":{"$ref":"#/components/schemas/PriceMomentumSignal"},"technicalTrend":{"$ref":"#/components/schemas/TechnicalTrendSignal"}},"type":"object"},"NatGasStorageWeek":{"description":"NatGasStorageWeek represents one week of US natural gas working gas storage data from EIA.","properties":{"period":{"description":"ISO week period (YYYY-MM-DD, Monday of the EIA report week).","type":"string"},"storBcf":{"description":"Working gas in underground storage, Lower-48 States, in Bcf.","format":"double","type":"number"},"weeklyChangeBcf":{"description":"Week-over-week change in Bcf. Positive = build (bearish for gas prices), negative = draw (bullish).\n Absent for the oldest week when no prior week is available for comparison.","format":"double","type":"number"}},"type":"object"},"NatGasWeekRef":{"properties":{"period":{"type":"string"},"storBcf":{"format":"double","type":"number"},"weeklyChangeBcf":{"format":"double","type":"number"}},"type":"object"},"NationalDebtEntry":{"description":"NationalDebtEntry holds debt data for a single country.","properties":{"annualGrowth":{"description":"Year-over-year debt growth percent (2023-\u003e2024).","format":"double","type":"number"},"baselineTs":{"description":"UTC ms timestamp anchoring the debt_usd figure (2024-01-01T00:00:00Z).","format":"int64","type":"string"},"debtToGdp":{"description":"Debt as % of GDP.","format":"double","type":"number"},"debtUsd":{"description":"Total debt in USD at baseline_ts.","format":"double","type":"number"},"gdpUsd":{"description":"GDP in USD (nominal, latest year).","format":"double","type":"number"},"iso3":{"description":"ISO3 country code (e.g. \"USA\").","type":"string"},"perDayRate":{"description":"Deficit-derived accrual in USD per day.","format":"double","type":"number"},"perSecondRate":{"description":"Deficit-derived accrual in USD per second.","format":"double","type":"number"},"source":{"description":"Human-readable source string.","type":"string"}},"type":"object"},"OilInventoriesEuGas":{"properties":{"fillPct":{"format":"double","type":"number"},"fillPctChange1d":{"format":"double","type":"number"},"history":{"items":{"$ref":"#/components/schemas/OilInventoriesEuGasDay"},"type":"array"},"trend":{"type":"string"}},"type":"object"},"OilInventoriesEuGasDay":{"properties":{"date":{"type":"string"},"fillPct":{"format":"double","type":"number"}},"type":"object"},"OilInventoriesIeaMember":{"properties":{"belowObligation":{"type":"boolean"},"daysOfCover":{"format":"double","type":"number"},"iso2":{"type":"string"},"netExporter":{"type":"boolean"}},"type":"object"},"OilInventoriesIeaStocks":{"properties":{"asiaPacific":{"$ref":"#/components/schemas/OilInventoriesRegionStats"},"dataMonth":{"type":"string"},"europe":{"$ref":"#/components/schemas/OilInventoriesRegionStats"},"members":{"items":{"$ref":"#/components/schemas/OilInventoriesIeaMember"},"type":"array"},"northAmerica":{"$ref":"#/components/schemas/OilInventoriesRegionStats"}},"type":"object"},"OilInventoriesRefinery":{"properties":{"inputsMbpd":{"format":"double","type":"number"},"period":{"type":"string"}},"type":"object"},"OilInventoriesRegionStats":{"properties":{"avgDays":{"format":"double","type":"number"},"countBelowObligation":{"format":"int32","type":"integer"},"minDays":{"format":"double","type":"number"}},"type":"object"},"OilInventoriesSprSnapshot":{"properties":{"changeWow":{"format":"double","type":"number"},"latestStocksMb":{"format":"double","type":"number"},"weeks":{"items":{"$ref":"#/components/schemas/OilInventoriesSprWeek"},"type":"array"}},"type":"object"},"OilInventoriesSprWeek":{"properties":{"period":{"type":"string"},"stocksMb":{"format":"double","type":"number"}},"type":"object"},"OilStocksAnalysisMember":{"description":"OilStocksAnalysisMember holds days-of-cover data and obligation status for one IEA member country.","properties":{"belowObligation":{"description":"True when days_of_cover \u003c 90 (IEA 90-day obligation threshold).","type":"boolean"},"daysOfCover":{"description":"Days of supply cover (absent when country is a net exporter or data anomaly).","format":"int32","type":"integer"},"iso2":{"description":"ISO 3166-1 alpha-2 country code.","type":"string"},"netExporter":{"description":"True when the country is classified as a net exporter by IEA.","type":"boolean"},"obligationMet":{"description":"True when the 90-day obligation is met (net exporters always true).","type":"boolean"},"rank":{"description":"Rank within the IEA member ranking (1-indexed, net exporters ranked last).","format":"int32","type":"integer"},"vsObligation":{"description":"days_of_cover - 90; absent for net exporters.","format":"int32","type":"integer"}},"type":"object"},"OilStocksRegionalSummary":{"description":"OilStocksRegionalSummary holds regional aggregates for the three IEA regions.","properties":{"asiaPacific":{"$ref":"#/components/schemas/OilStocksRegionalSummaryAsiaPacific"},"europe":{"$ref":"#/components/schemas/OilStocksRegionalSummaryEurope"},"northAmerica":{"$ref":"#/components/schemas/OilStocksRegionalSummaryNorthAmerica"}},"type":"object"},"OilStocksRegionalSummaryAsiaPacific":{"description":"OilStocksRegionalSummaryAsiaPacific aggregates days-of-cover for Asia-Pacific IEA members.","properties":{"avgDays":{"description":"Mean days of cover across Asia-Pacific members (AU, JP, KR, NZ).","format":"int32","type":"integer"},"countBelowObligation":{"description":"Count of Asia-Pacific members below the 90-day obligation.","format":"int32","type":"integer"},"minDays":{"description":"Minimum days of cover across Asia-Pacific members.","format":"int32","type":"integer"}},"type":"object"},"OilStocksRegionalSummaryEurope":{"description":"OilStocksRegionalSummaryEurope aggregates days-of-cover for European IEA members.","properties":{"avgDays":{"description":"Mean days of cover across non-net-exporter European members.","format":"int32","type":"integer"},"countBelowObligation":{"description":"Count of European members below the 90-day obligation.","format":"int32","type":"integer"},"minDays":{"description":"Minimum days of cover across non-net-exporter European members.","format":"int32","type":"integer"}},"type":"object"},"OilStocksRegionalSummaryNorthAmerica":{"description":"OilStocksRegionalSummaryNorthAmerica aggregates data for North American IEA members.","properties":{"avgDays":{"description":"Average days of cover for non-exporter North American members (if any).","format":"int32","type":"integer"},"netExporters":{"description":"Count of net exporters in North America (CA, MX, US).","format":"int32","type":"integer"}},"type":"object"},"PaginationResponse":{"description":"PaginationResponse contains pagination metadata returned alongside list results.","properties":{"nextCursor":{"description":"Cursor for fetching the next page. Empty string indicates no more pages.","type":"string"},"totalCount":{"description":"Total count of items matching the query, if known. Zero if the total is unknown.","format":"int32","type":"integer"}},"type":"object"},"PriceMomentumSignal":{"description":"PriceMomentumSignal uses the Mayer Multiple (price/SMA200) as a market-adaptive signal.","properties":{"status":{"description":"\"STRONG\", \"MODERATE\", \"WEAK\", or \"UNKNOWN\".","type":"string"}},"type":"object"},"RatesEntry":{"properties":{"key":{"type":"string"},"value":{"format":"double","type":"number"}},"type":"object"},"ResultsEntry":{"properties":{"key":{"type":"string"},"value":{"$ref":"#/components/schemas/FredSeries"}},"type":"object"},"TechnicalTrendSignal":{"description":"TechnicalTrendSignal evaluates BTC price vs moving averages and VWAP.","properties":{"btcPrice":{"description":"Current BTC price.","format":"double","type":"number"},"mayerMultiple":{"description":"Mayer multiple (BTC price / SMA200).","format":"double","type":"number"},"sma200":{"description":"200-day simple moving average.","format":"double","type":"number"},"sma50":{"description":"50-day simple moving average.","format":"double","type":"number"},"sparkline":{"items":{"description":"Last 30 BTC close prices.","format":"double","type":"number"},"type":"array"},"status":{"description":"\"BULLISH\", \"BEARISH\", \"NEUTRAL\", or \"UNKNOWN\".","type":"string"},"vwap30d":{"description":"30-day volume-weighted average price.","format":"double","type":"number"}},"type":"object"},"ValidationError":{"description":"ValidationError is returned when request validation fails. It contains a list of field violations describing what went wrong.","properties":{"violations":{"description":"List of validation violations","items":{"$ref":"#/components/schemas/FieldViolation"},"type":"array"}},"required":["violations"],"type":"object"},"WorldBankCountryData":{"description":"WorldBankCountryData represents a World Bank indicator value for a country.","properties":{"countryCode":{"description":"ISO 3166-1 alpha-2 country code.","minLength":1,"type":"string"},"countryName":{"description":"Country name.","type":"string"},"indicatorCode":{"description":"World Bank indicator code (e.g., \"NY.GDP.MKTP.CD\").","minLength":1,"type":"string"},"indicatorName":{"description":"Indicator name.","type":"string"},"value":{"description":"Indicator value.","format":"double","type":"number"},"year":{"description":"Data year.","format":"int32","type":"integer"}},"required":["countryCode","indicatorCode"],"type":"object"}}},"info":{"title":"EconomicService API","version":"1.0.0"},"openapi":"3.1.0","paths":{"/api/economic/v1/get-bis-credit":{"get":{"description":"GetBisCredit retrieves credit-to-GDP ratio data from BIS.","operationId":"GetBisCredit","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetBisCreditResponse"}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}},"description":"Validation error"},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error response"}},"summary":"GetBisCredit","tags":["EconomicService"]}},"/api/economic/v1/get-bis-exchange-rates":{"get":{"description":"GetBisExchangeRates retrieves effective exchange rates from BIS.","operationId":"GetBisExchangeRates","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetBisExchangeRatesResponse"}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}},"description":"Validation error"},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error response"}},"summary":"GetBisExchangeRates","tags":["EconomicService"]}},"/api/economic/v1/get-bis-policy-rates":{"get":{"description":"GetBisPolicyRates retrieves central bank policy rates from BIS.","operationId":"GetBisPolicyRates","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetBisPolicyRatesResponse"}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}},"description":"Validation error"},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error response"}},"summary":"GetBisPolicyRates","tags":["EconomicService"]}},"/api/economic/v1/get-bls-series":{"get":{"description":"GetBlsSeries retrieves BLS-only series not available on FRED (CES, LAUMT, CIU).","operationId":"GetBlsSeries","parameters":[{"description":"BLS series ID (e.g. \"CES0500000001\", \"CIU1010000000000A\").","in":"query","name":"series_id","required":false,"schema":{"type":"string"}},{"description":"Maximum number of observations to return. Defaults to 60.","in":"query","name":"limit","required":false,"schema":{"format":"int32","type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetBlsSeriesResponse"}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}},"description":"Validation error"},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error response"}},"summary":"GetBlsSeries","tags":["EconomicService"]}},"/api/economic/v1/get-crude-inventories":{"get":{"description":"GetCrudeInventories retrieves the 8 most recent weeks of US crude oil stockpile data from EIA (WCRSTUS1).","operationId":"GetCrudeInventories","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetCrudeInventoriesResponse"}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}},"description":"Validation error"},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error response"}},"summary":"GetCrudeInventories","tags":["EconomicService"]}},"/api/economic/v1/get-ecb-fx-rates":{"get":{"description":"GetEcbFxRates retrieves daily ECB official reference rates for EUR/major currency pairs.","operationId":"GetEcbFxRates","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetEcbFxRatesResponse"}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}},"description":"Validation error"},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error response"}},"summary":"GetEcbFxRates","tags":["EconomicService"]}},"/api/economic/v1/get-economic-calendar":{"get":{"description":"GetEconomicCalendar retrieves upcoming major economic events (FOMC, CPI, NFP, etc).","operationId":"GetEconomicCalendar","parameters":[{"in":"query","name":"fromDate","required":false,"schema":{"type":"string"}},{"in":"query","name":"toDate","required":false,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetEconomicCalendarResponse"}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}},"description":"Validation error"},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error response"}},"summary":"GetEconomicCalendar","tags":["EconomicService"]}},"/api/economic/v1/get-economic-stress":{"get":{"description":"GetEconomicStress retrieves the composite Economic Stress Index (0-100) from 6 FRED series.","operationId":"GetEconomicStress","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetEconomicStressResponse"}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}},"description":"Validation error"},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error response"}},"summary":"GetEconomicStress","tags":["EconomicService"]}},"/api/economic/v1/get-energy-capacity":{"get":{"description":"GetEnergyCapacity retrieves installed capacity data (solar, wind, coal) from EIA.","operationId":"GetEnergyCapacity","parameters":[{"description":"Energy source codes to query (e.g., \"SUN\", \"WND\", \"COL\").\n Empty returns all tracked sources (SUN, WND, COL).","in":"query","name":"energy_sources","required":false,"schema":{"type":"string"}},{"description":"Number of years of historical data. Default 20 if not set.","in":"query","name":"years","required":false,"schema":{"format":"int32","type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetEnergyCapacityResponse"}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}},"description":"Validation error"},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error response"}},"summary":"GetEnergyCapacity","tags":["EconomicService"]}},"/api/economic/v1/get-energy-crisis-policies":{"get":{"description":"GetEnergyCrisisPolicies retrieves government policy responses to the 2026 energy crisis from the IEA tracker.","operationId":"GetEnergyCrisisPolicies","parameters":[{"description":"Optional ISO-2 country code filter.","in":"query","name":"country_code","required":false,"schema":{"type":"string"}},{"description":"Optional category filter: \"conservation\" or \"consumer_support\".","in":"query","name":"category","required":false,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetEnergyCrisisPoliciesResponse"}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}},"description":"Validation error"},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error response"}},"summary":"GetEnergyCrisisPolicies","tags":["EconomicService"]}},"/api/economic/v1/get-energy-prices":{"get":{"description":"GetEnergyPrices retrieves current energy commodity prices from EIA.","operationId":"GetEnergyPrices","parameters":[{"description":"Optional commodity filter. Empty returns all tracked commodities.","in":"query","name":"commodities","required":false,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetEnergyPricesResponse"}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}},"description":"Validation error"},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error response"}},"summary":"GetEnergyPrices","tags":["EconomicService"]}},"/api/economic/v1/get-eu-fsi":{"get":{"description":"GetEuFsi retrieves the ECB CISS (Composite Indicator of Systemic Stress) for the Euro area.","operationId":"GetEuFsi","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetEuFsiResponse"}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}},"description":"Validation error"},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error response"}},"summary":"GetEuFsi","tags":["EconomicService"]}},"/api/economic/v1/get-eu-gas-storage":{"get":{"description":"GetEuGasStorage retrieves EU aggregate natural gas storage fill % from GIE AGSI+.","operationId":"GetEuGasStorage","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetEuGasStorageResponse"}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}},"description":"Validation error"},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error response"}},"summary":"GetEuGasStorage","tags":["EconomicService"]}},"/api/economic/v1/get-eu-yield-curve":{"get":{"description":"GetEuYieldCurve retrieves the ECB Euro Area AAA sovereign yield curve (Svensson model spot rates).","operationId":"GetEuYieldCurve","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetEuYieldCurveResponse"}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}},"description":"Validation error"},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error response"}},"summary":"GetEuYieldCurve","tags":["EconomicService"]}},"/api/economic/v1/get-eurostat-country-data":{"get":{"description":"GetEurostatCountryData retrieves per-country CPI, unemployment, and GDP growth for 10 EU member states.","operationId":"GetEurostatCountryData","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetEurostatCountryDataResponse"}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}},"description":"Validation error"},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error response"}},"summary":"GetEurostatCountryData","tags":["EconomicService"]}},"/api/economic/v1/get-fao-food-price-index":{"get":{"description":"GetFaoFoodPriceIndex retrieves the FAO Food Price Index for the past 12 months.","operationId":"GetFaoFoodPriceIndex","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetFaoFoodPriceIndexResponse"}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}},"description":"Validation error"},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error response"}},"summary":"GetFaoFoodPriceIndex","tags":["EconomicService"]}},"/api/economic/v1/get-fred-series":{"get":{"description":"GetFredSeries retrieves time series data from the Federal Reserve Economic Data.","operationId":"GetFredSeries","parameters":[{"description":"FRED series ID (e.g., \"GDP\", \"UNRATE\", \"CPIAUCSL\").","in":"query","name":"series_id","required":false,"schema":{"type":"string"}},{"description":"Maximum number of observations to return. Defaults to 120.","in":"query","name":"limit","required":false,"schema":{"format":"int32","type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetFredSeriesResponse"}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}},"description":"Validation error"},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error response"}},"summary":"GetFredSeries","tags":["EconomicService"]}},"/api/economic/v1/get-fred-series-batch":{"post":{"description":"GetFredSeriesBatch retrieves multiple FRED series in a single call.","operationId":"GetFredSeriesBatch","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetFredSeriesBatchRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetFredSeriesBatchResponse"}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}},"description":"Validation error"},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error response"}},"summary":"GetFredSeriesBatch","tags":["EconomicService"]}},"/api/economic/v1/get-macro-signals":{"get":{"description":"GetMacroSignals computes 7 macro signals from 6 upstream sources with BUY/CASH verdict.","operationId":"GetMacroSignals","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetMacroSignalsResponse"}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}},"description":"Validation error"},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error response"}},"summary":"GetMacroSignals","tags":["EconomicService"]}},"/api/economic/v1/get-nat-gas-storage":{"get":{"description":"GetNatGasStorage retrieves the 8 most recent weeks of US natural gas working gas storage from EIA (NW2_EPG0_SWO_R48_BCF).","operationId":"GetNatGasStorage","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetNatGasStorageResponse"}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}},"description":"Validation error"},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error response"}},"summary":"GetNatGasStorage","tags":["EconomicService"]}},"/api/economic/v1/get-national-debt":{"get":{"description":"GetNationalDebt retrieves national debt clock data for all countries.","operationId":"GetNationalDebt","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetNationalDebtResponse"}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}},"description":"Validation error"},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error response"}},"summary":"GetNationalDebt","tags":["EconomicService"]}},"/api/economic/v1/get-oil-inventories":{"get":{"operationId":"GetOilInventories","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetOilInventoriesResponse"}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}},"description":"Validation error"},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error response"}},"summary":"GetOilInventories","tags":["EconomicService"]}},"/api/economic/v1/get-oil-stocks-analysis":{"get":{"description":"GetOilStocksAnalysis retrieves the IEA oil stocks days-of-cover ranking and regional summary.","operationId":"GetOilStocksAnalysis","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetOilStocksAnalysisResponse"}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}},"description":"Validation error"},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error response"}},"summary":"GetOilStocksAnalysis","tags":["EconomicService"]}},"/api/economic/v1/list-bigmac-prices":{"get":{"description":"ListBigMacPrices retrieves Big Mac Index prices across Middle East countries.","operationId":"ListBigMacPrices","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListBigMacPricesResponse"}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}},"description":"Validation error"},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error response"}},"summary":"ListBigMacPrices","tags":["EconomicService"]}},"/api/economic/v1/list-fuel-prices":{"get":{"description":"ListFuelPrices retrieves retail gasoline and diesel prices across 30+ countries.","operationId":"ListFuelPrices","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListFuelPricesResponse"}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}},"description":"Validation error"},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error response"}},"summary":"ListFuelPrices","tags":["EconomicService"]}},"/api/economic/v1/list-grocery-basket-prices":{"get":{"description":"ListGroceryBasketPrices retrieves grocery basket price comparison across 24 countries worldwide.","operationId":"ListGroceryBasketPrices","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListGroceryBasketPricesResponse"}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}},"description":"Validation error"},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error response"}},"summary":"ListGroceryBasketPrices","tags":["EconomicService"]}},"/api/economic/v1/list-world-bank-indicators":{"get":{"description":"ListWorldBankIndicators retrieves development indicator data from the World Bank.","operationId":"ListWorldBankIndicators","parameters":[{"description":"World Bank indicator code (e.g., \"NY.GDP.MKTP.CD\").","in":"query","name":"indicator_code","required":false,"schema":{"type":"string"}},{"description":"Optional country filter (ISO 3166-1 alpha-2).","in":"query","name":"country_code","required":false,"schema":{"type":"string"}},{"description":"Optional year filter. Defaults to latest available.","in":"query","name":"year","required":false,"schema":{"format":"int32","type":"integer"}},{"description":"Maximum items per page.","in":"query","name":"page_size","required":false,"schema":{"format":"int32","type":"integer"}},{"description":"Cursor for next page.","in":"query","name":"cursor","required":false,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListWorldBankIndicatorsResponse"}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}},"description":"Validation error"},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error response"}},"summary":"ListWorldBankIndicators","tags":["EconomicService"]}}}} \ No newline at end of file +{"components":{"schemas":{"BigMacCountryPrice":{"properties":{"available":{"type":"boolean"},"code":{"type":"string"},"currency":{"type":"string"},"flag":{"type":"string"},"fxRate":{"format":"double","type":"number"},"localPrice":{"format":"double","type":"number"},"name":{"type":"string"},"sourceSite":{"type":"string"},"usdPrice":{"format":"double","type":"number"},"wowPct":{"format":"double","type":"number"}},"type":"object"},"BisCreditToGdp":{"description":"BisCreditToGdp represents total credit as percentage of GDP from BIS.","properties":{"countryCode":{"description":"ISO 2-letter country code.","type":"string"},"countryName":{"description":"Country or region name.","type":"string"},"creditGdpRatio":{"description":"Total credit as percentage of GDP.","format":"double","type":"number"},"date":{"description":"Date as YYYY-QN.","type":"string"},"previousRatio":{"description":"Previous quarter ratio.","format":"double","type":"number"}},"type":"object"},"BisExchangeRate":{"description":"BisExchangeRate represents effective exchange rate indices from BIS.","properties":{"countryCode":{"description":"ISO 2-letter country code.","type":"string"},"countryName":{"description":"Country or region name.","type":"string"},"date":{"description":"Date as YYYY-MM.","type":"string"},"nominalEer":{"description":"Nominal effective exchange rate index.","format":"double","type":"number"},"realChange":{"description":"Percentage change from previous period (real).","format":"double","type":"number"},"realEer":{"description":"Real effective exchange rate index.","format":"double","type":"number"}},"type":"object"},"BisPolicyRate":{"description":"BisPolicyRate represents a central bank policy rate from BIS.","properties":{"centralBank":{"description":"Central bank name (e.g. \"Federal Reserve\").","type":"string"},"countryCode":{"description":"ISO 2-letter country code (US, GB, JP, etc.)","type":"string"},"countryName":{"description":"Country or region name.","type":"string"},"date":{"description":"Date as YYYY-MM.","type":"string"},"previousRate":{"description":"Previous period rate percentage.","format":"double","type":"number"},"rate":{"description":"Current policy rate percentage.","format":"double","type":"number"}},"type":"object"},"BlsObservation":{"description":"BlsObservation is a single BLS data point.","properties":{"period":{"description":"Period code (e.g. \"M01\" for January, \"A01\" for annual).","type":"string"},"periodName":{"description":"Human-readable period name.","type":"string"},"value":{"description":"Observed value.","type":"string"},"year":{"description":"Year of the observation.","type":"string"}},"type":"object"},"BlsSeries":{"description":"BlsSeries is a BLS time series with metadata and observations.","properties":{"observations":{"items":{"$ref":"#/components/schemas/BlsObservation"},"type":"array"},"seriesId":{"description":"BLS series ID (e.g. \"CES0500000001\").","type":"string"},"title":{"description":"Human-readable series title.","type":"string"},"units":{"description":"Unit of measure.","type":"string"}},"type":"object"},"CountriesEntry":{"properties":{"key":{"type":"string"},"value":{"$ref":"#/components/schemas/EurostatCountryEntry"}},"type":"object"},"CountryBasket":{"properties":{"code":{"type":"string"},"currency":{"type":"string"},"flag":{"type":"string"},"fxRate":{"format":"double","type":"number"},"items":{"items":{"$ref":"#/components/schemas/GroceryItemPrice"},"type":"array"},"name":{"type":"string"},"totalUsd":{"format":"double","type":"number"},"wowPct":{"format":"double","type":"number"}},"type":"object"},"CrudeInventoryWeek":{"description":"CrudeInventoryWeek represents one week of US crude oil stockpile data from EIA WCRSTUS1.","properties":{"period":{"description":"ISO week period (YYYY-MM-DD, Monday of the EIA report week).","type":"string"},"stocksMb":{"description":"Total crude oil stocks in millions of barrels.","format":"double","type":"number"},"weeklyChangeMb":{"description":"Week-over-week change in millions of barrels. Positive = build (bearish), negative = draw (bullish).\n Absent for the oldest week when no prior week is available for comparison.","format":"double","type":"number"}},"type":"object"},"CrudeInventoryWeekRef":{"properties":{"period":{"type":"string"},"stocksMb":{"format":"double","type":"number"},"weeklyChangeMb":{"format":"double","type":"number"}},"type":"object"},"EcbFxRate":{"description":"EcbFxRate is a single ECB official reference rate for a currency pair.","properties":{"change1d":{"description":"1-day change in rate (absolute).","format":"double","type":"number"},"date":{"description":"Date of the observation in YYYY-MM-DD format.","type":"string"},"pair":{"description":"Currency pair label, e.g. \"EURUSD\".","type":"string"},"rate":{"description":"Exchange rate (units of quote currency per 1 EUR).","format":"double","type":"number"}},"type":"object"},"EconomicEvent":{"properties":{"actual":{"type":"string"},"country":{"type":"string"},"date":{"type":"string"},"estimate":{"type":"string"},"event":{"type":"string"},"impact":{"type":"string"},"previous":{"type":"string"},"unit":{"type":"string"}},"type":"object"},"EconomicStressComponent":{"properties":{"id":{"type":"string"},"label":{"type":"string"},"missing":{"type":"boolean"},"rawValue":{"format":"double","type":"number"},"score":{"format":"double","type":"number"},"weight":{"format":"double","type":"number"}},"type":"object"},"EnergyCapacitySeries":{"properties":{"data":{"items":{"$ref":"#/components/schemas/EnergyCapacityYear"},"type":"array"},"energySource":{"type":"string"},"name":{"type":"string"}},"type":"object"},"EnergyCapacityYear":{"properties":{"capacityMw":{"format":"double","type":"number"},"year":{"format":"int32","type":"integer"}},"type":"object"},"EnergyCrisisPolicy":{"description":"EnergyCrisisPolicy represents a single government policy response to the 2026 energy crisis.","properties":{"category":{"description":"Policy category: \"conservation\" or \"consumer_support\".","type":"string"},"country":{"description":"Country name.","type":"string"},"countryCode":{"description":"ISO 3166-1 alpha-2 country code.","type":"string"},"dateAnnounced":{"description":"Date announced in ISO-8601 (YYYY-MM-DD) format.","type":"string"},"measure":{"description":"Description of the policy measure.","type":"string"},"sector":{"description":"Affected sector: transport, buildings, industry, electricity, agriculture, general.","type":"string"},"status":{"description":"Status of the policy: active, planned, or ended.","type":"string"}},"type":"object"},"EnergyPrice":{"description":"EnergyPrice represents a current energy commodity price from EIA.","properties":{"change":{"description":"Percentage change from previous period.","format":"double","type":"number"},"commodity":{"description":"Energy commodity identifier.","minLength":1,"type":"string"},"name":{"description":"Human-readable name (e.g., \"WTI Crude Oil\", \"Henry Hub Natural Gas\").","type":"string"},"price":{"description":"Current price in USD.","format":"double","type":"number"},"priceAt":{"description":"Price date, as Unix epoch milliseconds.. Warning: Values \u003e 2^53 may lose precision in JavaScript","format":"int64","type":"integer"},"unit":{"description":"Unit of measurement (e.g., \"$/barrel\", \"$/MMBtu\").","type":"string"}},"required":["commodity"],"type":"object"},"Error":{"description":"Error is returned when a handler encounters an error. It contains a simple error message that the developer can customize.","properties":{"message":{"description":"Error message (e.g., 'user not found', 'database connection failed')","type":"string"}},"type":"object"},"EuFsiObservation":{"properties":{"date":{"type":"string"},"value":{"format":"double","type":"number"}},"type":"object"},"EuGasStorageHistoryEntry":{"description":"EuGasStorageHistoryEntry represents one day of EU aggregate gas storage data.","properties":{"date":{"description":"Calendar date (YYYY-MM-DD).","type":"string"},"fillPct":{"description":"Storage fill level as a percentage of working gas volume capacity.","format":"double","type":"number"},"gasTwh":{"description":"Working gas volume in storage (TWh).","format":"double","type":"number"}},"type":"object"},"EuYieldCurveData":{"description":"EuYieldCurveData holds a single observation of the ECB Euro Area AAA yield curve.","properties":{"date":{"description":"Date of the observation (YYYY-MM or YYYY-MM-DD).","type":"string"},"rates":{"additionalProperties":{"format":"double","type":"number"},"description":"Spot rates by tenor. Keys: \"1Y\", \"2Y\", \"5Y\", \"10Y\", \"20Y\", \"30Y\".","type":"object"},"source":{"description":"Data source identifier (e.g. \"ecb-aaa\").","type":"string"},"updatedAt":{"description":"ISO 8601 timestamp when this was last seeded.","type":"string"}},"type":"object"},"EurostatCountryEntry":{"description":"EurostatCountryEntry holds all available metrics for one EU country.","properties":{"cpi":{"$ref":"#/components/schemas/EurostatMetric"},"gdpGrowth":{"$ref":"#/components/schemas/EurostatMetric"},"unemployment":{"$ref":"#/components/schemas/EurostatMetric"}},"type":"object"},"EurostatMetric":{"description":"EurostatMetric holds a single economic metric value for a country.","properties":{"date":{"description":"Period string (e.g. \"2024-01\" for monthly, \"2024-Q1\" for quarterly).","type":"string"},"hasPrior":{"description":"True when prior_value is present (proto3 can't distinguish 0 from absent).","type":"boolean"},"priorValue":{"description":"Prior period value for delta calculation (e.g. previous month/quarter).","format":"double","type":"number"},"unit":{"description":"Unit of measurement (e.g. \"%\").","type":"string"},"value":{"description":"Numeric value (e.g. 2.3 for 2.3%).","format":"double","type":"number"}},"type":"object"},"FaoFoodPricePoint":{"properties":{"cereals":{"format":"double","type":"number"},"dairy":{"format":"double","type":"number"},"date":{"type":"string"},"ffpi":{"format":"double","type":"number"},"meat":{"format":"double","type":"number"},"oils":{"format":"double","type":"number"},"sugar":{"format":"double","type":"number"}},"type":"object"},"FearGreedHistoryEntry":{"description":"FearGreedHistoryEntry is a single day's Fear \u0026 Greed index reading.","properties":{"date":{"description":"Date string (YYYY-MM-DD).","type":"string"},"value":{"description":"Index value (0-100).","format":"int32","maximum":100,"minimum":0,"type":"integer"}},"type":"object"},"FearGreedSignal":{"description":"FearGreedSignal tracks the Crypto Fear \u0026 Greed index.","properties":{"history":{"items":{"$ref":"#/components/schemas/FearGreedHistoryEntry"},"type":"array"},"status":{"description":"Classification label (e.g., \"Extreme Fear\", \"Greed\").","type":"string"},"value":{"description":"Current index value (0-100).","format":"int32","type":"integer"}},"type":"object"},"FieldViolation":{"description":"FieldViolation describes a single validation error for a specific field.","properties":{"description":{"description":"Human-readable description of the validation violation (e.g., 'must be a valid email address', 'required field missing')","type":"string"},"field":{"description":"The field path that failed validation (e.g., 'user.email' for nested fields). For header validation, this will be the header name (e.g., 'X-API-Key')","type":"string"}},"required":["field","description"],"type":"object"},"FlowStructureSignal":{"description":"FlowStructureSignal compares BTC vs QQQ 5-day returns.","properties":{"btcReturn5":{"description":"BTC 5-day return percentage.","format":"double","type":"number"},"qqqReturn5":{"description":"QQQ 5-day return percentage.","format":"double","type":"number"},"status":{"description":"\"PASSIVE GAP\", \"ALIGNED\", or \"UNKNOWN\".","type":"string"}},"type":"object"},"FredObservation":{"description":"FredObservation represents a single data point from a FRED economic series.","properties":{"date":{"description":"Observation date as YYYY-MM-DD string.","type":"string"},"value":{"description":"Observation value.","format":"double","type":"number"}},"type":"object"},"FredSeries":{"description":"FredSeries represents a FRED time series with metadata.","properties":{"frequency":{"description":"Data frequency (e.g., \"Monthly\", \"Quarterly\").","type":"string"},"observations":{"items":{"$ref":"#/components/schemas/FredObservation"},"type":"array"},"seriesId":{"description":"Series identifier (e.g., \"GDP\", \"UNRATE\", \"CPIAUCSL\").","minLength":1,"type":"string"},"title":{"description":"Series title.","type":"string"},"units":{"description":"Unit of measurement.","type":"string"}},"required":["seriesId"],"type":"object"},"FuelCountryPrice":{"properties":{"code":{"type":"string"},"currency":{"type":"string"},"diesel":{"$ref":"#/components/schemas/FuelPrice"},"flag":{"type":"string"},"fxRate":{"format":"double","type":"number"},"gasoline":{"$ref":"#/components/schemas/FuelPrice"},"name":{"type":"string"}},"type":"object"},"FuelPrice":{"properties":{"available":{"type":"boolean"},"grade":{"type":"string"},"localPrice":{"format":"double","type":"number"},"observedAt":{"type":"string"},"source":{"type":"string"},"usdPrice":{"format":"double","type":"number"},"wowPct":{"format":"double","type":"number"}},"type":"object"},"GetBisCreditRequest":{"description":"GetBisCreditRequest requests credit-to-GDP ratio data.","type":"object"},"GetBisCreditResponse":{"description":"GetBisCreditResponse contains BIS credit-to-GDP data.","properties":{"entries":{"items":{"$ref":"#/components/schemas/BisCreditToGdp"},"type":"array"}},"type":"object"},"GetBisExchangeRatesRequest":{"description":"GetBisExchangeRatesRequest requests effective exchange rates.","type":"object"},"GetBisExchangeRatesResponse":{"description":"GetBisExchangeRatesResponse contains BIS effective exchange rate data.","properties":{"rates":{"items":{"$ref":"#/components/schemas/BisExchangeRate"},"type":"array"}},"type":"object"},"GetBisPolicyRatesRequest":{"description":"GetBisPolicyRatesRequest requests central bank policy rates.","type":"object"},"GetBisPolicyRatesResponse":{"description":"GetBisPolicyRatesResponse contains BIS policy rate data.","properties":{"rates":{"items":{"$ref":"#/components/schemas/BisPolicyRate"},"type":"array"}},"type":"object"},"GetBlsSeriesRequest":{"description":"GetBlsSeriesRequest specifies which BLS series to retrieve.","properties":{"limit":{"description":"Maximum number of observations to return. Defaults to 60.","format":"int32","type":"integer"},"seriesId":{"description":"BLS series ID (e.g. \"CES0500000001\", \"CIU1010000000000A\").","type":"string"}},"type":"object"},"GetBlsSeriesResponse":{"description":"GetBlsSeriesResponse contains the requested BLS series data.","properties":{"series":{"$ref":"#/components/schemas/BlsSeries"}},"type":"object"},"GetCrudeInventoriesRequest":{"description":"GetCrudeInventoriesRequest is the request message for GetCrudeInventories.","type":"object"},"GetCrudeInventoriesResponse":{"description":"GetCrudeInventoriesResponse contains the 8 most recent weeks of US crude oil inventory data.","properties":{"latestPeriod":{"description":"Timestamp of the most recent EIA data point (ISO 8601).","type":"string"},"weeks":{"items":{"$ref":"#/components/schemas/CrudeInventoryWeek"},"type":"array"}},"type":"object"},"GetEcbFxRatesRequest":{"description":"GetEcbFxRatesRequest is empty; returns all tracked EUR pairs.","type":"object"},"GetEcbFxRatesResponse":{"description":"GetEcbFxRatesResponse contains the latest ECB reference rates.","properties":{"rates":{"items":{"$ref":"#/components/schemas/EcbFxRate"},"type":"array"},"seededAt":{"description":"Unix ms when the data was last seeded.","format":"int64","type":"string"},"unavailable":{"description":"True when Redis key is missing or data is unavailable.","type":"boolean"},"updatedAt":{"description":"ISO 8601 timestamp of the ECB publication.","type":"string"}},"type":"object"},"GetEconomicCalendarRequest":{"properties":{"fromDate":{"type":"string"},"toDate":{"type":"string"}},"type":"object"},"GetEconomicCalendarResponse":{"properties":{"events":{"items":{"$ref":"#/components/schemas/EconomicEvent"},"type":"array"},"fromDate":{"type":"string"},"toDate":{"type":"string"},"total":{"format":"int32","type":"integer"},"unavailable":{"type":"boolean"}},"type":"object"},"GetEconomicStressRequest":{"type":"object"},"GetEconomicStressResponse":{"properties":{"components":{"items":{"$ref":"#/components/schemas/EconomicStressComponent"},"type":"array"},"compositeScore":{"format":"double","type":"number"},"label":{"type":"string"},"seededAt":{"type":"string"},"unavailable":{"type":"boolean"}},"type":"object"},"GetEnergyCapacityRequest":{"properties":{"energySources":{"items":{"description":"Energy source codes to query (e.g., \"SUN\", \"WND\", \"COL\").\n Empty returns all tracked sources (SUN, WND, COL).","type":"string"},"type":"array"},"years":{"description":"Number of years of historical data. Default 20 if not set.","format":"int32","type":"integer"}},"type":"object"},"GetEnergyCapacityResponse":{"properties":{"series":{"items":{"$ref":"#/components/schemas/EnergyCapacitySeries"},"type":"array"}},"type":"object"},"GetEnergyCrisisPoliciesRequest":{"description":"GetEnergyCrisisPoliciesRequest allows optional filtering by country or category.","properties":{"category":{"description":"Optional category filter: \"conservation\" or \"consumer_support\".","type":"string"},"countryCode":{"description":"Optional ISO-2 country code filter.","type":"string"}},"type":"object"},"GetEnergyCrisisPoliciesResponse":{"description":"GetEnergyCrisisPoliciesResponse contains energy crisis policy data from the IEA tracker.","properties":{"context":{"description":"Context description.","type":"string"},"policies":{"items":{"$ref":"#/components/schemas/EnergyCrisisPolicy"},"type":"array"},"source":{"description":"Source attribution.","type":"string"},"sourceUrl":{"description":"Source URL.","type":"string"},"unavailable":{"description":"True when upstream seed data is unavailable (fallback result).","type":"boolean"},"updatedAt":{"description":"UTC ISO-8601 timestamp when this data was last updated.","type":"string"}},"type":"object"},"GetEnergyPricesRequest":{"description":"GetEnergyPricesRequest specifies which energy commodities to retrieve.","properties":{"commodities":{"items":{"description":"Optional commodity filter. Empty returns all tracked commodities.","type":"string"},"type":"array"}},"type":"object"},"GetEnergyPricesResponse":{"description":"GetEnergyPricesResponse contains energy price data.","properties":{"prices":{"items":{"$ref":"#/components/schemas/EnergyPrice"},"type":"array"}},"type":"object"},"GetEuFsiRequest":{"type":"object"},"GetEuFsiResponse":{"properties":{"history":{"items":{"$ref":"#/components/schemas/EuFsiObservation"},"type":"array"},"label":{"type":"string"},"latestDate":{"type":"string"},"latestValue":{"format":"double","type":"number"},"seededAt":{"type":"string"},"unavailable":{"type":"boolean"}},"type":"object"},"GetEuGasStorageRequest":{"description":"GetEuGasStorageRequest is empty — returns latest EU aggregate snapshot.","type":"object"},"GetEuGasStorageResponse":{"description":"GetEuGasStorageResponse contains the EU aggregate gas storage snapshot.","properties":{"fillPct":{"description":"Current storage fill level as a percentage of working gas volume (0–100).","format":"double","type":"number"},"fillPctChange1d":{"description":"1-day change in fill percentage (positive = injecting, negative = withdrawing).","format":"double","type":"number"},"gasDaysConsumption":{"description":"Approximate days of consumption remaining at average EU winter drawdown rate.","format":"double","type":"number"},"history":{"items":{"$ref":"#/components/schemas/EuGasStorageHistoryEntry"},"type":"array"},"seededAt":{"description":"UTC ms timestamp when seed data was written.","format":"int64","type":"string"},"trend":{"description":"Current storage trend: \"injecting\", \"withdrawing\", or \"stable\".","type":"string"},"unavailable":{"description":"True when upstream data is unavailable (fallback result).","type":"boolean"},"updatedAt":{"description":"Calendar date of the most recent data point (YYYY-MM-DD).","type":"string"}},"type":"object"},"GetEuYieldCurveRequest":{"description":"GetEuYieldCurveRequest fetches the ECB Euro Area AAA sovereign yield curve.","type":"object"},"GetEuYieldCurveResponse":{"description":"GetEuYieldCurveResponse contains the latest ECB Euro Area AAA sovereign yield curve.","properties":{"data":{"$ref":"#/components/schemas/EuYieldCurveData"},"unavailable":{"description":"True if data is not yet available in cache.","type":"boolean"}},"type":"object"},"GetEurostatCountryDataRequest":{"description":"GetEurostatCountryDataRequest requests Eurostat per-country economic data.","type":"object"},"GetEurostatCountryDataResponse":{"description":"GetEurostatCountryDataResponse contains per-country CPI, unemployment, and GDP growth.","properties":{"countries":{"additionalProperties":{"$ref":"#/components/schemas/EurostatCountryEntry"},"description":"Map of ISO2 country code to economic metrics (e.g. \"DE\", \"FR\", \"IT\").","type":"object"},"seededAt":{"description":"UTC ms timestamp when seed data was written.","format":"int64","type":"string"},"unavailable":{"description":"True when upstream data is unavailable (fallback result).","type":"boolean"}},"type":"object"},"GetFaoFoodPriceIndexRequest":{"type":"object"},"GetFaoFoodPriceIndexResponse":{"properties":{"currentFfpi":{"format":"double","type":"number"},"fetchedAt":{"type":"string"},"momPct":{"format":"double","type":"number"},"points":{"items":{"$ref":"#/components/schemas/FaoFoodPricePoint"},"type":"array"},"yoyPct":{"format":"double","type":"number"}},"type":"object"},"GetFredSeriesBatchRequest":{"description":"GetFredSeriesBatchRequest looks up multiple FRED series in a single call.","properties":{"limit":{"description":"Maximum number of observations per series. Defaults to 120.","format":"int32","type":"integer"},"seriesIds":{"items":{"description":"FRED series IDs (e.g., \"WALCL\", \"FEDFUNDS\"). Max 10.","maxItems":10,"minItems":1,"type":"string"},"maxItems":10,"minItems":1,"type":"array"}},"type":"object"},"GetFredSeriesBatchResponse":{"description":"GetFredSeriesBatchResponse contains the requested FRED series data.","properties":{"fetched":{"description":"Number of series successfully fetched.","format":"int32","type":"integer"},"requested":{"description":"Number of series requested.","format":"int32","type":"integer"},"results":{"additionalProperties":{"$ref":"#/components/schemas/FredSeries"},"description":"Map of series_id -\u003e FRED series for found series.","type":"object"}},"type":"object"},"GetFredSeriesRequest":{"description":"GetFredSeriesRequest specifies which FRED series to retrieve.","properties":{"limit":{"description":"Maximum number of observations to return. Defaults to 120.","format":"int32","type":"integer"},"seriesId":{"description":"FRED series ID (e.g., \"GDP\", \"UNRATE\", \"CPIAUCSL\").","minLength":1,"type":"string"}},"required":["seriesId"],"type":"object"},"GetFredSeriesResponse":{"description":"GetFredSeriesResponse contains the requested FRED series data.","properties":{"series":{"$ref":"#/components/schemas/FredSeries"}},"type":"object"},"GetMacroSignalsRequest":{"description":"GetMacroSignalsRequest requests the current macro signal dashboard.","type":"object"},"GetMacroSignalsResponse":{"description":"GetMacroSignalsResponse contains the full macro signal dashboard with 7 signals and verdict.","properties":{"bullishCount":{"description":"Number of bullish signals.","format":"int32","type":"integer"},"meta":{"$ref":"#/components/schemas/MacroMeta"},"signals":{"$ref":"#/components/schemas/MacroSignals"},"timestamp":{"description":"ISO 8601 timestamp of computation.","type":"string"},"totalCount":{"description":"Total number of evaluated signals (excluding UNKNOWN).","format":"int32","type":"integer"},"unavailable":{"description":"True when upstream data is unavailable (fallback result).","type":"boolean"},"verdict":{"description":"Overall verdict: \"BUY\", \"CASH\", or \"UNKNOWN\".","type":"string"}},"type":"object"},"GetNatGasStorageRequest":{"description":"GetNatGasStorageRequest is the request message for GetNatGasStorage.","type":"object"},"GetNatGasStorageResponse":{"description":"GetNatGasStorageResponse contains the 8 most recent weeks of US natural gas storage data.","properties":{"latestPeriod":{"description":"Timestamp of the most recent EIA data point (ISO 8601).","type":"string"},"weeks":{"items":{"$ref":"#/components/schemas/NatGasStorageWeek"},"type":"array"}},"type":"object"},"GetNationalDebtRequest":{"description":"GetNationalDebtRequest requests national debt data for all countries.","type":"object"},"GetNationalDebtResponse":{"description":"GetNationalDebtResponse wraps the full list of national debt entries.","properties":{"entries":{"items":{"$ref":"#/components/schemas/NationalDebtEntry"},"type":"array"},"seededAt":{"description":"ISO 8601 timestamp when seed data was written.","type":"string"},"unavailable":{"description":"True when upstream data is unavailable (fallback result).","type":"boolean"}},"type":"object"},"GetOilInventoriesRequest":{"type":"object"},"GetOilInventoriesResponse":{"properties":{"crudeWeeks":{"items":{"$ref":"#/components/schemas/CrudeInventoryWeekRef"},"type":"array"},"euGas":{"$ref":"#/components/schemas/OilInventoriesEuGas"},"ieaStocks":{"$ref":"#/components/schemas/OilInventoriesIeaStocks"},"natGasWeeks":{"items":{"$ref":"#/components/schemas/NatGasWeekRef"},"type":"array"},"refinery":{"$ref":"#/components/schemas/OilInventoriesRefinery"},"spr":{"$ref":"#/components/schemas/OilInventoriesSprSnapshot"},"updatedAt":{"type":"string"}},"type":"object"},"GetOilStocksAnalysisRequest":{"description":"GetOilStocksAnalysisRequest is empty — returns the latest global analysis snapshot.","type":"object"},"GetOilStocksAnalysisResponse":{"description":"GetOilStocksAnalysisResponse contains the IEA oil stocks days-of-cover analysis.","properties":{"belowObligation":{"items":{"description":"ISO2 codes of countries currently below the 90-day obligation.","type":"string"},"type":"array"},"dataMonth":{"description":"Data month in YYYY-MM format (source: IEA monthly release).","type":"string"},"ieaMembers":{"items":{"$ref":"#/components/schemas/OilStocksAnalysisMember"},"type":"array"},"regionalSummary":{"$ref":"#/components/schemas/OilStocksRegionalSummary"},"unavailable":{"description":"True when upstream seed data is unavailable (fallback result).","type":"boolean"},"updatedAt":{"description":"UTC ISO-8601 timestamp when this analysis was written.","type":"string"}},"type":"object"},"GroceryItemPrice":{"properties":{"available":{"type":"boolean"},"currency":{"type":"string"},"itemId":{"type":"string"},"itemName":{"type":"string"},"localPrice":{"format":"double","type":"number"},"sourceSite":{"type":"string"},"unit":{"type":"string"},"usdPrice":{"format":"double","type":"number"}},"type":"object"},"HashRateSignal":{"description":"HashRateSignal tracks Bitcoin hash rate momentum.","properties":{"change30d":{"description":"Hash rate change over 30 days as percentage.","format":"double","type":"number"},"status":{"description":"\"GROWING\", \"DECLINING\", \"STABLE\", or \"UNKNOWN\".","type":"string"}},"type":"object"},"LiquiditySignal":{"description":"LiquiditySignal tracks JPY 30d rate of change as a liquidity proxy.","properties":{"sparkline":{"items":{"description":"Last 30 JPY close prices.","format":"double","type":"number"},"type":"array"},"status":{"description":"\"SQUEEZE\", \"NORMAL\", or \"UNKNOWN\".","type":"string"},"value":{"description":"JPY 30d ROC percentage, absent if unavailable.","format":"double","type":"number"}},"type":"object"},"ListBigMacPricesRequest":{"type":"object"},"ListBigMacPricesResponse":{"properties":{"cheapestCountry":{"type":"string"},"countries":{"items":{"$ref":"#/components/schemas/BigMacCountryPrice"},"type":"array"},"fetchedAt":{"type":"string"},"mostExpensiveCountry":{"type":"string"},"prevFetchedAt":{"type":"string"},"wowAvailable":{"type":"boolean"},"wowAvgPct":{"format":"double","type":"number"}},"type":"object"},"ListFuelPricesRequest":{"type":"object"},"ListFuelPricesResponse":{"properties":{"cheapestDiesel":{"type":"string"},"cheapestGasoline":{"type":"string"},"countries":{"items":{"$ref":"#/components/schemas/FuelCountryPrice"},"type":"array"},"countryCount":{"format":"int32","type":"integer"},"fetchedAt":{"type":"string"},"mostExpensiveDiesel":{"type":"string"},"mostExpensiveGasoline":{"type":"string"},"prevFetchedAt":{"type":"string"},"sourceCount":{"format":"int32","type":"integer"},"wowAvailable":{"type":"boolean"}},"type":"object"},"ListGroceryBasketPricesRequest":{"type":"object"},"ListGroceryBasketPricesResponse":{"properties":{"cheapestCountry":{"type":"string"},"countries":{"items":{"$ref":"#/components/schemas/CountryBasket"},"type":"array"},"fetchedAt":{"type":"string"},"mostExpensiveCountry":{"type":"string"},"prevFetchedAt":{"type":"string"},"upstreamUnavailable":{"type":"boolean"},"wowAvailable":{"type":"boolean"},"wowAvgPct":{"format":"double","type":"number"}},"type":"object"},"ListWorldBankIndicatorsRequest":{"description":"ListWorldBankIndicatorsRequest specifies filters for retrieving World Bank data.","properties":{"countryCode":{"description":"Optional country filter (ISO 3166-1 alpha-2).","type":"string"},"cursor":{"description":"Cursor for next page.","type":"string"},"indicatorCode":{"description":"World Bank indicator code (e.g., \"NY.GDP.MKTP.CD\").","minLength":1,"type":"string"},"pageSize":{"description":"Maximum items per page.","format":"int32","type":"integer"},"year":{"description":"Optional year filter. Defaults to latest available.","format":"int32","type":"integer"}},"required":["indicatorCode"],"type":"object"},"ListWorldBankIndicatorsResponse":{"description":"ListWorldBankIndicatorsResponse contains World Bank indicator data.","properties":{"data":{"items":{"$ref":"#/components/schemas/WorldBankCountryData"},"type":"array"},"pagination":{"$ref":"#/components/schemas/PaginationResponse"}},"type":"object"},"MacroMeta":{"description":"MacroMeta contains supplementary chart data.","properties":{"qqqSparkline":{"items":{"description":"Last 30 QQQ close prices for sparkline.","format":"double","type":"number"},"type":"array"}},"type":"object"},"MacroRegimeSignal":{"description":"MacroRegimeSignal compares QQQ vs XLP 20-day rate of change.","properties":{"qqqRoc20":{"description":"QQQ 20d ROC percentage.","format":"double","type":"number"},"status":{"description":"\"RISK-ON\", \"DEFENSIVE\", or \"UNKNOWN\".","type":"string"},"xlpRoc20":{"description":"XLP 20d ROC percentage.","format":"double","type":"number"}},"type":"object"},"MacroSignals":{"description":"MacroSignals contains all 7 individual signal computations.","properties":{"fearGreed":{"$ref":"#/components/schemas/FearGreedSignal"},"flowStructure":{"$ref":"#/components/schemas/FlowStructureSignal"},"hashRate":{"$ref":"#/components/schemas/HashRateSignal"},"liquidity":{"$ref":"#/components/schemas/LiquiditySignal"},"macroRegime":{"$ref":"#/components/schemas/MacroRegimeSignal"},"priceMomentum":{"$ref":"#/components/schemas/PriceMomentumSignal"},"technicalTrend":{"$ref":"#/components/schemas/TechnicalTrendSignal"}},"type":"object"},"NatGasStorageWeek":{"description":"NatGasStorageWeek represents one week of US natural gas working gas storage data from EIA.","properties":{"period":{"description":"ISO week period (YYYY-MM-DD, Monday of the EIA report week).","type":"string"},"storBcf":{"description":"Working gas in underground storage, Lower-48 States, in Bcf.","format":"double","type":"number"},"weeklyChangeBcf":{"description":"Week-over-week change in Bcf. Positive = build (bearish for gas prices), negative = draw (bullish).\n Absent for the oldest week when no prior week is available for comparison.","format":"double","type":"number"}},"type":"object"},"NatGasWeekRef":{"properties":{"period":{"type":"string"},"storBcf":{"format":"double","type":"number"},"weeklyChangeBcf":{"format":"double","type":"number"}},"type":"object"},"NationalDebtEntry":{"description":"NationalDebtEntry holds debt data for a single country.","properties":{"annualGrowth":{"description":"Year-over-year debt growth percent (2023-\u003e2024).","format":"double","type":"number"},"baselineTs":{"description":"UTC ms timestamp anchoring the debt_usd figure (2024-01-01T00:00:00Z).","format":"int64","type":"string"},"debtToGdp":{"description":"Debt as % of GDP.","format":"double","type":"number"},"debtUsd":{"description":"Total debt in USD at baseline_ts.","format":"double","type":"number"},"gdpUsd":{"description":"GDP in USD (nominal, latest year).","format":"double","type":"number"},"iso3":{"description":"ISO3 country code (e.g. \"USA\").","type":"string"},"perDayRate":{"description":"Deficit-derived accrual in USD per day.","format":"double","type":"number"},"perSecondRate":{"description":"Deficit-derived accrual in USD per second.","format":"double","type":"number"},"source":{"description":"Human-readable source string.","type":"string"}},"type":"object"},"OilInventoriesEuGas":{"properties":{"fillPct":{"format":"double","type":"number"},"fillPctChange1d":{"format":"double","type":"number"},"history":{"items":{"$ref":"#/components/schemas/OilInventoriesEuGasDay"},"type":"array"},"trend":{"type":"string"}},"type":"object"},"OilInventoriesEuGasDay":{"properties":{"date":{"type":"string"},"fillPct":{"format":"double","type":"number"}},"type":"object"},"OilInventoriesIeaMember":{"properties":{"belowObligation":{"type":"boolean"},"daysOfCover":{"format":"double","type":"number"},"iso2":{"type":"string"},"netExporter":{"type":"boolean"}},"type":"object"},"OilInventoriesIeaStocks":{"properties":{"asiaPacific":{"$ref":"#/components/schemas/OilInventoriesRegionStats"},"dataMonth":{"type":"string"},"europe":{"$ref":"#/components/schemas/OilInventoriesRegionStats"},"members":{"items":{"$ref":"#/components/schemas/OilInventoriesIeaMember"},"type":"array"},"northAmerica":{"$ref":"#/components/schemas/OilInventoriesRegionStats"}},"type":"object"},"OilInventoriesRefinery":{"properties":{"inputsMbpd":{"format":"double","type":"number"},"period":{"type":"string"}},"type":"object"},"OilInventoriesRegionStats":{"properties":{"avgDays":{"format":"double","type":"number"},"countBelowObligation":{"format":"int32","type":"integer"},"minDays":{"format":"double","type":"number"}},"type":"object"},"OilInventoriesSprSnapshot":{"properties":{"changeWow":{"format":"double","type":"number"},"latestStocksMb":{"format":"double","type":"number"},"weeks":{"items":{"$ref":"#/components/schemas/OilInventoriesSprWeek"},"type":"array"}},"type":"object"},"OilInventoriesSprWeek":{"properties":{"period":{"type":"string"},"stocksMb":{"format":"double","type":"number"}},"type":"object"},"OilStocksAnalysisMember":{"description":"OilStocksAnalysisMember holds days-of-cover data and obligation status for one IEA member country.","properties":{"belowObligation":{"description":"True when days_of_cover \u003c 90 (IEA 90-day obligation threshold).","type":"boolean"},"daysOfCover":{"description":"Days of supply cover (absent when country is a net exporter or data anomaly).","format":"int32","type":"integer"},"iso2":{"description":"ISO 3166-1 alpha-2 country code.","type":"string"},"netExporter":{"description":"True when the country is classified as a net exporter by IEA.","type":"boolean"},"obligationMet":{"description":"True when the 90-day obligation is met (net exporters always true).","type":"boolean"},"rank":{"description":"Rank within the IEA member ranking (1-indexed, net exporters ranked last).","format":"int32","type":"integer"},"vsObligation":{"description":"days_of_cover - 90; absent for net exporters.","format":"int32","type":"integer"}},"type":"object"},"OilStocksRegionalSummary":{"description":"OilStocksRegionalSummary holds regional aggregates for the three IEA regions.","properties":{"asiaPacific":{"$ref":"#/components/schemas/OilStocksRegionalSummaryAsiaPacific"},"europe":{"$ref":"#/components/schemas/OilStocksRegionalSummaryEurope"},"northAmerica":{"$ref":"#/components/schemas/OilStocksRegionalSummaryNorthAmerica"}},"type":"object"},"OilStocksRegionalSummaryAsiaPacific":{"description":"OilStocksRegionalSummaryAsiaPacific aggregates days-of-cover for Asia-Pacific IEA members.","properties":{"avgDays":{"description":"Mean days of cover across Asia-Pacific members (AU, JP, KR, NZ).","format":"int32","type":"integer"},"countBelowObligation":{"description":"Count of Asia-Pacific members below the 90-day obligation.","format":"int32","type":"integer"},"minDays":{"description":"Minimum days of cover across Asia-Pacific members.","format":"int32","type":"integer"}},"type":"object"},"OilStocksRegionalSummaryEurope":{"description":"OilStocksRegionalSummaryEurope aggregates days-of-cover for European IEA members.","properties":{"avgDays":{"description":"Mean days of cover across non-net-exporter European members.","format":"int32","type":"integer"},"countBelowObligation":{"description":"Count of European members below the 90-day obligation.","format":"int32","type":"integer"},"minDays":{"description":"Minimum days of cover across non-net-exporter European members.","format":"int32","type":"integer"}},"type":"object"},"OilStocksRegionalSummaryNorthAmerica":{"description":"OilStocksRegionalSummaryNorthAmerica aggregates data for North American IEA members.","properties":{"avgDays":{"description":"Average days of cover for non-exporter North American members (if any).","format":"int32","type":"integer"},"netExporters":{"description":"Count of net exporters in North America (CA, MX, US).","format":"int32","type":"integer"}},"type":"object"},"PaginationResponse":{"description":"PaginationResponse contains pagination metadata returned alongside list results.","properties":{"nextCursor":{"description":"Cursor for fetching the next page. Empty string indicates no more pages.","type":"string"},"totalCount":{"description":"Total count of items matching the query, if known. Zero if the total is unknown.","format":"int32","type":"integer"}},"type":"object"},"PriceMomentumSignal":{"description":"PriceMomentumSignal uses the Mayer Multiple (price/SMA200) as a market-adaptive signal.","properties":{"status":{"description":"\"STRONG\", \"MODERATE\", \"WEAK\", or \"UNKNOWN\".","type":"string"}},"type":"object"},"RatesEntry":{"properties":{"key":{"type":"string"},"value":{"format":"double","type":"number"}},"type":"object"},"ResultsEntry":{"properties":{"key":{"type":"string"},"value":{"$ref":"#/components/schemas/FredSeries"}},"type":"object"},"TechnicalTrendSignal":{"description":"TechnicalTrendSignal evaluates BTC price vs moving averages and VWAP.","properties":{"btcPrice":{"description":"Current BTC price.","format":"double","type":"number"},"mayerMultiple":{"description":"Mayer multiple (BTC price / SMA200).","format":"double","type":"number"},"sma200":{"description":"200-day simple moving average.","format":"double","type":"number"},"sma50":{"description":"50-day simple moving average.","format":"double","type":"number"},"sparkline":{"items":{"description":"Last 30 BTC close prices.","format":"double","type":"number"},"type":"array"},"status":{"description":"\"BULLISH\", \"BEARISH\", \"NEUTRAL\", or \"UNKNOWN\".","type":"string"},"vwap30d":{"description":"30-day volume-weighted average price.","format":"double","type":"number"}},"type":"object"},"ValidationError":{"description":"ValidationError is returned when request validation fails. It contains a list of field violations describing what went wrong.","properties":{"violations":{"description":"List of validation violations","items":{"$ref":"#/components/schemas/FieldViolation"},"type":"array"}},"required":["violations"],"type":"object"},"WorldBankCountryData":{"description":"WorldBankCountryData represents a World Bank indicator value for a country.","properties":{"countryCode":{"description":"ISO 3166-1 alpha-2 country code.","minLength":1,"type":"string"},"countryName":{"description":"Country name.","type":"string"},"indicatorCode":{"description":"World Bank indicator code (e.g., \"NY.GDP.MKTP.CD\").","minLength":1,"type":"string"},"indicatorName":{"description":"Indicator name.","type":"string"},"value":{"description":"Indicator value.","format":"double","type":"number"},"year":{"description":"Data year.","format":"int32","type":"integer"}},"required":["countryCode","indicatorCode"],"type":"object"}}},"info":{"title":"EconomicService API","version":"1.0.0"},"openapi":"3.1.0","paths":{"/api/economic/v1/get-bis-credit":{"get":{"description":"GetBisCredit retrieves credit-to-GDP ratio data from BIS.","operationId":"GetBisCredit","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetBisCreditResponse"}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}},"description":"Validation error"},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error response"}},"summary":"GetBisCredit","tags":["EconomicService"]}},"/api/economic/v1/get-bis-exchange-rates":{"get":{"description":"GetBisExchangeRates retrieves effective exchange rates from BIS.","operationId":"GetBisExchangeRates","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetBisExchangeRatesResponse"}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}},"description":"Validation error"},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error response"}},"summary":"GetBisExchangeRates","tags":["EconomicService"]}},"/api/economic/v1/get-bis-policy-rates":{"get":{"description":"GetBisPolicyRates retrieves central bank policy rates from BIS.","operationId":"GetBisPolicyRates","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetBisPolicyRatesResponse"}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}},"description":"Validation error"},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error response"}},"summary":"GetBisPolicyRates","tags":["EconomicService"]}},"/api/economic/v1/get-bls-series":{"get":{"description":"GetBlsSeries retrieves BLS-only series not available on FRED (CES, LAUMT, CIU).","operationId":"GetBlsSeries","parameters":[{"description":"BLS series ID (e.g. \"CES0500000001\", \"CIU1010000000000A\").","in":"query","name":"series_id","required":false,"schema":{"type":"string"}},{"description":"Maximum number of observations to return. Defaults to 60.","in":"query","name":"limit","required":false,"schema":{"format":"int32","type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetBlsSeriesResponse"}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}},"description":"Validation error"},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error response"}},"summary":"GetBlsSeries","tags":["EconomicService"]}},"/api/economic/v1/get-crude-inventories":{"get":{"description":"GetCrudeInventories retrieves the 8 most recent weeks of US crude oil stockpile data from EIA (WCRSTUS1).","operationId":"GetCrudeInventories","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetCrudeInventoriesResponse"}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}},"description":"Validation error"},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error response"}},"summary":"GetCrudeInventories","tags":["EconomicService"]}},"/api/economic/v1/get-ecb-fx-rates":{"get":{"description":"GetEcbFxRates retrieves daily ECB official reference rates for EUR/major currency pairs.","operationId":"GetEcbFxRates","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetEcbFxRatesResponse"}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}},"description":"Validation error"},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error response"}},"summary":"GetEcbFxRates","tags":["EconomicService"]}},"/api/economic/v1/get-economic-calendar":{"get":{"description":"GetEconomicCalendar retrieves upcoming major economic events (FOMC, CPI, NFP, etc).","operationId":"GetEconomicCalendar","parameters":[{"in":"query","name":"fromDate","required":false,"schema":{"type":"string"}},{"in":"query","name":"toDate","required":false,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetEconomicCalendarResponse"}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}},"description":"Validation error"},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error response"}},"summary":"GetEconomicCalendar","tags":["EconomicService"]}},"/api/economic/v1/get-economic-stress":{"get":{"description":"GetEconomicStress retrieves the composite Economic Stress Index (0-100) from 6 FRED series.","operationId":"GetEconomicStress","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetEconomicStressResponse"}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}},"description":"Validation error"},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error response"}},"summary":"GetEconomicStress","tags":["EconomicService"]}},"/api/economic/v1/get-energy-capacity":{"get":{"description":"GetEnergyCapacity retrieves installed capacity data (solar, wind, coal) from EIA.","operationId":"GetEnergyCapacity","parameters":[{"description":"Energy source codes to query (e.g., \"SUN\", \"WND\", \"COL\").\n Empty returns all tracked sources (SUN, WND, COL).","explode":true,"in":"query","name":"energy_sources","required":false,"schema":{"items":{"type":"string"},"type":"array"},"style":"form"},{"description":"Number of years of historical data. Default 20 if not set.","in":"query","name":"years","required":false,"schema":{"format":"int32","type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetEnergyCapacityResponse"}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}},"description":"Validation error"},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error response"}},"summary":"GetEnergyCapacity","tags":["EconomicService"]}},"/api/economic/v1/get-energy-crisis-policies":{"get":{"description":"GetEnergyCrisisPolicies retrieves government policy responses to the 2026 energy crisis from the IEA tracker.","operationId":"GetEnergyCrisisPolicies","parameters":[{"description":"Optional ISO-2 country code filter.","in":"query","name":"country_code","required":false,"schema":{"type":"string"}},{"description":"Optional category filter: \"conservation\" or \"consumer_support\".","in":"query","name":"category","required":false,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetEnergyCrisisPoliciesResponse"}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}},"description":"Validation error"},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error response"}},"summary":"GetEnergyCrisisPolicies","tags":["EconomicService"]}},"/api/economic/v1/get-energy-prices":{"get":{"description":"GetEnergyPrices retrieves current energy commodity prices from EIA.","operationId":"GetEnergyPrices","parameters":[{"description":"Optional commodity filter. Empty returns all tracked commodities.","explode":true,"in":"query","name":"commodities","required":false,"schema":{"items":{"type":"string"},"type":"array"},"style":"form"}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetEnergyPricesResponse"}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}},"description":"Validation error"},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error response"}},"summary":"GetEnergyPrices","tags":["EconomicService"]}},"/api/economic/v1/get-eu-fsi":{"get":{"description":"GetEuFsi retrieves the ECB CISS (Composite Indicator of Systemic Stress) for the Euro area.","operationId":"GetEuFsi","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetEuFsiResponse"}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}},"description":"Validation error"},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error response"}},"summary":"GetEuFsi","tags":["EconomicService"]}},"/api/economic/v1/get-eu-gas-storage":{"get":{"description":"GetEuGasStorage retrieves EU aggregate natural gas storage fill % from GIE AGSI+.","operationId":"GetEuGasStorage","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetEuGasStorageResponse"}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}},"description":"Validation error"},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error response"}},"summary":"GetEuGasStorage","tags":["EconomicService"]}},"/api/economic/v1/get-eu-yield-curve":{"get":{"description":"GetEuYieldCurve retrieves the ECB Euro Area AAA sovereign yield curve (Svensson model spot rates).","operationId":"GetEuYieldCurve","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetEuYieldCurveResponse"}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}},"description":"Validation error"},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error response"}},"summary":"GetEuYieldCurve","tags":["EconomicService"]}},"/api/economic/v1/get-eurostat-country-data":{"get":{"description":"GetEurostatCountryData retrieves per-country CPI, unemployment, and GDP growth for 10 EU member states.","operationId":"GetEurostatCountryData","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetEurostatCountryDataResponse"}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}},"description":"Validation error"},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error response"}},"summary":"GetEurostatCountryData","tags":["EconomicService"]}},"/api/economic/v1/get-fao-food-price-index":{"get":{"description":"GetFaoFoodPriceIndex retrieves the FAO Food Price Index for the past 12 months.","operationId":"GetFaoFoodPriceIndex","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetFaoFoodPriceIndexResponse"}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}},"description":"Validation error"},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error response"}},"summary":"GetFaoFoodPriceIndex","tags":["EconomicService"]}},"/api/economic/v1/get-fred-series":{"get":{"description":"GetFredSeries retrieves time series data from the Federal Reserve Economic Data.","operationId":"GetFredSeries","parameters":[{"description":"FRED series ID (e.g., \"GDP\", \"UNRATE\", \"CPIAUCSL\").","in":"query","name":"series_id","required":false,"schema":{"type":"string"}},{"description":"Maximum number of observations to return. Defaults to 120.","in":"query","name":"limit","required":false,"schema":{"format":"int32","type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetFredSeriesResponse"}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}},"description":"Validation error"},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error response"}},"summary":"GetFredSeries","tags":["EconomicService"]}},"/api/economic/v1/get-fred-series-batch":{"post":{"description":"GetFredSeriesBatch retrieves multiple FRED series in a single call.","operationId":"GetFredSeriesBatch","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetFredSeriesBatchRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetFredSeriesBatchResponse"}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}},"description":"Validation error"},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error response"}},"summary":"GetFredSeriesBatch","tags":["EconomicService"]}},"/api/economic/v1/get-macro-signals":{"get":{"description":"GetMacroSignals computes 7 macro signals from 6 upstream sources with BUY/CASH verdict.","operationId":"GetMacroSignals","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetMacroSignalsResponse"}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}},"description":"Validation error"},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error response"}},"summary":"GetMacroSignals","tags":["EconomicService"]}},"/api/economic/v1/get-nat-gas-storage":{"get":{"description":"GetNatGasStorage retrieves the 8 most recent weeks of US natural gas working gas storage from EIA (NW2_EPG0_SWO_R48_BCF).","operationId":"GetNatGasStorage","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetNatGasStorageResponse"}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}},"description":"Validation error"},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error response"}},"summary":"GetNatGasStorage","tags":["EconomicService"]}},"/api/economic/v1/get-national-debt":{"get":{"description":"GetNationalDebt retrieves national debt clock data for all countries.","operationId":"GetNationalDebt","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetNationalDebtResponse"}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}},"description":"Validation error"},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error response"}},"summary":"GetNationalDebt","tags":["EconomicService"]}},"/api/economic/v1/get-oil-inventories":{"get":{"operationId":"GetOilInventories","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetOilInventoriesResponse"}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}},"description":"Validation error"},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error response"}},"summary":"GetOilInventories","tags":["EconomicService"]}},"/api/economic/v1/get-oil-stocks-analysis":{"get":{"description":"GetOilStocksAnalysis retrieves the IEA oil stocks days-of-cover ranking and regional summary.","operationId":"GetOilStocksAnalysis","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetOilStocksAnalysisResponse"}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}},"description":"Validation error"},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error response"}},"summary":"GetOilStocksAnalysis","tags":["EconomicService"]}},"/api/economic/v1/list-bigmac-prices":{"get":{"description":"ListBigMacPrices retrieves Big Mac Index prices across Middle East countries.","operationId":"ListBigMacPrices","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListBigMacPricesResponse"}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}},"description":"Validation error"},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error response"}},"summary":"ListBigMacPrices","tags":["EconomicService"]}},"/api/economic/v1/list-fuel-prices":{"get":{"description":"ListFuelPrices retrieves retail gasoline and diesel prices across 30+ countries.","operationId":"ListFuelPrices","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListFuelPricesResponse"}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}},"description":"Validation error"},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error response"}},"summary":"ListFuelPrices","tags":["EconomicService"]}},"/api/economic/v1/list-grocery-basket-prices":{"get":{"description":"ListGroceryBasketPrices retrieves grocery basket price comparison across 24 countries worldwide.","operationId":"ListGroceryBasketPrices","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListGroceryBasketPricesResponse"}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}},"description":"Validation error"},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error response"}},"summary":"ListGroceryBasketPrices","tags":["EconomicService"]}},"/api/economic/v1/list-world-bank-indicators":{"get":{"description":"ListWorldBankIndicators retrieves development indicator data from the World Bank.","operationId":"ListWorldBankIndicators","parameters":[{"description":"World Bank indicator code (e.g., \"NY.GDP.MKTP.CD\").","in":"query","name":"indicator_code","required":false,"schema":{"type":"string"}},{"description":"Optional country filter (ISO 3166-1 alpha-2).","in":"query","name":"country_code","required":false,"schema":{"type":"string"}},{"description":"Optional year filter. Defaults to latest available.","in":"query","name":"year","required":false,"schema":{"format":"int32","type":"integer"}},{"description":"Maximum items per page.","in":"query","name":"page_size","required":false,"schema":{"format":"int32","type":"integer"}},{"description":"Cursor for next page.","in":"query","name":"cursor","required":false,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListWorldBankIndicatorsResponse"}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}},"description":"Validation error"},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error response"}},"summary":"ListWorldBankIndicators","tags":["EconomicService"]}}}} \ No newline at end of file diff --git a/docs/api/EconomicService.openapi.yaml b/docs/api/EconomicService.openapi.yaml index 9e0a66a8e..7469327b2 100644 --- a/docs/api/EconomicService.openapi.yaml +++ b/docs/api/EconomicService.openapi.yaml @@ -114,8 +114,12 @@ paths: in: query description: Optional commodity filter. Empty returns all tracked commodities. required: false + style: form + explode: true schema: - type: string + type: array + items: + type: string responses: "200": description: Successful response @@ -175,8 +179,12 @@ paths: Energy source codes to query (e.g., "SUN", "WND", "COL"). Empty returns all tracked sources (SUN, WND, COL). required: false + style: form + explode: true schema: - type: string + type: array + items: + type: string - name: years in: query description: Number of years of historical data. Default 20 if not set. diff --git a/docs/api/InfrastructureService.openapi.json b/docs/api/InfrastructureService.openapi.json index 502324dc4..be8adeef3 100644 --- a/docs/api/InfrastructureService.openapi.json +++ b/docs/api/InfrastructureService.openapi.json @@ -1 +1 @@ -{"components":{"schemas":{"BaselineAnomaly":{"description":"BaselineAnomaly describes a detected deviation from historical baseline.","properties":{"multiplier":{"description":"Ratio of current count to baseline mean.","format":"double","type":"number"},"severity":{"description":"Severity label: \"critical\", \"high\", \"medium\", \"normal\".","type":"string"},"zScore":{"description":"Number of standard deviations from the mean.","format":"double","type":"number"}},"type":"object"},"BaselineStats":{"description":"BaselineStats contains the running statistics for a baseline key.","properties":{"mean":{"description":"Running mean of observed counts.","format":"double","type":"number"},"sampleCount":{"description":"Number of samples incorporated so far.","format":"int32","type":"integer"},"stdDev":{"description":"Standard deviation derived from Welford's M2.","format":"double","type":"number"}},"type":"object"},"BaselineUpdate":{"description":"BaselineUpdate is a single metric observation to incorporate into the running baseline.","properties":{"count":{"description":"Observed count value.","format":"double","type":"number"},"region":{"description":"Geographic region key, defaults to \"global\".","type":"string"},"type":{"description":"Activity type key.","minLength":1,"type":"string"}},"required":["type"],"type":"object"},"CableHealthEvidence":{"description":"CableHealthEvidence represents a single piece of evidence supporting a health assessment.","properties":{"source":{"description":"Evidence source (e.g. \"NGA\").","type":"string"},"summary":{"description":"Human-readable summary of the evidence.","type":"string"},"ts":{"description":"Evidence timestamp, as Unix epoch milliseconds.. Warning: Values \u003e 2^53 may lose precision in JavaScript","format":"int64","type":"integer"}},"type":"object"},"CableHealthRecord":{"description":"CableHealthRecord contains the computed health status and supporting evidence for a cable.","properties":{"confidence":{"description":"Confidence in the health assessment (0.0–1.0).","format":"double","type":"number"},"evidence":{"items":{"$ref":"#/components/schemas/CableHealthEvidence"},"type":"array"},"lastUpdated":{"description":"Last signal update time, as Unix epoch milliseconds.. Warning: Values \u003e 2^53 may lose precision in JavaScript","format":"int64","type":"integer"},"score":{"description":"Composite health score (0.0 = healthy, 1.0 = confirmed fault).","format":"double","type":"number"},"status":{"description":"CableHealthStatus represents the computed health status of a submarine cable.","enum":["CABLE_HEALTH_STATUS_UNSPECIFIED","CABLE_HEALTH_STATUS_OK","CABLE_HEALTH_STATUS_DEGRADED","CABLE_HEALTH_STATUS_FAULT"],"type":"string"}},"type":"object"},"CablesEntry":{"properties":{"key":{"type":"string"},"value":{"$ref":"#/components/schemas/CableHealthRecord"}},"type":"object"},"DataEntry":{"properties":{"key":{"type":"string"},"value":{"type":"string"}},"type":"object"},"DdosAttackSummaryEntry":{"description":"DdosAttackSummaryEntry represents a single protocol or vector and its share of DDoS traffic.","properties":{"label":{"description":"Protocol or vector name (e.g. \"TCP\", \"UDP\", \"networkFlood\").","type":"string"},"percentage":{"description":"Percentage share of total DDoS traffic (0–100).","format":"float","type":"number"}},"type":"object"},"DdosLocationHit":{"description":"DdosLocationHit represents a top DDoS target location with geo coordinates.","properties":{"countryCode":{"description":"ISO 3166-1 alpha-2 country code.","type":"string"},"countryName":{"description":"Country display name.","type":"string"},"latitude":{"description":"Latitude of the target location.","format":"float","type":"number"},"longitude":{"description":"Longitude of the target location.","format":"float","type":"number"},"percentage":{"description":"Percentage share of total DDoS traffic targeting this location (0-100).","format":"float","type":"number"}},"type":"object"},"Error":{"description":"Error is returned when a handler encounters an error. It contains a simple error message that the developer can customize.","properties":{"message":{"description":"Error message (e.g., 'user not found', 'database connection failed')","type":"string"}},"type":"object"},"FieldViolation":{"description":"FieldViolation describes a single validation error for a specific field.","properties":{"description":{"description":"Human-readable description of the validation violation (e.g., 'must be a valid email address', 'required field missing')","type":"string"},"field":{"description":"The field path that failed validation (e.g., 'user.email' for nested fields). For header validation, this will be the header name (e.g., 'X-API-Key')","type":"string"}},"required":["field","description"],"type":"object"},"GeoCoordinates":{"description":"GeoCoordinates represents a geographic location using WGS84 coordinates.","properties":{"latitude":{"description":"Latitude in decimal degrees (-90 to 90).","format":"double","maximum":90,"minimum":-90,"type":"number"},"longitude":{"description":"Longitude in decimal degrees (-180 to 180).","format":"double","maximum":180,"minimum":-180,"type":"number"}},"type":"object"},"GetBootstrapDataRequest":{"description":"GetBootstrapDataRequest parameters for multi-key fetching.","properties":{"keys":{"items":{"type":"string"},"type":"array"},"tier":{"description":"Predefined tiers or specific keys.","type":"string"}},"type":"object"},"GetBootstrapDataResponse":{"description":"GetBootstrapDataResponse containing pooled data objects.","properties":{"data":{"additionalProperties":{"type":"string"},"description":"Map of keys to JSON-encoded data strings.","type":"object"},"missing":{"items":{"description":"List of keys that were not found in cache.","type":"string"},"type":"array"}},"type":"object"},"GetCableHealthRequest":{"description":"GetCableHealthRequest requests the current health status of all monitored submarine cables.","type":"object"},"GetCableHealthResponse":{"description":"GetCableHealthResponse contains health status for submarine cables with active signals.","properties":{"cables":{"additionalProperties":{"$ref":"#/components/schemas/CableHealthRecord"},"description":"Health records keyed by cable identifier.","type":"object"},"generatedAt":{"description":"Generation timestamp, as Unix epoch milliseconds.. Warning: Values \u003e 2^53 may lose precision in JavaScript","format":"int64","type":"integer"}},"type":"object"},"GetIpGeoRequest":{"description":"GetIpGeoRequest defined for future parameters (e.g., specific IP).","type":"object"},"GetIpGeoResponse":{"description":"GetIpGeoResponse contains geographic information derived from the request IP.","properties":{"city":{"type":"string"},"country":{"description":"ISO 3166-1 alpha-2 country code.","type":"string"},"region":{"description":"Region or city (if available).","type":"string"}},"type":"object"},"GetTemporalBaselineRequest":{"description":"GetTemporalBaselineRequest checks current activity count against stored baseline.","properties":{"count":{"description":"Current observed count to compare against baseline.","format":"double","type":"number"},"region":{"description":"Geographic region key, defaults to \"global\".","type":"string"},"type":{"description":"Activity type: \"military_flights\", \"vessels\", \"protests\", \"news\", \"ais_gaps\", \"satellite_fires\".","minLength":1,"type":"string"}},"required":["type"],"type":"object"},"GetTemporalBaselineResponse":{"description":"GetTemporalBaselineResponse returns anomaly info or learning status.","properties":{"anomaly":{"$ref":"#/components/schemas/BaselineAnomaly"},"baseline":{"$ref":"#/components/schemas/BaselineStats"},"error":{"description":"Error message if request was invalid.","type":"string"},"learning":{"description":"True if insufficient samples have been collected.","type":"boolean"},"sampleCount":{"description":"Current number of samples stored.","format":"int32","type":"integer"},"samplesNeeded":{"description":"Minimum samples required before anomaly detection activates.","format":"int32","type":"integer"}},"type":"object"},"InternetOutage":{"description":"InternetOutage represents a detected internet outage event from Cloudflare Radar.","properties":{"categories":{"items":{"description":"Affected infrastructure categories.","type":"string"},"type":"array"},"cause":{"description":"Root cause, if determined.","type":"string"},"country":{"description":"Affected country (ISO 3166-1 alpha-2).","type":"string"},"description":{"description":"Outage description.","type":"string"},"detectedAt":{"description":"Detection time, as Unix epoch milliseconds.. Warning: Values \u003e 2^53 may lose precision in JavaScript","format":"int64","type":"integer"},"endedAt":{"description":"End time of the outage, as Unix epoch milliseconds. Zero if ongoing.. Warning: Values \u003e 2^53 may lose precision in JavaScript","format":"int64","type":"integer"},"id":{"description":"Unique outage identifier.","minLength":1,"type":"string"},"link":{"description":"URL to the outage report.","type":"string"},"location":{"$ref":"#/components/schemas/GeoCoordinates"},"outageType":{"description":"Outage type classification.","type":"string"},"region":{"description":"Affected region within the country.","type":"string"},"severity":{"description":"OutageSeverity represents the severity of an internet outage.\n Maps to TS union: 'partial' | 'major' | 'total'.","enum":["OUTAGE_SEVERITY_UNSPECIFIED","OUTAGE_SEVERITY_PARTIAL","OUTAGE_SEVERITY_MAJOR","OUTAGE_SEVERITY_TOTAL"],"type":"string"},"title":{"description":"Outage title.","type":"string"}},"required":["id"],"type":"object"},"ListInternetDdosAttacksRequest":{"description":"ListInternetDdosAttacksRequest specifies filters for retrieving DDoS attack summaries.","type":"object"},"ListInternetDdosAttacksResponse":{"description":"ListInternetDdosAttacksResponse contains DDoS attack protocol and vector breakdowns.","properties":{"dateRangeEnd":{"description":"ISO 8601 end of the data window.","type":"string"},"dateRangeStart":{"description":"ISO 8601 start of the data window.","type":"string"},"protocol":{"items":{"$ref":"#/components/schemas/DdosAttackSummaryEntry"},"type":"array"},"topTargetLocations":{"items":{"$ref":"#/components/schemas/DdosLocationHit"},"type":"array"},"vector":{"items":{"$ref":"#/components/schemas/DdosAttackSummaryEntry"},"type":"array"}},"type":"object"},"ListInternetOutagesRequest":{"description":"ListInternetOutagesRequest specifies filters for retrieving internet outages.","properties":{"country":{"description":"Optional country filter (ISO 3166-1 alpha-2).","type":"string"},"cursor":{"description":"Cursor for next page.","type":"string"},"end":{"description":"End of time range (inclusive), Unix epoch milliseconds.. Warning: Values \u003e 2^53 may lose precision in JavaScript","format":"int64","type":"integer"},"pageSize":{"description":"Maximum items per page.","format":"int32","type":"integer"},"start":{"description":"Start of time range (inclusive), Unix epoch milliseconds.. Warning: Values \u003e 2^53 may lose precision in JavaScript","format":"int64","type":"integer"}},"type":"object"},"ListInternetOutagesResponse":{"description":"ListInternetOutagesResponse contains internet outages matching the request.","properties":{"outages":{"items":{"$ref":"#/components/schemas/InternetOutage"},"type":"array"},"pagination":{"$ref":"#/components/schemas/PaginationResponse"}},"type":"object"},"ListInternetTrafficAnomaliesRequest":{"description":"ListInternetTrafficAnomaliesRequest specifies filters for traffic anomalies.","properties":{"country":{"description":"Optional ISO 3166-1 alpha-2 country code filter.","type":"string"}},"type":"object"},"ListInternetTrafficAnomaliesResponse":{"description":"ListInternetTrafficAnomaliesResponse contains detected traffic anomalies.","properties":{"anomalies":{"items":{"$ref":"#/components/schemas/TrafficAnomaly"},"type":"array"},"totalCount":{"description":"Total anomaly count before filtering.","format":"int32","type":"integer"}},"type":"object"},"ListServiceStatusesRequest":{"description":"ListServiceStatusesRequest specifies filters for retrieving service statuses.","properties":{"status":{"description":"ServiceOperationalStatus represents the current status of a service.","enum":["SERVICE_OPERATIONAL_STATUS_UNSPECIFIED","SERVICE_OPERATIONAL_STATUS_OPERATIONAL","SERVICE_OPERATIONAL_STATUS_DEGRADED","SERVICE_OPERATIONAL_STATUS_PARTIAL_OUTAGE","SERVICE_OPERATIONAL_STATUS_MAJOR_OUTAGE","SERVICE_OPERATIONAL_STATUS_MAINTENANCE"],"type":"string"}},"type":"object"},"ListServiceStatusesResponse":{"description":"ListServiceStatusesResponse contains service operational statuses.","properties":{"statuses":{"items":{"$ref":"#/components/schemas/ServiceStatus"},"type":"array"}},"type":"object"},"ListTemporalAnomaliesRequest":{"type":"object"},"ListTemporalAnomaliesResponse":{"properties":{"anomalies":{"items":{"$ref":"#/components/schemas/TemporalAnomaly"},"type":"array"},"computedAt":{"type":"string"},"trackedTypes":{"items":{"type":"string"},"type":"array"}},"type":"object"},"PaginationResponse":{"description":"PaginationResponse contains pagination metadata returned alongside list results.","properties":{"nextCursor":{"description":"Cursor for fetching the next page. Empty string indicates no more pages.","type":"string"},"totalCount":{"description":"Total count of items matching the query, if known. Zero if the total is unknown.","format":"int32","type":"integer"}},"type":"object"},"RecordBaselineSnapshotRequest":{"description":"RecordBaselineSnapshotRequest batch-updates baselines using Welford's online algorithm.","properties":{"updates":{"items":{"$ref":"#/components/schemas/BaselineUpdate"},"type":"array"}},"type":"object"},"RecordBaselineSnapshotResponse":{"description":"RecordBaselineSnapshotResponse reports how many baselines were successfully updated.","properties":{"error":{"description":"Error message if the request was invalid.","type":"string"},"updated":{"description":"Number of baselines that were written.","format":"int32","type":"integer"}},"type":"object"},"ReverseGeocodeRequest":{"description":"ReverseGeocodeRequest parameters for coordinate-to-address lookups.","properties":{"lat":{"format":"double","type":"number"},"lon":{"format":"double","type":"number"}},"type":"object"},"ReverseGeocodeResponse":{"description":"ReverseGeocodeResponse containing the resolved location details.","properties":{"code":{"description":"ISO country code.","type":"string"},"country":{"description":"Human-readable country name.","type":"string"},"displayName":{"description":"Full display name/address.","type":"string"},"error":{"description":"Optional error message.","type":"string"}},"type":"object"},"ServiceStatus":{"description":"ServiceStatus represents the operational status of a monitored external service.","properties":{"checkedAt":{"description":"Last status check time, as Unix epoch milliseconds.. Warning: Values \u003e 2^53 may lose precision in JavaScript","format":"int64","type":"integer"},"description":{"description":"Status description.","type":"string"},"id":{"description":"Service identifier.","type":"string"},"latencyMs":{"description":"Response latency in milliseconds.","format":"int32","type":"integer"},"name":{"description":"Service display name.","type":"string"},"status":{"description":"ServiceOperationalStatus represents the current status of a service.","enum":["SERVICE_OPERATIONAL_STATUS_UNSPECIFIED","SERVICE_OPERATIONAL_STATUS_OPERATIONAL","SERVICE_OPERATIONAL_STATUS_DEGRADED","SERVICE_OPERATIONAL_STATUS_PARTIAL_OUTAGE","SERVICE_OPERATIONAL_STATUS_MAJOR_OUTAGE","SERVICE_OPERATIONAL_STATUS_MAINTENANCE"],"type":"string"},"url":{"description":"Service URL or homepage.","type":"string"}},"type":"object"},"TemporalAnomaly":{"properties":{"currentCount":{"format":"int32","type":"integer"},"expectedCount":{"format":"int32","type":"integer"},"message":{"type":"string"},"multiplier":{"format":"double","type":"number"},"region":{"type":"string"},"severity":{"type":"string"},"type":{"type":"string"},"zScore":{"format":"double","type":"number"}},"type":"object"},"TrafficAnomaly":{"description":"TrafficAnomaly represents an anomalous traffic pattern detected by Cloudflare Radar.","properties":{"asn":{"description":"Autonomous System Number affected.","type":"string"},"asnName":{"description":"ASN display name.","type":"string"},"endDate":{"description":"End of the anomaly, Unix epoch milliseconds. Zero if ongoing.. Warning: Values \u003e 2^53 may lose precision in JavaScript","format":"int64","type":"integer"},"latitude":{"description":"Latitude of the affected location.","format":"float","type":"number"},"locationCode":{"description":"ISO 3166-1 alpha-2 country code.","type":"string"},"locationName":{"description":"Country display name.","type":"string"},"longitude":{"description":"Longitude of the affected location.","format":"float","type":"number"},"startDate":{"description":"Start of the anomaly, Unix epoch milliseconds.. Warning: Values \u003e 2^53 may lose precision in JavaScript","format":"int64","type":"integer"},"status":{"description":"Current status (\"ONGOING\" or \"HISTORICAL\").","type":"string"},"type":{"description":"Anomaly type (e.g. \"ANOMALY_DNS\", \"ANOMALY_BGP\").","type":"string"},"uuid":{"description":"Unique identifier for the anomaly.","type":"string"}},"type":"object"},"ValidationError":{"description":"ValidationError is returned when request validation fails. It contains a list of field violations describing what went wrong.","properties":{"violations":{"description":"List of validation violations","items":{"$ref":"#/components/schemas/FieldViolation"},"type":"array"}},"required":["violations"],"type":"object"}}},"info":{"title":"InfrastructureService API","version":"1.0.0"},"openapi":"3.1.0","paths":{"/api/infrastructure/v1/get-bootstrap-data":{"get":{"description":"GetBootstrapData fetches multiple data points from the system cache in a single call.","operationId":"GetBootstrapData","parameters":[{"description":"Predefined tiers or specific keys.","in":"query","name":"tier","required":false,"schema":{"type":"string"}},{"in":"query","name":"keys","required":false,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetBootstrapDataResponse"}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}},"description":"Validation error"},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error response"}},"summary":"GetBootstrapData","tags":["InfrastructureService"]}},"/api/infrastructure/v1/get-cable-health":{"get":{"description":"GetCableHealth computes health status for submarine cables from NGA maritime warning signals.","operationId":"GetCableHealth","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetCableHealthResponse"}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}},"description":"Validation error"},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error response"}},"summary":"GetCableHealth","tags":["InfrastructureService"]}},"/api/infrastructure/v1/get-ip-geo":{"get":{"description":"GetIpGeo retrieves geographic information based on the caller's IP address.","operationId":"GetIpGeo","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetIpGeoResponse"}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}},"description":"Validation error"},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error response"}},"summary":"GetIpGeo","tags":["InfrastructureService"]}},"/api/infrastructure/v1/get-temporal-baseline":{"get":{"description":"GetTemporalBaseline retrieves historical baseline data for a specific signal.","operationId":"GetTemporalBaseline","parameters":[{"description":"Activity type: \"military_flights\", \"vessels\", \"protests\", \"news\", \"ais_gaps\", \"satellite_fires\".","in":"query","name":"type","required":false,"schema":{"type":"string"}},{"description":"Geographic region key, defaults to \"global\".","in":"query","name":"region","required":false,"schema":{"type":"string"}},{"description":"Current observed count to compare against baseline.","in":"query","name":"count","required":false,"schema":{"format":"double","type":"number"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetTemporalBaselineResponse"}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}},"description":"Validation error"},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error response"}},"summary":"GetTemporalBaseline","tags":["InfrastructureService"]}},"/api/infrastructure/v1/list-internet-ddos-attacks":{"get":{"description":"ListInternetDdosAttacks retrieves L3/L4 DDoS attack summaries from Cloudflare Radar.","operationId":"ListInternetDdosAttacks","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListInternetDdosAttacksResponse"}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}},"description":"Validation error"},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error response"}},"summary":"ListInternetDdosAttacks","tags":["InfrastructureService"]}},"/api/infrastructure/v1/list-internet-outages":{"get":{"description":"ListInternetOutages retrieves detected internet outages from Cloudflare Radar.","operationId":"ListInternetOutages","parameters":[{"description":"Start of time range (inclusive), Unix epoch milliseconds.","in":"query","name":"start","required":false,"schema":{"format":"int64","type":"string"}},{"description":"End of time range (inclusive), Unix epoch milliseconds.","in":"query","name":"end","required":false,"schema":{"format":"int64","type":"string"}},{"description":"Maximum items per page.","in":"query","name":"page_size","required":false,"schema":{"format":"int32","type":"integer"}},{"description":"Cursor for next page.","in":"query","name":"cursor","required":false,"schema":{"type":"string"}},{"description":"Optional country filter (ISO 3166-1 alpha-2).","in":"query","name":"country","required":false,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListInternetOutagesResponse"}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}},"description":"Validation error"},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error response"}},"summary":"ListInternetOutages","tags":["InfrastructureService"]}},"/api/infrastructure/v1/list-internet-traffic-anomalies":{"get":{"description":"ListInternetTrafficAnomalies retrieves traffic anomaly events from Cloudflare Radar.","operationId":"ListInternetTrafficAnomalies","parameters":[{"description":"Optional ISO 3166-1 alpha-2 country code filter.","in":"query","name":"country","required":false,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListInternetTrafficAnomaliesResponse"}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}},"description":"Validation error"},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error response"}},"summary":"ListInternetTrafficAnomalies","tags":["InfrastructureService"]}},"/api/infrastructure/v1/list-service-statuses":{"get":{"description":"ListServiceStatuses retrieves operational status of monitored external services.","operationId":"ListServiceStatuses","parameters":[{"description":"Optional status filter. Returns only services in this state.","in":"query","name":"status","required":false,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListServiceStatusesResponse"}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}},"description":"Validation error"},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error response"}},"summary":"ListServiceStatuses","tags":["InfrastructureService"]}},"/api/infrastructure/v1/list-temporal-anomalies":{"get":{"description":"ListTemporalAnomalies returns server-computed temporal anomalies for news and satellite_fires.","operationId":"ListTemporalAnomalies","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListTemporalAnomaliesResponse"}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}},"description":"Validation error"},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error response"}},"summary":"ListTemporalAnomalies","tags":["InfrastructureService"]}},"/api/infrastructure/v1/record-baseline-snapshot":{"post":{"description":"RecordBaselineSnapshot batch-updates baseline statistics using Welford's online algorithm.","operationId":"RecordBaselineSnapshot","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RecordBaselineSnapshotRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RecordBaselineSnapshotResponse"}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}},"description":"Validation error"},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error response"}},"summary":"RecordBaselineSnapshot","tags":["InfrastructureService"]}},"/api/infrastructure/v1/reverse-geocode":{"get":{"description":"ReverseGeocode resolves geographic coordinates to a postal address/country.","operationId":"ReverseGeocode","parameters":[{"in":"query","name":"lat","required":false,"schema":{"format":"double","type":"number"}},{"in":"query","name":"lon","required":false,"schema":{"format":"double","type":"number"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReverseGeocodeResponse"}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}},"description":"Validation error"},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error response"}},"summary":"ReverseGeocode","tags":["InfrastructureService"]}}}} \ No newline at end of file +{"components":{"schemas":{"BaselineAnomaly":{"description":"BaselineAnomaly describes a detected deviation from historical baseline.","properties":{"multiplier":{"description":"Ratio of current count to baseline mean.","format":"double","type":"number"},"severity":{"description":"Severity label: \"critical\", \"high\", \"medium\", \"normal\".","type":"string"},"zScore":{"description":"Number of standard deviations from the mean.","format":"double","type":"number"}},"type":"object"},"BaselineStats":{"description":"BaselineStats contains the running statistics for a baseline key.","properties":{"mean":{"description":"Running mean of observed counts.","format":"double","type":"number"},"sampleCount":{"description":"Number of samples incorporated so far.","format":"int32","type":"integer"},"stdDev":{"description":"Standard deviation derived from Welford's M2.","format":"double","type":"number"}},"type":"object"},"BaselineUpdate":{"description":"BaselineUpdate is a single metric observation to incorporate into the running baseline.","properties":{"count":{"description":"Observed count value.","format":"double","type":"number"},"region":{"description":"Geographic region key, defaults to \"global\".","type":"string"},"type":{"description":"Activity type key.","minLength":1,"type":"string"}},"required":["type"],"type":"object"},"CableHealthEvidence":{"description":"CableHealthEvidence represents a single piece of evidence supporting a health assessment.","properties":{"source":{"description":"Evidence source (e.g. \"NGA\").","type":"string"},"summary":{"description":"Human-readable summary of the evidence.","type":"string"},"ts":{"description":"Evidence timestamp, as Unix epoch milliseconds.. Warning: Values \u003e 2^53 may lose precision in JavaScript","format":"int64","type":"integer"}},"type":"object"},"CableHealthRecord":{"description":"CableHealthRecord contains the computed health status and supporting evidence for a cable.","properties":{"confidence":{"description":"Confidence in the health assessment (0.0–1.0).","format":"double","type":"number"},"evidence":{"items":{"$ref":"#/components/schemas/CableHealthEvidence"},"type":"array"},"lastUpdated":{"description":"Last signal update time, as Unix epoch milliseconds.. Warning: Values \u003e 2^53 may lose precision in JavaScript","format":"int64","type":"integer"},"score":{"description":"Composite health score (0.0 = healthy, 1.0 = confirmed fault).","format":"double","type":"number"},"status":{"description":"CableHealthStatus represents the computed health status of a submarine cable.","enum":["CABLE_HEALTH_STATUS_UNSPECIFIED","CABLE_HEALTH_STATUS_OK","CABLE_HEALTH_STATUS_DEGRADED","CABLE_HEALTH_STATUS_FAULT"],"type":"string"}},"type":"object"},"CablesEntry":{"properties":{"key":{"type":"string"},"value":{"$ref":"#/components/schemas/CableHealthRecord"}},"type":"object"},"DataEntry":{"properties":{"key":{"type":"string"},"value":{"type":"string"}},"type":"object"},"DdosAttackSummaryEntry":{"description":"DdosAttackSummaryEntry represents a single protocol or vector and its share of DDoS traffic.","properties":{"label":{"description":"Protocol or vector name (e.g. \"TCP\", \"UDP\", \"networkFlood\").","type":"string"},"percentage":{"description":"Percentage share of total DDoS traffic (0–100).","format":"float","type":"number"}},"type":"object"},"DdosLocationHit":{"description":"DdosLocationHit represents a top DDoS target location with geo coordinates.","properties":{"countryCode":{"description":"ISO 3166-1 alpha-2 country code.","type":"string"},"countryName":{"description":"Country display name.","type":"string"},"latitude":{"description":"Latitude of the target location.","format":"float","type":"number"},"longitude":{"description":"Longitude of the target location.","format":"float","type":"number"},"percentage":{"description":"Percentage share of total DDoS traffic targeting this location (0-100).","format":"float","type":"number"}},"type":"object"},"Error":{"description":"Error is returned when a handler encounters an error. It contains a simple error message that the developer can customize.","properties":{"message":{"description":"Error message (e.g., 'user not found', 'database connection failed')","type":"string"}},"type":"object"},"FieldViolation":{"description":"FieldViolation describes a single validation error for a specific field.","properties":{"description":{"description":"Human-readable description of the validation violation (e.g., 'must be a valid email address', 'required field missing')","type":"string"},"field":{"description":"The field path that failed validation (e.g., 'user.email' for nested fields). For header validation, this will be the header name (e.g., 'X-API-Key')","type":"string"}},"required":["field","description"],"type":"object"},"GeoCoordinates":{"description":"GeoCoordinates represents a geographic location using WGS84 coordinates.","properties":{"latitude":{"description":"Latitude in decimal degrees (-90 to 90).","format":"double","maximum":90,"minimum":-90,"type":"number"},"longitude":{"description":"Longitude in decimal degrees (-180 to 180).","format":"double","maximum":180,"minimum":-180,"type":"number"}},"type":"object"},"GetBootstrapDataRequest":{"description":"GetBootstrapDataRequest parameters for multi-key fetching.","properties":{"keys":{"items":{"type":"string"},"type":"array"},"tier":{"description":"Predefined tiers or specific keys.","type":"string"}},"type":"object"},"GetBootstrapDataResponse":{"description":"GetBootstrapDataResponse containing pooled data objects.","properties":{"data":{"additionalProperties":{"type":"string"},"description":"Map of keys to JSON-encoded data strings.","type":"object"},"missing":{"items":{"description":"List of keys that were not found in cache.","type":"string"},"type":"array"}},"type":"object"},"GetCableHealthRequest":{"description":"GetCableHealthRequest requests the current health status of all monitored submarine cables.","type":"object"},"GetCableHealthResponse":{"description":"GetCableHealthResponse contains health status for submarine cables with active signals.","properties":{"cables":{"additionalProperties":{"$ref":"#/components/schemas/CableHealthRecord"},"description":"Health records keyed by cable identifier.","type":"object"},"generatedAt":{"description":"Generation timestamp, as Unix epoch milliseconds.. Warning: Values \u003e 2^53 may lose precision in JavaScript","format":"int64","type":"integer"}},"type":"object"},"GetIpGeoRequest":{"description":"GetIpGeoRequest defined for future parameters (e.g., specific IP).","type":"object"},"GetIpGeoResponse":{"description":"GetIpGeoResponse contains geographic information derived from the request IP.","properties":{"city":{"type":"string"},"country":{"description":"ISO 3166-1 alpha-2 country code.","type":"string"},"region":{"description":"Region or city (if available).","type":"string"}},"type":"object"},"GetTemporalBaselineRequest":{"description":"GetTemporalBaselineRequest checks current activity count against stored baseline.","properties":{"count":{"description":"Current observed count to compare against baseline.","format":"double","type":"number"},"region":{"description":"Geographic region key, defaults to \"global\".","type":"string"},"type":{"description":"Activity type: \"military_flights\", \"vessels\", \"protests\", \"news\", \"ais_gaps\", \"satellite_fires\".","minLength":1,"type":"string"}},"required":["type"],"type":"object"},"GetTemporalBaselineResponse":{"description":"GetTemporalBaselineResponse returns anomaly info or learning status.","properties":{"anomaly":{"$ref":"#/components/schemas/BaselineAnomaly"},"baseline":{"$ref":"#/components/schemas/BaselineStats"},"error":{"description":"Error message if request was invalid.","type":"string"},"learning":{"description":"True if insufficient samples have been collected.","type":"boolean"},"sampleCount":{"description":"Current number of samples stored.","format":"int32","type":"integer"},"samplesNeeded":{"description":"Minimum samples required before anomaly detection activates.","format":"int32","type":"integer"}},"type":"object"},"InternetOutage":{"description":"InternetOutage represents a detected internet outage event from Cloudflare Radar.","properties":{"categories":{"items":{"description":"Affected infrastructure categories.","type":"string"},"type":"array"},"cause":{"description":"Root cause, if determined.","type":"string"},"country":{"description":"Affected country (ISO 3166-1 alpha-2).","type":"string"},"description":{"description":"Outage description.","type":"string"},"detectedAt":{"description":"Detection time, as Unix epoch milliseconds.. Warning: Values \u003e 2^53 may lose precision in JavaScript","format":"int64","type":"integer"},"endedAt":{"description":"End time of the outage, as Unix epoch milliseconds. Zero if ongoing.. Warning: Values \u003e 2^53 may lose precision in JavaScript","format":"int64","type":"integer"},"id":{"description":"Unique outage identifier.","minLength":1,"type":"string"},"link":{"description":"URL to the outage report.","type":"string"},"location":{"$ref":"#/components/schemas/GeoCoordinates"},"outageType":{"description":"Outage type classification.","type":"string"},"region":{"description":"Affected region within the country.","type":"string"},"severity":{"description":"OutageSeverity represents the severity of an internet outage.\n Maps to TS union: 'partial' | 'major' | 'total'.","enum":["OUTAGE_SEVERITY_UNSPECIFIED","OUTAGE_SEVERITY_PARTIAL","OUTAGE_SEVERITY_MAJOR","OUTAGE_SEVERITY_TOTAL"],"type":"string"},"title":{"description":"Outage title.","type":"string"}},"required":["id"],"type":"object"},"ListInternetDdosAttacksRequest":{"description":"ListInternetDdosAttacksRequest specifies filters for retrieving DDoS attack summaries.","type":"object"},"ListInternetDdosAttacksResponse":{"description":"ListInternetDdosAttacksResponse contains DDoS attack protocol and vector breakdowns.","properties":{"dateRangeEnd":{"description":"ISO 8601 end of the data window.","type":"string"},"dateRangeStart":{"description":"ISO 8601 start of the data window.","type":"string"},"protocol":{"items":{"$ref":"#/components/schemas/DdosAttackSummaryEntry"},"type":"array"},"topTargetLocations":{"items":{"$ref":"#/components/schemas/DdosLocationHit"},"type":"array"},"vector":{"items":{"$ref":"#/components/schemas/DdosAttackSummaryEntry"},"type":"array"}},"type":"object"},"ListInternetOutagesRequest":{"description":"ListInternetOutagesRequest specifies filters for retrieving internet outages.","properties":{"country":{"description":"Optional country filter (ISO 3166-1 alpha-2).","type":"string"},"cursor":{"description":"Cursor for next page.","type":"string"},"end":{"description":"End of time range (inclusive), Unix epoch milliseconds.. Warning: Values \u003e 2^53 may lose precision in JavaScript","format":"int64","type":"integer"},"pageSize":{"description":"Maximum items per page.","format":"int32","type":"integer"},"start":{"description":"Start of time range (inclusive), Unix epoch milliseconds.. Warning: Values \u003e 2^53 may lose precision in JavaScript","format":"int64","type":"integer"}},"type":"object"},"ListInternetOutagesResponse":{"description":"ListInternetOutagesResponse contains internet outages matching the request.","properties":{"outages":{"items":{"$ref":"#/components/schemas/InternetOutage"},"type":"array"},"pagination":{"$ref":"#/components/schemas/PaginationResponse"}},"type":"object"},"ListInternetTrafficAnomaliesRequest":{"description":"ListInternetTrafficAnomaliesRequest specifies filters for traffic anomalies.","properties":{"country":{"description":"Optional ISO 3166-1 alpha-2 country code filter.","type":"string"}},"type":"object"},"ListInternetTrafficAnomaliesResponse":{"description":"ListInternetTrafficAnomaliesResponse contains detected traffic anomalies.","properties":{"anomalies":{"items":{"$ref":"#/components/schemas/TrafficAnomaly"},"type":"array"},"totalCount":{"description":"Total anomaly count before filtering.","format":"int32","type":"integer"}},"type":"object"},"ListServiceStatusesRequest":{"description":"ListServiceStatusesRequest specifies filters for retrieving service statuses.","properties":{"status":{"description":"ServiceOperationalStatus represents the current status of a service.","enum":["SERVICE_OPERATIONAL_STATUS_UNSPECIFIED","SERVICE_OPERATIONAL_STATUS_OPERATIONAL","SERVICE_OPERATIONAL_STATUS_DEGRADED","SERVICE_OPERATIONAL_STATUS_PARTIAL_OUTAGE","SERVICE_OPERATIONAL_STATUS_MAJOR_OUTAGE","SERVICE_OPERATIONAL_STATUS_MAINTENANCE"],"type":"string"}},"type":"object"},"ListServiceStatusesResponse":{"description":"ListServiceStatusesResponse contains service operational statuses.","properties":{"statuses":{"items":{"$ref":"#/components/schemas/ServiceStatus"},"type":"array"}},"type":"object"},"ListTemporalAnomaliesRequest":{"type":"object"},"ListTemporalAnomaliesResponse":{"properties":{"anomalies":{"items":{"$ref":"#/components/schemas/TemporalAnomaly"},"type":"array"},"computedAt":{"type":"string"},"trackedTypes":{"items":{"type":"string"},"type":"array"}},"type":"object"},"PaginationResponse":{"description":"PaginationResponse contains pagination metadata returned alongside list results.","properties":{"nextCursor":{"description":"Cursor for fetching the next page. Empty string indicates no more pages.","type":"string"},"totalCount":{"description":"Total count of items matching the query, if known. Zero if the total is unknown.","format":"int32","type":"integer"}},"type":"object"},"RecordBaselineSnapshotRequest":{"description":"RecordBaselineSnapshotRequest batch-updates baselines using Welford's online algorithm.","properties":{"updates":{"items":{"$ref":"#/components/schemas/BaselineUpdate"},"type":"array"}},"type":"object"},"RecordBaselineSnapshotResponse":{"description":"RecordBaselineSnapshotResponse reports how many baselines were successfully updated.","properties":{"error":{"description":"Error message if the request was invalid.","type":"string"},"updated":{"description":"Number of baselines that were written.","format":"int32","type":"integer"}},"type":"object"},"ReverseGeocodeRequest":{"description":"ReverseGeocodeRequest parameters for coordinate-to-address lookups.","properties":{"lat":{"format":"double","type":"number"},"lon":{"format":"double","type":"number"}},"type":"object"},"ReverseGeocodeResponse":{"description":"ReverseGeocodeResponse containing the resolved location details.","properties":{"code":{"description":"ISO country code.","type":"string"},"country":{"description":"Human-readable country name.","type":"string"},"displayName":{"description":"Full display name/address.","type":"string"},"error":{"description":"Optional error message.","type":"string"}},"type":"object"},"ServiceStatus":{"description":"ServiceStatus represents the operational status of a monitored external service.","properties":{"checkedAt":{"description":"Last status check time, as Unix epoch milliseconds.. Warning: Values \u003e 2^53 may lose precision in JavaScript","format":"int64","type":"integer"},"description":{"description":"Status description.","type":"string"},"id":{"description":"Service identifier.","type":"string"},"latencyMs":{"description":"Response latency in milliseconds.","format":"int32","type":"integer"},"name":{"description":"Service display name.","type":"string"},"status":{"description":"ServiceOperationalStatus represents the current status of a service.","enum":["SERVICE_OPERATIONAL_STATUS_UNSPECIFIED","SERVICE_OPERATIONAL_STATUS_OPERATIONAL","SERVICE_OPERATIONAL_STATUS_DEGRADED","SERVICE_OPERATIONAL_STATUS_PARTIAL_OUTAGE","SERVICE_OPERATIONAL_STATUS_MAJOR_OUTAGE","SERVICE_OPERATIONAL_STATUS_MAINTENANCE"],"type":"string"},"url":{"description":"Service URL or homepage.","type":"string"}},"type":"object"},"TemporalAnomaly":{"properties":{"currentCount":{"format":"int32","type":"integer"},"expectedCount":{"format":"int32","type":"integer"},"message":{"type":"string"},"multiplier":{"format":"double","type":"number"},"region":{"type":"string"},"severity":{"type":"string"},"type":{"type":"string"},"zScore":{"format":"double","type":"number"}},"type":"object"},"TrafficAnomaly":{"description":"TrafficAnomaly represents an anomalous traffic pattern detected by Cloudflare Radar.","properties":{"asn":{"description":"Autonomous System Number affected.","type":"string"},"asnName":{"description":"ASN display name.","type":"string"},"endDate":{"description":"End of the anomaly, Unix epoch milliseconds. Zero if ongoing.. Warning: Values \u003e 2^53 may lose precision in JavaScript","format":"int64","type":"integer"},"latitude":{"description":"Latitude of the affected location.","format":"float","type":"number"},"locationCode":{"description":"ISO 3166-1 alpha-2 country code.","type":"string"},"locationName":{"description":"Country display name.","type":"string"},"longitude":{"description":"Longitude of the affected location.","format":"float","type":"number"},"startDate":{"description":"Start of the anomaly, Unix epoch milliseconds.. Warning: Values \u003e 2^53 may lose precision in JavaScript","format":"int64","type":"integer"},"status":{"description":"Current status (\"ONGOING\" or \"HISTORICAL\").","type":"string"},"type":{"description":"Anomaly type (e.g. \"ANOMALY_DNS\", \"ANOMALY_BGP\").","type":"string"},"uuid":{"description":"Unique identifier for the anomaly.","type":"string"}},"type":"object"},"ValidationError":{"description":"ValidationError is returned when request validation fails. It contains a list of field violations describing what went wrong.","properties":{"violations":{"description":"List of validation violations","items":{"$ref":"#/components/schemas/FieldViolation"},"type":"array"}},"required":["violations"],"type":"object"}}},"info":{"title":"InfrastructureService API","version":"1.0.0"},"openapi":"3.1.0","paths":{"/api/infrastructure/v1/get-bootstrap-data":{"get":{"description":"GetBootstrapData fetches multiple data points from the system cache in a single call.","operationId":"GetBootstrapData","parameters":[{"description":"Predefined tiers or specific keys.","in":"query","name":"tier","required":false,"schema":{"type":"string"}},{"explode":true,"in":"query","name":"keys","required":false,"schema":{"items":{"type":"string"},"type":"array"},"style":"form"}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetBootstrapDataResponse"}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}},"description":"Validation error"},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error response"}},"summary":"GetBootstrapData","tags":["InfrastructureService"]}},"/api/infrastructure/v1/get-cable-health":{"get":{"description":"GetCableHealth computes health status for submarine cables from NGA maritime warning signals.","operationId":"GetCableHealth","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetCableHealthResponse"}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}},"description":"Validation error"},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error response"}},"summary":"GetCableHealth","tags":["InfrastructureService"]}},"/api/infrastructure/v1/get-ip-geo":{"get":{"description":"GetIpGeo retrieves geographic information based on the caller's IP address.","operationId":"GetIpGeo","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetIpGeoResponse"}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}},"description":"Validation error"},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error response"}},"summary":"GetIpGeo","tags":["InfrastructureService"]}},"/api/infrastructure/v1/get-temporal-baseline":{"get":{"description":"GetTemporalBaseline retrieves historical baseline data for a specific signal.","operationId":"GetTemporalBaseline","parameters":[{"description":"Activity type: \"military_flights\", \"vessels\", \"protests\", \"news\", \"ais_gaps\", \"satellite_fires\".","in":"query","name":"type","required":false,"schema":{"type":"string"}},{"description":"Geographic region key, defaults to \"global\".","in":"query","name":"region","required":false,"schema":{"type":"string"}},{"description":"Current observed count to compare against baseline.","in":"query","name":"count","required":false,"schema":{"format":"double","type":"number"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetTemporalBaselineResponse"}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}},"description":"Validation error"},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error response"}},"summary":"GetTemporalBaseline","tags":["InfrastructureService"]}},"/api/infrastructure/v1/list-internet-ddos-attacks":{"get":{"description":"ListInternetDdosAttacks retrieves L3/L4 DDoS attack summaries from Cloudflare Radar.","operationId":"ListInternetDdosAttacks","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListInternetDdosAttacksResponse"}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}},"description":"Validation error"},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error response"}},"summary":"ListInternetDdosAttacks","tags":["InfrastructureService"]}},"/api/infrastructure/v1/list-internet-outages":{"get":{"description":"ListInternetOutages retrieves detected internet outages from Cloudflare Radar.","operationId":"ListInternetOutages","parameters":[{"description":"Start of time range (inclusive), Unix epoch milliseconds.","in":"query","name":"start","required":false,"schema":{"format":"int64","type":"string"}},{"description":"End of time range (inclusive), Unix epoch milliseconds.","in":"query","name":"end","required":false,"schema":{"format":"int64","type":"string"}},{"description":"Maximum items per page.","in":"query","name":"page_size","required":false,"schema":{"format":"int32","type":"integer"}},{"description":"Cursor for next page.","in":"query","name":"cursor","required":false,"schema":{"type":"string"}},{"description":"Optional country filter (ISO 3166-1 alpha-2).","in":"query","name":"country","required":false,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListInternetOutagesResponse"}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}},"description":"Validation error"},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error response"}},"summary":"ListInternetOutages","tags":["InfrastructureService"]}},"/api/infrastructure/v1/list-internet-traffic-anomalies":{"get":{"description":"ListInternetTrafficAnomalies retrieves traffic anomaly events from Cloudflare Radar.","operationId":"ListInternetTrafficAnomalies","parameters":[{"description":"Optional ISO 3166-1 alpha-2 country code filter.","in":"query","name":"country","required":false,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListInternetTrafficAnomaliesResponse"}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}},"description":"Validation error"},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error response"}},"summary":"ListInternetTrafficAnomalies","tags":["InfrastructureService"]}},"/api/infrastructure/v1/list-service-statuses":{"get":{"description":"ListServiceStatuses retrieves operational status of monitored external services.","operationId":"ListServiceStatuses","parameters":[{"description":"Optional status filter. Returns only services in this state.","in":"query","name":"status","required":false,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListServiceStatusesResponse"}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}},"description":"Validation error"},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error response"}},"summary":"ListServiceStatuses","tags":["InfrastructureService"]}},"/api/infrastructure/v1/list-temporal-anomalies":{"get":{"description":"ListTemporalAnomalies returns server-computed temporal anomalies for news and satellite_fires.","operationId":"ListTemporalAnomalies","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListTemporalAnomaliesResponse"}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}},"description":"Validation error"},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error response"}},"summary":"ListTemporalAnomalies","tags":["InfrastructureService"]}},"/api/infrastructure/v1/record-baseline-snapshot":{"post":{"description":"RecordBaselineSnapshot batch-updates baseline statistics using Welford's online algorithm.","operationId":"RecordBaselineSnapshot","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RecordBaselineSnapshotRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RecordBaselineSnapshotResponse"}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}},"description":"Validation error"},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error response"}},"summary":"RecordBaselineSnapshot","tags":["InfrastructureService"]}},"/api/infrastructure/v1/reverse-geocode":{"get":{"description":"ReverseGeocode resolves geographic coordinates to a postal address/country.","operationId":"ReverseGeocode","parameters":[{"in":"query","name":"lat","required":false,"schema":{"format":"double","type":"number"}},{"in":"query","name":"lon","required":false,"schema":{"format":"double","type":"number"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReverseGeocodeResponse"}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}},"description":"Validation error"},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error response"}},"summary":"ReverseGeocode","tags":["InfrastructureService"]}}}} \ No newline at end of file diff --git a/docs/api/InfrastructureService.openapi.yaml b/docs/api/InfrastructureService.openapi.yaml index 9323a88d1..735efd480 100644 --- a/docs/api/InfrastructureService.openapi.yaml +++ b/docs/api/InfrastructureService.openapi.yaml @@ -224,8 +224,12 @@ paths: - name: keys in: query required: false + style: form + explode: true schema: - type: string + type: array + items: + type: string responses: "200": description: Successful response diff --git a/docs/api/MarketService.openapi.json b/docs/api/MarketService.openapi.json index b8722e750..9eee6ed77 100644 --- a/docs/api/MarketService.openapi.json +++ b/docs/api/MarketService.openapi.json @@ -1 +1 @@ -{"components":{"schemas":{"AnalystConsensus":{"properties":{"buy":{"format":"int32","type":"integer"},"hold":{"format":"int32","type":"integer"},"period":{"type":"string"},"sell":{"format":"int32","type":"integer"},"strongBuy":{"format":"int32","type":"integer"},"strongSell":{"format":"int32","type":"integer"},"total":{"format":"int32","type":"integer"}},"type":"object"},"AnalyzeStockRequest":{"properties":{"includeNews":{"type":"boolean"},"name":{"maxLength":120,"type":"string"},"symbol":{"maxLength":32,"minLength":1,"type":"string"}},"required":["symbol"],"type":"object"},"AnalyzeStockResponse":{"properties":{"action":{"type":"string"},"analysisAt":{"description":"Warning: Values \u003e 2^53 may lose precision in JavaScript","format":"int64","type":"integer"},"analysisId":{"type":"string"},"analystConsensus":{"$ref":"#/components/schemas/AnalystConsensus"},"available":{"type":"boolean"},"biasMa10":{"format":"double","type":"number"},"biasMa20":{"format":"double","type":"number"},"biasMa5":{"format":"double","type":"number"},"bullishFactors":{"items":{"type":"string"},"type":"array"},"changePercent":{"format":"double","type":"number"},"confidence":{"type":"string"},"currency":{"type":"string"},"currentPrice":{"format":"double","type":"number"},"display":{"type":"string"},"dividendCagr":{"format":"double","type":"number"},"dividendFrequency":{"type":"string"},"dividendYield":{"format":"double","type":"number"},"engineVersion":{"type":"string"},"exDividendDate":{"description":"Warning: Values \u003e 2^53 may lose precision in JavaScript","format":"int64","type":"integer"},"fallback":{"type":"boolean"},"generatedAt":{"type":"string"},"headlines":{"items":{"$ref":"#/components/schemas/StockAnalysisHeadline"},"type":"array"},"ma10":{"format":"double","type":"number"},"ma20":{"format":"double","type":"number"},"ma5":{"format":"double","type":"number"},"ma60":{"format":"double","type":"number"},"macdBar":{"format":"double","type":"number"},"macdDea":{"format":"double","type":"number"},"macdDif":{"format":"double","type":"number"},"macdStatus":{"type":"string"},"model":{"type":"string"},"name":{"type":"string"},"newsSearched":{"type":"boolean"},"newsSummary":{"type":"string"},"payoutRatio":{"format":"double","type":"number"},"priceTarget":{"$ref":"#/components/schemas/PriceTarget"},"provider":{"type":"string"},"recentUpgrades":{"items":{"$ref":"#/components/schemas/UpgradeDowngrade"},"type":"array"},"resistanceLevels":{"items":{"format":"double","type":"number"},"type":"array"},"riskFactors":{"items":{"type":"string"},"type":"array"},"rsi12":{"format":"double","type":"number"},"rsiStatus":{"type":"string"},"signal":{"type":"string"},"signalScore":{"format":"double","type":"number"},"stopLoss":{"format":"double","type":"number"},"summary":{"type":"string"},"supportLevels":{"items":{"format":"double","type":"number"},"type":"array"},"symbol":{"type":"string"},"takeProfit":{"format":"double","type":"number"},"technicalSummary":{"type":"string"},"trailingAnnualDividendRate":{"format":"double","type":"number"},"trendStatus":{"type":"string"},"volumeRatio5d":{"format":"double","type":"number"},"volumeStatus":{"type":"string"},"whyNow":{"type":"string"}},"type":"object"},"BacktestStockEvaluation":{"properties":{"analysisAt":{"description":"Warning: Values \u003e 2^53 may lose precision in JavaScript","format":"int64","type":"integer"},"analysisId":{"type":"string"},"directionCorrect":{"type":"boolean"},"entryPrice":{"format":"double","type":"number"},"exitPrice":{"format":"double","type":"number"},"outcome":{"type":"string"},"signal":{"type":"string"},"signalScore":{"format":"double","type":"number"},"simulatedReturnPct":{"format":"double","type":"number"},"stopLoss":{"format":"double","type":"number"},"takeProfit":{"format":"double","type":"number"}},"type":"object"},"BacktestStockRequest":{"properties":{"evalWindowDays":{"format":"int32","maximum":30,"minimum":3,"type":"integer"},"name":{"maxLength":120,"type":"string"},"symbol":{"maxLength":32,"minLength":1,"type":"string"}},"required":["symbol"],"type":"object"},"BacktestStockResponse":{"properties":{"actionableEvaluations":{"format":"int32","type":"integer"},"available":{"type":"boolean"},"avgSimulatedReturnPct":{"format":"double","type":"number"},"cumulativeSimulatedReturnPct":{"format":"double","type":"number"},"currency":{"type":"string"},"directionAccuracy":{"format":"double","type":"number"},"display":{"type":"string"},"engineVersion":{"type":"string"},"evalWindowDays":{"format":"int32","type":"integer"},"evaluations":{"items":{"$ref":"#/components/schemas/BacktestStockEvaluation"},"type":"array"},"evaluationsRun":{"format":"int32","type":"integer"},"generatedAt":{"type":"string"},"latestSignal":{"type":"string"},"latestSignalScore":{"format":"double","type":"number"},"name":{"type":"string"},"summary":{"type":"string"},"symbol":{"type":"string"},"winRate":{"format":"double","type":"number"}},"type":"object"},"BreadthSnapshot":{"properties":{"date":{"type":"string"},"pctAbove200d":{"format":"double","type":"number"},"pctAbove20d":{"description":"Optional so a missing/failed Barchart reading serializes as JSON null\n instead of collapsing to 0, which would render identically to a real 0%\n reading (severe market dislocation with no S\u0026P stocks above SMA).","format":"double","type":"number"},"pctAbove50d":{"format":"double","type":"number"}},"type":"object"},"CommodityQuote":{"description":"CommodityQuote represents a commodity price quote from Yahoo Finance.","properties":{"change":{"description":"Percentage change from previous close.","format":"double","type":"number"},"display":{"description":"Display label.","type":"string"},"name":{"description":"Human-readable name.","type":"string"},"price":{"description":"Current price.","format":"double","type":"number"},"sparkline":{"items":{"description":"Sparkline data points.","format":"double","type":"number"},"type":"array"},"symbol":{"description":"Commodity symbol (e.g., \"CL=F\" for crude oil).","minLength":1,"type":"string"}},"required":["symbol"],"type":"object"},"CotInstrument":{"properties":{"assetManagerLong":{"format":"int64","type":"string"},"assetManagerShort":{"format":"int64","type":"string"},"code":{"type":"string"},"dealerLong":{"format":"int64","type":"string"},"dealerShort":{"format":"int64","type":"string"},"leveragedFundsLong":{"format":"int64","type":"string"},"leveragedFundsShort":{"format":"int64","type":"string"},"name":{"type":"string"},"netPct":{"format":"double","type":"number"},"reportDate":{"type":"string"}},"type":"object"},"CryptoQuote":{"description":"CryptoQuote represents a cryptocurrency quote from CoinGecko.","properties":{"change":{"description":"24-hour percentage change.","format":"double","type":"number"},"change7d":{"description":"7-day percentage change.","format":"double","type":"number"},"name":{"description":"Cryptocurrency name (e.g., \"Bitcoin\").","type":"string"},"price":{"description":"Current price in USD.","format":"double","type":"number"},"sparkline":{"items":{"description":"Sparkline data points (recent price history).","format":"double","type":"number"},"type":"array"},"symbol":{"description":"Ticker symbol (e.g., \"BTC\").","minLength":1,"type":"string"}},"required":["symbol"],"type":"object"},"CryptoSector":{"description":"CryptoSector represents performance data for a crypto market sector.","properties":{"change":{"description":"Average 24h percentage change across sector tokens.","format":"double","type":"number"},"id":{"description":"Sector identifier.","type":"string"},"name":{"description":"Sector display name.","type":"string"}},"type":"object"},"EarningsEntry":{"properties":{"company":{"type":"string"},"date":{"type":"string"},"epsActual":{"format":"double","type":"number"},"epsEstimate":{"format":"double","type":"number"},"hasActuals":{"type":"boolean"},"hour":{"type":"string"},"revenueActual":{"format":"double","type":"number"},"revenueEstimate":{"format":"double","type":"number"},"surpriseDirection":{"type":"string"},"symbol":{"type":"string"}},"type":"object"},"Error":{"description":"Error is returned when a handler encounters an error. It contains a simple error message that the developer can customize.","properties":{"message":{"description":"Error message (e.g., 'user not found', 'database connection failed')","type":"string"}},"type":"object"},"EtfFlow":{"description":"EtfFlow represents a single ETF with estimated flow data.","properties":{"avgVolume":{"description":"Average volume over prior days.. Warning: Values \u003e 2^53 may lose precision in JavaScript","format":"int64","type":"integer"},"direction":{"description":"Flow direction: \"inflow\", \"outflow\", or \"neutral\".","type":"string"},"estFlow":{"description":"Estimated dollar flow magnitude.. Warning: Values \u003e 2^53 may lose precision in JavaScript","format":"int64","type":"integer"},"issuer":{"description":"Fund issuer (e.g. \"BlackRock\").","type":"string"},"price":{"description":"Latest closing price.","format":"double","type":"number"},"priceChange":{"description":"Day-over-day price change percentage.","format":"double","type":"number"},"ticker":{"description":"Ticker symbol (e.g. \"IBIT\").","minLength":1,"type":"string"},"volume":{"description":"Latest daily volume.. Warning: Values \u003e 2^53 may lose precision in JavaScript","format":"int64","type":"integer"},"volumeRatio":{"description":"Volume ratio (latest / average).","format":"double","type":"number"}},"required":["ticker"],"type":"object"},"EtfFlowsSummary":{"description":"EtfFlowsSummary contains aggregate ETF flow stats.","properties":{"etfCount":{"description":"Number of ETFs with data.","format":"int32","type":"integer"},"inflowCount":{"description":"Number of ETFs with inflow.","format":"int32","type":"integer"},"netDirection":{"description":"Net direction: \"NET INFLOW\", \"NET OUTFLOW\", or \"NEUTRAL\".","type":"string"},"outflowCount":{"description":"Number of ETFs with outflow.","format":"int32","type":"integer"},"totalEstFlow":{"description":"Total estimated flow across all ETFs.. Warning: Values \u003e 2^53 may lose precision in JavaScript","format":"int64","type":"integer"},"totalVolume":{"description":"Total volume across all ETFs.. Warning: Values \u003e 2^53 may lose precision in JavaScript","format":"int64","type":"integer"}},"type":"object"},"FearGreedCategory":{"properties":{"contribution":{"format":"double","type":"number"},"degraded":{"type":"boolean"},"inputsJson":{"type":"string"},"score":{"format":"double","type":"number"},"weight":{"format":"double","type":"number"}},"type":"object"},"FearGreedSectorPerformance":{"properties":{"change1d":{"format":"double","type":"number"},"name":{"type":"string"},"symbol":{"type":"string"}},"type":"object"},"FieldViolation":{"description":"FieldViolation describes a single validation error for a specific field.","properties":{"description":{"description":"Human-readable description of the validation violation (e.g., 'must be a valid email address', 'required field missing')","type":"string"},"field":{"description":"The field path that failed validation (e.g., 'user.email' for nested fields). For header validation, this will be the header name (e.g., 'X-API-Key')","type":"string"}},"required":["field","description"],"type":"object"},"GetCotPositioningRequest":{"type":"object"},"GetCotPositioningResponse":{"properties":{"instruments":{"items":{"$ref":"#/components/schemas/CotInstrument"},"type":"array"},"reportDate":{"type":"string"},"unavailable":{"type":"boolean"}},"type":"object"},"GetCountryStockIndexRequest":{"description":"GetCountryStockIndexRequest specifies which country's stock index to retrieve.","properties":{"countryCode":{"description":"ISO 3166-1 alpha-2 country code (e.g., \"US\", \"GB\", \"JP\").","pattern":"^[A-Z]{2}$","type":"string"}},"required":["countryCode"],"type":"object"},"GetCountryStockIndexResponse":{"description":"GetCountryStockIndexResponse contains the country's primary stock index data.","properties":{"available":{"description":"Whether stock index data is available for this country.","type":"boolean"},"code":{"description":"ISO 3166-1 alpha-2 country code.","type":"string"},"currency":{"description":"Currency of the index.","type":"string"},"fetchedAt":{"description":"When the data was fetched (ISO 8601).","type":"string"},"indexName":{"description":"Index name (e.g., \"S\u0026P 500\").","type":"string"},"price":{"description":"Latest closing price.","format":"double","type":"number"},"symbol":{"description":"Ticker symbol (e.g., \"^GSPC\").","type":"string"},"weekChangePercent":{"description":"Weekly change percentage.","format":"double","type":"number"}},"type":"object"},"GetFearGreedIndexRequest":{"type":"object"},"GetFearGreedIndexResponse":{"properties":{"aaiiBear":{"format":"double","type":"number"},"aaiiBull":{"format":"double","type":"number"},"breadth":{"$ref":"#/components/schemas/FearGreedCategory"},"cnnFearGreed":{"format":"double","type":"number"},"cnnLabel":{"type":"string"},"compositeLabel":{"type":"string"},"compositeScore":{"format":"double","type":"number"},"credit":{"$ref":"#/components/schemas/FearGreedCategory"},"crossAsset":{"$ref":"#/components/schemas/FearGreedCategory"},"fedRate":{"type":"string"},"fsiLabel":{"type":"string"},"fsiValue":{"format":"double","type":"number"},"hySpread":{"format":"double","type":"number"},"hygPrice":{"format":"double","type":"number"},"liquidity":{"$ref":"#/components/schemas/FearGreedCategory"},"macro":{"$ref":"#/components/schemas/FearGreedCategory"},"momentum":{"$ref":"#/components/schemas/FearGreedCategory"},"pctAbove200d":{"format":"double","type":"number"},"positioning":{"$ref":"#/components/schemas/FearGreedCategory"},"previousScore":{"format":"double","type":"number"},"putCallRatio":{"format":"double","type":"number"},"sectorPerformance":{"items":{"$ref":"#/components/schemas/FearGreedSectorPerformance"},"type":"array"},"seededAt":{"type":"string"},"sentiment":{"$ref":"#/components/schemas/FearGreedCategory"},"tltPrice":{"format":"double","type":"number"},"trend":{"$ref":"#/components/schemas/FearGreedCategory"},"unavailable":{"type":"boolean"},"vix":{"format":"double","type":"number"},"volatility":{"$ref":"#/components/schemas/FearGreedCategory"},"yield10y":{"format":"double","type":"number"}},"type":"object"},"GetGoldIntelligenceRequest":{"type":"object"},"GetGoldIntelligenceResponse":{"properties":{"cbReserves":{"$ref":"#/components/schemas/GoldCbReserves"},"cot":{"$ref":"#/components/schemas/GoldCotPositioning"},"crossCurrencyPrices":{"items":{"$ref":"#/components/schemas/GoldCrossCurrencyPrice"},"type":"array"},"drivers":{"items":{"$ref":"#/components/schemas/GoldDriver"},"type":"array"},"etfFlows":{"$ref":"#/components/schemas/GoldEtfFlows"},"goldChangePct":{"format":"double","type":"number"},"goldPlatinumPremiumPct":{"format":"double","type":"number"},"goldPrice":{"format":"double","type":"number"},"goldSilverRatio":{"format":"double","type":"number"},"goldSparkline":{"items":{"format":"double","type":"number"},"type":"array"},"palladiumPrice":{"format":"double","type":"number"},"platinumPrice":{"format":"double","type":"number"},"range52w":{"$ref":"#/components/schemas/GoldRange52w"},"returns":{"$ref":"#/components/schemas/GoldReturns"},"session":{"$ref":"#/components/schemas/GoldSessionRange"},"silverPrice":{"format":"double","type":"number"},"unavailable":{"type":"boolean"},"updatedAt":{"type":"string"}},"type":"object"},"GetHyperliquidFlowRequest":{"type":"object"},"GetHyperliquidFlowResponse":{"properties":{"assetCount":{"format":"int32","type":"integer"},"assets":{"items":{"$ref":"#/components/schemas/HyperliquidAssetFlow"},"type":"array"},"fetchedAt":{"type":"string"},"ts":{"format":"int64","type":"string"},"unavailable":{"type":"boolean"},"warmup":{"type":"boolean"}},"type":"object"},"GetInsiderTransactionsRequest":{"properties":{"symbol":{"maxLength":32,"minLength":1,"type":"string"}},"required":["symbol"],"type":"object"},"GetInsiderTransactionsResponse":{"properties":{"fetchedAt":{"type":"string"},"netValue":{"format":"double","type":"number"},"symbol":{"type":"string"},"totalBuys":{"format":"double","type":"number"},"totalSells":{"format":"double","type":"number"},"transactions":{"items":{"$ref":"#/components/schemas/InsiderTransaction"},"type":"array"},"unavailable":{"type":"boolean"}},"type":"object"},"GetMarketBreadthHistoryRequest":{"type":"object"},"GetMarketBreadthHistoryResponse":{"properties":{"currentPctAbove200d":{"format":"double","type":"number"},"currentPctAbove20d":{"format":"double","type":"number"},"currentPctAbove50d":{"format":"double","type":"number"},"history":{"items":{"$ref":"#/components/schemas/BreadthSnapshot"},"type":"array"},"unavailable":{"type":"boolean"},"updatedAt":{"type":"string"}},"type":"object"},"GetSectorSummaryRequest":{"description":"GetSectorSummaryRequest specifies parameters for retrieving sector performance.","properties":{"period":{"description":"Time period for performance calculation (e.g., \"1d\", \"1w\", \"1m\"). Defaults to \"1d\".","type":"string"}},"type":"object"},"GetSectorSummaryResponse":{"description":"GetSectorSummaryResponse contains sector performance data.","properties":{"sectors":{"items":{"$ref":"#/components/schemas/SectorPerformance"},"type":"array"}},"type":"object"},"GetStockAnalysisHistoryRequest":{"properties":{"includeNews":{"type":"boolean"},"limitPerSymbol":{"format":"int32","maximum":32,"minimum":1,"type":"integer"},"symbols":{"items":{"type":"string"},"type":"array"}},"type":"object"},"GetStockAnalysisHistoryResponse":{"properties":{"items":{"items":{"$ref":"#/components/schemas/StockAnalysisHistoryItem"},"type":"array"}},"type":"object"},"GoldCbHolder":{"properties":{"iso3":{"type":"string"},"name":{"type":"string"},"pctOfReserves":{"format":"double","type":"number"},"tonnes":{"format":"double","type":"number"}},"type":"object"},"GoldCbMover":{"properties":{"deltaTonnes12m":{"format":"double","type":"number"},"iso3":{"type":"string"},"name":{"type":"string"}},"type":"object"},"GoldCbReserves":{"properties":{"asOfMonth":{"type":"string"},"topBuyers12m":{"items":{"$ref":"#/components/schemas/GoldCbMover"},"type":"array"},"topHolders":{"items":{"$ref":"#/components/schemas/GoldCbHolder"},"type":"array"},"topSellers12m":{"items":{"$ref":"#/components/schemas/GoldCbMover"},"type":"array"},"totalTonnes":{"format":"double","type":"number"}},"type":"object"},"GoldCotCategory":{"properties":{"longPositions":{"format":"int64","type":"string"},"netPct":{"format":"double","type":"number"},"oiSharePct":{"format":"double","type":"number"},"shortPositions":{"format":"int64","type":"string"},"wowNetDelta":{"format":"int64","type":"string"}},"type":"object"},"GoldCotPositioning":{"properties":{"managedMoney":{"$ref":"#/components/schemas/GoldCotCategory"},"nextReleaseDate":{"type":"string"},"openInterest":{"format":"int64","type":"string"},"producerSwap":{"$ref":"#/components/schemas/GoldCotCategory"},"reportDate":{"type":"string"}},"type":"object"},"GoldCrossCurrencyPrice":{"properties":{"currency":{"type":"string"},"flag":{"type":"string"},"price":{"format":"double","type":"number"}},"type":"object"},"GoldDriver":{"properties":{"changePct":{"format":"double","type":"number"},"correlation30d":{"format":"double","type":"number"},"label":{"type":"string"},"symbol":{"type":"string"},"value":{"format":"double","type":"number"}},"type":"object"},"GoldEtfFlows":{"properties":{"asOfDate":{"type":"string"},"aumUsd":{"format":"double","type":"number"},"changeM1Pct":{"format":"double","type":"number"},"changeM1Tonnes":{"format":"double","type":"number"},"changeW1Pct":{"format":"double","type":"number"},"changeW1Tonnes":{"format":"double","type":"number"},"changeY1Pct":{"format":"double","type":"number"},"changeY1Tonnes":{"format":"double","type":"number"},"nav":{"format":"double","type":"number"},"sparkline90d":{"items":{"format":"double","type":"number"},"type":"array"},"tonnes":{"format":"double","type":"number"}},"type":"object"},"GoldRange52w":{"properties":{"hi":{"format":"double","type":"number"},"lo":{"format":"double","type":"number"},"positionPct":{"format":"double","type":"number"}},"type":"object"},"GoldReturns":{"properties":{"m1":{"format":"double","type":"number"},"w1":{"format":"double","type":"number"},"y1":{"format":"double","type":"number"},"ytd":{"format":"double","type":"number"}},"type":"object"},"GoldSessionRange":{"properties":{"dayHigh":{"format":"double","type":"number"},"dayLow":{"format":"double","type":"number"},"prevClose":{"format":"double","type":"number"}},"type":"object"},"GulfQuote":{"description":"GulfQuote represents a Gulf region market quote (index, currency, or oil).","properties":{"change":{"format":"double","type":"number"},"country":{"type":"string"},"flag":{"type":"string"},"name":{"type":"string"},"price":{"format":"double","type":"number"},"sparkline":{"items":{"format":"double","type":"number"},"type":"array"},"symbol":{"type":"string"},"type":{"type":"string"}},"type":"object"},"HyperliquidAssetFlow":{"properties":{"alerts":{"items":{"type":"string"},"type":"array"},"assetClass":{"type":"string"},"basisScore":{"format":"double","type":"number"},"composite":{"format":"double","type":"number"},"dayNotional":{"type":"string"},"display":{"type":"string"},"funding":{"description":"Raw metrics (nullable as strings to preserve precision; \"\" = unavailable)","type":"string"},"fundingScore":{"description":"Component scores 0-100","format":"double","type":"number"},"group":{"type":"string"},"markPx":{"type":"string"},"missingPolls":{"format":"int32","type":"integer"},"oiScore":{"format":"double","type":"number"},"openInterest":{"type":"string"},"oraclePx":{"type":"string"},"sparkFunding":{"items":{"description":"Sparkline arrays (most recent last); up to 60 samples (5h @ 5min)","format":"double","type":"number"},"type":"array"},"sparkOi":{"items":{"format":"double","type":"number"},"type":"array"},"sparkScore":{"items":{"format":"double","type":"number"},"type":"array"},"stale":{"type":"boolean"},"staleSince":{"format":"int64","type":"string"},"symbol":{"type":"string"},"volumeScore":{"format":"double","type":"number"},"warmup":{"description":"State flags","type":"boolean"}},"type":"object"},"InsiderTransaction":{"properties":{"name":{"type":"string"},"shares":{"description":"Warning: Values \u003e 2^53 may lose precision in JavaScript","format":"int64","type":"integer"},"transactionCode":{"type":"string"},"transactionDate":{"type":"string"},"value":{"format":"double","type":"number"}},"type":"object"},"ListAiTokensRequest":{"description":"ListAiTokensRequest retrieves AI crypto token prices.","type":"object"},"ListAiTokensResponse":{"description":"ListAiTokensResponse contains AI token price data.","properties":{"tokens":{"items":{"$ref":"#/components/schemas/CryptoQuote"},"type":"array"}},"type":"object"},"ListCommodityQuotesRequest":{"description":"ListCommodityQuotesRequest specifies which commodities to retrieve.","properties":{"symbols":{"items":{"description":"Commodity symbols to retrieve (Yahoo symbols). Empty returns defaults.","type":"string"},"type":"array"}},"type":"object"},"ListCommodityQuotesResponse":{"description":"ListCommodityQuotesResponse contains commodity quotes.","properties":{"quotes":{"items":{"$ref":"#/components/schemas/CommodityQuote"},"type":"array"}},"type":"object"},"ListCryptoQuotesRequest":{"description":"ListCryptoQuotesRequest specifies which cryptocurrencies to retrieve.","properties":{"ids":{"items":{"description":"Cryptocurrency IDs to retrieve (CoinGecko IDs). Empty returns defaults.","type":"string"},"type":"array"}},"type":"object"},"ListCryptoQuotesResponse":{"description":"ListCryptoQuotesResponse contains cryptocurrency quotes.","properties":{"quotes":{"items":{"$ref":"#/components/schemas/CryptoQuote"},"type":"array"}},"type":"object"},"ListCryptoSectorsRequest":{"description":"ListCryptoSectorsRequest retrieves crypto sector performance.","type":"object"},"ListCryptoSectorsResponse":{"description":"ListCryptoSectorsResponse contains crypto sector performance data.","properties":{"sectors":{"items":{"$ref":"#/components/schemas/CryptoSector"},"type":"array"}},"type":"object"},"ListDefiTokensRequest":{"description":"ListDefiTokensRequest retrieves DeFi token prices.","type":"object"},"ListDefiTokensResponse":{"description":"ListDefiTokensResponse contains DeFi token price data.","properties":{"tokens":{"items":{"$ref":"#/components/schemas/CryptoQuote"},"type":"array"}},"type":"object"},"ListEarningsCalendarRequest":{"properties":{"fromDate":{"type":"string"},"toDate":{"type":"string"}},"type":"object"},"ListEarningsCalendarResponse":{"properties":{"earnings":{"items":{"$ref":"#/components/schemas/EarningsEntry"},"type":"array"},"fromDate":{"type":"string"},"toDate":{"type":"string"},"total":{"format":"int32","type":"integer"},"unavailable":{"type":"boolean"}},"type":"object"},"ListEtfFlowsRequest":{"description":"ListEtfFlowsRequest is empty; the handler uses a fixed list of BTC spot ETFs.","type":"object"},"ListEtfFlowsResponse":{"description":"ListEtfFlowsResponse contains BTC spot ETF flow data.","properties":{"etfs":{"items":{"$ref":"#/components/schemas/EtfFlow"},"type":"array"},"rateLimited":{"description":"True when the upstream API rate-limited the request.","type":"boolean"},"summary":{"$ref":"#/components/schemas/EtfFlowsSummary"},"timestamp":{"description":"Timestamp of the data fetch (ISO 8601).","type":"string"}},"type":"object"},"ListGulfQuotesRequest":{"type":"object"},"ListGulfQuotesResponse":{"properties":{"quotes":{"items":{"$ref":"#/components/schemas/GulfQuote"},"type":"array"},"rateLimited":{"type":"boolean"}},"type":"object"},"ListMarketQuotesRequest":{"description":"ListMarketQuotesRequest specifies which stock/index symbols to retrieve.","properties":{"symbols":{"items":{"description":"Ticker symbols to retrieve (e.g., [\"AAPL\", \"^GSPC\"]). Empty returns defaults.","type":"string"},"type":"array"}},"type":"object"},"ListMarketQuotesResponse":{"description":"ListMarketQuotesResponse contains stock and index quotes.","properties":{"finnhubSkipped":{"description":"True when the Finnhub API key is not configured and stock quotes were skipped.","type":"boolean"},"quotes":{"items":{"$ref":"#/components/schemas/MarketQuote"},"type":"array"},"rateLimited":{"description":"True when the upstream API rate-limited the request.","type":"boolean"},"skipReason":{"description":"Human-readable reason when Finnhub was skipped (e.g., \"FINNHUB_API_KEY not configured\").","type":"string"}},"type":"object"},"ListOtherTokensRequest":{"description":"ListOtherTokensRequest retrieves other/trending crypto token prices.","type":"object"},"ListOtherTokensResponse":{"description":"ListOtherTokensResponse contains other token price data.","properties":{"tokens":{"items":{"$ref":"#/components/schemas/CryptoQuote"},"type":"array"}},"type":"object"},"ListStablecoinMarketsRequest":{"description":"ListStablecoinMarketsRequest specifies which stablecoins to retrieve.","properties":{"coins":{"items":{"description":"CoinGecko IDs to retrieve (e.g. \"tether,usd-coin\"). Empty returns defaults.","type":"string"},"type":"array"}},"type":"object"},"ListStablecoinMarketsResponse":{"description":"ListStablecoinMarketsResponse contains stablecoin market data.","properties":{"stablecoins":{"items":{"$ref":"#/components/schemas/Stablecoin"},"type":"array"},"summary":{"$ref":"#/components/schemas/StablecoinSummary"},"timestamp":{"description":"Timestamp of the data fetch (ISO 8601).","type":"string"}},"type":"object"},"ListStoredStockBacktestsRequest":{"properties":{"evalWindowDays":{"format":"int32","maximum":30,"minimum":3,"type":"integer"},"symbols":{"items":{"type":"string"},"type":"array"}},"type":"object"},"ListStoredStockBacktestsResponse":{"properties":{"items":{"items":{"$ref":"#/components/schemas/BacktestStockResponse"},"type":"array"}},"type":"object"},"MarketQuote":{"description":"MarketQuote represents a stock or index quote from Finnhub or Yahoo Finance.","properties":{"change":{"description":"Percentage change from previous close.","format":"double","type":"number"},"display":{"description":"Display label.","type":"string"},"name":{"description":"Human-readable name.","type":"string"},"price":{"description":"Current price.","format":"double","type":"number"},"sparkline":{"items":{"description":"Sparkline data points (recent price history).","format":"double","type":"number"},"type":"array"},"symbol":{"description":"Ticker symbol (e.g., \"AAPL\", \"^GSPC\").","minLength":1,"type":"string"}},"required":["symbol"],"type":"object"},"PriceTarget":{"properties":{"current":{"format":"double","type":"number"},"high":{"format":"double","type":"number"},"low":{"format":"double","type":"number"},"mean":{"format":"double","type":"number"},"median":{"format":"double","type":"number"},"numberOfAnalysts":{"format":"int32","type":"integer"}},"type":"object"},"SectorPerformance":{"description":"SectorPerformance represents performance data for a market sector.","properties":{"change":{"description":"Percentage change over the measured period.","format":"double","type":"number"},"name":{"description":"Sector name.","type":"string"},"symbol":{"description":"Sector symbol.","minLength":1,"type":"string"}},"required":["symbol"],"type":"object"},"Stablecoin":{"description":"Stablecoin represents a single stablecoin with peg health data.","properties":{"change24h":{"description":"24-hour price change percentage.","format":"double","type":"number"},"change7d":{"description":"7-day price change percentage.","format":"double","type":"number"},"deviation":{"description":"Deviation from $1.00 peg, as a percentage.","format":"double","type":"number"},"id":{"description":"CoinGecko ID.","minLength":1,"type":"string"},"image":{"description":"Coin image URL.","type":"string"},"marketCap":{"description":"Market capitalization in USD.","format":"double","type":"number"},"name":{"description":"Human-readable name.","type":"string"},"pegStatus":{"description":"Peg status: \"ON PEG\", \"SLIGHT DEPEG\", or \"DEPEGGED\".","type":"string"},"price":{"description":"Current price in USD.","format":"double","minimum":0,"type":"number"},"symbol":{"description":"Ticker symbol (e.g. \"USDT\").","minLength":1,"type":"string"},"volume24h":{"description":"24-hour trading volume in USD.","format":"double","type":"number"}},"required":["id","symbol"],"type":"object"},"StablecoinSummary":{"description":"StablecoinSummary contains aggregate stablecoin market stats.","properties":{"coinCount":{"description":"Number of stablecoins returned.","format":"int32","type":"integer"},"depeggedCount":{"description":"Number of stablecoins in DEPEGGED state.","format":"int32","type":"integer"},"healthStatus":{"description":"Overall health: \"HEALTHY\", \"CAUTION\", or \"WARNING\".","type":"string"},"totalMarketCap":{"description":"Total market cap across all queried stablecoins.","format":"double","type":"number"},"totalVolume24h":{"description":"Total 24h volume across all queried stablecoins.","format":"double","type":"number"}},"type":"object"},"StockAnalysisHeadline":{"properties":{"link":{"type":"string"},"publishedAt":{"description":"Warning: Values \u003e 2^53 may lose precision in JavaScript","format":"int64","type":"integer"},"source":{"type":"string"},"title":{"type":"string"}},"type":"object"},"StockAnalysisHistoryItem":{"properties":{"snapshots":{"items":{"$ref":"#/components/schemas/AnalyzeStockResponse"},"type":"array"},"symbol":{"type":"string"}},"type":"object"},"UpgradeDowngrade":{"properties":{"action":{"type":"string"},"epochGradeDate":{"description":"Warning: Values \u003e 2^53 may lose precision in JavaScript","format":"int64","type":"integer"},"firm":{"type":"string"},"fromGrade":{"type":"string"},"toGrade":{"type":"string"}},"type":"object"},"ValidationError":{"description":"ValidationError is returned when request validation fails. It contains a list of field violations describing what went wrong.","properties":{"violations":{"description":"List of validation violations","items":{"$ref":"#/components/schemas/FieldViolation"},"type":"array"}},"required":["violations"],"type":"object"}}},"info":{"title":"MarketService API","version":"1.0.0"},"openapi":"3.1.0","paths":{"/api/market/v1/analyze-stock":{"get":{"description":"AnalyzeStock retrieves a premium stock analysis report with technicals, news, and AI synthesis.","operationId":"AnalyzeStock","parameters":[{"in":"query","name":"symbol","required":false,"schema":{"type":"string"}},{"in":"query","name":"name","required":false,"schema":{"type":"string"}},{"in":"query","name":"include_news","required":false,"schema":{"type":"boolean"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnalyzeStockResponse"}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}},"description":"Validation error"},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error response"}},"summary":"AnalyzeStock","tags":["MarketService"]}},"/api/market/v1/backtest-stock":{"get":{"description":"BacktestStock replays premium stock-analysis signals over recent price history.","operationId":"BacktestStock","parameters":[{"in":"query","name":"symbol","required":false,"schema":{"type":"string"}},{"in":"query","name":"name","required":false,"schema":{"type":"string"}},{"in":"query","name":"eval_window_days","required":false,"schema":{"format":"int32","type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BacktestStockResponse"}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}},"description":"Validation error"},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error response"}},"summary":"BacktestStock","tags":["MarketService"]}},"/api/market/v1/get-cot-positioning":{"get":{"description":"GetCotPositioning retrieves CFTC COT institutional positioning data.","operationId":"GetCotPositioning","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetCotPositioningResponse"}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}},"description":"Validation error"},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error response"}},"summary":"GetCotPositioning","tags":["MarketService"]}},"/api/market/v1/get-country-stock-index":{"get":{"description":"GetCountryStockIndex retrieves the primary stock index for a country from Yahoo Finance.","operationId":"GetCountryStockIndex","parameters":[{"description":"ISO 3166-1 alpha-2 country code (e.g., \"US\", \"GB\", \"JP\").","in":"query","name":"country_code","required":false,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetCountryStockIndexResponse"}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}},"description":"Validation error"},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error response"}},"summary":"GetCountryStockIndex","tags":["MarketService"]}},"/api/market/v1/get-fear-greed-index":{"get":{"description":"GetFearGreedIndex retrieves the composite Fear \u0026 Greed sentiment index.","operationId":"GetFearGreedIndex","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetFearGreedIndexResponse"}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}},"description":"Validation error"},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error response"}},"summary":"GetFearGreedIndex","tags":["MarketService"]}},"/api/market/v1/get-gold-intelligence":{"get":{"description":"GetGoldIntelligence retrieves gold pricing, cross-currency XAU, ratios, and CFTC positioning.","operationId":"GetGoldIntelligence","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetGoldIntelligenceResponse"}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}},"description":"Validation error"},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error response"}},"summary":"GetGoldIntelligence","tags":["MarketService"]}},"/api/market/v1/get-hyperliquid-flow":{"get":{"description":"GetHyperliquidFlow retrieves Hyperliquid perp positioning flow (funding/OI/basis composite scores).","operationId":"GetHyperliquidFlow","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetHyperliquidFlowResponse"}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}},"description":"Validation error"},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error response"}},"summary":"GetHyperliquidFlow","tags":["MarketService"]}},"/api/market/v1/get-insider-transactions":{"get":{"description":"GetInsiderTransactions retrieves SEC insider buy/sell activity from Finnhub.","operationId":"GetInsiderTransactions","parameters":[{"in":"query","name":"symbol","required":false,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetInsiderTransactionsResponse"}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}},"description":"Validation error"},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error response"}},"summary":"GetInsiderTransactions","tags":["MarketService"]}},"/api/market/v1/get-market-breadth-history":{"get":{"description":"GetMarketBreadthHistory retrieves historical % of S\u0026P 500 stocks above 20/50/200-day SMAs.","operationId":"GetMarketBreadthHistory","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetMarketBreadthHistoryResponse"}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}},"description":"Validation error"},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error response"}},"summary":"GetMarketBreadthHistory","tags":["MarketService"]}},"/api/market/v1/get-sector-summary":{"get":{"description":"GetSectorSummary retrieves market sector performance data from Finnhub.","operationId":"GetSectorSummary","parameters":[{"description":"Time period for performance calculation (e.g., \"1d\", \"1w\", \"1m\"). Defaults to \"1d\".","in":"query","name":"period","required":false,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetSectorSummaryResponse"}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}},"description":"Validation error"},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error response"}},"summary":"GetSectorSummary","tags":["MarketService"]}},"/api/market/v1/get-stock-analysis-history":{"get":{"description":"GetStockAnalysisHistory retrieves shared premium stock analysis history from the backend store.","operationId":"GetStockAnalysisHistory","parameters":[{"in":"query","name":"symbols","required":false,"schema":{"type":"string"}},{"in":"query","name":"limit_per_symbol","required":false,"schema":{"format":"int32","type":"integer"}},{"in":"query","name":"include_news","required":false,"schema":{"type":"boolean"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetStockAnalysisHistoryResponse"}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}},"description":"Validation error"},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error response"}},"summary":"GetStockAnalysisHistory","tags":["MarketService"]}},"/api/market/v1/list-ai-tokens":{"get":{"description":"ListAiTokens retrieves AI-focused crypto token prices and changes.","operationId":"ListAiTokens","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListAiTokensResponse"}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}},"description":"Validation error"},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error response"}},"summary":"ListAiTokens","tags":["MarketService"]}},"/api/market/v1/list-commodity-quotes":{"get":{"description":"ListCommodityQuotes retrieves commodity price quotes from Yahoo Finance.","operationId":"ListCommodityQuotes","parameters":[{"description":"Commodity symbols to retrieve (Yahoo symbols). Empty returns defaults.","in":"query","name":"symbols","required":false,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListCommodityQuotesResponse"}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}},"description":"Validation error"},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error response"}},"summary":"ListCommodityQuotes","tags":["MarketService"]}},"/api/market/v1/list-crypto-quotes":{"get":{"description":"ListCryptoQuotes retrieves cryptocurrency quotes from CoinGecko.","operationId":"ListCryptoQuotes","parameters":[{"description":"Cryptocurrency IDs to retrieve (CoinGecko IDs). Empty returns defaults.","in":"query","name":"ids","required":false,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListCryptoQuotesResponse"}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}},"description":"Validation error"},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error response"}},"summary":"ListCryptoQuotes","tags":["MarketService"]}},"/api/market/v1/list-crypto-sectors":{"get":{"description":"ListCryptoSectors retrieves crypto sector performance averages.","operationId":"ListCryptoSectors","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListCryptoSectorsResponse"}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}},"description":"Validation error"},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error response"}},"summary":"ListCryptoSectors","tags":["MarketService"]}},"/api/market/v1/list-defi-tokens":{"get":{"description":"ListDefiTokens retrieves DeFi token prices and changes.","operationId":"ListDefiTokens","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListDefiTokensResponse"}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}},"description":"Validation error"},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error response"}},"summary":"ListDefiTokens","tags":["MarketService"]}},"/api/market/v1/list-earnings-calendar":{"get":{"description":"ListEarningsCalendar retrieves upcoming and recent earnings releases.","operationId":"ListEarningsCalendar","parameters":[{"in":"query","name":"fromDate","required":false,"schema":{"type":"string"}},{"in":"query","name":"toDate","required":false,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListEarningsCalendarResponse"}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}},"description":"Validation error"},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error response"}},"summary":"ListEarningsCalendar","tags":["MarketService"]}},"/api/market/v1/list-etf-flows":{"get":{"description":"ListEtfFlows retrieves BTC spot ETF flow estimates from Yahoo Finance.","operationId":"ListEtfFlows","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListEtfFlowsResponse"}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}},"description":"Validation error"},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error response"}},"summary":"ListEtfFlows","tags":["MarketService"]}},"/api/market/v1/list-gulf-quotes":{"get":{"description":"ListGulfQuotes retrieves Gulf region market quotes (indices, currencies, oil).","operationId":"ListGulfQuotes","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListGulfQuotesResponse"}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}},"description":"Validation error"},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error response"}},"summary":"ListGulfQuotes","tags":["MarketService"]}},"/api/market/v1/list-market-quotes":{"get":{"description":"ListMarketQuotes retrieves stock and index quotes.","operationId":"ListMarketQuotes","parameters":[{"description":"Ticker symbols to retrieve (e.g., [\"AAPL\", \"^GSPC\"]). Empty returns defaults.","in":"query","name":"symbols","required":false,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListMarketQuotesResponse"}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}},"description":"Validation error"},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error response"}},"summary":"ListMarketQuotes","tags":["MarketService"]}},"/api/market/v1/list-other-tokens":{"get":{"description":"ListOtherTokens retrieves other/trending crypto token prices and changes.","operationId":"ListOtherTokens","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListOtherTokensResponse"}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}},"description":"Validation error"},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error response"}},"summary":"ListOtherTokens","tags":["MarketService"]}},"/api/market/v1/list-stablecoin-markets":{"get":{"description":"ListStablecoinMarkets retrieves stablecoin peg health and market data from CoinGecko.","operationId":"ListStablecoinMarkets","parameters":[{"description":"CoinGecko IDs to retrieve (e.g. \"tether,usd-coin\"). Empty returns defaults.","in":"query","name":"coins","required":false,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListStablecoinMarketsResponse"}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}},"description":"Validation error"},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error response"}},"summary":"ListStablecoinMarkets","tags":["MarketService"]}},"/api/market/v1/list-stored-stock-backtests":{"get":{"description":"ListStoredStockBacktests retrieves stored premium backtest snapshots from the backend store.","operationId":"ListStoredStockBacktests","parameters":[{"in":"query","name":"symbols","required":false,"schema":{"type":"string"}},{"in":"query","name":"eval_window_days","required":false,"schema":{"format":"int32","type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListStoredStockBacktestsResponse"}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}},"description":"Validation error"},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error response"}},"summary":"ListStoredStockBacktests","tags":["MarketService"]}}}} \ No newline at end of file +{"components":{"schemas":{"AnalystConsensus":{"properties":{"buy":{"format":"int32","type":"integer"},"hold":{"format":"int32","type":"integer"},"period":{"type":"string"},"sell":{"format":"int32","type":"integer"},"strongBuy":{"format":"int32","type":"integer"},"strongSell":{"format":"int32","type":"integer"},"total":{"format":"int32","type":"integer"}},"type":"object"},"AnalyzeStockRequest":{"properties":{"includeNews":{"type":"boolean"},"name":{"maxLength":120,"type":"string"},"symbol":{"maxLength":32,"minLength":1,"type":"string"}},"required":["symbol"],"type":"object"},"AnalyzeStockResponse":{"properties":{"action":{"type":"string"},"analysisAt":{"description":"Warning: Values \u003e 2^53 may lose precision in JavaScript","format":"int64","type":"integer"},"analysisId":{"type":"string"},"analystConsensus":{"$ref":"#/components/schemas/AnalystConsensus"},"available":{"type":"boolean"},"biasMa10":{"format":"double","type":"number"},"biasMa20":{"format":"double","type":"number"},"biasMa5":{"format":"double","type":"number"},"bullishFactors":{"items":{"type":"string"},"type":"array"},"changePercent":{"format":"double","type":"number"},"confidence":{"type":"string"},"currency":{"type":"string"},"currentPrice":{"format":"double","type":"number"},"display":{"type":"string"},"dividendCagr":{"format":"double","type":"number"},"dividendFrequency":{"type":"string"},"dividendYield":{"format":"double","type":"number"},"engineVersion":{"type":"string"},"exDividendDate":{"description":"Warning: Values \u003e 2^53 may lose precision in JavaScript","format":"int64","type":"integer"},"fallback":{"type":"boolean"},"generatedAt":{"type":"string"},"headlines":{"items":{"$ref":"#/components/schemas/StockAnalysisHeadline"},"type":"array"},"ma10":{"format":"double","type":"number"},"ma20":{"format":"double","type":"number"},"ma5":{"format":"double","type":"number"},"ma60":{"format":"double","type":"number"},"macdBar":{"format":"double","type":"number"},"macdDea":{"format":"double","type":"number"},"macdDif":{"format":"double","type":"number"},"macdStatus":{"type":"string"},"model":{"type":"string"},"name":{"type":"string"},"newsSearched":{"type":"boolean"},"newsSummary":{"type":"string"},"payoutRatio":{"format":"double","type":"number"},"priceTarget":{"$ref":"#/components/schemas/PriceTarget"},"provider":{"type":"string"},"recentUpgrades":{"items":{"$ref":"#/components/schemas/UpgradeDowngrade"},"type":"array"},"resistanceLevels":{"items":{"format":"double","type":"number"},"type":"array"},"riskFactors":{"items":{"type":"string"},"type":"array"},"rsi12":{"format":"double","type":"number"},"rsiStatus":{"type":"string"},"signal":{"type":"string"},"signalScore":{"format":"double","type":"number"},"stopLoss":{"format":"double","type":"number"},"summary":{"type":"string"},"supportLevels":{"items":{"format":"double","type":"number"},"type":"array"},"symbol":{"type":"string"},"takeProfit":{"format":"double","type":"number"},"technicalSummary":{"type":"string"},"trailingAnnualDividendRate":{"format":"double","type":"number"},"trendStatus":{"type":"string"},"volumeRatio5d":{"format":"double","type":"number"},"volumeStatus":{"type":"string"},"whyNow":{"type":"string"}},"type":"object"},"BacktestStockEvaluation":{"properties":{"analysisAt":{"description":"Warning: Values \u003e 2^53 may lose precision in JavaScript","format":"int64","type":"integer"},"analysisId":{"type":"string"},"directionCorrect":{"type":"boolean"},"entryPrice":{"format":"double","type":"number"},"exitPrice":{"format":"double","type":"number"},"outcome":{"type":"string"},"signal":{"type":"string"},"signalScore":{"format":"double","type":"number"},"simulatedReturnPct":{"format":"double","type":"number"},"stopLoss":{"format":"double","type":"number"},"takeProfit":{"format":"double","type":"number"}},"type":"object"},"BacktestStockRequest":{"properties":{"evalWindowDays":{"format":"int32","maximum":30,"minimum":3,"type":"integer"},"name":{"maxLength":120,"type":"string"},"symbol":{"maxLength":32,"minLength":1,"type":"string"}},"required":["symbol"],"type":"object"},"BacktestStockResponse":{"properties":{"actionableEvaluations":{"format":"int32","type":"integer"},"available":{"type":"boolean"},"avgSimulatedReturnPct":{"format":"double","type":"number"},"cumulativeSimulatedReturnPct":{"format":"double","type":"number"},"currency":{"type":"string"},"directionAccuracy":{"format":"double","type":"number"},"display":{"type":"string"},"engineVersion":{"type":"string"},"evalWindowDays":{"format":"int32","type":"integer"},"evaluations":{"items":{"$ref":"#/components/schemas/BacktestStockEvaluation"},"type":"array"},"evaluationsRun":{"format":"int32","type":"integer"},"generatedAt":{"type":"string"},"latestSignal":{"type":"string"},"latestSignalScore":{"format":"double","type":"number"},"name":{"type":"string"},"summary":{"type":"string"},"symbol":{"type":"string"},"winRate":{"format":"double","type":"number"}},"type":"object"},"BreadthSnapshot":{"properties":{"date":{"type":"string"},"pctAbove200d":{"format":"double","type":"number"},"pctAbove20d":{"description":"Optional so a missing/failed Barchart reading serializes as JSON null\n instead of collapsing to 0, which would render identically to a real 0%\n reading (severe market dislocation with no S\u0026P stocks above SMA).","format":"double","type":"number"},"pctAbove50d":{"format":"double","type":"number"}},"type":"object"},"CommodityQuote":{"description":"CommodityQuote represents a commodity price quote from Yahoo Finance.","properties":{"change":{"description":"Percentage change from previous close.","format":"double","type":"number"},"display":{"description":"Display label.","type":"string"},"name":{"description":"Human-readable name.","type":"string"},"price":{"description":"Current price.","format":"double","type":"number"},"sparkline":{"items":{"description":"Sparkline data points.","format":"double","type":"number"},"type":"array"},"symbol":{"description":"Commodity symbol (e.g., \"CL=F\" for crude oil).","minLength":1,"type":"string"}},"required":["symbol"],"type":"object"},"CotInstrument":{"properties":{"assetManagerLong":{"format":"int64","type":"string"},"assetManagerShort":{"format":"int64","type":"string"},"code":{"type":"string"},"dealerLong":{"format":"int64","type":"string"},"dealerShort":{"format":"int64","type":"string"},"leveragedFundsLong":{"format":"int64","type":"string"},"leveragedFundsShort":{"format":"int64","type":"string"},"name":{"type":"string"},"netPct":{"format":"double","type":"number"},"reportDate":{"type":"string"}},"type":"object"},"CryptoQuote":{"description":"CryptoQuote represents a cryptocurrency quote from CoinGecko.","properties":{"change":{"description":"24-hour percentage change.","format":"double","type":"number"},"change7d":{"description":"7-day percentage change.","format":"double","type":"number"},"name":{"description":"Cryptocurrency name (e.g., \"Bitcoin\").","type":"string"},"price":{"description":"Current price in USD.","format":"double","type":"number"},"sparkline":{"items":{"description":"Sparkline data points (recent price history).","format":"double","type":"number"},"type":"array"},"symbol":{"description":"Ticker symbol (e.g., \"BTC\").","minLength":1,"type":"string"}},"required":["symbol"],"type":"object"},"CryptoSector":{"description":"CryptoSector represents performance data for a crypto market sector.","properties":{"change":{"description":"Average 24h percentage change across sector tokens.","format":"double","type":"number"},"id":{"description":"Sector identifier.","type":"string"},"name":{"description":"Sector display name.","type":"string"}},"type":"object"},"EarningsEntry":{"properties":{"company":{"type":"string"},"date":{"type":"string"},"epsActual":{"format":"double","type":"number"},"epsEstimate":{"format":"double","type":"number"},"hasActuals":{"type":"boolean"},"hour":{"type":"string"},"revenueActual":{"format":"double","type":"number"},"revenueEstimate":{"format":"double","type":"number"},"surpriseDirection":{"type":"string"},"symbol":{"type":"string"}},"type":"object"},"Error":{"description":"Error is returned when a handler encounters an error. It contains a simple error message that the developer can customize.","properties":{"message":{"description":"Error message (e.g., 'user not found', 'database connection failed')","type":"string"}},"type":"object"},"EtfFlow":{"description":"EtfFlow represents a single ETF with estimated flow data.","properties":{"avgVolume":{"description":"Average volume over prior days.. Warning: Values \u003e 2^53 may lose precision in JavaScript","format":"int64","type":"integer"},"direction":{"description":"Flow direction: \"inflow\", \"outflow\", or \"neutral\".","type":"string"},"estFlow":{"description":"Estimated dollar flow magnitude.. Warning: Values \u003e 2^53 may lose precision in JavaScript","format":"int64","type":"integer"},"issuer":{"description":"Fund issuer (e.g. \"BlackRock\").","type":"string"},"price":{"description":"Latest closing price.","format":"double","type":"number"},"priceChange":{"description":"Day-over-day price change percentage.","format":"double","type":"number"},"ticker":{"description":"Ticker symbol (e.g. \"IBIT\").","minLength":1,"type":"string"},"volume":{"description":"Latest daily volume.. Warning: Values \u003e 2^53 may lose precision in JavaScript","format":"int64","type":"integer"},"volumeRatio":{"description":"Volume ratio (latest / average).","format":"double","type":"number"}},"required":["ticker"],"type":"object"},"EtfFlowsSummary":{"description":"EtfFlowsSummary contains aggregate ETF flow stats.","properties":{"etfCount":{"description":"Number of ETFs with data.","format":"int32","type":"integer"},"inflowCount":{"description":"Number of ETFs with inflow.","format":"int32","type":"integer"},"netDirection":{"description":"Net direction: \"NET INFLOW\", \"NET OUTFLOW\", or \"NEUTRAL\".","type":"string"},"outflowCount":{"description":"Number of ETFs with outflow.","format":"int32","type":"integer"},"totalEstFlow":{"description":"Total estimated flow across all ETFs.. Warning: Values \u003e 2^53 may lose precision in JavaScript","format":"int64","type":"integer"},"totalVolume":{"description":"Total volume across all ETFs.. Warning: Values \u003e 2^53 may lose precision in JavaScript","format":"int64","type":"integer"}},"type":"object"},"FearGreedCategory":{"properties":{"contribution":{"format":"double","type":"number"},"degraded":{"type":"boolean"},"inputsJson":{"type":"string"},"score":{"format":"double","type":"number"},"weight":{"format":"double","type":"number"}},"type":"object"},"FearGreedSectorPerformance":{"properties":{"change1d":{"format":"double","type":"number"},"name":{"type":"string"},"symbol":{"type":"string"}},"type":"object"},"FieldViolation":{"description":"FieldViolation describes a single validation error for a specific field.","properties":{"description":{"description":"Human-readable description of the validation violation (e.g., 'must be a valid email address', 'required field missing')","type":"string"},"field":{"description":"The field path that failed validation (e.g., 'user.email' for nested fields). For header validation, this will be the header name (e.g., 'X-API-Key')","type":"string"}},"required":["field","description"],"type":"object"},"GetCotPositioningRequest":{"type":"object"},"GetCotPositioningResponse":{"properties":{"instruments":{"items":{"$ref":"#/components/schemas/CotInstrument"},"type":"array"},"reportDate":{"type":"string"},"unavailable":{"type":"boolean"}},"type":"object"},"GetCountryStockIndexRequest":{"description":"GetCountryStockIndexRequest specifies which country's stock index to retrieve.","properties":{"countryCode":{"description":"ISO 3166-1 alpha-2 country code (e.g., \"US\", \"GB\", \"JP\").","pattern":"^[A-Z]{2}$","type":"string"}},"required":["countryCode"],"type":"object"},"GetCountryStockIndexResponse":{"description":"GetCountryStockIndexResponse contains the country's primary stock index data.","properties":{"available":{"description":"Whether stock index data is available for this country.","type":"boolean"},"code":{"description":"ISO 3166-1 alpha-2 country code.","type":"string"},"currency":{"description":"Currency of the index.","type":"string"},"fetchedAt":{"description":"When the data was fetched (ISO 8601).","type":"string"},"indexName":{"description":"Index name (e.g., \"S\u0026P 500\").","type":"string"},"price":{"description":"Latest closing price.","format":"double","type":"number"},"symbol":{"description":"Ticker symbol (e.g., \"^GSPC\").","type":"string"},"weekChangePercent":{"description":"Weekly change percentage.","format":"double","type":"number"}},"type":"object"},"GetFearGreedIndexRequest":{"type":"object"},"GetFearGreedIndexResponse":{"properties":{"aaiiBear":{"format":"double","type":"number"},"aaiiBull":{"format":"double","type":"number"},"breadth":{"$ref":"#/components/schemas/FearGreedCategory"},"cnnFearGreed":{"format":"double","type":"number"},"cnnLabel":{"type":"string"},"compositeLabel":{"type":"string"},"compositeScore":{"format":"double","type":"number"},"credit":{"$ref":"#/components/schemas/FearGreedCategory"},"crossAsset":{"$ref":"#/components/schemas/FearGreedCategory"},"fedRate":{"type":"string"},"fsiLabel":{"type":"string"},"fsiValue":{"format":"double","type":"number"},"hySpread":{"format":"double","type":"number"},"hygPrice":{"format":"double","type":"number"},"liquidity":{"$ref":"#/components/schemas/FearGreedCategory"},"macro":{"$ref":"#/components/schemas/FearGreedCategory"},"momentum":{"$ref":"#/components/schemas/FearGreedCategory"},"pctAbove200d":{"format":"double","type":"number"},"positioning":{"$ref":"#/components/schemas/FearGreedCategory"},"previousScore":{"format":"double","type":"number"},"putCallRatio":{"format":"double","type":"number"},"sectorPerformance":{"items":{"$ref":"#/components/schemas/FearGreedSectorPerformance"},"type":"array"},"seededAt":{"type":"string"},"sentiment":{"$ref":"#/components/schemas/FearGreedCategory"},"tltPrice":{"format":"double","type":"number"},"trend":{"$ref":"#/components/schemas/FearGreedCategory"},"unavailable":{"type":"boolean"},"vix":{"format":"double","type":"number"},"volatility":{"$ref":"#/components/schemas/FearGreedCategory"},"yield10y":{"format":"double","type":"number"}},"type":"object"},"GetGoldIntelligenceRequest":{"type":"object"},"GetGoldIntelligenceResponse":{"properties":{"cbReserves":{"$ref":"#/components/schemas/GoldCbReserves"},"cot":{"$ref":"#/components/schemas/GoldCotPositioning"},"crossCurrencyPrices":{"items":{"$ref":"#/components/schemas/GoldCrossCurrencyPrice"},"type":"array"},"drivers":{"items":{"$ref":"#/components/schemas/GoldDriver"},"type":"array"},"etfFlows":{"$ref":"#/components/schemas/GoldEtfFlows"},"goldChangePct":{"format":"double","type":"number"},"goldPlatinumPremiumPct":{"format":"double","type":"number"},"goldPrice":{"format":"double","type":"number"},"goldSilverRatio":{"format":"double","type":"number"},"goldSparkline":{"items":{"format":"double","type":"number"},"type":"array"},"palladiumPrice":{"format":"double","type":"number"},"platinumPrice":{"format":"double","type":"number"},"range52w":{"$ref":"#/components/schemas/GoldRange52w"},"returns":{"$ref":"#/components/schemas/GoldReturns"},"session":{"$ref":"#/components/schemas/GoldSessionRange"},"silverPrice":{"format":"double","type":"number"},"unavailable":{"type":"boolean"},"updatedAt":{"type":"string"}},"type":"object"},"GetHyperliquidFlowRequest":{"type":"object"},"GetHyperliquidFlowResponse":{"properties":{"assetCount":{"format":"int32","type":"integer"},"assets":{"items":{"$ref":"#/components/schemas/HyperliquidAssetFlow"},"type":"array"},"fetchedAt":{"type":"string"},"ts":{"format":"int64","type":"string"},"unavailable":{"type":"boolean"},"warmup":{"type":"boolean"}},"type":"object"},"GetInsiderTransactionsRequest":{"properties":{"symbol":{"maxLength":32,"minLength":1,"type":"string"}},"required":["symbol"],"type":"object"},"GetInsiderTransactionsResponse":{"properties":{"fetchedAt":{"type":"string"},"netValue":{"format":"double","type":"number"},"symbol":{"type":"string"},"totalBuys":{"format":"double","type":"number"},"totalSells":{"format":"double","type":"number"},"transactions":{"items":{"$ref":"#/components/schemas/InsiderTransaction"},"type":"array"},"unavailable":{"type":"boolean"}},"type":"object"},"GetMarketBreadthHistoryRequest":{"type":"object"},"GetMarketBreadthHistoryResponse":{"properties":{"currentPctAbove200d":{"format":"double","type":"number"},"currentPctAbove20d":{"format":"double","type":"number"},"currentPctAbove50d":{"format":"double","type":"number"},"history":{"items":{"$ref":"#/components/schemas/BreadthSnapshot"},"type":"array"},"unavailable":{"type":"boolean"},"updatedAt":{"type":"string"}},"type":"object"},"GetSectorSummaryRequest":{"description":"GetSectorSummaryRequest specifies parameters for retrieving sector performance.","properties":{"period":{"description":"Time period for performance calculation (e.g., \"1d\", \"1w\", \"1m\"). Defaults to \"1d\".","type":"string"}},"type":"object"},"GetSectorSummaryResponse":{"description":"GetSectorSummaryResponse contains sector performance data.","properties":{"sectors":{"items":{"$ref":"#/components/schemas/SectorPerformance"},"type":"array"}},"type":"object"},"GetStockAnalysisHistoryRequest":{"properties":{"includeNews":{"type":"boolean"},"limitPerSymbol":{"format":"int32","maximum":32,"minimum":1,"type":"integer"},"symbols":{"items":{"type":"string"},"type":"array"}},"type":"object"},"GetStockAnalysisHistoryResponse":{"properties":{"items":{"items":{"$ref":"#/components/schemas/StockAnalysisHistoryItem"},"type":"array"}},"type":"object"},"GoldCbHolder":{"properties":{"iso3":{"type":"string"},"name":{"type":"string"},"pctOfReserves":{"format":"double","type":"number"},"tonnes":{"format":"double","type":"number"}},"type":"object"},"GoldCbMover":{"properties":{"deltaTonnes12m":{"format":"double","type":"number"},"iso3":{"type":"string"},"name":{"type":"string"}},"type":"object"},"GoldCbReserves":{"properties":{"asOfMonth":{"type":"string"},"topBuyers12m":{"items":{"$ref":"#/components/schemas/GoldCbMover"},"type":"array"},"topHolders":{"items":{"$ref":"#/components/schemas/GoldCbHolder"},"type":"array"},"topSellers12m":{"items":{"$ref":"#/components/schemas/GoldCbMover"},"type":"array"},"totalTonnes":{"format":"double","type":"number"}},"type":"object"},"GoldCotCategory":{"properties":{"longPositions":{"format":"int64","type":"string"},"netPct":{"format":"double","type":"number"},"oiSharePct":{"format":"double","type":"number"},"shortPositions":{"format":"int64","type":"string"},"wowNetDelta":{"format":"int64","type":"string"}},"type":"object"},"GoldCotPositioning":{"properties":{"managedMoney":{"$ref":"#/components/schemas/GoldCotCategory"},"nextReleaseDate":{"type":"string"},"openInterest":{"format":"int64","type":"string"},"producerSwap":{"$ref":"#/components/schemas/GoldCotCategory"},"reportDate":{"type":"string"}},"type":"object"},"GoldCrossCurrencyPrice":{"properties":{"currency":{"type":"string"},"flag":{"type":"string"},"price":{"format":"double","type":"number"}},"type":"object"},"GoldDriver":{"properties":{"changePct":{"format":"double","type":"number"},"correlation30d":{"format":"double","type":"number"},"label":{"type":"string"},"symbol":{"type":"string"},"value":{"format":"double","type":"number"}},"type":"object"},"GoldEtfFlows":{"properties":{"asOfDate":{"type":"string"},"aumUsd":{"format":"double","type":"number"},"changeM1Pct":{"format":"double","type":"number"},"changeM1Tonnes":{"format":"double","type":"number"},"changeW1Pct":{"format":"double","type":"number"},"changeW1Tonnes":{"format":"double","type":"number"},"changeY1Pct":{"format":"double","type":"number"},"changeY1Tonnes":{"format":"double","type":"number"},"nav":{"format":"double","type":"number"},"sparkline90d":{"items":{"format":"double","type":"number"},"type":"array"},"tonnes":{"format":"double","type":"number"}},"type":"object"},"GoldRange52w":{"properties":{"hi":{"format":"double","type":"number"},"lo":{"format":"double","type":"number"},"positionPct":{"format":"double","type":"number"}},"type":"object"},"GoldReturns":{"properties":{"m1":{"format":"double","type":"number"},"w1":{"format":"double","type":"number"},"y1":{"format":"double","type":"number"},"ytd":{"format":"double","type":"number"}},"type":"object"},"GoldSessionRange":{"properties":{"dayHigh":{"format":"double","type":"number"},"dayLow":{"format":"double","type":"number"},"prevClose":{"format":"double","type":"number"}},"type":"object"},"GulfQuote":{"description":"GulfQuote represents a Gulf region market quote (index, currency, or oil).","properties":{"change":{"format":"double","type":"number"},"country":{"type":"string"},"flag":{"type":"string"},"name":{"type":"string"},"price":{"format":"double","type":"number"},"sparkline":{"items":{"format":"double","type":"number"},"type":"array"},"symbol":{"type":"string"},"type":{"type":"string"}},"type":"object"},"HyperliquidAssetFlow":{"properties":{"alerts":{"items":{"type":"string"},"type":"array"},"assetClass":{"type":"string"},"basisScore":{"format":"double","type":"number"},"composite":{"format":"double","type":"number"},"dayNotional":{"type":"string"},"display":{"type":"string"},"funding":{"description":"Raw metrics (nullable as strings to preserve precision; \"\" = unavailable)","type":"string"},"fundingScore":{"description":"Component scores 0-100","format":"double","type":"number"},"group":{"type":"string"},"markPx":{"type":"string"},"missingPolls":{"format":"int32","type":"integer"},"oiScore":{"format":"double","type":"number"},"openInterest":{"type":"string"},"oraclePx":{"type":"string"},"sparkFunding":{"items":{"description":"Sparkline arrays (most recent last); up to 60 samples (5h @ 5min)","format":"double","type":"number"},"type":"array"},"sparkOi":{"items":{"format":"double","type":"number"},"type":"array"},"sparkScore":{"items":{"format":"double","type":"number"},"type":"array"},"stale":{"type":"boolean"},"staleSince":{"format":"int64","type":"string"},"symbol":{"type":"string"},"volumeScore":{"format":"double","type":"number"},"warmup":{"description":"State flags","type":"boolean"}},"type":"object"},"InsiderTransaction":{"properties":{"name":{"type":"string"},"shares":{"description":"Warning: Values \u003e 2^53 may lose precision in JavaScript","format":"int64","type":"integer"},"transactionCode":{"type":"string"},"transactionDate":{"type":"string"},"value":{"format":"double","type":"number"}},"type":"object"},"ListAiTokensRequest":{"description":"ListAiTokensRequest retrieves AI crypto token prices.","type":"object"},"ListAiTokensResponse":{"description":"ListAiTokensResponse contains AI token price data.","properties":{"tokens":{"items":{"$ref":"#/components/schemas/CryptoQuote"},"type":"array"}},"type":"object"},"ListCommodityQuotesRequest":{"description":"ListCommodityQuotesRequest specifies which commodities to retrieve.","properties":{"symbols":{"items":{"description":"Commodity symbols to retrieve (Yahoo symbols). Empty returns defaults.","type":"string"},"type":"array"}},"type":"object"},"ListCommodityQuotesResponse":{"description":"ListCommodityQuotesResponse contains commodity quotes.","properties":{"quotes":{"items":{"$ref":"#/components/schemas/CommodityQuote"},"type":"array"}},"type":"object"},"ListCryptoQuotesRequest":{"description":"ListCryptoQuotesRequest specifies which cryptocurrencies to retrieve.","properties":{"ids":{"items":{"description":"Cryptocurrency IDs to retrieve (CoinGecko IDs). Empty returns defaults.","type":"string"},"type":"array"}},"type":"object"},"ListCryptoQuotesResponse":{"description":"ListCryptoQuotesResponse contains cryptocurrency quotes.","properties":{"quotes":{"items":{"$ref":"#/components/schemas/CryptoQuote"},"type":"array"}},"type":"object"},"ListCryptoSectorsRequest":{"description":"ListCryptoSectorsRequest retrieves crypto sector performance.","type":"object"},"ListCryptoSectorsResponse":{"description":"ListCryptoSectorsResponse contains crypto sector performance data.","properties":{"sectors":{"items":{"$ref":"#/components/schemas/CryptoSector"},"type":"array"}},"type":"object"},"ListDefiTokensRequest":{"description":"ListDefiTokensRequest retrieves DeFi token prices.","type":"object"},"ListDefiTokensResponse":{"description":"ListDefiTokensResponse contains DeFi token price data.","properties":{"tokens":{"items":{"$ref":"#/components/schemas/CryptoQuote"},"type":"array"}},"type":"object"},"ListEarningsCalendarRequest":{"properties":{"fromDate":{"type":"string"},"toDate":{"type":"string"}},"type":"object"},"ListEarningsCalendarResponse":{"properties":{"earnings":{"items":{"$ref":"#/components/schemas/EarningsEntry"},"type":"array"},"fromDate":{"type":"string"},"toDate":{"type":"string"},"total":{"format":"int32","type":"integer"},"unavailable":{"type":"boolean"}},"type":"object"},"ListEtfFlowsRequest":{"description":"ListEtfFlowsRequest is empty; the handler uses a fixed list of BTC spot ETFs.","type":"object"},"ListEtfFlowsResponse":{"description":"ListEtfFlowsResponse contains BTC spot ETF flow data.","properties":{"etfs":{"items":{"$ref":"#/components/schemas/EtfFlow"},"type":"array"},"rateLimited":{"description":"True when the upstream API rate-limited the request.","type":"boolean"},"summary":{"$ref":"#/components/schemas/EtfFlowsSummary"},"timestamp":{"description":"Timestamp of the data fetch (ISO 8601).","type":"string"}},"type":"object"},"ListGulfQuotesRequest":{"type":"object"},"ListGulfQuotesResponse":{"properties":{"quotes":{"items":{"$ref":"#/components/schemas/GulfQuote"},"type":"array"},"rateLimited":{"type":"boolean"}},"type":"object"},"ListMarketQuotesRequest":{"description":"ListMarketQuotesRequest specifies which stock/index symbols to retrieve.","properties":{"symbols":{"items":{"description":"Ticker symbols to retrieve (e.g., [\"AAPL\", \"^GSPC\"]). Empty returns defaults.","type":"string"},"type":"array"}},"type":"object"},"ListMarketQuotesResponse":{"description":"ListMarketQuotesResponse contains stock and index quotes.","properties":{"finnhubSkipped":{"description":"True when the Finnhub API key is not configured and stock quotes were skipped.","type":"boolean"},"quotes":{"items":{"$ref":"#/components/schemas/MarketQuote"},"type":"array"},"rateLimited":{"description":"True when the upstream API rate-limited the request.","type":"boolean"},"skipReason":{"description":"Human-readable reason when Finnhub was skipped (e.g., \"FINNHUB_API_KEY not configured\").","type":"string"}},"type":"object"},"ListOtherTokensRequest":{"description":"ListOtherTokensRequest retrieves other/trending crypto token prices.","type":"object"},"ListOtherTokensResponse":{"description":"ListOtherTokensResponse contains other token price data.","properties":{"tokens":{"items":{"$ref":"#/components/schemas/CryptoQuote"},"type":"array"}},"type":"object"},"ListStablecoinMarketsRequest":{"description":"ListStablecoinMarketsRequest specifies which stablecoins to retrieve.","properties":{"coins":{"items":{"description":"CoinGecko IDs to retrieve (e.g. \"tether,usd-coin\"). Empty returns defaults.","type":"string"},"type":"array"}},"type":"object"},"ListStablecoinMarketsResponse":{"description":"ListStablecoinMarketsResponse contains stablecoin market data.","properties":{"stablecoins":{"items":{"$ref":"#/components/schemas/Stablecoin"},"type":"array"},"summary":{"$ref":"#/components/schemas/StablecoinSummary"},"timestamp":{"description":"Timestamp of the data fetch (ISO 8601).","type":"string"}},"type":"object"},"ListStoredStockBacktestsRequest":{"properties":{"evalWindowDays":{"format":"int32","maximum":30,"minimum":3,"type":"integer"},"symbols":{"items":{"type":"string"},"type":"array"}},"type":"object"},"ListStoredStockBacktestsResponse":{"properties":{"items":{"items":{"$ref":"#/components/schemas/BacktestStockResponse"},"type":"array"}},"type":"object"},"MarketQuote":{"description":"MarketQuote represents a stock or index quote from Finnhub or Yahoo Finance.","properties":{"change":{"description":"Percentage change from previous close.","format":"double","type":"number"},"display":{"description":"Display label.","type":"string"},"name":{"description":"Human-readable name.","type":"string"},"price":{"description":"Current price.","format":"double","type":"number"},"sparkline":{"items":{"description":"Sparkline data points (recent price history).","format":"double","type":"number"},"type":"array"},"symbol":{"description":"Ticker symbol (e.g., \"AAPL\", \"^GSPC\").","minLength":1,"type":"string"}},"required":["symbol"],"type":"object"},"PriceTarget":{"properties":{"current":{"format":"double","type":"number"},"high":{"format":"double","type":"number"},"low":{"format":"double","type":"number"},"mean":{"format":"double","type":"number"},"median":{"format":"double","type":"number"},"numberOfAnalysts":{"format":"int32","type":"integer"}},"type":"object"},"SectorPerformance":{"description":"SectorPerformance represents performance data for a market sector.","properties":{"change":{"description":"Percentage change over the measured period.","format":"double","type":"number"},"name":{"description":"Sector name.","type":"string"},"symbol":{"description":"Sector symbol.","minLength":1,"type":"string"}},"required":["symbol"],"type":"object"},"Stablecoin":{"description":"Stablecoin represents a single stablecoin with peg health data.","properties":{"change24h":{"description":"24-hour price change percentage.","format":"double","type":"number"},"change7d":{"description":"7-day price change percentage.","format":"double","type":"number"},"deviation":{"description":"Deviation from $1.00 peg, as a percentage.","format":"double","type":"number"},"id":{"description":"CoinGecko ID.","minLength":1,"type":"string"},"image":{"description":"Coin image URL.","type":"string"},"marketCap":{"description":"Market capitalization in USD.","format":"double","type":"number"},"name":{"description":"Human-readable name.","type":"string"},"pegStatus":{"description":"Peg status: \"ON PEG\", \"SLIGHT DEPEG\", or \"DEPEGGED\".","type":"string"},"price":{"description":"Current price in USD.","format":"double","minimum":0,"type":"number"},"symbol":{"description":"Ticker symbol (e.g. \"USDT\").","minLength":1,"type":"string"},"volume24h":{"description":"24-hour trading volume in USD.","format":"double","type":"number"}},"required":["id","symbol"],"type":"object"},"StablecoinSummary":{"description":"StablecoinSummary contains aggregate stablecoin market stats.","properties":{"coinCount":{"description":"Number of stablecoins returned.","format":"int32","type":"integer"},"depeggedCount":{"description":"Number of stablecoins in DEPEGGED state.","format":"int32","type":"integer"},"healthStatus":{"description":"Overall health: \"HEALTHY\", \"CAUTION\", or \"WARNING\".","type":"string"},"totalMarketCap":{"description":"Total market cap across all queried stablecoins.","format":"double","type":"number"},"totalVolume24h":{"description":"Total 24h volume across all queried stablecoins.","format":"double","type":"number"}},"type":"object"},"StockAnalysisHeadline":{"properties":{"link":{"type":"string"},"publishedAt":{"description":"Warning: Values \u003e 2^53 may lose precision in JavaScript","format":"int64","type":"integer"},"source":{"type":"string"},"title":{"type":"string"}},"type":"object"},"StockAnalysisHistoryItem":{"properties":{"snapshots":{"items":{"$ref":"#/components/schemas/AnalyzeStockResponse"},"type":"array"},"symbol":{"type":"string"}},"type":"object"},"UpgradeDowngrade":{"properties":{"action":{"type":"string"},"epochGradeDate":{"description":"Warning: Values \u003e 2^53 may lose precision in JavaScript","format":"int64","type":"integer"},"firm":{"type":"string"},"fromGrade":{"type":"string"},"toGrade":{"type":"string"}},"type":"object"},"ValidationError":{"description":"ValidationError is returned when request validation fails. It contains a list of field violations describing what went wrong.","properties":{"violations":{"description":"List of validation violations","items":{"$ref":"#/components/schemas/FieldViolation"},"type":"array"}},"required":["violations"],"type":"object"}}},"info":{"title":"MarketService API","version":"1.0.0"},"openapi":"3.1.0","paths":{"/api/market/v1/analyze-stock":{"get":{"description":"AnalyzeStock retrieves a premium stock analysis report with technicals, news, and AI synthesis.","operationId":"AnalyzeStock","parameters":[{"in":"query","name":"symbol","required":false,"schema":{"type":"string"}},{"in":"query","name":"name","required":false,"schema":{"type":"string"}},{"in":"query","name":"include_news","required":false,"schema":{"type":"boolean"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnalyzeStockResponse"}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}},"description":"Validation error"},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error response"}},"summary":"AnalyzeStock","tags":["MarketService"]}},"/api/market/v1/backtest-stock":{"get":{"description":"BacktestStock replays premium stock-analysis signals over recent price history.","operationId":"BacktestStock","parameters":[{"in":"query","name":"symbol","required":false,"schema":{"type":"string"}},{"in":"query","name":"name","required":false,"schema":{"type":"string"}},{"in":"query","name":"eval_window_days","required":false,"schema":{"format":"int32","type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BacktestStockResponse"}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}},"description":"Validation error"},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error response"}},"summary":"BacktestStock","tags":["MarketService"]}},"/api/market/v1/get-cot-positioning":{"get":{"description":"GetCotPositioning retrieves CFTC COT institutional positioning data.","operationId":"GetCotPositioning","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetCotPositioningResponse"}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}},"description":"Validation error"},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error response"}},"summary":"GetCotPositioning","tags":["MarketService"]}},"/api/market/v1/get-country-stock-index":{"get":{"description":"GetCountryStockIndex retrieves the primary stock index for a country from Yahoo Finance.","operationId":"GetCountryStockIndex","parameters":[{"description":"ISO 3166-1 alpha-2 country code (e.g., \"US\", \"GB\", \"JP\").","in":"query","name":"country_code","required":false,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetCountryStockIndexResponse"}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}},"description":"Validation error"},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error response"}},"summary":"GetCountryStockIndex","tags":["MarketService"]}},"/api/market/v1/get-fear-greed-index":{"get":{"description":"GetFearGreedIndex retrieves the composite Fear \u0026 Greed sentiment index.","operationId":"GetFearGreedIndex","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetFearGreedIndexResponse"}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}},"description":"Validation error"},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error response"}},"summary":"GetFearGreedIndex","tags":["MarketService"]}},"/api/market/v1/get-gold-intelligence":{"get":{"description":"GetGoldIntelligence retrieves gold pricing, cross-currency XAU, ratios, and CFTC positioning.","operationId":"GetGoldIntelligence","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetGoldIntelligenceResponse"}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}},"description":"Validation error"},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error response"}},"summary":"GetGoldIntelligence","tags":["MarketService"]}},"/api/market/v1/get-hyperliquid-flow":{"get":{"description":"GetHyperliquidFlow retrieves Hyperliquid perp positioning flow (funding/OI/basis composite scores).","operationId":"GetHyperliquidFlow","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetHyperliquidFlowResponse"}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}},"description":"Validation error"},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error response"}},"summary":"GetHyperliquidFlow","tags":["MarketService"]}},"/api/market/v1/get-insider-transactions":{"get":{"description":"GetInsiderTransactions retrieves SEC insider buy/sell activity from Finnhub.","operationId":"GetInsiderTransactions","parameters":[{"in":"query","name":"symbol","required":false,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetInsiderTransactionsResponse"}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}},"description":"Validation error"},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error response"}},"summary":"GetInsiderTransactions","tags":["MarketService"]}},"/api/market/v1/get-market-breadth-history":{"get":{"description":"GetMarketBreadthHistory retrieves historical % of S\u0026P 500 stocks above 20/50/200-day SMAs.","operationId":"GetMarketBreadthHistory","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetMarketBreadthHistoryResponse"}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}},"description":"Validation error"},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error response"}},"summary":"GetMarketBreadthHistory","tags":["MarketService"]}},"/api/market/v1/get-sector-summary":{"get":{"description":"GetSectorSummary retrieves market sector performance data from Finnhub.","operationId":"GetSectorSummary","parameters":[{"description":"Time period for performance calculation (e.g., \"1d\", \"1w\", \"1m\"). Defaults to \"1d\".","in":"query","name":"period","required":false,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetSectorSummaryResponse"}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}},"description":"Validation error"},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error response"}},"summary":"GetSectorSummary","tags":["MarketService"]}},"/api/market/v1/get-stock-analysis-history":{"get":{"description":"GetStockAnalysisHistory retrieves shared premium stock analysis history from the backend store.","operationId":"GetStockAnalysisHistory","parameters":[{"explode":true,"in":"query","name":"symbols","required":false,"schema":{"items":{"type":"string"},"type":"array"},"style":"form"},{"in":"query","name":"limit_per_symbol","required":false,"schema":{"format":"int32","type":"integer"}},{"in":"query","name":"include_news","required":false,"schema":{"type":"boolean"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetStockAnalysisHistoryResponse"}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}},"description":"Validation error"},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error response"}},"summary":"GetStockAnalysisHistory","tags":["MarketService"]}},"/api/market/v1/list-ai-tokens":{"get":{"description":"ListAiTokens retrieves AI-focused crypto token prices and changes.","operationId":"ListAiTokens","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListAiTokensResponse"}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}},"description":"Validation error"},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error response"}},"summary":"ListAiTokens","tags":["MarketService"]}},"/api/market/v1/list-commodity-quotes":{"get":{"description":"ListCommodityQuotes retrieves commodity price quotes from Yahoo Finance.","operationId":"ListCommodityQuotes","parameters":[{"description":"Commodity symbols to retrieve (Yahoo symbols). Empty returns defaults.","explode":true,"in":"query","name":"symbols","required":false,"schema":{"items":{"type":"string"},"type":"array"},"style":"form"}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListCommodityQuotesResponse"}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}},"description":"Validation error"},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error response"}},"summary":"ListCommodityQuotes","tags":["MarketService"]}},"/api/market/v1/list-crypto-quotes":{"get":{"description":"ListCryptoQuotes retrieves cryptocurrency quotes from CoinGecko.","operationId":"ListCryptoQuotes","parameters":[{"description":"Cryptocurrency IDs to retrieve (CoinGecko IDs). Empty returns defaults.","explode":true,"in":"query","name":"ids","required":false,"schema":{"items":{"type":"string"},"type":"array"},"style":"form"}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListCryptoQuotesResponse"}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}},"description":"Validation error"},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error response"}},"summary":"ListCryptoQuotes","tags":["MarketService"]}},"/api/market/v1/list-crypto-sectors":{"get":{"description":"ListCryptoSectors retrieves crypto sector performance averages.","operationId":"ListCryptoSectors","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListCryptoSectorsResponse"}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}},"description":"Validation error"},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error response"}},"summary":"ListCryptoSectors","tags":["MarketService"]}},"/api/market/v1/list-defi-tokens":{"get":{"description":"ListDefiTokens retrieves DeFi token prices and changes.","operationId":"ListDefiTokens","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListDefiTokensResponse"}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}},"description":"Validation error"},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error response"}},"summary":"ListDefiTokens","tags":["MarketService"]}},"/api/market/v1/list-earnings-calendar":{"get":{"description":"ListEarningsCalendar retrieves upcoming and recent earnings releases.","operationId":"ListEarningsCalendar","parameters":[{"in":"query","name":"fromDate","required":false,"schema":{"type":"string"}},{"in":"query","name":"toDate","required":false,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListEarningsCalendarResponse"}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}},"description":"Validation error"},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error response"}},"summary":"ListEarningsCalendar","tags":["MarketService"]}},"/api/market/v1/list-etf-flows":{"get":{"description":"ListEtfFlows retrieves BTC spot ETF flow estimates from Yahoo Finance.","operationId":"ListEtfFlows","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListEtfFlowsResponse"}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}},"description":"Validation error"},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error response"}},"summary":"ListEtfFlows","tags":["MarketService"]}},"/api/market/v1/list-gulf-quotes":{"get":{"description":"ListGulfQuotes retrieves Gulf region market quotes (indices, currencies, oil).","operationId":"ListGulfQuotes","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListGulfQuotesResponse"}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}},"description":"Validation error"},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error response"}},"summary":"ListGulfQuotes","tags":["MarketService"]}},"/api/market/v1/list-market-quotes":{"get":{"description":"ListMarketQuotes retrieves stock and index quotes.","operationId":"ListMarketQuotes","parameters":[{"description":"Ticker symbols to retrieve (e.g., [\"AAPL\", \"^GSPC\"]). Empty returns defaults.","explode":true,"in":"query","name":"symbols","required":false,"schema":{"items":{"type":"string"},"type":"array"},"style":"form"}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListMarketQuotesResponse"}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}},"description":"Validation error"},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error response"}},"summary":"ListMarketQuotes","tags":["MarketService"]}},"/api/market/v1/list-other-tokens":{"get":{"description":"ListOtherTokens retrieves other/trending crypto token prices and changes.","operationId":"ListOtherTokens","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListOtherTokensResponse"}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}},"description":"Validation error"},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error response"}},"summary":"ListOtherTokens","tags":["MarketService"]}},"/api/market/v1/list-stablecoin-markets":{"get":{"description":"ListStablecoinMarkets retrieves stablecoin peg health and market data from CoinGecko.","operationId":"ListStablecoinMarkets","parameters":[{"description":"CoinGecko IDs to retrieve (e.g. \"tether,usd-coin\"). Empty returns defaults.","explode":true,"in":"query","name":"coins","required":false,"schema":{"items":{"type":"string"},"type":"array"},"style":"form"}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListStablecoinMarketsResponse"}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}},"description":"Validation error"},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error response"}},"summary":"ListStablecoinMarkets","tags":["MarketService"]}},"/api/market/v1/list-stored-stock-backtests":{"get":{"description":"ListStoredStockBacktests retrieves stored premium backtest snapshots from the backend store.","operationId":"ListStoredStockBacktests","parameters":[{"explode":true,"in":"query","name":"symbols","required":false,"schema":{"items":{"type":"string"},"type":"array"},"style":"form"},{"in":"query","name":"eval_window_days","required":false,"schema":{"format":"int32","type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListStoredStockBacktestsResponse"}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}},"description":"Validation error"},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error response"}},"summary":"ListStoredStockBacktests","tags":["MarketService"]}}}} \ No newline at end of file diff --git a/docs/api/MarketService.openapi.yaml b/docs/api/MarketService.openapi.yaml index 4b6372e08..d771df74e 100644 --- a/docs/api/MarketService.openapi.yaml +++ b/docs/api/MarketService.openapi.yaml @@ -15,8 +15,12 @@ paths: in: query description: Ticker symbols to retrieve (e.g., ["AAPL", "^GSPC"]). Empty returns defaults. required: false + style: form + explode: true schema: - type: string + type: array + items: + type: string responses: "200": description: Successful response @@ -48,8 +52,12 @@ paths: in: query description: Cryptocurrency IDs to retrieve (CoinGecko IDs). Empty returns defaults. required: false + style: form + explode: true schema: - type: string + type: array + items: + type: string responses: "200": description: Successful response @@ -81,8 +89,12 @@ paths: in: query description: Commodity symbols to retrieve (Yahoo symbols). Empty returns defaults. required: false + style: form + explode: true schema: - type: string + type: array + items: + type: string responses: "200": description: Successful response @@ -147,8 +159,12 @@ paths: in: query description: CoinGecko IDs to retrieve (e.g. "tether,usd-coin"). Empty returns defaults. required: false + style: form + explode: true schema: - type: string + type: array + items: + type: string responses: "200": description: Successful response @@ -306,8 +322,12 @@ paths: - name: symbols in: query required: false + style: form + explode: true schema: - type: string + type: array + items: + type: string - name: limit_per_symbol in: query required: false @@ -392,8 +412,12 @@ paths: - name: symbols in: query required: false + style: form + explode: true schema: - type: string + type: array + items: + type: string - name: eval_window_days in: query required: false diff --git a/docs/api/TradeService.openapi.json b/docs/api/TradeService.openapi.json index bfdad81a5..5396009a9 100644 --- a/docs/api/TradeService.openapi.json +++ b/docs/api/TradeService.openapi.json @@ -1 +1 @@ -{"components":{"schemas":{"ComtradeFlowRecord":{"description":"ComtradeFlowRecord is a single bilateral commodity flow record.","properties":{"cmdCode":{"description":"HS commodity code.","type":"string"},"cmdDesc":{"description":"Commodity description.","type":"string"},"isAnomaly":{"description":"True if the YoY change exceeds the anomaly threshold (30%).","type":"boolean"},"netWeightKg":{"description":"Net weight in kg.","format":"double","type":"number"},"partnerCode":{"description":"Partner country code (\"000\" = world total).","type":"string"},"partnerName":{"description":"Partner country name.","type":"string"},"reporterCode":{"description":"UN Comtrade reporter code.","type":"string"},"reporterName":{"description":"Reporter country name.","type":"string"},"tradeValueUsd":{"description":"Trade value in USD.","format":"double","type":"number"},"year":{"description":"Reporting year.","format":"int32","type":"integer"},"yoyChange":{"description":"Year-over-year change (ratio, e.g. 0.35 = +35%).","format":"double","type":"number"}},"type":"object"},"CustomsRevenueMonth":{"description":"Monthly US customs duties revenue from Treasury MTS data.","properties":{"calendarMonth":{"format":"int32","type":"integer"},"calendarYear":{"format":"int32","type":"integer"},"fiscalYear":{"format":"int32","type":"integer"},"fytdAmountBillions":{"format":"double","type":"number"},"monthlyAmountBillions":{"format":"double","type":"number"},"recordDate":{"type":"string"}},"type":"object"},"EffectiveTariffRate":{"description":"Current effective tariff estimate for countries with coverage beyond WTO MFN baselines.","properties":{"observationPeriod":{"description":"Human-readable observation period (for example \"December 2025\").","type":"string"},"sourceName":{"description":"Source name for the effective-rate estimate.","type":"string"},"sourceUrl":{"description":"Canonical source URL for the estimate/methodology.","type":"string"},"tariffRate":{"description":"Effective tariff rate (percentage).","format":"double","type":"number"},"updatedAt":{"description":"ISO 8601 date when the source page was last updated, if known.","type":"string"}},"type":"object"},"Error":{"description":"Error is returned when a handler encounters an error. It contains a simple error message that the developer can customize.","properties":{"message":{"description":"Error message (e.g., 'user not found', 'database connection failed')","type":"string"}},"type":"object"},"FieldViolation":{"description":"FieldViolation describes a single validation error for a specific field.","properties":{"description":{"description":"Human-readable description of the validation violation (e.g., 'must be a valid email address', 'required field missing')","type":"string"},"field":{"description":"The field path that failed validation (e.g., 'user.email' for nested fields). For header validation, this will be the header name (e.g., 'X-API-Key')","type":"string"}},"required":["field","description"],"type":"object"},"GetCustomsRevenueRequest":{"type":"object"},"GetCustomsRevenueResponse":{"properties":{"fetchedAt":{"type":"string"},"months":{"items":{"$ref":"#/components/schemas/CustomsRevenueMonth"},"type":"array"},"upstreamUnavailable":{"type":"boolean"}},"type":"object"},"GetTariffTrendsRequest":{"description":"Request for tariff timeseries data.","properties":{"partnerCountry":{"description":"WTO member code of partner country (e.g. \"156\" = China).","type":"string"},"productSector":{"description":"Product sector filter (HS chapter). Empty = aggregate.","type":"string"},"reportingCountry":{"description":"WTO member code of reporting country (e.g. \"840\" = US).","type":"string"},"years":{"description":"Number of years to look back (default 10, max 30).","format":"int32","type":"integer"}},"type":"object"},"GetTariffTrendsResponse":{"description":"Response containing tariff trend datapoints.","properties":{"datapoints":{"items":{"$ref":"#/components/schemas/TariffDataPoint"},"type":"array"},"effectiveTariffRate":{"$ref":"#/components/schemas/EffectiveTariffRate"},"fetchedAt":{"description":"ISO 8601 timestamp when data was fetched from WTO.","type":"string"},"upstreamUnavailable":{"description":"True if upstream fetch failed and results may be stale/empty.","type":"boolean"}},"type":"object"},"GetTradeBarriersRequest":{"description":"Request for SPS/TBT trade barrier notifications.","properties":{"countries":{"items":{"description":"WTO member codes to filter by. Empty = all.","type":"string"},"type":"array"},"limit":{"description":"Max results to return (server caps at 100).","format":"int32","type":"integer"},"measureType":{"description":"Filter by measure type: \"SPS\", \"TBT\", or empty for both.","type":"string"}},"type":"object"},"GetTradeBarriersResponse":{"description":"Response containing trade barrier notifications.","properties":{"barriers":{"items":{"$ref":"#/components/schemas/TradeBarrier"},"type":"array"},"fetchedAt":{"description":"ISO 8601 timestamp when data was fetched from WTO.","type":"string"},"upstreamUnavailable":{"description":"True if upstream fetch failed and results may be stale/empty.","type":"boolean"}},"type":"object"},"GetTradeFlowsRequest":{"description":"Request for bilateral trade flow data.","properties":{"partnerCountry":{"description":"WTO member code of partner country.","type":"string"},"reportingCountry":{"description":"WTO member code of reporting country.","type":"string"},"years":{"description":"Number of years to look back (default 10, max 30).","format":"int32","type":"integer"}},"type":"object"},"GetTradeFlowsResponse":{"description":"Response containing trade flow records.","properties":{"fetchedAt":{"description":"ISO 8601 timestamp when data was fetched from WTO.","type":"string"},"flows":{"items":{"$ref":"#/components/schemas/TradeFlowRecord"},"type":"array"},"upstreamUnavailable":{"description":"True if upstream fetch failed and results may be stale/empty.","type":"boolean"}},"type":"object"},"GetTradeRestrictionsRequest":{"description":"Request for quantitative restriction data.","properties":{"countries":{"items":{"description":"WTO member codes to filter by. Empty = all.","type":"string"},"type":"array"},"limit":{"description":"Max results to return (server caps at 100).","format":"int32","type":"integer"}},"type":"object"},"GetTradeRestrictionsResponse":{"description":"Response containing trade restrictions and fetch metadata.","properties":{"fetchedAt":{"description":"ISO 8601 timestamp when data was fetched from WTO.","type":"string"},"restrictions":{"items":{"$ref":"#/components/schemas/TradeRestriction"},"type":"array"},"upstreamUnavailable":{"description":"True if upstream fetch failed and results may be stale/empty.","type":"boolean"}},"type":"object"},"ListComtradeFlowsRequest":{"description":"ListComtradeFlowsRequest filters strategic commodity trade flows.","properties":{"anomaliesOnly":{"description":"If true, only return flows with a year-over-year change exceeding 30%.","type":"boolean"},"cmdCode":{"description":"HS commodity code (e.g. \"2709\" = crude oil). Empty returns all commodities.","type":"string"},"reporterCode":{"description":"UN Comtrade reporter code (e.g. \"842\" = US, \"156\" = China). Empty returns all reporters.","type":"string"}},"type":"object"},"ListComtradeFlowsResponse":{"description":"ListComtradeFlowsResponse contains strategic commodity trade flows.","properties":{"fetchedAt":{"description":"ISO 8601 timestamp when data was seeded.","type":"string"},"flows":{"items":{"$ref":"#/components/schemas/ComtradeFlowRecord"},"type":"array"},"upstreamUnavailable":{"description":"True if seeded data is missing or stale.","type":"boolean"}},"type":"object"},"TariffDataPoint":{"description":"Single tariff data point for a reporter-partner-product combination.","properties":{"boundRate":{"description":"WTO bound tariff rate (percentage).","format":"double","type":"number"},"indicatorCode":{"description":"WTO indicator code used for this datapoint.","type":"string"},"partnerCountry":{"description":"WTO member code of partner country.","type":"string"},"productSector":{"description":"Product sector or HS chapter.","type":"string"},"reportingCountry":{"description":"WTO member code of reporting country.","type":"string"},"tariffRate":{"description":"Applied MFN tariff rate (percentage).","format":"double","type":"number"},"year":{"description":"Year of observation.","format":"int32","type":"integer"}},"type":"object"},"TradeBarrier":{"description":"SPS or TBT trade barrier notification.","properties":{"dateDistributed":{"description":"ISO 8601 date when notification was distributed.","type":"string"},"id":{"description":"Unique barrier notification identifier.","type":"string"},"measureType":{"description":"Measure classification: \"SPS\" or \"TBT\".","type":"string"},"notifyingCountry":{"description":"Country that notified the measure.","type":"string"},"objective":{"description":"Stated objective of the measure.","type":"string"},"productDescription":{"description":"Product description or affected goods.","type":"string"},"sourceUrl":{"description":"WTO source document URL (must be http/https protocol).","type":"string"},"status":{"description":"Status of the notification.","type":"string"},"title":{"description":"Title of the notification.","type":"string"}},"type":"object"},"TradeFlowRecord":{"description":"Bilateral trade flow record for a reporting-partner pair.","properties":{"exportValueUsd":{"description":"Merchandise export value in millions USD.","format":"double","type":"number"},"importValueUsd":{"description":"Merchandise import value in millions USD.","format":"double","type":"number"},"partnerCountry":{"description":"WTO member code of partner country.","type":"string"},"productSector":{"description":"Product sector or HS chapter.","type":"string"},"reportingCountry":{"description":"WTO member code of reporting country.","type":"string"},"year":{"description":"Year of observation.","format":"int32","type":"integer"},"yoyExportChange":{"description":"Year-over-year export change (percentage).","format":"double","type":"number"},"yoyImportChange":{"description":"Year-over-year import change (percentage).","format":"double","type":"number"}},"type":"object"},"TradeRestriction":{"description":"Quantitative restriction or export control measure notified to WTO.","properties":{"affectedCountry":{"description":"Country affected by the restriction.","type":"string"},"description":{"description":"Human-readable description of the measure.","type":"string"},"id":{"description":"Unique restriction identifier from WTO.","type":"string"},"measureType":{"description":"Measure classification: \"QR\", \"EXPORT_BAN\", \"IMPORT_BAN\", \"LICENSING\".","type":"string"},"notifiedAt":{"description":"ISO 8601 date when measure was notified.","type":"string"},"productSector":{"description":"Product sector or HS chapter description.","type":"string"},"reportingCountry":{"description":"ISO 3166-1 alpha-3 or WTO member code of reporting country.","type":"string"},"sourceUrl":{"description":"WTO source document URL (must be http/https protocol).","type":"string"},"status":{"description":"Current status: \"IN_FORCE\", \"TERMINATED\", \"NOTIFIED\".","type":"string"}},"type":"object"},"ValidationError":{"description":"ValidationError is returned when request validation fails. It contains a list of field violations describing what went wrong.","properties":{"violations":{"description":"List of validation violations","items":{"$ref":"#/components/schemas/FieldViolation"},"type":"array"}},"required":["violations"],"type":"object"}}},"info":{"title":"TradeService API","version":"1.0.0"},"openapi":"3.1.0","paths":{"/api/trade/v1/get-customs-revenue":{"get":{"description":"Get US customs duties revenue (Treasury MTS data, seeded by Railway).","operationId":"GetCustomsRevenue","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetCustomsRevenueResponse"}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}},"description":"Validation error"},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error response"}},"summary":"GetCustomsRevenue","tags":["TradeService"]}},"/api/trade/v1/get-tariff-trends":{"get":{"description":"Get tariff rate timeseries for a country pair.","operationId":"GetTariffTrends","parameters":[{"description":"WTO member code of reporting country (e.g. \"840\" = US).","in":"query","name":"reporting_country","required":false,"schema":{"type":"string"}},{"description":"WTO member code of partner country (e.g. \"156\" = China).","in":"query","name":"partner_country","required":false,"schema":{"type":"string"}},{"description":"Product sector filter (HS chapter). Empty = aggregate.","in":"query","name":"product_sector","required":false,"schema":{"type":"string"}},{"description":"Number of years to look back (default 10, max 30).","in":"query","name":"years","required":false,"schema":{"format":"int32","type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetTariffTrendsResponse"}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}},"description":"Validation error"},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error response"}},"summary":"GetTariffTrends","tags":["TradeService"]}},"/api/trade/v1/get-trade-barriers":{"get":{"description":"Get SPS/TBT barrier notifications.","operationId":"GetTradeBarriers","parameters":[{"description":"WTO member codes to filter by. Empty = all.","in":"query","name":"countries","required":false,"schema":{"type":"string"}},{"description":"Filter by measure type: \"SPS\", \"TBT\", or empty for both.","in":"query","name":"measure_type","required":false,"schema":{"type":"string"}},{"description":"Max results to return (server caps at 100).","in":"query","name":"limit","required":false,"schema":{"format":"int32","type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetTradeBarriersResponse"}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}},"description":"Validation error"},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error response"}},"summary":"GetTradeBarriers","tags":["TradeService"]}},"/api/trade/v1/get-trade-flows":{"get":{"description":"Get bilateral merchandise trade flows.","operationId":"GetTradeFlows","parameters":[{"description":"WTO member code of reporting country.","in":"query","name":"reporting_country","required":false,"schema":{"type":"string"}},{"description":"WTO member code of partner country.","in":"query","name":"partner_country","required":false,"schema":{"type":"string"}},{"description":"Number of years to look back (default 10, max 30).","in":"query","name":"years","required":false,"schema":{"format":"int32","type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetTradeFlowsResponse"}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}},"description":"Validation error"},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error response"}},"summary":"GetTradeFlows","tags":["TradeService"]}},"/api/trade/v1/get-trade-restrictions":{"get":{"description":"Get quantitative restrictions and export controls.","operationId":"GetTradeRestrictions","parameters":[{"description":"WTO member codes to filter by. Empty = all.","in":"query","name":"countries","required":false,"schema":{"type":"string"}},{"description":"Max results to return (server caps at 100).","in":"query","name":"limit","required":false,"schema":{"format":"int32","type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetTradeRestrictionsResponse"}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}},"description":"Validation error"},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error response"}},"summary":"GetTradeRestrictions","tags":["TradeService"]}},"/api/trade/v1/list-comtrade-flows":{"get":{"description":"List UN Comtrade strategic commodity flows with anomaly detection.","operationId":"ListComtradeFlows","parameters":[{"description":"UN Comtrade reporter code (e.g. \"842\" = US, \"156\" = China). Empty returns all reporters.","in":"query","name":"reporter_code","required":false,"schema":{"type":"string"}},{"description":"HS commodity code (e.g. \"2709\" = crude oil). Empty returns all commodities.","in":"query","name":"cmd_code","required":false,"schema":{"type":"string"}},{"description":"If true, only return flows with a year-over-year change exceeding 30%.","in":"query","name":"anomalies_only","required":false,"schema":{"type":"boolean"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListComtradeFlowsResponse"}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}},"description":"Validation error"},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error response"}},"summary":"ListComtradeFlows","tags":["TradeService"]}}}} \ No newline at end of file +{"components":{"schemas":{"ComtradeFlowRecord":{"description":"ComtradeFlowRecord is a single bilateral commodity flow record.","properties":{"cmdCode":{"description":"HS commodity code.","type":"string"},"cmdDesc":{"description":"Commodity description.","type":"string"},"isAnomaly":{"description":"True if the YoY change exceeds the anomaly threshold (30%).","type":"boolean"},"netWeightKg":{"description":"Net weight in kg.","format":"double","type":"number"},"partnerCode":{"description":"Partner country code (\"000\" = world total).","type":"string"},"partnerName":{"description":"Partner country name.","type":"string"},"reporterCode":{"description":"UN Comtrade reporter code.","type":"string"},"reporterName":{"description":"Reporter country name.","type":"string"},"tradeValueUsd":{"description":"Trade value in USD.","format":"double","type":"number"},"year":{"description":"Reporting year.","format":"int32","type":"integer"},"yoyChange":{"description":"Year-over-year change (ratio, e.g. 0.35 = +35%).","format":"double","type":"number"}},"type":"object"},"CustomsRevenueMonth":{"description":"Monthly US customs duties revenue from Treasury MTS data.","properties":{"calendarMonth":{"format":"int32","type":"integer"},"calendarYear":{"format":"int32","type":"integer"},"fiscalYear":{"format":"int32","type":"integer"},"fytdAmountBillions":{"format":"double","type":"number"},"monthlyAmountBillions":{"format":"double","type":"number"},"recordDate":{"type":"string"}},"type":"object"},"EffectiveTariffRate":{"description":"Current effective tariff estimate for countries with coverage beyond WTO MFN baselines.","properties":{"observationPeriod":{"description":"Human-readable observation period (for example \"December 2025\").","type":"string"},"sourceName":{"description":"Source name for the effective-rate estimate.","type":"string"},"sourceUrl":{"description":"Canonical source URL for the estimate/methodology.","type":"string"},"tariffRate":{"description":"Effective tariff rate (percentage).","format":"double","type":"number"},"updatedAt":{"description":"ISO 8601 date when the source page was last updated, if known.","type":"string"}},"type":"object"},"Error":{"description":"Error is returned when a handler encounters an error. It contains a simple error message that the developer can customize.","properties":{"message":{"description":"Error message (e.g., 'user not found', 'database connection failed')","type":"string"}},"type":"object"},"FieldViolation":{"description":"FieldViolation describes a single validation error for a specific field.","properties":{"description":{"description":"Human-readable description of the validation violation (e.g., 'must be a valid email address', 'required field missing')","type":"string"},"field":{"description":"The field path that failed validation (e.g., 'user.email' for nested fields). For header validation, this will be the header name (e.g., 'X-API-Key')","type":"string"}},"required":["field","description"],"type":"object"},"GetCustomsRevenueRequest":{"type":"object"},"GetCustomsRevenueResponse":{"properties":{"fetchedAt":{"type":"string"},"months":{"items":{"$ref":"#/components/schemas/CustomsRevenueMonth"},"type":"array"},"upstreamUnavailable":{"type":"boolean"}},"type":"object"},"GetTariffTrendsRequest":{"description":"Request for tariff timeseries data.","properties":{"partnerCountry":{"description":"WTO member code of partner country (e.g. \"156\" = China).","type":"string"},"productSector":{"description":"Product sector filter (HS chapter). Empty = aggregate.","type":"string"},"reportingCountry":{"description":"WTO member code of reporting country (e.g. \"840\" = US).","type":"string"},"years":{"description":"Number of years to look back (default 10, max 30).","format":"int32","type":"integer"}},"type":"object"},"GetTariffTrendsResponse":{"description":"Response containing tariff trend datapoints.","properties":{"datapoints":{"items":{"$ref":"#/components/schemas/TariffDataPoint"},"type":"array"},"effectiveTariffRate":{"$ref":"#/components/schemas/EffectiveTariffRate"},"fetchedAt":{"description":"ISO 8601 timestamp when data was fetched from WTO.","type":"string"},"upstreamUnavailable":{"description":"True if upstream fetch failed and results may be stale/empty.","type":"boolean"}},"type":"object"},"GetTradeBarriersRequest":{"description":"Request for SPS/TBT trade barrier notifications.","properties":{"countries":{"items":{"description":"WTO member codes to filter by. Empty = all.","type":"string"},"type":"array"},"limit":{"description":"Max results to return (server caps at 100).","format":"int32","type":"integer"},"measureType":{"description":"Filter by measure type: \"SPS\", \"TBT\", or empty for both.","type":"string"}},"type":"object"},"GetTradeBarriersResponse":{"description":"Response containing trade barrier notifications.","properties":{"barriers":{"items":{"$ref":"#/components/schemas/TradeBarrier"},"type":"array"},"fetchedAt":{"description":"ISO 8601 timestamp when data was fetched from WTO.","type":"string"},"upstreamUnavailable":{"description":"True if upstream fetch failed and results may be stale/empty.","type":"boolean"}},"type":"object"},"GetTradeFlowsRequest":{"description":"Request for bilateral trade flow data.","properties":{"partnerCountry":{"description":"WTO member code of partner country.","type":"string"},"reportingCountry":{"description":"WTO member code of reporting country.","type":"string"},"years":{"description":"Number of years to look back (default 10, max 30).","format":"int32","type":"integer"}},"type":"object"},"GetTradeFlowsResponse":{"description":"Response containing trade flow records.","properties":{"fetchedAt":{"description":"ISO 8601 timestamp when data was fetched from WTO.","type":"string"},"flows":{"items":{"$ref":"#/components/schemas/TradeFlowRecord"},"type":"array"},"upstreamUnavailable":{"description":"True if upstream fetch failed and results may be stale/empty.","type":"boolean"}},"type":"object"},"GetTradeRestrictionsRequest":{"description":"Request for quantitative restriction data.","properties":{"countries":{"items":{"description":"WTO member codes to filter by. Empty = all.","type":"string"},"type":"array"},"limit":{"description":"Max results to return (server caps at 100).","format":"int32","type":"integer"}},"type":"object"},"GetTradeRestrictionsResponse":{"description":"Response containing trade restrictions and fetch metadata.","properties":{"fetchedAt":{"description":"ISO 8601 timestamp when data was fetched from WTO.","type":"string"},"restrictions":{"items":{"$ref":"#/components/schemas/TradeRestriction"},"type":"array"},"upstreamUnavailable":{"description":"True if upstream fetch failed and results may be stale/empty.","type":"boolean"}},"type":"object"},"ListComtradeFlowsRequest":{"description":"ListComtradeFlowsRequest filters strategic commodity trade flows.","properties":{"anomaliesOnly":{"description":"If true, only return flows with a year-over-year change exceeding 30%.","type":"boolean"},"cmdCode":{"description":"HS commodity code (e.g. \"2709\" = crude oil). Empty returns all commodities.","type":"string"},"reporterCode":{"description":"UN Comtrade reporter code (e.g. \"842\" = US, \"156\" = China). Empty returns all reporters.","type":"string"}},"type":"object"},"ListComtradeFlowsResponse":{"description":"ListComtradeFlowsResponse contains strategic commodity trade flows.","properties":{"fetchedAt":{"description":"ISO 8601 timestamp when data was seeded.","type":"string"},"flows":{"items":{"$ref":"#/components/schemas/ComtradeFlowRecord"},"type":"array"},"upstreamUnavailable":{"description":"True if seeded data is missing or stale.","type":"boolean"}},"type":"object"},"TariffDataPoint":{"description":"Single tariff data point for a reporter-partner-product combination.","properties":{"boundRate":{"description":"WTO bound tariff rate (percentage).","format":"double","type":"number"},"indicatorCode":{"description":"WTO indicator code used for this datapoint.","type":"string"},"partnerCountry":{"description":"WTO member code of partner country.","type":"string"},"productSector":{"description":"Product sector or HS chapter.","type":"string"},"reportingCountry":{"description":"WTO member code of reporting country.","type":"string"},"tariffRate":{"description":"Applied MFN tariff rate (percentage).","format":"double","type":"number"},"year":{"description":"Year of observation.","format":"int32","type":"integer"}},"type":"object"},"TradeBarrier":{"description":"SPS or TBT trade barrier notification.","properties":{"dateDistributed":{"description":"ISO 8601 date when notification was distributed.","type":"string"},"id":{"description":"Unique barrier notification identifier.","type":"string"},"measureType":{"description":"Measure classification: \"SPS\" or \"TBT\".","type":"string"},"notifyingCountry":{"description":"Country that notified the measure.","type":"string"},"objective":{"description":"Stated objective of the measure.","type":"string"},"productDescription":{"description":"Product description or affected goods.","type":"string"},"sourceUrl":{"description":"WTO source document URL (must be http/https protocol).","type":"string"},"status":{"description":"Status of the notification.","type":"string"},"title":{"description":"Title of the notification.","type":"string"}},"type":"object"},"TradeFlowRecord":{"description":"Bilateral trade flow record for a reporting-partner pair.","properties":{"exportValueUsd":{"description":"Merchandise export value in millions USD.","format":"double","type":"number"},"importValueUsd":{"description":"Merchandise import value in millions USD.","format":"double","type":"number"},"partnerCountry":{"description":"WTO member code of partner country.","type":"string"},"productSector":{"description":"Product sector or HS chapter.","type":"string"},"reportingCountry":{"description":"WTO member code of reporting country.","type":"string"},"year":{"description":"Year of observation.","format":"int32","type":"integer"},"yoyExportChange":{"description":"Year-over-year export change (percentage).","format":"double","type":"number"},"yoyImportChange":{"description":"Year-over-year import change (percentage).","format":"double","type":"number"}},"type":"object"},"TradeRestriction":{"description":"Quantitative restriction or export control measure notified to WTO.","properties":{"affectedCountry":{"description":"Country affected by the restriction.","type":"string"},"description":{"description":"Human-readable description of the measure.","type":"string"},"id":{"description":"Unique restriction identifier from WTO.","type":"string"},"measureType":{"description":"Measure classification: \"QR\", \"EXPORT_BAN\", \"IMPORT_BAN\", \"LICENSING\".","type":"string"},"notifiedAt":{"description":"ISO 8601 date when measure was notified.","type":"string"},"productSector":{"description":"Product sector or HS chapter description.","type":"string"},"reportingCountry":{"description":"ISO 3166-1 alpha-3 or WTO member code of reporting country.","type":"string"},"sourceUrl":{"description":"WTO source document URL (must be http/https protocol).","type":"string"},"status":{"description":"Current status: \"IN_FORCE\", \"TERMINATED\", \"NOTIFIED\".","type":"string"}},"type":"object"},"ValidationError":{"description":"ValidationError is returned when request validation fails. It contains a list of field violations describing what went wrong.","properties":{"violations":{"description":"List of validation violations","items":{"$ref":"#/components/schemas/FieldViolation"},"type":"array"}},"required":["violations"],"type":"object"}}},"info":{"title":"TradeService API","version":"1.0.0"},"openapi":"3.1.0","paths":{"/api/trade/v1/get-customs-revenue":{"get":{"description":"Get US customs duties revenue (Treasury MTS data, seeded by Railway).","operationId":"GetCustomsRevenue","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetCustomsRevenueResponse"}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}},"description":"Validation error"},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error response"}},"summary":"GetCustomsRevenue","tags":["TradeService"]}},"/api/trade/v1/get-tariff-trends":{"get":{"description":"Get tariff rate timeseries for a country pair.","operationId":"GetTariffTrends","parameters":[{"description":"WTO member code of reporting country (e.g. \"840\" = US).","in":"query","name":"reporting_country","required":false,"schema":{"type":"string"}},{"description":"WTO member code of partner country (e.g. \"156\" = China).","in":"query","name":"partner_country","required":false,"schema":{"type":"string"}},{"description":"Product sector filter (HS chapter). Empty = aggregate.","in":"query","name":"product_sector","required":false,"schema":{"type":"string"}},{"description":"Number of years to look back (default 10, max 30).","in":"query","name":"years","required":false,"schema":{"format":"int32","type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetTariffTrendsResponse"}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}},"description":"Validation error"},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error response"}},"summary":"GetTariffTrends","tags":["TradeService"]}},"/api/trade/v1/get-trade-barriers":{"get":{"description":"Get SPS/TBT barrier notifications.","operationId":"GetTradeBarriers","parameters":[{"description":"WTO member codes to filter by. Empty = all.","explode":true,"in":"query","name":"countries","required":false,"schema":{"items":{"type":"string"},"type":"array"},"style":"form"},{"description":"Filter by measure type: \"SPS\", \"TBT\", or empty for both.","in":"query","name":"measure_type","required":false,"schema":{"type":"string"}},{"description":"Max results to return (server caps at 100).","in":"query","name":"limit","required":false,"schema":{"format":"int32","type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetTradeBarriersResponse"}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}},"description":"Validation error"},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error response"}},"summary":"GetTradeBarriers","tags":["TradeService"]}},"/api/trade/v1/get-trade-flows":{"get":{"description":"Get bilateral merchandise trade flows.","operationId":"GetTradeFlows","parameters":[{"description":"WTO member code of reporting country.","in":"query","name":"reporting_country","required":false,"schema":{"type":"string"}},{"description":"WTO member code of partner country.","in":"query","name":"partner_country","required":false,"schema":{"type":"string"}},{"description":"Number of years to look back (default 10, max 30).","in":"query","name":"years","required":false,"schema":{"format":"int32","type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetTradeFlowsResponse"}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}},"description":"Validation error"},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error response"}},"summary":"GetTradeFlows","tags":["TradeService"]}},"/api/trade/v1/get-trade-restrictions":{"get":{"description":"Get quantitative restrictions and export controls.","operationId":"GetTradeRestrictions","parameters":[{"description":"WTO member codes to filter by. Empty = all.","explode":true,"in":"query","name":"countries","required":false,"schema":{"items":{"type":"string"},"type":"array"},"style":"form"},{"description":"Max results to return (server caps at 100).","in":"query","name":"limit","required":false,"schema":{"format":"int32","type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetTradeRestrictionsResponse"}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}},"description":"Validation error"},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error response"}},"summary":"GetTradeRestrictions","tags":["TradeService"]}},"/api/trade/v1/list-comtrade-flows":{"get":{"description":"List UN Comtrade strategic commodity flows with anomaly detection.","operationId":"ListComtradeFlows","parameters":[{"description":"UN Comtrade reporter code (e.g. \"842\" = US, \"156\" = China). Empty returns all reporters.","in":"query","name":"reporter_code","required":false,"schema":{"type":"string"}},{"description":"HS commodity code (e.g. \"2709\" = crude oil). Empty returns all commodities.","in":"query","name":"cmd_code","required":false,"schema":{"type":"string"}},{"description":"If true, only return flows with a year-over-year change exceeding 30%.","in":"query","name":"anomalies_only","required":false,"schema":{"type":"boolean"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListComtradeFlowsResponse"}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}},"description":"Validation error"},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error response"}},"summary":"ListComtradeFlows","tags":["TradeService"]}}}} \ No newline at end of file diff --git a/docs/api/TradeService.openapi.yaml b/docs/api/TradeService.openapi.yaml index ecbdbae83..f5a5a4ddf 100644 --- a/docs/api/TradeService.openapi.yaml +++ b/docs/api/TradeService.openapi.yaml @@ -15,8 +15,12 @@ paths: in: query description: WTO member codes to filter by. Empty = all. required: false + style: form + explode: true schema: - type: string + type: array + items: + type: string - name: limit in: query description: Max results to return (server caps at 100). @@ -153,8 +157,12 @@ paths: in: query description: WTO member codes to filter by. Empty = all. required: false + style: form + explode: true schema: - type: string + type: array + items: + type: string - name: measure_type in: query description: 'Filter by measure type: "SPS", "TBT", or empty for both.' diff --git a/docs/api/worldmonitor.openapi.yaml b/docs/api/worldmonitor.openapi.yaml new file mode 100644 index 000000000..63e6231c9 --- /dev/null +++ b/docs/api/worldmonitor.openapi.yaml @@ -0,0 +1,21388 @@ +openapi: 3.1.0 +info: + title: WorldMonitor API + description: Unified OpenAPI bundle spanning all WorldMonitor services. + contact: + name: WorldMonitor + email: support@worldmonitor.app + version: 1.0.0 +servers: + - url: https://api.worldmonitor.app +paths: + /api/aviation/v1/list-airport-delays: + get: + tags: + - AviationService + summary: ListAirportDelays + description: ListAirportDelays retrieves current airport delay alerts. + operationId: ListAirportDelays + parameters: + - name: page_size + in: query + description: Maximum items per page (1-100). + required: false + schema: + type: integer + format: int32 + - name: cursor + in: query + description: Cursor for next page. + required: false + schema: + type: string + - name: region + in: query + description: Optional region filter. + required: false + schema: + type: string + - name: min_severity + in: query + description: Optional minimum severity filter. + required: false + schema: + type: string + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/worldmonitor_aviation_v1_ListAirportDelaysResponse' + "400": + description: Validation error + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationError' + default: + description: Error response + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /api/aviation/v1/get-airport-ops-summary: + get: + tags: + - AviationService + summary: GetAirportOpsSummary + description: GetAirportOpsSummary returns operational health metrics for watched airports. + operationId: GetAirportOpsSummary + parameters: + - name: airports + in: query + description: IATA airport codes to query (e.g., ["IST", "ESB", "LHR"]). + required: false + style: form + explode: true + schema: + type: array + items: + type: string + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/worldmonitor_aviation_v1_GetAirportOpsSummaryResponse' + "400": + description: Validation error + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationError' + default: + description: Error response + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /api/aviation/v1/list-airport-flights: + get: + tags: + - AviationService + summary: ListAirportFlights + description: ListAirportFlights retrieves recent flights at a specific airport. + operationId: ListAirportFlights + parameters: + - name: airport + in: query + description: IATA airport code (e.g., "IST"). + required: false + schema: + type: string + - name: direction + in: query + description: Direction filter. + required: false + schema: + type: string + - name: limit + in: query + description: Maximum number of flights to return (1-100). + required: false + schema: + type: integer + format: int32 + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/worldmonitor_aviation_v1_ListAirportFlightsResponse' + "400": + description: Validation error + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationError' + default: + description: Error response + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /api/aviation/v1/get-carrier-ops: + get: + tags: + - AviationService + summary: GetCarrierOps + description: GetCarrierOps returns delay and cancellation metrics grouped by carrier. + operationId: GetCarrierOps + parameters: + - name: airports + in: query + description: IATA airport codes to aggregate carrier metrics from. + required: false + style: form + explode: true + schema: + type: array + items: + type: string + - name: min_flights + in: query + description: 'Minimum number of flights required to include a carrier (default: 1).' + required: false + schema: + type: integer + format: int32 + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/worldmonitor_aviation_v1_GetCarrierOpsResponse' + "400": + description: Validation error + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationError' + default: + description: Error response + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /api/aviation/v1/get-flight-status: + get: + tags: + - AviationService + summary: GetFlightStatus + description: GetFlightStatus looks up the current status of a specific flight. + operationId: GetFlightStatus + parameters: + - name: flight_number + in: query + description: IATA flight number (e.g., "TK1952"). + required: false + schema: + type: string + - name: date + in: query + description: Departure date in ISO 8601 format (e.g., "2026-03-05"). + required: false + schema: + type: string + - name: origin + in: query + description: Optional origin airport IATA code to disambiguate. + required: false + schema: + type: string + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/worldmonitor_aviation_v1_GetFlightStatusResponse' + "400": + description: Validation error + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationError' + default: + description: Error response + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /api/aviation/v1/track-aircraft: + get: + tags: + - AviationService + summary: TrackAircraft + description: TrackAircraft retrieves live position stream for a specific aircraft hex. + operationId: TrackAircraft + parameters: + - name: icao24 + in: query + description: ICAO 24-bit transponder address (hex, e.g., "4b1805"). + required: false + schema: + type: string + - name: callsign + in: query + description: ATC callsign (e.g., "THY7CX"). + required: false + schema: + type: string + - name: sw_lat + in: query + description: Optional bounding box south-west latitude. + required: false + schema: + type: number + format: double + - name: sw_lon + in: query + description: Optional bounding box south-west longitude. + required: false + schema: + type: number + format: double + - name: ne_lat + in: query + description: Optional bounding box north-east latitude. + required: false + schema: + type: number + format: double + - name: ne_lon + in: query + description: Optional bounding box north-east longitude. + required: false + schema: + type: number + format: double + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/worldmonitor_aviation_v1_TrackAircraftResponse' + "400": + description: Validation error + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationError' + default: + description: Error response + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /api/aviation/v1/get-youtube-live-stream-info: + get: + tags: + - AviationService + summary: GetYoutubeLiveStreamInfo + description: GetYoutubeLiveStreamInfo retrieves information about a YouTube live stream (status, title, etc). + operationId: GetYoutubeLiveStreamInfo + parameters: + - name: channel + in: query + description: YouTube channel handle or ID. + required: false + schema: + type: string + - name: video_id + in: query + description: Specific video ID to check. + required: false + schema: + type: string + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/worldmonitor_aviation_v1_GetYoutubeLiveStreamInfoResponse' + "400": + description: Validation error + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationError' + default: + description: Error response + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /api/aviation/v1/search-flight-prices: + get: + tags: + - AviationService + summary: SearchFlightPrices + description: SearchFlightPrices searches for flight price offers on a route. + operationId: SearchFlightPrices + parameters: + - name: origin + in: query + description: Origin airport IATA code. + required: false + schema: + type: string + - name: destination + in: query + description: Destination airport IATA code. + required: false + schema: + type: string + - name: departure_date + in: query + description: Outbound departure date (ISO 8601). + required: false + schema: + type: string + - name: return_date + in: query + description: Return date (ISO 8601), empty for one-way. + required: false + schema: + type: string + - name: adults + in: query + description: Number of adult passengers (1-9). + required: false + schema: + type: integer + format: int32 + - name: cabin + in: query + description: Desired cabin class. + required: false + schema: + type: string + - name: nonstop_only + in: query + description: Whether to restrict to nonstop flights only. + required: false + schema: + type: boolean + - name: max_results + in: query + description: Maximum number of quotes to return (1-50). + required: false + schema: + type: integer + format: int32 + - name: currency + in: query + description: ISO 4217 currency code for prices (e.g., "usd", "eur", "try"). + required: false + schema: + type: string + - name: market + in: query + description: Market/locale code (e.g., "us", "tr"). + required: false + schema: + type: string + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/worldmonitor_aviation_v1_SearchFlightPricesResponse' + "400": + description: Validation error + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationError' + default: + description: Error response + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /api/aviation/v1/list-aviation-news: + get: + tags: + - AviationService + summary: ListAviationNews + description: ListAviationNews retrieves filtered aviation news articles. + operationId: ListAviationNews + parameters: + - name: entities + in: query + description: Entities to filter by (airline names, airport codes, route strings). + required: false + style: form + explode: true + schema: + type: array + items: + type: string + - name: window_hours + in: query + description: Time window in hours to look back (1-168). + required: false + schema: + type: integer + format: int32 + - name: max_items + in: query + description: Maximum number of news items to return (1-50). + required: false + schema: + type: integer + format: int32 + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/worldmonitor_aviation_v1_ListAviationNewsResponse' + "400": + description: Validation error + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationError' + default: + description: Error response + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /api/aviation/v1/search-google-flights: + get: + tags: + - AviationService + summary: SearchGoogleFlights + description: SearchGoogleFlights searches Google Flights for available itineraries on a specific date. + operationId: SearchGoogleFlights + parameters: + - name: origin + in: query + description: Departure airport IATA code (e.g. "JFK"). + required: false + schema: + type: string + - name: destination + in: query + description: Arrival airport IATA code (e.g. "LHR"). + required: false + schema: + type: string + - name: departure_date + in: query + description: Departure date in YYYY-MM-DD format. + required: false + schema: + type: string + - name: return_date + in: query + description: Return date in YYYY-MM-DD format; omit for one-way. + required: false + schema: + type: string + - name: cabin_class + in: query + description: 'Cabin class: ECONOMY, PREMIUM_ECONOMY, BUSINESS, or FIRST.' + required: false + schema: + type: string + - name: max_stops + in: query + description: 'Stop filter: ANY, NON_STOP, ONE_STOP, or TWO_PLUS_STOPS.' + required: false + schema: + type: string + - name: departure_window + in: query + description: Departure time window in HH-HH format (e.g. "6-20"). + required: false + schema: + type: string + - name: airlines + in: query + description: Airline IATA codes to filter by (e.g. ["BA", "AA"]). + required: false + style: form + explode: true + schema: + type: array + items: + type: string + - name: sort_by + in: query + description: 'Sort order: CHEAPEST, DURATION, DEPARTURE_TIME, or ARRIVAL_TIME.' + required: false + schema: + type: string + - name: passengers + in: query + description: Number of adult passengers (1-9). + required: false + schema: + type: integer + format: int32 + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/worldmonitor_aviation_v1_SearchGoogleFlightsResponse' + "400": + description: Validation error + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationError' + default: + description: Error response + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /api/aviation/v1/search-google-dates: + get: + tags: + - AviationService + summary: SearchGoogleDates + description: SearchGoogleDates finds the cheapest travel dates across a flexible date range via Google Flights. + operationId: SearchGoogleDates + parameters: + - name: origin + in: query + description: Departure airport IATA code (e.g. "JFK"). + required: false + schema: + type: string + - name: destination + in: query + description: Arrival airport IATA code (e.g. "LHR"). + required: false + schema: + type: string + - name: start_date + in: query + description: Start of date range in YYYY-MM-DD format. + required: false + schema: + type: string + - name: end_date + in: query + description: End of date range in YYYY-MM-DD format. + required: false + schema: + type: string + - name: trip_duration + in: query + description: Trip duration in days (required for round-trip searches). + required: false + schema: + type: integer + format: int32 + - name: is_round_trip + in: query + description: Whether to search for round-trip flights. + required: false + schema: + type: boolean + - name: cabin_class + in: query + description: 'Cabin class: ECONOMY, PREMIUM_ECONOMY, BUSINESS, or FIRST.' + required: false + schema: + type: string + - name: max_stops + in: query + description: 'Stop filter: ANY, NON_STOP, ONE_STOP, or TWO_PLUS_STOPS.' + required: false + schema: + type: string + - name: departure_window + in: query + description: Departure time window in HH-HH format (e.g. "6-20"). + required: false + schema: + type: string + - name: airlines + in: query + description: Airline IATA codes to filter by (e.g. ["BA", "AA"]). + required: false + style: form + explode: true + schema: + type: array + items: + type: string + - name: sort_by_price + in: query + description: Whether to sort results by price (lowest first). + required: false + schema: + type: boolean + - name: passengers + in: query + description: Number of adult passengers (1-9). + required: false + schema: + type: integer + format: int32 + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/worldmonitor_aviation_v1_SearchGoogleDatesResponse' + "400": + description: Validation error + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationError' + default: + description: Error response + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /api/climate/v1/list-climate-anomalies: + get: + tags: + - ClimateService + summary: ListClimateAnomalies + description: ListClimateAnomalies retrieves temperature and precipitation anomalies from ERA5 data. + operationId: ListClimateAnomalies + parameters: + - name: page_size + in: query + description: Maximum items per page (1-100). + required: false + schema: + type: integer + format: int32 + - name: cursor + in: query + description: Cursor for next page. + required: false + schema: + type: string + - name: min_severity + in: query + description: Optional filter by anomaly severity. + required: false + schema: + type: string + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/worldmonitor_climate_v1_ListClimateAnomaliesResponse' + "400": + description: Validation error + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationError' + default: + description: Error response + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /api/climate/v1/list-climate-disasters: + get: + tags: + - ClimateService + summary: ListClimateDisasters + description: ListClimateDisasters retrieves climate-relevant disaster events from seeded data. + operationId: ListClimateDisasters + parameters: + - name: page_size + in: query + description: Maximum items per page (1-100). + required: false + schema: + type: integer + format: int32 + - name: cursor + in: query + description: Cursor for next page. + required: false + schema: + type: string + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/worldmonitor_climate_v1_ListClimateDisastersResponse' + "400": + description: Validation error + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationError' + default: + description: Error response + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /api/climate/v1/get-co2-monitoring: + get: + tags: + - ClimateService + summary: GetCo2Monitoring + description: GetCo2Monitoring retrieves seeded NOAA greenhouse gas monitoring data. + operationId: GetCo2Monitoring + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/worldmonitor_climate_v1_GetCo2MonitoringResponse' + "400": + description: Validation error + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationError' + default: + description: Error response + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /api/climate/v1/get-ocean-ice-data: + get: + tags: + - ClimateService + summary: GetOceanIceData + description: GetOceanIceData retrieves seeded Arctic sea ice, sea level, and ocean heat indicators. + operationId: GetOceanIceData + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/worldmonitor_climate_v1_GetOceanIceDataResponse' + "400": + description: Validation error + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationError' + default: + description: Error response + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /api/climate/v1/list-air-quality-data: + get: + tags: + - ClimateService + summary: ListAirQualityData + description: ListAirQualityData retrieves recent PM2.5 station data from the shared air-quality seed. + operationId: ListAirQualityData + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/worldmonitor_climate_v1_ListAirQualityDataResponse' + "400": + description: Validation error + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationError' + default: + description: Error response + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /api/climate/v1/list-climate-news: + get: + tags: + - ClimateService + summary: ListClimateNews + description: ListClimateNews retrieves latest climate/environment intelligence headlines from seeded RSS feeds. + operationId: ListClimateNews + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/worldmonitor_climate_v1_ListClimateNewsResponse' + "400": + description: Validation error + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationError' + default: + description: Error response + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /api/conflict/v1/list-acled-events: + get: + tags: + - ConflictService + summary: ListAcledEvents + description: ListAcledEvents retrieves armed conflict events from the ACLED dataset. + operationId: ListAcledEvents + parameters: + - name: start + in: query + description: Start of time range (inclusive), Unix epoch milliseconds. + required: false + schema: + type: string + format: int64 + - name: end + in: query + description: End of time range (inclusive), Unix epoch milliseconds. + required: false + schema: + type: string + format: int64 + - name: page_size + in: query + description: Maximum items per page (1-100). + required: false + schema: + type: integer + format: int32 + - name: cursor + in: query + description: Cursor for next page. + required: false + schema: + type: string + - name: country + in: query + description: Optional country filter (ISO 3166-1 alpha-2). + required: false + schema: + type: string + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/worldmonitor_conflict_v1_ListAcledEventsResponse' + "400": + description: Validation error + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationError' + default: + description: Error response + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /api/conflict/v1/list-ucdp-events: + get: + tags: + - ConflictService + summary: ListUcdpEvents + description: ListUcdpEvents retrieves georeferenced violence events from the UCDP dataset. + operationId: ListUcdpEvents + parameters: + - name: start + in: query + description: Start of time range (inclusive), Unix epoch milliseconds. + required: false + schema: + type: string + format: int64 + - name: end + in: query + description: End of time range (inclusive), Unix epoch milliseconds. + required: false + schema: + type: string + format: int64 + - name: page_size + in: query + description: Maximum items per page (1-100). + required: false + schema: + type: integer + format: int32 + - name: cursor + in: query + description: Cursor for next page. + required: false + schema: + type: string + - name: country + in: query + description: Optional country filter (ISO 3166-1 alpha-2). + required: false + schema: + type: string + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/worldmonitor_conflict_v1_ListUcdpEventsResponse' + "400": + description: Validation error + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationError' + default: + description: Error response + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /api/conflict/v1/get-humanitarian-summary: + get: + tags: + - ConflictService + summary: GetHumanitarianSummary + description: GetHumanitarianSummary retrieves a humanitarian overview for a country from HAPI/HDX. + operationId: GetHumanitarianSummary + parameters: + - name: country_code + in: query + description: ISO 3166-1 alpha-2 country code (e.g., "YE", "SD", "SO"). + required: false + schema: + type: string + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/worldmonitor_conflict_v1_GetHumanitarianSummaryResponse' + "400": + description: Validation error + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationError' + default: + description: Error response + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /api/conflict/v1/list-iran-events: + get: + tags: + - ConflictService + summary: ListIranEvents + description: ListIranEvents retrieves scraped conflict events from LiveUAMap Iran. + operationId: ListIranEvents + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/worldmonitor_conflict_v1_ListIranEventsResponse' + "400": + description: Validation error + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationError' + default: + description: Error response + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /api/conflict/v1/get-humanitarian-summary-batch: + post: + tags: + - ConflictService + summary: GetHumanitarianSummaryBatch + description: GetHumanitarianSummaryBatch retrieves humanitarian summaries for multiple countries in one call. + operationId: GetHumanitarianSummaryBatch + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/worldmonitor_conflict_v1_GetHumanitarianSummaryBatchRequest' + required: true + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/worldmonitor_conflict_v1_GetHumanitarianSummaryBatchResponse' + "400": + description: Validation error + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationError' + default: + description: Error response + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /api/consumer-prices/v1/get-consumer-price-overview: + get: + tags: + - ConsumerPricesService + summary: GetConsumerPriceOverview + description: GetConsumerPriceOverview retrieves headline basket indices and coverage metrics. + operationId: GetConsumerPriceOverview + parameters: + - name: market_code + in: query + description: market_code is the ISO 3166-1 alpha-2 market identifier (e.g. "ae"). + required: false + schema: + type: string + - name: basket_slug + in: query + description: basket_slug selects which basket to use (e.g. "essentials-ae"). + required: false + schema: + type: string + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/worldmonitor_consumer_prices_v1_GetConsumerPriceOverviewResponse' + "400": + description: Validation error + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationError' + default: + description: Error response + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /api/consumer-prices/v1/get-consumer-price-basket-series: + get: + tags: + - ConsumerPricesService + summary: GetConsumerPriceBasketSeries + description: GetConsumerPriceBasketSeries retrieves the basket index time series. + operationId: GetConsumerPriceBasketSeries + parameters: + - name: market_code + in: query + description: market_code is the ISO 3166-1 alpha-2 market identifier. + required: false + schema: + type: string + - name: basket_slug + in: query + description: basket_slug selects the basket (e.g. "essentials-ae"). + required: false + schema: + type: string + - name: range + in: query + description: range is one of "7d", "30d", "90d", "180d". + required: false + schema: + type: string + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/worldmonitor_consumer_prices_v1_GetConsumerPriceBasketSeriesResponse' + "400": + description: Validation error + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationError' + default: + description: Error response + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /api/consumer-prices/v1/list-consumer-price-categories: + get: + tags: + - ConsumerPricesService + summary: ListConsumerPriceCategories + description: ListConsumerPriceCategories retrieves category summaries with sparklines. + operationId: ListConsumerPriceCategories + parameters: + - name: market_code + in: query + description: market_code is the ISO 3166-1 alpha-2 market identifier. + required: false + schema: + type: string + - name: basket_slug + in: query + description: basket_slug selects the basket scope. + required: false + schema: + type: string + - name: range + in: query + description: range is one of "7d", "30d", "90d", "180d". + required: false + schema: + type: string + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/worldmonitor_consumer_prices_v1_ListConsumerPriceCategoriesResponse' + "400": + description: Validation error + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationError' + default: + description: Error response + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /api/consumer-prices/v1/list-consumer-price-movers: + get: + tags: + - ConsumerPricesService + summary: ListConsumerPriceMovers + description: ListConsumerPriceMovers retrieves the largest upward and downward item price moves. + operationId: ListConsumerPriceMovers + parameters: + - name: market_code + in: query + description: market_code is the ISO 3166-1 alpha-2 market identifier. + required: false + schema: + type: string + - name: range + in: query + description: range is one of "7d", "30d", "90d". + required: false + schema: + type: string + - name: limit + in: query + description: limit caps the number of risers and fallers returned (default 10). + required: false + schema: + type: integer + format: int32 + - name: category_slug + in: query + description: category_slug filters to a single category when set. + required: false + schema: + type: string + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/worldmonitor_consumer_prices_v1_ListConsumerPriceMoversResponse' + "400": + description: Validation error + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationError' + default: + description: Error response + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /api/consumer-prices/v1/list-retailer-price-spreads: + get: + tags: + - ConsumerPricesService + summary: ListRetailerPriceSpreads + description: ListRetailerPriceSpreads retrieves cheapest-basket comparisons across retailers. + operationId: ListRetailerPriceSpreads + parameters: + - name: market_code + in: query + description: market_code is the ISO 3166-1 alpha-2 market identifier. + required: false + schema: + type: string + - name: basket_slug + in: query + description: basket_slug selects which basket to compare across retailers. + required: false + schema: + type: string + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/worldmonitor_consumer_prices_v1_ListRetailerPriceSpreadsResponse' + "400": + description: Validation error + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationError' + default: + description: Error response + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /api/consumer-prices/v1/get-consumer-price-freshness: + get: + tags: + - ConsumerPricesService + summary: GetConsumerPriceFreshness + description: GetConsumerPriceFreshness retrieves feed freshness and coverage health per retailer. + operationId: GetConsumerPriceFreshness + parameters: + - name: market_code + in: query + description: market_code is the ISO 3166-1 alpha-2 market identifier. + required: false + schema: + type: string + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/worldmonitor_consumer_prices_v1_GetConsumerPriceFreshnessResponse' + "400": + description: Validation error + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationError' + default: + description: Error response + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /api/cyber/v1/list-cyber-threats: + get: + tags: + - CyberService + summary: ListCyberThreats + description: ListCyberThreats retrieves threat indicators from multiple intelligence sources. + operationId: ListCyberThreats + parameters: + - name: start + in: query + description: Start of time range (inclusive), Unix epoch milliseconds. + required: false + schema: + type: string + format: int64 + - name: end + in: query + description: End of time range (inclusive), Unix epoch milliseconds. + required: false + schema: + type: string + format: int64 + - name: page_size + in: query + description: Maximum items per page (1-100). + required: false + schema: + type: integer + format: int32 + - name: cursor + in: query + description: Cursor for next page. + required: false + schema: + type: string + - name: type + in: query + description: Optional threat type filter. + required: false + schema: + type: string + - name: source + in: query + description: Optional source filter. + required: false + schema: + type: string + - name: min_severity + in: query + description: Optional minimum criticality filter. + required: false + schema: + type: string + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/worldmonitor_cyber_v1_ListCyberThreatsResponse' + "400": + description: Validation error + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationError' + default: + description: Error response + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /api/displacement/v1/get-displacement-summary: + get: + tags: + - DisplacementService + summary: GetDisplacementSummary + description: GetDisplacementSummary retrieves global refugee and IDP statistics from UNHCR. + operationId: GetDisplacementSummary + parameters: + - name: year + in: query + description: Data year to retrieve (e.g., 2023). Uses latest available if zero. + required: false + schema: + type: integer + format: int32 + - name: country_limit + in: query + description: Maximum number of country entries to return. + required: false + schema: + type: integer + format: int32 + - name: flow_limit + in: query + description: Maximum number of displacement flows to return. + required: false + schema: + type: integer + format: int32 + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/worldmonitor_displacement_v1_GetDisplacementSummaryResponse' + "400": + description: Validation error + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationError' + default: + description: Error response + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /api/displacement/v1/get-population-exposure: + get: + tags: + - DisplacementService + summary: GetPopulationExposure + description: GetPopulationExposure returns country population data or estimates population within a radius. + operationId: GetPopulationExposure + parameters: + - name: mode + in: query + description: 'Mode: "countries" (default) or "exposure".' + required: false + schema: + type: string + - name: lat + in: query + description: Latitude (required for exposure mode). + required: false + schema: + type: number + format: double + - name: lon + in: query + description: Longitude (required for exposure mode). + required: false + schema: + type: number + format: double + - name: radius + in: query + description: Radius in km (required for exposure mode, defaults to 50). + required: false + schema: + type: number + format: double + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/worldmonitor_displacement_v1_GetPopulationExposureResponse' + "400": + description: Validation error + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationError' + default: + description: Error response + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /api/economic/v1/get-fred-series: + get: + tags: + - EconomicService + summary: GetFredSeries + description: GetFredSeries retrieves time series data from the Federal Reserve Economic Data. + operationId: GetFredSeries + parameters: + - name: series_id + in: query + description: FRED series ID (e.g., "GDP", "UNRATE", "CPIAUCSL"). + required: false + schema: + type: string + - name: limit + in: query + description: Maximum number of observations to return. Defaults to 120. + required: false + schema: + type: integer + format: int32 + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/worldmonitor_economic_v1_GetFredSeriesResponse' + "400": + description: Validation error + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationError' + default: + description: Error response + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /api/economic/v1/list-world-bank-indicators: + get: + tags: + - EconomicService + summary: ListWorldBankIndicators + description: ListWorldBankIndicators retrieves development indicator data from the World Bank. + operationId: ListWorldBankIndicators + parameters: + - name: indicator_code + in: query + description: World Bank indicator code (e.g., "NY.GDP.MKTP.CD"). + required: false + schema: + type: string + - name: country_code + in: query + description: Optional country filter (ISO 3166-1 alpha-2). + required: false + schema: + type: string + - name: year + in: query + description: Optional year filter. Defaults to latest available. + required: false + schema: + type: integer + format: int32 + - name: page_size + in: query + description: Maximum items per page. + required: false + schema: + type: integer + format: int32 + - name: cursor + in: query + description: Cursor for next page. + required: false + schema: + type: string + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/worldmonitor_economic_v1_ListWorldBankIndicatorsResponse' + "400": + description: Validation error + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationError' + default: + description: Error response + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /api/economic/v1/get-energy-prices: + get: + tags: + - EconomicService + summary: GetEnergyPrices + description: GetEnergyPrices retrieves current energy commodity prices from EIA. + operationId: GetEnergyPrices + parameters: + - name: commodities + in: query + description: Optional commodity filter. Empty returns all tracked commodities. + required: false + style: form + explode: true + schema: + type: array + items: + type: string + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/worldmonitor_economic_v1_GetEnergyPricesResponse' + "400": + description: Validation error + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationError' + default: + description: Error response + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /api/economic/v1/get-macro-signals: + get: + tags: + - EconomicService + summary: GetMacroSignals + description: GetMacroSignals computes 7 macro signals from 6 upstream sources with BUY/CASH verdict. + operationId: GetMacroSignals + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/worldmonitor_economic_v1_GetMacroSignalsResponse' + "400": + description: Validation error + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationError' + default: + description: Error response + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /api/economic/v1/get-energy-capacity: + get: + tags: + - EconomicService + summary: GetEnergyCapacity + description: GetEnergyCapacity retrieves installed capacity data (solar, wind, coal) from EIA. + operationId: GetEnergyCapacity + parameters: + - name: energy_sources + in: query + description: |- + Energy source codes to query (e.g., "SUN", "WND", "COL"). + Empty returns all tracked sources (SUN, WND, COL). + required: false + style: form + explode: true + schema: + type: array + items: + type: string + - name: years + in: query + description: Number of years of historical data. Default 20 if not set. + required: false + schema: + type: integer + format: int32 + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/worldmonitor_economic_v1_GetEnergyCapacityResponse' + "400": + description: Validation error + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationError' + default: + description: Error response + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /api/economic/v1/get-bis-policy-rates: + get: + tags: + - EconomicService + summary: GetBisPolicyRates + description: GetBisPolicyRates retrieves central bank policy rates from BIS. + operationId: GetBisPolicyRates + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/worldmonitor_economic_v1_GetBisPolicyRatesResponse' + "400": + description: Validation error + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationError' + default: + description: Error response + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /api/economic/v1/get-bis-exchange-rates: + get: + tags: + - EconomicService + summary: GetBisExchangeRates + description: GetBisExchangeRates retrieves effective exchange rates from BIS. + operationId: GetBisExchangeRates + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/worldmonitor_economic_v1_GetBisExchangeRatesResponse' + "400": + description: Validation error + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationError' + default: + description: Error response + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /api/economic/v1/get-bis-credit: + get: + tags: + - EconomicService + summary: GetBisCredit + description: GetBisCredit retrieves credit-to-GDP ratio data from BIS. + operationId: GetBisCredit + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/worldmonitor_economic_v1_GetBisCreditResponse' + "400": + description: Validation error + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationError' + default: + description: Error response + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /api/economic/v1/get-fred-series-batch: + post: + tags: + - EconomicService + summary: GetFredSeriesBatch + description: GetFredSeriesBatch retrieves multiple FRED series in a single call. + operationId: GetFredSeriesBatch + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/worldmonitor_economic_v1_GetFredSeriesBatchRequest' + required: true + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/worldmonitor_economic_v1_GetFredSeriesBatchResponse' + "400": + description: Validation error + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationError' + default: + description: Error response + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /api/economic/v1/list-grocery-basket-prices: + get: + tags: + - EconomicService + summary: ListGroceryBasketPrices + description: ListGroceryBasketPrices retrieves grocery basket price comparison across 24 countries worldwide. + operationId: ListGroceryBasketPrices + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/worldmonitor_economic_v1_ListGroceryBasketPricesResponse' + "400": + description: Validation error + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationError' + default: + description: Error response + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /api/economic/v1/list-bigmac-prices: + get: + tags: + - EconomicService + summary: ListBigMacPrices + description: ListBigMacPrices retrieves Big Mac Index prices across Middle East countries. + operationId: ListBigMacPrices + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/worldmonitor_economic_v1_ListBigMacPricesResponse' + "400": + description: Validation error + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationError' + default: + description: Error response + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /api/economic/v1/get-national-debt: + get: + tags: + - EconomicService + summary: GetNationalDebt + description: GetNationalDebt retrieves national debt clock data for all countries. + operationId: GetNationalDebt + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/worldmonitor_economic_v1_GetNationalDebtResponse' + "400": + description: Validation error + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationError' + default: + description: Error response + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /api/economic/v1/list-fuel-prices: + get: + tags: + - EconomicService + summary: ListFuelPrices + description: ListFuelPrices retrieves retail gasoline and diesel prices across 30+ countries. + operationId: ListFuelPrices + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/worldmonitor_economic_v1_ListFuelPricesResponse' + "400": + description: Validation error + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationError' + default: + description: Error response + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /api/economic/v1/get-bls-series: + get: + tags: + - EconomicService + summary: GetBlsSeries + description: GetBlsSeries retrieves BLS-only series not available on FRED (CES, LAUMT, CIU). + operationId: GetBlsSeries + parameters: + - name: series_id + in: query + description: BLS series ID (e.g. "CES0500000001", "CIU1010000000000A"). + required: false + schema: + type: string + - name: limit + in: query + description: Maximum number of observations to return. Defaults to 60. + required: false + schema: + type: integer + format: int32 + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/worldmonitor_economic_v1_GetBlsSeriesResponse' + "400": + description: Validation error + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationError' + default: + description: Error response + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /api/economic/v1/get-economic-calendar: + get: + tags: + - EconomicService + summary: GetEconomicCalendar + description: GetEconomicCalendar retrieves upcoming major economic events (FOMC, CPI, NFP, etc). + operationId: GetEconomicCalendar + parameters: + - name: fromDate + in: query + required: false + schema: + type: string + - name: toDate + in: query + required: false + schema: + type: string + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/worldmonitor_economic_v1_GetEconomicCalendarResponse' + "400": + description: Validation error + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationError' + default: + description: Error response + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /api/economic/v1/get-crude-inventories: + get: + tags: + - EconomicService + summary: GetCrudeInventories + description: GetCrudeInventories retrieves the 8 most recent weeks of US crude oil stockpile data from EIA (WCRSTUS1). + operationId: GetCrudeInventories + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/worldmonitor_economic_v1_GetCrudeInventoriesResponse' + "400": + description: Validation error + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationError' + default: + description: Error response + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /api/economic/v1/get-nat-gas-storage: + get: + tags: + - EconomicService + summary: GetNatGasStorage + description: GetNatGasStorage retrieves the 8 most recent weeks of US natural gas working gas storage from EIA (NW2_EPG0_SWO_R48_BCF). + operationId: GetNatGasStorage + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/worldmonitor_economic_v1_GetNatGasStorageResponse' + "400": + description: Validation error + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationError' + default: + description: Error response + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /api/economic/v1/get-ecb-fx-rates: + get: + tags: + - EconomicService + summary: GetEcbFxRates + description: GetEcbFxRates retrieves daily ECB official reference rates for EUR/major currency pairs. + operationId: GetEcbFxRates + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/worldmonitor_economic_v1_GetEcbFxRatesResponse' + "400": + description: Validation error + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationError' + default: + description: Error response + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /api/economic/v1/get-eurostat-country-data: + get: + tags: + - EconomicService + summary: GetEurostatCountryData + description: GetEurostatCountryData retrieves per-country CPI, unemployment, and GDP growth for 10 EU member states. + operationId: GetEurostatCountryData + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/worldmonitor_economic_v1_GetEurostatCountryDataResponse' + "400": + description: Validation error + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationError' + default: + description: Error response + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /api/economic/v1/get-eu-gas-storage: + get: + tags: + - EconomicService + summary: GetEuGasStorage + description: GetEuGasStorage retrieves EU aggregate natural gas storage fill % from GIE AGSI+. + operationId: GetEuGasStorage + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/worldmonitor_economic_v1_GetEuGasStorageResponse' + "400": + description: Validation error + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationError' + default: + description: Error response + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /api/economic/v1/get-eu-yield-curve: + get: + tags: + - EconomicService + summary: GetEuYieldCurve + description: GetEuYieldCurve retrieves the ECB Euro Area AAA sovereign yield curve (Svensson model spot rates). + operationId: GetEuYieldCurve + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/worldmonitor_economic_v1_GetEuYieldCurveResponse' + "400": + description: Validation error + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationError' + default: + description: Error response + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /api/economic/v1/get-eu-fsi: + get: + tags: + - EconomicService + summary: GetEuFsi + description: GetEuFsi retrieves the ECB CISS (Composite Indicator of Systemic Stress) for the Euro area. + operationId: GetEuFsi + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/worldmonitor_economic_v1_GetEuFsiResponse' + "400": + description: Validation error + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationError' + default: + description: Error response + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /api/economic/v1/get-economic-stress: + get: + tags: + - EconomicService + summary: GetEconomicStress + description: GetEconomicStress retrieves the composite Economic Stress Index (0-100) from 6 FRED series. + operationId: GetEconomicStress + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/worldmonitor_economic_v1_GetEconomicStressResponse' + "400": + description: Validation error + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationError' + default: + description: Error response + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /api/economic/v1/get-fao-food-price-index: + get: + tags: + - EconomicService + summary: GetFaoFoodPriceIndex + description: GetFaoFoodPriceIndex retrieves the FAO Food Price Index for the past 12 months. + operationId: GetFaoFoodPriceIndex + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/worldmonitor_economic_v1_GetFaoFoodPriceIndexResponse' + "400": + description: Validation error + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationError' + default: + description: Error response + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /api/economic/v1/get-oil-stocks-analysis: + get: + tags: + - EconomicService + summary: GetOilStocksAnalysis + description: GetOilStocksAnalysis retrieves the IEA oil stocks days-of-cover ranking and regional summary. + operationId: GetOilStocksAnalysis + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/worldmonitor_economic_v1_GetOilStocksAnalysisResponse' + "400": + description: Validation error + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationError' + default: + description: Error response + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /api/economic/v1/get-oil-inventories: + get: + tags: + - EconomicService + summary: GetOilInventories + operationId: GetOilInventories + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/worldmonitor_economic_v1_GetOilInventoriesResponse' + "400": + description: Validation error + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationError' + default: + description: Error response + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /api/economic/v1/get-energy-crisis-policies: + get: + tags: + - EconomicService + summary: GetEnergyCrisisPolicies + description: GetEnergyCrisisPolicies retrieves government policy responses to the 2026 energy crisis from the IEA tracker. + operationId: GetEnergyCrisisPolicies + parameters: + - name: country_code + in: query + description: Optional ISO-2 country code filter. + required: false + schema: + type: string + - name: category + in: query + description: 'Optional category filter: "conservation" or "consumer_support".' + required: false + schema: + type: string + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/worldmonitor_economic_v1_GetEnergyCrisisPoliciesResponse' + "400": + description: Validation error + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationError' + default: + description: Error response + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /api/forecast/v1/get-forecasts: + get: + tags: + - ForecastService + summary: GetForecasts + operationId: GetForecasts + parameters: + - name: domain + in: query + required: false + schema: + type: string + - name: region + in: query + required: false + schema: + type: string + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/worldmonitor_forecast_v1_GetForecastsResponse' + "400": + description: Validation error + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationError' + default: + description: Error response + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /api/forecast/v1/get-simulation-package: + get: + tags: + - ForecastService + summary: GetSimulationPackage + operationId: GetSimulationPackage + parameters: + - name: runId + in: query + description: Currently ignored; always returns the latest package. Reserved for Phase 3 per-run lookup. + required: false + schema: + type: string + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/worldmonitor_forecast_v1_GetSimulationPackageResponse' + "400": + description: Validation error + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationError' + default: + description: Error response + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /api/forecast/v1/get-simulation-outcome: + get: + tags: + - ForecastService + summary: GetSimulationOutcome + operationId: GetSimulationOutcome + parameters: + - name: runId + in: query + description: |- + IMPORTANT: Currently a no-op. Always returns the latest available outcome regardless of runId. + Per-run lookup is reserved for Phase 3. Check the response 'note' field when runId is supplied + and you need to detect a mismatch between requested and returned run. + required: false + schema: + type: string + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/worldmonitor_forecast_v1_GetSimulationOutcomeResponse' + "400": + description: Validation error + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationError' + default: + description: Error response + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /api/giving/v1/get-giving-summary: + get: + tags: + - GivingService + summary: GetGivingSummary + description: GetGivingSummary retrieves a composite global giving activity index and platform breakdowns. + operationId: GetGivingSummary + parameters: + - name: platform_limit + in: query + description: Number of platforms to include (0 = all). + required: false + schema: + type: integer + format: int32 + - name: category_limit + in: query + description: Number of category breakdowns to include (0 = all). + required: false + schema: + type: integer + format: int32 + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/worldmonitor_giving_v1_GetGivingSummaryResponse' + "400": + description: Validation error + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationError' + default: + description: Error response + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /api/health/v1/list-disease-outbreaks: + get: + tags: + - HealthService + summary: ListDiseaseOutbreaks + description: ListDiseaseOutbreaks returns recent WHO/ProMED disease outbreak alerts. + operationId: ListDiseaseOutbreaks + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/worldmonitor_health_v1_ListDiseaseOutbreaksResponse' + "400": + description: Validation error + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationError' + default: + description: Error response + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /api/health/v1/list-air-quality-alerts: + get: + tags: + - HealthService + summary: ListAirQualityAlerts + description: ListAirQualityAlerts returns recent PM2.5 stations with AQI-derived health risk. + operationId: ListAirQualityAlerts + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/worldmonitor_health_v1_ListAirQualityAlertsResponse' + "400": + description: Validation error + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationError' + default: + description: Error response + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /api/imagery/v1/search-imagery: + get: + tags: + - ImageryService + summary: SearchImagery + operationId: SearchImagery + parameters: + - name: bbox + in: query + required: false + schema: + type: string + - name: datetime + in: query + required: false + schema: + type: string + - name: source + in: query + required: false + schema: + type: string + - name: limit + in: query + required: false + schema: + type: integer + format: int32 + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/worldmonitor_imagery_v1_SearchImageryResponse' + "400": + description: Validation error + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationError' + default: + description: Error response + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /api/infrastructure/v1/list-internet-outages: + get: + tags: + - InfrastructureService + summary: ListInternetOutages + description: ListInternetOutages retrieves detected internet outages from Cloudflare Radar. + operationId: ListInternetOutages + parameters: + - name: start + in: query + description: Start of time range (inclusive), Unix epoch milliseconds. + required: false + schema: + type: string + format: int64 + - name: end + in: query + description: End of time range (inclusive), Unix epoch milliseconds. + required: false + schema: + type: string + format: int64 + - name: page_size + in: query + description: Maximum items per page. + required: false + schema: + type: integer + format: int32 + - name: cursor + in: query + description: Cursor for next page. + required: false + schema: + type: string + - name: country + in: query + description: Optional country filter (ISO 3166-1 alpha-2). + required: false + schema: + type: string + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/worldmonitor_infrastructure_v1_ListInternetOutagesResponse' + "400": + description: Validation error + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationError' + default: + description: Error response + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /api/infrastructure/v1/list-service-statuses: + get: + tags: + - InfrastructureService + summary: ListServiceStatuses + description: ListServiceStatuses retrieves operational status of monitored external services. + operationId: ListServiceStatuses + parameters: + - name: status + in: query + description: Optional status filter. Returns only services in this state. + required: false + schema: + type: string + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/worldmonitor_infrastructure_v1_ListServiceStatusesResponse' + "400": + description: Validation error + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationError' + default: + description: Error response + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /api/infrastructure/v1/get-temporal-baseline: + get: + tags: + - InfrastructureService + summary: GetTemporalBaseline + description: GetTemporalBaseline retrieves historical baseline data for a specific signal. + operationId: GetTemporalBaseline + parameters: + - name: type + in: query + description: 'Activity type: "military_flights", "vessels", "protests", "news", "ais_gaps", "satellite_fires".' + required: false + schema: + type: string + - name: region + in: query + description: Geographic region key, defaults to "global". + required: false + schema: + type: string + - name: count + in: query + description: Current observed count to compare against baseline. + required: false + schema: + type: number + format: double + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/worldmonitor_infrastructure_v1_GetTemporalBaselineResponse' + "400": + description: Validation error + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationError' + default: + description: Error response + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /api/infrastructure/v1/get-ip-geo: + get: + tags: + - InfrastructureService + summary: GetIpGeo + description: GetIpGeo retrieves geographic information based on the caller's IP address. + operationId: GetIpGeo + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/worldmonitor_infrastructure_v1_GetIpGeoResponse' + "400": + description: Validation error + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationError' + default: + description: Error response + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /api/infrastructure/v1/reverse-geocode: + get: + tags: + - InfrastructureService + summary: ReverseGeocode + description: ReverseGeocode resolves geographic coordinates to a postal address/country. + operationId: ReverseGeocode + parameters: + - name: lat + in: query + required: false + schema: + type: number + format: double + - name: lon + in: query + required: false + schema: + type: number + format: double + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/worldmonitor_infrastructure_v1_ReverseGeocodeResponse' + "400": + description: Validation error + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationError' + default: + description: Error response + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /api/infrastructure/v1/get-bootstrap-data: + get: + tags: + - InfrastructureService + summary: GetBootstrapData + description: GetBootstrapData fetches multiple data points from the system cache in a single call. + operationId: GetBootstrapData + parameters: + - name: tier + in: query + description: Predefined tiers or specific keys. + required: false + schema: + type: string + - name: keys + in: query + required: false + style: form + explode: true + schema: + type: array + items: + type: string + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/worldmonitor_infrastructure_v1_GetBootstrapDataResponse' + "400": + description: Validation error + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationError' + default: + description: Error response + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /api/infrastructure/v1/record-baseline-snapshot: + post: + tags: + - InfrastructureService + summary: RecordBaselineSnapshot + description: RecordBaselineSnapshot batch-updates baseline statistics using Welford's online algorithm. + operationId: RecordBaselineSnapshot + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/worldmonitor_infrastructure_v1_RecordBaselineSnapshotRequest' + required: true + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/worldmonitor_infrastructure_v1_RecordBaselineSnapshotResponse' + "400": + description: Validation error + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationError' + default: + description: Error response + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /api/infrastructure/v1/get-cable-health: + get: + tags: + - InfrastructureService + summary: GetCableHealth + description: GetCableHealth computes health status for submarine cables from NGA maritime warning signals. + operationId: GetCableHealth + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/worldmonitor_infrastructure_v1_GetCableHealthResponse' + "400": + description: Validation error + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationError' + default: + description: Error response + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /api/infrastructure/v1/list-temporal-anomalies: + get: + tags: + - InfrastructureService + summary: ListTemporalAnomalies + description: ListTemporalAnomalies returns server-computed temporal anomalies for news and satellite_fires. + operationId: ListTemporalAnomalies + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/worldmonitor_infrastructure_v1_ListTemporalAnomaliesResponse' + "400": + description: Validation error + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationError' + default: + description: Error response + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /api/infrastructure/v1/list-internet-ddos-attacks: + get: + tags: + - InfrastructureService + summary: ListInternetDdosAttacks + description: ListInternetDdosAttacks retrieves L3/L4 DDoS attack summaries from Cloudflare Radar. + operationId: ListInternetDdosAttacks + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/worldmonitor_infrastructure_v1_ListInternetDdosAttacksResponse' + "400": + description: Validation error + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationError' + default: + description: Error response + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /api/infrastructure/v1/list-internet-traffic-anomalies: + get: + tags: + - InfrastructureService + summary: ListInternetTrafficAnomalies + description: ListInternetTrafficAnomalies retrieves traffic anomaly events from Cloudflare Radar. + operationId: ListInternetTrafficAnomalies + parameters: + - name: country + in: query + description: Optional ISO 3166-1 alpha-2 country code filter. + required: false + schema: + type: string + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/worldmonitor_infrastructure_v1_ListInternetTrafficAnomaliesResponse' + "400": + description: Validation error + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationError' + default: + description: Error response + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /api/intelligence/v1/get-risk-scores: + get: + tags: + - IntelligenceService + summary: GetRiskScores + description: GetRiskScores retrieves composite risk scores and strategic assessments. + operationId: GetRiskScores + parameters: + - name: region + in: query + description: Optional region filter. Empty returns all tracked regions. + required: false + schema: + type: string + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/worldmonitor_intelligence_v1_GetRiskScoresResponse' + "400": + description: Validation error + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationError' + default: + description: Error response + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /api/intelligence/v1/get-pizzint-status: + get: + tags: + - IntelligenceService + summary: GetPizzintStatus + description: GetPizzintStatus retrieves Pentagon Pizza Index and GDELT tension data. + operationId: GetPizzintStatus + parameters: + - name: include_gdelt + in: query + description: Whether to include GDELT tension pairs in the response. + required: false + schema: + type: boolean + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/worldmonitor_intelligence_v1_GetPizzintStatusResponse' + "400": + description: Validation error + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationError' + default: + description: Error response + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /api/intelligence/v1/classify-event: + get: + tags: + - IntelligenceService + summary: ClassifyEvent + description: ClassifyEvent analyzes a news event using AI models. + operationId: ClassifyEvent + parameters: + - name: title + in: query + description: Event title or headline. + required: false + schema: + type: string + - name: description + in: query + description: Event description or body text. + required: false + schema: + type: string + - name: source + in: query + description: Event source (e.g., "reuters", "acled"). + required: false + schema: + type: string + - name: country + in: query + description: Country context (ISO 3166-1 alpha-2). + required: false + schema: + type: string + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/worldmonitor_intelligence_v1_ClassifyEventResponse' + "400": + description: Validation error + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationError' + default: + description: Error response + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /api/intelligence/v1/get-country-risk: + get: + tags: + - IntelligenceService + summary: GetCountryRisk + description: GetCountryRisk retrieves composite risk intelligence for a specific country. + operationId: GetCountryRisk + parameters: + - name: country_code + in: query + description: ISO 3166-1 alpha-2 country code. + required: false + schema: + type: string + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/worldmonitor_intelligence_v1_GetCountryRiskResponse' + "400": + description: Validation error + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationError' + default: + description: Error response + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /api/intelligence/v1/get-country-intel-brief: + get: + tags: + - IntelligenceService + summary: GetCountryIntelBrief + description: GetCountryIntelBrief generates a strategic brief for a specific country. + operationId: GetCountryIntelBrief + parameters: + - name: country_code + in: query + description: ISO 3166-1 alpha-2 country code. + required: false + schema: + type: string + - name: framework + in: query + description: Optional analytical framework instructions to append to system prompt. Max 2000 chars enforced at handler level. + required: false + schema: + type: string + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/worldmonitor_intelligence_v1_GetCountryIntelBriefResponse' + "400": + description: Validation error + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationError' + default: + description: Error response + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /api/intelligence/v1/search-gdelt-documents: + get: + tags: + - IntelligenceService + summary: SearchGdeltDocuments + description: SearchGdeltDocuments searches the GDELT GKG API for relevant documentation. + operationId: SearchGdeltDocuments + parameters: + - name: query + in: query + description: Search query string. + required: false + schema: + type: string + - name: max_records + in: query + description: Maximum number of articles to return (1-250). + required: false + schema: + type: integer + format: int32 + - name: timespan + in: query + description: Time span filter (e.g., "15min", "1h", "24h"). + required: false + schema: + type: string + - name: tone_filter + in: query + description: |- + Tone filter appended to query (e.g., "tone>5" for positive, "tone<-5" for negative). + Left empty to skip tone filtering. + required: false + schema: + type: string + - name: sort + in: query + description: 'Sort mode: "DateDesc" (default), "ToneDesc", "ToneAsc", "HybridRel".' + required: false + schema: + type: string + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/worldmonitor_intelligence_v1_SearchGdeltDocumentsResponse' + "400": + description: Validation error + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationError' + default: + description: Error response + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /api/intelligence/v1/deduct-situation: + post: + tags: + - IntelligenceService + summary: DeductSituation + description: DeductSituation performs broad situational analysis using LLMs. + operationId: DeductSituation + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/worldmonitor_intelligence_v1_DeductSituationRequest' + required: true + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/worldmonitor_intelligence_v1_DeductSituationResponse' + "400": + description: Validation error + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationError' + default: + description: Error response + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /api/intelligence/v1/list-satellites: + get: + tags: + - IntelligenceService + summary: ListSatellites + description: ListSatellites retrieves current orbital positions and metadata. + operationId: ListSatellites + parameters: + - name: country + in: query + description: Filter by country code. Empty returns all. + required: false + schema: + type: string + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/worldmonitor_intelligence_v1_ListSatellitesResponse' + "400": + description: Validation error + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationError' + default: + description: Error response + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /api/intelligence/v1/list-gps-interference: + get: + tags: + - IntelligenceService + summary: ListGpsInterference + description: ListGpsInterference retrieves detected GPS/GNSS interference data (jamming). + operationId: ListGpsInterference + parameters: + - name: region + in: query + description: Optional region filter. + required: false + schema: + type: string + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/worldmonitor_intelligence_v1_ListGpsInterferenceResponse' + "400": + description: Validation error + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationError' + default: + description: Error response + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /api/intelligence/v1/list-oref-alerts: + get: + tags: + - IntelligenceService + summary: ListOrefAlerts + description: ListOrefAlerts retrieves Israeli Home Front Command alerts (Red Alerts). + operationId: ListOrefAlerts + parameters: + - name: mode + in: query + description: Mode selection. MODE_UNSPECIFIED defaults to active alerts. + required: false + schema: + type: string + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/worldmonitor_intelligence_v1_ListOrefAlertsResponse' + "400": + description: Validation error + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationError' + default: + description: Error response + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /api/intelligence/v1/list-telegram-feed: + get: + tags: + - IntelligenceService + summary: ListTelegramFeed + description: ListTelegramFeed retrieves real-time OSINT messages from monitored Telegram channels. + operationId: ListTelegramFeed + parameters: + - name: limit + in: query + description: Maximum number of messages to return (default 50). + required: false + schema: + type: integer + format: int32 + - name: topic + in: query + description: Filter by topic keyword (e.g. "military", "cyber"). + required: false + schema: + type: string + - name: channel + in: query + description: Filter by specific channel ID or name. + required: false + schema: + type: string + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/worldmonitor_intelligence_v1_ListTelegramFeedResponse' + "400": + description: Validation error + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationError' + default: + description: Error response + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /api/intelligence/v1/get-company-enrichment: + get: + tags: + - IntelligenceService + summary: GetCompanyEnrichment + description: GetCompanyEnrichment aggregates company data from multiple public sources (GitHub, SEC, HN). + operationId: GetCompanyEnrichment + parameters: + - name: domain + in: query + required: false + schema: + type: string + - name: name + in: query + required: false + schema: + type: string + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/worldmonitor_intelligence_v1_GetCompanyEnrichmentResponse' + "400": + description: Validation error + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationError' + default: + description: Error response + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /api/intelligence/v1/list-company-signals: + get: + tags: + - IntelligenceService + summary: ListCompanySignals + description: ListCompanySignals discovers activity signals for a company from public sources. + operationId: ListCompanySignals + parameters: + - name: company + in: query + required: false + schema: + type: string + - name: domain + in: query + required: false + schema: + type: string + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/worldmonitor_intelligence_v1_ListCompanySignalsResponse' + "400": + description: Validation error + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationError' + default: + description: Error response + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /api/intelligence/v1/get-country-facts: + get: + tags: + - IntelligenceService + summary: GetCountryFacts + description: GetCountryFacts retrieves factual country data from RestCountries and Wikipedia. + operationId: GetCountryFacts + parameters: + - name: country_code + in: query + required: false + schema: + type: string + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/worldmonitor_intelligence_v1_GetCountryFactsResponse' + "400": + description: Validation error + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationError' + default: + description: Error response + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /api/intelligence/v1/list-security-advisories: + get: + tags: + - IntelligenceService + summary: ListSecurityAdvisories + description: ListSecurityAdvisories retrieves pre-seeded travel and health advisories. + operationId: ListSecurityAdvisories + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/worldmonitor_intelligence_v1_ListSecurityAdvisoriesResponse' + "400": + description: Validation error + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationError' + default: + description: Error response + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /api/intelligence/v1/get-gdelt-topic-timeline: + get: + tags: + - IntelligenceService + summary: GetGdeltTopicTimeline + description: GetGdeltTopicTimeline retrieves tone and volume timelines for a GDELT intel topic. + operationId: GetGdeltTopicTimeline + parameters: + - name: topic + in: query + description: Topic ID (military, cyber, nuclear, sanctions, intelligence, maritime). + required: false + schema: + type: string + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/worldmonitor_intelligence_v1_GetGdeltTopicTimelineResponse' + "400": + description: Validation error + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationError' + default: + description: Error response + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /api/intelligence/v1/list-cross-source-signals: + get: + tags: + - IntelligenceService + summary: ListCrossSourceSignals + description: ListCrossSourceSignals returns cross-domain signals ranked by severity with composite escalation detection. + operationId: ListCrossSourceSignals + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/worldmonitor_intelligence_v1_ListCrossSourceSignalsResponse' + "400": + description: Validation error + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationError' + default: + description: Error response + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /api/intelligence/v1/list-market-implications: + get: + tags: + - IntelligenceService + summary: ListMarketImplications + description: ListMarketImplications returns AI-generated trade-implication cards from live world state. + operationId: ListMarketImplications + parameters: + - name: frameworkId + in: query + required: false + schema: + type: string + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/worldmonitor_intelligence_v1_ListMarketImplicationsResponse' + "400": + description: Validation error + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationError' + default: + description: Error response + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /api/intelligence/v1/get-social-velocity: + get: + tags: + - IntelligenceService + summary: GetSocialVelocity + description: GetSocialVelocity returns trending Reddit posts from r/worldnews and r/geopolitics ranked by velocity. + operationId: GetSocialVelocity + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/worldmonitor_intelligence_v1_GetSocialVelocityResponse' + "400": + description: Validation error + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationError' + default: + description: Error response + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /api/intelligence/v1/get-country-energy-profile: + get: + tags: + - IntelligenceService + summary: GetCountryEnergyProfile + description: GetCountryEnergyProfile aggregates Phase 1/2/2.5 energy data per country. + operationId: GetCountryEnergyProfile + parameters: + - name: country_code + in: query + required: false + schema: + type: string + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/worldmonitor_intelligence_v1_GetCountryEnergyProfileResponse' + "400": + description: Validation error + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationError' + default: + description: Error response + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /api/intelligence/v1/compute-energy-shock: + get: + tags: + - IntelligenceService + summary: ComputeEnergyShockScenario + description: ComputeEnergyShockScenario computes on-demand product supply shock for a given country + chokepoint. + operationId: ComputeEnergyShockScenario + parameters: + - name: country_code + in: query + required: false + schema: + type: string + - name: chokepoint_id + in: query + required: false + schema: + type: string + - name: disruption_pct + in: query + required: false + schema: + type: integer + format: int32 + - name: fuel_mode + in: query + required: false + schema: + type: string + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/worldmonitor_intelligence_v1_ComputeEnergyShockScenarioResponse' + "400": + description: Validation error + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationError' + default: + description: Error response + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /api/intelligence/v1/get-country-port-activity: + get: + tags: + - IntelligenceService + summary: GetCountryPortActivity + description: GetCountryPortActivity returns port-level tanker traffic and trade volumes for a country. + operationId: GetCountryPortActivity + parameters: + - name: country_code + in: query + required: false + schema: + type: string + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/worldmonitor_intelligence_v1_CountryPortActivityResponse' + "400": + description: Validation error + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationError' + default: + description: Error response + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /api/intelligence/v1/get-regional-snapshot: + get: + tags: + - IntelligenceService + summary: GetRegionalSnapshot + description: |- + GetRegionalSnapshot returns the latest persisted RegionalSnapshot for a + region. The snapshot is written every 6h by scripts/seed-regional-snapshots.mjs; + this handler only reads canonical state. Premium-gated. + operationId: GetRegionalSnapshot + parameters: + - name: region_id + in: query + description: |- + Display region id (e.g. "mena", "east-asia", "europe"). See shared/geography.js. + Kebab-case: lowercase alphanumeric groups separated by single hyphens, no + trailing or consecutive hyphens. + required: false + schema: + type: string + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/worldmonitor_intelligence_v1_GetRegionalSnapshotResponse' + "400": + description: Validation error + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationError' + default: + description: Error response + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /api/intelligence/v1/get-regime-history: + get: + tags: + - IntelligenceService + summary: GetRegimeHistory + description: |- + GetRegimeHistory returns the region's regime transition log newest-first. + Entries are append-only from the seed writer, recorded only when + diffRegionalSnapshot reports regime_changed. Premium-gated. + operationId: GetRegimeHistory + parameters: + - name: region_id + in: query + description: |- + Display region id (e.g. "mena", "east-asia", "europe"). See shared/geography.js. + Kebab-case: lowercase alphanumeric groups separated by single hyphens, no + trailing or consecutive hyphens. + required: false + schema: + type: string + - name: limit + in: query + description: |- + Optional cap on how many entries to return. Defaults to 50 server-side + when omitted or <= 0. Hard cap enforced by the handler at 100 (= the + writer-side LTRIM cap in regime-history.mjs). + required: false + schema: + type: integer + format: int32 + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/worldmonitor_intelligence_v1_GetRegimeHistoryResponse' + "400": + description: Validation error + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationError' + default: + description: Error response + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /api/intelligence/v1/get-regional-brief: + get: + tags: + - IntelligenceService + summary: GetRegionalBrief + description: |- + GetRegionalBrief returns the latest weekly intelligence brief for a region. + Written by scripts/seed-regional-briefs.mjs on a weekly cron. Premium-gated. + operationId: GetRegionalBrief + parameters: + - name: region_id + in: query + required: false + schema: + type: string + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/worldmonitor_intelligence_v1_GetRegionalBriefResponse' + "400": + description: Validation error + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationError' + default: + description: Error response + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /api/leads/v1/submit-contact: + post: + tags: + - LeadsService + summary: SubmitContact + description: SubmitContact stores an enterprise contact submission in Convex and emails ops. + operationId: SubmitContact + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/worldmonitor_leads_v1_SubmitContactRequest' + required: true + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/worldmonitor_leads_v1_SubmitContactResponse' + "400": + description: Validation error + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationError' + default: + description: Error response + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /api/leads/v1/register-interest: + post: + tags: + - LeadsService + summary: RegisterInterest + description: RegisterInterest adds an email to the Pro waitlist and sends a confirmation email. + operationId: RegisterInterest + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/worldmonitor_leads_v1_RegisterInterestRequest' + required: true + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/worldmonitor_leads_v1_RegisterInterestResponse' + "400": + description: Validation error + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationError' + default: + description: Error response + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /api/maritime/v1/get-vessel-snapshot: + get: + tags: + - MaritimeService + summary: GetVesselSnapshot + description: GetVesselSnapshot retrieves a point-in-time view of AIS vessel traffic and disruptions. + operationId: GetVesselSnapshot + parameters: + - name: ne_lat + in: query + description: North-east corner latitude of bounding box. + required: false + schema: + type: number + format: double + - name: ne_lon + in: query + description: North-east corner longitude of bounding box. + required: false + schema: + type: number + format: double + - name: sw_lat + in: query + description: South-west corner latitude of bounding box. + required: false + schema: + type: number + format: double + - name: sw_lon + in: query + description: South-west corner longitude of bounding box. + required: false + schema: + type: number + format: double + - name: include_candidates + in: query + description: |- + When true, populate VesselSnapshot.candidate_reports with per-vessel + position reports. Clients with no position callbacks should leave this + false to keep responses small. + required: false + schema: + type: boolean + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/worldmonitor_maritime_v1_GetVesselSnapshotResponse' + "400": + description: Validation error + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationError' + default: + description: Error response + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /api/maritime/v1/list-navigational-warnings: + get: + tags: + - MaritimeService + summary: ListNavigationalWarnings + description: ListNavigationalWarnings retrieves active maritime safety warnings from NGA. + operationId: ListNavigationalWarnings + parameters: + - name: page_size + in: query + description: Maximum items per page (1-100). + required: false + schema: + type: integer + format: int32 + - name: cursor + in: query + description: Cursor for next page. + required: false + schema: + type: string + - name: area + in: query + description: Optional area filter (e.g., "NAVAREA IV", "Persian Gulf"). + required: false + schema: + type: string + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/worldmonitor_maritime_v1_ListNavigationalWarningsResponse' + "400": + description: Validation error + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationError' + default: + description: Error response + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /api/market/v1/list-market-quotes: + get: + tags: + - MarketService + summary: ListMarketQuotes + description: ListMarketQuotes retrieves stock and index quotes. + operationId: ListMarketQuotes + parameters: + - name: symbols + in: query + description: Ticker symbols to retrieve (e.g., ["AAPL", "^GSPC"]). Empty returns defaults. + required: false + style: form + explode: true + schema: + type: array + items: + type: string + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/worldmonitor_market_v1_ListMarketQuotesResponse' + "400": + description: Validation error + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationError' + default: + description: Error response + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /api/market/v1/list-crypto-quotes: + get: + tags: + - MarketService + summary: ListCryptoQuotes + description: ListCryptoQuotes retrieves cryptocurrency quotes from CoinGecko. + operationId: ListCryptoQuotes + parameters: + - name: ids + in: query + description: Cryptocurrency IDs to retrieve (CoinGecko IDs). Empty returns defaults. + required: false + style: form + explode: true + schema: + type: array + items: + type: string + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/worldmonitor_market_v1_ListCryptoQuotesResponse' + "400": + description: Validation error + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationError' + default: + description: Error response + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /api/market/v1/list-commodity-quotes: + get: + tags: + - MarketService + summary: ListCommodityQuotes + description: ListCommodityQuotes retrieves commodity price quotes from Yahoo Finance. + operationId: ListCommodityQuotes + parameters: + - name: symbols + in: query + description: Commodity symbols to retrieve (Yahoo symbols). Empty returns defaults. + required: false + style: form + explode: true + schema: + type: array + items: + type: string + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/worldmonitor_market_v1_ListCommodityQuotesResponse' + "400": + description: Validation error + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationError' + default: + description: Error response + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /api/market/v1/get-sector-summary: + get: + tags: + - MarketService + summary: GetSectorSummary + description: GetSectorSummary retrieves market sector performance data from Finnhub. + operationId: GetSectorSummary + parameters: + - name: period + in: query + description: Time period for performance calculation (e.g., "1d", "1w", "1m"). Defaults to "1d". + required: false + schema: + type: string + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/worldmonitor_market_v1_GetSectorSummaryResponse' + "400": + description: Validation error + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationError' + default: + description: Error response + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /api/market/v1/list-stablecoin-markets: + get: + tags: + - MarketService + summary: ListStablecoinMarkets + description: ListStablecoinMarkets retrieves stablecoin peg health and market data from CoinGecko. + operationId: ListStablecoinMarkets + parameters: + - name: coins + in: query + description: CoinGecko IDs to retrieve (e.g. "tether,usd-coin"). Empty returns defaults. + required: false + style: form + explode: true + schema: + type: array + items: + type: string + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/worldmonitor_market_v1_ListStablecoinMarketsResponse' + "400": + description: Validation error + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationError' + default: + description: Error response + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /api/market/v1/list-etf-flows: + get: + tags: + - MarketService + summary: ListEtfFlows + description: ListEtfFlows retrieves BTC spot ETF flow estimates from Yahoo Finance. + operationId: ListEtfFlows + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/worldmonitor_market_v1_ListEtfFlowsResponse' + "400": + description: Validation error + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationError' + default: + description: Error response + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /api/market/v1/get-country-stock-index: + get: + tags: + - MarketService + summary: GetCountryStockIndex + description: GetCountryStockIndex retrieves the primary stock index for a country from Yahoo Finance. + operationId: GetCountryStockIndex + parameters: + - name: country_code + in: query + description: ISO 3166-1 alpha-2 country code (e.g., "US", "GB", "JP"). + required: false + schema: + type: string + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/worldmonitor_market_v1_GetCountryStockIndexResponse' + "400": + description: Validation error + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationError' + default: + description: Error response + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /api/market/v1/list-gulf-quotes: + get: + tags: + - MarketService + summary: ListGulfQuotes + description: ListGulfQuotes retrieves Gulf region market quotes (indices, currencies, oil). + operationId: ListGulfQuotes + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/worldmonitor_market_v1_ListGulfQuotesResponse' + "400": + description: Validation error + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationError' + default: + description: Error response + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /api/market/v1/analyze-stock: + get: + tags: + - MarketService + summary: AnalyzeStock + description: AnalyzeStock retrieves a premium stock analysis report with technicals, news, and AI synthesis. + operationId: AnalyzeStock + parameters: + - name: symbol + in: query + required: false + schema: + type: string + - name: name + in: query + required: false + schema: + type: string + - name: include_news + in: query + required: false + schema: + type: boolean + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/worldmonitor_market_v1_AnalyzeStockResponse' + "400": + description: Validation error + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationError' + default: + description: Error response + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /api/market/v1/get-stock-analysis-history: + get: + tags: + - MarketService + summary: GetStockAnalysisHistory + description: GetStockAnalysisHistory retrieves shared premium stock analysis history from the backend store. + operationId: GetStockAnalysisHistory + parameters: + - name: symbols + in: query + required: false + style: form + explode: true + schema: + type: array + items: + type: string + - name: limit_per_symbol + in: query + required: false + schema: + type: integer + format: int32 + - name: include_news + in: query + required: false + schema: + type: boolean + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/worldmonitor_market_v1_GetStockAnalysisHistoryResponse' + "400": + description: Validation error + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationError' + default: + description: Error response + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /api/market/v1/backtest-stock: + get: + tags: + - MarketService + summary: BacktestStock + description: BacktestStock replays premium stock-analysis signals over recent price history. + operationId: BacktestStock + parameters: + - name: symbol + in: query + required: false + schema: + type: string + - name: name + in: query + required: false + schema: + type: string + - name: eval_window_days + in: query + required: false + schema: + type: integer + format: int32 + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/worldmonitor_market_v1_BacktestStockResponse' + "400": + description: Validation error + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationError' + default: + description: Error response + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /api/market/v1/list-stored-stock-backtests: + get: + tags: + - MarketService + summary: ListStoredStockBacktests + description: ListStoredStockBacktests retrieves stored premium backtest snapshots from the backend store. + operationId: ListStoredStockBacktests + parameters: + - name: symbols + in: query + required: false + style: form + explode: true + schema: + type: array + items: + type: string + - name: eval_window_days + in: query + required: false + schema: + type: integer + format: int32 + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/worldmonitor_market_v1_ListStoredStockBacktestsResponse' + "400": + description: Validation error + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationError' + default: + description: Error response + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /api/market/v1/list-crypto-sectors: + get: + tags: + - MarketService + summary: ListCryptoSectors + description: ListCryptoSectors retrieves crypto sector performance averages. + operationId: ListCryptoSectors + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/worldmonitor_market_v1_ListCryptoSectorsResponse' + "400": + description: Validation error + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationError' + default: + description: Error response + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /api/market/v1/list-defi-tokens: + get: + tags: + - MarketService + summary: ListDefiTokens + description: ListDefiTokens retrieves DeFi token prices and changes. + operationId: ListDefiTokens + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/worldmonitor_market_v1_ListDefiTokensResponse' + "400": + description: Validation error + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationError' + default: + description: Error response + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /api/market/v1/list-ai-tokens: + get: + tags: + - MarketService + summary: ListAiTokens + description: ListAiTokens retrieves AI-focused crypto token prices and changes. + operationId: ListAiTokens + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/worldmonitor_market_v1_ListAiTokensResponse' + "400": + description: Validation error + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationError' + default: + description: Error response + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /api/market/v1/list-other-tokens: + get: + tags: + - MarketService + summary: ListOtherTokens + description: ListOtherTokens retrieves other/trending crypto token prices and changes. + operationId: ListOtherTokens + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/worldmonitor_market_v1_ListOtherTokensResponse' + "400": + description: Validation error + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationError' + default: + description: Error response + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /api/market/v1/get-fear-greed-index: + get: + tags: + - MarketService + summary: GetFearGreedIndex + description: GetFearGreedIndex retrieves the composite Fear & Greed sentiment index. + operationId: GetFearGreedIndex + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/worldmonitor_market_v1_GetFearGreedIndexResponse' + "400": + description: Validation error + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationError' + default: + description: Error response + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /api/market/v1/list-earnings-calendar: + get: + tags: + - MarketService + summary: ListEarningsCalendar + description: ListEarningsCalendar retrieves upcoming and recent earnings releases. + operationId: ListEarningsCalendar + parameters: + - name: fromDate + in: query + required: false + schema: + type: string + - name: toDate + in: query + required: false + schema: + type: string + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/worldmonitor_market_v1_ListEarningsCalendarResponse' + "400": + description: Validation error + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationError' + default: + description: Error response + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /api/market/v1/get-cot-positioning: + get: + tags: + - MarketService + summary: GetCotPositioning + description: GetCotPositioning retrieves CFTC COT institutional positioning data. + operationId: GetCotPositioning + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/worldmonitor_market_v1_GetCotPositioningResponse' + "400": + description: Validation error + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationError' + default: + description: Error response + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /api/market/v1/get-insider-transactions: + get: + tags: + - MarketService + summary: GetInsiderTransactions + description: GetInsiderTransactions retrieves SEC insider buy/sell activity from Finnhub. + operationId: GetInsiderTransactions + parameters: + - name: symbol + in: query + required: false + schema: + type: string + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/worldmonitor_market_v1_GetInsiderTransactionsResponse' + "400": + description: Validation error + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationError' + default: + description: Error response + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /api/market/v1/get-market-breadth-history: + get: + tags: + - MarketService + summary: GetMarketBreadthHistory + description: GetMarketBreadthHistory retrieves historical % of S&P 500 stocks above 20/50/200-day SMAs. + operationId: GetMarketBreadthHistory + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/worldmonitor_market_v1_GetMarketBreadthHistoryResponse' + "400": + description: Validation error + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationError' + default: + description: Error response + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /api/market/v1/get-gold-intelligence: + get: + tags: + - MarketService + summary: GetGoldIntelligence + description: GetGoldIntelligence retrieves gold pricing, cross-currency XAU, ratios, and CFTC positioning. + operationId: GetGoldIntelligence + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/worldmonitor_market_v1_GetGoldIntelligenceResponse' + "400": + description: Validation error + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationError' + default: + description: Error response + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /api/market/v1/get-hyperliquid-flow: + get: + tags: + - MarketService + summary: GetHyperliquidFlow + description: GetHyperliquidFlow retrieves Hyperliquid perp positioning flow (funding/OI/basis composite scores). + operationId: GetHyperliquidFlow + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/worldmonitor_market_v1_GetHyperliquidFlowResponse' + "400": + description: Validation error + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationError' + default: + description: Error response + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /api/military/v1/list-military-flights: + get: + tags: + - MilitaryService + summary: ListMilitaryFlights + description: ListMilitaryFlights retrieves tracked military aircraft from OpenSky and Wingbits. + operationId: ListMilitaryFlights + parameters: + - name: page_size + in: query + description: Maximum items per page (1-100). + required: false + schema: + type: integer + format: int32 + - name: cursor + in: query + description: Cursor for next page. + required: false + schema: + type: string + - name: ne_lat + in: query + description: North-east corner latitude of bounding box. + required: false + schema: + type: number + format: double + - name: ne_lon + in: query + description: North-east corner longitude of bounding box. + required: false + schema: + type: number + format: double + - name: sw_lat + in: query + description: South-west corner latitude of bounding box. + required: false + schema: + type: number + format: double + - name: sw_lon + in: query + description: South-west corner longitude of bounding box. + required: false + schema: + type: number + format: double + - name: operator + in: query + description: Optional operator filter. + required: false + schema: + type: string + - name: aircraft_type + in: query + description: Optional aircraft type filter. + required: false + schema: + type: string + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/worldmonitor_military_v1_ListMilitaryFlightsResponse' + "400": + description: Validation error + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationError' + default: + description: Error response + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /api/military/v1/get-theater-posture: + get: + tags: + - MilitaryService + summary: GetTheaterPosture + description: GetTheaterPosture retrieves military posture assessments for geographic theaters. + operationId: GetTheaterPosture + parameters: + - name: theater + in: query + description: Theater name (e.g., "indo-pacific", "european", "middle-east"). Empty for all theaters. + required: false + schema: + type: string + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/worldmonitor_military_v1_GetTheaterPostureResponse' + "400": + description: Validation error + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationError' + default: + description: Error response + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /api/military/v1/get-aircraft-details: + get: + tags: + - MilitaryService + summary: GetAircraftDetails + description: GetAircraftDetails retrieves Wingbits aircraft enrichment data for a single ICAO24 hex. + operationId: GetAircraftDetails + parameters: + - name: icao24 + in: query + description: ICAO 24-bit hex address (lowercase). + required: false + schema: + type: string + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/worldmonitor_military_v1_GetAircraftDetailsResponse' + "400": + description: Validation error + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationError' + default: + description: Error response + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /api/military/v1/get-aircraft-details-batch: + post: + tags: + - MilitaryService + summary: GetAircraftDetailsBatch + description: GetAircraftDetailsBatch retrieves Wingbits aircraft enrichment data for multiple ICAO24 hexes. + operationId: GetAircraftDetailsBatch + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/worldmonitor_military_v1_GetAircraftDetailsBatchRequest' + required: true + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/worldmonitor_military_v1_GetAircraftDetailsBatchResponse' + "400": + description: Validation error + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationError' + default: + description: Error response + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /api/military/v1/get-wingbits-status: + get: + tags: + - MilitaryService + summary: GetWingbitsStatus + description: GetWingbitsStatus checks whether the Wingbits enrichment API is configured. + operationId: GetWingbitsStatus + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/worldmonitor_military_v1_GetWingbitsStatusResponse' + "400": + description: Validation error + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationError' + default: + description: Error response + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /api/military/v1/get-usni-fleet-report: + get: + tags: + - MilitaryService + summary: GetUSNIFleetReport + description: GetUSNIFleetReport retrieves the latest parsed USNI Fleet Tracker report. + operationId: GetUSNIFleetReport + parameters: + - name: force_refresh + in: query + description: When true, bypass cache and fetch fresh data from USNI. + required: false + schema: + type: boolean + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/worldmonitor_military_v1_GetUSNIFleetReportResponse' + "400": + description: Validation error + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationError' + default: + description: Error response + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /api/military/v1/list-military-bases: + get: + tags: + - MilitaryService + summary: ListMilitaryBases + description: ListMilitaryBases retrieves military bases within a bounding box, with server-side clustering. + operationId: ListMilitaryBases + parameters: + - name: ne_lat + in: query + required: false + schema: + type: number + format: double + - name: ne_lon + in: query + required: false + schema: + type: number + format: double + - name: sw_lat + in: query + required: false + schema: + type: number + format: double + - name: sw_lon + in: query + required: false + schema: + type: number + format: double + - name: zoom + in: query + required: false + schema: + type: integer + format: int32 + - name: type + in: query + required: false + schema: + type: string + - name: kind + in: query + required: false + schema: + type: string + - name: country + in: query + required: false + schema: + type: string + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/worldmonitor_military_v1_ListMilitaryBasesResponse' + "400": + description: Validation error + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationError' + default: + description: Error response + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /api/military/v1/get-wingbits-live-flight: + get: + tags: + - MilitaryService + summary: GetWingbitsLiveFlight + description: GetWingbitsLiveFlight retrieves real-time position data from the Wingbits ECS network for a single aircraft. + operationId: GetWingbitsLiveFlight + parameters: + - name: icao24 + in: query + description: ICAO 24-bit hex address (lowercase, 6 characters). + required: false + schema: + type: string + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/worldmonitor_military_v1_GetWingbitsLiveFlightResponse' + "400": + description: Validation error + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationError' + default: + description: Error response + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /api/military/v1/list-defense-patents: + get: + tags: + - MilitaryService + summary: ListDefensePatents + description: ListDefensePatents retrieves recent defense/dual-use patent filings from USPTO PatentsView. + operationId: ListDefensePatents + parameters: + - name: cpc_code + in: query + description: CPC category filter (e.g. "H04B", "F42B"). Empty returns all categories. + required: false + schema: + type: string + - name: assignee + in: query + description: Assignee keyword filter (case-insensitive substring match). Empty returns all. + required: false + schema: + type: string + - name: limit + in: query + description: Maximum results to return (default 20, max 100). + required: false + schema: + type: integer + format: int32 + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/worldmonitor_military_v1_ListDefensePatentsResponse' + "400": + description: Validation error + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationError' + default: + description: Error response + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /api/natural/v1/list-natural-events: + get: + tags: + - NaturalService + summary: ListNaturalEvents + operationId: ListNaturalEvents + parameters: + - name: days + in: query + required: false + schema: + type: integer + format: int32 + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/worldmonitor_natural_v1_ListNaturalEventsResponse' + "400": + description: Validation error + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationError' + default: + description: Error response + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /api/news/v1/summarize-article: + post: + tags: + - NewsService + summary: SummarizeArticle + description: SummarizeArticle generates an LLM summary with provider selection and fallback support. + operationId: SummarizeArticle + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/worldmonitor_news_v1_SummarizeArticleRequest' + required: true + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/worldmonitor_news_v1_SummarizeArticleResponse' + "400": + description: Validation error + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationError' + default: + description: Error response + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /api/news/v1/summarize-article-cache: + get: + tags: + - NewsService + summary: GetSummarizeArticleCache + description: GetSummarizeArticleCache looks up a cached summary by deterministic key (CDN-cacheable GET). + operationId: GetSummarizeArticleCache + parameters: + - name: cache_key + in: query + description: Deterministic cache key computed by buildSummaryCacheKey(). + required: false + schema: + type: string + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/worldmonitor_news_v1_SummarizeArticleResponse' + "400": + description: Validation error + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationError' + default: + description: Error response + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /api/news/v1/list-feed-digest: + get: + tags: + - NewsService + summary: ListFeedDigest + description: ListFeedDigest returns a pre-aggregated digest of all RSS feeds for a site variant. + operationId: ListFeedDigest + parameters: + - name: variant + in: query + description: 'Site variant: full, tech, finance, happy' + required: false + schema: + type: string + - name: lang + in: query + description: ISO 639-1 language code (en, fr, ar, etc.) + required: false + schema: + type: string + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/worldmonitor_news_v1_ListFeedDigestResponse' + "400": + description: Validation error + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationError' + default: + description: Error response + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /api/positive-events/v1/list-positive-geo-events: + get: + tags: + - PositiveEventsService + summary: ListPositiveGeoEvents + description: ListPositiveGeoEvents retrieves geocoded positive news events from GDELT GEO API. + operationId: ListPositiveGeoEvents + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/worldmonitor_positive_events_v1_ListPositiveGeoEventsResponse' + "400": + description: Validation error + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationError' + default: + description: Error response + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /api/prediction/v1/list-prediction-markets: + get: + tags: + - PredictionService + summary: ListPredictionMarkets + description: ListPredictionMarkets retrieves active prediction markets from Polymarket. + operationId: ListPredictionMarkets + parameters: + - name: page_size + in: query + description: Maximum items per page (1-100). + required: false + schema: + type: integer + format: int32 + - name: cursor + in: query + description: Cursor for next page. + required: false + schema: + type: string + - name: category + in: query + description: Optional category filter (e.g., "Politics"). + required: false + schema: + type: string + - name: query + in: query + description: Optional search query for market titles. + required: false + schema: + type: string + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/worldmonitor_prediction_v1_ListPredictionMarketsResponse' + "400": + description: Validation error + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationError' + default: + description: Error response + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /api/radiation/v1/list-radiation-observations: + get: + tags: + - RadiationService + summary: ListRadiationObservations + description: ListRadiationObservations retrieves normalized EPA RadNet and Safecast readings. + operationId: ListRadiationObservations + parameters: + - name: max_items + in: query + description: Maximum items to return (1-25). Zero uses the service default. + required: false + schema: + type: integer + format: int32 + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/worldmonitor_radiation_v1_ListRadiationObservationsResponse' + "400": + description: Validation error + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationError' + default: + description: Error response + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /api/research/v1/list-arxiv-papers: + get: + tags: + - ResearchService + summary: ListArxivPapers + description: ListArxivPapers retrieves recent papers from arXiv. + operationId: ListArxivPapers + parameters: + - name: page_size + in: query + description: Maximum items per page (1-100). + required: false + schema: + type: integer + format: int32 + - name: cursor + in: query + description: Cursor for next page. + required: false + schema: + type: string + - name: category + in: query + description: arXiv category filter (e.g., "cs.AI"). Empty returns all tracked categories. + required: false + schema: + type: string + - name: query + in: query + description: Search query for paper titles and abstracts. + required: false + schema: + type: string + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/worldmonitor_research_v1_ListArxivPapersResponse' + "400": + description: Validation error + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationError' + default: + description: Error response + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /api/research/v1/list-trending-repos: + get: + tags: + - ResearchService + summary: ListTrendingRepos + description: ListTrendingRepos retrieves trending repositories from GitHub. + operationId: ListTrendingRepos + parameters: + - name: page_size + in: query + description: Maximum items per page (1-100). + required: false + schema: + type: integer + format: int32 + - name: cursor + in: query + description: Cursor for next page. + required: false + schema: + type: string + - name: language + in: query + description: Programming language filter (e.g., "python", "typescript"). + required: false + schema: + type: string + - name: period + in: query + description: Trending period (e.g., "daily", "weekly"). Defaults to "daily". + required: false + schema: + type: string + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/worldmonitor_research_v1_ListTrendingReposResponse' + "400": + description: Validation error + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationError' + default: + description: Error response + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /api/research/v1/list-hackernews-items: + get: + tags: + - ResearchService + summary: ListHackernewsItems + description: ListHackernewsItems retrieves top stories from Hacker News. + operationId: ListHackernewsItems + parameters: + - name: page_size + in: query + description: Maximum items per page (1-100). + required: false + schema: + type: integer + format: int32 + - name: cursor + in: query + description: Cursor for next page. + required: false + schema: + type: string + - name: feed_type + in: query + description: 'Feed type: "top", "new", "best", "ask", "show". Defaults to "top".' + required: false + schema: + type: string + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/worldmonitor_research_v1_ListHackernewsItemsResponse' + "400": + description: Validation error + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationError' + default: + description: Error response + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /api/research/v1/list-tech-events: + get: + tags: + - ResearchService + summary: ListTechEvents + description: ListTechEvents retrieves tech events from Techmeme ICS, dev.events RSS, and curated sources. + operationId: ListTechEvents + parameters: + - name: type + in: query + description: 'Event type filter: "all", "conferences", "earnings", "ipo", "other". Empty = all.' + required: false + schema: + type: string + - name: mappable + in: query + description: Only events with non-virtual coordinates. + required: false + schema: + type: boolean + - name: limit + in: query + description: Max events to return (0 = unlimited). + required: false + schema: + type: integer + format: int32 + - name: days + in: query + description: Events within N days from now (0 = unlimited). + required: false + schema: + type: integer + format: int32 + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/worldmonitor_research_v1_ListTechEventsResponse' + "400": + description: Validation error + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationError' + default: + description: Error response + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /api/resilience/v1/get-resilience-score: + get: + tags: + - ResilienceService + summary: GetResilienceScore + operationId: GetResilienceScore + parameters: + - name: countryCode + in: query + required: true + schema: + type: string + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/worldmonitor_resilience_v1_GetResilienceScoreResponse' + "400": + description: Validation error + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationError' + default: + description: Error response + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /api/resilience/v1/get-resilience-ranking: + get: + tags: + - ResilienceService + summary: GetResilienceRanking + operationId: GetResilienceRanking + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/worldmonitor_resilience_v1_GetResilienceRankingResponse' + "400": + description: Validation error + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationError' + default: + description: Error response + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /api/sanctions/v1/list-sanctions-pressure: + get: + tags: + - SanctionsService + summary: ListSanctionsPressure + description: ListSanctionsPressure retrieves normalized OFAC designation summaries and recent additions. + operationId: ListSanctionsPressure + parameters: + - name: max_items + in: query + required: false + schema: + type: integer + format: int32 + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/worldmonitor_sanctions_v1_ListSanctionsPressureResponse' + "400": + description: Validation error + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationError' + default: + description: Error response + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /api/sanctions/v1/lookup-sanction-entity: + get: + tags: + - SanctionsService + summary: LookupSanctionEntity + description: LookupSanctionEntity searches the OFAC entity index by name, vessel, or aircraft. + operationId: LookupSanctionEntity + parameters: + - name: q + in: query + required: false + schema: + type: string + - name: max_results + in: query + required: false + schema: + type: integer + format: int32 + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/worldmonitor_sanctions_v1_LookupSanctionEntityResponse' + "400": + description: Validation error + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationError' + default: + description: Error response + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /api/scenario/v1/run-scenario: + post: + tags: + - ScenarioService + summary: RunScenario + description: |- + RunScenario enqueues a scenario job on scenario-queue:pending. PRO-gated. + The scenario-worker (scripts/scenario-worker.mjs) pulls jobs off the + queue via BLMOVE and writes results under scenario-result:{job_id}. + operationId: RunScenario + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/worldmonitor_scenario_v1_RunScenarioRequest' + required: true + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/worldmonitor_scenario_v1_RunScenarioResponse' + "400": + description: Validation error + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationError' + default: + description: Error response + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /api/scenario/v1/get-scenario-status: + get: + tags: + - ScenarioService + summary: GetScenarioStatus + description: |- + GetScenarioStatus polls a single job's result. PRO-gated. + Returns status="pending" when no result key exists, mirroring the + worker's lifecycle state once the key is written. + operationId: GetScenarioStatus + parameters: + - name: jobId + in: query + description: |- + Job id of the form `scenario:{epoch_ms}:{8-char-suffix}`. Path-traversal + guarded by JOB_ID_RE in the handler. + required: false + schema: + type: string + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/worldmonitor_scenario_v1_GetScenarioStatusResponse' + "400": + description: Validation error + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationError' + default: + description: Error response + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /api/scenario/v1/list-scenario-templates: + get: + tags: + - ScenarioService + summary: ListScenarioTemplates + description: |- + ListScenarioTemplates returns the catalog of pre-defined scenarios. + Not PRO-gated — used by documented public API consumers. + operationId: ListScenarioTemplates + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/worldmonitor_scenario_v1_ListScenarioTemplatesResponse' + "400": + description: Validation error + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationError' + default: + description: Error response + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /api/seismology/v1/list-earthquakes: + get: + tags: + - SeismologyService + summary: ListEarthquakes + description: ListEarthquakes retrieves recent earthquakes from the USGS GeoJSON feed. + operationId: ListEarthquakes + parameters: + - name: start + in: query + description: Start of time range (inclusive), Unix epoch milliseconds. + required: false + schema: + type: string + format: int64 + - name: end + in: query + description: End of time range (inclusive), Unix epoch milliseconds. + required: false + schema: + type: string + format: int64 + - name: page_size + in: query + description: Maximum items per page (1-100). + required: false + schema: + type: integer + format: int32 + - name: cursor + in: query + description: Cursor for next page. + required: false + schema: + type: string + - name: min_magnitude + in: query + description: Minimum magnitude filter (e.g., 4.0 for significant quakes). + required: false + schema: + type: number + format: double + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/worldmonitor_seismology_v1_ListEarthquakesResponse' + "400": + description: Validation error + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationError' + default: + description: Error response + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /api/v2/shipping/route-intelligence: + get: + tags: + - ShippingV2Service + summary: RouteIntelligence + description: |- + RouteIntelligence scores a country-pair trade route for chokepoint exposure + and current disruption risk. Partner-facing; wire shape is byte-compatible + with the pre-migration JSON response documented at docs/api-shipping-v2.mdx. + operationId: RouteIntelligence + parameters: + - name: fromIso2 + in: query + description: Origin country, ISO-3166-1 alpha-2 uppercase. + required: false + schema: + type: string + - name: toIso2 + in: query + description: Destination country, ISO-3166-1 alpha-2 uppercase. + required: false + schema: + type: string + - name: cargoType + in: query + description: |- + Cargo type — one of: container (default), tanker, bulk, roro. + Empty string defers to the server default. Unknown values are coerced to + "container" to preserve legacy behavior. + required: false + schema: + type: string + - name: hs2 + in: query + description: |- + 2-digit HS commodity code (default "27" — mineral fuels). Non-digit + characters are stripped server-side to match legacy behavior. + required: false + schema: + type: string + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/worldmonitor_shipping_v2_RouteIntelligenceResponse' + "400": + description: Validation error + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationError' + default: + description: Error response + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /api/v2/shipping/webhooks: + get: + tags: + - ShippingV2Service + summary: ListWebhooks + description: |- + ListWebhooks returns the caller's registered webhooks filtered by the + SHA-256 owner tag of the calling API key. The `secret` is intentionally + omitted from the response; use rotate-secret to obtain a new one. + operationId: ListWebhooks + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/worldmonitor_shipping_v2_ListWebhooksResponse' + "400": + description: Validation error + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationError' + default: + description: Error response + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + post: + tags: + - ShippingV2Service + summary: RegisterWebhook + description: |- + RegisterWebhook subscribes a callback URL to chokepoint disruption alerts. + Returns the subscriberId and the raw HMAC secret — the secret is never + returned again except via rotate-secret. + operationId: RegisterWebhook + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/worldmonitor_shipping_v2_RegisterWebhookRequest' + required: true + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/worldmonitor_shipping_v2_RegisterWebhookResponse' + "400": + description: Validation error + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationError' + default: + description: Error response + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /api/supply-chain/v1/get-shipping-rates: + get: + tags: + - SupplyChainService + summary: GetShippingRates + operationId: GetShippingRates + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/worldmonitor_supply_chain_v1_GetShippingRatesResponse' + "400": + description: Validation error + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationError' + default: + description: Error response + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /api/supply-chain/v1/get-chokepoint-status: + get: + tags: + - SupplyChainService + summary: GetChokepointStatus + operationId: GetChokepointStatus + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/worldmonitor_supply_chain_v1_GetChokepointStatusResponse' + "400": + description: Validation error + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationError' + default: + description: Error response + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /api/supply-chain/v1/get-chokepoint-history: + get: + tags: + - SupplyChainService + summary: GetChokepointHistory + description: |- + GetChokepointHistory returns transit-count history for a single chokepoint, + loaded lazily on card expand. Keeps the status RPC compact (no 180-day + history per chokepoint on every call). + operationId: GetChokepointHistory + parameters: + - name: chokepointId + in: query + required: false + schema: + type: string + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/worldmonitor_supply_chain_v1_GetChokepointHistoryResponse' + "400": + description: Validation error + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationError' + default: + description: Error response + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /api/supply-chain/v1/get-critical-minerals: + get: + tags: + - SupplyChainService + summary: GetCriticalMinerals + operationId: GetCriticalMinerals + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/worldmonitor_supply_chain_v1_GetCriticalMineralsResponse' + "400": + description: Validation error + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationError' + default: + description: Error response + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /api/supply-chain/v1/get-shipping-stress: + get: + tags: + - SupplyChainService + summary: GetShippingStress + description: GetShippingStress returns carrier market data and a composite stress index. + operationId: GetShippingStress + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/worldmonitor_supply_chain_v1_GetShippingStressResponse' + "400": + description: Validation error + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationError' + default: + description: Error response + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /api/supply-chain/v1/get-country-chokepoint-index: + get: + tags: + - SupplyChainService + summary: GetCountryChokepointIndex + description: GetCountryChokepointIndex returns per-chokepoint exposure scores for a country. PRO-gated. + operationId: GetCountryChokepointIndex + parameters: + - name: iso2 + in: query + description: ISO 3166-1 alpha-2 country code (uppercase). + required: false + schema: + type: string + - name: hs2 + in: query + description: HS2 chapter (2-digit string). Defaults to "27" (energy/mineral fuels) when absent. + required: false + schema: + type: string + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/worldmonitor_supply_chain_v1_GetCountryChokepointIndexResponse' + "400": + description: Validation error + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationError' + default: + description: Error response + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /api/supply-chain/v1/get-bypass-options: + get: + tags: + - SupplyChainService + summary: GetBypassOptions + description: GetBypassOptions returns ranked bypass corridors for a chokepoint. PRO-gated. + operationId: GetBypassOptions + parameters: + - name: chokepointId + in: query + required: false + schema: + type: string + - name: cargoType + in: query + description: 'container | tanker | bulk | roro (default: "container")' + required: false + schema: + type: string + - name: closurePct + in: query + description: '0-100, percent of capacity blocked (default: 100)' + required: false + schema: + type: integer + format: int32 + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/worldmonitor_supply_chain_v1_GetBypassOptionsResponse' + "400": + description: Validation error + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationError' + default: + description: Error response + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /api/supply-chain/v1/get-country-cost-shock: + get: + tags: + - SupplyChainService + summary: GetCountryCostShock + description: GetCountryCostShock returns cost shock and war risk data for a country+chokepoint. PRO-gated. + operationId: GetCountryCostShock + parameters: + - name: iso2 + in: query + required: false + schema: + type: string + - name: chokepointId + in: query + required: false + schema: + type: string + - name: hs2 + in: query + description: 'HS2 chapter (default: "27")' + required: false + schema: + type: string + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/worldmonitor_supply_chain_v1_GetCountryCostShockResponse' + "400": + description: Validation error + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationError' + default: + description: Error response + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /api/supply-chain/v1/get-country-products: + get: + tags: + - SupplyChainService + summary: GetCountryProducts + description: GetCountryProducts returns the seeded bilateral-HS4 import basket for a country. PRO-gated. + operationId: GetCountryProducts + parameters: + - name: iso2 + in: query + required: false + schema: + type: string + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/worldmonitor_supply_chain_v1_GetCountryProductsResponse' + "400": + description: Validation error + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationError' + default: + description: Error response + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /api/supply-chain/v1/get-multi-sector-cost-shock: + get: + tags: + - SupplyChainService + summary: GetMultiSectorCostShock + description: |- + GetMultiSectorCostShock returns per-sector cost-shock estimates for a + country+chokepoint+closure-window. PRO-gated. + operationId: GetMultiSectorCostShock + parameters: + - name: iso2 + in: query + required: false + schema: + type: string + - name: chokepointId + in: query + required: false + schema: + type: string + - name: closureDays + in: query + description: Closure-window duration in days. Server clamps to [1, 365]. Defaults to 30. + required: false + schema: + type: integer + format: int32 + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/worldmonitor_supply_chain_v1_GetMultiSectorCostShockResponse' + "400": + description: Validation error + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationError' + default: + description: Error response + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /api/supply-chain/v1/get-sector-dependency: + get: + tags: + - SupplyChainService + summary: GetSectorDependency + description: GetSectorDependency returns dependency flags and risk profile for a country+HS2 sector. PRO-gated. + operationId: GetSectorDependency + parameters: + - name: iso2 + in: query + required: false + schema: + type: string + - name: hs2 + in: query + description: HS2 chapter code, e.g. "27" (mineral fuels), "85" (electronics) + required: false + schema: + type: string + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/worldmonitor_supply_chain_v1_GetSectorDependencyResponse' + "400": + description: Validation error + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationError' + default: + description: Error response + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /api/supply-chain/v1/get-route-explorer-lane: + get: + tags: + - SupplyChainService + summary: GetRouteExplorerLane + description: |- + GetRouteExplorerLane returns the primary maritime route, chokepoint exposures, + bypass options with geometry, war risk, and static transit/freight estimates for + a country pair + HS2 + cargo type. PRO-gated. Wraps the route-intelligence vendor + endpoint's compute with browser-callable auth and adds fields needed by the + Route Explorer UI. + operationId: GetRouteExplorerLane + parameters: + - name: fromIso2 + in: query + required: false + schema: + type: string + - name: toIso2 + in: query + required: false + schema: + type: string + - name: hs2 + in: query + description: HS2 chapter code, e.g. "27", "85" + required: false + schema: + type: string + - name: cargoType + in: query + description: 'One of: container, tanker, bulk, roro' + required: false + schema: + type: string + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/worldmonitor_supply_chain_v1_GetRouteExplorerLaneResponse' + "400": + description: Validation error + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationError' + default: + description: Error response + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /api/supply-chain/v1/get-route-impact: + get: + tags: + - SupplyChainService + summary: GetRouteImpact + operationId: GetRouteImpact + parameters: + - name: fromIso2 + in: query + required: false + schema: + type: string + - name: toIso2 + in: query + required: false + schema: + type: string + - name: hs2 + in: query + required: false + schema: + type: string + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/worldmonitor_supply_chain_v1_GetRouteImpactResponse' + "400": + description: Validation error + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationError' + default: + description: Error response + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /api/supply-chain/v1/list-pipelines: + get: + tags: + - SupplyChainService + summary: ListPipelines + description: |- + ListPipelines returns the curated oil & gas pipeline registry for the + Energy Atlas PathLayer. Public badges are DERIVED from evidence bundles + server-side and versioned (classifier_version). Free-tier; see + docs/methodology/pipelines.mdx for data + classifier spec. + operationId: ListPipelines + parameters: + - name: commodityType + in: query + description: Filter to one commodity. Omit (or pass empty) to receive both. + required: false + schema: + type: string + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/worldmonitor_supply_chain_v1_ListPipelinesResponse' + "400": + description: Validation error + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationError' + default: + description: Error response + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /api/supply-chain/v1/get-pipeline-detail: + get: + tags: + - SupplyChainService + summary: GetPipelineDetail + description: |- + GetPipelineDetail returns a single pipeline with full evidence bundle + + auto-revision-log entries. Loaded lazily on drawer open. + operationId: GetPipelineDetail + parameters: + - name: pipelineId + in: query + required: false + schema: + type: string + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/worldmonitor_supply_chain_v1_GetPipelineDetailResponse' + "400": + description: Validation error + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationError' + default: + description: Error response + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /api/supply-chain/v1/list-storage-facilities: + get: + tags: + - SupplyChainService + summary: ListStorageFacilities + description: |- + ListStorageFacilities returns the curated strategic storage registry + (UGS + SPR + LNG + crude tank farms) for the Energy Atlas DeckGL + ScatterplotLayer. Public badges are DERIVED from evidence bundles + server-side and versioned (classifier_version). Free-tier; see + docs/methodology/storage.mdx. + operationId: ListStorageFacilities + parameters: + - name: facilityType + in: query + description: |- + Filter to one facility type. Accepts: + "ugs" | "spr" | "lng_export" | "lng_import" | "crude_tank_farm" + Omit (or pass empty) to receive all types. + required: false + schema: + type: string + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/worldmonitor_supply_chain_v1_ListStorageFacilitiesResponse' + "400": + description: Validation error + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationError' + default: + description: Error response + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /api/supply-chain/v1/get-storage-facility-detail: + get: + tags: + - SupplyChainService + summary: GetStorageFacilityDetail + description: |- + GetStorageFacilityDetail returns a single facility with full evidence + bundle + revision log. Loaded lazily on drawer open. + operationId: GetStorageFacilityDetail + parameters: + - name: facilityId + in: query + required: false + schema: + type: string + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/worldmonitor_supply_chain_v1_GetStorageFacilityDetailResponse' + "400": + description: Validation error + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationError' + default: + description: Error response + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /api/supply-chain/v1/list-fuel-shortages: + get: + tags: + - SupplyChainService + summary: ListFuelShortages + description: |- + ListFuelShortages returns the global fuel-shortage alert registry. + Curated-only: severity ("confirmed" | "watch") is a row field authored + at curation time, not a client-side derivation. Free tier. + operationId: ListFuelShortages + parameters: + - name: country + in: query + description: Filter to one ISO 3166-1 alpha-2 country. Omit for global. + required: false + schema: + type: string + - name: product + in: query + description: |- + Filter to one product. Accepts: "petrol" | "diesel" | "jet" | "heating_oil". + Omit for all products. + required: false + schema: + type: string + - name: severity + in: query + description: 'Filter to one severity. Accepts: "confirmed" | "watch". Omit for both.' + required: false + schema: + type: string + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/worldmonitor_supply_chain_v1_ListFuelShortagesResponse' + "400": + description: Validation error + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationError' + default: + description: Error response + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /api/supply-chain/v1/get-fuel-shortage-detail: + get: + tags: + - SupplyChainService + summary: GetFuelShortageDetail + description: |- + GetFuelShortageDetail returns a single shortage with full evidence + bundle and citation timeline. Loaded lazily on drawer open. + operationId: GetFuelShortageDetail + parameters: + - name: shortageId + in: query + required: false + schema: + type: string + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/worldmonitor_supply_chain_v1_GetFuelShortageDetailResponse' + "400": + description: Validation error + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationError' + default: + description: Error response + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /api/supply-chain/v1/list-energy-disruptions: + get: + tags: + - SupplyChainService + summary: ListEnergyDisruptions + description: |- + ListEnergyDisruptions returns the disruption event log for pipelines + and storage facilities. Supports per-asset or per-asset-type filtering + so panel drawers can fetch a scoped timeline without pulling the + full registry. + operationId: ListEnergyDisruptions + parameters: + - name: assetId + in: query + description: |- + Filter to one asset. Omit for all. When set, also narrows to the + matching asset_type if provided. + required: false + schema: + type: string + - name: assetType + in: query + description: 'Filter to one asset type. Accepts: "pipeline" | "storage".' + required: false + schema: + type: string + - name: ongoingOnly + in: query + description: If true, only return events with endAt empty (still ongoing). + required: false + schema: + type: boolean + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/worldmonitor_supply_chain_v1_ListEnergyDisruptionsResponse' + "400": + description: Validation error + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationError' + default: + description: Error response + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /api/thermal/v1/list-thermal-escalations: + get: + tags: + - ThermalService + summary: ListThermalEscalations + operationId: ListThermalEscalations + parameters: + - name: max_items + in: query + required: false + schema: + type: integer + format: int32 + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/worldmonitor_thermal_v1_ListThermalEscalationsResponse' + "400": + description: Validation error + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationError' + default: + description: Error response + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /api/trade/v1/get-trade-restrictions: + get: + tags: + - TradeService + summary: GetTradeRestrictions + description: Get quantitative restrictions and export controls. + operationId: GetTradeRestrictions + parameters: + - name: countries + in: query + description: WTO member codes to filter by. Empty = all. + required: false + style: form + explode: true + schema: + type: array + items: + type: string + - name: limit + in: query + description: Max results to return (server caps at 100). + required: false + schema: + type: integer + format: int32 + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/worldmonitor_trade_v1_GetTradeRestrictionsResponse' + "400": + description: Validation error + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationError' + default: + description: Error response + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /api/trade/v1/get-tariff-trends: + get: + tags: + - TradeService + summary: GetTariffTrends + description: Get tariff rate timeseries for a country pair. + operationId: GetTariffTrends + parameters: + - name: reporting_country + in: query + description: WTO member code of reporting country (e.g. "840" = US). + required: false + schema: + type: string + - name: partner_country + in: query + description: WTO member code of partner country (e.g. "156" = China). + required: false + schema: + type: string + - name: product_sector + in: query + description: Product sector filter (HS chapter). Empty = aggregate. + required: false + schema: + type: string + - name: years + in: query + description: Number of years to look back (default 10, max 30). + required: false + schema: + type: integer + format: int32 + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/worldmonitor_trade_v1_GetTariffTrendsResponse' + "400": + description: Validation error + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationError' + default: + description: Error response + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /api/trade/v1/get-trade-flows: + get: + tags: + - TradeService + summary: GetTradeFlows + description: Get bilateral merchandise trade flows. + operationId: GetTradeFlows + parameters: + - name: reporting_country + in: query + description: WTO member code of reporting country. + required: false + schema: + type: string + - name: partner_country + in: query + description: WTO member code of partner country. + required: false + schema: + type: string + - name: years + in: query + description: Number of years to look back (default 10, max 30). + required: false + schema: + type: integer + format: int32 + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/worldmonitor_trade_v1_GetTradeFlowsResponse' + "400": + description: Validation error + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationError' + default: + description: Error response + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /api/trade/v1/get-trade-barriers: + get: + tags: + - TradeService + summary: GetTradeBarriers + description: Get SPS/TBT barrier notifications. + operationId: GetTradeBarriers + parameters: + - name: countries + in: query + description: WTO member codes to filter by. Empty = all. + required: false + style: form + explode: true + schema: + type: array + items: + type: string + - name: measure_type + in: query + description: 'Filter by measure type: "SPS", "TBT", or empty for both.' + required: false + schema: + type: string + - name: limit + in: query + description: Max results to return (server caps at 100). + required: false + schema: + type: integer + format: int32 + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/worldmonitor_trade_v1_GetTradeBarriersResponse' + "400": + description: Validation error + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationError' + default: + description: Error response + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /api/trade/v1/get-customs-revenue: + get: + tags: + - TradeService + summary: GetCustomsRevenue + description: Get US customs duties revenue (Treasury MTS data, seeded by Railway). + operationId: GetCustomsRevenue + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/worldmonitor_trade_v1_GetCustomsRevenueResponse' + "400": + description: Validation error + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationError' + default: + description: Error response + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /api/trade/v1/list-comtrade-flows: + get: + tags: + - TradeService + summary: ListComtradeFlows + description: List UN Comtrade strategic commodity flows with anomaly detection. + operationId: ListComtradeFlows + parameters: + - name: reporter_code + in: query + description: UN Comtrade reporter code (e.g. "842" = US, "156" = China). Empty returns all reporters. + required: false + schema: + type: string + - name: cmd_code + in: query + description: HS commodity code (e.g. "2709" = crude oil). Empty returns all commodities. + required: false + schema: + type: string + - name: anomalies_only + in: query + description: If true, only return flows with a year-over-year change exceeding 30%. + required: false + schema: + type: boolean + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/worldmonitor_trade_v1_ListComtradeFlowsResponse' + "400": + description: Validation error + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationError' + default: + description: Error response + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /api/unrest/v1/list-unrest-events: + get: + tags: + - UnrestService + summary: ListUnrestEvents + description: ListUnrestEvents retrieves protest, riot, and civil unrest events. + operationId: ListUnrestEvents + parameters: + - name: start + in: query + description: Start of time range (inclusive), Unix epoch milliseconds. + required: false + schema: + type: string + format: int64 + - name: end + in: query + description: End of time range (inclusive), Unix epoch milliseconds. + required: false + schema: + type: string + format: int64 + - name: page_size + in: query + description: Maximum items per page (1-100). + required: false + schema: + type: integer + format: int32 + - name: cursor + in: query + description: Cursor for next page. + required: false + schema: + type: string + - name: country + in: query + description: Optional country filter (ISO 3166-1 alpha-2). + required: false + schema: + type: string + - name: min_severity + in: query + description: Optional minimum severity filter. + required: false + schema: + type: string + - name: ne_lat + in: query + description: North-east corner latitude of bounding box. + required: false + schema: + type: number + format: double + - name: ne_lon + in: query + description: North-east corner longitude of bounding box. + required: false + schema: + type: number + format: double + - name: sw_lat + in: query + description: South-west corner latitude of bounding box. + required: false + schema: + type: number + format: double + - name: sw_lon + in: query + description: South-west corner longitude of bounding box. + required: false + schema: + type: number + format: double + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/worldmonitor_unrest_v1_ListUnrestEventsResponse' + "400": + description: Validation error + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationError' + default: + description: Error response + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /api/webcam/v1/list-webcams: + get: + tags: + - WebcamService + summary: ListWebcams + operationId: ListWebcams + parameters: + - name: zoom + in: query + required: false + schema: + type: integer + format: int32 + - name: bound_w + in: query + required: false + schema: + type: number + format: double + - name: bound_s + in: query + required: false + schema: + type: number + format: double + - name: bound_e + in: query + required: false + schema: + type: number + format: double + - name: bound_n + in: query + required: false + schema: + type: number + format: double + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/worldmonitor_webcam_v1_ListWebcamsResponse' + "400": + description: Validation error + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationError' + default: + description: Error response + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /api/webcam/v1/get-webcam-image: + get: + tags: + - WebcamService + summary: GetWebcamImage + operationId: GetWebcamImage + parameters: + - name: webcam_id + in: query + required: false + schema: + type: string + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/worldmonitor_webcam_v1_GetWebcamImageResponse' + "400": + description: Validation error + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationError' + default: + description: Error response + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /api/wildfire/v1/list-fire-detections: + get: + tags: + - WildfireService + summary: ListFireDetections + description: ListFireDetections retrieves satellite-detected active fires from NASA FIRMS. + operationId: ListFireDetections + parameters: + - name: start + in: query + description: Start of time range (inclusive), Unix epoch milliseconds. + required: false + schema: + type: string + format: int64 + - name: end + in: query + description: End of time range (inclusive), Unix epoch milliseconds. + required: false + schema: + type: string + format: int64 + - name: page_size + in: query + description: Maximum items per page (1-100). + required: false + schema: + type: integer + format: int32 + - name: cursor + in: query + description: Cursor for next page. + required: false + schema: + type: string + - name: ne_lat + in: query + description: North-east latitude of bounding box. + required: false + schema: + type: number + format: double + - name: ne_lon + in: query + description: North-east longitude of bounding box. + required: false + schema: + type: number + format: double + - name: sw_lat + in: query + description: South-west latitude of bounding box. + required: false + schema: + type: number + format: double + - name: sw_lon + in: query + description: South-west longitude of bounding box. + required: false + schema: + type: number + format: double + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/worldmonitor_wildfire_v1_ListFireDetectionsResponse' + "400": + description: Validation error + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationError' + default: + description: Error response + content: + application/json: + schema: + $ref: '#/components/schemas/Error' +components: + schemas: + Error: + type: object + properties: + message: + type: string + description: Error message (e.g., 'user not found', 'database connection failed') + description: Error is returned when a handler encounters an error. It contains a simple error message that the developer can customize. + FieldViolation: + type: object + properties: + field: + type: string + description: The field path that failed validation (e.g., 'user.email' for nested fields). For header validation, this will be the header name (e.g., 'X-API-Key') + description: + type: string + description: Human-readable description of the validation violation (e.g., 'must be a valid email address', 'required field missing') + required: + - field + - description + description: FieldViolation describes a single validation error for a specific field. + ValidationError: + type: object + properties: + violations: + type: array + items: + $ref: '#/components/schemas/FieldViolation' + description: List of validation violations + required: + - violations + description: ValidationError is returned when request validation fails. It contains a list of field violations describing what went wrong. + worldmonitor_aviation_v1_ListAirportDelaysRequest: + type: object + properties: + pageSize: + type: integer + format: int32 + description: Maximum items per page (1-100). + cursor: + type: string + description: Cursor for next page. + region: + type: string + enum: + - AIRPORT_REGION_UNSPECIFIED + - AIRPORT_REGION_AMERICAS + - AIRPORT_REGION_EUROPE + - AIRPORT_REGION_APAC + - AIRPORT_REGION_MENA + - AIRPORT_REGION_AFRICA + description: AirportRegion represents the geographic region of an airport. + minSeverity: + type: string + enum: + - FLIGHT_DELAY_SEVERITY_UNSPECIFIED + - FLIGHT_DELAY_SEVERITY_NORMAL + - FLIGHT_DELAY_SEVERITY_MINOR + - FLIGHT_DELAY_SEVERITY_MODERATE + - FLIGHT_DELAY_SEVERITY_MAJOR + - FLIGHT_DELAY_SEVERITY_SEVERE + description: |- + FlightDelaySeverity represents the severity of flight delays at an airport. + Maps to TS union: 'normal' | 'minor' | 'moderate' | 'major' | 'severe'. + description: ListAirportDelaysRequest specifies filters for retrieving airport delay alerts. + worldmonitor_aviation_v1_ListAirportDelaysResponse: + type: object + properties: + alerts: + type: array + items: + $ref: '#/components/schemas/worldmonitor_aviation_v1_AirportDelayAlert' + pagination: + $ref: '#/components/schemas/worldmonitor_core_v1_PaginationResponse' + description: ListAirportDelaysResponse contains airport delay alerts matching the request. + worldmonitor_aviation_v1_AirportDelayAlert: + type: object + properties: + id: + type: string + minLength: 1 + description: Unique alert identifier. + iata: + type: string + description: IATA airport code (e.g., "JFK"). + icao: + type: string + description: ICAO airport code (e.g., "KJFK"). + name: + type: string + description: Airport name. + city: + type: string + description: City where the airport is located. + country: + type: string + description: Country code (ISO 3166-1 alpha-2). + location: + $ref: '#/components/schemas/worldmonitor_core_v1_GeoCoordinates' + region: + type: string + enum: + - AIRPORT_REGION_UNSPECIFIED + - AIRPORT_REGION_AMERICAS + - AIRPORT_REGION_EUROPE + - AIRPORT_REGION_APAC + - AIRPORT_REGION_MENA + - AIRPORT_REGION_AFRICA + description: AirportRegion represents the geographic region of an airport. + delayType: + type: string + enum: + - FLIGHT_DELAY_TYPE_UNSPECIFIED + - FLIGHT_DELAY_TYPE_GROUND_STOP + - FLIGHT_DELAY_TYPE_GROUND_DELAY + - FLIGHT_DELAY_TYPE_DEPARTURE_DELAY + - FLIGHT_DELAY_TYPE_ARRIVAL_DELAY + - FLIGHT_DELAY_TYPE_GENERAL + - FLIGHT_DELAY_TYPE_CLOSURE + description: FlightDelayType represents the type of flight delay. + severity: + type: string + enum: + - FLIGHT_DELAY_SEVERITY_UNSPECIFIED + - FLIGHT_DELAY_SEVERITY_NORMAL + - FLIGHT_DELAY_SEVERITY_MINOR + - FLIGHT_DELAY_SEVERITY_MODERATE + - FLIGHT_DELAY_SEVERITY_MAJOR + - FLIGHT_DELAY_SEVERITY_SEVERE + description: |- + FlightDelaySeverity represents the severity of flight delays at an airport. + Maps to TS union: 'normal' | 'minor' | 'moderate' | 'major' | 'severe'. + avgDelayMinutes: + type: integer + format: int32 + description: Average delay in minutes. + delayedFlightsPct: + type: number + format: double + description: Percentage of delayed flights. + cancelledFlights: + type: integer + format: int32 + description: Number of cancelled flights. + totalFlights: + type: integer + format: int32 + description: Total flights scheduled. + reason: + type: string + description: Human-readable reason for delays. + source: + type: string + enum: + - FLIGHT_DELAY_SOURCE_UNSPECIFIED + - FLIGHT_DELAY_SOURCE_FAA + - FLIGHT_DELAY_SOURCE_EUROCONTROL + - FLIGHT_DELAY_SOURCE_COMPUTED + - FLIGHT_DELAY_SOURCE_AVIATIONSTACK + - FLIGHT_DELAY_SOURCE_NOTAM + description: FlightDelaySource represents the source of delay data. + updatedAt: + type: integer + format: int64 + description: 'Last data update time, as Unix epoch milliseconds.. Warning: Values > 2^53 may lose precision in JavaScript' + required: + - id + description: |- + AirportDelayAlert represents a flight delay advisory at an airport. + Sourced from FAA and Eurocontrol. + worldmonitor_core_v1_GeoCoordinates: + type: object + properties: + latitude: + type: number + maximum: 90 + minimum: -90 + format: double + description: Latitude in decimal degrees (-90 to 90). + longitude: + type: number + maximum: 180 + minimum: -180 + format: double + description: Longitude in decimal degrees (-180 to 180). + description: GeoCoordinates represents a geographic location using WGS84 coordinates. + worldmonitor_core_v1_PaginationResponse: + type: object + properties: + nextCursor: + type: string + description: Cursor for fetching the next page. Empty string indicates no more pages. + totalCount: + type: integer + format: int32 + description: Total count of items matching the query, if known. Zero if the total is unknown. + description: PaginationResponse contains pagination metadata returned alongside list results. + worldmonitor_aviation_v1_GetAirportOpsSummaryRequest: + type: object + properties: + airports: + type: array + items: + type: string + maxItems: 20 + minItems: 1 + description: IATA airport codes to query (e.g., ["IST", "ESB", "LHR"]). + maxItems: 20 + minItems: 1 + description: GetAirportOpsSummaryRequest specifies which airports to summarize. + worldmonitor_aviation_v1_GetAirportOpsSummaryResponse: + type: object + properties: + summaries: + type: array + items: + $ref: '#/components/schemas/worldmonitor_aviation_v1_AirportOpsSummary' + cacheHit: + type: boolean + description: Whether the response was served from cache. + description: GetAirportOpsSummaryResponse contains operational summaries for requested airports. + worldmonitor_aviation_v1_AirportOpsSummary: + type: object + properties: + iata: + type: string + description: IATA airport code. + icao: + type: string + description: ICAO airport code. + name: + type: string + description: Airport name. + timezone: + type: string + description: IANA timezone (e.g., "Europe/Istanbul"). + delayPct: + type: number + format: double + description: Percentage of flights currently delayed (0-100). + avgDelayMinutes: + type: integer + format: int32 + description: Average delay in minutes across delayed flights. + cancellationRate: + type: number + format: double + description: Cancellation rate as a percentage (0-100). + totalFlights: + type: integer + format: int32 + description: Total flights in the observation window. + closureStatus: + type: boolean + description: Whether the airport is currently closed. + notamFlags: + type: array + items: + type: string + description: Active NOTAM summary flags (e.g., "RWY 06/24 CLSD", "LOW VIS OPS"). + severity: + type: string + enum: + - FLIGHT_DELAY_SEVERITY_UNSPECIFIED + - FLIGHT_DELAY_SEVERITY_NORMAL + - FLIGHT_DELAY_SEVERITY_MINOR + - FLIGHT_DELAY_SEVERITY_MODERATE + - FLIGHT_DELAY_SEVERITY_MAJOR + - FLIGHT_DELAY_SEVERITY_SEVERE + description: |- + FlightDelaySeverity represents the severity of flight delays at an airport. + Maps to TS union: 'normal' | 'minor' | 'moderate' | 'major' | 'severe'. + topDelayReasons: + type: array + items: + type: string + description: Top reasons for delays. + source: + type: string + description: Data source identifier. + updatedAt: + type: integer + format: int64 + description: 'Last update time as Unix epoch milliseconds.. Warning: Values > 2^53 may lose precision in JavaScript' + description: AirportOpsSummary contains operational health metrics for a single airport. + worldmonitor_aviation_v1_ListAirportFlightsRequest: + type: object + properties: + airport: + type: string + maxLength: 4 + minLength: 3 + description: IATA airport code (e.g., "IST"). + direction: + type: string + enum: + - FLIGHT_DIRECTION_UNSPECIFIED + - FLIGHT_DIRECTION_DEPARTURE + - FLIGHT_DIRECTION_ARRIVAL + - FLIGHT_DIRECTION_BOTH + description: FlightDirection specifies whether to retrieve departures, arrivals, or both. + limit: + type: integer + maximum: 100 + minimum: 1 + format: int32 + description: Maximum number of flights to return (1-100). + required: + - airport + description: ListAirportFlightsRequest specifies parameters for retrieving recent flights at an airport. + worldmonitor_aviation_v1_ListAirportFlightsResponse: + type: object + properties: + flights: + type: array + items: + $ref: '#/components/schemas/worldmonitor_aviation_v1_FlightInstance' + totalAvailable: + type: integer + format: int32 + description: Total number of flights available from the provider. + source: + type: string + description: Data source identifier. + updatedAt: + type: integer + format: int64 + description: 'Last update time as Unix epoch milliseconds.. Warning: Values > 2^53 may lose precision in JavaScript' + description: ListAirportFlightsResponse contains recent flights at an airport. + worldmonitor_aviation_v1_FlightInstance: + type: object + properties: + flightNumber: + type: string + description: IATA flight number (e.g., "TK1952"). + date: + type: string + description: Departure date in ISO 8601 format (e.g., "2026-03-05"). + operatingCarrier: + $ref: '#/components/schemas/worldmonitor_aviation_v1_Carrier' + origin: + $ref: '#/components/schemas/worldmonitor_aviation_v1_AirportRef' + destination: + $ref: '#/components/schemas/worldmonitor_aviation_v1_AirportRef' + scheduledDeparture: + type: integer + format: int64 + description: 'Scheduled departure time as Unix epoch milliseconds (UTC).. Warning: Values > 2^53 may lose precision in JavaScript' + estimatedDeparture: + type: integer + format: int64 + description: 'Estimated departure time as Unix epoch milliseconds (UTC).. Warning: Values > 2^53 may lose precision in JavaScript' + actualDeparture: + type: integer + format: int64 + description: 'Actual departure time as Unix epoch milliseconds (UTC).. Warning: Values > 2^53 may lose precision in JavaScript' + scheduledArrival: + type: integer + format: int64 + description: 'Scheduled arrival time as Unix epoch milliseconds (UTC).. Warning: Values > 2^53 may lose precision in JavaScript' + estimatedArrival: + type: integer + format: int64 + description: 'Estimated arrival time as Unix epoch milliseconds (UTC).. Warning: Values > 2^53 may lose precision in JavaScript' + actualArrival: + type: integer + format: int64 + description: 'Actual arrival time as Unix epoch milliseconds (UTC).. Warning: Values > 2^53 may lose precision in JavaScript' + status: + type: string + enum: + - FLIGHT_INSTANCE_STATUS_UNSPECIFIED + - FLIGHT_INSTANCE_STATUS_SCHEDULED + - FLIGHT_INSTANCE_STATUS_BOARDING + - FLIGHT_INSTANCE_STATUS_DEPARTED + - FLIGHT_INSTANCE_STATUS_AIRBORNE + - FLIGHT_INSTANCE_STATUS_LANDED + - FLIGHT_INSTANCE_STATUS_ARRIVED + - FLIGHT_INSTANCE_STATUS_CANCELLED + - FLIGHT_INSTANCE_STATUS_DIVERTED + - FLIGHT_INSTANCE_STATUS_UNKNOWN + description: FlightInstanceStatus represents the operational status of a flight occurrence. + delayMinutes: + type: integer + format: int32 + description: Delay in minutes (0 if on time, negative if early). + cancelled: + type: boolean + description: Whether the flight is cancelled. + diverted: + type: boolean + description: Whether the flight has been diverted. + gate: + type: string + description: Departure gate (if available). + terminal: + type: string + description: Departure terminal (if available). + aircraftIcao24: + type: string + description: ICAO 24-bit transponder address of the aircraft (hex, e.g., "4b1805"). + aircraftType: + type: string + description: Aircraft type designator (e.g., "B738"). + codeshareFlightNumbers: + type: array + items: + type: string + description: Codeshare flight numbers marketed under this operating flight. + source: + type: string + description: Data source provider name. + updatedAt: + type: integer + format: int64 + description: 'Last update time as Unix epoch milliseconds.. Warning: Values > 2^53 may lose precision in JavaScript' + description: FlightInstance represents a specific occurrence of a flight on a given date. + worldmonitor_aviation_v1_Carrier: + type: object + properties: + iataCode: + type: string + description: IATA two-letter airline code (e.g., "TK"). + icaoCode: + type: string + description: ICAO three-letter airline code (e.g., "THY"). + name: + type: string + description: Full airline name (e.g., "Turkish Airlines"). + description: Carrier represents an airline or aircraft operator. + worldmonitor_aviation_v1_AirportRef: + type: object + properties: + iata: + type: string + description: IATA airport code (e.g., "IST"). + icao: + type: string + description: ICAO airport code (e.g., "LTFM"). + name: + type: string + description: Airport name (e.g., "Istanbul Airport"). + timezone: + type: string + description: IANA timezone (e.g., "Europe/Istanbul"). + description: AirportRef is a lightweight reference to an airport. + worldmonitor_aviation_v1_GetCarrierOpsRequest: + type: object + properties: + airports: + type: array + items: + type: string + maxItems: 20 + minItems: 1 + description: IATA airport codes to aggregate carrier metrics from. + maxItems: 20 + minItems: 1 + minFlights: + type: integer + minimum: 0 + format: int32 + description: 'Minimum number of flights required to include a carrier (default: 1).' + description: GetCarrierOpsRequest specifies parameters for carrier operations metrics. + worldmonitor_aviation_v1_GetCarrierOpsResponse: + type: object + properties: + carriers: + type: array + items: + $ref: '#/components/schemas/worldmonitor_aviation_v1_CarrierOpsSummary' + source: + type: string + description: Data source identifier. + updatedAt: + type: integer + format: int64 + description: 'Last update time as Unix epoch milliseconds.. Warning: Values > 2^53 may lose precision in JavaScript' + description: GetCarrierOpsResponse contains carrier operations metrics. + worldmonitor_aviation_v1_CarrierOpsSummary: + type: object + properties: + carrier: + $ref: '#/components/schemas/worldmonitor_aviation_v1_Carrier' + airport: + type: string + description: Airport IATA code this summary applies to. + totalFlights: + type: integer + format: int32 + description: Total flights observed. + delayedCount: + type: integer + format: int32 + description: Number of delayed flights. + cancelledCount: + type: integer + format: int32 + description: Number of cancelled flights. + avgDelayMinutes: + type: integer + format: int32 + description: Average delay in minutes across delayed flights. + delayPct: + type: number + format: double + description: Delay percentage (0-100). + cancellationRate: + type: number + format: double + description: Cancellation rate (0-100). + updatedAt: + type: integer + format: int64 + description: 'Last update time as Unix epoch milliseconds.. Warning: Values > 2^53 may lose precision in JavaScript' + description: CarrierOpsSummary contains delay and cancellation metrics for a carrier at an airport. + worldmonitor_aviation_v1_GetFlightStatusRequest: + type: object + properties: + flightNumber: + type: string + maxLength: 10 + minLength: 3 + description: IATA flight number (e.g., "TK1952"). + date: + type: string + description: Departure date in ISO 8601 format (e.g., "2026-03-05"). + origin: + type: string + description: Optional origin airport IATA code to disambiguate. + required: + - flightNumber + - date + description: GetFlightStatusRequest specifies a flight to look up. + worldmonitor_aviation_v1_GetFlightStatusResponse: + type: object + properties: + flights: + type: array + items: + $ref: '#/components/schemas/worldmonitor_aviation_v1_FlightInstance' + source: + type: string + description: Data source identifier. + cacheHit: + type: boolean + description: Whether the response was served from cache. + description: GetFlightStatusResponse contains flight status results. + worldmonitor_aviation_v1_TrackAircraftRequest: + type: object + properties: + icao24: + type: string + description: ICAO 24-bit transponder address (hex, e.g., "4b1805"). + callsign: + type: string + description: ATC callsign (e.g., "THY7CX"). + swLat: + type: number + format: double + description: Optional bounding box south-west latitude. + swLon: + type: number + format: double + description: Optional bounding box south-west longitude. + neLat: + type: number + format: double + description: Optional bounding box north-east latitude. + neLon: + type: number + format: double + description: Optional bounding box north-east longitude. + description: TrackAircraftRequest specifies an aircraft to track. + worldmonitor_aviation_v1_TrackAircraftResponse: + type: object + properties: + positions: + type: array + items: + $ref: '#/components/schemas/worldmonitor_aviation_v1_PositionSample' + source: + type: string + description: Data source identifier. + updatedAt: + type: integer + format: int64 + description: 'Last update time as Unix epoch milliseconds.. Warning: Values > 2^53 may lose precision in JavaScript' + description: TrackAircraftResponse contains aircraft position observations. + worldmonitor_aviation_v1_PositionSample: + type: object + properties: + icao24: + type: string + description: ICAO 24-bit transponder address (hex, e.g., "4b1805"). + callsign: + type: string + description: ATC callsign (e.g., "THY7CX"). + lat: + type: number + format: double + description: Latitude in decimal degrees. + lon: + type: number + format: double + description: Longitude in decimal degrees. + altitudeM: + type: number + format: double + description: Barometric altitude in metres. + groundSpeedKts: + type: number + format: double + description: Ground speed in knots. + trackDeg: + type: number + format: double + description: True track over ground in degrees (0 = North, clockwise). + verticalRate: + type: number + format: double + description: Vertical rate in metres per second (positive = climbing). + onGround: + type: boolean + description: Whether the aircraft is on the ground. + source: + type: string + enum: + - POSITION_SOURCE_UNSPECIFIED + - POSITION_SOURCE_OPENSKY + - POSITION_SOURCE_WINGBITS + - POSITION_SOURCE_SIMULATED + description: PositionSource identifies the provider of aircraft position data. + observedAt: + type: integer + format: int64 + description: 'Observation time as Unix epoch milliseconds.. Warning: Values > 2^53 may lose precision in JavaScript' + description: PositionSample represents a single aircraft position observation. + worldmonitor_aviation_v1_GetYoutubeLiveStreamInfoRequest: + type: object + properties: + channel: + type: string + description: YouTube channel handle or ID. + videoId: + type: string + description: Specific video ID to check. + description: GetYoutubeLiveStreamInfoRequest parameters for detecting live status. + worldmonitor_aviation_v1_GetYoutubeLiveStreamInfoResponse: + type: object + properties: + videoId: + type: string + description: Video ID of the live stream (if found). + isLive: + type: boolean + description: Whether the stream is currently live. + channelExists: + type: boolean + description: Whether the channel exists. + channelName: + type: string + description: Human-readable channel name. + hlsUrl: + type: string + description: HLS manifest URL (if available). + title: + type: string + description: Stream title. + error: + type: string + description: Optional error message. + description: GetYoutubeLiveStreamInfoResponse containing detection results. + worldmonitor_aviation_v1_SearchFlightPricesRequest: + type: object + properties: + origin: + type: string + maxLength: 4 + minLength: 3 + description: Origin airport IATA code. + destination: + type: string + maxLength: 4 + minLength: 3 + description: Destination airport IATA code. + departureDate: + type: string + description: Outbound departure date (ISO 8601). + returnDate: + type: string + description: Return date (ISO 8601), empty for one-way. + adults: + type: integer + maximum: 9 + minimum: 1 + format: int32 + description: Number of adult passengers (1-9). + cabin: + type: string + enum: + - CABIN_CLASS_UNSPECIFIED + - CABIN_CLASS_ECONOMY + - CABIN_CLASS_PREMIUM_ECONOMY + - CABIN_CLASS_BUSINESS + - CABIN_CLASS_FIRST + description: CabinClass represents the travel class for a flight ticket. + nonstopOnly: + type: boolean + description: Whether to restrict to nonstop flights only. + maxResults: + type: integer + maximum: 50 + minimum: 1 + format: int32 + description: Maximum number of quotes to return (1-50). + currency: + type: string + description: ISO 4217 currency code for prices (e.g., "usd", "eur", "try"). + market: + type: string + description: Market/locale code (e.g., "us", "tr"). + required: + - origin + - destination + - departureDate + description: SearchFlightPricesRequest specifies parameters for a flight price search. + worldmonitor_aviation_v1_SearchFlightPricesResponse: + type: object + properties: + quotes: + type: array + items: + $ref: '#/components/schemas/worldmonitor_aviation_v1_PriceQuote' + provider: + type: string + description: Provider name (e.g., "amadeus", "demo"). + isDemoMode: + type: boolean + description: Whether results are from demo/simulated mode. + updatedAt: + type: integer + format: int64 + description: 'Last update time as Unix epoch milliseconds.. Warning: Values > 2^53 may lose precision in JavaScript' + isIndicative: + type: boolean + description: Whether returned prices are indicative (subject to change). + description: SearchFlightPricesResponse contains flight price offers. + worldmonitor_aviation_v1_PriceQuote: + type: object + properties: + id: + type: string + description: Unique quote identifier. + origin: + type: string + description: Origin airport IATA code. + destination: + type: string + description: Destination airport IATA code. + departureDate: + type: string + description: Outbound departure date (ISO 8601). + returnDate: + type: string + description: Return date (ISO 8601), empty for one-way. + carrier: + $ref: '#/components/schemas/worldmonitor_aviation_v1_Carrier' + priceAmount: + type: number + format: double + description: Total price amount. + currency: + type: string + description: ISO 4217 currency code (e.g., "EUR", "USD", "TRY"). + cabin: + type: string + enum: + - CABIN_CLASS_UNSPECIFIED + - CABIN_CLASS_ECONOMY + - CABIN_CLASS_PREMIUM_ECONOMY + - CABIN_CLASS_BUSINESS + - CABIN_CLASS_FIRST + description: CabinClass represents the travel class for a flight ticket. + stops: + type: integer + format: int32 + description: Number of stops (0 = nonstop). + durationMinutes: + type: integer + format: int32 + description: Total travel duration in minutes. + bookingUrl: + type: string + description: Booking URL or deep-link (if available). + provider: + type: string + description: Provider name (e.g., "amadeus", "demo"). + isIndicative: + type: boolean + description: Whether the price is indicative rather than bookable. + observedAt: + type: integer + format: int64 + description: 'Time when this quote was observed, as Unix epoch milliseconds.. Warning: Values > 2^53 may lose precision in JavaScript' + checkoutRef: + type: string + description: Reference used during the checkout process (for follow-up actions). + expiresAt: + type: integer + format: int64 + description: 'Time when this quote expires, as Unix epoch milliseconds.. Warning: Values > 2^53 may lose precision in JavaScript' + description: PriceQuote represents a single flight price offer from a provider. + worldmonitor_aviation_v1_ListAviationNewsRequest: + type: object + properties: + entities: + type: array + items: + type: string + maxItems: 10 + minItems: 1 + description: Entities to filter by (airline names, airport codes, route strings). + maxItems: 10 + minItems: 1 + windowHours: + type: integer + maximum: 168 + minimum: 1 + format: int32 + description: Time window in hours to look back (1-168). + maxItems: + type: integer + maximum: 50 + minimum: 1 + format: int32 + description: Maximum number of news items to return (1-50). + description: ListAviationNewsRequest specifies filters for aviation news retrieval. + worldmonitor_aviation_v1_ListAviationNewsResponse: + type: object + properties: + items: + type: array + items: + $ref: '#/components/schemas/worldmonitor_aviation_v1_AviationNewsItem' + source: + type: string + description: Data source identifier. + updatedAt: + type: integer + format: int64 + description: 'Last update time as Unix epoch milliseconds.. Warning: Values > 2^53 may lose precision in JavaScript' + description: ListAviationNewsResponse contains filtered aviation news items. + worldmonitor_aviation_v1_AviationNewsItem: + type: object + properties: + id: + type: string + description: Unique item identifier (hash of URL). + title: + type: string + description: Article title. + url: + type: string + description: Article URL. + sourceName: + type: string + description: Name of the news source (e.g., "FlightGlobal"). + publishedAt: + type: integer + format: int64 + description: 'Publication time as Unix epoch milliseconds.. Warning: Values > 2^53 may lose precision in JavaScript' + snippet: + type: string + description: Short text snippet or description. + matchedEntities: + type: array + items: + type: string + description: Entities matched from the query (airport codes, airline names). + imageUrl: + type: string + description: Article image URL (if available). + description: AviationNewsItem represents a single aviation news article or press release. + worldmonitor_aviation_v1_SearchGoogleFlightsRequest: + type: object + properties: + origin: + type: string + description: Departure airport IATA code (e.g. "JFK"). + destination: + type: string + description: Arrival airport IATA code (e.g. "LHR"). + departureDate: + type: string + description: Departure date in YYYY-MM-DD format. + returnDate: + type: string + description: Return date in YYYY-MM-DD format; omit for one-way. + cabinClass: + type: string + description: 'Cabin class: ECONOMY, PREMIUM_ECONOMY, BUSINESS, or FIRST.' + maxStops: + type: string + description: 'Stop filter: ANY, NON_STOP, ONE_STOP, or TWO_PLUS_STOPS.' + departureWindow: + type: string + description: Departure time window in HH-HH format (e.g. "6-20"). + airlines: + type: array + items: + type: string + description: Airline IATA codes to filter by (e.g. ["BA", "AA"]). + sortBy: + type: string + description: 'Sort order: CHEAPEST, DURATION, DEPARTURE_TIME, or ARRIVAL_TIME.' + passengers: + type: integer + format: int32 + description: Number of adult passengers (1-9). + description: SearchGoogleFlightsRequest specifies parameters for a Google Flights search. + worldmonitor_aviation_v1_SearchGoogleFlightsResponse: + type: object + properties: + flights: + type: array + items: + $ref: '#/components/schemas/worldmonitor_aviation_v1_GoogleFlightResult' + degraded: + type: boolean + error: + type: string + description: SearchGoogleFlightsResponse contains flight results from Google Flights. + worldmonitor_aviation_v1_GoogleFlightResult: + type: object + properties: + legs: + type: array + items: + $ref: '#/components/schemas/worldmonitor_aviation_v1_GoogleFlightLeg' + price: + type: number + format: double + durationMinutes: + type: integer + format: int32 + stops: + type: integer + format: int32 + description: GoogleFlightResult represents a complete itinerary (one or more legs). + worldmonitor_aviation_v1_GoogleFlightLeg: + type: object + properties: + airlineCode: + type: string + flightNumber: + type: string + departureAirport: + type: string + arrivalAirport: + type: string + departureDatetime: + type: string + description: ISO 8601 local datetime, e.g. "2025-06-01T08:45". + arrivalDatetime: + type: string + durationMinutes: + type: integer + format: int32 + description: GoogleFlightLeg represents a single flight segment (one plane, one takeoff and landing). + worldmonitor_aviation_v1_SearchGoogleDatesRequest: + type: object + properties: + origin: + type: string + description: Departure airport IATA code (e.g. "JFK"). + destination: + type: string + description: Arrival airport IATA code (e.g. "LHR"). + startDate: + type: string + description: Start of date range in YYYY-MM-DD format. + endDate: + type: string + description: End of date range in YYYY-MM-DD format. + tripDuration: + type: integer + format: int32 + description: Trip duration in days (required for round-trip searches). + isRoundTrip: + type: boolean + description: Whether to search for round-trip flights. + cabinClass: + type: string + description: 'Cabin class: ECONOMY, PREMIUM_ECONOMY, BUSINESS, or FIRST.' + maxStops: + type: string + description: 'Stop filter: ANY, NON_STOP, ONE_STOP, or TWO_PLUS_STOPS.' + departureWindow: + type: string + description: Departure time window in HH-HH format (e.g. "6-20"). + airlines: + type: array + items: + type: string + description: Airline IATA codes to filter by (e.g. ["BA", "AA"]). + sortByPrice: + type: boolean + description: Whether to sort results by price (lowest first). + passengers: + type: integer + format: int32 + description: Number of adult passengers (1-9). + description: SearchGoogleDatesRequest specifies parameters for a Google Flights date-range price search. + worldmonitor_aviation_v1_SearchGoogleDatesResponse: + type: object + properties: + dates: + type: array + items: + $ref: '#/components/schemas/worldmonitor_aviation_v1_DatePriceEntry' + degraded: + type: boolean + error: + type: string + description: SearchGoogleDatesResponse contains cheapest-date results from Google Flights. + worldmonitor_aviation_v1_DatePriceEntry: + type: object + properties: + date: + type: string + description: Departure date in YYYY-MM-DD format. + returnDate: + type: string + description: Return date in YYYY-MM-DD format; empty for one-way results. + price: + type: number + format: double + description: DatePriceEntry pairs a departure date (and optional return date) with its cheapest price. + worldmonitor_climate_v1_ListClimateAnomaliesRequest: + type: object + properties: + pageSize: + type: integer + format: int32 + description: Maximum items per page (1-100). + cursor: + type: string + description: Cursor for next page. + minSeverity: + type: string + enum: + - ANOMALY_SEVERITY_UNSPECIFIED + - ANOMALY_SEVERITY_NORMAL + - ANOMALY_SEVERITY_MODERATE + - ANOMALY_SEVERITY_EXTREME + description: |- + AnomalySeverity represents the severity of a climate anomaly. + Maps to existing TS union: 'normal' | 'moderate' | 'extreme'. + description: ListClimateAnomaliesRequest specifies filters for retrieving climate anomaly data. + worldmonitor_climate_v1_ListClimateAnomaliesResponse: + type: object + properties: + anomalies: + type: array + items: + $ref: '#/components/schemas/worldmonitor_climate_v1_ClimateAnomaly' + pagination: + $ref: '#/components/schemas/worldmonitor_core_v1_PaginationResponse' + description: ListClimateAnomaliesResponse contains the list of climate anomalies. + worldmonitor_climate_v1_ClimateAnomaly: + type: object + properties: + zone: + type: string + minLength: 1 + description: Climate zone name (e.g., "Northern Europe", "Sahel"). + location: + $ref: '#/components/schemas/worldmonitor_core_v1_GeoCoordinates' + tempDelta: + type: number + format: double + description: Temperature deviation from normal in degrees Celsius. + precipDelta: + type: number + format: double + description: Precipitation deviation from normal in millimeters. + severity: + type: string + enum: + - ANOMALY_SEVERITY_UNSPECIFIED + - ANOMALY_SEVERITY_NORMAL + - ANOMALY_SEVERITY_MODERATE + - ANOMALY_SEVERITY_EXTREME + description: |- + AnomalySeverity represents the severity of a climate anomaly. + Maps to existing TS union: 'normal' | 'moderate' | 'extreme'. + type: + type: string + enum: + - ANOMALY_TYPE_UNSPECIFIED + - ANOMALY_TYPE_WARM + - ANOMALY_TYPE_COLD + - ANOMALY_TYPE_WET + - ANOMALY_TYPE_DRY + - ANOMALY_TYPE_MIXED + description: |- + AnomalyType represents the type of climate anomaly. + Maps to existing TS union: 'warm' | 'cold' | 'wet' | 'dry' | 'mixed'. + period: + type: string + minLength: 1 + description: Time period covered (e.g., "2024-W03", "2024-01"). + required: + - zone + - period + description: |- + ClimateAnomaly represents a temperature or precipitation deviation from historical norms. + Sourced from Open-Meteo / ERA5 reanalysis data. + worldmonitor_climate_v1_ListClimateDisastersRequest: + type: object + properties: + pageSize: + type: integer + format: int32 + description: Maximum items per page (1-100). + cursor: + type: string + description: Cursor for next page. + description: ListClimateDisastersRequest specifies filters for retrieving climate disasters. + worldmonitor_climate_v1_ListClimateDisastersResponse: + type: object + properties: + disasters: + type: array + items: + $ref: '#/components/schemas/worldmonitor_climate_v1_ClimateDisaster' + pagination: + $ref: '#/components/schemas/worldmonitor_core_v1_PaginationResponse' + description: ListClimateDisastersResponse contains climate disaster events. + worldmonitor_climate_v1_ClimateDisaster: + type: object + properties: + id: + type: string + description: Unique event identifier. + type: + type: string + description: 'Disaster type: flood, cyclone, drought, heatwave, wildfire.' + name: + type: string + description: Human-readable event name. + country: + type: string + description: Country name. + countryCode: + type: string + description: ISO 3166-1 alpha-2 country code. + lat: + type: number + format: double + description: Event latitude. + lng: + type: number + format: double + description: Event longitude. + severity: + type: string + description: 'Severity level. GDACS: green/orange/red. ReliefWeb: low/medium/high.' + startedAt: + type: integer + format: int64 + description: 'Event start time as Unix epoch milliseconds. Warning: Values > 2^53 may lose precision in JavaScript' + status: + type: string + description: 'Event status: alert/ongoing/past.' + affectedPopulation: + type: integer + format: int32 + description: Affected population when available. + source: + type: string + description: 'Source system: GDACS, ReliefWeb, NASA FIRMS.' + sourceUrl: + type: string + description: Source URL for drill-down. + description: ClimateDisaster represents a climate-relevant disaster event from seeded caches. + worldmonitor_climate_v1_GetCo2MonitoringRequest: + type: object + worldmonitor_climate_v1_GetCo2MonitoringResponse: + type: object + properties: + monitoring: + $ref: '#/components/schemas/worldmonitor_climate_v1_Co2Monitoring' + worldmonitor_climate_v1_Co2Monitoring: + type: object + properties: + currentPpm: + type: number + format: double + yearAgoPpm: + type: number + format: double + annualGrowthRate: + type: number + format: double + preIndustrialBaseline: + type: number + format: double + monthlyAverage: + type: number + format: double + trend12m: + type: array + items: + $ref: '#/components/schemas/worldmonitor_climate_v1_Co2DataPoint' + methanePpb: + type: number + format: double + nitrousOxidePpb: + type: number + format: double + measuredAt: + type: string + format: int64 + station: + type: string + worldmonitor_climate_v1_Co2DataPoint: + type: object + properties: + month: + type: string + ppm: + type: number + format: double + anomaly: + type: number + format: double + description: Year-over-year delta vs same calendar month, in ppm. + worldmonitor_climate_v1_GetOceanIceDataRequest: + type: object + worldmonitor_climate_v1_GetOceanIceDataResponse: + type: object + properties: + data: + $ref: '#/components/schemas/worldmonitor_climate_v1_OceanIceData' + worldmonitor_climate_v1_OceanIceData: + type: object + properties: + arcticExtentMkm2: + type: number + format: double + arcticExtentAnomalyMkm2: + type: number + format: double + arcticTrend: + type: string + seaLevelMmAbove1993: + type: number + format: double + seaLevelAnnualRiseMm: + type: number + format: double + ohc0700mZj: + type: number + format: double + sstAnomalyC: + type: number + format: double + measuredAt: + type: integer + format: int64 + description: 'Warning: Values > 2^53 may lose precision in JavaScript' + iceTrend12m: + type: array + items: + $ref: '#/components/schemas/worldmonitor_climate_v1_IceTrendPoint' + worldmonitor_climate_v1_IceTrendPoint: + type: object + properties: + month: + type: string + extentMkm2: + type: number + format: double + anomalyMkm2: + type: number + format: double + worldmonitor_climate_v1_ListAirQualityDataRequest: + type: object + worldmonitor_climate_v1_ListAirQualityDataResponse: + type: object + properties: + stations: + type: array + items: + $ref: '#/components/schemas/worldmonitor_climate_v1_AirQualityStation' + fetchedAt: + type: integer + format: int64 + description: 'Warning: Values > 2^53 may lose precision in JavaScript' + worldmonitor_climate_v1_AirQualityStation: + type: object + properties: + city: + type: string + countryCode: + type: string + lat: + type: number + format: double + lng: + type: number + format: double + pm25: + type: number + format: double + aqi: + type: integer + format: int32 + riskLevel: + type: string + pollutant: + type: string + measuredAt: + type: integer + format: int64 + description: 'Warning: Values > 2^53 may lose precision in JavaScript' + source: + type: string + worldmonitor_climate_v1_ListClimateNewsRequest: + type: object + worldmonitor_climate_v1_ListClimateNewsResponse: + type: object + properties: + items: + type: array + items: + $ref: '#/components/schemas/worldmonitor_climate_v1_ClimateNewsItem' + fetchedAt: + type: integer + format: int64 + description: 'Warning: Values > 2^53 may lose precision in JavaScript' + worldmonitor_climate_v1_ClimateNewsItem: + type: object + properties: + id: + type: string + description: Unique identifier (URL hash + publish timestamp). + title: + type: string + description: Article headline. + url: + type: string + description: Canonical article URL. + sourceName: + type: string + description: Source publication name. + publishedAt: + type: integer + format: int64 + description: 'Publication time as Unix epoch milliseconds.. Warning: Values > 2^53 may lose precision in JavaScript' + summary: + type: string + description: Short summary/description (max 300 chars in seed pipeline). + description: ClimateNewsItem represents a single climate/environment news article. + worldmonitor_conflict_v1_ListAcledEventsRequest: + type: object + properties: + start: + type: integer + format: int64 + description: 'Start of time range (inclusive), Unix epoch milliseconds.. Warning: Values > 2^53 may lose precision in JavaScript' + end: + type: integer + format: int64 + description: 'End of time range (inclusive), Unix epoch milliseconds.. Warning: Values > 2^53 may lose precision in JavaScript' + pageSize: + type: integer + format: int32 + description: Maximum items per page (1-100). + cursor: + type: string + description: Cursor for next page. + country: + type: string + description: Optional country filter (ISO 3166-1 alpha-2). + description: ListAcledEventsRequest specifies filters for retrieving ACLED conflict events. + worldmonitor_conflict_v1_ListAcledEventsResponse: + type: object + properties: + events: + type: array + items: + $ref: '#/components/schemas/worldmonitor_conflict_v1_AcledConflictEvent' + pagination: + $ref: '#/components/schemas/worldmonitor_core_v1_PaginationResponse' + description: ListAcledEventsResponse contains ACLED conflict events matching the request. + worldmonitor_conflict_v1_AcledConflictEvent: + type: object + properties: + id: + type: string + minLength: 1 + description: Unique ACLED event identifier. + eventType: + type: string + description: ACLED event type classification (e.g., "Battles", "Explosions/Remote violence"). + country: + type: string + description: Country where the event occurred. + location: + $ref: '#/components/schemas/worldmonitor_core_v1_GeoCoordinates' + occurredAt: + type: integer + format: int64 + description: 'Time the event occurred, as Unix epoch milliseconds.. Warning: Values > 2^53 may lose precision in JavaScript' + fatalities: + type: integer + format: int32 + description: Reported fatalities from this event. + actors: + type: array + items: + type: string + description: Named actors involved in the event. + source: + type: string + description: Source article or report. + admin1: + type: string + description: Administrative region within the country. + required: + - id + description: AcledConflictEvent represents an armed conflict event from the ACLED dataset. + worldmonitor_conflict_v1_ListUcdpEventsRequest: + type: object + properties: + start: + type: integer + format: int64 + description: 'Start of time range (inclusive), Unix epoch milliseconds.. Warning: Values > 2^53 may lose precision in JavaScript' + end: + type: integer + format: int64 + description: 'End of time range (inclusive), Unix epoch milliseconds.. Warning: Values > 2^53 may lose precision in JavaScript' + pageSize: + type: integer + format: int32 + description: Maximum items per page (1-100). + cursor: + type: string + description: Cursor for next page. + country: + type: string + description: Optional country filter (ISO 3166-1 alpha-2). + description: ListUcdpEventsRequest specifies filters for retrieving UCDP violence events. + worldmonitor_conflict_v1_ListUcdpEventsResponse: + type: object + properties: + events: + type: array + items: + $ref: '#/components/schemas/worldmonitor_conflict_v1_UcdpViolenceEvent' + pagination: + $ref: '#/components/schemas/worldmonitor_core_v1_PaginationResponse' + description: ListUcdpEventsResponse contains UCDP violence events matching the request. + worldmonitor_conflict_v1_UcdpViolenceEvent: + type: object + properties: + id: + type: string + minLength: 1 + description: Unique UCDP event identifier. + dateStart: + type: integer + format: int64 + description: 'Start date of the event, as Unix epoch milliseconds.. Warning: Values > 2^53 may lose precision in JavaScript' + dateEnd: + type: integer + format: int64 + description: 'End date of the event, as Unix epoch milliseconds.. Warning: Values > 2^53 may lose precision in JavaScript' + location: + $ref: '#/components/schemas/worldmonitor_core_v1_GeoCoordinates' + country: + type: string + description: Country where the event occurred. + sideA: + type: string + description: Primary party in the conflict (Side A). + sideB: + type: string + description: Secondary party in the conflict (Side B). + deathsBest: + type: integer + format: int32 + description: Best estimate of deaths. + deathsLow: + type: integer + format: int32 + description: Low estimate of deaths. + deathsHigh: + type: integer + format: int32 + description: High estimate of deaths. + violenceType: + type: string + enum: + - UCDP_VIOLENCE_TYPE_UNSPECIFIED + - UCDP_VIOLENCE_TYPE_STATE_BASED + - UCDP_VIOLENCE_TYPE_NON_STATE + - UCDP_VIOLENCE_TYPE_ONE_SIDED + description: |- + UcdpViolenceType represents the UCDP violence classification. + Maps to existing TS union: 'state-based' | 'non-state' | 'one-sided'. + sourceOriginal: + type: string + description: Original source of the event report. + required: + - id + description: UcdpViolenceEvent represents a georeferenced violence event from the UCDP dataset. + worldmonitor_conflict_v1_GetHumanitarianSummaryRequest: + type: object + properties: + countryCode: + type: string + pattern: ^[A-Z]{2}$ + description: ISO 3166-1 alpha-2 country code (e.g., "YE", "SD", "SO"). + required: + - countryCode + description: GetHumanitarianSummaryRequest specifies which country to retrieve the humanitarian summary for. + worldmonitor_conflict_v1_GetHumanitarianSummaryResponse: + type: object + properties: + summary: + $ref: '#/components/schemas/worldmonitor_conflict_v1_HumanitarianCountrySummary' + description: GetHumanitarianSummaryResponse contains the humanitarian summary for the requested country. + worldmonitor_conflict_v1_HumanitarianCountrySummary: + type: object + properties: + countryCode: + type: string + description: ISO 3166-1 alpha-2 country code. + countryName: + type: string + description: Country name. + conflictEventsTotal: + type: integer + format: int32 + description: Total conflict events in the reference period. + conflictPoliticalViolenceEvents: + type: integer + format: int32 + description: Political violence + civilian targeting event count. + conflictFatalities: + type: integer + format: int32 + description: Total fatalities from political violence and civilian targeting. + referencePeriod: + type: string + description: Reference period start date (YYYY-MM-DD). + conflictDemonstrations: + type: integer + format: int32 + description: Number of demonstration events. + updatedAt: + type: integer + format: int64 + description: 'Last data update time, as Unix epoch milliseconds.. Warning: Values > 2^53 may lose precision in JavaScript' + description: HumanitarianCountrySummary represents HAPI conflict event counts for a country. + worldmonitor_conflict_v1_ListIranEventsRequest: + type: object + worldmonitor_conflict_v1_ListIranEventsResponse: + type: object + properties: + events: + type: array + items: + $ref: '#/components/schemas/worldmonitor_conflict_v1_IranEvent' + scrapedAt: + type: string + format: int64 + worldmonitor_conflict_v1_IranEvent: + type: object + properties: + id: + type: string + title: + type: string + category: + type: string + sourceUrl: + type: string + latitude: + type: number + format: double + longitude: + type: number + format: double + locationName: + type: string + timestamp: + type: string + format: int64 + severity: + type: string + worldmonitor_conflict_v1_GetHumanitarianSummaryBatchRequest: + type: object + properties: + countryCodes: + type: array + items: + type: string + maxItems: 25 + minItems: 1 + description: ISO 3166-1 alpha-2 country codes (e.g., "YE", "SD"). Max 25. + maxItems: 25 + minItems: 1 + description: GetHumanitarianSummaryBatchRequest looks up humanitarian summaries for multiple countries. + worldmonitor_conflict_v1_GetHumanitarianSummaryBatchResponse: + type: object + properties: + results: + type: object + additionalProperties: + $ref: '#/components/schemas/worldmonitor_conflict_v1_HumanitarianCountrySummary' + description: Map of country_code -> humanitarian summary for found countries. + fetched: + type: integer + format: int32 + description: Number of countries successfully fetched. + requested: + type: integer + format: int32 + description: Number of countries requested. + description: GetHumanitarianSummaryBatchResponse contains humanitarian summaries for the requested countries. + worldmonitor_conflict_v1_GetHumanitarianSummaryBatchResponse_ResultsEntry: + type: object + properties: + key: + type: string + value: + $ref: '#/components/schemas/worldmonitor_conflict_v1_HumanitarianCountrySummary' + worldmonitor_consumer_prices_v1_GetConsumerPriceOverviewRequest: + type: object + properties: + marketCode: + type: string + description: market_code is the ISO 3166-1 alpha-2 market identifier (e.g. "ae"). + basketSlug: + type: string + description: basket_slug selects which basket to use (e.g. "essentials-ae"). + description: GetConsumerPriceOverviewRequest parameters for the overview RPC. + worldmonitor_consumer_prices_v1_GetConsumerPriceOverviewResponse: + type: object + properties: + marketCode: + type: string + description: market_code echoes the requested market. + asOf: + type: string + format: int64 + description: as_of is the Unix millisecond timestamp of the snapshot. + currencyCode: + type: string + description: currency_code is the ISO 4217 currency for price values. + essentialsIndex: + type: number + format: double + description: essentials_index is the fixed basket index value (base = 100). + valueBasketIndex: + type: number + format: double + description: value_basket_index is the value basket index value (base = 100). + wowPct: + type: number + format: double + description: wow_pct is the week-over-week percentage change in the essentials index. + momPct: + type: number + format: double + description: mom_pct is the month-over-month percentage change in the essentials index. + retailerSpreadPct: + type: number + format: double + description: retailer_spread_pct is the basket cost spread between cheapest and most expensive retailer. + coveragePct: + type: number + format: double + description: coverage_pct is the fraction of basket items with current observations. + freshnessLagMin: + type: integer + format: int32 + description: freshness_lag_min is the average minutes since last observation across all retailers. + topCategories: + type: array + items: + $ref: '#/components/schemas/worldmonitor_consumer_prices_v1_CategorySnapshot' + upstreamUnavailable: + type: boolean + description: upstream_unavailable is true when the companion service could not be reached. + description: GetConsumerPriceOverviewResponse contains headline basket and coverage metrics. + worldmonitor_consumer_prices_v1_CategorySnapshot: + type: object + properties: + slug: + type: string + description: slug is the machine-readable category identifier (e.g. "eggs", "rice"). + name: + type: string + description: name is the human-readable category label. + wowPct: + type: number + format: double + description: wow_pct is the week-over-week percentage change. + momPct: + type: number + format: double + description: mom_pct is the month-over-month percentage change. + currentIndex: + type: number + format: double + description: current_index is the current price index value (base = 100). + sparkline: + type: array + items: + type: number + format: double + description: sparkline is an ordered sequence of index values for the selected range. + coveragePct: + type: number + format: double + description: coverage_pct is the percentage of basket items observed for this category. + itemCount: + type: integer + format: int32 + description: item_count is the number of observed products in this category. + description: CategorySnapshot holds price index data for a single product category. + worldmonitor_consumer_prices_v1_GetConsumerPriceBasketSeriesRequest: + type: object + properties: + marketCode: + type: string + description: market_code is the ISO 3166-1 alpha-2 market identifier. + basketSlug: + type: string + description: basket_slug selects the basket (e.g. "essentials-ae"). + range: + type: string + description: range is one of "7d", "30d", "90d", "180d". + description: GetConsumerPriceBasketSeriesRequest parameters for time series data. + worldmonitor_consumer_prices_v1_GetConsumerPriceBasketSeriesResponse: + type: object + properties: + marketCode: + type: string + description: market_code echoes the requested market. + basketSlug: + type: string + description: basket_slug echoes the requested basket. + asOf: + type: string + format: int64 + description: as_of is the Unix millisecond timestamp of the snapshot. + currencyCode: + type: string + description: currency_code is the ISO 4217 currency code. + range: + type: string + description: range echoes the requested range. + essentialsSeries: + type: array + items: + $ref: '#/components/schemas/worldmonitor_consumer_prices_v1_BasketPoint' + valueSeries: + type: array + items: + $ref: '#/components/schemas/worldmonitor_consumer_prices_v1_BasketPoint' + upstreamUnavailable: + type: boolean + description: upstream_unavailable is true when the companion service could not be reached. + description: GetConsumerPriceBasketSeriesResponse contains the basket index time series. + worldmonitor_consumer_prices_v1_BasketPoint: + type: object + properties: + date: + type: string + description: date is the ISO 8601 date string (YYYY-MM-DD). + index: + type: number + format: double + description: index is the basket index value (base = 100). + description: BasketPoint is a single data point in a basket index time series. + worldmonitor_consumer_prices_v1_ListConsumerPriceCategoriesRequest: + type: object + properties: + marketCode: + type: string + description: market_code is the ISO 3166-1 alpha-2 market identifier. + basketSlug: + type: string + description: basket_slug selects the basket scope. + range: + type: string + description: range is one of "7d", "30d", "90d", "180d". + description: ListConsumerPriceCategoriesRequest parameters for category listing. + worldmonitor_consumer_prices_v1_ListConsumerPriceCategoriesResponse: + type: object + properties: + marketCode: + type: string + description: market_code echoes the requested market. + asOf: + type: string + format: int64 + description: as_of is the Unix millisecond timestamp of the snapshot. + range: + type: string + description: range echoes the requested range. + categories: + type: array + items: + $ref: '#/components/schemas/worldmonitor_consumer_prices_v1_CategorySnapshot' + upstreamUnavailable: + type: boolean + description: upstream_unavailable is true when the companion service could not be reached. + description: ListConsumerPriceCategoriesResponse holds category-level price snapshots. + worldmonitor_consumer_prices_v1_ListConsumerPriceMoversRequest: + type: object + properties: + marketCode: + type: string + description: market_code is the ISO 3166-1 alpha-2 market identifier. + range: + type: string + description: range is one of "7d", "30d", "90d". + limit: + type: integer + format: int32 + description: limit caps the number of risers and fallers returned (default 10). + categorySlug: + type: string + description: category_slug filters to a single category when set. + description: ListConsumerPriceMoversRequest parameters for the movers RPC. + worldmonitor_consumer_prices_v1_ListConsumerPriceMoversResponse: + type: object + properties: + marketCode: + type: string + description: market_code echoes the requested market. + asOf: + type: string + format: int64 + description: as_of is the Unix millisecond timestamp of the snapshot. + range: + type: string + description: range echoes the requested range. + risers: + type: array + items: + $ref: '#/components/schemas/worldmonitor_consumer_prices_v1_PriceMover' + fallers: + type: array + items: + $ref: '#/components/schemas/worldmonitor_consumer_prices_v1_PriceMover' + upstreamUnavailable: + type: boolean + description: upstream_unavailable is true when the companion service could not be reached. + description: ListConsumerPriceMoversResponse holds the top price movers. + worldmonitor_consumer_prices_v1_PriceMover: + type: object + properties: + productId: + type: string + description: product_id is the retailer product identifier. + title: + type: string + description: title is the normalized product title. + category: + type: string + description: category is the product category slug. + retailerSlug: + type: string + description: retailer_slug identifies the retailer where this move was observed. + changePct: + type: number + format: double + description: change_pct is the signed percentage change over the selected window. + currentPrice: + type: number + format: double + description: current_price is the latest observed price. + currencyCode: + type: string + description: currency_code is the ISO 4217 currency code. + description: PriceMover describes a product with a notable upward or downward price move. + worldmonitor_consumer_prices_v1_ListRetailerPriceSpreadsRequest: + type: object + properties: + marketCode: + type: string + description: market_code is the ISO 3166-1 alpha-2 market identifier. + basketSlug: + type: string + description: basket_slug selects which basket to compare across retailers. + description: ListRetailerPriceSpreadsRequest parameters for the retailer spread RPC. + worldmonitor_consumer_prices_v1_ListRetailerPriceSpreadsResponse: + type: object + properties: + marketCode: + type: string + description: market_code echoes the requested market. + asOf: + type: string + format: int64 + description: as_of is the Unix millisecond timestamp of the snapshot. + basketSlug: + type: string + description: basket_slug echoes the requested basket. + currencyCode: + type: string + description: currency_code is the ISO 4217 currency code. + retailers: + type: array + items: + $ref: '#/components/schemas/worldmonitor_consumer_prices_v1_RetailerSpread' + spreadPct: + type: number + format: double + description: spread_pct is the percentage difference between cheapest and most expensive retailer. + upstreamUnavailable: + type: boolean + description: upstream_unavailable is true when the companion service could not be reached. + description: ListRetailerPriceSpreadsResponse holds cheapest-basket rankings. + worldmonitor_consumer_prices_v1_RetailerSpread: + type: object + properties: + slug: + type: string + description: slug is the retailer identifier. + name: + type: string + description: name is the retailer display name. + basketTotal: + type: number + format: double + description: basket_total is the sum of matched basket item prices at this retailer. + deltaVsCheapest: + type: number + format: double + description: delta_vs_cheapest is the absolute price difference vs the cheapest retailer. + deltaVsCheapestPct: + type: number + format: double + description: delta_vs_cheapest_pct is the percentage difference vs the cheapest retailer. + itemCount: + type: integer + format: int32 + description: item_count is the number of matched basket items observed. + freshnessMin: + type: integer + format: int32 + description: freshness_min is minutes since the last successful scrape for this retailer. + currencyCode: + type: string + description: currency_code is the ISO 4217 currency code. + description: RetailerSpread holds the basket cost breakdown for one retailer. + worldmonitor_consumer_prices_v1_GetConsumerPriceFreshnessRequest: + type: object + properties: + marketCode: + type: string + description: market_code is the ISO 3166-1 alpha-2 market identifier. + description: GetConsumerPriceFreshnessRequest parameters for the freshness RPC. + worldmonitor_consumer_prices_v1_GetConsumerPriceFreshnessResponse: + type: object + properties: + marketCode: + type: string + description: market_code echoes the requested market. + asOf: + type: string + format: int64 + description: as_of is the Unix millisecond timestamp of the snapshot. + retailers: + type: array + items: + $ref: '#/components/schemas/worldmonitor_consumer_prices_v1_RetailerFreshnessInfo' + overallFreshnessMin: + type: integer + format: int32 + description: overall_freshness_min is the average freshness lag across all retailers. + stalledCount: + type: integer + format: int32 + description: stalled_count is the number of retailers with no recent successful scrape. + upstreamUnavailable: + type: boolean + description: upstream_unavailable is true when the companion service could not be reached. + description: GetConsumerPriceFreshnessResponse describes feed health for all retailers. + worldmonitor_consumer_prices_v1_RetailerFreshnessInfo: + type: object + properties: + slug: + type: string + description: slug is the retailer identifier. + name: + type: string + description: name is the retailer display name. + lastRunAt: + type: string + format: int64 + description: last_run_at is the Unix millisecond timestamp of the last successful scrape. + status: + type: string + description: status is one of "ok", "stale", "failed", "unknown". + parseSuccessRate: + type: number + format: double + description: parse_success_rate is the fraction of pages parsed successfully (0–1). + freshnessMin: + type: integer + format: int32 + description: freshness_min is minutes since last successful observation. + description: RetailerFreshnessInfo describes the operational health of one retailer feed. + worldmonitor_cyber_v1_ListCyberThreatsRequest: + type: object + properties: + start: + type: integer + format: int64 + description: 'Start of time range (inclusive), Unix epoch milliseconds.. Warning: Values > 2^53 may lose precision in JavaScript' + end: + type: integer + format: int64 + description: 'End of time range (inclusive), Unix epoch milliseconds.. Warning: Values > 2^53 may lose precision in JavaScript' + pageSize: + type: integer + format: int32 + description: Maximum items per page (1-100). + cursor: + type: string + description: Cursor for next page. + type: + type: string + enum: + - CYBER_THREAT_TYPE_UNSPECIFIED + - CYBER_THREAT_TYPE_C2_SERVER + - CYBER_THREAT_TYPE_MALWARE_HOST + - CYBER_THREAT_TYPE_PHISHING + - CYBER_THREAT_TYPE_MALICIOUS_URL + description: |- + CyberThreatType represents the classification of a cyber threat. + Maps to TS union: 'c2_server' | 'malware_host' | 'phishing' | 'malicious_url'. + source: + type: string + enum: + - CYBER_THREAT_SOURCE_UNSPECIFIED + - CYBER_THREAT_SOURCE_FEODO + - CYBER_THREAT_SOURCE_URLHAUS + - CYBER_THREAT_SOURCE_C2INTEL + - CYBER_THREAT_SOURCE_OTX + - CYBER_THREAT_SOURCE_ABUSEIPDB + description: |- + CyberThreatSource represents the intelligence source of a cyber threat. + Maps to TS union: 'feodo' | 'urlhaus' | 'c2intel' | 'otx' | 'abuseipdb'. + minSeverity: + type: string + enum: + - CRITICALITY_LEVEL_UNSPECIFIED + - CRITICALITY_LEVEL_LOW + - CRITICALITY_LEVEL_MEDIUM + - CRITICALITY_LEVEL_HIGH + - CRITICALITY_LEVEL_CRITICAL + description: |- + CriticalityLevel represents a four-tier criticality classification for cyber and risk domains. + Maps to existing TS union: 'low' | 'medium' | 'high' | 'critical'. + description: ListCyberThreatsRequest specifies filters for retrieving cyber threat indicators. + worldmonitor_cyber_v1_ListCyberThreatsResponse: + type: object + properties: + threats: + type: array + items: + $ref: '#/components/schemas/worldmonitor_cyber_v1_CyberThreat' + pagination: + $ref: '#/components/schemas/worldmonitor_core_v1_PaginationResponse' + description: ListCyberThreatsResponse contains cyber threats matching the request. + worldmonitor_cyber_v1_CyberThreat: + type: object + properties: + id: + type: string + minLength: 1 + description: Unique threat identifier. + type: + type: string + enum: + - CYBER_THREAT_TYPE_UNSPECIFIED + - CYBER_THREAT_TYPE_C2_SERVER + - CYBER_THREAT_TYPE_MALWARE_HOST + - CYBER_THREAT_TYPE_PHISHING + - CYBER_THREAT_TYPE_MALICIOUS_URL + description: |- + CyberThreatType represents the classification of a cyber threat. + Maps to TS union: 'c2_server' | 'malware_host' | 'phishing' | 'malicious_url'. + source: + type: string + enum: + - CYBER_THREAT_SOURCE_UNSPECIFIED + - CYBER_THREAT_SOURCE_FEODO + - CYBER_THREAT_SOURCE_URLHAUS + - CYBER_THREAT_SOURCE_C2INTEL + - CYBER_THREAT_SOURCE_OTX + - CYBER_THREAT_SOURCE_ABUSEIPDB + description: |- + CyberThreatSource represents the intelligence source of a cyber threat. + Maps to TS union: 'feodo' | 'urlhaus' | 'c2intel' | 'otx' | 'abuseipdb'. + indicator: + type: string + description: Threat indicator value (IP, domain, or URL). + indicatorType: + type: string + enum: + - CYBER_THREAT_INDICATOR_TYPE_UNSPECIFIED + - CYBER_THREAT_INDICATOR_TYPE_IP + - CYBER_THREAT_INDICATOR_TYPE_DOMAIN + - CYBER_THREAT_INDICATOR_TYPE_URL + description: |- + CyberThreatIndicatorType represents the type of threat indicator. + Maps to TS union: 'ip' | 'domain' | 'url'. + location: + $ref: '#/components/schemas/worldmonitor_core_v1_GeoCoordinates' + country: + type: string + description: Country of origin (ISO 3166-1 alpha-2). + severity: + type: string + enum: + - CRITICALITY_LEVEL_UNSPECIFIED + - CRITICALITY_LEVEL_LOW + - CRITICALITY_LEVEL_MEDIUM + - CRITICALITY_LEVEL_HIGH + - CRITICALITY_LEVEL_CRITICAL + description: |- + CriticalityLevel represents a four-tier criticality classification for cyber and risk domains. + Maps to existing TS union: 'low' | 'medium' | 'high' | 'critical'. + malwareFamily: + type: string + description: Associated malware family, if known. + tags: + type: array + items: + type: string + description: Descriptive tags. + firstSeenAt: + type: integer + format: int64 + description: 'First seen time, as Unix epoch milliseconds.. Warning: Values > 2^53 may lose precision in JavaScript' + lastSeenAt: + type: integer + format: int64 + description: 'Last seen time, as Unix epoch milliseconds.. Warning: Values > 2^53 may lose precision in JavaScript' + required: + - id + description: |- + CyberThreat represents a cyber threat indicator aggregated from multiple sources. + Sources include Feodo Tracker, URLhaus, OTX, AbuseIPDB, and C2Intel. + worldmonitor_displacement_v1_GetDisplacementSummaryRequest: + type: object + properties: + year: + type: integer + minimum: 0 + format: int32 + description: Data year to retrieve (e.g., 2023). Uses latest available if zero. + countryLimit: + type: integer + minimum: 0 + format: int32 + description: Maximum number of country entries to return. + flowLimit: + type: integer + minimum: 0 + format: int32 + description: Maximum number of displacement flows to return. + description: GetDisplacementSummaryRequest specifies parameters for retrieving displacement data. + worldmonitor_displacement_v1_GetDisplacementSummaryResponse: + type: object + properties: + summary: + $ref: '#/components/schemas/worldmonitor_displacement_v1_DisplacementSummary' + description: GetDisplacementSummaryResponse contains the global displacement summary. + worldmonitor_displacement_v1_DisplacementSummary: + type: object + properties: + year: + type: integer + format: int32 + description: Data year. + globalTotals: + $ref: '#/components/schemas/worldmonitor_displacement_v1_GlobalDisplacementTotals' + countries: + type: array + items: + $ref: '#/components/schemas/worldmonitor_displacement_v1_CountryDisplacement' + topFlows: + type: array + items: + $ref: '#/components/schemas/worldmonitor_displacement_v1_DisplacementFlow' + description: DisplacementSummary represents a global overview of displacement data from UNHCR. + worldmonitor_displacement_v1_GlobalDisplacementTotals: + type: object + properties: + refugees: + type: integer + minimum: 0 + format: int64 + description: 'Total recognized refugees worldwide.. Warning: Values > 2^53 may lose precision in JavaScript' + asylumSeekers: + type: integer + minimum: 0 + format: int64 + description: 'Total asylum seekers worldwide.. Warning: Values > 2^53 may lose precision in JavaScript' + idps: + type: integer + minimum: 0 + format: int64 + description: 'Total internally displaced persons worldwide.. Warning: Values > 2^53 may lose precision in JavaScript' + stateless: + type: integer + minimum: 0 + format: int64 + description: 'Total stateless persons worldwide.. Warning: Values > 2^53 may lose precision in JavaScript' + total: + type: integer + minimum: 0 + format: int64 + description: 'Grand total of displaced persons.. Warning: Values > 2^53 may lose precision in JavaScript' + description: GlobalDisplacementTotals represents worldwide displacement figures. + worldmonitor_displacement_v1_CountryDisplacement: + type: object + properties: + code: + type: string + minLength: 1 + description: ISO 3166-1 alpha-2 country code. + name: + type: string + description: Country name. + refugees: + type: integer + format: int64 + description: 'Refugees originating from this country.. Warning: Values > 2^53 may lose precision in JavaScript' + asylumSeekers: + type: integer + format: int64 + description: 'Asylum seekers from this country.. Warning: Values > 2^53 may lose precision in JavaScript' + idps: + type: integer + format: int64 + description: 'Internally displaced persons within this country.. Warning: Values > 2^53 may lose precision in JavaScript' + stateless: + type: integer + format: int64 + description: 'Stateless persons associated with this country.. Warning: Values > 2^53 may lose precision in JavaScript' + totalDisplaced: + type: integer + format: int64 + description: 'Total displaced from this country.. Warning: Values > 2^53 may lose precision in JavaScript' + hostRefugees: + type: integer + format: int64 + description: 'Refugees hosted by this country.. Warning: Values > 2^53 may lose precision in JavaScript' + hostAsylumSeekers: + type: integer + format: int64 + description: 'Asylum seekers hosted by this country.. Warning: Values > 2^53 may lose precision in JavaScript' + hostTotal: + type: integer + format: int64 + description: 'Total persons hosted by this country.. Warning: Values > 2^53 may lose precision in JavaScript' + location: + $ref: '#/components/schemas/worldmonitor_core_v1_GeoCoordinates' + required: + - code + description: CountryDisplacement represents displacement metrics for a single country. + worldmonitor_displacement_v1_DisplacementFlow: + type: object + properties: + originCode: + type: string + minLength: 1 + description: ISO 3166-1 alpha-2 code of the origin country. + originName: + type: string + description: Origin country name. + asylumCode: + type: string + minLength: 1 + description: ISO 3166-1 alpha-2 code of the asylum country. + asylumName: + type: string + description: Asylum country name. + refugees: + type: integer + format: int64 + description: 'Number of refugees in this flow.. Warning: Values > 2^53 may lose precision in JavaScript' + originLocation: + $ref: '#/components/schemas/worldmonitor_core_v1_GeoCoordinates' + asylumLocation: + $ref: '#/components/schemas/worldmonitor_core_v1_GeoCoordinates' + required: + - originCode + - asylumCode + description: DisplacementFlow represents a refugee movement corridor between two countries. + worldmonitor_displacement_v1_GetPopulationExposureRequest: + type: object + properties: + mode: + type: string + description: 'Mode: "countries" (default) or "exposure".' + lat: + type: number + maximum: 90 + minimum: -90 + format: double + description: Latitude (required for exposure mode). + lon: + type: number + maximum: 180 + minimum: -180 + format: double + description: Longitude (required for exposure mode). + radius: + type: number + minimum: 0 + format: double + description: Radius in km (required for exposure mode, defaults to 50). + description: |- + GetPopulationExposureRequest supports two modes: + - countries mode (default): returns the priority countries list + - exposure mode: estimates population within a radius of a point + worldmonitor_displacement_v1_GetPopulationExposureResponse: + type: object + properties: + success: + type: boolean + description: True if the request succeeded. + countries: + type: array + items: + $ref: '#/components/schemas/worldmonitor_displacement_v1_CountryPopulationEntry' + exposure: + $ref: '#/components/schemas/worldmonitor_displacement_v1_ExposureResult' + description: GetPopulationExposureResponse returns either a countries list or an exposure estimate. + worldmonitor_displacement_v1_CountryPopulationEntry: + type: object + properties: + code: + type: string + description: ISO 3166-1 alpha-3 country code. + name: + type: string + description: Country name. + population: + type: integer + format: int64 + description: 'Total population.. Warning: Values > 2^53 may lose precision in JavaScript' + densityPerKm2: + type: integer + format: int32 + description: Population density per square kilometer. + description: CountryPopulationEntry represents a country with population data. + worldmonitor_displacement_v1_ExposureResult: + type: object + properties: + exposedPopulation: + type: integer + format: int64 + description: 'Estimated exposed population.. Warning: Values > 2^53 may lose precision in JavaScript' + exposureRadiusKm: + type: number + format: double + description: Radius used for the estimate in km. + nearestCountry: + type: string + description: ISO3 code of nearest priority country. + densityPerKm2: + type: integer + format: int32 + description: Population density used for the estimate. + description: ExposureResult contains the population exposure estimate. + worldmonitor_economic_v1_GetFredSeriesRequest: + type: object + properties: + seriesId: + type: string + minLength: 1 + description: FRED series ID (e.g., "GDP", "UNRATE", "CPIAUCSL"). + limit: + type: integer + format: int32 + description: Maximum number of observations to return. Defaults to 120. + required: + - seriesId + description: GetFredSeriesRequest specifies which FRED series to retrieve. + worldmonitor_economic_v1_GetFredSeriesResponse: + type: object + properties: + series: + $ref: '#/components/schemas/worldmonitor_economic_v1_FredSeries' + description: GetFredSeriesResponse contains the requested FRED series data. + worldmonitor_economic_v1_FredSeries: + type: object + properties: + seriesId: + type: string + minLength: 1 + description: Series identifier (e.g., "GDP", "UNRATE", "CPIAUCSL"). + title: + type: string + description: Series title. + units: + type: string + description: Unit of measurement. + frequency: + type: string + description: Data frequency (e.g., "Monthly", "Quarterly"). + observations: + type: array + items: + $ref: '#/components/schemas/worldmonitor_economic_v1_FredObservation' + required: + - seriesId + description: FredSeries represents a FRED time series with metadata. + worldmonitor_economic_v1_FredObservation: + type: object + properties: + date: + type: string + description: Observation date as YYYY-MM-DD string. + value: + type: number + format: double + description: Observation value. + description: FredObservation represents a single data point from a FRED economic series. + worldmonitor_economic_v1_ListWorldBankIndicatorsRequest: + type: object + properties: + indicatorCode: + type: string + minLength: 1 + description: World Bank indicator code (e.g., "NY.GDP.MKTP.CD"). + countryCode: + type: string + description: Optional country filter (ISO 3166-1 alpha-2). + year: + type: integer + format: int32 + description: Optional year filter. Defaults to latest available. + pageSize: + type: integer + format: int32 + description: Maximum items per page. + cursor: + type: string + description: Cursor for next page. + required: + - indicatorCode + description: ListWorldBankIndicatorsRequest specifies filters for retrieving World Bank data. + worldmonitor_economic_v1_ListWorldBankIndicatorsResponse: + type: object + properties: + data: + type: array + items: + $ref: '#/components/schemas/worldmonitor_economic_v1_WorldBankCountryData' + pagination: + $ref: '#/components/schemas/worldmonitor_core_v1_PaginationResponse' + description: ListWorldBankIndicatorsResponse contains World Bank indicator data. + worldmonitor_economic_v1_WorldBankCountryData: + type: object + properties: + countryCode: + type: string + minLength: 1 + description: ISO 3166-1 alpha-2 country code. + countryName: + type: string + description: Country name. + indicatorCode: + type: string + minLength: 1 + description: World Bank indicator code (e.g., "NY.GDP.MKTP.CD"). + indicatorName: + type: string + description: Indicator name. + year: + type: integer + format: int32 + description: Data year. + value: + type: number + format: double + description: Indicator value. + required: + - countryCode + - indicatorCode + description: WorldBankCountryData represents a World Bank indicator value for a country. + worldmonitor_economic_v1_GetEnergyPricesRequest: + type: object + properties: + commodities: + type: array + items: + type: string + description: Optional commodity filter. Empty returns all tracked commodities. + description: GetEnergyPricesRequest specifies which energy commodities to retrieve. + worldmonitor_economic_v1_GetEnergyPricesResponse: + type: object + properties: + prices: + type: array + items: + $ref: '#/components/schemas/worldmonitor_economic_v1_EnergyPrice' + description: GetEnergyPricesResponse contains energy price data. + worldmonitor_economic_v1_EnergyPrice: + type: object + properties: + commodity: + type: string + minLength: 1 + description: Energy commodity identifier. + name: + type: string + description: Human-readable name (e.g., "WTI Crude Oil", "Henry Hub Natural Gas"). + price: + type: number + format: double + description: Current price in USD. + unit: + type: string + description: Unit of measurement (e.g., "$/barrel", "$/MMBtu"). + change: + type: number + format: double + description: Percentage change from previous period. + priceAt: + type: integer + format: int64 + description: 'Price date, as Unix epoch milliseconds.. Warning: Values > 2^53 may lose precision in JavaScript' + required: + - commodity + description: EnergyPrice represents a current energy commodity price from EIA. + worldmonitor_economic_v1_GetMacroSignalsRequest: + type: object + description: GetMacroSignalsRequest requests the current macro signal dashboard. + worldmonitor_economic_v1_GetMacroSignalsResponse: + type: object + properties: + timestamp: + type: string + description: ISO 8601 timestamp of computation. + verdict: + type: string + description: 'Overall verdict: "BUY", "CASH", or "UNKNOWN".' + bullishCount: + type: integer + format: int32 + description: Number of bullish signals. + totalCount: + type: integer + format: int32 + description: Total number of evaluated signals (excluding UNKNOWN). + signals: + $ref: '#/components/schemas/worldmonitor_economic_v1_MacroSignals' + meta: + $ref: '#/components/schemas/worldmonitor_economic_v1_MacroMeta' + unavailable: + type: boolean + description: True when upstream data is unavailable (fallback result). + description: GetMacroSignalsResponse contains the full macro signal dashboard with 7 signals and verdict. + worldmonitor_economic_v1_MacroSignals: + type: object + properties: + liquidity: + $ref: '#/components/schemas/worldmonitor_economic_v1_LiquiditySignal' + flowStructure: + $ref: '#/components/schemas/worldmonitor_economic_v1_FlowStructureSignal' + macroRegime: + $ref: '#/components/schemas/worldmonitor_economic_v1_MacroRegimeSignal' + technicalTrend: + $ref: '#/components/schemas/worldmonitor_economic_v1_TechnicalTrendSignal' + hashRate: + $ref: '#/components/schemas/worldmonitor_economic_v1_HashRateSignal' + priceMomentum: + $ref: '#/components/schemas/worldmonitor_economic_v1_PriceMomentumSignal' + fearGreed: + $ref: '#/components/schemas/worldmonitor_economic_v1_FearGreedSignal' + description: MacroSignals contains all 7 individual signal computations. + worldmonitor_economic_v1_LiquiditySignal: + type: object + properties: + status: + type: string + description: '"SQUEEZE", "NORMAL", or "UNKNOWN".' + value: + type: number + format: double + description: JPY 30d ROC percentage, absent if unavailable. + sparkline: + type: array + items: + type: number + format: double + description: Last 30 JPY close prices. + description: LiquiditySignal tracks JPY 30d rate of change as a liquidity proxy. + worldmonitor_economic_v1_FlowStructureSignal: + type: object + properties: + status: + type: string + description: '"PASSIVE GAP", "ALIGNED", or "UNKNOWN".' + btcReturn5: + type: number + format: double + description: BTC 5-day return percentage. + qqqReturn5: + type: number + format: double + description: QQQ 5-day return percentage. + description: FlowStructureSignal compares BTC vs QQQ 5-day returns. + worldmonitor_economic_v1_MacroRegimeSignal: + type: object + properties: + status: + type: string + description: '"RISK-ON", "DEFENSIVE", or "UNKNOWN".' + qqqRoc20: + type: number + format: double + description: QQQ 20d ROC percentage. + xlpRoc20: + type: number + format: double + description: XLP 20d ROC percentage. + description: MacroRegimeSignal compares QQQ vs XLP 20-day rate of change. + worldmonitor_economic_v1_TechnicalTrendSignal: + type: object + properties: + status: + type: string + description: '"BULLISH", "BEARISH", "NEUTRAL", or "UNKNOWN".' + btcPrice: + type: number + format: double + description: Current BTC price. + sma50: + type: number + format: double + description: 50-day simple moving average. + sma200: + type: number + format: double + description: 200-day simple moving average. + vwap30d: + type: number + format: double + description: 30-day volume-weighted average price. + mayerMultiple: + type: number + format: double + description: Mayer multiple (BTC price / SMA200). + sparkline: + type: array + items: + type: number + format: double + description: Last 30 BTC close prices. + description: TechnicalTrendSignal evaluates BTC price vs moving averages and VWAP. + worldmonitor_economic_v1_HashRateSignal: + type: object + properties: + status: + type: string + description: '"GROWING", "DECLINING", "STABLE", or "UNKNOWN".' + change30d: + type: number + format: double + description: Hash rate change over 30 days as percentage. + description: HashRateSignal tracks Bitcoin hash rate momentum. + worldmonitor_economic_v1_PriceMomentumSignal: + type: object + properties: + status: + type: string + description: '"STRONG", "MODERATE", "WEAK", or "UNKNOWN".' + description: PriceMomentumSignal uses the Mayer Multiple (price/SMA200) as a market-adaptive signal. + worldmonitor_economic_v1_FearGreedSignal: + type: object + properties: + status: + type: string + description: Classification label (e.g., "Extreme Fear", "Greed"). + value: + type: integer + format: int32 + description: Current index value (0-100). + history: + type: array + items: + $ref: '#/components/schemas/worldmonitor_economic_v1_FearGreedHistoryEntry' + description: FearGreedSignal tracks the Crypto Fear & Greed index. + worldmonitor_economic_v1_FearGreedHistoryEntry: + type: object + properties: + value: + type: integer + maximum: 100 + minimum: 0 + format: int32 + description: Index value (0-100). + date: + type: string + description: Date string (YYYY-MM-DD). + description: FearGreedHistoryEntry is a single day's Fear & Greed index reading. + worldmonitor_economic_v1_MacroMeta: + type: object + properties: + qqqSparkline: + type: array + items: + type: number + format: double + description: Last 30 QQQ close prices for sparkline. + description: MacroMeta contains supplementary chart data. + worldmonitor_economic_v1_GetEnergyCapacityRequest: + type: object + properties: + energySources: + type: array + items: + type: string + description: |- + Energy source codes to query (e.g., "SUN", "WND", "COL"). + Empty returns all tracked sources (SUN, WND, COL). + years: + type: integer + format: int32 + description: Number of years of historical data. Default 20 if not set. + worldmonitor_economic_v1_GetEnergyCapacityResponse: + type: object + properties: + series: + type: array + items: + $ref: '#/components/schemas/worldmonitor_economic_v1_EnergyCapacitySeries' + worldmonitor_economic_v1_EnergyCapacitySeries: + type: object + properties: + energySource: + type: string + name: + type: string + data: + type: array + items: + $ref: '#/components/schemas/worldmonitor_economic_v1_EnergyCapacityYear' + worldmonitor_economic_v1_EnergyCapacityYear: + type: object + properties: + year: + type: integer + format: int32 + capacityMw: + type: number + format: double + worldmonitor_economic_v1_GetBisPolicyRatesRequest: + type: object + description: GetBisPolicyRatesRequest requests central bank policy rates. + worldmonitor_economic_v1_GetBisPolicyRatesResponse: + type: object + properties: + rates: + type: array + items: + $ref: '#/components/schemas/worldmonitor_economic_v1_BisPolicyRate' + description: GetBisPolicyRatesResponse contains BIS policy rate data. + worldmonitor_economic_v1_BisPolicyRate: + type: object + properties: + countryCode: + type: string + description: ISO 2-letter country code (US, GB, JP, etc.) + countryName: + type: string + description: Country or region name. + rate: + type: number + format: double + description: Current policy rate percentage. + previousRate: + type: number + format: double + description: Previous period rate percentage. + date: + type: string + description: Date as YYYY-MM. + centralBank: + type: string + description: Central bank name (e.g. "Federal Reserve"). + description: BisPolicyRate represents a central bank policy rate from BIS. + worldmonitor_economic_v1_GetBisExchangeRatesRequest: + type: object + description: GetBisExchangeRatesRequest requests effective exchange rates. + worldmonitor_economic_v1_GetBisExchangeRatesResponse: + type: object + properties: + rates: + type: array + items: + $ref: '#/components/schemas/worldmonitor_economic_v1_BisExchangeRate' + description: GetBisExchangeRatesResponse contains BIS effective exchange rate data. + worldmonitor_economic_v1_BisExchangeRate: + type: object + properties: + countryCode: + type: string + description: ISO 2-letter country code. + countryName: + type: string + description: Country or region name. + realEer: + type: number + format: double + description: Real effective exchange rate index. + nominalEer: + type: number + format: double + description: Nominal effective exchange rate index. + realChange: + type: number + format: double + description: Percentage change from previous period (real). + date: + type: string + description: Date as YYYY-MM. + description: BisExchangeRate represents effective exchange rate indices from BIS. + worldmonitor_economic_v1_GetBisCreditRequest: + type: object + description: GetBisCreditRequest requests credit-to-GDP ratio data. + worldmonitor_economic_v1_GetBisCreditResponse: + type: object + properties: + entries: + type: array + items: + $ref: '#/components/schemas/worldmonitor_economic_v1_BisCreditToGdp' + description: GetBisCreditResponse contains BIS credit-to-GDP data. + worldmonitor_economic_v1_BisCreditToGdp: + type: object + properties: + countryCode: + type: string + description: ISO 2-letter country code. + countryName: + type: string + description: Country or region name. + creditGdpRatio: + type: number + format: double + description: Total credit as percentage of GDP. + previousRatio: + type: number + format: double + description: Previous quarter ratio. + date: + type: string + description: Date as YYYY-QN. + description: BisCreditToGdp represents total credit as percentage of GDP from BIS. + worldmonitor_economic_v1_GetFredSeriesBatchRequest: + type: object + properties: + seriesIds: + type: array + items: + type: string + maxItems: 10 + minItems: 1 + description: FRED series IDs (e.g., "WALCL", "FEDFUNDS"). Max 10. + maxItems: 10 + minItems: 1 + limit: + type: integer + format: int32 + description: Maximum number of observations per series. Defaults to 120. + description: GetFredSeriesBatchRequest looks up multiple FRED series in a single call. + worldmonitor_economic_v1_GetFredSeriesBatchResponse: + type: object + properties: + results: + type: object + additionalProperties: + $ref: '#/components/schemas/worldmonitor_economic_v1_FredSeries' + description: Map of series_id -> FRED series for found series. + fetched: + type: integer + format: int32 + description: Number of series successfully fetched. + requested: + type: integer + format: int32 + description: Number of series requested. + description: GetFredSeriesBatchResponse contains the requested FRED series data. + worldmonitor_economic_v1_GetFredSeriesBatchResponse_ResultsEntry: + type: object + properties: + key: + type: string + value: + $ref: '#/components/schemas/worldmonitor_economic_v1_FredSeries' + worldmonitor_economic_v1_ListGroceryBasketPricesRequest: + type: object + worldmonitor_economic_v1_ListGroceryBasketPricesResponse: + type: object + properties: + countries: + type: array + items: + $ref: '#/components/schemas/worldmonitor_economic_v1_CountryBasket' + fetchedAt: + type: string + cheapestCountry: + type: string + mostExpensiveCountry: + type: string + upstreamUnavailable: + type: boolean + wowAvgPct: + type: number + format: double + wowAvailable: + type: boolean + prevFetchedAt: + type: string + worldmonitor_economic_v1_CountryBasket: + type: object + properties: + code: + type: string + name: + type: string + currency: + type: string + flag: + type: string + totalUsd: + type: number + format: double + fxRate: + type: number + format: double + items: + type: array + items: + $ref: '#/components/schemas/worldmonitor_economic_v1_GroceryItemPrice' + wowPct: + type: number + format: double + worldmonitor_economic_v1_GroceryItemPrice: + type: object + properties: + itemId: + type: string + itemName: + type: string + unit: + type: string + localPrice: + type: number + format: double + usdPrice: + type: number + format: double + currency: + type: string + sourceSite: + type: string + available: + type: boolean + worldmonitor_economic_v1_ListBigMacPricesRequest: + type: object + worldmonitor_economic_v1_ListBigMacPricesResponse: + type: object + properties: + countries: + type: array + items: + $ref: '#/components/schemas/worldmonitor_economic_v1_BigMacCountryPrice' + fetchedAt: + type: string + cheapestCountry: + type: string + mostExpensiveCountry: + type: string + wowAvgPct: + type: number + format: double + wowAvailable: + type: boolean + prevFetchedAt: + type: string + worldmonitor_economic_v1_BigMacCountryPrice: + type: object + properties: + code: + type: string + name: + type: string + currency: + type: string + flag: + type: string + localPrice: + type: number + format: double + usdPrice: + type: number + format: double + fxRate: + type: number + format: double + sourceSite: + type: string + available: + type: boolean + wowPct: + type: number + format: double + worldmonitor_economic_v1_GetNationalDebtRequest: + type: object + description: GetNationalDebtRequest requests national debt data for all countries. + worldmonitor_economic_v1_GetNationalDebtResponse: + type: object + properties: + entries: + type: array + items: + $ref: '#/components/schemas/worldmonitor_economic_v1_NationalDebtEntry' + seededAt: + type: string + description: ISO 8601 timestamp when seed data was written. + unavailable: + type: boolean + description: True when upstream data is unavailable (fallback result). + description: GetNationalDebtResponse wraps the full list of national debt entries. + worldmonitor_economic_v1_NationalDebtEntry: + type: object + properties: + iso3: + type: string + description: ISO3 country code (e.g. "USA"). + debtUsd: + type: number + format: double + description: Total debt in USD at baseline_ts. + gdpUsd: + type: number + format: double + description: GDP in USD (nominal, latest year). + debtToGdp: + type: number + format: double + description: Debt as % of GDP. + annualGrowth: + type: number + format: double + description: Year-over-year debt growth percent (2023->2024). + perSecondRate: + type: number + format: double + description: Deficit-derived accrual in USD per second. + perDayRate: + type: number + format: double + description: Deficit-derived accrual in USD per day. + baselineTs: + type: string + format: int64 + description: UTC ms timestamp anchoring the debt_usd figure (2024-01-01T00:00:00Z). + source: + type: string + description: Human-readable source string. + description: NationalDebtEntry holds debt data for a single country. + worldmonitor_economic_v1_ListFuelPricesRequest: + type: object + worldmonitor_economic_v1_ListFuelPricesResponse: + type: object + properties: + countries: + type: array + items: + $ref: '#/components/schemas/worldmonitor_economic_v1_FuelCountryPrice' + fetchedAt: + type: string + cheapestGasoline: + type: string + cheapestDiesel: + type: string + mostExpensiveGasoline: + type: string + mostExpensiveDiesel: + type: string + wowAvailable: + type: boolean + prevFetchedAt: + type: string + sourceCount: + type: integer + format: int32 + countryCount: + type: integer + format: int32 + worldmonitor_economic_v1_FuelCountryPrice: + type: object + properties: + code: + type: string + name: + type: string + currency: + type: string + flag: + type: string + gasoline: + $ref: '#/components/schemas/worldmonitor_economic_v1_FuelPrice' + diesel: + $ref: '#/components/schemas/worldmonitor_economic_v1_FuelPrice' + fxRate: + type: number + format: double + worldmonitor_economic_v1_FuelPrice: + type: object + properties: + usdPrice: + type: number + format: double + localPrice: + type: number + format: double + grade: + type: string + source: + type: string + available: + type: boolean + wowPct: + type: number + format: double + observedAt: + type: string + worldmonitor_economic_v1_GetBlsSeriesRequest: + type: object + properties: + seriesId: + type: string + description: BLS series ID (e.g. "CES0500000001", "CIU1010000000000A"). + limit: + type: integer + format: int32 + description: Maximum number of observations to return. Defaults to 60. + description: GetBlsSeriesRequest specifies which BLS series to retrieve. + worldmonitor_economic_v1_GetBlsSeriesResponse: + type: object + properties: + series: + $ref: '#/components/schemas/worldmonitor_economic_v1_BlsSeries' + description: GetBlsSeriesResponse contains the requested BLS series data. + worldmonitor_economic_v1_BlsSeries: + type: object + properties: + seriesId: + type: string + description: BLS series ID (e.g. "CES0500000001"). + title: + type: string + description: Human-readable series title. + units: + type: string + description: Unit of measure. + observations: + type: array + items: + $ref: '#/components/schemas/worldmonitor_economic_v1_BlsObservation' + description: BlsSeries is a BLS time series with metadata and observations. + worldmonitor_economic_v1_BlsObservation: + type: object + properties: + year: + type: string + description: Year of the observation. + period: + type: string + description: Period code (e.g. "M01" for January, "A01" for annual). + periodName: + type: string + description: Human-readable period name. + value: + type: string + description: Observed value. + description: BlsObservation is a single BLS data point. + worldmonitor_economic_v1_GetEconomicCalendarRequest: + type: object + properties: + fromDate: + type: string + toDate: + type: string + worldmonitor_economic_v1_GetEconomicCalendarResponse: + type: object + properties: + events: + type: array + items: + $ref: '#/components/schemas/worldmonitor_economic_v1_EconomicEvent' + fromDate: + type: string + toDate: + type: string + total: + type: integer + format: int32 + unavailable: + type: boolean + worldmonitor_economic_v1_EconomicEvent: + type: object + properties: + event: + type: string + country: + type: string + date: + type: string + impact: + type: string + actual: + type: string + estimate: + type: string + previous: + type: string + unit: + type: string + worldmonitor_economic_v1_GetCrudeInventoriesRequest: + type: object + description: GetCrudeInventoriesRequest is the request message for GetCrudeInventories. + worldmonitor_economic_v1_GetCrudeInventoriesResponse: + type: object + properties: + weeks: + type: array + items: + $ref: '#/components/schemas/worldmonitor_economic_v1_CrudeInventoryWeek' + latestPeriod: + type: string + description: Timestamp of the most recent EIA data point (ISO 8601). + description: GetCrudeInventoriesResponse contains the 8 most recent weeks of US crude oil inventory data. + worldmonitor_economic_v1_CrudeInventoryWeek: + type: object + properties: + period: + type: string + description: ISO week period (YYYY-MM-DD, Monday of the EIA report week). + stocksMb: + type: number + format: double + description: Total crude oil stocks in millions of barrels. + weeklyChangeMb: + type: number + format: double + description: |- + Week-over-week change in millions of barrels. Positive = build (bearish), negative = draw (bullish). + Absent for the oldest week when no prior week is available for comparison. + description: CrudeInventoryWeek represents one week of US crude oil stockpile data from EIA WCRSTUS1. + worldmonitor_economic_v1_GetNatGasStorageRequest: + type: object + description: GetNatGasStorageRequest is the request message for GetNatGasStorage. + worldmonitor_economic_v1_GetNatGasStorageResponse: + type: object + properties: + weeks: + type: array + items: + $ref: '#/components/schemas/worldmonitor_economic_v1_NatGasStorageWeek' + latestPeriod: + type: string + description: Timestamp of the most recent EIA data point (ISO 8601). + description: GetNatGasStorageResponse contains the 8 most recent weeks of US natural gas storage data. + worldmonitor_economic_v1_NatGasStorageWeek: + type: object + properties: + period: + type: string + description: ISO week period (YYYY-MM-DD, Monday of the EIA report week). + storBcf: + type: number + format: double + description: Working gas in underground storage, Lower-48 States, in Bcf. + weeklyChangeBcf: + type: number + format: double + description: |- + Week-over-week change in Bcf. Positive = build (bearish for gas prices), negative = draw (bullish). + Absent for the oldest week when no prior week is available for comparison. + description: NatGasStorageWeek represents one week of US natural gas working gas storage data from EIA. + worldmonitor_economic_v1_GetEcbFxRatesRequest: + type: object + description: GetEcbFxRatesRequest is empty; returns all tracked EUR pairs. + worldmonitor_economic_v1_GetEcbFxRatesResponse: + type: object + properties: + rates: + type: array + items: + $ref: '#/components/schemas/worldmonitor_economic_v1_EcbFxRate' + updatedAt: + type: string + description: ISO 8601 timestamp of the ECB publication. + seededAt: + type: string + format: int64 + description: Unix ms when the data was last seeded. + unavailable: + type: boolean + description: True when Redis key is missing or data is unavailable. + description: GetEcbFxRatesResponse contains the latest ECB reference rates. + worldmonitor_economic_v1_EcbFxRate: + type: object + properties: + pair: + type: string + description: Currency pair label, e.g. "EURUSD". + rate: + type: number + format: double + description: Exchange rate (units of quote currency per 1 EUR). + date: + type: string + description: Date of the observation in YYYY-MM-DD format. + change1d: + type: number + format: double + description: 1-day change in rate (absolute). + description: EcbFxRate is a single ECB official reference rate for a currency pair. + worldmonitor_economic_v1_GetEurostatCountryDataRequest: + type: object + description: GetEurostatCountryDataRequest requests Eurostat per-country economic data. + worldmonitor_economic_v1_GetEurostatCountryDataResponse: + type: object + properties: + countries: + type: object + additionalProperties: + $ref: '#/components/schemas/worldmonitor_economic_v1_EurostatCountryEntry' + description: Map of ISO2 country code to economic metrics (e.g. "DE", "FR", "IT"). + seededAt: + type: string + format: int64 + description: UTC ms timestamp when seed data was written. + unavailable: + type: boolean + description: True when upstream data is unavailable (fallback result). + description: GetEurostatCountryDataResponse contains per-country CPI, unemployment, and GDP growth. + worldmonitor_economic_v1_GetEurostatCountryDataResponse_CountriesEntry: + type: object + properties: + key: + type: string + value: + $ref: '#/components/schemas/worldmonitor_economic_v1_EurostatCountryEntry' + worldmonitor_economic_v1_EurostatCountryEntry: + type: object + properties: + cpi: + $ref: '#/components/schemas/worldmonitor_economic_v1_EurostatMetric' + unemployment: + $ref: '#/components/schemas/worldmonitor_economic_v1_EurostatMetric' + gdpGrowth: + $ref: '#/components/schemas/worldmonitor_economic_v1_EurostatMetric' + description: EurostatCountryEntry holds all available metrics for one EU country. + worldmonitor_economic_v1_EurostatMetric: + type: object + properties: + value: + type: number + format: double + description: Numeric value (e.g. 2.3 for 2.3%). + date: + type: string + description: Period string (e.g. "2024-01" for monthly, "2024-Q1" for quarterly). + unit: + type: string + description: Unit of measurement (e.g. "%"). + priorValue: + type: number + format: double + description: Prior period value for delta calculation (e.g. previous month/quarter). + hasPrior: + type: boolean + description: True when prior_value is present (proto3 can't distinguish 0 from absent). + description: EurostatMetric holds a single economic metric value for a country. + worldmonitor_economic_v1_GetEuGasStorageRequest: + type: object + description: GetEuGasStorageRequest is empty — returns latest EU aggregate snapshot. + worldmonitor_economic_v1_GetEuGasStorageResponse: + type: object + properties: + fillPct: + type: number + format: double + description: Current storage fill level as a percentage of working gas volume (0–100). + fillPctChange1d: + type: number + format: double + description: 1-day change in fill percentage (positive = injecting, negative = withdrawing). + gasDaysConsumption: + type: number + format: double + description: Approximate days of consumption remaining at average EU winter drawdown rate. + trend: + type: string + description: 'Current storage trend: "injecting", "withdrawing", or "stable".' + history: + type: array + items: + $ref: '#/components/schemas/worldmonitor_economic_v1_EuGasStorageHistoryEntry' + seededAt: + type: string + format: int64 + description: UTC ms timestamp when seed data was written. + updatedAt: + type: string + description: Calendar date of the most recent data point (YYYY-MM-DD). + unavailable: + type: boolean + description: True when upstream data is unavailable (fallback result). + description: GetEuGasStorageResponse contains the EU aggregate gas storage snapshot. + worldmonitor_economic_v1_EuGasStorageHistoryEntry: + type: object + properties: + date: + type: string + description: Calendar date (YYYY-MM-DD). + fillPct: + type: number + format: double + description: Storage fill level as a percentage of working gas volume capacity. + gasTwh: + type: number + format: double + description: Working gas volume in storage (TWh). + description: EuGasStorageHistoryEntry represents one day of EU aggregate gas storage data. + worldmonitor_economic_v1_GetEuYieldCurveRequest: + type: object + description: GetEuYieldCurveRequest fetches the ECB Euro Area AAA sovereign yield curve. + worldmonitor_economic_v1_GetEuYieldCurveResponse: + type: object + properties: + data: + $ref: '#/components/schemas/worldmonitor_economic_v1_EuYieldCurveData' + unavailable: + type: boolean + description: True if data is not yet available in cache. + description: GetEuYieldCurveResponse contains the latest ECB Euro Area AAA sovereign yield curve. + worldmonitor_economic_v1_EuYieldCurveData: + type: object + properties: + date: + type: string + description: Date of the observation (YYYY-MM or YYYY-MM-DD). + rates: + type: object + additionalProperties: + type: number + format: double + description: 'Spot rates by tenor. Keys: "1Y", "2Y", "5Y", "10Y", "20Y", "30Y".' + source: + type: string + description: Data source identifier (e.g. "ecb-aaa"). + updatedAt: + type: string + description: ISO 8601 timestamp when this was last seeded. + description: EuYieldCurveData holds a single observation of the ECB Euro Area AAA yield curve. + worldmonitor_economic_v1_EuYieldCurveData_RatesEntry: + type: object + properties: + key: + type: string + value: + type: number + format: double + worldmonitor_economic_v1_GetEuFsiRequest: + type: object + worldmonitor_economic_v1_GetEuFsiResponse: + type: object + properties: + latestValue: + type: number + format: double + latestDate: + type: string + label: + type: string + history: + type: array + items: + $ref: '#/components/schemas/worldmonitor_economic_v1_EuFsiObservation' + seededAt: + type: string + unavailable: + type: boolean + worldmonitor_economic_v1_EuFsiObservation: + type: object + properties: + date: + type: string + value: + type: number + format: double + worldmonitor_economic_v1_GetEconomicStressRequest: + type: object + worldmonitor_economic_v1_GetEconomicStressResponse: + type: object + properties: + compositeScore: + type: number + format: double + label: + type: string + components: + type: array + items: + $ref: '#/components/schemas/worldmonitor_economic_v1_EconomicStressComponent' + seededAt: + type: string + unavailable: + type: boolean + worldmonitor_economic_v1_EconomicStressComponent: + type: object + properties: + id: + type: string + label: + type: string + rawValue: + type: number + format: double + score: + type: number + format: double + weight: + type: number + format: double + missing: + type: boolean + worldmonitor_economic_v1_GetFaoFoodPriceIndexRequest: + type: object + worldmonitor_economic_v1_GetFaoFoodPriceIndexResponse: + type: object + properties: + points: + type: array + items: + $ref: '#/components/schemas/worldmonitor_economic_v1_FaoFoodPricePoint' + fetchedAt: + type: string + currentFfpi: + type: number + format: double + momPct: + type: number + format: double + yoyPct: + type: number + format: double + worldmonitor_economic_v1_FaoFoodPricePoint: + type: object + properties: + date: + type: string + ffpi: + type: number + format: double + meat: + type: number + format: double + dairy: + type: number + format: double + cereals: + type: number + format: double + oils: + type: number + format: double + sugar: + type: number + format: double + worldmonitor_economic_v1_GetOilStocksAnalysisRequest: + type: object + description: GetOilStocksAnalysisRequest is empty — returns the latest global analysis snapshot. + worldmonitor_economic_v1_GetOilStocksAnalysisResponse: + type: object + properties: + updatedAt: + type: string + description: UTC ISO-8601 timestamp when this analysis was written. + dataMonth: + type: string + description: 'Data month in YYYY-MM format (source: IEA monthly release).' + ieaMembers: + type: array + items: + $ref: '#/components/schemas/worldmonitor_economic_v1_OilStocksAnalysisMember' + belowObligation: + type: array + items: + type: string + description: ISO2 codes of countries currently below the 90-day obligation. + regionalSummary: + $ref: '#/components/schemas/worldmonitor_economic_v1_OilStocksRegionalSummary' + unavailable: + type: boolean + description: True when upstream seed data is unavailable (fallback result). + description: GetOilStocksAnalysisResponse contains the IEA oil stocks days-of-cover analysis. + worldmonitor_economic_v1_OilStocksAnalysisMember: + type: object + properties: + iso2: + type: string + description: ISO 3166-1 alpha-2 country code. + daysOfCover: + type: integer + format: int32 + description: Days of supply cover (absent when country is a net exporter or data anomaly). + netExporter: + type: boolean + description: True when the country is classified as a net exporter by IEA. + belowObligation: + type: boolean + description: True when days_of_cover < 90 (IEA 90-day obligation threshold). + obligationMet: + type: boolean + description: True when the 90-day obligation is met (net exporters always true). + rank: + type: integer + format: int32 + description: Rank within the IEA member ranking (1-indexed, net exporters ranked last). + vsObligation: + type: integer + format: int32 + description: days_of_cover - 90; absent for net exporters. + description: OilStocksAnalysisMember holds days-of-cover data and obligation status for one IEA member country. + worldmonitor_economic_v1_OilStocksRegionalSummary: + type: object + properties: + europe: + $ref: '#/components/schemas/worldmonitor_economic_v1_OilStocksRegionalSummaryEurope' + asiaPacific: + $ref: '#/components/schemas/worldmonitor_economic_v1_OilStocksRegionalSummaryAsiaPacific' + northAmerica: + $ref: '#/components/schemas/worldmonitor_economic_v1_OilStocksRegionalSummaryNorthAmerica' + description: OilStocksRegionalSummary holds regional aggregates for the three IEA regions. + worldmonitor_economic_v1_OilStocksRegionalSummaryEurope: + type: object + properties: + avgDays: + type: integer + format: int32 + description: Mean days of cover across non-net-exporter European members. + minDays: + type: integer + format: int32 + description: Minimum days of cover across non-net-exporter European members. + countBelowObligation: + type: integer + format: int32 + description: Count of European members below the 90-day obligation. + description: OilStocksRegionalSummaryEurope aggregates days-of-cover for European IEA members. + worldmonitor_economic_v1_OilStocksRegionalSummaryAsiaPacific: + type: object + properties: + avgDays: + type: integer + format: int32 + description: Mean days of cover across Asia-Pacific members (AU, JP, KR, NZ). + minDays: + type: integer + format: int32 + description: Minimum days of cover across Asia-Pacific members. + countBelowObligation: + type: integer + format: int32 + description: Count of Asia-Pacific members below the 90-day obligation. + description: OilStocksRegionalSummaryAsiaPacific aggregates days-of-cover for Asia-Pacific IEA members. + worldmonitor_economic_v1_OilStocksRegionalSummaryNorthAmerica: + type: object + properties: + netExporters: + type: integer + format: int32 + description: Count of net exporters in North America (CA, MX, US). + avgDays: + type: integer + format: int32 + description: Average days of cover for non-exporter North American members (if any). + description: OilStocksRegionalSummaryNorthAmerica aggregates data for North American IEA members. + worldmonitor_economic_v1_GetOilInventoriesRequest: + type: object + worldmonitor_economic_v1_GetOilInventoriesResponse: + type: object + properties: + crudeWeeks: + type: array + items: + $ref: '#/components/schemas/worldmonitor_economic_v1_CrudeInventoryWeekRef' + spr: + $ref: '#/components/schemas/worldmonitor_economic_v1_OilInventoriesSprSnapshot' + natGasWeeks: + type: array + items: + $ref: '#/components/schemas/worldmonitor_economic_v1_NatGasWeekRef' + euGas: + $ref: '#/components/schemas/worldmonitor_economic_v1_OilInventoriesEuGas' + ieaStocks: + $ref: '#/components/schemas/worldmonitor_economic_v1_OilInventoriesIeaStocks' + refinery: + $ref: '#/components/schemas/worldmonitor_economic_v1_OilInventoriesRefinery' + updatedAt: + type: string + worldmonitor_economic_v1_CrudeInventoryWeekRef: + type: object + properties: + period: + type: string + stocksMb: + type: number + format: double + weeklyChangeMb: + type: number + format: double + worldmonitor_economic_v1_OilInventoriesSprSnapshot: + type: object + properties: + latestStocksMb: + type: number + format: double + changeWow: + type: number + format: double + weeks: + type: array + items: + $ref: '#/components/schemas/worldmonitor_economic_v1_OilInventoriesSprWeek' + worldmonitor_economic_v1_OilInventoriesSprWeek: + type: object + properties: + period: + type: string + stocksMb: + type: number + format: double + worldmonitor_economic_v1_NatGasWeekRef: + type: object + properties: + period: + type: string + storBcf: + type: number + format: double + weeklyChangeBcf: + type: number + format: double + worldmonitor_economic_v1_OilInventoriesEuGas: + type: object + properties: + fillPct: + type: number + format: double + fillPctChange1d: + type: number + format: double + trend: + type: string + history: + type: array + items: + $ref: '#/components/schemas/worldmonitor_economic_v1_OilInventoriesEuGasDay' + worldmonitor_economic_v1_OilInventoriesEuGasDay: + type: object + properties: + date: + type: string + fillPct: + type: number + format: double + worldmonitor_economic_v1_OilInventoriesIeaStocks: + type: object + properties: + dataMonth: + type: string + members: + type: array + items: + $ref: '#/components/schemas/worldmonitor_economic_v1_OilInventoriesIeaMember' + europe: + $ref: '#/components/schemas/worldmonitor_economic_v1_OilInventoriesRegionStats' + asiaPacific: + $ref: '#/components/schemas/worldmonitor_economic_v1_OilInventoriesRegionStats' + northAmerica: + $ref: '#/components/schemas/worldmonitor_economic_v1_OilInventoriesRegionStats' + worldmonitor_economic_v1_OilInventoriesIeaMember: + type: object + properties: + iso2: + type: string + daysOfCover: + type: number + format: double + netExporter: + type: boolean + belowObligation: + type: boolean + worldmonitor_economic_v1_OilInventoriesRegionStats: + type: object + properties: + avgDays: + type: number + format: double + minDays: + type: number + format: double + countBelowObligation: + type: integer + format: int32 + worldmonitor_economic_v1_OilInventoriesRefinery: + type: object + properties: + inputsMbpd: + type: number + format: double + period: + type: string + worldmonitor_economic_v1_GetEnergyCrisisPoliciesRequest: + type: object + properties: + countryCode: + type: string + description: Optional ISO-2 country code filter. + category: + type: string + description: 'Optional category filter: "conservation" or "consumer_support".' + description: GetEnergyCrisisPoliciesRequest allows optional filtering by country or category. + worldmonitor_economic_v1_GetEnergyCrisisPoliciesResponse: + type: object + properties: + source: + type: string + description: Source attribution. + sourceUrl: + type: string + description: Source URL. + context: + type: string + description: Context description. + policies: + type: array + items: + $ref: '#/components/schemas/worldmonitor_economic_v1_EnergyCrisisPolicy' + updatedAt: + type: string + description: UTC ISO-8601 timestamp when this data was last updated. + unavailable: + type: boolean + description: True when upstream seed data is unavailable (fallback result). + description: GetEnergyCrisisPoliciesResponse contains energy crisis policy data from the IEA tracker. + worldmonitor_economic_v1_EnergyCrisisPolicy: + type: object + properties: + country: + type: string + description: Country name. + countryCode: + type: string + description: ISO 3166-1 alpha-2 country code. + category: + type: string + description: 'Policy category: "conservation" or "consumer_support".' + sector: + type: string + description: 'Affected sector: transport, buildings, industry, electricity, agriculture, general.' + measure: + type: string + description: Description of the policy measure. + dateAnnounced: + type: string + description: Date announced in ISO-8601 (YYYY-MM-DD) format. + status: + type: string + description: 'Status of the policy: active, planned, or ended.' + description: EnergyCrisisPolicy represents a single government policy response to the 2026 energy crisis. + worldmonitor_forecast_v1_GetForecastsRequest: + type: object + properties: + domain: + type: string + region: + type: string + worldmonitor_forecast_v1_GetForecastsResponse: + type: object + properties: + forecasts: + type: array + items: + $ref: '#/components/schemas/worldmonitor_forecast_v1_Forecast' + generatedAt: + type: integer + format: int64 + description: 'Warning: Values > 2^53 may lose precision in JavaScript' + worldmonitor_forecast_v1_Forecast: + type: object + properties: + id: + type: string + domain: + type: string + region: + type: string + title: + type: string + scenario: + type: string + feedSummary: + type: string + probability: + type: number + format: double + confidence: + type: number + format: double + timeHorizon: + type: string + signals: + type: array + items: + $ref: '#/components/schemas/worldmonitor_forecast_v1_ForecastSignal' + cascades: + type: array + items: + $ref: '#/components/schemas/worldmonitor_forecast_v1_CascadeEffect' + trend: + type: string + priorProbability: + type: number + format: double + calibration: + $ref: '#/components/schemas/worldmonitor_forecast_v1_CalibrationInfo' + createdAt: + type: integer + format: int64 + description: 'Warning: Values > 2^53 may lose precision in JavaScript' + updatedAt: + type: integer + format: int64 + description: 'Warning: Values > 2^53 may lose precision in JavaScript' + perspectives: + $ref: '#/components/schemas/worldmonitor_forecast_v1_Perspectives' + projections: + $ref: '#/components/schemas/worldmonitor_forecast_v1_Projections' + caseFile: + $ref: '#/components/schemas/worldmonitor_forecast_v1_ForecastCase' + simulationAdjustment: + type: number + format: double + description: |- + Simulation-scoring fields — populated when the deep forecast simulation pipeline + has run for this forecast's state and produced a non-zero adjustment. + simulation_adjustment: raw score delta (+0.08–+0.12 positive, -0.12/-0.15 negative). + sim_path_confidence: clamped [0,1] confidence of the matched sim top-path; 0 = not set. + demoted_by_simulation: true when a negative adjustment crossed the 0.50 acceptance threshold. + simPathConfidence: + type: number + format: double + demotedBySimulation: + type: boolean + worldmonitor_forecast_v1_ForecastSignal: + type: object + properties: + type: + type: string + value: + type: string + weight: + type: number + format: double + worldmonitor_forecast_v1_CascadeEffect: + type: object + properties: + domain: + type: string + effect: + type: string + probability: + type: number + format: double + worldmonitor_forecast_v1_CalibrationInfo: + type: object + properties: + marketTitle: + type: string + marketPrice: + type: number + format: double + drift: + type: number + format: double + source: + type: string + worldmonitor_forecast_v1_Perspectives: + type: object + properties: + strategic: + type: string + regional: + type: string + contrarian: + type: string + worldmonitor_forecast_v1_Projections: + type: object + properties: + h24: + type: number + format: double + d7: + type: number + format: double + d30: + type: number + format: double + worldmonitor_forecast_v1_ForecastCase: + type: object + properties: + supportingEvidence: + type: array + items: + $ref: '#/components/schemas/worldmonitor_forecast_v1_ForecastCaseEvidence' + counterEvidence: + type: array + items: + $ref: '#/components/schemas/worldmonitor_forecast_v1_ForecastCaseEvidence' + triggers: + type: array + items: + type: string + actorLenses: + type: array + items: + type: string + baseCase: + type: string + escalatoryCase: + type: string + contrarianCase: + type: string + changeSummary: + type: string + changeItems: + type: array + items: + type: string + actors: + type: array + items: + $ref: '#/components/schemas/worldmonitor_forecast_v1_ForecastActor' + worldState: + $ref: '#/components/schemas/worldmonitor_forecast_v1_ForecastWorldState' + branches: + type: array + items: + $ref: '#/components/schemas/worldmonitor_forecast_v1_ForecastBranch' + worldmonitor_forecast_v1_ForecastCaseEvidence: + type: object + properties: + type: + type: string + summary: + type: string + weight: + type: number + format: double + worldmonitor_forecast_v1_ForecastActor: + type: object + properties: + id: + type: string + name: + type: string + category: + type: string + role: + type: string + objectives: + type: array + items: + type: string + constraints: + type: array + items: + type: string + likelyActions: + type: array + items: + type: string + influenceScore: + type: number + format: double + worldmonitor_forecast_v1_ForecastWorldState: + type: object + properties: + summary: + type: string + activePressures: + type: array + items: + type: string + stabilizers: + type: array + items: + type: string + keyUnknowns: + type: array + items: + type: string + worldmonitor_forecast_v1_ForecastBranch: + type: object + properties: + kind: + type: string + title: + type: string + summary: + type: string + outcome: + type: string + projectedProbability: + type: number + format: double + rounds: + type: array + items: + $ref: '#/components/schemas/worldmonitor_forecast_v1_ForecastBranchRound' + worldmonitor_forecast_v1_ForecastBranchRound: + type: object + properties: + round: + type: integer + format: int32 + focus: + type: string + developments: + type: array + items: + type: string + actorMoves: + type: array + items: + type: string + probabilityShift: + type: number + format: double + worldmonitor_forecast_v1_GetSimulationPackageRequest: + type: object + properties: + runId: + type: string + description: Currently ignored; always returns the latest package. Reserved for Phase 3 per-run lookup. + worldmonitor_forecast_v1_GetSimulationPackageResponse: + type: object + properties: + found: + type: boolean + runId: + type: string + pkgKey: + type: string + schemaVersion: + type: string + theaterCount: + type: integer + format: int32 + generatedAt: + type: integer + format: int64 + description: 'Unix timestamp in milliseconds (from Date.now()). Warning: Values > 2^53 may lose precision in JavaScript.. Warning: Values > 2^53 may lose precision in JavaScript' + note: + type: string + description: |- + Populated when req.runId was supplied but does not match the returned package's runId. + Indicates that per-run filtering is not yet active and the latest package was returned instead. + error: + type: string + description: |- + Populated when the Redis lookup failed. Distinguish from healthy not-found (found=false, error=""). + Value: "redis_unavailable" on Redis errors. + worldmonitor_forecast_v1_GetSimulationOutcomeRequest: + type: object + properties: + runId: + type: string + description: |- + IMPORTANT: Currently a no-op. Always returns the latest available outcome regardless of runId. + Per-run lookup is reserved for Phase 3. Check the response 'note' field when runId is supplied + and you need to detect a mismatch between requested and returned run. + worldmonitor_forecast_v1_GetSimulationOutcomeResponse: + type: object + properties: + found: + type: boolean + runId: + type: string + outcomeKey: + type: string + schemaVersion: + type: string + theaterCount: + type: integer + format: int32 + generatedAt: + type: integer + format: int64 + description: 'Unix timestamp in milliseconds (from Date.now()). Warning: Values > 2^53 may lose precision in JavaScript.. Warning: Values > 2^53 may lose precision in JavaScript' + note: + type: string + description: |- + Populated when req.runId was supplied but does not match the returned outcome's runId. + Indicates that per-run filtering is not yet active and the latest outcome was returned instead. + error: + type: string + description: |- + Populated when the Redis lookup failed. Distinguish from healthy not-found (found=false, error=""). + Value: "redis_unavailable" on Redis errors. + theaterSummariesJson: + type: string + description: |- + JSON-encoded array of theater summaries for the UI (populated when found=true). + Shape: Array<{ theaterId, theaterLabel, stateKind, topPaths: [{label, summary, confidence, keyActors}], dominantReactions, stabilizers, invalidators }> + Parse with JSON.parse() on the client. Empty string when found=false. + worldmonitor_giving_v1_GetGivingSummaryRequest: + type: object + properties: + platformLimit: + type: integer + format: int32 + description: Number of platforms to include (0 = all). + categoryLimit: + type: integer + format: int32 + description: Number of category breakdowns to include (0 = all). + description: GetGivingSummaryRequest specifies parameters for retrieving the global giving summary. + worldmonitor_giving_v1_GetGivingSummaryResponse: + type: object + properties: + summary: + $ref: '#/components/schemas/worldmonitor_giving_v1_GivingSummary' + description: GetGivingSummaryResponse contains the global giving activity summary. + worldmonitor_giving_v1_GivingSummary: + type: object + properties: + generatedAt: + type: string + description: Timestamp of the summary generation (ISO 8601). + activityIndex: + type: number + format: double + description: Global giving activity index (0-100 composite score). + trend: + type: string + description: Index trend direction. + estimatedDailyFlowUsd: + type: number + format: double + description: Estimated daily global giving flow in USD (directional, not precise). + platforms: + type: array + items: + $ref: '#/components/schemas/worldmonitor_giving_v1_PlatformGiving' + categories: + type: array + items: + $ref: '#/components/schemas/worldmonitor_giving_v1_CategoryBreakdown' + crypto: + $ref: '#/components/schemas/worldmonitor_giving_v1_CryptoGivingSummary' + institutional: + $ref: '#/components/schemas/worldmonitor_giving_v1_InstitutionalGiving' + description: GivingSummary represents a global overview of personal giving activity across platforms. + worldmonitor_giving_v1_PlatformGiving: + type: object + properties: + platform: + type: string + minLength: 1 + description: Platform name (e.g., "GoFundMe", "GlobalGiving", "JustGiving"). + dailyVolumeUsd: + type: number + format: double + description: Estimated daily donation volume in USD. + activeCampaignsSampled: + type: integer + format: int32 + description: Number of active campaigns being sampled. + newCampaigns24h: + type: integer + format: int32 + description: New campaigns created in the last 24 hours. + donationVelocity: + type: number + format: double + description: Average donation velocity (donations per hour). + dataFreshness: + type: string + description: 'Data freshness: "live", "daily", "weekly", "annual".' + lastUpdated: + type: string + description: Last data update timestamp (ISO 8601). + required: + - platform + description: PlatformGiving represents aggregated giving data from a single crowdfunding platform. + worldmonitor_giving_v1_CategoryBreakdown: + type: object + properties: + category: + type: string + description: Category name (e.g., "Medical", "Disaster Relief", "Education"). + share: + type: number + format: double + description: Share of total giving activity (0-1). + change24h: + type: number + format: double + description: 24-hour change in share percentage points. + activeCampaigns: + type: integer + format: int32 + description: Number of active campaigns in this category. + trending: + type: boolean + description: Trending indicator. + description: CategoryBreakdown represents giving activity within a specific cause category. + worldmonitor_giving_v1_CryptoGivingSummary: + type: object + properties: + dailyInflowUsd: + type: number + format: double + description: Total 24h inflow to tracked charity wallets (USD equivalent). + trackedWallets: + type: integer + format: int32 + description: Number of tracked charity wallets. + transactions24h: + type: integer + format: int32 + description: Number of transactions in the last 24 hours. + topReceivers: + type: array + items: + type: string + description: Top receiving platforms / DAOs. + pctOfTotal: + type: number + format: double + description: Percentage of total giving that is on-chain. + description: CryptoGivingSummary tracks transparent on-chain philanthropy. + worldmonitor_giving_v1_InstitutionalGiving: + type: object + properties: + oecdOdaAnnualUsdBn: + type: number + format: double + description: Latest OECD ODA total (annual, USD billions). + oecdDataYear: + type: integer + format: int32 + description: Year of latest OECD data. + cafWorldGivingIndex: + type: number + format: double + description: CAF World Giving Index score (latest). + cafDataYear: + type: integer + format: int32 + description: Year of latest CAF data. + candidGrantsTracked: + type: integer + format: int32 + description: Number of foundation grants tracked (Candid). + dataLag: + type: string + description: Data lag description (e.g., "Quarterly", "Annual"). + description: InstitutionalGiving tracks large-scale structured philanthropy and ODA. + worldmonitor_health_v1_ListDiseaseOutbreaksRequest: + type: object + worldmonitor_health_v1_ListDiseaseOutbreaksResponse: + type: object + properties: + outbreaks: + type: array + items: + $ref: '#/components/schemas/worldmonitor_health_v1_DiseaseOutbreakItem' + fetchedAt: + type: integer + format: int64 + description: 'Warning: Values > 2^53 may lose precision in JavaScript' + worldmonitor_health_v1_DiseaseOutbreakItem: + type: object + properties: + id: + type: string + description: Unique identifier (URL-derived). + disease: + type: string + description: Disease or outbreak name. + location: + type: string + description: Affected country or region. + countryCode: + type: string + description: ISO2 country code when known. + alertLevel: + type: string + description: 'Alert level: "watch" | "warning" | "alert".' + summary: + type: string + description: Short description from the source. + sourceUrl: + type: string + description: Source URL. + publishedAt: + type: integer + format: int64 + description: 'Unix epoch milliseconds when published.. Warning: Values > 2^53 may lose precision in JavaScript' + sourceName: + type: string + description: Source name (e.g., "WHO", "ProMED", "HealthMap"). + lat: + type: number + format: double + description: Precise latitude from source (overrides country centroid on map when non-zero). + lng: + type: number + format: double + description: Precise longitude from source (overrides country centroid on map when non-zero). + cases: + type: integer + format: int32 + description: Case count if reported by source (0 = unknown). + description: DiseaseOutbreakItem represents a single disease outbreak event. + worldmonitor_health_v1_ListAirQualityAlertsRequest: + type: object + worldmonitor_health_v1_ListAirQualityAlertsResponse: + type: object + properties: + alerts: + type: array + items: + $ref: '#/components/schemas/worldmonitor_health_v1_AirQualityAlert' + fetchedAt: + type: integer + format: int64 + description: 'Warning: Values > 2^53 may lose precision in JavaScript' + worldmonitor_health_v1_AirQualityAlert: + type: object + properties: + city: + type: string + countryCode: + type: string + lat: + type: number + format: double + lng: + type: number + format: double + pm25: + type: number + format: double + aqi: + type: integer + format: int32 + riskLevel: + type: string + pollutant: + type: string + measuredAt: + type: integer + format: int64 + description: 'Warning: Values > 2^53 may lose precision in JavaScript' + source: + type: string + worldmonitor_imagery_v1_SearchImageryRequest: + type: object + properties: + bbox: + type: string + datetime: + type: string + source: + type: string + limit: + type: integer + format: int32 + worldmonitor_imagery_v1_SearchImageryResponse: + type: object + properties: + scenes: + type: array + items: + $ref: '#/components/schemas/worldmonitor_imagery_v1_ImageryScene' + totalResults: + type: integer + format: int32 + cacheHit: + type: boolean + worldmonitor_imagery_v1_ImageryScene: + type: object + properties: + id: + type: string + satellite: + type: string + datetime: + type: string + resolutionM: + type: number + format: double + mode: + type: string + geometryGeojson: + type: string + previewUrl: + type: string + assetUrl: + type: string + worldmonitor_infrastructure_v1_ListInternetOutagesRequest: + type: object + properties: + start: + type: integer + format: int64 + description: 'Start of time range (inclusive), Unix epoch milliseconds.. Warning: Values > 2^53 may lose precision in JavaScript' + end: + type: integer + format: int64 + description: 'End of time range (inclusive), Unix epoch milliseconds.. Warning: Values > 2^53 may lose precision in JavaScript' + pageSize: + type: integer + format: int32 + description: Maximum items per page. + cursor: + type: string + description: Cursor for next page. + country: + type: string + description: Optional country filter (ISO 3166-1 alpha-2). + description: ListInternetOutagesRequest specifies filters for retrieving internet outages. + worldmonitor_infrastructure_v1_ListInternetOutagesResponse: + type: object + properties: + outages: + type: array + items: + $ref: '#/components/schemas/worldmonitor_infrastructure_v1_InternetOutage' + pagination: + $ref: '#/components/schemas/worldmonitor_core_v1_PaginationResponse' + description: ListInternetOutagesResponse contains internet outages matching the request. + worldmonitor_infrastructure_v1_InternetOutage: + type: object + properties: + id: + type: string + minLength: 1 + description: Unique outage identifier. + title: + type: string + description: Outage title. + link: + type: string + description: URL to the outage report. + description: + type: string + description: Outage description. + detectedAt: + type: integer + format: int64 + description: 'Detection time, as Unix epoch milliseconds.. Warning: Values > 2^53 may lose precision in JavaScript' + country: + type: string + description: Affected country (ISO 3166-1 alpha-2). + region: + type: string + description: Affected region within the country. + location: + $ref: '#/components/schemas/worldmonitor_core_v1_GeoCoordinates' + severity: + type: string + enum: + - OUTAGE_SEVERITY_UNSPECIFIED + - OUTAGE_SEVERITY_PARTIAL + - OUTAGE_SEVERITY_MAJOR + - OUTAGE_SEVERITY_TOTAL + description: |- + OutageSeverity represents the severity of an internet outage. + Maps to TS union: 'partial' | 'major' | 'total'. + categories: + type: array + items: + type: string + description: Affected infrastructure categories. + cause: + type: string + description: Root cause, if determined. + outageType: + type: string + description: Outage type classification. + endedAt: + type: integer + format: int64 + description: 'End time of the outage, as Unix epoch milliseconds. Zero if ongoing.. Warning: Values > 2^53 may lose precision in JavaScript' + required: + - id + description: InternetOutage represents a detected internet outage event from Cloudflare Radar. + worldmonitor_infrastructure_v1_ListServiceStatusesRequest: + type: object + properties: + status: + type: string + enum: + - SERVICE_OPERATIONAL_STATUS_UNSPECIFIED + - SERVICE_OPERATIONAL_STATUS_OPERATIONAL + - SERVICE_OPERATIONAL_STATUS_DEGRADED + - SERVICE_OPERATIONAL_STATUS_PARTIAL_OUTAGE + - SERVICE_OPERATIONAL_STATUS_MAJOR_OUTAGE + - SERVICE_OPERATIONAL_STATUS_MAINTENANCE + description: ServiceOperationalStatus represents the current status of a service. + description: ListServiceStatusesRequest specifies filters for retrieving service statuses. + worldmonitor_infrastructure_v1_ListServiceStatusesResponse: + type: object + properties: + statuses: + type: array + items: + $ref: '#/components/schemas/worldmonitor_infrastructure_v1_ServiceStatus' + description: ListServiceStatusesResponse contains service operational statuses. + worldmonitor_infrastructure_v1_ServiceStatus: + type: object + properties: + id: + type: string + description: Service identifier. + name: + type: string + description: Service display name. + status: + type: string + enum: + - SERVICE_OPERATIONAL_STATUS_UNSPECIFIED + - SERVICE_OPERATIONAL_STATUS_OPERATIONAL + - SERVICE_OPERATIONAL_STATUS_DEGRADED + - SERVICE_OPERATIONAL_STATUS_PARTIAL_OUTAGE + - SERVICE_OPERATIONAL_STATUS_MAJOR_OUTAGE + - SERVICE_OPERATIONAL_STATUS_MAINTENANCE + description: ServiceOperationalStatus represents the current status of a service. + description: + type: string + description: Status description. + url: + type: string + description: Service URL or homepage. + checkedAt: + type: integer + format: int64 + description: 'Last status check time, as Unix epoch milliseconds.. Warning: Values > 2^53 may lose precision in JavaScript' + latencyMs: + type: integer + format: int32 + description: Response latency in milliseconds. + description: ServiceStatus represents the operational status of a monitored external service. + worldmonitor_infrastructure_v1_GetTemporalBaselineRequest: + type: object + properties: + type: + type: string + minLength: 1 + description: 'Activity type: "military_flights", "vessels", "protests", "news", "ais_gaps", "satellite_fires".' + region: + type: string + description: Geographic region key, defaults to "global". + count: + type: number + format: double + description: Current observed count to compare against baseline. + required: + - type + description: GetTemporalBaselineRequest checks current activity count against stored baseline. + worldmonitor_infrastructure_v1_GetTemporalBaselineResponse: + type: object + properties: + anomaly: + $ref: '#/components/schemas/worldmonitor_infrastructure_v1_BaselineAnomaly' + baseline: + $ref: '#/components/schemas/worldmonitor_infrastructure_v1_BaselineStats' + learning: + type: boolean + description: True if insufficient samples have been collected. + sampleCount: + type: integer + format: int32 + description: Current number of samples stored. + samplesNeeded: + type: integer + format: int32 + description: Minimum samples required before anomaly detection activates. + error: + type: string + description: Error message if request was invalid. + description: GetTemporalBaselineResponse returns anomaly info or learning status. + worldmonitor_infrastructure_v1_BaselineAnomaly: + type: object + properties: + zScore: + type: number + format: double + description: Number of standard deviations from the mean. + severity: + type: string + description: 'Severity label: "critical", "high", "medium", "normal".' + multiplier: + type: number + format: double + description: Ratio of current count to baseline mean. + description: BaselineAnomaly describes a detected deviation from historical baseline. + worldmonitor_infrastructure_v1_BaselineStats: + type: object + properties: + mean: + type: number + format: double + description: Running mean of observed counts. + stdDev: + type: number + format: double + description: Standard deviation derived from Welford's M2. + sampleCount: + type: integer + format: int32 + description: Number of samples incorporated so far. + description: BaselineStats contains the running statistics for a baseline key. + worldmonitor_infrastructure_v1_GetIpGeoRequest: + type: object + description: GetIpGeoRequest defined for future parameters (e.g., specific IP). + worldmonitor_infrastructure_v1_GetIpGeoResponse: + type: object + properties: + country: + type: string + description: ISO 3166-1 alpha-2 country code. + region: + type: string + description: Region or city (if available). + city: + type: string + description: GetIpGeoResponse contains geographic information derived from the request IP. + worldmonitor_infrastructure_v1_ReverseGeocodeRequest: + type: object + properties: + lat: + type: number + format: double + lon: + type: number + format: double + description: ReverseGeocodeRequest parameters for coordinate-to-address lookups. + worldmonitor_infrastructure_v1_ReverseGeocodeResponse: + type: object + properties: + country: + type: string + description: Human-readable country name. + code: + type: string + description: ISO country code. + displayName: + type: string + description: Full display name/address. + error: + type: string + description: Optional error message. + description: ReverseGeocodeResponse containing the resolved location details. + worldmonitor_infrastructure_v1_GetBootstrapDataRequest: + type: object + properties: + tier: + type: string + description: Predefined tiers or specific keys. + keys: + type: array + items: + type: string + description: GetBootstrapDataRequest parameters for multi-key fetching. + worldmonitor_infrastructure_v1_GetBootstrapDataResponse: + type: object + properties: + data: + type: object + additionalProperties: + type: string + description: Map of keys to JSON-encoded data strings. + missing: + type: array + items: + type: string + description: List of keys that were not found in cache. + description: GetBootstrapDataResponse containing pooled data objects. + worldmonitor_infrastructure_v1_GetBootstrapDataResponse_DataEntry: + type: object + properties: + key: + type: string + value: + type: string + worldmonitor_infrastructure_v1_RecordBaselineSnapshotRequest: + type: object + properties: + updates: + type: array + items: + $ref: '#/components/schemas/worldmonitor_infrastructure_v1_BaselineUpdate' + description: RecordBaselineSnapshotRequest batch-updates baselines using Welford's online algorithm. + worldmonitor_infrastructure_v1_BaselineUpdate: + type: object + properties: + type: + type: string + minLength: 1 + description: Activity type key. + region: + type: string + description: Geographic region key, defaults to "global". + count: + type: number + format: double + description: Observed count value. + required: + - type + description: BaselineUpdate is a single metric observation to incorporate into the running baseline. + worldmonitor_infrastructure_v1_RecordBaselineSnapshotResponse: + type: object + properties: + updated: + type: integer + format: int32 + description: Number of baselines that were written. + error: + type: string + description: Error message if the request was invalid. + description: RecordBaselineSnapshotResponse reports how many baselines were successfully updated. + worldmonitor_infrastructure_v1_GetCableHealthRequest: + type: object + description: GetCableHealthRequest requests the current health status of all monitored submarine cables. + worldmonitor_infrastructure_v1_GetCableHealthResponse: + type: object + properties: + generatedAt: + type: integer + format: int64 + description: 'Generation timestamp, as Unix epoch milliseconds.. Warning: Values > 2^53 may lose precision in JavaScript' + cables: + type: object + additionalProperties: + $ref: '#/components/schemas/worldmonitor_infrastructure_v1_CableHealthRecord' + description: Health records keyed by cable identifier. + description: GetCableHealthResponse contains health status for submarine cables with active signals. + worldmonitor_infrastructure_v1_GetCableHealthResponse_CablesEntry: + type: object + properties: + key: + type: string + value: + $ref: '#/components/schemas/worldmonitor_infrastructure_v1_CableHealthRecord' + worldmonitor_infrastructure_v1_CableHealthRecord: + type: object + properties: + status: + type: string + enum: + - CABLE_HEALTH_STATUS_UNSPECIFIED + - CABLE_HEALTH_STATUS_OK + - CABLE_HEALTH_STATUS_DEGRADED + - CABLE_HEALTH_STATUS_FAULT + description: CableHealthStatus represents the computed health status of a submarine cable. + score: + type: number + format: double + description: Composite health score (0.0 = healthy, 1.0 = confirmed fault). + confidence: + type: number + format: double + description: Confidence in the health assessment (0.0–1.0). + lastUpdated: + type: integer + format: int64 + description: 'Last signal update time, as Unix epoch milliseconds.. Warning: Values > 2^53 may lose precision in JavaScript' + evidence: + type: array + items: + $ref: '#/components/schemas/worldmonitor_infrastructure_v1_CableHealthEvidence' + description: CableHealthRecord contains the computed health status and supporting evidence for a cable. + worldmonitor_infrastructure_v1_CableHealthEvidence: + type: object + properties: + source: + type: string + description: Evidence source (e.g. "NGA"). + summary: + type: string + description: Human-readable summary of the evidence. + ts: + type: integer + format: int64 + description: 'Evidence timestamp, as Unix epoch milliseconds.. Warning: Values > 2^53 may lose precision in JavaScript' + description: CableHealthEvidence represents a single piece of evidence supporting a health assessment. + worldmonitor_infrastructure_v1_ListTemporalAnomaliesRequest: + type: object + worldmonitor_infrastructure_v1_ListTemporalAnomaliesResponse: + type: object + properties: + anomalies: + type: array + items: + $ref: '#/components/schemas/worldmonitor_infrastructure_v1_TemporalAnomaly' + trackedTypes: + type: array + items: + type: string + computedAt: + type: string + worldmonitor_infrastructure_v1_TemporalAnomaly: + type: object + properties: + type: + type: string + region: + type: string + currentCount: + type: integer + format: int32 + expectedCount: + type: integer + format: int32 + zScore: + type: number + format: double + severity: + type: string + multiplier: + type: number + format: double + message: + type: string + worldmonitor_infrastructure_v1_ListInternetDdosAttacksRequest: + type: object + description: ListInternetDdosAttacksRequest specifies filters for retrieving DDoS attack summaries. + worldmonitor_infrastructure_v1_ListInternetDdosAttacksResponse: + type: object + properties: + protocol: + type: array + items: + $ref: '#/components/schemas/worldmonitor_infrastructure_v1_DdosAttackSummaryEntry' + vector: + type: array + items: + $ref: '#/components/schemas/worldmonitor_infrastructure_v1_DdosAttackSummaryEntry' + dateRangeStart: + type: string + description: ISO 8601 start of the data window. + dateRangeEnd: + type: string + description: ISO 8601 end of the data window. + topTargetLocations: + type: array + items: + $ref: '#/components/schemas/worldmonitor_infrastructure_v1_DdosLocationHit' + description: ListInternetDdosAttacksResponse contains DDoS attack protocol and vector breakdowns. + worldmonitor_infrastructure_v1_DdosAttackSummaryEntry: + type: object + properties: + label: + type: string + description: Protocol or vector name (e.g. "TCP", "UDP", "networkFlood"). + percentage: + type: number + format: float + description: Percentage share of total DDoS traffic (0–100). + description: DdosAttackSummaryEntry represents a single protocol or vector and its share of DDoS traffic. + worldmonitor_infrastructure_v1_DdosLocationHit: + type: object + properties: + countryCode: + type: string + description: ISO 3166-1 alpha-2 country code. + countryName: + type: string + description: Country display name. + percentage: + type: number + format: float + description: Percentage share of total DDoS traffic targeting this location (0-100). + latitude: + type: number + format: float + description: Latitude of the target location. + longitude: + type: number + format: float + description: Longitude of the target location. + description: DdosLocationHit represents a top DDoS target location with geo coordinates. + worldmonitor_infrastructure_v1_ListInternetTrafficAnomaliesRequest: + type: object + properties: + country: + type: string + description: Optional ISO 3166-1 alpha-2 country code filter. + description: ListInternetTrafficAnomaliesRequest specifies filters for traffic anomalies. + worldmonitor_infrastructure_v1_ListInternetTrafficAnomaliesResponse: + type: object + properties: + anomalies: + type: array + items: + $ref: '#/components/schemas/worldmonitor_infrastructure_v1_TrafficAnomaly' + totalCount: + type: integer + format: int32 + description: Total anomaly count before filtering. + description: ListInternetTrafficAnomaliesResponse contains detected traffic anomalies. + worldmonitor_infrastructure_v1_TrafficAnomaly: + type: object + properties: + uuid: + type: string + description: Unique identifier for the anomaly. + type: + type: string + description: Anomaly type (e.g. "ANOMALY_DNS", "ANOMALY_BGP"). + status: + type: string + description: Current status ("ONGOING" or "HISTORICAL"). + startDate: + type: integer + format: int64 + description: 'Start of the anomaly, Unix epoch milliseconds.. Warning: Values > 2^53 may lose precision in JavaScript' + endDate: + type: integer + format: int64 + description: 'End of the anomaly, Unix epoch milliseconds. Zero if ongoing.. Warning: Values > 2^53 may lose precision in JavaScript' + asn: + type: string + description: Autonomous System Number affected. + asnName: + type: string + description: ASN display name. + locationCode: + type: string + description: ISO 3166-1 alpha-2 country code. + locationName: + type: string + description: Country display name. + latitude: + type: number + format: float + description: Latitude of the affected location. + longitude: + type: number + format: float + description: Longitude of the affected location. + description: TrafficAnomaly represents an anomalous traffic pattern detected by Cloudflare Radar. + worldmonitor_intelligence_v1_GetRiskScoresRequest: + type: object + properties: + region: + type: string + description: Optional region filter. Empty returns all tracked regions. + description: GetRiskScoresRequest specifies parameters for retrieving risk scores. + worldmonitor_intelligence_v1_GetRiskScoresResponse: + type: object + properties: + ciiScores: + type: array + items: + $ref: '#/components/schemas/worldmonitor_intelligence_v1_CiiScore' + strategicRisks: + type: array + items: + $ref: '#/components/schemas/worldmonitor_intelligence_v1_StrategicRisk' + description: GetRiskScoresResponse contains composite risk scores and strategic assessments. + worldmonitor_intelligence_v1_CiiScore: + type: object + properties: + region: + type: string + description: Region or country identifier. + staticBaseline: + type: number + maximum: 100 + minimum: 0 + format: double + description: Static baseline score (0-100). + dynamicScore: + type: number + maximum: 100 + minimum: 0 + format: double + description: Dynamic real-time score (0-100). + combinedScore: + type: number + maximum: 100 + minimum: 0 + format: double + description: Combined weighted score (0-100). + trend: + type: string + enum: + - TREND_DIRECTION_UNSPECIFIED + - TREND_DIRECTION_RISING + - TREND_DIRECTION_STABLE + - TREND_DIRECTION_FALLING + description: |- + TrendDirection represents the directional movement of a metric over time. + Used in markets, GDELT tension scores, and risk assessments. + components: + $ref: '#/components/schemas/worldmonitor_intelligence_v1_CiiComponents' + computedAt: + type: integer + format: int64 + description: 'Last computation time, as Unix epoch milliseconds.. Warning: Values > 2^53 may lose precision in JavaScript' + description: CiiScore represents a Composite Instability Index score for a region or country. + worldmonitor_intelligence_v1_CiiComponents: + type: object + properties: + newsActivity: + type: number + maximum: 100 + minimum: 0 + format: double + description: News activity signal contribution (0-100). + ciiContribution: + type: number + maximum: 100 + minimum: 0 + format: double + description: CII index contribution (0-100). + geoConvergence: + type: number + maximum: 100 + minimum: 0 + format: double + description: Geographic convergence score (0-100). + militaryActivity: + type: number + maximum: 100 + minimum: 0 + format: double + description: Military activity contribution (0-100). + description: CiiComponents represents the contributing factors to a CII score. + worldmonitor_intelligence_v1_StrategicRisk: + type: object + properties: + region: + type: string + description: Country or region identifier. + level: + type: string + enum: + - SEVERITY_LEVEL_UNSPECIFIED + - SEVERITY_LEVEL_LOW + - SEVERITY_LEVEL_MEDIUM + - SEVERITY_LEVEL_HIGH + description: |- + SeverityLevel represents a three-tier severity classification used across domains. + Maps to existing TS unions: 'low' | 'medium' | 'high'. + score: + type: number + maximum: 100 + minimum: 0 + format: double + description: Risk score (0-100). + factors: + type: array + items: + type: string + description: Risk factors contributing to the assessment. + trend: + type: string + enum: + - TREND_DIRECTION_UNSPECIFIED + - TREND_DIRECTION_RISING + - TREND_DIRECTION_STABLE + - TREND_DIRECTION_FALLING + description: |- + TrendDirection represents the directional movement of a metric over time. + Used in markets, GDELT tension scores, and risk assessments. + description: StrategicRisk represents a strategic risk assessment for a country or region. + worldmonitor_intelligence_v1_GetPizzintStatusRequest: + type: object + properties: + includeGdelt: + type: boolean + description: Whether to include GDELT tension pairs in the response. + description: GetPizzintStatusRequest specifies parameters for retrieving PizzINT and GDELT data. + worldmonitor_intelligence_v1_GetPizzintStatusResponse: + type: object + properties: + pizzint: + $ref: '#/components/schemas/worldmonitor_intelligence_v1_PizzintStatus' + tensionPairs: + type: array + items: + $ref: '#/components/schemas/worldmonitor_intelligence_v1_GdeltTensionPair' + description: GetPizzintStatusResponse contains Pentagon Pizza Index and GDELT tension data. + worldmonitor_intelligence_v1_PizzintStatus: + type: object + properties: + defconLevel: + type: integer + maximum: 5 + minimum: 1 + format: int32 + description: DEFCON-style level (1-5). + defconLabel: + type: string + description: Human-readable DEFCON label. + aggregateActivity: + type: number + format: double + description: Aggregate activity score. + activeSpikes: + type: integer + format: int32 + description: Number of active spike locations. + locationsMonitored: + type: integer + format: int32 + description: Total monitored locations. + locationsOpen: + type: integer + format: int32 + description: Currently open locations. + updatedAt: + type: integer + format: int64 + description: 'Last data update time, as Unix epoch milliseconds.. Warning: Values > 2^53 may lose precision in JavaScript' + dataFreshness: + type: string + enum: + - DATA_FRESHNESS_UNSPECIFIED + - DATA_FRESHNESS_FRESH + - DATA_FRESHNESS_STALE + description: DataFreshness represents how current the data is. + locations: + type: array + items: + $ref: '#/components/schemas/worldmonitor_intelligence_v1_PizzintLocation' + description: PizzintStatus represents the Pentagon Pizza Index status (proxy for late-night DC activity). + worldmonitor_intelligence_v1_PizzintLocation: + type: object + properties: + placeId: + type: string + description: Google Places ID. + name: + type: string + description: Location name. + address: + type: string + description: Street address. + currentPopularity: + type: integer + format: int32 + description: Current popularity score (0-200+). + percentageOfUsual: + type: integer + format: int32 + description: Percentage of usual activity. Zero if unavailable. + isSpike: + type: boolean + description: Whether activity constitutes a spike. + spikeMagnitude: + type: number + format: double + description: Spike magnitude above baseline. Zero if no spike. + dataSource: + type: string + description: Data source identifier. + recordedAt: + type: string + description: Recording timestamp as ISO 8601 string. + dataFreshness: + type: string + enum: + - DATA_FRESHNESS_UNSPECIFIED + - DATA_FRESHNESS_FRESH + - DATA_FRESHNESS_STALE + description: DataFreshness represents how current the data is. + isClosedNow: + type: boolean + description: Whether the location is currently closed. + lat: + type: number + format: double + description: Latitude of the location. + lng: + type: number + format: double + description: Longitude of the location. + description: PizzintLocation represents a single monitored pizza location near the Pentagon. + worldmonitor_intelligence_v1_GdeltTensionPair: + type: object + properties: + id: + type: string + description: Pair identifier. + countries: + type: array + items: + type: string + description: Country pair (ISO 3166-1 alpha-2 codes). + label: + type: string + description: Human-readable label (e.g., "US-China"). + score: + type: number + maximum: 100 + minimum: 0 + format: double + description: Tension score (0-100). + trend: + type: string + enum: + - TREND_DIRECTION_UNSPECIFIED + - TREND_DIRECTION_RISING + - TREND_DIRECTION_STABLE + - TREND_DIRECTION_FALLING + description: |- + TrendDirection represents the directional movement of a metric over time. + Used in markets, GDELT tension scores, and risk assessments. + changePercent: + type: number + format: double + description: Percentage change from previous period. + region: + type: string + description: Geographic region. + description: GdeltTensionPair represents a bilateral tension score between two countries from GDELT. + worldmonitor_intelligence_v1_ClassifyEventRequest: + type: object + properties: + title: + type: string + minLength: 1 + description: Event title or headline. + description: + type: string + description: Event description or body text. + source: + type: string + description: Event source (e.g., "reuters", "acled"). + country: + type: string + description: Country context (ISO 3166-1 alpha-2). + required: + - title + description: ClassifyEventRequest specifies an event to classify using AI. + worldmonitor_intelligence_v1_ClassifyEventResponse: + type: object + properties: + classification: + $ref: '#/components/schemas/worldmonitor_intelligence_v1_EventClassification' + description: ClassifyEventResponse contains the AI-generated event classification. + worldmonitor_intelligence_v1_EventClassification: + type: object + properties: + category: + type: string + description: Event category (e.g., "military", "economic", "social"). + subcategory: + type: string + description: Event subcategory. + severity: + type: string + enum: + - SEVERITY_LEVEL_UNSPECIFIED + - SEVERITY_LEVEL_LOW + - SEVERITY_LEVEL_MEDIUM + - SEVERITY_LEVEL_HIGH + description: |- + SeverityLevel represents a three-tier severity classification used across domains. + Maps to existing TS unions: 'low' | 'medium' | 'high'. + confidence: + type: number + maximum: 1 + minimum: 0 + format: double + description: Classification confidence (0.0 to 1.0). + analysis: + type: string + description: Brief AI-generated analysis. + entities: + type: array + items: + type: string + description: Related entities identified. + description: EventClassification represents an AI-generated classification of a real-world event. + worldmonitor_intelligence_v1_GetCountryRiskRequest: + type: object + properties: + countryCode: + type: string + pattern: ^[A-Z]{2}$ + description: ISO 3166-1 alpha-2 country code. + required: + - countryCode + description: GetCountryRiskRequest specifies which country to retrieve risk intelligence for. + worldmonitor_intelligence_v1_GetCountryRiskResponse: + type: object + properties: + countryCode: + type: string + description: ISO 3166-1 alpha-2 country code. + countryName: + type: string + description: Country name. + cii: + $ref: '#/components/schemas/worldmonitor_intelligence_v1_CiiScore' + advisoryLevel: + type: string + description: Travel advisory level from government sources (e.g. "do-not-travel", "reconsider", "caution"). Empty if none. + sanctionsActive: + type: boolean + description: Whether this country has active OFAC sanctions designations. + sanctionsCount: + type: integer + format: int32 + description: Count of sanctioned entities associated with this country. + fetchedAt: + type: integer + format: int64 + description: 'Data freshness timestamp derived from CII computedAt, as Unix epoch milliseconds.. Warning: Values > 2^53 may lose precision in JavaScript' + upstreamUnavailable: + type: boolean + description: True when all upstream Redis keys were unavailable. Signals CDN cache bypass. + description: GetCountryRiskResponse contains composite risk intelligence for a specific country. + worldmonitor_intelligence_v1_GetCountryIntelBriefRequest: + type: object + properties: + countryCode: + type: string + pattern: ^[A-Z]{2}$ + description: ISO 3166-1 alpha-2 country code. + framework: + type: string + description: Optional analytical framework instructions to append to system prompt. Max 2000 chars enforced at handler level. + required: + - countryCode + description: GetCountryIntelBriefRequest specifies which country to generate a brief for. + worldmonitor_intelligence_v1_GetCountryIntelBriefResponse: + type: object + properties: + countryCode: + type: string + description: ISO 3166-1 alpha-2 country code. + countryName: + type: string + description: Country name. + brief: + type: string + description: AI-generated intelligence brief text. + model: + type: string + description: AI model used for generation. + generatedAt: + type: integer + format: int64 + description: 'Brief generation time, as Unix epoch milliseconds.. Warning: Values > 2^53 may lose precision in JavaScript' + description: GetCountryIntelBriefResponse contains an AI-generated intelligence brief for a country. + worldmonitor_intelligence_v1_SearchGdeltDocumentsRequest: + type: object + properties: + query: + type: string + minLength: 1 + description: Search query string. + maxRecords: + type: integer + maximum: 250 + minimum: 1 + format: int32 + description: Maximum number of articles to return (1-250). + timespan: + type: string + description: Time span filter (e.g., "15min", "1h", "24h"). + toneFilter: + type: string + description: |- + Tone filter appended to query (e.g., "tone>5" for positive, "tone<-5" for negative). + Left empty to skip tone filtering. + sort: + type: string + description: 'Sort mode: "DateDesc" (default), "ToneDesc", "ToneAsc", "HybridRel".' + required: + - query + description: SearchGdeltDocumentsRequest specifies filters for searching GDELT news articles. + worldmonitor_intelligence_v1_SearchGdeltDocumentsResponse: + type: object + properties: + articles: + type: array + items: + $ref: '#/components/schemas/worldmonitor_intelligence_v1_GdeltArticle' + query: + type: string + description: Echo of the search query. + error: + type: string + description: Error message if the search failed. + description: SearchGdeltDocumentsResponse contains GDELT article search results. + worldmonitor_intelligence_v1_GdeltArticle: + type: object + properties: + title: + type: string + description: Article headline. + url: + type: string + description: Article URL. + source: + type: string + description: Source domain name. + date: + type: string + description: Publication date string. + image: + type: string + description: Article image URL. + language: + type: string + description: Article language code. + tone: + type: number + format: double + description: GDELT tone score (negative = negative tone, positive = positive tone). + description: GdeltArticle represents a single article from the GDELT document API. + worldmonitor_intelligence_v1_DeductSituationRequest: + type: object + properties: + query: + type: string + geoContext: + type: string + framework: + type: string + description: Optional analytical framework instructions. + worldmonitor_intelligence_v1_DeductSituationResponse: + type: object + properties: + analysis: + type: string + model: + type: string + provider: + type: string + worldmonitor_intelligence_v1_ListSatellitesRequest: + type: object + properties: + country: + type: string + description: Filter by country code. Empty returns all. + description: ListSatellitesRequest specifies filters for orbital data. + worldmonitor_intelligence_v1_ListSatellitesResponse: + type: object + properties: + satellites: + type: array + items: + $ref: '#/components/schemas/worldmonitor_intelligence_v1_Satellite' + description: ListSatellitesResponse contains the current orbital snapshot. + worldmonitor_intelligence_v1_Satellite: + type: object + properties: + id: + type: string + minLength: 1 + description: NORAD identifier (e.g., "25544"). + name: + type: string + description: Name of the satellite. + country: + type: string + description: ISO country code of the operator/owner. + type: + type: string + description: Purpose category (e.g., "sar", "optical", "military"). + alt: + type: number + format: double + description: Orbital altitude in kilometers. + velocity: + type: number + format: double + description: Velocity in km/s. + inclination: + type: number + format: double + description: Orbital inclination in degrees. + line1: + type: string + description: TLE line 1. + line2: + type: string + description: TLE line 2. + required: + - id + description: Satellite represents an orbital asset tracked by WorldMonitor. + worldmonitor_intelligence_v1_ListGpsInterferenceRequest: + type: object + properties: + region: + type: string + description: Optional region filter. + description: ListGpsInterferenceRequest specifies filters for GPS interference data. + worldmonitor_intelligence_v1_ListGpsInterferenceResponse: + type: object + properties: + hexes: + type: array + items: + $ref: '#/components/schemas/worldmonitor_intelligence_v1_GpsJamHex' + stats: + $ref: '#/components/schemas/worldmonitor_intelligence_v1_GpsJamStats' + source: + type: string + description: Data source name. + fetchedAt: + type: integer + format: int64 + description: 'Data fetch time, as Unix epoch milliseconds.. Warning: Values > 2^53 may lose precision in JavaScript' + description: ListGpsInterferenceResponse contains GPS interference data and stats. + worldmonitor_intelligence_v1_GpsJamHex: + type: object + properties: + h3: + type: string + minLength: 1 + description: H3 index of the hexagon. + lat: + type: number + format: double + description: Centroid latitude. + lon: + type: number + format: double + description: Centroid longitude. + level: + type: string + enum: + - INTERFERENCE_LEVEL_UNSPECIFIED + - INTERFERENCE_LEVEL_LOW + - INTERFERENCE_LEVEL_MEDIUM + - INTERFERENCE_LEVEL_HIGH + description: InterferenceLevel represents the severity of detected signal interference. + npAvg: + type: number + format: double + description: Average Navigation Precision (np) - lower means more interference. + sampleCount: + type: integer + format: int32 + description: Number of samples in this hex. + aircraftCount: + type: integer + format: int32 + description: Number of unique aircraft that reported in this hex. + required: + - h3 + description: GpsJamHex represents a geographic hexagon with detected GPS interference. + worldmonitor_intelligence_v1_GpsJamStats: + type: object + properties: + totalHexes: + type: integer + format: int32 + highCount: + type: integer + format: int32 + mediumCount: + type: integer + format: int32 + description: GpsJamStats contains aggregate statistics for GPS interference. + worldmonitor_intelligence_v1_ListOrefAlertsRequest: + type: object + properties: + mode: + type: string + enum: + - MODE_UNSPECIFIED + - MODE_HISTORY + description: Request to fetch Israeli Red Alerts (OREF). + worldmonitor_intelligence_v1_ListOrefAlertsResponse: + type: object + properties: + configured: + type: boolean + description: Whether the OREF bridge is configured. + alerts: + type: array + items: + $ref: '#/components/schemas/worldmonitor_intelligence_v1_OrefAlert' + history: + type: array + items: + $ref: '#/components/schemas/worldmonitor_intelligence_v1_OrefWave' + historyCount24h: + type: integer + format: int32 + description: Number of alerts in the last 24 hours. + totalHistoryCount: + type: integer + format: int32 + description: Total alerts in the historical buffer. + timestampMs: + type: integer + format: int64 + description: 'Unix timestamp in milliseconds of the response generation.. Warning: Values > 2^53 may lose precision in JavaScript' + error: + type: string + description: Optional error message from the relay. + description: OREF alert wave snapshot. + worldmonitor_intelligence_v1_OrefAlert: + type: object + properties: + id: + type: string + cat: + type: string + title: + type: string + data: + type: array + items: + type: string + desc: + type: string + timestampMs: + type: integer + format: int64 + description: 'Unix timestamp in milliseconds for when the alert was issued.. Warning: Values > 2^53 may lose precision in JavaScript' + description: A single Red Alert event. + worldmonitor_intelligence_v1_OrefWave: + type: object + properties: + alerts: + type: array + items: + $ref: '#/components/schemas/worldmonitor_intelligence_v1_OrefAlert' + timestampMs: + type: integer + format: int64 + description: 'Unix timestamp in milliseconds for this wave.. Warning: Values > 2^53 may lose precision in JavaScript' + description: A wave of alerts occurring at the same time. + worldmonitor_intelligence_v1_ListTelegramFeedRequest: + type: object + properties: + limit: + type: integer + format: int32 + description: Maximum number of messages to return (default 50). + topic: + type: string + description: Filter by topic keyword (e.g. "military", "cyber"). + channel: + type: string + description: Filter by specific channel ID or name. + description: Request to fetch real-time Telegram OSINT feed. + worldmonitor_intelligence_v1_ListTelegramFeedResponse: + type: object + properties: + enabled: + type: boolean + description: Whether the bridge is currently active. + messages: + type: array + items: + $ref: '#/components/schemas/worldmonitor_intelligence_v1_TelegramMessage' + count: + type: integer + format: int32 + description: Total count of messages in the current window. + error: + type: string + description: Detailed error message if the fetch failed. + description: OSINT feed containing validated Telegram messages. + worldmonitor_intelligence_v1_TelegramMessage: + type: object + properties: + id: + type: string + description: Unique message identifier. + channelId: + type: string + description: Identifier of the originating channel. + channelName: + type: string + description: Human-readable name of the channel. + text: + type: string + description: Sanitized message content. + timestampMs: + type: integer + format: int64 + description: 'Unix timestamp in milliseconds for when the message was posted.. Warning: Values > 2^53 may lose precision in JavaScript' + mediaUrls: + type: array + items: + type: string + description: Direct links to associated media (images, videos). + sourceUrl: + type: string + description: Link to the original post on Telegram. + topic: + type: string + description: Auto-classified topic based on content. + description: Validated OSINT post from Telegram channels. + worldmonitor_intelligence_v1_GetCompanyEnrichmentRequest: + type: object + properties: + domain: + type: string + name: + type: string + description: |- + Request to fetch enrichment data for a company. + Requires either domain (e.g. "github.com") or name (e.g. "GitHub"). + worldmonitor_intelligence_v1_GetCompanyEnrichmentResponse: + type: object + properties: + company: + $ref: '#/components/schemas/worldmonitor_intelligence_v1_EnrichedCompany' + github: + $ref: '#/components/schemas/worldmonitor_intelligence_v1_EnrichedGithub' + techStack: + type: array + items: + $ref: '#/components/schemas/worldmonitor_intelligence_v1_TechStackItem' + secFilings: + $ref: '#/components/schemas/worldmonitor_intelligence_v1_SecFilings' + hackerNewsMentions: + type: array + items: + $ref: '#/components/schemas/worldmonitor_intelligence_v1_HNMention' + enrichedAtMs: + type: integer + format: int64 + description: 'Unix timestamp in milliseconds when this data was fetched.. Warning: Values > 2^53 may lose precision in JavaScript' + sources: + type: array + items: + type: string + description: List of sources successfully reached (e.g. "github", "sec_edgar"). + description: Aggregated company data from multiple public sources. + worldmonitor_intelligence_v1_EnrichedCompany: + type: object + properties: + name: + type: string + domain: + type: string + description: + type: string + location: + type: string + website: + type: string + founded: + type: integer + format: int32 + worldmonitor_intelligence_v1_EnrichedGithub: + type: object + properties: + publicRepos: + type: integer + format: int32 + followers: + type: integer + format: int32 + avatarUrl: + type: string + worldmonitor_intelligence_v1_TechStackItem: + type: object + properties: + name: + type: string + category: + type: string + confidence: + type: number + format: float + worldmonitor_intelligence_v1_SecFilings: + type: object + properties: + totalFilings: + type: integer + format: int32 + recentFilings: + type: array + items: + $ref: '#/components/schemas/worldmonitor_intelligence_v1_SecFiling' + worldmonitor_intelligence_v1_SecFiling: + type: object + properties: + form: + type: string + fileDate: + type: string + description: + type: string + worldmonitor_intelligence_v1_HNMention: + type: object + properties: + title: + type: string + url: + type: string + points: + type: integer + format: int32 + comments: + type: integer + format: int32 + createdAtMs: + type: integer + format: int64 + description: 'Unix timestamp in milliseconds when the post was created.. Warning: Values > 2^53 may lose precision in JavaScript' + worldmonitor_intelligence_v1_ListCompanySignalsRequest: + type: object + properties: + company: + type: string + domain: + type: string + description: Request to discover and classify company signals (hiring, funding, tech changes). + worldmonitor_intelligence_v1_ListCompanySignalsResponse: + type: object + properties: + company: + type: string + domain: + type: string + signals: + type: array + items: + $ref: '#/components/schemas/worldmonitor_intelligence_v1_CompanySignal' + summary: + $ref: '#/components/schemas/worldmonitor_intelligence_v1_SignalSummary' + discoveredAtMs: + type: integer + format: int64 + description: 'Unix timestamp in milliseconds when signals were discovered.. Warning: Values > 2^53 may lose precision in JavaScript' + description: Discovered company signals with classification and engagement metrics. + worldmonitor_intelligence_v1_CompanySignal: + type: object + properties: + type: + type: string + description: Classification type (e.g. "Hiring", "Product Launch", "Expansion"). + title: + type: string + url: + type: string + source: + type: string + sourceTier: + type: integer + format: int32 + description: Data quality tier (1 is authoritative, 5 is low confidence). + timestampMs: + type: integer + format: int64 + description: 'Unix timestamp in milliseconds of the event occurrence.. Warning: Values > 2^53 may lose precision in JavaScript' + strength: + type: string + description: Qualitative strength of the signal (e.g. "Strong", "Emerging"). + engagement: + $ref: '#/components/schemas/worldmonitor_intelligence_v1_SignalEngagement' + worldmonitor_intelligence_v1_SignalEngagement: + type: object + properties: + points: + type: integer + format: int32 + comments: + type: integer + format: int32 + stars: + type: integer + format: int32 + forks: + type: integer + format: int32 + mentions: + type: integer + format: int32 + worldmonitor_intelligence_v1_SignalSummary: + type: object + properties: + totalSignals: + type: integer + format: int32 + byType: + type: object + additionalProperties: + type: integer + format: int32 + strongestSignal: + $ref: '#/components/schemas/worldmonitor_intelligence_v1_CompanySignal' + signalDiversity: + type: integer + format: int32 + worldmonitor_intelligence_v1_SignalSummary_ByTypeEntry: + type: object + properties: + key: + type: string + value: + type: integer + format: int32 + worldmonitor_intelligence_v1_GetCountryFactsRequest: + type: object + properties: + countryCode: + type: string + pattern: ^[A-Z]{2}$ + required: + - countryCode + worldmonitor_intelligence_v1_GetCountryFactsResponse: + type: object + properties: + headOfState: + type: string + headOfStateTitle: + type: string + wikipediaSummary: + type: string + wikipediaThumbnailUrl: + type: string + population: + type: integer + format: int64 + description: 'Warning: Values > 2^53 may lose precision in JavaScript' + capital: + type: string + languages: + type: array + items: + type: string + currencies: + type: array + items: + type: string + areaSqKm: + type: number + format: double + countryName: + type: string + worldmonitor_intelligence_v1_ListSecurityAdvisoriesRequest: + type: object + worldmonitor_intelligence_v1_ListSecurityAdvisoriesResponse: + type: object + properties: + advisories: + type: array + items: + $ref: '#/components/schemas/worldmonitor_intelligence_v1_SecurityAdvisoryItem' + byCountry: + type: object + additionalProperties: + type: string + worldmonitor_intelligence_v1_ListSecurityAdvisoriesResponse_ByCountryEntry: + type: object + properties: + key: + type: string + value: + type: string + worldmonitor_intelligence_v1_SecurityAdvisoryItem: + type: object + properties: + title: + type: string + link: + type: string + pubDate: + type: string + source: + type: string + sourceCountry: + type: string + level: + type: string + country: + type: string + worldmonitor_intelligence_v1_GetGdeltTopicTimelineRequest: + type: object + properties: + topic: + type: string + description: Topic ID (military, cyber, nuclear, sanctions, intelligence, maritime). + description: GetGdeltTopicTimelineRequest retrieves tone and volume timelines for a GDELT intel topic. + worldmonitor_intelligence_v1_GetGdeltTopicTimelineResponse: + type: object + properties: + topic: + type: string + description: Topic ID. + tone: + type: array + items: + $ref: '#/components/schemas/worldmonitor_intelligence_v1_GdeltTimelinePoint' + vol: + type: array + items: + $ref: '#/components/schemas/worldmonitor_intelligence_v1_GdeltTimelinePoint' + fetchedAt: + type: string + description: ISO timestamp when this data was fetched. + error: + type: string + description: Error message if fetch failed. + description: GetGdeltTopicTimelineResponse contains tone and volume timelines for a topic. + worldmonitor_intelligence_v1_GdeltTimelinePoint: + type: object + properties: + date: + type: string + description: Date string from GDELT (e.g. "20240101T000000"). + value: + type: number + format: double + description: Tone or volume value at this point. + description: GdeltTimelinePoint is a single data point in a tone or volume timeline. + worldmonitor_intelligence_v1_ListCrossSourceSignalsRequest: + type: object + description: ListCrossSourceSignalsRequest has no required parameters (returns all signals). + worldmonitor_intelligence_v1_ListCrossSourceSignalsResponse: + type: object + properties: + signals: + type: array + items: + $ref: '#/components/schemas/worldmonitor_intelligence_v1_CrossSourceSignal' + evaluatedAt: + type: integer + format: int64 + description: 'Timestamp when the aggregator last ran (Unix epoch milliseconds).. Warning: Values > 2^53 may lose precision in JavaScript' + compositeCount: + type: integer + format: int32 + description: Total number of composite escalation zones detected. + description: ListCrossSourceSignalsResponse contains ranked cross-domain signals. + worldmonitor_intelligence_v1_CrossSourceSignal: + type: object + properties: + id: + type: string + description: Unique signal identifier. + type: + type: string + enum: + - CROSS_SOURCE_SIGNAL_TYPE_UNSPECIFIED + - CROSS_SOURCE_SIGNAL_TYPE_COMPOSITE_ESCALATION + - CROSS_SOURCE_SIGNAL_TYPE_THERMAL_SPIKE + - CROSS_SOURCE_SIGNAL_TYPE_GPS_JAMMING + - CROSS_SOURCE_SIGNAL_TYPE_MILITARY_FLIGHT_SURGE + - CROSS_SOURCE_SIGNAL_TYPE_UNREST_SURGE + - CROSS_SOURCE_SIGNAL_TYPE_OREF_ALERT_CLUSTER + - CROSS_SOURCE_SIGNAL_TYPE_VIX_SPIKE + - CROSS_SOURCE_SIGNAL_TYPE_COMMODITY_SHOCK + - CROSS_SOURCE_SIGNAL_TYPE_CYBER_ESCALATION + - CROSS_SOURCE_SIGNAL_TYPE_SHIPPING_DISRUPTION + - CROSS_SOURCE_SIGNAL_TYPE_SANCTIONS_SURGE + - CROSS_SOURCE_SIGNAL_TYPE_EARTHQUAKE_SIGNIFICANT + - CROSS_SOURCE_SIGNAL_TYPE_RADIATION_ANOMALY + - CROSS_SOURCE_SIGNAL_TYPE_INFRASTRUCTURE_OUTAGE + - CROSS_SOURCE_SIGNAL_TYPE_WILDFIRE_ESCALATION + - CROSS_SOURCE_SIGNAL_TYPE_DISPLACEMENT_SURGE + - CROSS_SOURCE_SIGNAL_TYPE_FORECAST_DETERIORATION + - CROSS_SOURCE_SIGNAL_TYPE_MARKET_STRESS + - CROSS_SOURCE_SIGNAL_TYPE_WEATHER_EXTREME + - CROSS_SOURCE_SIGNAL_TYPE_MEDIA_TONE_DETERIORATION + - CROSS_SOURCE_SIGNAL_TYPE_RISK_SCORE_SPIKE + description: CrossSourceSignalType enumerates all monitored cross-domain signal categories. + theater: + type: string + description: Theater / geographic context (e.g. "Eastern Europe", "Red Sea", "Global Markets"). + summary: + type: string + description: Human-readable summary of the signal. + severity: + type: string + enum: + - CROSS_SOURCE_SIGNAL_SEVERITY_UNSPECIFIED + - CROSS_SOURCE_SIGNAL_SEVERITY_LOW + - CROSS_SOURCE_SIGNAL_SEVERITY_MEDIUM + - CROSS_SOURCE_SIGNAL_SEVERITY_HIGH + - CROSS_SOURCE_SIGNAL_SEVERITY_CRITICAL + description: CrossSourceSignalSeverity indicates the urgency tier of a detected signal. + severityScore: + type: number + format: double + description: 'Raw severity score used for ranking (higher = more severe).. Warning: Values > 2^53 may lose precision in JavaScript' + detectedAt: + type: integer + format: int64 + description: 'Detection timestamp (Unix epoch milliseconds).. Warning: Values > 2^53 may lose precision in JavaScript' + contributingTypes: + type: array + items: + type: string + description: 'For COMPOSITE_ESCALATION: list of contributing signal type names.' + signalCount: + type: integer + format: int32 + description: 'For COMPOSITE_ESCALATION: number of co-firing signals in theater.' + description: CrossSourceSignal represents a single detected cross-domain signal event. + worldmonitor_intelligence_v1_ListMarketImplicationsRequest: + type: object + properties: + frameworkId: + type: string + worldmonitor_intelligence_v1_ListMarketImplicationsResponse: + type: object + properties: + cards: + type: array + items: + $ref: '#/components/schemas/worldmonitor_intelligence_v1_MarketImplicationCard' + degraded: + type: boolean + emptyReason: + type: string + generatedAt: + type: string + worldmonitor_intelligence_v1_MarketImplicationCard: + type: object + properties: + ticker: + type: string + name: + type: string + direction: + type: string + timeframe: + type: string + confidence: + type: string + title: + type: string + narrative: + type: string + riskCaveat: + type: string + driver: + type: string + transmissionChain: + type: array + items: + $ref: '#/components/schemas/worldmonitor_intelligence_v1_TransmissionNode' + worldmonitor_intelligence_v1_TransmissionNode: + type: object + properties: + node: + type: string + impactType: + type: string + logic: + type: string + worldmonitor_intelligence_v1_GetSocialVelocityRequest: + type: object + worldmonitor_intelligence_v1_GetSocialVelocityResponse: + type: object + properties: + posts: + type: array + items: + $ref: '#/components/schemas/worldmonitor_intelligence_v1_SocialVelocityPost' + fetchedAt: + type: integer + format: int64 + description: 'Warning: Values > 2^53 may lose precision in JavaScript' + worldmonitor_intelligence_v1_SocialVelocityPost: + type: object + properties: + id: + type: string + description: Reddit post ID. + title: + type: string + description: Post title. + subreddit: + type: string + description: Subreddit name (without r/ prefix). + url: + type: string + description: Direct URL to the post. + score: + type: integer + format: int32 + description: Reddit score (upvotes - downvotes). + upvoteRatio: + type: number + format: double + description: Upvote ratio (0.0–1.0). + numComments: + type: integer + format: int32 + description: Number of comments. + velocityScore: + type: number + format: double + description: Composite velocity score accounting for recency, score, and ratio. + createdAt: + type: integer + format: int64 + description: 'Unix epoch milliseconds when posted.. Warning: Values > 2^53 may lose precision in JavaScript' + description: SocialVelocityPost represents a trending Reddit post with velocity scoring. + worldmonitor_intelligence_v1_GetCountryEnergyProfileRequest: + type: object + properties: + countryCode: + type: string + worldmonitor_intelligence_v1_GetCountryEnergyProfileResponse: + type: object + properties: + mixAvailable: + type: boolean + description: Phase 1 — OWID structural mix (~200 countries) + mixYear: + type: integer + format: int32 + coalShare: + type: number + format: double + gasShare: + type: number + format: double + oilShare: + type: number + format: double + nuclearShare: + type: number + format: double + renewShare: + type: number + format: double + windShare: + type: number + format: double + solarShare: + type: number + format: double + hydroShare: + type: number + format: double + importShare: + type: number + format: double + gasStorageAvailable: + type: boolean + description: Phase 2 — EU gas storage + gasStorageFillPct: + type: number + format: double + gasStorageChange1d: + type: number + format: double + gasStorageTrend: + type: string + gasStorageDate: + type: string + electricityAvailable: + type: boolean + description: |- + Phase 2 — EU electricity (ENTSO-E countries: DE FR ES IT NL BE PL PT GB NO SE) + US electricity is stored by EIA balancing area, not ISO2 — not available here + electricityPriceMwh: + type: number + format: double + electricitySource: + type: string + electricityDate: + type: string + jodiOilAvailable: + type: boolean + description: Phase 2.5 — JODI Oil (~90+ countries) + jodiOilDataMonth: + type: string + gasolineDemandKbd: + type: number + format: double + gasolineImportsKbd: + type: number + format: double + dieselDemandKbd: + type: number + format: double + dieselImportsKbd: + type: number + format: double + jetDemandKbd: + type: number + format: double + jetImportsKbd: + type: number + format: double + lpgDemandKbd: + type: number + format: double + crudeImportsKbd: + type: number + format: double + lpgImportsKbd: + type: number + format: double + jodiGasAvailable: + type: boolean + description: Phase 2.5 — JODI Gas + jodiGasDataMonth: + type: string + gasTotalDemandTj: + type: number + format: double + gasLngImportsTj: + type: number + format: double + gasPipeImportsTj: + type: number + format: double + gasLngShare: + type: number + format: double + ieaStocksAvailable: + type: boolean + description: Phase 2.5 — IEA oil stocks (~31 IEA members) + ieaStocksDataMonth: + type: string + ieaDaysOfCover: + type: integer + format: int32 + ieaNetExporter: + type: boolean + ieaBelowObligation: + type: boolean + emberFossilShare: + type: number + format: double + description: Phase 3 — Ember monthly electricity mix + emberRenewShare: + type: number + format: double + emberNuclearShare: + type: number + format: double + emberCoalShare: + type: number + format: double + emberGasShare: + type: number + format: double + emberDemandTwh: + type: number + format: double + emberDataMonth: + type: string + emberAvailable: + type: boolean + sprRegime: + type: string + description: Phase 4 — SPR policy classification + sprCapacityMb: + type: number + format: double + sprOperator: + type: string + sprIeaMember: + type: boolean + sprStockholdingModel: + type: string + sprNote: + type: string + sprSource: + type: string + sprAsOf: + type: string + sprAvailable: + type: boolean + worldmonitor_intelligence_v1_ComputeEnergyShockScenarioRequest: + type: object + properties: + countryCode: + type: string + chokepointId: + type: string + disruptionPct: + type: integer + format: int32 + fuelMode: + type: string + worldmonitor_intelligence_v1_ComputeEnergyShockScenarioResponse: + type: object + properties: + countryCode: + type: string + chokepointId: + type: string + disruptionPct: + type: integer + format: int32 + gulfCrudeShare: + type: number + format: double + crudeLossKbd: + type: number + format: double + products: + type: array + items: + $ref: '#/components/schemas/worldmonitor_intelligence_v1_ProductImpact' + effectiveCoverDays: + type: integer + format: int32 + assessment: + type: string + dataAvailable: + type: boolean + jodiOilCoverage: + type: boolean + description: v2 fields + comtradeCoverage: + type: boolean + ieaStocksCoverage: + type: boolean + portwatchCoverage: + type: boolean + coverageLevel: + type: string + limitations: + type: array + items: + type: string + degraded: + type: boolean + chokepointConfidence: + type: string + liveFlowRatio: + type: number + format: double + gasImpact: + $ref: '#/components/schemas/worldmonitor_intelligence_v1_GasImpact' + worldmonitor_intelligence_v1_ProductImpact: + type: object + properties: + product: + type: string + outputLossKbd: + type: number + format: double + demandKbd: + type: number + format: double + deficitPct: + type: number + format: double + worldmonitor_intelligence_v1_GasImpact: + type: object + properties: + lngShareOfImports: + type: number + format: double + lngImportsTj: + type: number + format: double + lngDisruptionTj: + type: number + format: double + totalDemandTj: + type: number + format: double + deficitPct: + type: number + format: double + dataAvailable: + type: boolean + assessment: + type: string + storage: + $ref: '#/components/schemas/worldmonitor_intelligence_v1_GasStorageBuffer' + dataSource: + type: string + worldmonitor_intelligence_v1_GasStorageBuffer: + type: object + properties: + fillPct: + type: number + format: double + gasTwh: + type: number + format: double + bufferDays: + type: number + format: double + trend: + type: string + date: + type: string + scope: + type: string + worldmonitor_intelligence_v1_GetCountryPortActivityRequest: + type: object + properties: + countryCode: + type: string + worldmonitor_intelligence_v1_CountryPortActivityResponse: + type: object + properties: + ports: + type: array + items: + $ref: '#/components/schemas/worldmonitor_intelligence_v1_PortActivityEntry' + fetchedAt: + type: string + available: + type: boolean + worldmonitor_intelligence_v1_PortActivityEntry: + type: object + properties: + portId: + type: string + portName: + type: string + lat: + type: number + format: double + lon: + type: number + format: double + tankerCalls30d: + type: integer + format: int32 + trendDeltaPct: + type: number + format: double + importTankerDwt: + type: number + format: double + exportTankerDwt: + type: number + format: double + anomalySignal: + type: boolean + worldmonitor_intelligence_v1_GetRegionalSnapshotRequest: + type: object + properties: + regionId: + type: string + maxLength: 32 + minLength: 1 + pattern: ^[a-z][a-z0-9]*(-[a-z0-9]+)*$ + description: |- + Display region id (e.g. "mena", "east-asia", "europe"). See shared/geography.js. + Kebab-case: lowercase alphanumeric groups separated by single hyphens, no + trailing or consecutive hyphens. + required: + - regionId + description: |- + GetRegionalSnapshotRequest asks for the latest persisted RegionalSnapshot + for a given region. See shared/geography.ts for the canonical region ids. + worldmonitor_intelligence_v1_GetRegionalSnapshotResponse: + type: object + properties: + snapshot: + $ref: '#/components/schemas/worldmonitor_intelligence_v1_RegionalSnapshot' + description: |- + GetRegionalSnapshotResponse returns the latest RegionalSnapshot for the + requested region. The snapshot is written by scripts/seed-regional-snapshots.mjs + on a 6h cron; this handler only reads canonical state. + worldmonitor_intelligence_v1_RegionalSnapshot: + type: object + properties: + regionId: + type: string + generatedAt: + type: integer + format: int64 + description: 'Warning: Values > 2^53 may lose precision in JavaScript' + meta: + $ref: '#/components/schemas/worldmonitor_intelligence_v1_SnapshotMeta' + regime: + $ref: '#/components/schemas/worldmonitor_intelligence_v1_RegimeState' + balance: + $ref: '#/components/schemas/worldmonitor_intelligence_v1_BalanceVector' + actors: + type: array + items: + $ref: '#/components/schemas/worldmonitor_intelligence_v1_ActorState' + leverageEdges: + type: array + items: + $ref: '#/components/schemas/worldmonitor_intelligence_v1_LeverageEdge' + scenarioSets: + type: array + items: + $ref: '#/components/schemas/worldmonitor_intelligence_v1_ScenarioSet' + transmissionPaths: + type: array + items: + $ref: '#/components/schemas/worldmonitor_intelligence_v1_TransmissionPath' + triggers: + $ref: '#/components/schemas/worldmonitor_intelligence_v1_TriggerLadder' + mobility: + $ref: '#/components/schemas/worldmonitor_intelligence_v1_MobilityState' + evidence: + type: array + items: + $ref: '#/components/schemas/worldmonitor_intelligence_v1_EvidenceItem' + narrative: + $ref: '#/components/schemas/worldmonitor_intelligence_v1_RegionalNarrative' + description: |- + RegionalSnapshot is the canonical intelligence object for one region. + See docs/internal/pro-regional-intelligence-upgrade.md for the full spec + and shared/regions.types.d.ts for the authoritative TypeScript contract. + worldmonitor_intelligence_v1_SnapshotMeta: + type: object + properties: + snapshotId: + type: string + modelVersion: + type: string + scoringVersion: + type: string + geographyVersion: + type: string + snapshotConfidence: + type: number + format: double + missingInputs: + type: array + items: + type: string + staleInputs: + type: array + items: + type: string + validUntil: + type: integer + format: int64 + description: 'Warning: Values > 2^53 may lose precision in JavaScript' + triggerReason: + type: string + description: |- + trigger_reason: scheduled_6h | regime_shift | trigger_activation | + corridor_break | leverage_shift + narrativeProvider: + type: string + narrativeModel: + type: string + description: |- + SnapshotMeta carries the trust trail (versions, confidence, input freshness, + narrative provenance, idempotency id). + worldmonitor_intelligence_v1_RegimeState: + type: object + properties: + label: + type: string + description: |- + label: calm | stressed_equilibrium | coercive_stalemate | + fragmentation_risk | managed_deescalation | escalation_ladder + previousLabel: + type: string + transitionedAt: + type: integer + format: int64 + description: 'Warning: Values > 2^53 may lose precision in JavaScript' + transitionDriver: + type: string + description: RegimeState captures the current regime label and transition history. + worldmonitor_intelligence_v1_BalanceVector: + type: object + properties: + coercivePressure: + type: number + format: double + description: Pressures (high = bad) + domesticFragility: + type: number + format: double + capitalStress: + type: number + format: double + energyVulnerability: + type: number + format: double + allianceCohesion: + type: number + format: double + description: Buffers (high = good) + maritimeAccess: + type: number + format: double + energyLeverage: + type: number + format: double + netBalance: + type: number + format: double + description: 'Derived: mean(buffers) - mean(pressures), range [-1, +1]' + pressures: + type: array + items: + $ref: '#/components/schemas/worldmonitor_intelligence_v1_BalanceDriver' + buffers: + type: array + items: + $ref: '#/components/schemas/worldmonitor_intelligence_v1_BalanceDriver' + description: |- + BalanceVector is the 7-axis regional balance score with pressures/buffers + split. See docs/internal/pro-regional-intelligence-appendix-scoring.md for + the per-axis formulas. + worldmonitor_intelligence_v1_BalanceDriver: + type: object + properties: + axis: + type: string + description: + type: string + magnitude: + type: number + format: double + evidenceIds: + type: array + items: + type: string + orientation: + type: string + description: 'orientation: "pressure" | "buffer"' + description: BalanceDriver is one contributor to an axis score. Links back to evidence. + worldmonitor_intelligence_v1_ActorState: + type: object + properties: + actorId: + type: string + name: + type: string + role: + type: string + description: 'role: aggressor | stabilizer | swing | broker' + leverageDomains: + type: array + items: + type: string + description: 'leverage_domains: energy | military | diplomatic | economic | maritime' + leverageScore: + type: number + format: double + delta: + type: number + format: double + evidenceIds: + type: array + items: + type: string + description: ActorState is one geopolitical actor's leverage score in the region. + worldmonitor_intelligence_v1_LeverageEdge: + type: object + properties: + fromActorId: + type: string + toActorId: + type: string + mechanism: + type: string + description: 'mechanism: sanctions | naval_posture | energy_supply | alliance_shift | trade_friction' + strength: + type: number + format: double + evidenceIds: + type: array + items: + type: string + description: LeverageEdge is a directed influence relationship between two actors. + worldmonitor_intelligence_v1_ScenarioSet: + type: object + properties: + horizon: + type: string + description: 'horizon: 24h | 7d | 30d' + lanes: + type: array + items: + $ref: '#/components/schemas/worldmonitor_intelligence_v1_ScenarioLane' + description: |- + ScenarioSet bundles scenario lanes for one time horizon. Lane probabilities + sum to 1.0 within a set. + worldmonitor_intelligence_v1_ScenarioLane: + type: object + properties: + name: + type: string + description: 'name: base | escalation | containment | fragmentation' + probability: + type: number + format: double + triggerIds: + type: array + items: + type: string + consequences: + type: array + items: + type: string + transmissions: + type: array + items: + $ref: '#/components/schemas/worldmonitor_intelligence_v1_TransmissionPath' + description: ScenarioLane is one outcome branch within a horizon set. + worldmonitor_intelligence_v1_TransmissionPath: + type: object + properties: + start: + type: string + mechanism: + type: string + end: + type: string + severity: + type: string + description: 'severity: critical | high | medium | low' + corridorId: + type: string + confidence: + type: number + format: double + latencyHours: + type: integer + format: int32 + impactedAssetClass: + type: string + description: 'impacted_asset_class: crude | lng | container | fx | equity | agri | metals | ...' + impactedRegions: + type: array + items: + type: string + magnitudeLow: + type: number + format: double + magnitudeHigh: + type: number + format: double + magnitudeUnit: + type: string + description: 'magnitude_unit: usd_bbl | pct | usd_teu | basis_points | ...' + templateId: + type: string + templateVersion: + type: string + description: |- + TransmissionPath describes how a regional event propagates to markets, + logistics, mobility, or other domains. Typed for ranking and calibration. + worldmonitor_intelligence_v1_TriggerLadder: + type: object + properties: + active: + type: array + items: + $ref: '#/components/schemas/worldmonitor_intelligence_v1_Trigger' + watching: + type: array + items: + $ref: '#/components/schemas/worldmonitor_intelligence_v1_Trigger' + dormant: + type: array + items: + $ref: '#/components/schemas/worldmonitor_intelligence_v1_Trigger' + description: TriggerLadder buckets triggers by activation state. + worldmonitor_intelligence_v1_Trigger: + type: object + properties: + id: + type: string + description: + type: string + threshold: + $ref: '#/components/schemas/worldmonitor_intelligence_v1_TriggerThreshold' + activated: + type: boolean + activatedAt: + type: integer + format: int64 + description: 'Warning: Values > 2^53 may lose precision in JavaScript' + scenarioLane: + type: string + description: 'scenario_lane: base | escalation | containment | fragmentation' + evidenceIds: + type: array + items: + type: string + description: Trigger is a structured threshold assertion against a named metric. + worldmonitor_intelligence_v1_TriggerThreshold: + type: object + properties: + metric: + type: string + operator: + type: string + description: 'operator: gt | gte | lt | lte | delta_gt | delta_lt' + value: + type: number + format: double + windowMinutes: + type: integer + format: int32 + baseline: + type: string + description: 'baseline: trailing_7d | trailing_30d | fixed' + description: |- + TriggerThreshold defines the metric/operator/value/window/baseline for + deterministic trigger evaluation. + worldmonitor_intelligence_v1_MobilityState: + type: object + properties: + airspace: + type: array + items: + $ref: '#/components/schemas/worldmonitor_intelligence_v1_AirspaceStatus' + flightCorridors: + type: array + items: + $ref: '#/components/schemas/worldmonitor_intelligence_v1_FlightCorridorStress' + airports: + type: array + items: + $ref: '#/components/schemas/worldmonitor_intelligence_v1_AirportNodeStatus' + rerouteIntensity: + type: number + format: double + notamClosures: + type: array + items: + type: string + description: |- + MobilityState captures airspace, flight corridor, and airport node status + for the region. Phase 0 ships empty; Phase 2 wires the data plane. + worldmonitor_intelligence_v1_AirspaceStatus: + type: object + properties: + airspaceId: + type: string + status: + type: string + description: 'status: open | restricted | closed' + reason: + type: string + description: AirspaceStatus captures FIR-level airspace state. + worldmonitor_intelligence_v1_FlightCorridorStress: + type: object + properties: + corridor: + type: string + stressLevel: + type: number + format: double + reroutedFlights24h: + type: integer + format: int32 + description: FlightCorridorStress captures per-corridor reroute intensity. + worldmonitor_intelligence_v1_AirportNodeStatus: + type: object + properties: + icao: + type: string + name: + type: string + status: + type: string + description: 'status: normal | disrupted | closed' + disruptionReason: + type: string + description: AirportNodeStatus captures airport-level disruption state. + worldmonitor_intelligence_v1_EvidenceItem: + type: object + properties: + id: + type: string + type: + type: string + description: |- + type: vessel_track | flight_surge | news_headline | cii_spike | + chokepoint_status | sanctions_move | market_signal | mobility_disruption + source: + type: string + description: 'source: AIS | ADSB | GDELT | ACLED | Yahoo | OREF | NOTAM | ...' + summary: + type: string + confidence: + type: number + format: double + observedAt: + type: integer + format: int64 + description: 'Warning: Values > 2^53 may lose precision in JavaScript' + theater: + type: string + corridor: + type: string + description: |- + EvidenceItem is one upstream data point linked from balance drivers, + narrative sections, and triggers. + worldmonitor_intelligence_v1_RegionalNarrative: + type: object + properties: + situation: + $ref: '#/components/schemas/worldmonitor_intelligence_v1_NarrativeSection' + balanceAssessment: + $ref: '#/components/schemas/worldmonitor_intelligence_v1_NarrativeSection' + outlook24h: + $ref: '#/components/schemas/worldmonitor_intelligence_v1_NarrativeSection' + outlook7d: + $ref: '#/components/schemas/worldmonitor_intelligence_v1_NarrativeSection' + outlook30d: + $ref: '#/components/schemas/worldmonitor_intelligence_v1_NarrativeSection' + watchItems: + type: array + items: + $ref: '#/components/schemas/worldmonitor_intelligence_v1_NarrativeSection' + description: |- + RegionalNarrative is the LLM-synthesized narrative layer. Every section + links back to evidence via evidence_ids. + worldmonitor_intelligence_v1_NarrativeSection: + type: object + properties: + text: + type: string + evidenceIds: + type: array + items: + type: string + description: NarrativeSection is one block of narrative text plus its supporting evidence. + worldmonitor_intelligence_v1_GetRegimeHistoryRequest: + type: object + properties: + regionId: + type: string + maxLength: 32 + minLength: 1 + pattern: ^[a-z][a-z0-9]*(-[a-z0-9]+)*$ + description: |- + Display region id (e.g. "mena", "east-asia", "europe"). See shared/geography.js. + Kebab-case: lowercase alphanumeric groups separated by single hyphens, no + trailing or consecutive hyphens. + limit: + type: integer + maximum: 100 + minimum: 0 + format: int32 + description: |- + Optional cap on how many entries to return. Defaults to 50 server-side + when omitted or <= 0. Hard cap enforced by the handler at 100 (= the + writer-side LTRIM cap in regime-history.mjs). + required: + - regionId + description: |- + GetRegimeHistoryRequest asks for the recent regime transition log for a + region. Returns newest-first. Phase 3 PR1 — see + scripts/regional-snapshot/regime-history.mjs for the writer that + populates the underlying Redis list on every regime change. + worldmonitor_intelligence_v1_GetRegimeHistoryResponse: + type: object + properties: + transitions: + type: array + items: + $ref: '#/components/schemas/worldmonitor_intelligence_v1_RegimeTransition' + description: |- + GetRegimeHistoryResponse returns the region's regime transition log + newest-first. The list is append-only from the seed writer's perspective: + only diffs with regime_changed set produce an entry, so this is a pure + transition stream (no steady-state noise). + worldmonitor_intelligence_v1_RegimeTransition: + type: object + properties: + regionId: + type: string + label: + type: string + description: Current regime label (the label the region just moved INTO). + previousLabel: + type: string + description: |- + Previous regime label (the label the region was in before). Empty for + the first-ever recorded transition for a region. + transitionedAt: + type: integer + format: int64 + description: |- + Unix ms when the transition was recorded. Mirrors + snapshot.regime.transitioned_at when available.. Warning: Values > 2^53 may lose precision in JavaScript + transitionDriver: + type: string + description: |- + Free-text driver string from the seed writer (e.g. "cross_source_surge"). + May be empty. + snapshotId: + type: string + description: |- + Snapshot id that materialized this transition. Points back to the + full snapshot via intelligence:snapshot-by-id:v1:{snapshot_id}. + description: |- + RegimeTransition is a single recorded regime change moment. One of these + lands in the log each time diffRegionalSnapshot() reports regime_changed. + worldmonitor_intelligence_v1_GetRegionalBriefRequest: + type: object + properties: + regionId: + type: string + maxLength: 32 + minLength: 1 + pattern: ^[a-z][a-z0-9]*(-[a-z0-9]+)*$ + required: + - regionId + worldmonitor_intelligence_v1_GetRegionalBriefResponse: + type: object + properties: + brief: + $ref: '#/components/schemas/worldmonitor_intelligence_v1_RegionalBrief' + worldmonitor_intelligence_v1_RegionalBrief: + type: object + properties: + regionId: + type: string + generatedAt: + type: integer + format: int64 + description: 'Warning: Values > 2^53 may lose precision in JavaScript' + periodStart: + type: integer + format: int64 + description: 'Warning: Values > 2^53 may lose precision in JavaScript' + periodEnd: + type: integer + format: int64 + description: 'Warning: Values > 2^53 may lose precision in JavaScript' + situationRecap: + type: string + regimeTrajectory: + type: string + keyDevelopments: + type: array + items: + type: string + riskOutlook: + type: string + provider: + type: string + model: + type: string + description: |- + RegionalBrief is a weekly LLM-synthesized intelligence summary for one + region. Written by scripts/seed-regional-briefs.mjs on a weekly cron. + worldmonitor_leads_v1_SubmitContactRequest: + type: object + properties: + email: + type: string + name: + type: string + organization: + type: string + phone: + type: string + message: + type: string + source: + type: string + website: + type: string + description: Honeypot — bots auto-fill this hidden field; real submissions leave it empty. + turnstileToken: + type: string + description: Cloudflare Turnstile token proving the submitter is human. + description: SubmitContactRequest carries an enterprise contact form submission. + worldmonitor_leads_v1_SubmitContactResponse: + type: object + properties: + status: + type: string + description: Always "sent" on success. + emailSent: + type: boolean + description: True when the Resend notification to ops was delivered. + description: SubmitContactResponse reports the outcome of storing the lead and notifying ops. + worldmonitor_leads_v1_RegisterInterestRequest: + type: object + properties: + email: + type: string + source: + type: string + appVersion: + type: string + referredBy: + type: string + website: + type: string + description: Honeypot — bots auto-fill this hidden field; real submissions leave it empty. + turnstileToken: + type: string + description: Cloudflare Turnstile token. Desktop sources bypass Turnstile; see handler. + description: RegisterInterestRequest carries a Pro-waitlist signup. + worldmonitor_leads_v1_RegisterInterestResponse: + type: object + properties: + status: + type: string + description: '"registered" for a new signup; "already_registered" for a returning email.' + referralCode: + type: string + description: Stable referral code for this email. + referralCount: + type: integer + format: int32 + description: Number of signups credited to this email. + position: + type: integer + format: int32 + description: Waitlist position at registration time. Present only when status == "registered". + emailSuppressed: + type: boolean + description: True when the email is on the suppression list (prior bounce) and no confirmation was sent. + description: RegisterInterestResponse mirrors the Convex registerInterest:register return shape. + worldmonitor_maritime_v1_GetVesselSnapshotRequest: + type: object + properties: + neLat: + type: number + format: double + description: North-east corner latitude of bounding box. + neLon: + type: number + format: double + description: North-east corner longitude of bounding box. + swLat: + type: number + format: double + description: South-west corner latitude of bounding box. + swLon: + type: number + format: double + description: South-west corner longitude of bounding box. + includeCandidates: + type: boolean + description: |- + When true, populate VesselSnapshot.candidate_reports with per-vessel + position reports. Clients with no position callbacks should leave this + false to keep responses small. + description: GetVesselSnapshotRequest specifies filters for the vessel snapshot. + worldmonitor_maritime_v1_GetVesselSnapshotResponse: + type: object + properties: + snapshot: + $ref: '#/components/schemas/worldmonitor_maritime_v1_VesselSnapshot' + description: GetVesselSnapshotResponse contains the vessel traffic snapshot. + worldmonitor_maritime_v1_VesselSnapshot: + type: object + properties: + snapshotAt: + type: integer + format: int64 + description: 'Snapshot timestamp, as Unix epoch milliseconds.. Warning: Values > 2^53 may lose precision in JavaScript' + densityZones: + type: array + items: + $ref: '#/components/schemas/worldmonitor_maritime_v1_AisDensityZone' + disruptions: + type: array + items: + $ref: '#/components/schemas/worldmonitor_maritime_v1_AisDisruption' + sequence: + type: integer + format: int32 + description: |- + Monotonic sequence number from the relay. Clients use this to detect stale + responses during polling. + status: + $ref: '#/components/schemas/worldmonitor_maritime_v1_AisSnapshotStatus' + candidateReports: + type: array + items: + $ref: '#/components/schemas/worldmonitor_maritime_v1_SnapshotCandidateReport' + description: VesselSnapshot represents a point-in-time view of civilian AIS vessel data. + worldmonitor_maritime_v1_AisDensityZone: + type: object + properties: + id: + type: string + minLength: 1 + description: Zone identifier. + name: + type: string + description: Zone name (e.g., "Strait of Malacca"). + location: + $ref: '#/components/schemas/worldmonitor_core_v1_GeoCoordinates' + intensity: + type: number + maximum: 100 + minimum: 0 + format: double + description: Traffic intensity score (0-100). + deltaPct: + type: number + format: double + description: Change from baseline as a percentage. + shipsPerDay: + type: integer + format: int32 + description: Estimated ships per day. + note: + type: string + description: Analyst note. + required: + - id + description: AisDensityZone represents a zone of concentrated vessel traffic. + worldmonitor_maritime_v1_AisDisruption: + type: object + properties: + id: + type: string + minLength: 1 + description: Disruption identifier. + name: + type: string + description: Descriptive name. + type: + type: string + enum: + - AIS_DISRUPTION_TYPE_UNSPECIFIED + - AIS_DISRUPTION_TYPE_GAP_SPIKE + - AIS_DISRUPTION_TYPE_CHOKEPOINT_CONGESTION + description: |- + AisDisruptionType represents the type of AIS tracking anomaly. + Maps to TS union: 'gap_spike' | 'chokepoint_congestion'. + location: + $ref: '#/components/schemas/worldmonitor_core_v1_GeoCoordinates' + severity: + type: string + enum: + - AIS_DISRUPTION_SEVERITY_UNSPECIFIED + - AIS_DISRUPTION_SEVERITY_LOW + - AIS_DISRUPTION_SEVERITY_ELEVATED + - AIS_DISRUPTION_SEVERITY_HIGH + description: AisDisruptionSeverity represents the severity of an AIS disruption. + changePct: + type: number + format: double + description: Percentage change from normal. + windowHours: + type: integer + format: int32 + description: Analysis window in hours. + darkShips: + type: integer + format: int32 + description: Number of dark ships (AIS off) detected. + vesselCount: + type: integer + format: int32 + description: Number of vessels in the affected area. + region: + type: string + description: Region name. + description: + type: string + description: Human-readable description. + required: + - id + description: AisDisruption represents a detected anomaly in AIS vessel tracking data. + worldmonitor_maritime_v1_AisSnapshotStatus: + type: object + properties: + connected: + type: boolean + description: Whether the relay WebSocket is connected to the AIS provider. + vessels: + type: integer + format: int32 + description: Number of vessels currently tracked by the relay. + messages: + type: integer + format: int32 + description: Total AIS messages processed in the current session. + description: AisSnapshotStatus reports relay health at the time of the snapshot. + worldmonitor_maritime_v1_SnapshotCandidateReport: + type: object + properties: + mmsi: + type: string + description: Maritime Mobile Service Identity. + name: + type: string + description: Vessel name (may be empty if unknown). + lat: + type: number + format: double + description: Latitude in decimal degrees. + lon: + type: number + format: double + description: Longitude in decimal degrees. + shipType: + type: integer + format: int32 + description: AIS ship type code (0 if unknown). + heading: + type: integer + format: int32 + description: Heading in degrees (0-359, or 511 for unavailable). + speed: + type: number + format: double + description: Speed over ground in knots. + course: + type: integer + format: int32 + description: Course over ground in degrees. + timestamp: + type: integer + format: int64 + description: 'Report timestamp, as Unix epoch milliseconds.. Warning: Values > 2^53 may lose precision in JavaScript' + description: |- + SnapshotCandidateReport is a per-vessel position report attached to a + snapshot. Used to drive the client-side position callback system. + worldmonitor_maritime_v1_ListNavigationalWarningsRequest: + type: object + properties: + pageSize: + type: integer + format: int32 + description: Maximum items per page (1-100). + cursor: + type: string + description: Cursor for next page. + area: + type: string + description: Optional area filter (e.g., "NAVAREA IV", "Persian Gulf"). + description: ListNavigationalWarningsRequest specifies filters for retrieving NGA warnings. + worldmonitor_maritime_v1_ListNavigationalWarningsResponse: + type: object + properties: + warnings: + type: array + items: + $ref: '#/components/schemas/worldmonitor_maritime_v1_NavigationalWarning' + pagination: + $ref: '#/components/schemas/worldmonitor_core_v1_PaginationResponse' + description: ListNavigationalWarningsResponse contains navigational warnings matching the request. + worldmonitor_maritime_v1_NavigationalWarning: + type: object + properties: + id: + type: string + description: Warning identifier. + title: + type: string + description: Warning title. + text: + type: string + description: Full warning text. + area: + type: string + description: Geographic area affected. + location: + $ref: '#/components/schemas/worldmonitor_core_v1_GeoCoordinates' + issuedAt: + type: integer + format: int64 + description: 'Warning issue date, as Unix epoch milliseconds.. Warning: Values > 2^53 may lose precision in JavaScript' + expiresAt: + type: integer + format: int64 + description: 'Warning expiry date, as Unix epoch milliseconds.. Warning: Values > 2^53 may lose precision in JavaScript' + authority: + type: string + description: Warning source authority. + description: NavigationalWarning represents a maritime safety warning from NGA. + worldmonitor_market_v1_ListMarketQuotesRequest: + type: object + properties: + symbols: + type: array + items: + type: string + description: Ticker symbols to retrieve (e.g., ["AAPL", "^GSPC"]). Empty returns defaults. + description: ListMarketQuotesRequest specifies which stock/index symbols to retrieve. + worldmonitor_market_v1_ListMarketQuotesResponse: + type: object + properties: + quotes: + type: array + items: + $ref: '#/components/schemas/worldmonitor_market_v1_MarketQuote' + finnhubSkipped: + type: boolean + description: True when the Finnhub API key is not configured and stock quotes were skipped. + skipReason: + type: string + description: Human-readable reason when Finnhub was skipped (e.g., "FINNHUB_API_KEY not configured"). + rateLimited: + type: boolean + description: True when the upstream API rate-limited the request. + description: ListMarketQuotesResponse contains stock and index quotes. + worldmonitor_market_v1_MarketQuote: + type: object + properties: + symbol: + type: string + minLength: 1 + description: Ticker symbol (e.g., "AAPL", "^GSPC"). + name: + type: string + description: Human-readable name. + display: + type: string + description: Display label. + price: + type: number + format: double + description: Current price. + change: + type: number + format: double + description: Percentage change from previous close. + sparkline: + type: array + items: + type: number + format: double + description: Sparkline data points (recent price history). + required: + - symbol + description: MarketQuote represents a stock or index quote from Finnhub or Yahoo Finance. + worldmonitor_market_v1_ListCryptoQuotesRequest: + type: object + properties: + ids: + type: array + items: + type: string + description: Cryptocurrency IDs to retrieve (CoinGecko IDs). Empty returns defaults. + description: ListCryptoQuotesRequest specifies which cryptocurrencies to retrieve. + worldmonitor_market_v1_ListCryptoQuotesResponse: + type: object + properties: + quotes: + type: array + items: + $ref: '#/components/schemas/worldmonitor_market_v1_CryptoQuote' + description: ListCryptoQuotesResponse contains cryptocurrency quotes. + worldmonitor_market_v1_CryptoQuote: + type: object + properties: + name: + type: string + description: Cryptocurrency name (e.g., "Bitcoin"). + symbol: + type: string + minLength: 1 + description: Ticker symbol (e.g., "BTC"). + price: + type: number + format: double + description: Current price in USD. + change: + type: number + format: double + description: 24-hour percentage change. + sparkline: + type: array + items: + type: number + format: double + description: Sparkline data points (recent price history). + change7d: + type: number + format: double + description: 7-day percentage change. + required: + - symbol + description: CryptoQuote represents a cryptocurrency quote from CoinGecko. + worldmonitor_market_v1_ListCommodityQuotesRequest: + type: object + properties: + symbols: + type: array + items: + type: string + description: Commodity symbols to retrieve (Yahoo symbols). Empty returns defaults. + description: ListCommodityQuotesRequest specifies which commodities to retrieve. + worldmonitor_market_v1_ListCommodityQuotesResponse: + type: object + properties: + quotes: + type: array + items: + $ref: '#/components/schemas/worldmonitor_market_v1_CommodityQuote' + description: ListCommodityQuotesResponse contains commodity quotes. + worldmonitor_market_v1_CommodityQuote: + type: object + properties: + symbol: + type: string + minLength: 1 + description: Commodity symbol (e.g., "CL=F" for crude oil). + name: + type: string + description: Human-readable name. + display: + type: string + description: Display label. + price: + type: number + format: double + description: Current price. + change: + type: number + format: double + description: Percentage change from previous close. + sparkline: + type: array + items: + type: number + format: double + description: Sparkline data points. + required: + - symbol + description: CommodityQuote represents a commodity price quote from Yahoo Finance. + worldmonitor_market_v1_GetSectorSummaryRequest: + type: object + properties: + period: + type: string + description: Time period for performance calculation (e.g., "1d", "1w", "1m"). Defaults to "1d". + description: GetSectorSummaryRequest specifies parameters for retrieving sector performance. + worldmonitor_market_v1_GetSectorSummaryResponse: + type: object + properties: + sectors: + type: array + items: + $ref: '#/components/schemas/worldmonitor_market_v1_SectorPerformance' + description: GetSectorSummaryResponse contains sector performance data. + worldmonitor_market_v1_SectorPerformance: + type: object + properties: + symbol: + type: string + minLength: 1 + description: Sector symbol. + name: + type: string + description: Sector name. + change: + type: number + format: double + description: Percentage change over the measured period. + required: + - symbol + description: SectorPerformance represents performance data for a market sector. + worldmonitor_market_v1_ListStablecoinMarketsRequest: + type: object + properties: + coins: + type: array + items: + type: string + description: CoinGecko IDs to retrieve (e.g. "tether,usd-coin"). Empty returns defaults. + description: ListStablecoinMarketsRequest specifies which stablecoins to retrieve. + worldmonitor_market_v1_ListStablecoinMarketsResponse: + type: object + properties: + timestamp: + type: string + description: Timestamp of the data fetch (ISO 8601). + summary: + $ref: '#/components/schemas/worldmonitor_market_v1_StablecoinSummary' + stablecoins: + type: array + items: + $ref: '#/components/schemas/worldmonitor_market_v1_Stablecoin' + description: ListStablecoinMarketsResponse contains stablecoin market data. + worldmonitor_market_v1_StablecoinSummary: + type: object + properties: + totalMarketCap: + type: number + format: double + description: Total market cap across all queried stablecoins. + totalVolume24h: + type: number + format: double + description: Total 24h volume across all queried stablecoins. + coinCount: + type: integer + format: int32 + description: Number of stablecoins returned. + depeggedCount: + type: integer + format: int32 + description: Number of stablecoins in DEPEGGED state. + healthStatus: + type: string + description: 'Overall health: "HEALTHY", "CAUTION", or "WARNING".' + description: StablecoinSummary contains aggregate stablecoin market stats. + worldmonitor_market_v1_Stablecoin: + type: object + properties: + id: + type: string + minLength: 1 + description: CoinGecko ID. + symbol: + type: string + minLength: 1 + description: Ticker symbol (e.g. "USDT"). + name: + type: string + description: Human-readable name. + price: + type: number + minimum: 0 + format: double + description: Current price in USD. + deviation: + type: number + format: double + description: Deviation from $1.00 peg, as a percentage. + pegStatus: + type: string + description: 'Peg status: "ON PEG", "SLIGHT DEPEG", or "DEPEGGED".' + marketCap: + type: number + format: double + description: Market capitalization in USD. + volume24h: + type: number + format: double + description: 24-hour trading volume in USD. + change24h: + type: number + format: double + description: 24-hour price change percentage. + change7d: + type: number + format: double + description: 7-day price change percentage. + image: + type: string + description: Coin image URL. + required: + - id + - symbol + description: Stablecoin represents a single stablecoin with peg health data. + worldmonitor_market_v1_ListEtfFlowsRequest: + type: object + description: ListEtfFlowsRequest is empty; the handler uses a fixed list of BTC spot ETFs. + worldmonitor_market_v1_ListEtfFlowsResponse: + type: object + properties: + timestamp: + type: string + description: Timestamp of the data fetch (ISO 8601). + summary: + $ref: '#/components/schemas/worldmonitor_market_v1_EtfFlowsSummary' + etfs: + type: array + items: + $ref: '#/components/schemas/worldmonitor_market_v1_EtfFlow' + rateLimited: + type: boolean + description: True when the upstream API rate-limited the request. + description: ListEtfFlowsResponse contains BTC spot ETF flow data. + worldmonitor_market_v1_EtfFlowsSummary: + type: object + properties: + etfCount: + type: integer + format: int32 + description: Number of ETFs with data. + totalVolume: + type: integer + format: int64 + description: 'Total volume across all ETFs.. Warning: Values > 2^53 may lose precision in JavaScript' + totalEstFlow: + type: integer + format: int64 + description: 'Total estimated flow across all ETFs.. Warning: Values > 2^53 may lose precision in JavaScript' + netDirection: + type: string + description: 'Net direction: "NET INFLOW", "NET OUTFLOW", or "NEUTRAL".' + inflowCount: + type: integer + format: int32 + description: Number of ETFs with inflow. + outflowCount: + type: integer + format: int32 + description: Number of ETFs with outflow. + description: EtfFlowsSummary contains aggregate ETF flow stats. + worldmonitor_market_v1_EtfFlow: + type: object + properties: + ticker: + type: string + minLength: 1 + description: Ticker symbol (e.g. "IBIT"). + issuer: + type: string + description: Fund issuer (e.g. "BlackRock"). + price: + type: number + format: double + description: Latest closing price. + priceChange: + type: number + format: double + description: Day-over-day price change percentage. + volume: + type: integer + format: int64 + description: 'Latest daily volume.. Warning: Values > 2^53 may lose precision in JavaScript' + avgVolume: + type: integer + format: int64 + description: 'Average volume over prior days.. Warning: Values > 2^53 may lose precision in JavaScript' + volumeRatio: + type: number + format: double + description: Volume ratio (latest / average). + direction: + type: string + description: 'Flow direction: "inflow", "outflow", or "neutral".' + estFlow: + type: integer + format: int64 + description: 'Estimated dollar flow magnitude.. Warning: Values > 2^53 may lose precision in JavaScript' + required: + - ticker + description: EtfFlow represents a single ETF with estimated flow data. + worldmonitor_market_v1_GetCountryStockIndexRequest: + type: object + properties: + countryCode: + type: string + pattern: ^[A-Z]{2}$ + description: ISO 3166-1 alpha-2 country code (e.g., "US", "GB", "JP"). + required: + - countryCode + description: GetCountryStockIndexRequest specifies which country's stock index to retrieve. + worldmonitor_market_v1_GetCountryStockIndexResponse: + type: object + properties: + available: + type: boolean + description: Whether stock index data is available for this country. + code: + type: string + description: ISO 3166-1 alpha-2 country code. + symbol: + type: string + description: Ticker symbol (e.g., "^GSPC"). + indexName: + type: string + description: Index name (e.g., "S&P 500"). + price: + type: number + format: double + description: Latest closing price. + weekChangePercent: + type: number + format: double + description: Weekly change percentage. + currency: + type: string + description: Currency of the index. + fetchedAt: + type: string + description: When the data was fetched (ISO 8601). + description: GetCountryStockIndexResponse contains the country's primary stock index data. + worldmonitor_market_v1_ListGulfQuotesRequest: + type: object + worldmonitor_market_v1_ListGulfQuotesResponse: + type: object + properties: + quotes: + type: array + items: + $ref: '#/components/schemas/worldmonitor_market_v1_GulfQuote' + rateLimited: + type: boolean + worldmonitor_market_v1_GulfQuote: + type: object + properties: + symbol: + type: string + name: + type: string + flag: + type: string + country: + type: string + type: + type: string + price: + type: number + format: double + change: + type: number + format: double + sparkline: + type: array + items: + type: number + format: double + description: GulfQuote represents a Gulf region market quote (index, currency, or oil). + worldmonitor_market_v1_AnalyzeStockRequest: + type: object + properties: + symbol: + type: string + maxLength: 32 + minLength: 1 + name: + type: string + maxLength: 120 + includeNews: + type: boolean + required: + - symbol + worldmonitor_market_v1_AnalyzeStockResponse: + type: object + properties: + available: + type: boolean + symbol: + type: string + name: + type: string + display: + type: string + currency: + type: string + currentPrice: + type: number + format: double + changePercent: + type: number + format: double + signalScore: + type: number + format: double + signal: + type: string + trendStatus: + type: string + volumeStatus: + type: string + macdStatus: + type: string + rsiStatus: + type: string + summary: + type: string + action: + type: string + confidence: + type: string + technicalSummary: + type: string + newsSummary: + type: string + whyNow: + type: string + bullishFactors: + type: array + items: + type: string + riskFactors: + type: array + items: + type: string + supportLevels: + type: array + items: + type: number + format: double + resistanceLevels: + type: array + items: + type: number + format: double + headlines: + type: array + items: + $ref: '#/components/schemas/worldmonitor_market_v1_StockAnalysisHeadline' + ma5: + type: number + format: double + ma10: + type: number + format: double + ma20: + type: number + format: double + ma60: + type: number + format: double + biasMa5: + type: number + format: double + biasMa10: + type: number + format: double + biasMa20: + type: number + format: double + volumeRatio5d: + type: number + format: double + rsi12: + type: number + format: double + macdDif: + type: number + format: double + macdDea: + type: number + format: double + macdBar: + type: number + format: double + provider: + type: string + model: + type: string + fallback: + type: boolean + newsSearched: + type: boolean + generatedAt: + type: string + analysisId: + type: string + analysisAt: + type: integer + format: int64 + description: 'Warning: Values > 2^53 may lose precision in JavaScript' + stopLoss: + type: number + format: double + takeProfit: + type: number + format: double + engineVersion: + type: string + analystConsensus: + $ref: '#/components/schemas/worldmonitor_market_v1_AnalystConsensus' + priceTarget: + $ref: '#/components/schemas/worldmonitor_market_v1_PriceTarget' + recentUpgrades: + type: array + items: + $ref: '#/components/schemas/worldmonitor_market_v1_UpgradeDowngrade' + dividendYield: + type: number + format: double + trailingAnnualDividendRate: + type: number + format: double + exDividendDate: + type: integer + format: int64 + description: 'Warning: Values > 2^53 may lose precision in JavaScript' + payoutRatio: + type: number + format: double + dividendFrequency: + type: string + dividendCagr: + type: number + format: double + worldmonitor_market_v1_StockAnalysisHeadline: + type: object + properties: + title: + type: string + source: + type: string + link: + type: string + publishedAt: + type: integer + format: int64 + description: 'Warning: Values > 2^53 may lose precision in JavaScript' + worldmonitor_market_v1_AnalystConsensus: + type: object + properties: + strongBuy: + type: integer + format: int32 + buy: + type: integer + format: int32 + hold: + type: integer + format: int32 + sell: + type: integer + format: int32 + strongSell: + type: integer + format: int32 + total: + type: integer + format: int32 + period: + type: string + worldmonitor_market_v1_PriceTarget: + type: object + properties: + high: + type: number + format: double + low: + type: number + format: double + mean: + type: number + format: double + median: + type: number + format: double + current: + type: number + format: double + numberOfAnalysts: + type: integer + format: int32 + worldmonitor_market_v1_UpgradeDowngrade: + type: object + properties: + firm: + type: string + toGrade: + type: string + fromGrade: + type: string + action: + type: string + epochGradeDate: + type: integer + format: int64 + description: 'Warning: Values > 2^53 may lose precision in JavaScript' + worldmonitor_market_v1_GetStockAnalysisHistoryRequest: + type: object + properties: + symbols: + type: array + items: + type: string + limitPerSymbol: + type: integer + maximum: 32 + minimum: 1 + format: int32 + includeNews: + type: boolean + worldmonitor_market_v1_GetStockAnalysisHistoryResponse: + type: object + properties: + items: + type: array + items: + $ref: '#/components/schemas/worldmonitor_market_v1_StockAnalysisHistoryItem' + worldmonitor_market_v1_StockAnalysisHistoryItem: + type: object + properties: + symbol: + type: string + snapshots: + type: array + items: + $ref: '#/components/schemas/worldmonitor_market_v1_AnalyzeStockResponse' + worldmonitor_market_v1_BacktestStockRequest: + type: object + properties: + symbol: + type: string + maxLength: 32 + minLength: 1 + name: + type: string + maxLength: 120 + evalWindowDays: + type: integer + maximum: 30 + minimum: 3 + format: int32 + required: + - symbol + worldmonitor_market_v1_BacktestStockResponse: + type: object + properties: + available: + type: boolean + symbol: + type: string + name: + type: string + display: + type: string + currency: + type: string + evalWindowDays: + type: integer + format: int32 + evaluationsRun: + type: integer + format: int32 + actionableEvaluations: + type: integer + format: int32 + winRate: + type: number + format: double + directionAccuracy: + type: number + format: double + avgSimulatedReturnPct: + type: number + format: double + cumulativeSimulatedReturnPct: + type: number + format: double + latestSignal: + type: string + latestSignalScore: + type: number + format: double + summary: + type: string + generatedAt: + type: string + evaluations: + type: array + items: + $ref: '#/components/schemas/worldmonitor_market_v1_BacktestStockEvaluation' + engineVersion: + type: string + worldmonitor_market_v1_BacktestStockEvaluation: + type: object + properties: + analysisAt: + type: integer + format: int64 + description: 'Warning: Values > 2^53 may lose precision in JavaScript' + signal: + type: string + signalScore: + type: number + format: double + entryPrice: + type: number + format: double + exitPrice: + type: number + format: double + simulatedReturnPct: + type: number + format: double + directionCorrect: + type: boolean + outcome: + type: string + stopLoss: + type: number + format: double + takeProfit: + type: number + format: double + analysisId: + type: string + worldmonitor_market_v1_ListStoredStockBacktestsRequest: + type: object + properties: + symbols: + type: array + items: + type: string + evalWindowDays: + type: integer + maximum: 30 + minimum: 3 + format: int32 + worldmonitor_market_v1_ListStoredStockBacktestsResponse: + type: object + properties: + items: + type: array + items: + $ref: '#/components/schemas/worldmonitor_market_v1_BacktestStockResponse' + worldmonitor_market_v1_ListCryptoSectorsRequest: + type: object + description: ListCryptoSectorsRequest retrieves crypto sector performance. + worldmonitor_market_v1_ListCryptoSectorsResponse: + type: object + properties: + sectors: + type: array + items: + $ref: '#/components/schemas/worldmonitor_market_v1_CryptoSector' + description: ListCryptoSectorsResponse contains crypto sector performance data. + worldmonitor_market_v1_CryptoSector: + type: object + properties: + id: + type: string + description: Sector identifier. + name: + type: string + description: Sector display name. + change: + type: number + format: double + description: Average 24h percentage change across sector tokens. + description: CryptoSector represents performance data for a crypto market sector. + worldmonitor_market_v1_ListDefiTokensRequest: + type: object + description: ListDefiTokensRequest retrieves DeFi token prices. + worldmonitor_market_v1_ListDefiTokensResponse: + type: object + properties: + tokens: + type: array + items: + $ref: '#/components/schemas/worldmonitor_market_v1_CryptoQuote' + description: ListDefiTokensResponse contains DeFi token price data. + worldmonitor_market_v1_ListAiTokensRequest: + type: object + description: ListAiTokensRequest retrieves AI crypto token prices. + worldmonitor_market_v1_ListAiTokensResponse: + type: object + properties: + tokens: + type: array + items: + $ref: '#/components/schemas/worldmonitor_market_v1_CryptoQuote' + description: ListAiTokensResponse contains AI token price data. + worldmonitor_market_v1_ListOtherTokensRequest: + type: object + description: ListOtherTokensRequest retrieves other/trending crypto token prices. + worldmonitor_market_v1_ListOtherTokensResponse: + type: object + properties: + tokens: + type: array + items: + $ref: '#/components/schemas/worldmonitor_market_v1_CryptoQuote' + description: ListOtherTokensResponse contains other token price data. + worldmonitor_market_v1_GetFearGreedIndexRequest: + type: object + worldmonitor_market_v1_GetFearGreedIndexResponse: + type: object + properties: + compositeScore: + type: number + format: double + compositeLabel: + type: string + previousScore: + type: number + format: double + seededAt: + type: string + sentiment: + $ref: '#/components/schemas/worldmonitor_market_v1_FearGreedCategory' + volatility: + $ref: '#/components/schemas/worldmonitor_market_v1_FearGreedCategory' + positioning: + $ref: '#/components/schemas/worldmonitor_market_v1_FearGreedCategory' + trend: + $ref: '#/components/schemas/worldmonitor_market_v1_FearGreedCategory' + breadth: + $ref: '#/components/schemas/worldmonitor_market_v1_FearGreedCategory' + momentum: + $ref: '#/components/schemas/worldmonitor_market_v1_FearGreedCategory' + liquidity: + $ref: '#/components/schemas/worldmonitor_market_v1_FearGreedCategory' + credit: + $ref: '#/components/schemas/worldmonitor_market_v1_FearGreedCategory' + macro: + $ref: '#/components/schemas/worldmonitor_market_v1_FearGreedCategory' + crossAsset: + $ref: '#/components/schemas/worldmonitor_market_v1_FearGreedCategory' + vix: + type: number + format: double + hySpread: + type: number + format: double + yield10y: + type: number + format: double + putCallRatio: + type: number + format: double + pctAbove200d: + type: number + format: double + cnnFearGreed: + type: number + format: double + cnnLabel: + type: string + aaiiBull: + type: number + format: double + aaiiBear: + type: number + format: double + fedRate: + type: string + unavailable: + type: boolean + fsiValue: + type: number + format: double + fsiLabel: + type: string + hygPrice: + type: number + format: double + tltPrice: + type: number + format: double + sectorPerformance: + type: array + items: + $ref: '#/components/schemas/worldmonitor_market_v1_FearGreedSectorPerformance' + worldmonitor_market_v1_FearGreedCategory: + type: object + properties: + score: + type: number + format: double + weight: + type: number + format: double + contribution: + type: number + format: double + degraded: + type: boolean + inputsJson: + type: string + worldmonitor_market_v1_FearGreedSectorPerformance: + type: object + properties: + symbol: + type: string + name: + type: string + change1d: + type: number + format: double + worldmonitor_market_v1_ListEarningsCalendarRequest: + type: object + properties: + fromDate: + type: string + toDate: + type: string + worldmonitor_market_v1_ListEarningsCalendarResponse: + type: object + properties: + earnings: + type: array + items: + $ref: '#/components/schemas/worldmonitor_market_v1_EarningsEntry' + fromDate: + type: string + toDate: + type: string + total: + type: integer + format: int32 + unavailable: + type: boolean + worldmonitor_market_v1_EarningsEntry: + type: object + properties: + symbol: + type: string + company: + type: string + date: + type: string + hour: + type: string + epsEstimate: + type: number + format: double + revenueEstimate: + type: number + format: double + epsActual: + type: number + format: double + revenueActual: + type: number + format: double + hasActuals: + type: boolean + surpriseDirection: + type: string + worldmonitor_market_v1_GetCotPositioningRequest: + type: object + worldmonitor_market_v1_GetCotPositioningResponse: + type: object + properties: + instruments: + type: array + items: + $ref: '#/components/schemas/worldmonitor_market_v1_CotInstrument' + reportDate: + type: string + unavailable: + type: boolean + worldmonitor_market_v1_CotInstrument: + type: object + properties: + name: + type: string + code: + type: string + reportDate: + type: string + assetManagerLong: + type: string + format: int64 + assetManagerShort: + type: string + format: int64 + leveragedFundsLong: + type: string + format: int64 + leveragedFundsShort: + type: string + format: int64 + dealerLong: + type: string + format: int64 + dealerShort: + type: string + format: int64 + netPct: + type: number + format: double + worldmonitor_market_v1_GetInsiderTransactionsRequest: + type: object + properties: + symbol: + type: string + maxLength: 32 + minLength: 1 + required: + - symbol + worldmonitor_market_v1_GetInsiderTransactionsResponse: + type: object + properties: + unavailable: + type: boolean + symbol: + type: string + totalBuys: + type: number + format: double + totalSells: + type: number + format: double + netValue: + type: number + format: double + transactions: + type: array + items: + $ref: '#/components/schemas/worldmonitor_market_v1_InsiderTransaction' + fetchedAt: + type: string + worldmonitor_market_v1_InsiderTransaction: + type: object + properties: + name: + type: string + shares: + type: integer + format: int64 + description: 'Warning: Values > 2^53 may lose precision in JavaScript' + value: + type: number + format: double + transactionCode: + type: string + transactionDate: + type: string + worldmonitor_market_v1_GetMarketBreadthHistoryRequest: + type: object + worldmonitor_market_v1_GetMarketBreadthHistoryResponse: + type: object + properties: + currentPctAbove20d: + type: number + format: double + currentPctAbove50d: + type: number + format: double + currentPctAbove200d: + type: number + format: double + updatedAt: + type: string + history: + type: array + items: + $ref: '#/components/schemas/worldmonitor_market_v1_BreadthSnapshot' + unavailable: + type: boolean + worldmonitor_market_v1_BreadthSnapshot: + type: object + properties: + date: + type: string + pctAbove20d: + type: number + format: double + description: |- + Optional so a missing/failed Barchart reading serializes as JSON null + instead of collapsing to 0, which would render identically to a real 0% + reading (severe market dislocation with no S&P stocks above SMA). + pctAbove50d: + type: number + format: double + pctAbove200d: + type: number + format: double + worldmonitor_market_v1_GetGoldIntelligenceRequest: + type: object + worldmonitor_market_v1_GetGoldIntelligenceResponse: + type: object + properties: + goldPrice: + type: number + format: double + goldChangePct: + type: number + format: double + goldSparkline: + type: array + items: + type: number + format: double + silverPrice: + type: number + format: double + platinumPrice: + type: number + format: double + palladiumPrice: + type: number + format: double + goldSilverRatio: + type: number + format: double + goldPlatinumPremiumPct: + type: number + format: double + crossCurrencyPrices: + type: array + items: + $ref: '#/components/schemas/worldmonitor_market_v1_GoldCrossCurrencyPrice' + cot: + $ref: '#/components/schemas/worldmonitor_market_v1_GoldCotPositioning' + updatedAt: + type: string + unavailable: + type: boolean + session: + $ref: '#/components/schemas/worldmonitor_market_v1_GoldSessionRange' + returns: + $ref: '#/components/schemas/worldmonitor_market_v1_GoldReturns' + range52w: + $ref: '#/components/schemas/worldmonitor_market_v1_GoldRange52w' + drivers: + type: array + items: + $ref: '#/components/schemas/worldmonitor_market_v1_GoldDriver' + etfFlows: + $ref: '#/components/schemas/worldmonitor_market_v1_GoldEtfFlows' + cbReserves: + $ref: '#/components/schemas/worldmonitor_market_v1_GoldCbReserves' + worldmonitor_market_v1_GoldCrossCurrencyPrice: + type: object + properties: + currency: + type: string + flag: + type: string + price: + type: number + format: double + worldmonitor_market_v1_GoldCotPositioning: + type: object + properties: + reportDate: + type: string + nextReleaseDate: + type: string + openInterest: + type: string + format: int64 + managedMoney: + $ref: '#/components/schemas/worldmonitor_market_v1_GoldCotCategory' + producerSwap: + $ref: '#/components/schemas/worldmonitor_market_v1_GoldCotCategory' + worldmonitor_market_v1_GoldCotCategory: + type: object + properties: + longPositions: + type: string + format: int64 + shortPositions: + type: string + format: int64 + netPct: + type: number + format: double + oiSharePct: + type: number + format: double + wowNetDelta: + type: string + format: int64 + worldmonitor_market_v1_GoldSessionRange: + type: object + properties: + dayHigh: + type: number + format: double + dayLow: + type: number + format: double + prevClose: + type: number + format: double + worldmonitor_market_v1_GoldReturns: + type: object + properties: + w1: + type: number + format: double + m1: + type: number + format: double + ytd: + type: number + format: double + y1: + type: number + format: double + worldmonitor_market_v1_GoldRange52w: + type: object + properties: + hi: + type: number + format: double + lo: + type: number + format: double + positionPct: + type: number + format: double + worldmonitor_market_v1_GoldDriver: + type: object + properties: + symbol: + type: string + label: + type: string + value: + type: number + format: double + changePct: + type: number + format: double + correlation30d: + type: number + format: double + worldmonitor_market_v1_GoldEtfFlows: + type: object + properties: + asOfDate: + type: string + tonnes: + type: number + format: double + aumUsd: + type: number + format: double + nav: + type: number + format: double + changeW1Tonnes: + type: number + format: double + changeM1Tonnes: + type: number + format: double + changeY1Tonnes: + type: number + format: double + changeW1Pct: + type: number + format: double + changeM1Pct: + type: number + format: double + changeY1Pct: + type: number + format: double + sparkline90d: + type: array + items: + type: number + format: double + worldmonitor_market_v1_GoldCbReserves: + type: object + properties: + asOfMonth: + type: string + totalTonnes: + type: number + format: double + topHolders: + type: array + items: + $ref: '#/components/schemas/worldmonitor_market_v1_GoldCbHolder' + topBuyers12m: + type: array + items: + $ref: '#/components/schemas/worldmonitor_market_v1_GoldCbMover' + topSellers12m: + type: array + items: + $ref: '#/components/schemas/worldmonitor_market_v1_GoldCbMover' + worldmonitor_market_v1_GoldCbHolder: + type: object + properties: + iso3: + type: string + name: + type: string + tonnes: + type: number + format: double + pctOfReserves: + type: number + format: double + worldmonitor_market_v1_GoldCbMover: + type: object + properties: + iso3: + type: string + name: + type: string + deltaTonnes12m: + type: number + format: double + worldmonitor_market_v1_GetHyperliquidFlowRequest: + type: object + worldmonitor_market_v1_GetHyperliquidFlowResponse: + type: object + properties: + ts: + type: string + format: int64 + fetchedAt: + type: string + warmup: + type: boolean + assetCount: + type: integer + format: int32 + assets: + type: array + items: + $ref: '#/components/schemas/worldmonitor_market_v1_HyperliquidAssetFlow' + unavailable: + type: boolean + worldmonitor_market_v1_HyperliquidAssetFlow: + type: object + properties: + symbol: + type: string + display: + type: string + assetClass: + type: string + group: + type: string + funding: + type: string + description: Raw metrics (nullable as strings to preserve precision; "" = unavailable) + openInterest: + type: string + markPx: + type: string + oraclePx: + type: string + dayNotional: + type: string + fundingScore: + type: number + format: double + description: Component scores 0-100 + volumeScore: + type: number + format: double + oiScore: + type: number + format: double + basisScore: + type: number + format: double + composite: + type: number + format: double + sparkFunding: + type: array + items: + type: number + format: double + description: Sparkline arrays (most recent last); up to 60 samples (5h @ 5min) + sparkOi: + type: array + items: + type: number + format: double + sparkScore: + type: array + items: + type: number + format: double + warmup: + type: boolean + description: State flags + stale: + type: boolean + staleSince: + type: string + format: int64 + missingPolls: + type: integer + format: int32 + alerts: + type: array + items: + type: string + worldmonitor_military_v1_ListMilitaryFlightsRequest: + type: object + properties: + pageSize: + type: integer + format: int32 + description: Maximum items per page (1-100). + cursor: + type: string + description: Cursor for next page. + neLat: + type: number + format: double + description: North-east corner latitude of bounding box. + neLon: + type: number + format: double + description: North-east corner longitude of bounding box. + swLat: + type: number + format: double + description: South-west corner latitude of bounding box. + swLon: + type: number + format: double + description: South-west corner longitude of bounding box. + operator: + type: string + enum: + - MILITARY_OPERATOR_UNSPECIFIED + - MILITARY_OPERATOR_USAF + - MILITARY_OPERATOR_USN + - MILITARY_OPERATOR_USMC + - MILITARY_OPERATOR_USA + - MILITARY_OPERATOR_RAF + - MILITARY_OPERATOR_RN + - MILITARY_OPERATOR_FAF + - MILITARY_OPERATOR_GAF + - MILITARY_OPERATOR_PLAAF + - MILITARY_OPERATOR_PLAN + - MILITARY_OPERATOR_VKS + - MILITARY_OPERATOR_IAF + - MILITARY_OPERATOR_NATO + - MILITARY_OPERATOR_OTHER + description: MilitaryOperator represents the military branch or force operating an asset. + aircraftType: + type: string + enum: + - MILITARY_AIRCRAFT_TYPE_UNSPECIFIED + - MILITARY_AIRCRAFT_TYPE_FIGHTER + - MILITARY_AIRCRAFT_TYPE_BOMBER + - MILITARY_AIRCRAFT_TYPE_TRANSPORT + - MILITARY_AIRCRAFT_TYPE_TANKER + - MILITARY_AIRCRAFT_TYPE_AWACS + - MILITARY_AIRCRAFT_TYPE_RECONNAISSANCE + - MILITARY_AIRCRAFT_TYPE_HELICOPTER + - MILITARY_AIRCRAFT_TYPE_DRONE + - MILITARY_AIRCRAFT_TYPE_PATROL + - MILITARY_AIRCRAFT_TYPE_SPECIAL_OPS + - MILITARY_AIRCRAFT_TYPE_VIP + - MILITARY_AIRCRAFT_TYPE_UNKNOWN + description: MilitaryAircraftType represents the classification of a military aircraft. + description: ListMilitaryFlightsRequest specifies filters for retrieving military flight data. + worldmonitor_military_v1_ListMilitaryFlightsResponse: + type: object + properties: + flights: + type: array + items: + $ref: '#/components/schemas/worldmonitor_military_v1_MilitaryFlight' + clusters: + type: array + items: + $ref: '#/components/schemas/worldmonitor_military_v1_MilitaryFlightCluster' + pagination: + $ref: '#/components/schemas/worldmonitor_core_v1_PaginationResponse' + description: ListMilitaryFlightsResponse contains military flights and clusters. + worldmonitor_military_v1_MilitaryFlight: + type: object + properties: + id: + type: string + minLength: 1 + description: Unique flight identifier. + callsign: + type: string + description: Aircraft callsign. + hexCode: + type: string + description: |- + ICAO 24-bit hex address. Canonical form is UPPERCASE — seeders and + handlers must uppercase before writing so hex-based lookups + (src/services/military-flights.ts:getFlightByHex) match regardless of + upstream source casing. + registration: + type: string + description: Aircraft registration number. + aircraftType: + type: string + enum: + - MILITARY_AIRCRAFT_TYPE_UNSPECIFIED + - MILITARY_AIRCRAFT_TYPE_FIGHTER + - MILITARY_AIRCRAFT_TYPE_BOMBER + - MILITARY_AIRCRAFT_TYPE_TRANSPORT + - MILITARY_AIRCRAFT_TYPE_TANKER + - MILITARY_AIRCRAFT_TYPE_AWACS + - MILITARY_AIRCRAFT_TYPE_RECONNAISSANCE + - MILITARY_AIRCRAFT_TYPE_HELICOPTER + - MILITARY_AIRCRAFT_TYPE_DRONE + - MILITARY_AIRCRAFT_TYPE_PATROL + - MILITARY_AIRCRAFT_TYPE_SPECIAL_OPS + - MILITARY_AIRCRAFT_TYPE_VIP + - MILITARY_AIRCRAFT_TYPE_UNKNOWN + description: MilitaryAircraftType represents the classification of a military aircraft. + aircraftModel: + type: string + description: Specific aircraft model (e.g., "F-35A", "C-17A"). + operator: + type: string + enum: + - MILITARY_OPERATOR_UNSPECIFIED + - MILITARY_OPERATOR_USAF + - MILITARY_OPERATOR_USN + - MILITARY_OPERATOR_USMC + - MILITARY_OPERATOR_USA + - MILITARY_OPERATOR_RAF + - MILITARY_OPERATOR_RN + - MILITARY_OPERATOR_FAF + - MILITARY_OPERATOR_GAF + - MILITARY_OPERATOR_PLAAF + - MILITARY_OPERATOR_PLAN + - MILITARY_OPERATOR_VKS + - MILITARY_OPERATOR_IAF + - MILITARY_OPERATOR_NATO + - MILITARY_OPERATOR_OTHER + description: MilitaryOperator represents the military branch or force operating an asset. + operatorCountry: + type: string + description: Country operating the aircraft (ISO 3166-1 alpha-2). + location: + $ref: '#/components/schemas/worldmonitor_core_v1_GeoCoordinates' + altitude: + type: number + format: double + description: Altitude in feet. + heading: + type: number + format: double + description: Heading in degrees. + speed: + type: number + format: double + description: Speed in knots. + verticalRate: + type: number + format: double + description: Vertical rate in feet per minute. + onGround: + type: boolean + description: Whether the aircraft is on the ground. + squawk: + type: string + description: Transponder squawk code. + origin: + type: string + description: ICAO code of the origin airport. + destination: + type: string + description: ICAO code of the destination airport. + lastSeenAt: + type: integer + format: int64 + description: 'Last seen time, as Unix epoch milliseconds.. Warning: Values > 2^53 may lose precision in JavaScript' + firstSeenAt: + type: integer + format: int64 + description: 'First seen time, as Unix epoch milliseconds.. Warning: Values > 2^53 may lose precision in JavaScript' + confidence: + type: string + enum: + - MILITARY_CONFIDENCE_UNSPECIFIED + - MILITARY_CONFIDENCE_LOW + - MILITARY_CONFIDENCE_MEDIUM + - MILITARY_CONFIDENCE_HIGH + description: MilitaryConfidence represents confidence in asset identification. + isInteresting: + type: boolean + description: Whether flagged for unusual activity. + note: + type: string + description: Analyst note. + enrichment: + $ref: '#/components/schemas/worldmonitor_military_v1_FlightEnrichment' + required: + - id + description: MilitaryFlight represents a tracked military aircraft from OpenSky or Wingbits. + worldmonitor_military_v1_FlightEnrichment: + type: object + properties: + manufacturer: + type: string + description: Aircraft manufacturer. + owner: + type: string + description: Registered owner. + operatorName: + type: string + description: Operator name. + typeCode: + type: string + description: ICAO type code. + builtYear: + type: string + description: Year the aircraft was built. + confirmedMilitary: + type: boolean + description: Whether confirmed as military. + militaryBranch: + type: string + description: Military branch designation. + description: FlightEnrichment contains additional data from Wingbits aircraft database. + worldmonitor_military_v1_MilitaryFlightCluster: + type: object + properties: + id: + type: string + description: Unique cluster identifier. + name: + type: string + description: Descriptive name of the cluster. + location: + $ref: '#/components/schemas/worldmonitor_core_v1_GeoCoordinates' + flightCount: + type: integer + format: int32 + description: Number of flights in the cluster. + flights: + type: array + items: + $ref: '#/components/schemas/worldmonitor_military_v1_MilitaryFlight' + dominantOperator: + type: string + enum: + - MILITARY_OPERATOR_UNSPECIFIED + - MILITARY_OPERATOR_USAF + - MILITARY_OPERATOR_USN + - MILITARY_OPERATOR_USMC + - MILITARY_OPERATOR_USA + - MILITARY_OPERATOR_RAF + - MILITARY_OPERATOR_RN + - MILITARY_OPERATOR_FAF + - MILITARY_OPERATOR_GAF + - MILITARY_OPERATOR_PLAAF + - MILITARY_OPERATOR_PLAN + - MILITARY_OPERATOR_VKS + - MILITARY_OPERATOR_IAF + - MILITARY_OPERATOR_NATO + - MILITARY_OPERATOR_OTHER + description: MilitaryOperator represents the military branch or force operating an asset. + activityType: + type: string + enum: + - MILITARY_ACTIVITY_TYPE_UNSPECIFIED + - MILITARY_ACTIVITY_TYPE_EXERCISE + - MILITARY_ACTIVITY_TYPE_PATROL + - MILITARY_ACTIVITY_TYPE_TRANSPORT + - MILITARY_ACTIVITY_TYPE_DEPLOYMENT + - MILITARY_ACTIVITY_TYPE_TRANSIT + - MILITARY_ACTIVITY_TYPE_UNKNOWN + description: MilitaryActivityType represents the assessed type of military activity. + description: MilitaryFlightCluster represents a geographic cluster of military flights. + worldmonitor_military_v1_GetTheaterPostureRequest: + type: object + properties: + theater: + type: string + description: Theater name (e.g., "indo-pacific", "european", "middle-east"). Empty for all theaters. + description: GetTheaterPostureRequest specifies the theater to assess. + worldmonitor_military_v1_GetTheaterPostureResponse: + type: object + properties: + theaters: + type: array + items: + $ref: '#/components/schemas/worldmonitor_military_v1_TheaterPosture' + description: GetTheaterPostureResponse contains theater posture assessments. + worldmonitor_military_v1_TheaterPosture: + type: object + properties: + theater: + type: string + description: Theater name (e.g., "Indo-Pacific", "European", "Middle East"). + postureLevel: + type: string + description: Overall posture assessment. + activeFlights: + type: integer + format: int32 + description: Number of active flights in the theater. + trackedVessels: + type: integer + format: int32 + description: Number of tracked vessels in the theater. + activeOperations: + type: array + items: + type: string + description: Notable ongoing operations. + assessedAt: + type: integer + format: int64 + description: 'Assessment timestamp, as Unix epoch milliseconds.. Warning: Values > 2^53 may lose precision in JavaScript' + description: TheaterPosture represents an assessed military posture for a geographic theater. + worldmonitor_military_v1_GetAircraftDetailsRequest: + type: object + properties: + icao24: + type: string + minLength: 1 + description: ICAO 24-bit hex address (lowercase). + required: + - icao24 + description: GetAircraftDetailsRequest looks up a single aircraft by ICAO 24-bit hex. + worldmonitor_military_v1_GetAircraftDetailsResponse: + type: object + properties: + details: + $ref: '#/components/schemas/worldmonitor_military_v1_AircraftDetails' + configured: + type: boolean + description: Whether the Wingbits API is configured. + description: GetAircraftDetailsResponse contains the aircraft enrichment data. + worldmonitor_military_v1_AircraftDetails: + type: object + properties: + icao24: + type: string + description: ICAO 24-bit hex address. + registration: + type: string + description: Aircraft registration number. + manufacturerIcao: + type: string + description: ICAO manufacturer code. + manufacturerName: + type: string + description: Full manufacturer name. + model: + type: string + description: Aircraft model. + typecode: + type: string + description: ICAO type designator code. + serialNumber: + type: string + description: Manufacturer serial number. + icaoAircraftType: + type: string + description: ICAO aircraft type designator. + operator: + type: string + description: Operator name. + operatorCallsign: + type: string + description: Operator callsign. + operatorIcao: + type: string + description: Operator ICAO code. + owner: + type: string + description: Registered owner. + built: + type: string + description: Build date. + engines: + type: string + description: Engine description. + categoryDescription: + type: string + description: ICAO category description. + description: AircraftDetails contains Wingbits aircraft enrichment data. + worldmonitor_military_v1_GetAircraftDetailsBatchRequest: + type: object + properties: + icao24s: + type: array + items: + type: string + maxItems: 20 + minItems: 1 + description: ICAO 24-bit hex addresses (lowercase). Max 20. + maxItems: 20 + minItems: 1 + description: GetAircraftDetailsBatchRequest looks up multiple aircraft by ICAO 24-bit hex. + worldmonitor_military_v1_GetAircraftDetailsBatchResponse: + type: object + properties: + results: + type: object + additionalProperties: + $ref: '#/components/schemas/worldmonitor_military_v1_AircraftDetails' + description: Map of icao24 -> aircraft details for found aircraft. + fetched: + type: integer + format: int32 + description: Number of aircraft successfully fetched from upstream. + requested: + type: integer + format: int32 + description: Number of aircraft requested. + configured: + type: boolean + description: Whether the Wingbits API is configured. + description: GetAircraftDetailsBatchResponse contains the batch lookup results. + worldmonitor_military_v1_GetAircraftDetailsBatchResponse_ResultsEntry: + type: object + properties: + key: + type: string + value: + $ref: '#/components/schemas/worldmonitor_military_v1_AircraftDetails' + worldmonitor_military_v1_GetWingbitsStatusRequest: + type: object + description: GetWingbitsStatusRequest checks whether the Wingbits enrichment API is configured. + worldmonitor_military_v1_GetWingbitsStatusResponse: + type: object + properties: + configured: + type: boolean + description: Whether the Wingbits API key is configured on the server. + description: GetWingbitsStatusResponse indicates whether Wingbits is available. + worldmonitor_military_v1_GetUSNIFleetReportRequest: + type: object + properties: + forceRefresh: + type: boolean + description: When true, bypass cache and fetch fresh data from USNI. + description: GetUSNIFleetReportRequest requests the latest USNI Fleet Tracker report. + worldmonitor_military_v1_GetUSNIFleetReportResponse: + type: object + properties: + report: + $ref: '#/components/schemas/worldmonitor_military_v1_USNIFleetReport' + cached: + type: boolean + description: Whether the response was served from cache. + stale: + type: boolean + description: Whether the cached data is stale (served after a fetch failure). + error: + type: string + description: Error message, if any. + description: GetUSNIFleetReportResponse returns the parsed USNI Fleet Tracker report. + worldmonitor_military_v1_USNIFleetReport: + type: object + properties: + articleUrl: + type: string + description: URL of the source article. + articleDate: + type: string + description: Publication date of the article. + articleTitle: + type: string + description: Title of the article. + battleForceSummary: + $ref: '#/components/schemas/worldmonitor_military_v1_BattleForceSummary' + vessels: + type: array + items: + $ref: '#/components/schemas/worldmonitor_military_v1_USNIVessel' + strikeGroups: + type: array + items: + $ref: '#/components/schemas/worldmonitor_military_v1_USNIStrikeGroup' + regions: + type: array + items: + type: string + description: Unique region names mentioned in the article. + parsingWarnings: + type: array + items: + type: string + description: Warnings generated during parsing. + timestamp: + type: integer + format: int64 + description: 'Time the report was generated, as Unix epoch milliseconds.. Warning: Values > 2^53 may lose precision in JavaScript' + description: USNIFleetReport is the full parsed output of a USNI Fleet Tracker article. + worldmonitor_military_v1_BattleForceSummary: + type: object + properties: + totalShips: + type: integer + minimum: 0 + format: int32 + description: Total ships in the battle force. + deployed: + type: integer + minimum: 0 + format: int32 + description: Number of ships currently deployed. + underway: + type: integer + minimum: 0 + format: int32 + description: Number of ships currently underway. + description: BattleForceSummary contains fleet-wide ship count statistics. + worldmonitor_military_v1_USNIVessel: + type: object + properties: + name: + type: string + minLength: 1 + description: Vessel name (e.g., "USS Abraham Lincoln"). + hullNumber: + type: string + minLength: 1 + description: Hull designation (e.g., "CVN-72", "DDG-51"). + vesselType: + type: string + description: Vessel type classification (e.g., "carrier", "destroyer", "submarine"). + region: + type: string + description: Region name where the vessel is operating. + regionLat: + type: number + format: double + description: Approximate latitude for the region. + regionLon: + type: number + format: double + description: Approximate longitude for the region. + deploymentStatus: + type: string + description: Deployment status (e.g., "deployed", "underway", "in-port", "unknown"). + homePort: + type: string + description: Home port, if identified from the article text. + strikeGroup: + type: string + description: Strike group assignment, if any. + activityDescription: + type: string + description: Brief activity description parsed from article prose. + articleUrl: + type: string + description: URL of the USNI article this vessel was parsed from. + articleDate: + type: string + description: Publication date of the USNI article. + required: + - name + - hullNumber + description: USNIVessel represents a single vessel parsed from a USNI Fleet Tracker article. + worldmonitor_military_v1_USNIStrikeGroup: + type: object + properties: + name: + type: string + description: Strike group name (e.g., "Abraham Lincoln Carrier Strike Group"). + carrier: + type: string + description: Carrier name and hull (e.g., "USS Abraham Lincoln (CVN-72)"). + airWing: + type: string + description: Assigned air wing (e.g., "Carrier Air Wing Nine"). + destroyerSquadron: + type: string + description: Assigned destroyer squadron. + escorts: + type: array + items: + type: string + description: Escort vessels in the strike group. + description: USNIStrikeGroup represents a carrier strike group parsed from the article. + worldmonitor_military_v1_ListMilitaryBasesRequest: + type: object + properties: + neLat: + type: number + format: double + neLon: + type: number + format: double + swLat: + type: number + format: double + swLon: + type: number + format: double + zoom: + type: integer + format: int32 + type: + type: string + kind: + type: string + country: + type: string + worldmonitor_military_v1_ListMilitaryBasesResponse: + type: object + properties: + bases: + type: array + items: + $ref: '#/components/schemas/worldmonitor_military_v1_MilitaryBaseEntry' + clusters: + type: array + items: + $ref: '#/components/schemas/worldmonitor_military_v1_MilitaryBaseCluster' + totalInView: + type: integer + format: int32 + truncated: + type: boolean + worldmonitor_military_v1_MilitaryBaseEntry: + type: object + properties: + id: + type: string + name: + type: string + latitude: + type: number + format: double + longitude: + type: number + format: double + kind: + type: string + countryIso2: + type: string + type: + type: string + tier: + type: integer + format: int32 + catAirforce: + type: boolean + catNaval: + type: boolean + catNuclear: + type: boolean + catSpace: + type: boolean + catTraining: + type: boolean + branch: + type: string + status: + type: string + worldmonitor_military_v1_MilitaryBaseCluster: + type: object + properties: + latitude: + type: number + format: double + longitude: + type: number + format: double + count: + type: integer + format: int32 + dominantType: + type: string + expansionZoom: + type: integer + format: int32 + worldmonitor_military_v1_GetWingbitsLiveFlightRequest: + type: object + properties: + icao24: + type: string + minLength: 1 + description: ICAO 24-bit hex address (lowercase, 6 characters). + required: + - icao24 + description: GetWingbitsLiveFlightRequest fetches live Wingbits ECS data for a single aircraft. + worldmonitor_military_v1_GetWingbitsLiveFlightResponse: + type: object + properties: + flight: + $ref: '#/components/schemas/worldmonitor_military_v1_WingbitsLiveFlight' + description: GetWingbitsLiveFlightResponse contains the live flight data, if available. + worldmonitor_military_v1_WingbitsLiveFlight: + type: object + properties: + icao24: + type: string + description: ICAO 24-bit hex address. + callsign: + type: string + description: Live callsign. + lat: + type: number + format: double + description: Latitude in decimal degrees. + lon: + type: number + format: double + description: Longitude in decimal degrees. + altitude: + type: number + format: double + description: Altitude in feet. + speed: + type: number + format: double + description: Ground speed in knots. + heading: + type: number + format: double + description: Track/heading in degrees. + verticalRate: + type: number + format: double + description: Vertical rate in feet per minute (positive = climb, negative = descent). + registration: + type: string + description: Aircraft registration number. + model: + type: string + description: Aircraft model (e.g. "PC-12/45"). + operator: + type: string + description: Operator name. + onGround: + type: boolean + description: True if the aircraft is on the ground. + lastSeen: + type: string + format: int64 + description: Unix timestamp of the last position update. + depIata: + type: string + description: |- + Schedule — from ecs-api.wingbits.com/v1/flights/schedule/{callsign} + Departure airport IATA code (e.g. "FJR"). + arrIata: + type: string + description: Arrival airport IATA code (e.g. "BOM"). + depTimeUtc: + type: string + description: Scheduled departure time UTC (ISO 8601). + arrTimeUtc: + type: string + description: Scheduled arrival time UTC (ISO 8601). + depEstimatedUtc: + type: string + description: Estimated departure time UTC (ISO 8601). + arrEstimatedUtc: + type: string + description: Estimated arrival time UTC (ISO 8601). + depDelayedMin: + type: integer + format: int32 + description: Departure delay in minutes (negative = early). + arrDelayedMin: + type: integer + format: int32 + description: Arrival delay in minutes (negative = early). + flightStatus: + type: string + description: Flight status string (e.g. "en-route", "landed", "scheduled"). + flightDurationMin: + type: integer + format: int32 + description: Scheduled flight duration in minutes. + arrTerminal: + type: string + description: Arrival terminal (e.g. "2"). + photoUrl: + type: string + description: |- + Photo — from api.planespotters.net/pub/photos/hex/{icao24} + Aircraft photo URL (large thumbnail ~497x280). + photoLink: + type: string + description: Permalink to the photo page on planespotters.net. + photoCredit: + type: string + description: Photographer credit name. + callsignIata: + type: string + description: |- + Airline — resolved server-side from the ICAO callsign prefix. + IATA-equivalent callsign (e.g. "EK528" for ICAO "UAE528"). Empty if no mapping. + airlineName: + type: string + description: Airline name (e.g. "Emirates"). Empty if no mapping. + description: WingbitsLiveFlight contains real-time flight position data from the Wingbits ECS network. + worldmonitor_military_v1_ListDefensePatentsRequest: + type: object + properties: + cpcCode: + type: string + description: CPC category filter (e.g. "H04B", "F42B"). Empty returns all categories. + assignee: + type: string + description: Assignee keyword filter (case-insensitive substring match). Empty returns all. + limit: + type: integer + format: int32 + description: Maximum results to return (default 20, max 100). + description: ListDefensePatentsRequest filters defense/dual-use patent filings. + worldmonitor_military_v1_ListDefensePatentsResponse: + type: object + properties: + patents: + type: array + items: + $ref: '#/components/schemas/worldmonitor_military_v1_DefensePatentFiling' + total: + type: integer + format: int32 + description: Total number of filings in the seeded dataset. + fetchedAt: + type: string + description: ISO 8601 timestamp when data was seeded. + description: ListDefensePatentsResponse contains recent defense/dual-use patent filings. + worldmonitor_military_v1_DefensePatentFiling: + type: object + properties: + patentId: + type: string + description: USPTO patent ID. + title: + type: string + description: Patent title. + date: + type: string + description: Filing date (YYYY-MM-DD). + assignee: + type: string + description: Primary assignee organization name. + cpcCode: + type: string + description: CPC classification code (e.g. "H04B", "F42B"). + cpcDesc: + type: string + description: CPC class description. + abstract: + type: string + description: Patent abstract (truncated to 500 chars). + url: + type: string + description: USPTO patent URL. + description: DefensePatentFiling is a single patent filing from a defense/dual-use organization. + worldmonitor_natural_v1_ListNaturalEventsRequest: + type: object + properties: + days: + type: integer + format: int32 + worldmonitor_natural_v1_ListNaturalEventsResponse: + type: object + properties: + events: + type: array + items: + $ref: '#/components/schemas/worldmonitor_natural_v1_NaturalEvent' + worldmonitor_natural_v1_NaturalEvent: + type: object + properties: + id: + type: string + title: + type: string + description: + type: string + category: + type: string + categoryTitle: + type: string + lat: + type: number + format: double + lon: + type: number + format: double + date: + type: integer + format: int64 + description: 'Warning: Values > 2^53 may lose precision in JavaScript' + magnitude: + type: number + format: double + magnitudeUnit: + type: string + sourceUrl: + type: string + sourceName: + type: string + closed: + type: boolean + stormId: + type: string + description: Optional tropical cyclone fields (populated for severeStorms from GDACS TC / NHC) + stormName: + type: string + basin: + type: string + stormCategory: + type: integer + format: int32 + classification: + type: string + windKt: + type: integer + format: int32 + pressureMb: + type: integer + format: int32 + movementDir: + type: integer + format: int32 + movementSpeedKt: + type: integer + format: int32 + forecastTrack: + type: array + items: + $ref: '#/components/schemas/worldmonitor_natural_v1_ForecastPoint' + conePolygon: + type: array + items: + $ref: '#/components/schemas/worldmonitor_natural_v1_CoordRing' + pastTrack: + type: array + items: + $ref: '#/components/schemas/worldmonitor_natural_v1_PastTrackPoint' + worldmonitor_natural_v1_ForecastPoint: + type: object + properties: + lat: + type: number + format: double + lon: + type: number + format: double + hour: + type: integer + format: int32 + windKt: + type: integer + format: int32 + category: + type: integer + format: int32 + worldmonitor_natural_v1_CoordRing: + type: object + properties: + points: + type: array + items: + $ref: '#/components/schemas/worldmonitor_natural_v1_Coordinate' + worldmonitor_natural_v1_Coordinate: + type: object + properties: + lon: + type: number + format: double + lat: + type: number + format: double + worldmonitor_natural_v1_PastTrackPoint: + type: object + properties: + lat: + type: number + format: double + lon: + type: number + format: double + windKt: + type: integer + format: int32 + timestamp: + type: integer + format: int64 + description: 'Warning: Values > 2^53 may lose precision in JavaScript' + worldmonitor_news_v1_SummarizeArticleRequest: + type: object + properties: + provider: + type: string + minLength: 1 + description: 'LLM provider: "ollama", "groq", "openrouter"' + headlines: + type: array + items: + type: string + minItems: 1 + description: Headlines to summarize (max 8 used). + minItems: 1 + mode: + type: string + description: 'Summarization mode: "brief", "analysis", "translate", "" (default).' + geoContext: + type: string + description: Geographic signal context to include in the prompt. + variant: + type: string + description: 'Variant: "full", "tech", or target language for translate mode.' + lang: + type: string + description: Output language code, default "en". + systemAppend: + type: string + description: Optional system prompt append for analytical framework instructions. + required: + - provider + description: SummarizeArticleRequest specifies parameters for LLM article summarization. + worldmonitor_news_v1_SummarizeArticleResponse: + type: object + properties: + summary: + type: string + description: The generated summary text. + model: + type: string + description: Model identifier used for generation. + provider: + type: string + description: Provider that produced the result (or "cache"). + tokens: + type: integer + format: int32 + description: Token count from the LLM response. + fallback: + type: boolean + description: Whether the client should try the next provider in the fallback chain. + error: + type: string + description: Error message if the request failed. + errorType: + type: string + description: Error type/name (e.g. "TypeError"). + status: + type: string + enum: + - SUMMARIZE_STATUS_UNSPECIFIED + - SUMMARIZE_STATUS_SUCCESS + - SUMMARIZE_STATUS_CACHED + - SUMMARIZE_STATUS_SKIPPED + - SUMMARIZE_STATUS_ERROR + description: SummarizeStatus indicates the outcome of a summarization request. + statusDetail: + type: string + description: Human-readable detail for non-success statuses (skip reason, etc.). + description: SummarizeArticleResponse contains the LLM summarization result. + worldmonitor_news_v1_GetSummarizeArticleCacheRequest: + type: object + properties: + cacheKey: + type: string + description: Deterministic cache key computed by buildSummaryCacheKey(). + description: GetSummarizeArticleCacheRequest looks up a pre-computed summary by cache key. + worldmonitor_news_v1_ListFeedDigestRequest: + type: object + properties: + variant: + type: string + description: 'Site variant: full, tech, finance, happy' + lang: + type: string + description: ISO 639-1 language code (en, fr, ar, etc.) + worldmonitor_news_v1_ListFeedDigestResponse: + type: object + properties: + categories: + type: object + additionalProperties: + $ref: '#/components/schemas/worldmonitor_news_v1_CategoryBucket' + description: Per-category buckets — keys match category names from feed config + feedStatuses: + type: object + additionalProperties: + type: string + description: |- + Per-feed status — only non-ok states emitted; absent key implies ok. + Values: empty (feed returned 0 items), timeout (timed out during fetch). + generatedAt: + type: string + description: ISO 8601 timestamp of when this digest was generated + worldmonitor_news_v1_ListFeedDigestResponse_CategoriesEntry: + type: object + properties: + key: + type: string + value: + $ref: '#/components/schemas/worldmonitor_news_v1_CategoryBucket' + worldmonitor_news_v1_ListFeedDigestResponse_FeedStatusesEntry: + type: object + properties: + key: + type: string + value: + type: string + worldmonitor_news_v1_CategoryBucket: + type: object + properties: + items: + type: array + items: + $ref: '#/components/schemas/worldmonitor_news_v1_NewsItem' + worldmonitor_news_v1_NewsItem: + type: object + properties: + source: + type: string + minLength: 1 + description: Source feed name. + title: + type: string + minLength: 1 + description: Article headline. + link: + type: string + description: Article URL. + publishedAt: + type: integer + format: int64 + description: 'Publication time, as Unix epoch milliseconds.. Warning: Values > 2^53 may lose precision in JavaScript' + isAlert: + type: boolean + description: Whether this article triggered an alert condition. + threat: + $ref: '#/components/schemas/worldmonitor_news_v1_ThreatClassification' + location: + $ref: '#/components/schemas/worldmonitor_core_v1_GeoCoordinates' + locationName: + type: string + description: Human-readable location name. + importanceScore: + type: integer + format: int32 + description: 'Composite importance score (0-100): severity × 55% + source tier × 20% + corroboration × 15% + recency × 10%.' + corroborationCount: + type: integer + format: int32 + description: Number of distinct sources that reported the same story in this digest cycle. + storyMeta: + $ref: '#/components/schemas/worldmonitor_news_v1_StoryMeta' + required: + - source + - title + description: NewsItem represents a single news article from RSS feed aggregation. + worldmonitor_news_v1_ThreatClassification: + type: object + properties: + level: + type: string + enum: + - THREAT_LEVEL_UNSPECIFIED + - THREAT_LEVEL_LOW + - THREAT_LEVEL_MEDIUM + - THREAT_LEVEL_HIGH + - THREAT_LEVEL_CRITICAL + description: ThreatLevel represents the assessed threat level of a news event. + category: + type: string + description: Event category. + confidence: + type: number + maximum: 1 + minimum: 0 + format: double + description: Confidence score (0.0 to 1.0). + source: + type: string + description: Classification source — "keyword", "ml", or "llm". + description: ThreatClassification represents an AI-assessed threat level for a news item. + worldmonitor_news_v1_StoryMeta: + type: object + properties: + firstSeen: + type: integer + format: int64 + description: 'Epoch ms when the story first appeared in any digest cycle.. Warning: Values > 2^53 may lose precision in JavaScript' + mentionCount: + type: integer + format: int32 + description: Total number of digest cycles in which this story appeared. + sourceCount: + type: integer + format: int32 + description: Number of unique sources that reported this story (cached from Redis Set). + phase: + type: string + enum: + - STORY_PHASE_UNSPECIFIED + - STORY_PHASE_BREAKING + - STORY_PHASE_DEVELOPING + - STORY_PHASE_SUSTAINED + - STORY_PHASE_FADING + description: StoryPhase represents the lifecycle stage of a tracked news story. + description: StoryMeta carries cross-cycle persistence data attached to each news item. + worldmonitor_positive_events_v1_ListPositiveGeoEventsRequest: + type: object + worldmonitor_positive_events_v1_ListPositiveGeoEventsResponse: + type: object + properties: + events: + type: array + items: + $ref: '#/components/schemas/worldmonitor_positive_events_v1_PositiveGeoEvent' + worldmonitor_positive_events_v1_PositiveGeoEvent: + type: object + properties: + latitude: + type: number + format: double + longitude: + type: number + format: double + name: + type: string + category: + type: string + count: + type: integer + format: int32 + timestamp: + type: integer + format: int64 + description: 'Warning: Values > 2^53 may lose precision in JavaScript' + worldmonitor_prediction_v1_ListPredictionMarketsRequest: + type: object + properties: + pageSize: + type: integer + format: int32 + description: Maximum items per page (1-100). + cursor: + type: string + description: Cursor for next page. + category: + type: string + description: Optional category filter (e.g., "Politics"). + query: + type: string + description: Optional search query for market titles. + description: ListPredictionMarketsRequest specifies filters for retrieving prediction markets. + worldmonitor_prediction_v1_ListPredictionMarketsResponse: + type: object + properties: + markets: + type: array + items: + $ref: '#/components/schemas/worldmonitor_prediction_v1_PredictionMarket' + pagination: + $ref: '#/components/schemas/worldmonitor_core_v1_PaginationResponse' + description: ListPredictionMarketsResponse contains prediction markets matching the request. + worldmonitor_prediction_v1_PredictionMarket: + type: object + properties: + id: + type: string + minLength: 1 + description: Unique market identifier or slug. + title: + type: string + description: Market question or title. + yesPrice: + type: number + maximum: 1 + minimum: 0 + format: double + description: Current "Yes" price (0.0 to 1.0, representing probability). + volume: + type: number + minimum: 0 + format: double + description: Trading volume in USD. + url: + type: string + description: URL to the market page. + closesAt: + type: integer + format: int64 + description: 'Market close time, as Unix epoch milliseconds. Zero if no expiry.. Warning: Values > 2^53 may lose precision in JavaScript' + category: + type: string + description: Market category (e.g., "Politics", "Crypto", "Sports"). + source: + type: string + enum: + - MARKET_SOURCE_UNSPECIFIED + - MARKET_SOURCE_POLYMARKET + - MARKET_SOURCE_KALSHI + description: Source platform for prediction market data. + required: + - id + description: PredictionMarket represents a prediction market contract. + worldmonitor_radiation_v1_ListRadiationObservationsRequest: + type: object + properties: + maxItems: + type: integer + format: int32 + description: Maximum items to return (1-25). Zero uses the service default. + description: ListRadiationObservationsRequest specifies optional result limits. + worldmonitor_radiation_v1_ListRadiationObservationsResponse: + type: object + properties: + observations: + type: array + items: + $ref: '#/components/schemas/worldmonitor_radiation_v1_RadiationObservation' + fetchedAt: + type: integer + format: int64 + description: 'Time the service synthesized the response, as Unix epoch milliseconds.. Warning: Values > 2^53 may lose precision in JavaScript' + epaCount: + type: integer + format: int32 + description: Number of EPA RadNet observations included. + safecastCount: + type: integer + format: int32 + description: Number of Safecast observations included. + anomalyCount: + type: integer + format: int32 + description: Total observations classified above normal. + elevatedCount: + type: integer + format: int32 + description: Observations classified as elevated. + spikeCount: + type: integer + format: int32 + description: Observations classified as spike-level anomalies. + corroboratedCount: + type: integer + format: int32 + description: Observations corroborated by more than one source. + lowConfidenceCount: + type: integer + format: int32 + description: Observations that remain low-confidence after synthesis. + conflictingCount: + type: integer + format: int32 + description: Observations where contributing sources materially disagree. + convertedFromCpmCount: + type: integer + format: int32 + description: Observations whose normalized value was derived from CPM. + description: ListRadiationObservationsResponse contains normalized readings plus coverage metadata. + worldmonitor_radiation_v1_RadiationObservation: + type: object + properties: + id: + type: string + maxLength: 160 + minLength: 1 + description: Unique source-specific observation identifier. + source: + type: string + enum: + - RADIATION_SOURCE_UNSPECIFIED + - RADIATION_SOURCE_EPA_RADNET + - RADIATION_SOURCE_SAFECAST + description: RadiationSource identifies the upstream measurement network. + locationName: + type: string + description: Human-readable location label. + country: + type: string + description: Country or territory label. + location: + $ref: '#/components/schemas/worldmonitor_core_v1_GeoCoordinates' + value: + type: number + format: double + description: Dose equivalent rate normalized to nSv/h. + unit: + type: string + description: Display unit, currently always nSv/h after normalization. + observedAt: + type: integer + format: int64 + description: 'Time the observation was recorded, as Unix epoch milliseconds.. Warning: Values > 2^53 may lose precision in JavaScript' + freshness: + type: string + enum: + - RADIATION_FRESHNESS_UNSPECIFIED + - RADIATION_FRESHNESS_LIVE + - RADIATION_FRESHNESS_RECENT + - RADIATION_FRESHNESS_HISTORICAL + description: RadiationFreshness groups observations by recency. + baselineValue: + type: number + format: double + description: Rolling baseline for this station in nSv/h. + delta: + type: number + format: double + description: Current reading minus rolling baseline in nSv/h. + zScore: + type: number + format: double + description: Standard deviation distance from the rolling baseline. + severity: + type: string + enum: + - RADIATION_SEVERITY_UNSPECIFIED + - RADIATION_SEVERITY_NORMAL + - RADIATION_SEVERITY_ELEVATED + - RADIATION_SEVERITY_SPIKE + description: RadiationSeverity classifies whether a reading is behaving normally. + contributingSources: + type: array + items: + type: string + enum: + - RADIATION_SOURCE_UNSPECIFIED + - RADIATION_SOURCE_EPA_RADNET + - RADIATION_SOURCE_SAFECAST + description: RadiationSource identifies the upstream measurement network. + confidence: + type: string + enum: + - RADIATION_CONFIDENCE_UNSPECIFIED + - RADIATION_CONFIDENCE_LOW + - RADIATION_CONFIDENCE_MEDIUM + - RADIATION_CONFIDENCE_HIGH + description: RadiationConfidence represents how strongly the reading is supported. + corroborated: + type: boolean + description: Whether a second source corroborated the observed pattern. + conflictingSources: + type: boolean + description: Whether contributing sources materially disagree. + convertedFromCpm: + type: boolean + description: True when the value was converted from CPM using a generic fallback. + sourceCount: + type: integer + format: int32 + description: Number of distinct contributing sources. + required: + - id + description: RadiationObservation represents a normalized ambient dose-rate reading. + worldmonitor_research_v1_ListArxivPapersRequest: + type: object + properties: + pageSize: + type: integer + format: int32 + description: Maximum items per page (1-100). + cursor: + type: string + description: Cursor for next page. + category: + type: string + description: arXiv category filter (e.g., "cs.AI"). Empty returns all tracked categories. + query: + type: string + description: Search query for paper titles and abstracts. + description: ListArxivPapersRequest specifies filters for retrieving arXiv papers. + worldmonitor_research_v1_ListArxivPapersResponse: + type: object + properties: + papers: + type: array + items: + $ref: '#/components/schemas/worldmonitor_research_v1_ArxivPaper' + pagination: + $ref: '#/components/schemas/worldmonitor_core_v1_PaginationResponse' + description: ListArxivPapersResponse contains arXiv papers matching the request. + worldmonitor_research_v1_ArxivPaper: + type: object + properties: + id: + type: string + minLength: 1 + description: arXiv paper ID (e.g., "2401.12345"). + title: + type: string + minLength: 1 + description: Paper title. + summary: + type: string + description: Paper abstract (may be truncated). + authors: + type: array + items: + type: string + description: Author names. + categories: + type: array + items: + type: string + description: arXiv categories (e.g., "cs.AI", "cs.LG"). + publishedAt: + type: integer + format: int64 + description: 'Publication time, as Unix epoch milliseconds.. Warning: Values > 2^53 may lose precision in JavaScript' + url: + type: string + description: URL to the paper. + required: + - id + - title + description: ArxivPaper represents a research paper from arXiv. + worldmonitor_research_v1_ListTrendingReposRequest: + type: object + properties: + pageSize: + type: integer + format: int32 + description: Maximum items per page (1-100). + cursor: + type: string + description: Cursor for next page. + language: + type: string + description: Programming language filter (e.g., "python", "typescript"). + period: + type: string + description: Trending period (e.g., "daily", "weekly"). Defaults to "daily". + description: ListTrendingReposRequest specifies filters for retrieving trending GitHub repos. + worldmonitor_research_v1_ListTrendingReposResponse: + type: object + properties: + repos: + type: array + items: + $ref: '#/components/schemas/worldmonitor_research_v1_GithubRepo' + pagination: + $ref: '#/components/schemas/worldmonitor_core_v1_PaginationResponse' + description: ListTrendingReposResponse contains trending GitHub repositories. + worldmonitor_research_v1_GithubRepo: + type: object + properties: + fullName: + type: string + minLength: 1 + description: Repository full name (e.g., "owner/repo"). + description: + type: string + description: Repository description. + language: + type: string + description: Primary programming language. + stars: + type: integer + minimum: 0 + format: int32 + description: Total star count. + starsToday: + type: integer + format: int32 + description: Stars gained in the trending period. + forks: + type: integer + format: int32 + description: Number of open forks. + url: + type: string + description: Repository URL. + required: + - fullName + description: GithubRepo represents a trending repository from GitHub. + worldmonitor_research_v1_ListHackernewsItemsRequest: + type: object + properties: + pageSize: + type: integer + format: int32 + description: Maximum items per page (1-100). + cursor: + type: string + description: Cursor for next page. + feedType: + type: string + description: 'Feed type: "top", "new", "best", "ask", "show". Defaults to "top".' + description: ListHackernewsItemsRequest specifies filters for retrieving Hacker News items. + worldmonitor_research_v1_ListHackernewsItemsResponse: + type: object + properties: + items: + type: array + items: + $ref: '#/components/schemas/worldmonitor_research_v1_HackernewsItem' + pagination: + $ref: '#/components/schemas/worldmonitor_core_v1_PaginationResponse' + description: ListHackernewsItemsResponse contains Hacker News items. + worldmonitor_research_v1_HackernewsItem: + type: object + properties: + id: + type: integer + format: int32 + description: HN item ID. + title: + type: string + minLength: 1 + description: Item title. + url: + type: string + description: URL (empty for Ask HN / Show HN text posts). + score: + type: integer + minimum: 0 + format: int32 + description: Upvote score. + commentCount: + type: integer + format: int32 + description: Number of comments. + by: + type: string + description: Author username. + submittedAt: + type: integer + format: int64 + description: 'Submission time, as Unix epoch milliseconds.. Warning: Values > 2^53 may lose precision in JavaScript' + required: + - title + description: HackernewsItem represents an item from Hacker News. + worldmonitor_research_v1_ListTechEventsRequest: + type: object + properties: + type: + type: string + description: 'Event type filter: "all", "conferences", "earnings", "ipo", "other". Empty = all.' + mappable: + type: boolean + description: Only events with non-virtual coordinates. + limit: + type: integer + maximum: 500 + minimum: 0 + format: int32 + description: Max events to return (0 = unlimited). + days: + type: integer + minimum: 0 + format: int32 + description: Events within N days from now (0 = unlimited). + description: ListTechEventsRequest specifies filters for retrieving tech events. + worldmonitor_research_v1_ListTechEventsResponse: + type: object + properties: + success: + type: boolean + description: Whether the request succeeded. + count: + type: integer + format: int32 + description: Total event count in response. + conferenceCount: + type: integer + format: int32 + description: Number of conference-type events. + mappableCount: + type: integer + format: int32 + description: Number of mappable (non-virtual with coords) events. + lastUpdated: + type: string + description: ISO 8601 timestamp of last update. + events: + type: array + items: + $ref: '#/components/schemas/worldmonitor_research_v1_TechEvent' + error: + type: string + description: Error message if success is false. + description: ListTechEventsResponse contains tech events matching the request. + worldmonitor_research_v1_TechEvent: + type: object + properties: + id: + type: string + description: Unique event identifier. + title: + type: string + description: Event title. + type: + type: string + description: 'Event type: "conference", "earnings", "ipo", "other".' + location: + type: string + description: Location description. + coords: + $ref: '#/components/schemas/worldmonitor_research_v1_TechEventCoords' + startDate: + type: string + description: Start date (YYYY-MM-DD). + endDate: + type: string + description: End date (YYYY-MM-DD). + url: + type: string + description: Event URL. + source: + type: string + description: 'Source: "techmeme", "dev.events", "curated".' + description: + type: string + description: Event description. + description: TechEvent represents a single tech event (conference, earnings, IPO, etc.). + worldmonitor_research_v1_TechEventCoords: + type: object + properties: + lat: + type: number + format: double + description: Latitude. + lng: + type: number + format: double + description: Longitude. + country: + type: string + description: Country name or code. + original: + type: string + description: Original location string before normalization. + virtual: + type: boolean + description: Whether this is a virtual/online event. + description: TechEventCoords contains geocoded location data for a tech event. + worldmonitor_resilience_v1_GetResilienceScoreRequest: + type: object + properties: + countryCode: + type: string + worldmonitor_resilience_v1_GetResilienceScoreResponse: + type: object + properties: + countryCode: + type: string + overallScore: + type: number + format: double + level: + type: string + domains: + type: array + items: + $ref: '#/components/schemas/worldmonitor_resilience_v1_ResilienceDomain' + trend: + type: string + change30d: + type: number + format: double + lowConfidence: + type: boolean + imputationShare: + type: number + format: double + baselineScore: + type: number + format: double + stressScore: + type: number + format: double + stressFactor: + type: number + format: double + dataVersion: + type: string + scoreInterval: + $ref: '#/components/schemas/worldmonitor_resilience_v1_ScoreInterval' + pillars: + type: array + items: + $ref: '#/components/schemas/worldmonitor_resilience_v1_ResiliencePillar' + schemaVersion: + type: string + description: |- + Phase 2 T2.1/T2.3: "2.0" is the current default (adds pillars; keeps + overall_score / baseline_score / etc. populated for backward compat). + "1.0" is the legacy opt-out shape (pillars empty) retained for one + release cycle. Controlled at response build time by the + RESILIENCE_SCHEMA_V2_ENABLED env flag (defaults to "true" → v2). + worldmonitor_resilience_v1_ResilienceDomain: + type: object + properties: + id: + type: string + score: + type: number + format: double + weight: + type: number + format: double + dimensions: + type: array + items: + $ref: '#/components/schemas/worldmonitor_resilience_v1_ResilienceDimension' + worldmonitor_resilience_v1_ResilienceDimension: + type: object + properties: + id: + type: string + score: + type: number + format: double + coverage: + type: number + format: double + observedWeight: + type: number + format: double + imputedWeight: + type: number + format: double + imputationClass: + type: string + description: |- + Four-class imputation taxonomy (Phase 1 T1.7). Empty string when the + dimension has any observed data. One of: "stable-absence", "unmonitored", + "source-failure", "not-applicable". See docs/methodology/country-resilience-index.mdx. + freshness: + $ref: '#/components/schemas/worldmonitor_resilience_v1_DimensionFreshness' + worldmonitor_resilience_v1_DimensionFreshness: + type: object + properties: + lastObservedAtMs: + type: string + format: int64 + description: |- + Unix milliseconds when the oldest constituent signal in this + dimension was last observed (min fetchedAt across INDICATOR_REGISTRY + entries for this dimension). 0 when no signal has ever been + observed. + staleness: + type: string + description: |- + Worst staleness level across the dimension's constituent signals, + classified by classifyStaleness against each signal's cadence. + One of: "fresh", "aging", "stale". Empty string when no signals. + worldmonitor_resilience_v1_ScoreInterval: + type: object + properties: + p05: + type: number + format: double + p95: + type: number + format: double + worldmonitor_resilience_v1_ResiliencePillar: + type: object + properties: + id: + type: string + description: '"structural-readiness" | "live-shock-exposure" | "recovery-capacity".' + score: + type: number + format: double + description: Pillar score in [0, 100], coverage-weighted mean of member domains. + weight: + type: number + format: double + description: 'Pillar weight in the pillar-combined score. Per the plan: 0.40 / 0.35 / 0.25.' + coverage: + type: number + format: double + description: Coverage in [0, 1], mean of member-domain average dimension coverage. + domains: + type: array + items: + $ref: '#/components/schemas/worldmonitor_resilience_v1_ResilienceDomain' + description: |- + Phase 2 T2.1/T2.3 of the country-resilience reference-grade upgrade plan. + Three-pillar response shape that regroups the 6 ResilienceDomains + (economic, infrastructure, energy, social-governance, health-food, + recovery) into long-run capacity (structural-readiness), current shock + pressure (live-shock-exposure), and recovery capability (recovery-capacity). + Pillar scores and coverage are real coverage-weighted aggregates computed + from the constituent domains; see _pillar-membership.ts for the mapping. + The top-level overall_score on GetResilienceScoreResponse remains a + domain-weighted aggregate (Σ domain.score * domain.weight) for this + release cycle; a pillar-combined score with penalty term is staged in + _shared.ts#penalizedPillarScore and validated by + scripts/validate-resilience-sensitivity.mjs ahead of the activation PR. + worldmonitor_resilience_v1_GetResilienceRankingRequest: + type: object + worldmonitor_resilience_v1_GetResilienceRankingResponse: + type: object + properties: + items: + type: array + items: + $ref: '#/components/schemas/worldmonitor_resilience_v1_ResilienceRankingItem' + greyedOut: + type: array + items: + $ref: '#/components/schemas/worldmonitor_resilience_v1_ResilienceRankingItem' + worldmonitor_resilience_v1_ResilienceRankingItem: + type: object + properties: + countryCode: + type: string + overallScore: + type: number + format: double + level: + type: string + lowConfidence: + type: boolean + overallCoverage: + type: number + format: double + rankStable: + type: boolean + worldmonitor_sanctions_v1_ListSanctionsPressureRequest: + type: object + properties: + maxItems: + type: integer + format: int32 + description: ListSanctionsPressureRequest retrieves recent OFAC sanctions pressure state. + worldmonitor_sanctions_v1_ListSanctionsPressureResponse: + type: object + properties: + entries: + type: array + items: + $ref: '#/components/schemas/worldmonitor_sanctions_v1_SanctionsEntry' + countries: + type: array + items: + $ref: '#/components/schemas/worldmonitor_sanctions_v1_CountrySanctionsPressure' + programs: + type: array + items: + $ref: '#/components/schemas/worldmonitor_sanctions_v1_ProgramSanctionsPressure' + fetchedAt: + type: string + format: int64 + datasetDate: + type: string + format: int64 + totalCount: + type: integer + format: int32 + sdnCount: + type: integer + format: int32 + consolidatedCount: + type: integer + format: int32 + newEntryCount: + type: integer + format: int32 + vesselCount: + type: integer + format: int32 + aircraftCount: + type: integer + format: int32 + description: ListSanctionsPressureResponse contains normalized OFAC pressure summaries and recent entries. + worldmonitor_sanctions_v1_SanctionsEntry: + type: object + properties: + id: + type: string + name: + type: string + entityType: + type: string + enum: + - SANCTIONS_ENTITY_TYPE_UNSPECIFIED + - SANCTIONS_ENTITY_TYPE_ENTITY + - SANCTIONS_ENTITY_TYPE_INDIVIDUAL + - SANCTIONS_ENTITY_TYPE_VESSEL + - SANCTIONS_ENTITY_TYPE_AIRCRAFT + description: SanctionsEntityType classifies the designated party. + countryCodes: + type: array + items: + type: string + countryNames: + type: array + items: + type: string + programs: + type: array + items: + type: string + sourceLists: + type: array + items: + type: string + effectiveAt: + type: string + format: int64 + isNew: + type: boolean + note: + type: string + description: SanctionsEntry is a normalized OFAC sanctions designation. + worldmonitor_sanctions_v1_CountrySanctionsPressure: + type: object + properties: + countryCode: + type: string + countryName: + type: string + entryCount: + type: integer + format: int32 + newEntryCount: + type: integer + format: int32 + vesselCount: + type: integer + format: int32 + aircraftCount: + type: integer + format: int32 + description: CountrySanctionsPressure summarizes designation volume and recent additions by country. + worldmonitor_sanctions_v1_ProgramSanctionsPressure: + type: object + properties: + program: + type: string + entryCount: + type: integer + format: int32 + newEntryCount: + type: integer + format: int32 + description: ProgramSanctionsPressure summarizes designation volume and recent additions by OFAC program. + worldmonitor_sanctions_v1_LookupSanctionEntityRequest: + type: object + properties: + q: + type: string + maxResults: + type: integer + format: int32 + description: LookupSanctionEntityRequest searches the OFAC entity index by name, vessel, or aircraft. + worldmonitor_sanctions_v1_LookupSanctionEntityResponse: + type: object + properties: + results: + type: array + items: + $ref: '#/components/schemas/worldmonitor_sanctions_v1_SanctionEntityMatch' + total: + type: integer + format: int32 + source: + type: string + description: LookupSanctionEntityResponse contains matched entities from OFAC + OpenSanctions. + worldmonitor_sanctions_v1_SanctionEntityMatch: + type: object + properties: + id: + type: string + name: + type: string + entityType: + type: string + countryCodes: + type: array + items: + type: string + programs: + type: array + items: + type: string + description: SanctionEntityMatch is a compact entity match from the lookup index. + worldmonitor_scenario_v1_RunScenarioRequest: + type: object + properties: + scenarioId: + type: string + maxLength: 128 + minLength: 1 + description: Scenario template id — must match an entry in SCENARIO_TEMPLATES. + iso2: + type: string + pattern: ^([A-Z]{2})?$ + description: |- + Optional 2-letter ISO country code to scope the impact computation. + When absent, the worker computes for all countries with seeded exposure. + required: + - scenarioId + description: |- + RunScenarioRequest enqueues a scenario job on the scenario-queue:pending + Upstash list for the async scenario-worker to pick up. + worldmonitor_scenario_v1_RunScenarioResponse: + type: object + properties: + jobId: + type: string + description: Generated job id of the form `scenario:{epoch_ms}:{8-char-suffix}`. + status: + type: string + description: Always "pending" at enqueue time. + statusUrl: + type: string + description: |- + Convenience URL the caller can use to poll this job's status. + Server-computed as `/api/scenario/v1/get-scenario-status?jobId=`. + Restored after the v1 → v1 sebuf migration because external callers + may key off this field. + description: |- + RunScenarioResponse carries the enqueued job id. Clients poll + GetScenarioStatus with this id until status != "pending". + + NOTE: the legacy (pre-sebuf) endpoint returned HTTP 202 Accepted on + enqueue; the sebuf-generated server emits 200 OK for all successful + responses (no per-RPC status-code configuration is available in the + current sebuf HTTP annotations). The 202 → 200 shift on a same-version + (v1 → v1) migration is called out in docs/api-scenarios.mdx and the + OpenAPI bundle; external consumers keying off `response.status === 202` + need to branch on response body shape instead. + worldmonitor_scenario_v1_GetScenarioStatusRequest: + type: object + properties: + jobId: + type: string + pattern: ^scenario:[0-9]{13}:[a-z0-9]{8}$ + description: |- + Job id of the form `scenario:{epoch_ms}:{8-char-suffix}`. Path-traversal + guarded by JOB_ID_RE in the handler. + required: + - jobId + description: GetScenarioStatusRequest polls the worker result for an enqueued job id. + worldmonitor_scenario_v1_GetScenarioStatusResponse: + type: object + properties: + status: + type: string + result: + $ref: '#/components/schemas/worldmonitor_scenario_v1_ScenarioResult' + error: + type: string + description: Populated only when status == "failed". + description: |- + GetScenarioStatusResponse reflects the worker's lifecycle state. + "pending" — no key yet (job still queued or very-recent enqueue). + "processing" — worker has claimed the job but hasn't completed compute. + "done" — compute succeeded; `result` is populated. + "failed" — compute errored; `error` is populated. + worldmonitor_scenario_v1_ScenarioResult: + type: object + properties: + affectedChokepointIds: + type: array + items: + type: string + description: Chokepoint ids disrupted by this scenario. + topImpactCountries: + type: array + items: + $ref: '#/components/schemas/worldmonitor_scenario_v1_ScenarioImpactCountry' + template: + $ref: '#/components/schemas/worldmonitor_scenario_v1_ScenarioResultTemplate' + description: |- + ScenarioResult is the computed payload the scenario-worker writes back + under the `scenario-result:{job_id}` Redis key. Populated only when + GetScenarioStatusResponse.status == "done". + worldmonitor_scenario_v1_ScenarioImpactCountry: + type: object + properties: + iso2: + type: string + description: 2-letter ISO country code. + totalImpact: + type: number + format: double + description: |- + Raw weighted impact value aggregated across the country's exposed HS2 + chapters. Relative-only — not a currency amount. + impactPct: + type: integer + format: int32 + description: Impact as a 0-100 share of the worst-hit country. + description: ScenarioImpactCountry carries a single country's scenario impact score. + worldmonitor_scenario_v1_ScenarioResultTemplate: + type: object + properties: + name: + type: string + description: |- + Display name (worker derives this from affected_chokepoint_ids; may be + `tariff_shock` for tariff-type scenarios). + disruptionPct: + type: integer + format: int32 + description: 0-100 percent of chokepoint capacity blocked. + durationDays: + type: integer + format: int32 + description: Estimated duration of disruption in days. + costShockMultiplier: + type: number + format: double + description: Freight cost multiplier applied on top of bypass corridor costs. + description: |- + ScenarioResultTemplate carries template parameters echoed into the worker's + computed result so clients can render them without re-looking up the + template registry. + worldmonitor_scenario_v1_ListScenarioTemplatesRequest: + type: object + worldmonitor_scenario_v1_ListScenarioTemplatesResponse: + type: object + properties: + templates: + type: array + items: + $ref: '#/components/schemas/worldmonitor_scenario_v1_ScenarioTemplate' + worldmonitor_scenario_v1_ScenarioTemplate: + type: object + properties: + id: + type: string + name: + type: string + affectedChokepointIds: + type: array + items: + type: string + description: |- + Chokepoint ids this scenario disrupts. Empty for tariff-shock scenarios + that have no physical chokepoint closure. + disruptionPct: + type: integer + format: int32 + description: 0-100 percent of chokepoint capacity blocked. + durationDays: + type: integer + format: int32 + description: Estimated duration of disruption in days. + affectedHs2: + type: array + items: + type: string + description: HS2 chapter codes affected. Empty means ALL sectors are affected. + costShockMultiplier: + type: number + format: double + description: Freight cost multiplier applied on top of bypass corridor costs. + description: |- + ScenarioTemplate mirrors the catalog shape served by + GET /api/scenario/v1/list-scenario-templates. The authoritative template + registry lives in server/worldmonitor/supply-chain/v1/scenario-templates.ts. + worldmonitor_seismology_v1_ListEarthquakesRequest: + type: object + properties: + start: + type: integer + format: int64 + description: 'Start of time range (inclusive), Unix epoch milliseconds.. Warning: Values > 2^53 may lose precision in JavaScript' + end: + type: integer + format: int64 + description: 'End of time range (inclusive), Unix epoch milliseconds.. Warning: Values > 2^53 may lose precision in JavaScript' + pageSize: + type: integer + format: int32 + description: Maximum items per page (1-100). + cursor: + type: string + description: Cursor for next page. + minMagnitude: + type: number + format: double + description: Minimum magnitude filter (e.g., 4.0 for significant quakes). + description: ListEarthquakesRequest specifies filters for retrieving earthquake data from USGS. + worldmonitor_seismology_v1_ListEarthquakesResponse: + type: object + properties: + earthquakes: + type: array + items: + $ref: '#/components/schemas/worldmonitor_seismology_v1_Earthquake' + pagination: + $ref: '#/components/schemas/worldmonitor_core_v1_PaginationResponse' + description: ListEarthquakesResponse contains the list of earthquakes matching the request filters. + worldmonitor_seismology_v1_Earthquake: + type: object + properties: + id: + type: string + maxLength: 100 + minLength: 1 + description: Unique USGS event identifier (e.g., "us7000abcd"). + place: + type: string + description: Human-readable place description (e.g., "10 km SW of Anchorage, Alaska"). + magnitude: + type: number + format: double + description: Earthquake magnitude on the Richter scale. + depthKm: + type: number + format: double + description: Depth in kilometers below the surface. + location: + $ref: '#/components/schemas/worldmonitor_core_v1_GeoCoordinates' + occurredAt: + type: integer + format: int64 + description: 'Time the earthquake occurred, as Unix epoch milliseconds.. Warning: Values > 2^53 may lose precision in JavaScript' + sourceUrl: + type: string + description: URL to the USGS event detail page. + nearTestSite: + type: boolean + description: True when epicenter is within 100 km of a known nuclear test site. + testSiteName: + type: string + description: Name of the nearest test site (e.g. "Punggye-ri"), when near_test_site is true. + concernScore: + type: number + format: double + description: Composite concern score 0–100 based on magnitude, depth, and proximity. + concernLevel: + type: string + description: 'Human-readable concern level: "low" | "moderate" | "elevated" | "critical".' + required: + - id + description: Earthquake represents a seismic event from USGS GeoJSON feed. + worldmonitor_shipping_v2_RouteIntelligenceRequest: + type: object + properties: + fromIso2: + type: string + pattern: ^[A-Z]{2}$ + description: Origin country, ISO-3166-1 alpha-2 uppercase. + toIso2: + type: string + pattern: ^[A-Z]{2}$ + description: Destination country, ISO-3166-1 alpha-2 uppercase. + cargoType: + type: string + description: |- + Cargo type — one of: container (default), tanker, bulk, roro. + Empty string defers to the server default. Unknown values are coerced to + "container" to preserve legacy behavior. + hs2: + type: string + description: |- + 2-digit HS commodity code (default "27" — mineral fuels). Non-digit + characters are stripped server-side to match legacy behavior. + required: + - fromIso2 + - toIso2 + description: |- + RouteIntelligenceRequest scopes a route-intelligence query by origin and + destination country. Query-parameter names are preserved verbatim from the + legacy partner contract (fromIso2/toIso2/cargoType/hs2 — camelCase). + worldmonitor_shipping_v2_RouteIntelligenceResponse: + type: object + properties: + fromIso2: + type: string + toIso2: + type: string + cargoType: + type: string + hs2: + type: string + primaryRouteId: + type: string + chokepointExposures: + type: array + items: + $ref: '#/components/schemas/worldmonitor_shipping_v2_ChokepointExposure' + bypassOptions: + type: array + items: + $ref: '#/components/schemas/worldmonitor_shipping_v2_BypassOption' + warRiskTier: + type: string + description: War-risk tier enum string, e.g., "WAR_RISK_TIER_NORMAL" or "WAR_RISK_TIER_ELEVATED". + disruptionScore: + type: integer + format: int32 + description: Disruption score of the primary chokepoint, 0-100. + fetchedAt: + type: string + description: ISO-8601 timestamp of when the response was assembled. + description: |- + RouteIntelligenceResponse wire shape preserved byte-for-byte from the + pre-migration JSON at docs/api-shipping-v2.mdx. `fetched_at` is intentionally + a string (ISO-8601) rather than int64 epoch ms because partners depend on + the ISO-8601 shape. + worldmonitor_shipping_v2_ChokepointExposure: + type: object + properties: + chokepointId: + type: string + chokepointName: + type: string + exposurePct: + type: integer + format: int32 + description: Single chokepoint exposure for a route. + worldmonitor_shipping_v2_BypassOption: + type: object + properties: + id: + type: string + name: + type: string + type: + type: string + description: Type of bypass (e.g., "maritime_detour", "land_corridor"). + addedTransitDays: + type: integer + format: int32 + addedCostMultiplier: + type: number + format: double + activationThreshold: + type: string + description: Enum-like string, e.g., "DISRUPTION_SCORE_60". + description: Single bypass-corridor option around a disrupted chokepoint. + worldmonitor_shipping_v2_RegisterWebhookRequest: + type: object + properties: + callbackUrl: + type: string + maxLength: 2048 + minLength: 8 + description: |- + HTTPS callback URL. Must not resolve to a private/loopback address at + registration time (SSRF guard). The delivery worker re-validates the + resolved IP before each send to mitigate DNS rebinding. + chokepointIds: + type: array + items: + type: string + description: |- + Zero or more chokepoint IDs to subscribe to. Empty list subscribes to + the entire CHOKEPOINT_REGISTRY. Unknown IDs fail with 400. + alertThreshold: + type: integer + maximum: 100 + minimum: 0 + format: int32 + description: Disruption-score threshold for delivery, 0-100. Default 50. + required: + - callbackUrl + description: |- + RegisterWebhookRequest creates a new chokepoint-disruption webhook + subscription. Wire shape is byte-compatible with the pre-migration + legacy POST body. + worldmonitor_shipping_v2_RegisterWebhookResponse: + type: object + properties: + subscriberId: + type: string + description: '`wh_` prefix + 24 lowercase hex chars (12 random bytes).' + secret: + type: string + description: Raw 64-char lowercase hex secret (32 random bytes). No `whsec_` prefix. + description: |- + RegisterWebhookResponse wire shape preserved exactly — partners persist the + `secret` because the server never returns it again except via rotate-secret. + worldmonitor_shipping_v2_ListWebhooksRequest: + type: object + description: |- + ListWebhooksRequest has no fields — the owner is derived from the caller's + API-key fingerprint (SHA-256 of X-WorldMonitor-Key). + worldmonitor_shipping_v2_ListWebhooksResponse: + type: object + properties: + webhooks: + type: array + items: + $ref: '#/components/schemas/worldmonitor_shipping_v2_WebhookSummary' + description: |- + ListWebhooksResponse wire shape preserved exactly: the `webhooks` field + name and the omission of `secret` are part of the partner contract. + worldmonitor_shipping_v2_WebhookSummary: + type: object + properties: + subscriberId: + type: string + callbackUrl: + type: string + chokepointIds: + type: array + items: + type: string + alertThreshold: + type: integer + format: int32 + createdAt: + type: string + description: ISO-8601 timestamp of registration. + active: + type: boolean + description: |- + Single webhook record in the list response. `secret` is intentionally + omitted; use rotate-secret to obtain a new one. + worldmonitor_supply_chain_v1_GetShippingRatesRequest: + type: object + worldmonitor_supply_chain_v1_GetShippingRatesResponse: + type: object + properties: + indices: + type: array + items: + $ref: '#/components/schemas/worldmonitor_supply_chain_v1_ShippingIndex' + fetchedAt: + type: string + upstreamUnavailable: + type: boolean + worldmonitor_supply_chain_v1_ShippingIndex: + type: object + properties: + indexId: + type: string + name: + type: string + currentValue: + type: number + format: double + previousValue: + type: number + format: double + changePct: + type: number + format: double + unit: + type: string + history: + type: array + items: + $ref: '#/components/schemas/worldmonitor_supply_chain_v1_ShippingRatePoint' + spikeAlert: + type: boolean + worldmonitor_supply_chain_v1_ShippingRatePoint: + type: object + properties: + date: + type: string + value: + type: number + format: double + worldmonitor_supply_chain_v1_GetChokepointStatusRequest: + type: object + worldmonitor_supply_chain_v1_GetChokepointStatusResponse: + type: object + properties: + chokepoints: + type: array + items: + $ref: '#/components/schemas/worldmonitor_supply_chain_v1_ChokepointInfo' + fetchedAt: + type: string + upstreamUnavailable: + type: boolean + worldmonitor_supply_chain_v1_ChokepointInfo: + type: object + properties: + id: + type: string + name: + type: string + lat: + type: number + format: double + lon: + type: number + format: double + disruptionScore: + type: integer + format: int32 + status: + type: string + activeWarnings: + type: integer + format: int32 + congestionLevel: + type: string + affectedRoutes: + type: array + items: + type: string + description: + type: string + aisDisruptions: + type: integer + format: int32 + directions: + type: array + items: + type: string + directionalDwt: + type: array + items: + $ref: '#/components/schemas/worldmonitor_supply_chain_v1_DirectionalDwt' + transitSummary: + $ref: '#/components/schemas/worldmonitor_supply_chain_v1_TransitSummary' + flowEstimate: + $ref: '#/components/schemas/worldmonitor_supply_chain_v1_FlowEstimate' + warRiskTier: + type: string + enum: + - WAR_RISK_TIER_UNSPECIFIED + - WAR_RISK_TIER_NORMAL + - WAR_RISK_TIER_ELEVATED + - WAR_RISK_TIER_HIGH + - WAR_RISK_TIER_CRITICAL + - WAR_RISK_TIER_WAR_ZONE + description: |- + * + War risk tier derived from Lloyd's JWC Listed Areas + OSINT threat classification. + This is a FREE field (no PRO gate) — it exposes the existing server-internal + threatLevel from ChokepointConfig, making it available to clients for badges + and bypass corridor scoring. + worldmonitor_supply_chain_v1_DirectionalDwt: + type: object + properties: + direction: + type: string + dwtThousandTonnes: + type: number + format: double + wowChangePct: + type: number + format: double + worldmonitor_supply_chain_v1_TransitSummary: + type: object + properties: + todayTotal: + type: integer + format: int32 + todayTanker: + type: integer + format: int32 + todayCargo: + type: integer + format: int32 + todayOther: + type: integer + format: int32 + wowChangePct: + type: number + format: double + history: + type: array + items: + $ref: '#/components/schemas/worldmonitor_supply_chain_v1_TransitDayCount' + riskLevel: + type: string + incidentCount7d: + type: integer + format: int32 + disruptionPct: + type: number + format: double + riskSummary: + type: string + riskReportAction: + type: string + dataAvailable: + type: boolean + description: |- + False when the upstream portwatch/relay source did not return data for + this chokepoint in the current cycle — the summary fields are zero-state + fill, not a genuine "zero traffic" reading. Client should render a + "transit data unavailable" indicator and skip stat/chart rendering. + worldmonitor_supply_chain_v1_TransitDayCount: + type: object + properties: + date: + type: string + tanker: + type: integer + format: int32 + cargo: + type: integer + format: int32 + other: + type: integer + format: int32 + total: + type: integer + format: int32 + container: + type: integer + format: int32 + dryBulk: + type: integer + format: int32 + generalCargo: + type: integer + format: int32 + roro: + type: integer + format: int32 + capContainer: + type: number + format: double + capDryBulk: + type: number + format: double + capGeneralCargo: + type: number + format: double + capRoro: + type: number + format: double + capTanker: + type: number + format: double + worldmonitor_supply_chain_v1_FlowEstimate: + type: object + properties: + currentMbd: + type: number + format: double + baselineMbd: + type: number + format: double + flowRatio: + type: number + format: double + disrupted: + type: boolean + source: + type: string + hazardAlertLevel: + type: string + hazardAlertName: + type: string + worldmonitor_supply_chain_v1_GetChokepointHistoryRequest: + type: object + properties: + chokepointId: + type: string + required: + - chokepointId + description: |- + GetChokepointHistory returns the transit-count history for a single + chokepoint. Loaded lazily on card expand so the main chokepoint-status + response can stay compact (no 180-day history per chokepoint). + worldmonitor_supply_chain_v1_GetChokepointHistoryResponse: + type: object + properties: + chokepointId: + type: string + history: + type: array + items: + $ref: '#/components/schemas/worldmonitor_supply_chain_v1_TransitDayCount' + fetchedAt: + type: string + format: int64 + worldmonitor_supply_chain_v1_GetCriticalMineralsRequest: + type: object + worldmonitor_supply_chain_v1_GetCriticalMineralsResponse: + type: object + properties: + minerals: + type: array + items: + $ref: '#/components/schemas/worldmonitor_supply_chain_v1_CriticalMineral' + fetchedAt: + type: string + upstreamUnavailable: + type: boolean + worldmonitor_supply_chain_v1_CriticalMineral: + type: object + properties: + mineral: + type: string + topProducers: + type: array + items: + $ref: '#/components/schemas/worldmonitor_supply_chain_v1_MineralProducer' + hhi: + type: number + format: double + riskRating: + type: string + globalProduction: + type: number + format: double + unit: + type: string + worldmonitor_supply_chain_v1_MineralProducer: + type: object + properties: + country: + type: string + countryCode: + type: string + productionTonnes: + type: number + format: double + sharePct: + type: number + format: double + worldmonitor_supply_chain_v1_GetShippingStressRequest: + type: object + worldmonitor_supply_chain_v1_GetShippingStressResponse: + type: object + properties: + carriers: + type: array + items: + $ref: '#/components/schemas/worldmonitor_supply_chain_v1_ShippingStressCarrier' + stressScore: + type: number + format: double + description: Composite stress score 0–100 (higher = more disruption). + stressLevel: + type: string + description: '"low" | "moderate" | "elevated" | "critical".' + fetchedAt: + type: integer + format: int64 + description: 'Warning: Values > 2^53 may lose precision in JavaScript' + upstreamUnavailable: + type: boolean + description: Set to true when upstream data source is unavailable and cached data is stale. + worldmonitor_supply_chain_v1_ShippingStressCarrier: + type: object + properties: + symbol: + type: string + description: Ticker or identifier (e.g., "BDRY", "ZIM"). + name: + type: string + description: Human-readable name. + price: + type: number + format: double + description: Current price. + changePct: + type: number + format: double + description: Percentage change from previous close. + carrierType: + type: string + description: 'Carrier type: "etf" | "carrier" | "index".' + sparkline: + type: array + items: + type: number + format: double + description: 30-day price sparkline. + description: ShippingStressCarrier represents market stress data for a carrier or shipping index. + worldmonitor_supply_chain_v1_GetCountryChokepointIndexRequest: + type: object + properties: + iso2: + type: string + pattern: ^[A-Z]{2}$ + description: ISO 3166-1 alpha-2 country code (uppercase). + hs2: + type: string + description: HS2 chapter (2-digit string). Defaults to "27" (energy/mineral fuels) when absent. + required: + - iso2 + description: GetCountryChokepointIndexRequest specifies the country and optional HS2 chapter. + worldmonitor_supply_chain_v1_GetCountryChokepointIndexResponse: + type: object + properties: + iso2: + type: string + description: ISO 3166-1 alpha-2 country code echoed from the request. + hs2: + type: string + description: HS2 chapter used for the computation. + exposures: + type: array + items: + $ref: '#/components/schemas/worldmonitor_supply_chain_v1_ChokepointExposureEntry' + primaryChokepointId: + type: string + description: Canonical ID of the chokepoint with the highest exposure score. + vulnerabilityIndex: + type: number + format: double + description: Composite vulnerability index 0–100 (weighted sum of top-3 exposures). + fetchedAt: + type: string + description: ISO timestamp of when this data was last seeded. + description: GetCountryChokepointIndexResponse returns exposure scores for all relevant chokepoints. + worldmonitor_supply_chain_v1_ChokepointExposureEntry: + type: object + properties: + chokepointId: + type: string + description: Canonical chokepoint ID from the chokepoint registry. + chokepointName: + type: string + description: Human-readable chokepoint name. + exposureScore: + type: number + format: double + description: Exposure score 0–100; higher = more dependent on this chokepoint. + coastSide: + type: string + description: Which ocean/basin side the country's ports face (atlantic, pacific, indian, med, multi, landlocked). + shockSupported: + type: boolean + description: Whether the shock model is supported for this chokepoint + hs2 combination. + description: ChokepointExposureEntry holds per-chokepoint exposure data for a country. + worldmonitor_supply_chain_v1_GetBypassOptionsRequest: + type: object + properties: + chokepointId: + type: string + cargoType: + type: string + description: 'container | tanker | bulk | roro (default: "container")' + closurePct: + type: integer + format: int32 + description: '0-100, percent of capacity blocked (default: 100)' + required: + - chokepointId + worldmonitor_supply_chain_v1_GetBypassOptionsResponse: + type: object + properties: + chokepointId: + type: string + cargoType: + type: string + closurePct: + type: integer + format: int32 + options: + type: array + items: + $ref: '#/components/schemas/worldmonitor_supply_chain_v1_BypassOption' + fetchedAt: + type: string + primaryChokepointWarRiskTier: + type: string + enum: + - WAR_RISK_TIER_UNSPECIFIED + - WAR_RISK_TIER_NORMAL + - WAR_RISK_TIER_ELEVATED + - WAR_RISK_TIER_HIGH + - WAR_RISK_TIER_CRITICAL + - WAR_RISK_TIER_WAR_ZONE + description: |- + * + War risk tier derived from Lloyd's JWC Listed Areas + OSINT threat classification. + This is a FREE field (no PRO gate) — it exposes the existing server-internal + threatLevel from ChokepointConfig, making it available to clients for badges + and bypass corridor scoring. + worldmonitor_supply_chain_v1_BypassOption: + type: object + properties: + id: + type: string + name: + type: string + type: + type: string + addedTransitDays: + type: integer + format: int32 + addedCostMultiplier: + type: number + format: double + capacityConstraintTonnage: + type: string + format: int64 + suitableCargoTypes: + type: array + items: + type: string + activationThreshold: + type: string + waypointChokepointIds: + type: array + items: + type: string + liveScore: + type: number + format: double + bypassWarRiskTier: + type: string + enum: + - WAR_RISK_TIER_UNSPECIFIED + - WAR_RISK_TIER_NORMAL + - WAR_RISK_TIER_ELEVATED + - WAR_RISK_TIER_HIGH + - WAR_RISK_TIER_CRITICAL + - WAR_RISK_TIER_WAR_ZONE + description: |- + * + War risk tier derived from Lloyd's JWC Listed Areas + OSINT threat classification. + This is a FREE field (no PRO gate) — it exposes the existing server-internal + threatLevel from ChokepointConfig, making it available to clients for badges + and bypass corridor scoring. + notes: + type: string + worldmonitor_supply_chain_v1_GetCountryCostShockRequest: + type: object + properties: + iso2: + type: string + pattern: ^[A-Z]{2}$ + chokepointId: + type: string + hs2: + type: string + description: 'HS2 chapter (default: "27")' + required: + - iso2 + - chokepointId + worldmonitor_supply_chain_v1_GetCountryCostShockResponse: + type: object + properties: + iso2: + type: string + chokepointId: + type: string + hs2: + type: string + supplyDeficitPct: + type: number + format: double + description: Average refined-product supply deficit % under full closure (Gasoline/Diesel/Jet fuel/LPG average; HS 27 only) + coverageDays: + type: integer + format: int32 + description: Energy stockpile coverage in days (IEA data, HS 27 only; 0 for non-energy sectors or net exporters) + warRiskPremiumBps: + type: integer + format: int32 + description: War risk insurance premium in basis points for this chokepoint + warRiskTier: + type: string + enum: + - WAR_RISK_TIER_UNSPECIFIED + - WAR_RISK_TIER_NORMAL + - WAR_RISK_TIER_ELEVATED + - WAR_RISK_TIER_HIGH + - WAR_RISK_TIER_CRITICAL + - WAR_RISK_TIER_WAR_ZONE + description: |- + * + War risk tier derived from Lloyd's JWC Listed Areas + OSINT threat classification. + This is a FREE field (no PRO gate) — it exposes the existing server-internal + threatLevel from ChokepointConfig, making it available to clients for badges + and bypass corridor scoring. + hasEnergyModel: + type: boolean + description: Whether supply_deficit_pct and coverage_days are modelled (true) or unavailable (false) + unavailableReason: + type: string + description: Null/unavailable explanation for non-energy sectors + fetchedAt: + type: string + worldmonitor_supply_chain_v1_GetCountryProductsRequest: + type: object + properties: + iso2: + type: string + pattern: ^[A-Z]{2}$ + required: + - iso2 + worldmonitor_supply_chain_v1_GetCountryProductsResponse: + type: object + properties: + iso2: + type: string + products: + type: array + items: + $ref: '#/components/schemas/worldmonitor_supply_chain_v1_CountryProduct' + fetchedAt: + type: string + description: ISO timestamp from the seeded payload (empty when no data is cached). + worldmonitor_supply_chain_v1_CountryProduct: + type: object + properties: + hs4: + type: string + description: + type: string + totalValue: + type: number + format: double + topExporters: + type: array + items: + $ref: '#/components/schemas/worldmonitor_supply_chain_v1_ProductExporter' + year: + type: integer + format: int32 + worldmonitor_supply_chain_v1_ProductExporter: + type: object + properties: + partnerCode: + type: integer + format: int32 + partnerIso2: + type: string + value: + type: number + format: double + share: + type: number + format: double + worldmonitor_supply_chain_v1_GetMultiSectorCostShockRequest: + type: object + properties: + iso2: + type: string + pattern: ^[A-Z]{2}$ + chokepointId: + type: string + closureDays: + type: integer + format: int32 + description: Closure-window duration in days. Server clamps to [1, 365]. Defaults to 30. + required: + - iso2 + - chokepointId + worldmonitor_supply_chain_v1_GetMultiSectorCostShockResponse: + type: object + properties: + iso2: + type: string + chokepointId: + type: string + closureDays: + type: integer + format: int32 + description: Server-clamped closure-window duration in days (1-365). + warRiskTier: + type: string + enum: + - WAR_RISK_TIER_UNSPECIFIED + - WAR_RISK_TIER_NORMAL + - WAR_RISK_TIER_ELEVATED + - WAR_RISK_TIER_HIGH + - WAR_RISK_TIER_CRITICAL + - WAR_RISK_TIER_WAR_ZONE + description: |- + * + War risk tier derived from Lloyd's JWC Listed Areas + OSINT threat classification. + This is a FREE field (no PRO gate) — it exposes the existing server-internal + threatLevel from ChokepointConfig, making it available to clients for badges + and bypass corridor scoring. + sectors: + type: array + items: + $ref: '#/components/schemas/worldmonitor_supply_chain_v1_MultiSectorCostShock' + totalAddedCost: + type: number + format: double + description: Sum of total_cost_shock across all sectors. + fetchedAt: + type: string + unavailableReason: + type: string + description: Populated when no seeded import data is available for the country. + worldmonitor_supply_chain_v1_MultiSectorCostShock: + type: object + properties: + hs2: + type: string + description: HS2 chapter code (e.g. "27" mineral fuels, "85" electronics). + hs2Label: + type: string + description: Friendly chapter label (e.g. "Energy", "Electronics"). + importValueAnnual: + type: number + format: double + description: Total annual import value (USD) for this sector. + freightAddedPctPerTon: + type: number + format: double + description: Bypass-corridor freight uplift fraction (0.10 == +10% per ton). + warRiskPremiumBps: + type: integer + format: int32 + description: War-risk insurance premium (basis points) sourced from the chokepoint tier. + addedTransitDays: + type: integer + format: int32 + description: Bypass-corridor transit penalty (informational). + totalCostShockPerDay: + type: number + format: double + totalCostShock30Days: + type: number + format: double + totalCostShock90Days: + type: number + format: double + totalCostShock: + type: number + format: double + description: Cost for the requested closure_days window. + closureDays: + type: integer + format: int32 + description: Echoes the clamped closure duration used for total_cost_shock (1-365). + worldmonitor_supply_chain_v1_GetSectorDependencyRequest: + type: object + properties: + iso2: + type: string + pattern: ^[A-Z]{2}$ + hs2: + type: string + description: HS2 chapter code, e.g. "27" (mineral fuels), "85" (electronics) + required: + - iso2 + - hs2 + worldmonitor_supply_chain_v1_GetSectorDependencyResponse: + type: object + properties: + iso2: + type: string + hs2: + type: string + hs2Label: + type: string + description: Human-readable HS2 chapter name. + flags: + type: array + items: + type: string + enum: + - DEPENDENCY_FLAG_UNSPECIFIED + - DEPENDENCY_FLAG_SINGLE_SOURCE_CRITICAL + - DEPENDENCY_FLAG_SINGLE_CORRIDOR_CRITICAL + - DEPENDENCY_FLAG_COMPOUND_RISK + - DEPENDENCY_FLAG_DIVERSIFIABLE + description: DependencyFlag classifies how a country+sector dependency can fail. + primaryExporterIso2: + type: string + description: ISO2 of the country supplying the largest share of this sector's imports. + primaryExporterShare: + type: number + format: double + description: Share of imports from the primary exporter (0–1). 0 = no Comtrade data available. + primaryChokepointId: + type: string + description: Chokepoint ID with the highest exposure score for this country+sector. + primaryChokepointExposure: + type: number + format: double + description: Exposure score for the primary chokepoint (0–100). + hasViableBypass: + type: boolean + description: Whether at least one viable bypass corridor exists for the primary chokepoint. + fetchedAt: + type: string + worldmonitor_supply_chain_v1_GetRouteExplorerLaneRequest: + type: object + properties: + fromIso2: + type: string + pattern: ^[A-Z]{2}$ + toIso2: + type: string + pattern: ^[A-Z]{2}$ + hs2: + type: string + description: HS2 chapter code, e.g. "27", "85" + cargoType: + type: string + description: 'One of: container, tanker, bulk, roro' + required: + - fromIso2 + - toIso2 + - hs2 + - cargoType + worldmonitor_supply_chain_v1_GetRouteExplorerLaneResponse: + type: object + properties: + fromIso2: + type: string + toIso2: + type: string + hs2: + type: string + cargoType: + type: string + primaryRouteId: + type: string + description: Primary trade route ID from TRADE_ROUTES config. Empty when no modeled lane. + primaryRouteGeometry: + type: array + items: + $ref: '#/components/schemas/worldmonitor_supply_chain_v1_GeoPoint' + chokepointExposures: + type: array + items: + $ref: '#/components/schemas/worldmonitor_supply_chain_v1_ChokepointExposureSummary' + bypassOptions: + type: array + items: + $ref: '#/components/schemas/worldmonitor_supply_chain_v1_BypassCorridorOption' + warRiskTier: + type: string + disruptionScore: + type: number + format: double + estTransitDaysRange: + $ref: '#/components/schemas/worldmonitor_supply_chain_v1_NumberRange' + estFreightUsdPerTeuRange: + $ref: '#/components/schemas/worldmonitor_supply_chain_v1_NumberRange' + noModeledLane: + type: boolean + description: |- + True when the wrapper fell back to the origin's first route (no shared route + between origin and destination clusters). Signals "no modeled lane" to the UI. + fetchedAt: + type: string + worldmonitor_supply_chain_v1_GeoPoint: + type: object + properties: + lon: + type: number + format: double + lat: + type: number + format: double + description: GeoPoint is a [longitude, latitude] pair. + worldmonitor_supply_chain_v1_ChokepointExposureSummary: + type: object + properties: + chokepointId: + type: string + chokepointName: + type: string + exposurePct: + type: integer + format: int32 + worldmonitor_supply_chain_v1_BypassCorridorOption: + type: object + properties: + id: + type: string + name: + type: string + type: + type: string + addedTransitDays: + type: integer + format: int32 + addedCostMultiplier: + type: number + format: double + warRiskTier: + type: string + status: + type: string + enum: + - CORRIDOR_STATUS_UNSPECIFIED + - CORRIDOR_STATUS_ACTIVE + - CORRIDOR_STATUS_PROPOSED + - CORRIDOR_STATUS_UNAVAILABLE + description: |- + Status of a bypass corridor for UI labeling. "active" means usable today; + "proposed" means documented but not yet built/operational; "unavailable" + means blockaded or otherwise blocked from use. + fromPort: + $ref: '#/components/schemas/worldmonitor_supply_chain_v1_GeoPoint' + toPort: + $ref: '#/components/schemas/worldmonitor_supply_chain_v1_GeoPoint' + description: |- + BypassCorridorOption is a single enriched bypass corridor for the Route Explorer UI. + Includes coordinate endpoints so the client can call MapContainer.setBypassRoutes + directly without any client-side geometry lookup. + worldmonitor_supply_chain_v1_NumberRange: + type: object + properties: + min: + type: integer + format: int32 + max: + type: integer + format: int32 + description: Inclusive integer range for transit days / freight USD estimates. + worldmonitor_supply_chain_v1_GetRouteImpactRequest: + type: object + properties: + fromIso2: + type: string + pattern: ^[A-Z]{2}$ + toIso2: + type: string + pattern: ^[A-Z]{2}$ + hs2: + type: string + required: + - fromIso2 + - toIso2 + - hs2 + worldmonitor_supply_chain_v1_GetRouteImpactResponse: + type: object + properties: + laneValueUsd: + type: number + format: double + primaryExporterIso2: + type: string + primaryExporterShare: + type: number + format: double + topStrategicProducts: + type: array + items: + $ref: '#/components/schemas/worldmonitor_supply_chain_v1_StrategicProduct' + resilienceScore: + type: number + format: double + dependencyFlags: + type: array + items: + type: string + enum: + - DEPENDENCY_FLAG_UNSPECIFIED + - DEPENDENCY_FLAG_SINGLE_SOURCE_CRITICAL + - DEPENDENCY_FLAG_SINGLE_CORRIDOR_CRITICAL + - DEPENDENCY_FLAG_COMPOUND_RISK + - DEPENDENCY_FLAG_DIVERSIFIABLE + description: DependencyFlag classifies how a country+sector dependency can fail. + hs2InSeededUniverse: + type: boolean + comtradeSource: + type: string + fetchedAt: + type: string + worldmonitor_supply_chain_v1_StrategicProduct: + type: object + properties: + hs4: + type: string + label: + type: string + totalValueUsd: + type: number + format: double + topExporterIso2: + type: string + topExporterShare: + type: number + format: double + primaryChokepointId: + type: string + worldmonitor_supply_chain_v1_ListPipelinesRequest: + type: object + properties: + commodityType: + type: string + description: Filter to one commodity. Omit (or pass empty) to receive both. + description: |- + ListPipelines returns the full oil and/or gas pipeline registry with + evidence-based status per asset. Registry is curated (see + docs/methodology/pipelines.mdx) and refreshed weekly by + scripts/seed-pipelines-{gas,oil}.mjs. Typical consumer: PipelineStatusPanel + rendering the DeckGL PathLayer. + + The public badge is DERIVED from the evidence bundle server-side at + read time — callers MUST use `public_badge` for display, not invent + their own derivation from `evidence` fields. This keeps the atlas and + MCP clients consistent and versioned together. + worldmonitor_supply_chain_v1_ListPipelinesResponse: + type: object + properties: + pipelines: + type: array + items: + $ref: '#/components/schemas/worldmonitor_supply_chain_v1_PipelineEntry' + fetchedAt: + type: string + classifierVersion: + type: string + upstreamUnavailable: + type: boolean + worldmonitor_supply_chain_v1_PipelineEntry: + type: object + properties: + id: + type: string + name: + type: string + operator: + type: string + commodityType: + type: string + description: Either "gas" or "oil". + fromCountry: + type: string + toCountry: + type: string + transitCountries: + type: array + items: + type: string + capacityBcmYr: + type: number + format: double + capacityMbd: + type: number + format: double + lengthKm: + type: integer + format: int32 + inService: + type: integer + format: int32 + startPoint: + $ref: '#/components/schemas/worldmonitor_supply_chain_v1_LatLon' + endPoint: + $ref: '#/components/schemas/worldmonitor_supply_chain_v1_LatLon' + waypoints: + type: array + items: + $ref: '#/components/schemas/worldmonitor_supply_chain_v1_LatLon' + evidence: + $ref: '#/components/schemas/worldmonitor_supply_chain_v1_PipelineEvidence' + publicBadge: + type: string + description: |- + Server-derived public badge. One of: + "flowing" | "reduced" | "offline" | "disputed" + worldmonitor_supply_chain_v1_LatLon: + type: object + properties: + lat: + type: number + format: double + lon: + type: number + format: double + worldmonitor_supply_chain_v1_PipelineEvidence: + type: object + properties: + physicalState: + type: string + description: 'One of: "flowing" | "reduced" | "offline" | "unknown"' + physicalStateSource: + type: string + description: 'One of: "operator" | "regulator" | "press" | "satellite" | "ais-relay"' + operatorStatement: + $ref: '#/components/schemas/worldmonitor_supply_chain_v1_OperatorStatement' + commercialState: + type: string + description: 'One of: "under_contract" | "expired" | "suspended" | "unknown"' + sanctionRefs: + type: array + items: + $ref: '#/components/schemas/worldmonitor_supply_chain_v1_SanctionRef' + lastEvidenceUpdate: + type: string + classifierVersion: + type: string + classifierConfidence: + type: number + format: double + worldmonitor_supply_chain_v1_OperatorStatement: + type: object + properties: + text: + type: string + url: + type: string + date: + type: string + worldmonitor_supply_chain_v1_SanctionRef: + type: object + properties: + authority: + type: string + listId: + type: string + date: + type: string + url: + type: string + worldmonitor_supply_chain_v1_GetPipelineDetailRequest: + type: object + properties: + pipelineId: + type: string + required: + - pipelineId + description: |- + GetPipelineDetail returns a single pipeline with its full evidence bundle. + Evidence surface here is richer than ListPipelinesResponse — the list view + is designed for the map layer's compact shape; detail is designed for the + click-through drawer. + worldmonitor_supply_chain_v1_GetPipelineDetailResponse: + type: object + properties: + pipeline: + $ref: '#/components/schemas/worldmonitor_supply_chain_v1_PipelineEntry' + revisions: + type: array + items: + $ref: '#/components/schemas/worldmonitor_supply_chain_v1_PipelineRevisionEntry' + fetchedAt: + type: string + unavailable: + type: boolean + worldmonitor_supply_chain_v1_PipelineRevisionEntry: + type: object + properties: + date: + type: string + fieldChanged: + type: string + previousValue: + type: string + newValue: + type: string + trigger: + type: string + description: 'One of: "classifier" | "source" | "decay" | "override"' + sourcesUsed: + type: array + items: + type: string + classifierVersion: + type: string + worldmonitor_supply_chain_v1_ListStorageFacilitiesRequest: + type: object + properties: + facilityType: + type: string + description: |- + Filter to one facility type. Accepts: + "ugs" | "spr" | "lng_export" | "lng_import" | "crude_tank_farm" + Omit (or pass empty) to receive all types. + description: |- + ListStorageFacilities returns the curated strategic storage registry + (underground gas storage, strategic petroleum reserves, LNG terminals, + crude tank farms) with evidence-based status per asset. Registry is + curated (see docs/methodology/storage.mdx) and refreshed weekly by + scripts/seed-storage-facilities.mjs. Typical consumer: + StorageFacilityMapPanel rendering the DeckGL ScatterplotLayer. + + Like pipelines, the public badge is DERIVED from the evidence bundle + server-side at read time. Callers MUST use `public_badge` for display + rather than inventing their own derivation from `evidence` fields, so + the atlas and MCP clients stay consistent and versioned together. + worldmonitor_supply_chain_v1_ListStorageFacilitiesResponse: + type: object + properties: + facilities: + type: array + items: + $ref: '#/components/schemas/worldmonitor_supply_chain_v1_StorageFacilityEntry' + fetchedAt: + type: string + classifierVersion: + type: string + upstreamUnavailable: + type: boolean + worldmonitor_supply_chain_v1_StorageFacilityEntry: + type: object + properties: + id: + type: string + name: + type: string + operator: + type: string + facilityType: + type: string + description: 'One of: "ugs" | "spr" | "lng_export" | "lng_import" | "crude_tank_farm"' + country: + type: string + location: + $ref: '#/components/schemas/worldmonitor_supply_chain_v1_StorageLatLon' + capacityTwh: + type: number + format: double + description: |- + Working capacity in the facility's native unit (see working_capacity_unit). + Exactly ONE of these is populated per facility, chosen by facility_type: + ugs → capacity_twh + spr, crude_tank_farm → capacity_mb + lng_export, lng_import → capacity_mtpa + capacityMb: + type: number + format: double + capacityMtpa: + type: number + format: double + workingCapacityUnit: + type: string + description: 'One of: "TWh" | "Mb" | "Mtpa"' + inService: + type: integer + format: int32 + evidence: + $ref: '#/components/schemas/worldmonitor_supply_chain_v1_StorageEvidence' + publicBadge: + type: string + description: |- + Server-derived public badge. One of: + "operational" | "reduced" | "offline" | "disputed" + worldmonitor_supply_chain_v1_StorageLatLon: + type: object + properties: + lat: + type: number + format: double + lon: + type: number + format: double + worldmonitor_supply_chain_v1_StorageEvidence: + type: object + properties: + physicalState: + type: string + description: 'One of: "operational" | "reduced" | "offline" | "under_construction" | "unknown"' + physicalStateSource: + type: string + description: 'One of: "operator" | "regulator" | "press" | "satellite" | "ais-relay"' + operatorStatement: + $ref: '#/components/schemas/worldmonitor_supply_chain_v1_StorageOperatorStatement' + commercialState: + type: string + description: 'One of: "under_contract" | "expired" | "suspended" | "unknown"' + sanctionRefs: + type: array + items: + $ref: '#/components/schemas/worldmonitor_supply_chain_v1_StorageSanctionRef' + fillDisclosed: + type: boolean + description: |- + Whether working-gas / stock-level fill is publicly disclosed for this + asset. LNG export terminals, for instance, tend NOT to disclose; UGS + sites in Europe are required to disclose via GIE AGSI+. + fillSource: + type: string + description: |- + Source of the disclosed fill series ("GIE AGSI+", "EIA SPR weekly + stock report", etc.). Empty when fill_disclosed=false. + lastEvidenceUpdate: + type: string + classifierVersion: + type: string + classifierConfidence: + type: number + format: double + worldmonitor_supply_chain_v1_StorageOperatorStatement: + type: object + properties: + text: + type: string + url: + type: string + date: + type: string + worldmonitor_supply_chain_v1_StorageSanctionRef: + type: object + properties: + authority: + type: string + listId: + type: string + date: + type: string + url: + type: string + worldmonitor_supply_chain_v1_GetStorageFacilityDetailRequest: + type: object + properties: + facilityId: + type: string + required: + - facilityId + description: |- + GetStorageFacilityDetail returns a single facility with its full evidence + bundle + revision log. Revisions land in Week 3 alongside the disruption + event log (Week 3 milestone — empty array in v1). + worldmonitor_supply_chain_v1_GetStorageFacilityDetailResponse: + type: object + properties: + facility: + $ref: '#/components/schemas/worldmonitor_supply_chain_v1_StorageFacilityEntry' + revisions: + type: array + items: + $ref: '#/components/schemas/worldmonitor_supply_chain_v1_StorageFacilityRevisionEntry' + fetchedAt: + type: string + unavailable: + type: boolean + worldmonitor_supply_chain_v1_StorageFacilityRevisionEntry: + type: object + properties: + date: + type: string + fieldChanged: + type: string + previousValue: + type: string + newValue: + type: string + trigger: + type: string + description: 'One of: "classifier" | "source" | "decay" | "override"' + sourcesUsed: + type: array + items: + type: string + classifierVersion: + type: string + worldmonitor_supply_chain_v1_ListFuelShortagesRequest: + type: object + properties: + country: + type: string + description: Filter to one ISO 3166-1 alpha-2 country. Omit for global. + product: + type: string + description: |- + Filter to one product. Accepts: "petrol" | "diesel" | "jet" | "heating_oil". + Omit for all products. + severity: + type: string + description: 'Filter to one severity. Accepts: "confirmed" | "watch". Omit for both.' + description: |- + ListFuelShortages returns the global fuel-shortage alert registry. + Seeded from a curated JSON file (scripts/data/fuel-shortages.json). + An LLM classifier extension was scoped but not shipped — the registry + is curated-only today. Severity ("confirmed" or "watch") is a row + field authored at curation time; the evidence is shipped alongside + so agents and humans can audit the grounds for a severity label. + + See docs/methodology/shortages.mdx for the evidence-threshold spec. + worldmonitor_supply_chain_v1_ListFuelShortagesResponse: + type: object + properties: + shortages: + type: array + items: + $ref: '#/components/schemas/worldmonitor_supply_chain_v1_FuelShortageEntry' + fetchedAt: + type: string + classifierVersion: + type: string + upstreamUnavailable: + type: boolean + worldmonitor_supply_chain_v1_FuelShortageEntry: + type: object + properties: + id: + type: string + country: + type: string + product: + type: string + description: 'One of: "petrol" | "diesel" | "jet" | "heating_oil"' + severity: + type: string + description: 'One of: "confirmed" | "watch" (classifier output — not a client-side derivation)' + firstSeen: + type: string + lastConfirmed: + type: string + resolvedAt: + type: string + description: Empty string when not yet resolved. + impactTypes: + type: array + items: + type: string + description: |- + Observable consumer-facing impacts. Subset of: + "stations_closed" | "rationing" | "flights_cancelled" | "import_cut" | "price_spike" + causeChain: + type: array + items: + type: string + description: |- + Contributing root causes, ordered primary-first. Subset of: + "upstream_refinery" | "logistics" | "policy" | "chokepoint" | + "sanction" | "war" | "import_cut" + shortDescription: + type: string + evidence: + $ref: '#/components/schemas/worldmonitor_supply_chain_v1_FuelShortageEvidence' + worldmonitor_supply_chain_v1_FuelShortageEvidence: + type: object + properties: + evidenceSources: + type: array + items: + $ref: '#/components/schemas/worldmonitor_supply_chain_v1_FuelShortageEvidenceSource' + firstRegulatorConfirmation: + type: string + description: |- + ISO date of the first regulator confirmation, if any. Empty when + severity is "watch" on press-only signal. + classifierVersion: + type: string + classifierConfidence: + type: number + format: double + lastEvidenceUpdate: + type: string + worldmonitor_supply_chain_v1_FuelShortageEvidenceSource: + type: object + properties: + authority: + type: string + title: + type: string + url: + type: string + date: + type: string + sourceType: + type: string + description: 'One of: "regulator" | "operator" | "press" | "ais-relay" | "satellite"' + worldmonitor_supply_chain_v1_GetFuelShortageDetailRequest: + type: object + properties: + shortageId: + type: string + required: + - shortageId + description: |- + GetFuelShortageDetail returns a single shortage with full evidence + bundle + citation timeline. Loaded lazily on drawer open. + worldmonitor_supply_chain_v1_GetFuelShortageDetailResponse: + type: object + properties: + shortage: + $ref: '#/components/schemas/worldmonitor_supply_chain_v1_FuelShortageEntry' + fetchedAt: + type: string + unavailable: + type: boolean + worldmonitor_supply_chain_v1_ListEnergyDisruptionsRequest: + type: object + properties: + assetId: + type: string + description: |- + Filter to one asset. Omit for all. When set, also narrows to the + matching asset_type if provided. + assetType: + type: string + description: 'Filter to one asset type. Accepts: "pipeline" | "storage".' + ongoingOnly: + type: boolean + description: If true, only return events with endAt empty (still ongoing). + description: |- + ListEnergyDisruptions returns the energy disruption event log — state + transitions for pipelines and storage facilities (sabotage, sanction, + maintenance, mechanical, weather, commercial, war). Each event ties + back to an assetId seeded by the pipeline or storage registry, so the + panel drawer can render an asset-scoped timeline without a second RPC. + + Seeded from a curated JSON file (scripts/data/energy-disruptions.json). + An automated state-transition classifier was scoped but not shipped — + the log is curated-only today. + + See docs/methodology/disruptions.mdx. + worldmonitor_supply_chain_v1_ListEnergyDisruptionsResponse: + type: object + properties: + events: + type: array + items: + $ref: '#/components/schemas/worldmonitor_supply_chain_v1_EnergyDisruptionEntry' + fetchedAt: + type: string + classifierVersion: + type: string + upstreamUnavailable: + type: boolean + worldmonitor_supply_chain_v1_EnergyDisruptionEntry: + type: object + properties: + id: + type: string + assetId: + type: string + description: Maps to a pipeline or storage-facility id seeded elsewhere. + assetType: + type: string + description: 'One of: "pipeline" | "storage"' + eventType: + type: string + description: |- + One of: "sabotage" | "sanction" | "maintenance" | "mechanical" | + "weather" | "commercial" | "war" | "other" + startAt: + type: string + endAt: + type: string + description: Empty string when event is still ongoing. + capacityOfflineBcmYr: + type: number + format: double + description: Headline-offline capacity (contextual — 0 when not applicable). + capacityOfflineMbd: + type: number + format: double + causeChain: + type: array + items: + type: string + description: Contributing causes, primary-first. + shortDescription: + type: string + sources: + type: array + items: + $ref: '#/components/schemas/worldmonitor_supply_chain_v1_EnergyDisruptionSource' + classifierVersion: + type: string + classifierConfidence: + type: number + format: double + lastEvidenceUpdate: + type: string + worldmonitor_supply_chain_v1_EnergyDisruptionSource: + type: object + properties: + authority: + type: string + title: + type: string + url: + type: string + date: + type: string + sourceType: + type: string + worldmonitor_thermal_v1_ListThermalEscalationsRequest: + type: object + properties: + maxItems: + type: integer + format: int32 + worldmonitor_thermal_v1_ListThermalEscalationsResponse: + type: object + properties: + fetchedAt: + type: string + observationWindowHours: + type: integer + format: int32 + sourceVersion: + type: string + clusters: + type: array + items: + $ref: '#/components/schemas/worldmonitor_thermal_v1_ThermalEscalationCluster' + summary: + $ref: '#/components/schemas/worldmonitor_thermal_v1_ThermalEscalationSummary' + worldmonitor_thermal_v1_ThermalEscalationCluster: + type: object + properties: + id: + type: string + centroid: + $ref: '#/components/schemas/worldmonitor_core_v1_GeoCoordinates' + countryCode: + type: string + countryName: + type: string + regionLabel: + type: string + firstDetectedAt: + type: string + lastDetectedAt: + type: string + observationCount: + type: integer + format: int32 + uniqueSourceCount: + type: integer + format: int32 + maxBrightness: + type: number + format: double + avgBrightness: + type: number + format: double + maxFrp: + type: number + format: double + totalFrp: + type: number + format: double + nightDetectionShare: + type: number + format: double + baselineExpectedCount: + type: number + format: double + baselineExpectedFrp: + type: number + format: double + countDelta: + type: number + format: double + frpDelta: + type: number + format: double + zScore: + type: number + format: double + persistenceHours: + type: number + format: double + status: + type: string + enum: + - THERMAL_STATUS_UNSPECIFIED + - THERMAL_STATUS_NORMAL + - THERMAL_STATUS_ELEVATED + - THERMAL_STATUS_SPIKE + - THERMAL_STATUS_PERSISTENT + context: + type: string + enum: + - THERMAL_CONTEXT_UNSPECIFIED + - THERMAL_CONTEXT_WILDLAND + - THERMAL_CONTEXT_URBAN_EDGE + - THERMAL_CONTEXT_INDUSTRIAL + - THERMAL_CONTEXT_ENERGY_ADJACENT + - THERMAL_CONTEXT_CONFLICT_ADJACENT + - THERMAL_CONTEXT_LOGISTICS_ADJACENT + - THERMAL_CONTEXT_MIXED + confidence: + type: string + enum: + - THERMAL_CONFIDENCE_UNSPECIFIED + - THERMAL_CONFIDENCE_LOW + - THERMAL_CONFIDENCE_MEDIUM + - THERMAL_CONFIDENCE_HIGH + strategicRelevance: + type: string + enum: + - THERMAL_RELEVANCE_UNSPECIFIED + - THERMAL_RELEVANCE_LOW + - THERMAL_RELEVANCE_MEDIUM + - THERMAL_RELEVANCE_HIGH + nearbyAssets: + type: array + items: + type: string + narrativeFlags: + type: array + items: + type: string + worldmonitor_thermal_v1_ThermalEscalationSummary: + type: object + properties: + clusterCount: + type: integer + format: int32 + elevatedCount: + type: integer + format: int32 + spikeCount: + type: integer + format: int32 + persistentCount: + type: integer + format: int32 + conflictAdjacentCount: + type: integer + format: int32 + highRelevanceCount: + type: integer + format: int32 + worldmonitor_trade_v1_GetTradeRestrictionsRequest: + type: object + properties: + countries: + type: array + items: + type: string + description: WTO member codes to filter by. Empty = all. + limit: + type: integer + format: int32 + description: Max results to return (server caps at 100). + description: Request for quantitative restriction data. + worldmonitor_trade_v1_GetTradeRestrictionsResponse: + type: object + properties: + restrictions: + type: array + items: + $ref: '#/components/schemas/worldmonitor_trade_v1_TradeRestriction' + fetchedAt: + type: string + description: ISO 8601 timestamp when data was fetched from WTO. + upstreamUnavailable: + type: boolean + description: True if upstream fetch failed and results may be stale/empty. + description: Response containing trade restrictions and fetch metadata. + worldmonitor_trade_v1_TradeRestriction: + type: object + properties: + id: + type: string + description: Unique restriction identifier from WTO. + reportingCountry: + type: string + description: ISO 3166-1 alpha-3 or WTO member code of reporting country. + affectedCountry: + type: string + description: Country affected by the restriction. + productSector: + type: string + description: Product sector or HS chapter description. + measureType: + type: string + description: 'Measure classification: "QR", "EXPORT_BAN", "IMPORT_BAN", "LICENSING".' + description: + type: string + description: Human-readable description of the measure. + status: + type: string + description: 'Current status: "IN_FORCE", "TERMINATED", "NOTIFIED".' + notifiedAt: + type: string + description: ISO 8601 date when measure was notified. + sourceUrl: + type: string + description: WTO source document URL (must be http/https protocol). + description: Quantitative restriction or export control measure notified to WTO. + worldmonitor_trade_v1_GetTariffTrendsRequest: + type: object + properties: + reportingCountry: + type: string + description: WTO member code of reporting country (e.g. "840" = US). + partnerCountry: + type: string + description: WTO member code of partner country (e.g. "156" = China). + productSector: + type: string + description: Product sector filter (HS chapter). Empty = aggregate. + years: + type: integer + format: int32 + description: Number of years to look back (default 10, max 30). + description: Request for tariff timeseries data. + worldmonitor_trade_v1_GetTariffTrendsResponse: + type: object + properties: + datapoints: + type: array + items: + $ref: '#/components/schemas/worldmonitor_trade_v1_TariffDataPoint' + fetchedAt: + type: string + description: ISO 8601 timestamp when data was fetched from WTO. + upstreamUnavailable: + type: boolean + description: True if upstream fetch failed and results may be stale/empty. + effectiveTariffRate: + $ref: '#/components/schemas/worldmonitor_trade_v1_EffectiveTariffRate' + description: Response containing tariff trend datapoints. + worldmonitor_trade_v1_TariffDataPoint: + type: object + properties: + reportingCountry: + type: string + description: WTO member code of reporting country. + partnerCountry: + type: string + description: WTO member code of partner country. + productSector: + type: string + description: Product sector or HS chapter. + year: + type: integer + format: int32 + description: Year of observation. + tariffRate: + type: number + format: double + description: Applied MFN tariff rate (percentage). + boundRate: + type: number + format: double + description: WTO bound tariff rate (percentage). + indicatorCode: + type: string + description: WTO indicator code used for this datapoint. + description: Single tariff data point for a reporter-partner-product combination. + worldmonitor_trade_v1_EffectiveTariffRate: + type: object + properties: + sourceName: + type: string + description: Source name for the effective-rate estimate. + sourceUrl: + type: string + description: Canonical source URL for the estimate/methodology. + observationPeriod: + type: string + description: Human-readable observation period (for example "December 2025"). + updatedAt: + type: string + description: ISO 8601 date when the source page was last updated, if known. + tariffRate: + type: number + format: double + description: Effective tariff rate (percentage). + description: Current effective tariff estimate for countries with coverage beyond WTO MFN baselines. + worldmonitor_trade_v1_GetTradeFlowsRequest: + type: object + properties: + reportingCountry: + type: string + description: WTO member code of reporting country. + partnerCountry: + type: string + description: WTO member code of partner country. + years: + type: integer + format: int32 + description: Number of years to look back (default 10, max 30). + description: Request for bilateral trade flow data. + worldmonitor_trade_v1_GetTradeFlowsResponse: + type: object + properties: + flows: + type: array + items: + $ref: '#/components/schemas/worldmonitor_trade_v1_TradeFlowRecord' + fetchedAt: + type: string + description: ISO 8601 timestamp when data was fetched from WTO. + upstreamUnavailable: + type: boolean + description: True if upstream fetch failed and results may be stale/empty. + description: Response containing trade flow records. + worldmonitor_trade_v1_TradeFlowRecord: + type: object + properties: + reportingCountry: + type: string + description: WTO member code of reporting country. + partnerCountry: + type: string + description: WTO member code of partner country. + year: + type: integer + format: int32 + description: Year of observation. + exportValueUsd: + type: number + format: double + description: Merchandise export value in millions USD. + importValueUsd: + type: number + format: double + description: Merchandise import value in millions USD. + yoyExportChange: + type: number + format: double + description: Year-over-year export change (percentage). + yoyImportChange: + type: number + format: double + description: Year-over-year import change (percentage). + productSector: + type: string + description: Product sector or HS chapter. + description: Bilateral trade flow record for a reporting-partner pair. + worldmonitor_trade_v1_GetTradeBarriersRequest: + type: object + properties: + countries: + type: array + items: + type: string + description: WTO member codes to filter by. Empty = all. + measureType: + type: string + description: 'Filter by measure type: "SPS", "TBT", or empty for both.' + limit: + type: integer + format: int32 + description: Max results to return (server caps at 100). + description: Request for SPS/TBT trade barrier notifications. + worldmonitor_trade_v1_GetTradeBarriersResponse: + type: object + properties: + barriers: + type: array + items: + $ref: '#/components/schemas/worldmonitor_trade_v1_TradeBarrier' + fetchedAt: + type: string + description: ISO 8601 timestamp when data was fetched from WTO. + upstreamUnavailable: + type: boolean + description: True if upstream fetch failed and results may be stale/empty. + description: Response containing trade barrier notifications. + worldmonitor_trade_v1_TradeBarrier: + type: object + properties: + id: + type: string + description: Unique barrier notification identifier. + notifyingCountry: + type: string + description: Country that notified the measure. + title: + type: string + description: Title of the notification. + measureType: + type: string + description: 'Measure classification: "SPS" or "TBT".' + productDescription: + type: string + description: Product description or affected goods. + objective: + type: string + description: Stated objective of the measure. + status: + type: string + description: Status of the notification. + dateDistributed: + type: string + description: ISO 8601 date when notification was distributed. + sourceUrl: + type: string + description: WTO source document URL (must be http/https protocol). + description: SPS or TBT trade barrier notification. + worldmonitor_trade_v1_GetCustomsRevenueRequest: + type: object + worldmonitor_trade_v1_GetCustomsRevenueResponse: + type: object + properties: + months: + type: array + items: + $ref: '#/components/schemas/worldmonitor_trade_v1_CustomsRevenueMonth' + fetchedAt: + type: string + upstreamUnavailable: + type: boolean + worldmonitor_trade_v1_CustomsRevenueMonth: + type: object + properties: + recordDate: + type: string + fiscalYear: + type: integer + format: int32 + calendarYear: + type: integer + format: int32 + calendarMonth: + type: integer + format: int32 + monthlyAmountBillions: + type: number + format: double + fytdAmountBillions: + type: number + format: double + description: Monthly US customs duties revenue from Treasury MTS data. + worldmonitor_trade_v1_ListComtradeFlowsRequest: + type: object + properties: + reporterCode: + type: string + description: UN Comtrade reporter code (e.g. "842" = US, "156" = China). Empty returns all reporters. + cmdCode: + type: string + description: HS commodity code (e.g. "2709" = crude oil). Empty returns all commodities. + anomaliesOnly: + type: boolean + description: If true, only return flows with a year-over-year change exceeding 30%. + description: ListComtradeFlowsRequest filters strategic commodity trade flows. + worldmonitor_trade_v1_ListComtradeFlowsResponse: + type: object + properties: + flows: + type: array + items: + $ref: '#/components/schemas/worldmonitor_trade_v1_ComtradeFlowRecord' + fetchedAt: + type: string + description: ISO 8601 timestamp when data was seeded. + upstreamUnavailable: + type: boolean + description: True if seeded data is missing or stale. + description: ListComtradeFlowsResponse contains strategic commodity trade flows. + worldmonitor_trade_v1_ComtradeFlowRecord: + type: object + properties: + reporterCode: + type: string + description: UN Comtrade reporter code. + reporterName: + type: string + description: Reporter country name. + partnerCode: + type: string + description: Partner country code ("000" = world total). + partnerName: + type: string + description: Partner country name. + cmdCode: + type: string + description: HS commodity code. + cmdDesc: + type: string + description: Commodity description. + year: + type: integer + format: int32 + description: Reporting year. + tradeValueUsd: + type: number + format: double + description: Trade value in USD. + netWeightKg: + type: number + format: double + description: Net weight in kg. + yoyChange: + type: number + format: double + description: Year-over-year change (ratio, e.g. 0.35 = +35%). + isAnomaly: + type: boolean + description: True if the YoY change exceeds the anomaly threshold (30%). + description: ComtradeFlowRecord is a single bilateral commodity flow record. + worldmonitor_unrest_v1_ListUnrestEventsRequest: + type: object + properties: + start: + type: integer + format: int64 + description: 'Start of time range (inclusive), Unix epoch milliseconds.. Warning: Values > 2^53 may lose precision in JavaScript' + end: + type: integer + format: int64 + description: 'End of time range (inclusive), Unix epoch milliseconds.. Warning: Values > 2^53 may lose precision in JavaScript' + pageSize: + type: integer + format: int32 + description: Maximum items per page (1-100). + cursor: + type: string + description: Cursor for next page. + country: + type: string + description: Optional country filter (ISO 3166-1 alpha-2). + minSeverity: + type: string + enum: + - SEVERITY_LEVEL_UNSPECIFIED + - SEVERITY_LEVEL_LOW + - SEVERITY_LEVEL_MEDIUM + - SEVERITY_LEVEL_HIGH + description: |- + SeverityLevel represents a three-tier severity classification used across domains. + Maps to existing TS unions: 'low' | 'medium' | 'high'. + neLat: + type: number + format: double + description: North-east corner latitude of bounding box. + neLon: + type: number + format: double + description: North-east corner longitude of bounding box. + swLat: + type: number + format: double + description: South-west corner latitude of bounding box. + swLon: + type: number + format: double + description: South-west corner longitude of bounding box. + description: ListUnrestEventsRequest specifies filters for retrieving social unrest events. + worldmonitor_unrest_v1_ListUnrestEventsResponse: + type: object + properties: + events: + type: array + items: + $ref: '#/components/schemas/worldmonitor_unrest_v1_UnrestEvent' + clusters: + type: array + items: + $ref: '#/components/schemas/worldmonitor_unrest_v1_UnrestCluster' + pagination: + $ref: '#/components/schemas/worldmonitor_core_v1_PaginationResponse' + description: ListUnrestEventsResponse contains unrest events and clusters matching the request. + worldmonitor_unrest_v1_UnrestEvent: + type: object + properties: + id: + type: string + minLength: 1 + description: Unique event identifier. + title: + type: string + description: Event title or headline. + summary: + type: string + description: Brief summary of the event. + eventType: + type: string + enum: + - UNREST_EVENT_TYPE_UNSPECIFIED + - UNREST_EVENT_TYPE_PROTEST + - UNREST_EVENT_TYPE_RIOT + - UNREST_EVENT_TYPE_STRIKE + - UNREST_EVENT_TYPE_DEMONSTRATION + - UNREST_EVENT_TYPE_CIVIL_UNREST + description: |- + UnrestEventType represents the classification of a social unrest event. + Maps to existing TS union: 'protest' | 'riot' | 'strike' | 'demonstration' | 'civil_unrest'. + city: + type: string + description: City where the event occurred. + country: + type: string + description: Country where the event occurred. + region: + type: string + description: Administrative region within the country. + location: + $ref: '#/components/schemas/worldmonitor_core_v1_GeoCoordinates' + occurredAt: + type: integer + format: int64 + description: 'Time the event occurred, as Unix epoch milliseconds.. Warning: Values > 2^53 may lose precision in JavaScript' + severity: + type: string + enum: + - SEVERITY_LEVEL_UNSPECIFIED + - SEVERITY_LEVEL_LOW + - SEVERITY_LEVEL_MEDIUM + - SEVERITY_LEVEL_HIGH + description: |- + SeverityLevel represents a three-tier severity classification used across domains. + Maps to existing TS unions: 'low' | 'medium' | 'high'. + fatalities: + type: integer + format: int32 + description: Reported fatalities, if any. + sources: + type: array + items: + type: string + description: Source identifiers. + sourceType: + type: string + enum: + - UNREST_SOURCE_TYPE_UNSPECIFIED + - UNREST_SOURCE_TYPE_ACLED + - UNREST_SOURCE_TYPE_GDELT + - UNREST_SOURCE_TYPE_RSS + description: |- + UnrestSourceType represents the data source for an unrest event. + Maps to existing TS union: 'acled' | 'gdelt' | 'rss'. + tags: + type: array + items: + type: string + description: Descriptive tags. + actors: + type: array + items: + type: string + description: Named actors involved. + confidence: + type: string + enum: + - CONFIDENCE_LEVEL_UNSPECIFIED + - CONFIDENCE_LEVEL_LOW + - CONFIDENCE_LEVEL_MEDIUM + - CONFIDENCE_LEVEL_HIGH + description: |- + ConfidenceLevel represents the confidence in event data accuracy. + Used across multiple domains. + required: + - id + description: |- + UnrestEvent represents a social unrest incident (protest, riot, strike, etc.). + Aggregated from ACLED and GDELT sources. + worldmonitor_unrest_v1_UnrestCluster: + type: object + properties: + id: + type: string + description: Unique cluster identifier. + country: + type: string + description: Country of the cluster. + region: + type: string + description: Region within the country. + eventCount: + type: integer + format: int32 + description: Number of events in this cluster. + events: + type: array + items: + $ref: '#/components/schemas/worldmonitor_unrest_v1_UnrestEvent' + severity: + type: string + enum: + - SEVERITY_LEVEL_UNSPECIFIED + - SEVERITY_LEVEL_LOW + - SEVERITY_LEVEL_MEDIUM + - SEVERITY_LEVEL_HIGH + description: |- + SeverityLevel represents a three-tier severity classification used across domains. + Maps to existing TS unions: 'low' | 'medium' | 'high'. + startAt: + type: integer + format: int64 + description: 'Start of the cluster time window, as Unix epoch milliseconds.. Warning: Values > 2^53 may lose precision in JavaScript' + endAt: + type: integer + format: int64 + description: 'End of the cluster time window, as Unix epoch milliseconds.. Warning: Values > 2^53 may lose precision in JavaScript' + primaryCause: + type: string + description: Primary cause or theme of the unrest. + description: UnrestCluster represents a geographic cluster of related unrest events. + worldmonitor_webcam_v1_ListWebcamsRequest: + type: object + properties: + zoom: + type: integer + format: int32 + boundW: + type: number + format: double + boundS: + type: number + format: double + boundE: + type: number + format: double + boundN: + type: number + format: double + worldmonitor_webcam_v1_ListWebcamsResponse: + type: object + properties: + webcams: + type: array + items: + $ref: '#/components/schemas/worldmonitor_webcam_v1_WebcamEntry' + clusters: + type: array + items: + $ref: '#/components/schemas/worldmonitor_webcam_v1_WebcamCluster' + totalInView: + type: integer + format: int32 + worldmonitor_webcam_v1_WebcamEntry: + type: object + properties: + webcamId: + type: string + title: + type: string + lat: + type: number + format: double + lng: + type: number + format: double + category: + type: string + country: + type: string + worldmonitor_webcam_v1_WebcamCluster: + type: object + properties: + lat: + type: number + format: double + lng: + type: number + format: double + count: + type: integer + format: int32 + categories: + type: array + items: + type: string + worldmonitor_webcam_v1_GetWebcamImageRequest: + type: object + properties: + webcamId: + type: string + worldmonitor_webcam_v1_GetWebcamImageResponse: + type: object + properties: + thumbnailUrl: + type: string + playerUrl: + type: string + title: + type: string + windyUrl: + type: string + lastUpdated: + type: string + format: int64 + error: + type: string + worldmonitor_wildfire_v1_ListFireDetectionsRequest: + type: object + properties: + start: + type: integer + format: int64 + description: 'Start of time range (inclusive), Unix epoch milliseconds.. Warning: Values > 2^53 may lose precision in JavaScript' + end: + type: integer + format: int64 + description: 'End of time range (inclusive), Unix epoch milliseconds.. Warning: Values > 2^53 may lose precision in JavaScript' + pageSize: + type: integer + format: int32 + description: Maximum items per page (1-100). + cursor: + type: string + description: Cursor for next page. + neLat: + type: number + format: double + description: North-east latitude of bounding box. + neLon: + type: number + format: double + description: North-east longitude of bounding box. + swLat: + type: number + format: double + description: South-west latitude of bounding box. + swLon: + type: number + format: double + description: South-west longitude of bounding box. + description: ListFireDetectionsRequest specifies filters for retrieving fire detections from NASA FIRMS. + worldmonitor_wildfire_v1_ListFireDetectionsResponse: + type: object + properties: + fireDetections: + type: array + items: + $ref: '#/components/schemas/worldmonitor_wildfire_v1_FireDetection' + pagination: + $ref: '#/components/schemas/worldmonitor_core_v1_PaginationResponse' + description: ListFireDetectionsResponse contains the list of fire detections matching the request filters. + worldmonitor_wildfire_v1_FireDetection: + type: object + properties: + id: + type: string + maxLength: 100 + minLength: 1 + description: Unique detection identifier. + location: + $ref: '#/components/schemas/worldmonitor_core_v1_GeoCoordinates' + brightness: + type: number + format: double + description: Brightness temperature in Kelvin. + frp: + type: number + format: double + description: Fire radiative power in MW. + confidence: + type: string + enum: + - FIRE_CONFIDENCE_UNSPECIFIED + - FIRE_CONFIDENCE_LOW + - FIRE_CONFIDENCE_NOMINAL + - FIRE_CONFIDENCE_HIGH + description: FireConfidence represents the confidence level of a fire detection. + satellite: + type: string + description: Satellite that detected the fire (e.g., "MODIS", "VIIRS", "LANDSAT"). + detectedAt: + type: integer + format: int64 + description: 'Time the fire was detected, as Unix epoch milliseconds.. Warning: Values > 2^53 may lose precision in JavaScript' + region: + type: string + description: Monitored region name (e.g., "Ukraine", "Russia", "Iran"). + dayNight: + type: string + description: Day or night detection ("D" or "N"). + possibleExplosion: + type: boolean + description: |- + Whether the thermal signature suggests a possible explosion rather than a fire + (FRP > 80 MW and brightness > 380 K). + required: + - id + description: FireDetection represents a satellite-detected active fire from NASA FIRMS. diff --git a/proto/buf.gen.yaml b/proto/buf.gen.yaml index 4bfe03778..a55f4d358 100644 --- a/proto/buf.gen.yaml +++ b/proto/buf.gen.yaml @@ -29,3 +29,19 @@ plugins: out: ../docs/api opt: - format=json + + # Unified bundle spanning all WorldMonitor services (sebuf >= 0.11.0). + # Emits docs/api/worldmonitor.openapi.yaml alongside the per-service files. + - local: protoc-gen-openapiv3 + out: ../docs/api + strategy: all + opt: + - bundle=true + - bundle_only=true + - bundle_output=worldmonitor.openapi.yaml + - bundle_title=WorldMonitor API + - bundle_version=1.0.0 + - bundle_description=Unified OpenAPI bundle spanning all WorldMonitor services. + - bundle_server=https://api.worldmonitor.app + - bundle_contact_name=WorldMonitor + - bundle_contact_email=support@worldmonitor.app diff --git a/src/generated/client/worldmonitor/aviation/v1/service_client.ts b/src/generated/client/worldmonitor/aviation/v1/service_client.ts index b7ff03a46..67d21faa7 100644 --- a/src/generated/client/worldmonitor/aviation/v1/service_client.ts +++ b/src/generated/client/worldmonitor/aviation/v1/service_client.ts @@ -1,4 +1,3 @@ -// @ts-nocheck // Code generated by protoc-gen-ts-client. DO NOT EDIT. // source: worldmonitor/aviation/v1/service.proto @@ -396,8 +395,8 @@ export class AviationServiceClient { const params = new URLSearchParams(); if (req.pageSize != null && req.pageSize !== 0) params.set("page_size", String(req.pageSize)); if (req.cursor != null && req.cursor !== "") params.set("cursor", String(req.cursor)); - if (req.region != null && req.region !== "") params.set("region", String(req.region)); - if (req.minSeverity != null && req.minSeverity !== "") params.set("min_severity", String(req.minSeverity)); + if (req.region != null && req.region !== "AIRPORT_REGION_UNSPECIFIED") params.set("region", String(req.region)); + if (req.minSeverity != null && req.minSeverity !== "FLIGHT_DELAY_SEVERITY_UNSPECIFIED") params.set("min_severity", String(req.minSeverity)); const url = this.baseURL + path + (params.toString() ? "?" + params.toString() : ""); const headers: Record = { @@ -422,7 +421,7 @@ export class AviationServiceClient { async getAirportOpsSummary(req: GetAirportOpsSummaryRequest, options?: AviationServiceCallOptions): Promise { let path = "/api/aviation/v1/get-airport-ops-summary"; const params = new URLSearchParams(); - if (req.airports != null && req.airports !== "") params.set("airports", String(req.airports)); + if (req.airports && req.airports.length > 0) req.airports.forEach(v => params.append("airports", v)); const url = this.baseURL + path + (params.toString() ? "?" + params.toString() : ""); const headers: Record = { @@ -448,7 +447,7 @@ export class AviationServiceClient { let path = "/api/aviation/v1/list-airport-flights"; const params = new URLSearchParams(); if (req.airport != null && req.airport !== "") params.set("airport", String(req.airport)); - if (req.direction != null && req.direction !== "") params.set("direction", String(req.direction)); + if (req.direction != null && req.direction !== "FLIGHT_DIRECTION_UNSPECIFIED") params.set("direction", String(req.direction)); if (req.limit != null && req.limit !== 0) params.set("limit", String(req.limit)); const url = this.baseURL + path + (params.toString() ? "?" + params.toString() : ""); @@ -474,7 +473,7 @@ export class AviationServiceClient { async getCarrierOps(req: GetCarrierOpsRequest, options?: AviationServiceCallOptions): Promise { let path = "/api/aviation/v1/get-carrier-ops"; const params = new URLSearchParams(); - if (req.airports != null && req.airports !== "") params.set("airports", String(req.airports)); + if (req.airports && req.airports.length > 0) req.airports.forEach(v => params.append("airports", v)); if (req.minFlights != null && req.minFlights !== 0) params.set("min_flights", String(req.minFlights)); const url = this.baseURL + path + (params.toString() ? "?" + params.toString() : ""); @@ -588,7 +587,7 @@ export class AviationServiceClient { if (req.departureDate != null && req.departureDate !== "") params.set("departure_date", String(req.departureDate)); if (req.returnDate != null && req.returnDate !== "") params.set("return_date", String(req.returnDate)); if (req.adults != null && req.adults !== 0) params.set("adults", String(req.adults)); - if (req.cabin != null && req.cabin !== "") params.set("cabin", String(req.cabin)); + if (req.cabin != null && req.cabin !== "CABIN_CLASS_UNSPECIFIED") params.set("cabin", String(req.cabin)); if (req.nonstopOnly) params.set("nonstop_only", String(req.nonstopOnly)); if (req.maxResults != null && req.maxResults !== 0) params.set("max_results", String(req.maxResults)); if (req.currency != null && req.currency !== "") params.set("currency", String(req.currency)); @@ -617,7 +616,7 @@ export class AviationServiceClient { async listAviationNews(req: ListAviationNewsRequest, options?: AviationServiceCallOptions): Promise { let path = "/api/aviation/v1/list-aviation-news"; const params = new URLSearchParams(); - if (req.entities != null && req.entities !== "") params.set("entities", String(req.entities)); + if (req.entities && req.entities.length > 0) req.entities.forEach(v => params.append("entities", v)); if (req.windowHours != null && req.windowHours !== 0) params.set("window_hours", String(req.windowHours)); if (req.maxItems != null && req.maxItems !== 0) params.set("max_items", String(req.maxItems)); const url = this.baseURL + path + (params.toString() ? "?" + params.toString() : ""); @@ -651,7 +650,7 @@ export class AviationServiceClient { if (req.cabinClass != null && req.cabinClass !== "") params.set("cabin_class", String(req.cabinClass)); if (req.maxStops != null && req.maxStops !== "") params.set("max_stops", String(req.maxStops)); if (req.departureWindow != null && req.departureWindow !== "") params.set("departure_window", String(req.departureWindow)); - if (req.airlines != null && req.airlines !== "") params.set("airlines", String(req.airlines)); + if (req.airlines && req.airlines.length > 0) req.airlines.forEach(v => params.append("airlines", v)); if (req.sortBy != null && req.sortBy !== "") params.set("sort_by", String(req.sortBy)); if (req.passengers != null && req.passengers !== 0) params.set("passengers", String(req.passengers)); const url = this.baseURL + path + (params.toString() ? "?" + params.toString() : ""); @@ -687,7 +686,7 @@ export class AviationServiceClient { if (req.cabinClass != null && req.cabinClass !== "") params.set("cabin_class", String(req.cabinClass)); if (req.maxStops != null && req.maxStops !== "") params.set("max_stops", String(req.maxStops)); if (req.departureWindow != null && req.departureWindow !== "") params.set("departure_window", String(req.departureWindow)); - if (req.airlines != null && req.airlines !== "") params.set("airlines", String(req.airlines)); + if (req.airlines && req.airlines.length > 0) req.airlines.forEach(v => params.append("airlines", v)); if (req.sortByPrice) params.set("sort_by_price", String(req.sortByPrice)); if (req.passengers != null && req.passengers !== 0) params.set("passengers", String(req.passengers)); const url = this.baseURL + path + (params.toString() ? "?" + params.toString() : ""); diff --git a/src/generated/client/worldmonitor/climate/v1/service_client.ts b/src/generated/client/worldmonitor/climate/v1/service_client.ts index 7ca3e520b..0c33c4afd 100644 --- a/src/generated/client/worldmonitor/climate/v1/service_client.ts +++ b/src/generated/client/worldmonitor/climate/v1/service_client.ts @@ -1,4 +1,3 @@ -// @ts-nocheck // Code generated by protoc-gen-ts-client. DO NOT EDIT. // source: worldmonitor/climate/v1/service.proto @@ -205,7 +204,7 @@ export class ClimateServiceClient { const params = new URLSearchParams(); if (req.pageSize != null && req.pageSize !== 0) params.set("page_size", String(req.pageSize)); if (req.cursor != null && req.cursor !== "") params.set("cursor", String(req.cursor)); - if (req.minSeverity != null && req.minSeverity !== "") params.set("min_severity", String(req.minSeverity)); + if (req.minSeverity != null && req.minSeverity !== "ANOMALY_SEVERITY_UNSPECIFIED") params.set("min_severity", String(req.minSeverity)); const url = this.baseURL + path + (params.toString() ? "?" + params.toString() : ""); const headers: Record = { @@ -253,7 +252,7 @@ export class ClimateServiceClient { return await resp.json() as ListClimateDisastersResponse; } - async getCo2Monitoring(req: GetCo2MonitoringRequest, options?: ClimateServiceCallOptions): Promise { + async getCo2Monitoring(_req: GetCo2MonitoringRequest, options?: ClimateServiceCallOptions): Promise { let path = "/api/climate/v1/get-co2-monitoring"; const url = this.baseURL + path; @@ -276,7 +275,7 @@ export class ClimateServiceClient { return await resp.json() as GetCo2MonitoringResponse; } - async getOceanIceData(req: GetOceanIceDataRequest, options?: ClimateServiceCallOptions): Promise { + async getOceanIceData(_req: GetOceanIceDataRequest, options?: ClimateServiceCallOptions): Promise { let path = "/api/climate/v1/get-ocean-ice-data"; const url = this.baseURL + path; @@ -299,7 +298,7 @@ export class ClimateServiceClient { return await resp.json() as GetOceanIceDataResponse; } - async listAirQualityData(req: ListAirQualityDataRequest, options?: ClimateServiceCallOptions): Promise { + async listAirQualityData(_req: ListAirQualityDataRequest, options?: ClimateServiceCallOptions): Promise { let path = "/api/climate/v1/list-air-quality-data"; const url = this.baseURL + path; @@ -322,7 +321,7 @@ export class ClimateServiceClient { return await resp.json() as ListAirQualityDataResponse; } - async listClimateNews(req: ListClimateNewsRequest, options?: ClimateServiceCallOptions): Promise { + async listClimateNews(_req: ListClimateNewsRequest, options?: ClimateServiceCallOptions): Promise { let path = "/api/climate/v1/list-climate-news"; const url = this.baseURL + path; diff --git a/src/generated/client/worldmonitor/conflict/v1/service_client.ts b/src/generated/client/worldmonitor/conflict/v1/service_client.ts index 0945d02b7..8e9172aa6 100644 --- a/src/generated/client/worldmonitor/conflict/v1/service_client.ts +++ b/src/generated/client/worldmonitor/conflict/v1/service_client.ts @@ -1,4 +1,3 @@ -// @ts-nocheck // Code generated by protoc-gen-ts-client. DO NOT EDIT. // source: worldmonitor/conflict/v1/service.proto @@ -247,7 +246,7 @@ export class ConflictServiceClient { return await resp.json() as GetHumanitarianSummaryResponse; } - async listIranEvents(req: ListIranEventsRequest, options?: ConflictServiceCallOptions): Promise { + async listIranEvents(_req: ListIranEventsRequest, options?: ConflictServiceCallOptions): Promise { let path = "/api/conflict/v1/list-iran-events"; const url = this.baseURL + path; diff --git a/src/generated/client/worldmonitor/consumer_prices/v1/service_client.ts b/src/generated/client/worldmonitor/consumer_prices/v1/service_client.ts index b15c67692..f8c9687a0 100644 --- a/src/generated/client/worldmonitor/consumer_prices/v1/service_client.ts +++ b/src/generated/client/worldmonitor/consumer_prices/v1/service_client.ts @@ -1,4 +1,3 @@ -// @ts-nocheck // Code generated by protoc-gen-ts-client. DO NOT EDIT. // source: worldmonitor/consumer_prices/v1/service.proto diff --git a/src/generated/client/worldmonitor/cyber/v1/service_client.ts b/src/generated/client/worldmonitor/cyber/v1/service_client.ts index 9b5f6ca60..d49db53c9 100644 --- a/src/generated/client/worldmonitor/cyber/v1/service_client.ts +++ b/src/generated/client/worldmonitor/cyber/v1/service_client.ts @@ -1,4 +1,3 @@ -// @ts-nocheck // Code generated by protoc-gen-ts-client. DO NOT EDIT. // source: worldmonitor/cyber/v1/service.proto @@ -105,9 +104,9 @@ export class CyberServiceClient { if (req.end != null && req.end !== 0) params.set("end", String(req.end)); if (req.pageSize != null && req.pageSize !== 0) params.set("page_size", String(req.pageSize)); if (req.cursor != null && req.cursor !== "") params.set("cursor", String(req.cursor)); - if (req.type != null && req.type !== "") params.set("type", String(req.type)); - if (req.source != null && req.source !== "") params.set("source", String(req.source)); - if (req.minSeverity != null && req.minSeverity !== "") params.set("min_severity", String(req.minSeverity)); + if (req.type != null && req.type !== "CYBER_THREAT_TYPE_UNSPECIFIED") params.set("type", String(req.type)); + if (req.source != null && req.source !== "CYBER_THREAT_SOURCE_UNSPECIFIED") params.set("source", String(req.source)); + if (req.minSeverity != null && req.minSeverity !== "CRITICALITY_LEVEL_UNSPECIFIED") params.set("min_severity", String(req.minSeverity)); const url = this.baseURL + path + (params.toString() ? "?" + params.toString() : ""); const headers: Record = { diff --git a/src/generated/client/worldmonitor/displacement/v1/service_client.ts b/src/generated/client/worldmonitor/displacement/v1/service_client.ts index 86159ab57..fe9e65e5a 100644 --- a/src/generated/client/worldmonitor/displacement/v1/service_client.ts +++ b/src/generated/client/worldmonitor/displacement/v1/service_client.ts @@ -1,4 +1,3 @@ -// @ts-nocheck // Code generated by protoc-gen-ts-client. DO NOT EDIT. // source: worldmonitor/displacement/v1/service.proto diff --git a/src/generated/client/worldmonitor/economic/v1/service_client.ts b/src/generated/client/worldmonitor/economic/v1/service_client.ts index d0040228f..8482d9a9a 100644 --- a/src/generated/client/worldmonitor/economic/v1/service_client.ts +++ b/src/generated/client/worldmonitor/economic/v1/service_client.ts @@ -1,4 +1,3 @@ -// @ts-nocheck // Code generated by protoc-gen-ts-client. DO NOT EDIT. // source: worldmonitor/economic/v1/service.proto @@ -797,7 +796,7 @@ export class EconomicServiceClient { async getEnergyPrices(req: GetEnergyPricesRequest, options?: EconomicServiceCallOptions): Promise { let path = "/api/economic/v1/get-energy-prices"; const params = new URLSearchParams(); - if (req.commodities != null && req.commodities !== "") params.set("commodities", String(req.commodities)); + if (req.commodities && req.commodities.length > 0) req.commodities.forEach(v => params.append("commodities", v)); const url = this.baseURL + path + (params.toString() ? "?" + params.toString() : ""); const headers: Record = { @@ -819,7 +818,7 @@ export class EconomicServiceClient { return await resp.json() as GetEnergyPricesResponse; } - async getMacroSignals(req: GetMacroSignalsRequest, options?: EconomicServiceCallOptions): Promise { + async getMacroSignals(_req: GetMacroSignalsRequest, options?: EconomicServiceCallOptions): Promise { let path = "/api/economic/v1/get-macro-signals"; const url = this.baseURL + path; @@ -845,7 +844,7 @@ export class EconomicServiceClient { async getEnergyCapacity(req: GetEnergyCapacityRequest, options?: EconomicServiceCallOptions): Promise { let path = "/api/economic/v1/get-energy-capacity"; const params = new URLSearchParams(); - if (req.energySources != null && req.energySources !== "") params.set("energy_sources", String(req.energySources)); + if (req.energySources && req.energySources.length > 0) req.energySources.forEach(v => params.append("energy_sources", v)); if (req.years != null && req.years !== 0) params.set("years", String(req.years)); const url = this.baseURL + path + (params.toString() ? "?" + params.toString() : ""); @@ -868,7 +867,7 @@ export class EconomicServiceClient { return await resp.json() as GetEnergyCapacityResponse; } - async getBisPolicyRates(req: GetBisPolicyRatesRequest, options?: EconomicServiceCallOptions): Promise { + async getBisPolicyRates(_req: GetBisPolicyRatesRequest, options?: EconomicServiceCallOptions): Promise { let path = "/api/economic/v1/get-bis-policy-rates"; const url = this.baseURL + path; @@ -891,7 +890,7 @@ export class EconomicServiceClient { return await resp.json() as GetBisPolicyRatesResponse; } - async getBisExchangeRates(req: GetBisExchangeRatesRequest, options?: EconomicServiceCallOptions): Promise { + async getBisExchangeRates(_req: GetBisExchangeRatesRequest, options?: EconomicServiceCallOptions): Promise { let path = "/api/economic/v1/get-bis-exchange-rates"; const url = this.baseURL + path; @@ -914,7 +913,7 @@ export class EconomicServiceClient { return await resp.json() as GetBisExchangeRatesResponse; } - async getBisCredit(req: GetBisCreditRequest, options?: EconomicServiceCallOptions): Promise { + async getBisCredit(_req: GetBisCreditRequest, options?: EconomicServiceCallOptions): Promise { let path = "/api/economic/v1/get-bis-credit"; const url = this.baseURL + path; @@ -961,7 +960,7 @@ export class EconomicServiceClient { return await resp.json() as GetFredSeriesBatchResponse; } - async listGroceryBasketPrices(req: ListGroceryBasketPricesRequest, options?: EconomicServiceCallOptions): Promise { + async listGroceryBasketPrices(_req: ListGroceryBasketPricesRequest, options?: EconomicServiceCallOptions): Promise { let path = "/api/economic/v1/list-grocery-basket-prices"; const url = this.baseURL + path; @@ -984,7 +983,7 @@ export class EconomicServiceClient { return await resp.json() as ListGroceryBasketPricesResponse; } - async listBigMacPrices(req: ListBigMacPricesRequest, options?: EconomicServiceCallOptions): Promise { + async listBigMacPrices(_req: ListBigMacPricesRequest, options?: EconomicServiceCallOptions): Promise { let path = "/api/economic/v1/list-bigmac-prices"; const url = this.baseURL + path; @@ -1007,7 +1006,7 @@ export class EconomicServiceClient { return await resp.json() as ListBigMacPricesResponse; } - async getNationalDebt(req: GetNationalDebtRequest, options?: EconomicServiceCallOptions): Promise { + async getNationalDebt(_req: GetNationalDebtRequest, options?: EconomicServiceCallOptions): Promise { let path = "/api/economic/v1/get-national-debt"; const url = this.baseURL + path; @@ -1030,7 +1029,7 @@ export class EconomicServiceClient { return await resp.json() as GetNationalDebtResponse; } - async listFuelPrices(req: ListFuelPricesRequest, options?: EconomicServiceCallOptions): Promise { + async listFuelPrices(_req: ListFuelPricesRequest, options?: EconomicServiceCallOptions): Promise { let path = "/api/economic/v1/list-fuel-prices"; const url = this.baseURL + path; @@ -1105,7 +1104,7 @@ export class EconomicServiceClient { return await resp.json() as GetEconomicCalendarResponse; } - async getCrudeInventories(req: GetCrudeInventoriesRequest, options?: EconomicServiceCallOptions): Promise { + async getCrudeInventories(_req: GetCrudeInventoriesRequest, options?: EconomicServiceCallOptions): Promise { let path = "/api/economic/v1/get-crude-inventories"; const url = this.baseURL + path; @@ -1128,7 +1127,7 @@ export class EconomicServiceClient { return await resp.json() as GetCrudeInventoriesResponse; } - async getNatGasStorage(req: GetNatGasStorageRequest, options?: EconomicServiceCallOptions): Promise { + async getNatGasStorage(_req: GetNatGasStorageRequest, options?: EconomicServiceCallOptions): Promise { let path = "/api/economic/v1/get-nat-gas-storage"; const url = this.baseURL + path; @@ -1151,7 +1150,7 @@ export class EconomicServiceClient { return await resp.json() as GetNatGasStorageResponse; } - async getEcbFxRates(req: GetEcbFxRatesRequest, options?: EconomicServiceCallOptions): Promise { + async getEcbFxRates(_req: GetEcbFxRatesRequest, options?: EconomicServiceCallOptions): Promise { let path = "/api/economic/v1/get-ecb-fx-rates"; const url = this.baseURL + path; @@ -1174,7 +1173,7 @@ export class EconomicServiceClient { return await resp.json() as GetEcbFxRatesResponse; } - async getEurostatCountryData(req: GetEurostatCountryDataRequest, options?: EconomicServiceCallOptions): Promise { + async getEurostatCountryData(_req: GetEurostatCountryDataRequest, options?: EconomicServiceCallOptions): Promise { let path = "/api/economic/v1/get-eurostat-country-data"; const url = this.baseURL + path; @@ -1197,7 +1196,7 @@ export class EconomicServiceClient { return await resp.json() as GetEurostatCountryDataResponse; } - async getEuGasStorage(req: GetEuGasStorageRequest, options?: EconomicServiceCallOptions): Promise { + async getEuGasStorage(_req: GetEuGasStorageRequest, options?: EconomicServiceCallOptions): Promise { let path = "/api/economic/v1/get-eu-gas-storage"; const url = this.baseURL + path; @@ -1220,7 +1219,7 @@ export class EconomicServiceClient { return await resp.json() as GetEuGasStorageResponse; } - async getEuYieldCurve(req: GetEuYieldCurveRequest, options?: EconomicServiceCallOptions): Promise { + async getEuYieldCurve(_req: GetEuYieldCurveRequest, options?: EconomicServiceCallOptions): Promise { let path = "/api/economic/v1/get-eu-yield-curve"; const url = this.baseURL + path; @@ -1243,7 +1242,7 @@ export class EconomicServiceClient { return await resp.json() as GetEuYieldCurveResponse; } - async getEuFsi(req: GetEuFsiRequest, options?: EconomicServiceCallOptions): Promise { + async getEuFsi(_req: GetEuFsiRequest, options?: EconomicServiceCallOptions): Promise { let path = "/api/economic/v1/get-eu-fsi"; const url = this.baseURL + path; @@ -1266,7 +1265,7 @@ export class EconomicServiceClient { return await resp.json() as GetEuFsiResponse; } - async getEconomicStress(req: GetEconomicStressRequest, options?: EconomicServiceCallOptions): Promise { + async getEconomicStress(_req: GetEconomicStressRequest, options?: EconomicServiceCallOptions): Promise { let path = "/api/economic/v1/get-economic-stress"; const url = this.baseURL + path; @@ -1289,7 +1288,7 @@ export class EconomicServiceClient { return await resp.json() as GetEconomicStressResponse; } - async getFaoFoodPriceIndex(req: GetFaoFoodPriceIndexRequest, options?: EconomicServiceCallOptions): Promise { + async getFaoFoodPriceIndex(_req: GetFaoFoodPriceIndexRequest, options?: EconomicServiceCallOptions): Promise { let path = "/api/economic/v1/get-fao-food-price-index"; const url = this.baseURL + path; @@ -1312,7 +1311,7 @@ export class EconomicServiceClient { return await resp.json() as GetFaoFoodPriceIndexResponse; } - async getOilStocksAnalysis(req: GetOilStocksAnalysisRequest, options?: EconomicServiceCallOptions): Promise { + async getOilStocksAnalysis(_req: GetOilStocksAnalysisRequest, options?: EconomicServiceCallOptions): Promise { let path = "/api/economic/v1/get-oil-stocks-analysis"; const url = this.baseURL + path; @@ -1335,7 +1334,7 @@ export class EconomicServiceClient { return await resp.json() as GetOilStocksAnalysisResponse; } - async getOilInventories(req: GetOilInventoriesRequest, options?: EconomicServiceCallOptions): Promise { + async getOilInventories(_req: GetOilInventoriesRequest, options?: EconomicServiceCallOptions): Promise { let path = "/api/economic/v1/get-oil-inventories"; const url = this.baseURL + path; diff --git a/src/generated/client/worldmonitor/forecast/v1/service_client.ts b/src/generated/client/worldmonitor/forecast/v1/service_client.ts index fdeaa53bd..a9b3fae56 100644 --- a/src/generated/client/worldmonitor/forecast/v1/service_client.ts +++ b/src/generated/client/worldmonitor/forecast/v1/service_client.ts @@ -1,4 +1,3 @@ -// @ts-nocheck // Code generated by protoc-gen-ts-client. DO NOT EDIT. // source: worldmonitor/forecast/v1/service.proto diff --git a/src/generated/client/worldmonitor/giving/v1/service_client.ts b/src/generated/client/worldmonitor/giving/v1/service_client.ts index 9d8a9f1d7..3dc639496 100644 --- a/src/generated/client/worldmonitor/giving/v1/service_client.ts +++ b/src/generated/client/worldmonitor/giving/v1/service_client.ts @@ -1,4 +1,3 @@ -// @ts-nocheck // Code generated by protoc-gen-ts-client. DO NOT EDIT. // source: worldmonitor/giving/v1/service.proto diff --git a/src/generated/client/worldmonitor/health/v1/service_client.ts b/src/generated/client/worldmonitor/health/v1/service_client.ts index eca7dd491..6750b7719 100644 --- a/src/generated/client/worldmonitor/health/v1/service_client.ts +++ b/src/generated/client/worldmonitor/health/v1/service_client.ts @@ -1,4 +1,3 @@ -// @ts-nocheck // Code generated by protoc-gen-ts-client. DO NOT EDIT. // source: worldmonitor/health/v1/service.proto @@ -94,7 +93,7 @@ export class HealthServiceClient { this.defaultHeaders = { ...options?.defaultHeaders }; } - async listDiseaseOutbreaks(req: ListDiseaseOutbreaksRequest, options?: HealthServiceCallOptions): Promise { + async listDiseaseOutbreaks(_req: ListDiseaseOutbreaksRequest, options?: HealthServiceCallOptions): Promise { let path = "/api/health/v1/list-disease-outbreaks"; const url = this.baseURL + path; @@ -117,7 +116,7 @@ export class HealthServiceClient { return await resp.json() as ListDiseaseOutbreaksResponse; } - async listAirQualityAlerts(req: ListAirQualityAlertsRequest, options?: HealthServiceCallOptions): Promise { + async listAirQualityAlerts(_req: ListAirQualityAlertsRequest, options?: HealthServiceCallOptions): Promise { let path = "/api/health/v1/list-air-quality-alerts"; const url = this.baseURL + path; diff --git a/src/generated/client/worldmonitor/imagery/v1/service_client.ts b/src/generated/client/worldmonitor/imagery/v1/service_client.ts index 54a1c2377..aaaf01710 100644 --- a/src/generated/client/worldmonitor/imagery/v1/service_client.ts +++ b/src/generated/client/worldmonitor/imagery/v1/service_client.ts @@ -1,4 +1,3 @@ -// @ts-nocheck // Code generated by protoc-gen-ts-client. DO NOT EDIT. // source: worldmonitor/imagery/v1/service.proto diff --git a/src/generated/client/worldmonitor/infrastructure/v1/service_client.ts b/src/generated/client/worldmonitor/infrastructure/v1/service_client.ts index 5c977d455..267b9de3b 100644 --- a/src/generated/client/worldmonitor/infrastructure/v1/service_client.ts +++ b/src/generated/client/worldmonitor/infrastructure/v1/service_client.ts @@ -1,4 +1,3 @@ -// @ts-nocheck // Code generated by protoc-gen-ts-client. DO NOT EDIT. // source: worldmonitor/infrastructure/v1/service.proto @@ -307,7 +306,7 @@ export class InfrastructureServiceClient { async listServiceStatuses(req: ListServiceStatusesRequest, options?: InfrastructureServiceCallOptions): Promise { let path = "/api/infrastructure/v1/list-service-statuses"; const params = new URLSearchParams(); - if (req.status != null && req.status !== "") params.set("status", String(req.status)); + if (req.status != null && req.status !== "SERVICE_OPERATIONAL_STATUS_UNSPECIFIED") params.set("status", String(req.status)); const url = this.baseURL + path + (params.toString() ? "?" + params.toString() : ""); const headers: Record = { @@ -356,7 +355,7 @@ export class InfrastructureServiceClient { return await resp.json() as GetTemporalBaselineResponse; } - async getIpGeo(req: GetIpGeoRequest, options?: InfrastructureServiceCallOptions): Promise { + async getIpGeo(_req: GetIpGeoRequest, options?: InfrastructureServiceCallOptions): Promise { let path = "/api/infrastructure/v1/get-ip-geo"; const url = this.baseURL + path; @@ -409,7 +408,7 @@ export class InfrastructureServiceClient { let path = "/api/infrastructure/v1/get-bootstrap-data"; const params = new URLSearchParams(); if (req.tier != null && req.tier !== "") params.set("tier", String(req.tier)); - if (req.keys != null && req.keys !== "") params.set("keys", String(req.keys)); + if (req.keys && req.keys.length > 0) req.keys.forEach(v => params.append("keys", v)); const url = this.baseURL + path + (params.toString() ? "?" + params.toString() : ""); const headers: Record = { @@ -455,7 +454,7 @@ export class InfrastructureServiceClient { return await resp.json() as RecordBaselineSnapshotResponse; } - async getCableHealth(req: GetCableHealthRequest, options?: InfrastructureServiceCallOptions): Promise { + async getCableHealth(_req: GetCableHealthRequest, options?: InfrastructureServiceCallOptions): Promise { let path = "/api/infrastructure/v1/get-cable-health"; const url = this.baseURL + path; @@ -478,7 +477,7 @@ export class InfrastructureServiceClient { return await resp.json() as GetCableHealthResponse; } - async listTemporalAnomalies(req: ListTemporalAnomaliesRequest, options?: InfrastructureServiceCallOptions): Promise { + async listTemporalAnomalies(_req: ListTemporalAnomaliesRequest, options?: InfrastructureServiceCallOptions): Promise { let path = "/api/infrastructure/v1/list-temporal-anomalies"; const url = this.baseURL + path; @@ -501,7 +500,7 @@ export class InfrastructureServiceClient { return await resp.json() as ListTemporalAnomaliesResponse; } - async listInternetDdosAttacks(req: ListInternetDdosAttacksRequest, options?: InfrastructureServiceCallOptions): Promise { + async listInternetDdosAttacks(_req: ListInternetDdosAttacksRequest, options?: InfrastructureServiceCallOptions): Promise { let path = "/api/infrastructure/v1/list-internet-ddos-attacks"; const url = this.baseURL + path; diff --git a/src/generated/client/worldmonitor/intelligence/v1/service_client.ts b/src/generated/client/worldmonitor/intelligence/v1/service_client.ts index b4ed57806..1a2f3d478 100644 --- a/src/generated/client/worldmonitor/intelligence/v1/service_client.ts +++ b/src/generated/client/worldmonitor/intelligence/v1/service_client.ts @@ -1,4 +1,3 @@ -// @ts-nocheck // Code generated by protoc-gen-ts-client. DO NOT EDIT. // source: worldmonitor/intelligence/v1/service.proto @@ -1154,7 +1153,7 @@ export class IntelligenceServiceClient { async listOrefAlerts(req: ListOrefAlertsRequest, options?: IntelligenceServiceCallOptions): Promise { let path = "/api/intelligence/v1/list-oref-alerts"; const params = new URLSearchParams(); - if (req.mode != null && req.mode !== "") params.set("mode", String(req.mode)); + if (req.mode != null && req.mode !== "MODE_UNSPECIFIED") params.set("mode", String(req.mode)); const url = this.baseURL + path + (params.toString() ? "?" + params.toString() : ""); const headers: Record = { @@ -1280,7 +1279,7 @@ export class IntelligenceServiceClient { return await resp.json() as GetCountryFactsResponse; } - async listSecurityAdvisories(req: ListSecurityAdvisoriesRequest, options?: IntelligenceServiceCallOptions): Promise { + async listSecurityAdvisories(_req: ListSecurityAdvisoriesRequest, options?: IntelligenceServiceCallOptions): Promise { let path = "/api/intelligence/v1/list-security-advisories"; const url = this.baseURL + path; @@ -1328,7 +1327,7 @@ export class IntelligenceServiceClient { return await resp.json() as GetGdeltTopicTimelineResponse; } - async listCrossSourceSignals(req: ListCrossSourceSignalsRequest, options?: IntelligenceServiceCallOptions): Promise { + async listCrossSourceSignals(_req: ListCrossSourceSignalsRequest, options?: IntelligenceServiceCallOptions): Promise { let path = "/api/intelligence/v1/list-cross-source-signals"; const url = this.baseURL + path; @@ -1376,7 +1375,7 @@ export class IntelligenceServiceClient { return await resp.json() as ListMarketImplicationsResponse; } - async getSocialVelocity(req: GetSocialVelocityRequest, options?: IntelligenceServiceCallOptions): Promise { + async getSocialVelocity(_req: GetSocialVelocityRequest, options?: IntelligenceServiceCallOptions): Promise { let path = "/api/intelligence/v1/get-social-velocity"; const url = this.baseURL + path; diff --git a/src/generated/client/worldmonitor/leads/v1/service_client.ts b/src/generated/client/worldmonitor/leads/v1/service_client.ts index e1f01259f..3eb60ee2c 100644 --- a/src/generated/client/worldmonitor/leads/v1/service_client.ts +++ b/src/generated/client/worldmonitor/leads/v1/service_client.ts @@ -1,4 +1,3 @@ -// @ts-nocheck // Code generated by protoc-gen-ts-client. DO NOT EDIT. // source: worldmonitor/leads/v1/service.proto diff --git a/src/generated/client/worldmonitor/maritime/v1/service_client.ts b/src/generated/client/worldmonitor/maritime/v1/service_client.ts index 4dcf5bd9e..2dc3447a7 100644 --- a/src/generated/client/worldmonitor/maritime/v1/service_client.ts +++ b/src/generated/client/worldmonitor/maritime/v1/service_client.ts @@ -1,4 +1,3 @@ -// @ts-nocheck // Code generated by protoc-gen-ts-client. DO NOT EDIT. // source: worldmonitor/maritime/v1/service.proto diff --git a/src/generated/client/worldmonitor/market/v1/service_client.ts b/src/generated/client/worldmonitor/market/v1/service_client.ts index f9714a88c..5e6ca4492 100644 --- a/src/generated/client/worldmonitor/market/v1/service_client.ts +++ b/src/generated/client/worldmonitor/market/v1/service_client.ts @@ -1,4 +1,3 @@ -// @ts-nocheck // Code generated by protoc-gen-ts-client. DO NOT EDIT. // source: worldmonitor/market/v1/service.proto @@ -699,7 +698,7 @@ export class MarketServiceClient { async listMarketQuotes(req: ListMarketQuotesRequest, options?: MarketServiceCallOptions): Promise { let path = "/api/market/v1/list-market-quotes"; const params = new URLSearchParams(); - if (req.symbols != null && req.symbols !== "") params.set("symbols", String(req.symbols)); + if (req.symbols && req.symbols.length > 0) req.symbols.forEach(v => params.append("symbols", v)); const url = this.baseURL + path + (params.toString() ? "?" + params.toString() : ""); const headers: Record = { @@ -724,7 +723,7 @@ export class MarketServiceClient { async listCryptoQuotes(req: ListCryptoQuotesRequest, options?: MarketServiceCallOptions): Promise { let path = "/api/market/v1/list-crypto-quotes"; const params = new URLSearchParams(); - if (req.ids != null && req.ids !== "") params.set("ids", String(req.ids)); + if (req.ids && req.ids.length > 0) req.ids.forEach(v => params.append("ids", v)); const url = this.baseURL + path + (params.toString() ? "?" + params.toString() : ""); const headers: Record = { @@ -749,7 +748,7 @@ export class MarketServiceClient { async listCommodityQuotes(req: ListCommodityQuotesRequest, options?: MarketServiceCallOptions): Promise { let path = "/api/market/v1/list-commodity-quotes"; const params = new URLSearchParams(); - if (req.symbols != null && req.symbols !== "") params.set("symbols", String(req.symbols)); + if (req.symbols && req.symbols.length > 0) req.symbols.forEach(v => params.append("symbols", v)); const url = this.baseURL + path + (params.toString() ? "?" + params.toString() : ""); const headers: Record = { @@ -799,7 +798,7 @@ export class MarketServiceClient { async listStablecoinMarkets(req: ListStablecoinMarketsRequest, options?: MarketServiceCallOptions): Promise { let path = "/api/market/v1/list-stablecoin-markets"; const params = new URLSearchParams(); - if (req.coins != null && req.coins !== "") params.set("coins", String(req.coins)); + if (req.coins && req.coins.length > 0) req.coins.forEach(v => params.append("coins", v)); const url = this.baseURL + path + (params.toString() ? "?" + params.toString() : ""); const headers: Record = { @@ -821,7 +820,7 @@ export class MarketServiceClient { return await resp.json() as ListStablecoinMarketsResponse; } - async listEtfFlows(req: ListEtfFlowsRequest, options?: MarketServiceCallOptions): Promise { + async listEtfFlows(_req: ListEtfFlowsRequest, options?: MarketServiceCallOptions): Promise { let path = "/api/market/v1/list-etf-flows"; const url = this.baseURL + path; @@ -869,7 +868,7 @@ export class MarketServiceClient { return await resp.json() as GetCountryStockIndexResponse; } - async listGulfQuotes(req: ListGulfQuotesRequest, options?: MarketServiceCallOptions): Promise { + async listGulfQuotes(_req: ListGulfQuotesRequest, options?: MarketServiceCallOptions): Promise { let path = "/api/market/v1/list-gulf-quotes"; const url = this.baseURL + path; @@ -922,7 +921,7 @@ export class MarketServiceClient { async getStockAnalysisHistory(req: GetStockAnalysisHistoryRequest, options?: MarketServiceCallOptions): Promise { let path = "/api/market/v1/get-stock-analysis-history"; const params = new URLSearchParams(); - if (req.symbols != null && req.symbols !== "") params.set("symbols", String(req.symbols)); + if (req.symbols && req.symbols.length > 0) req.symbols.forEach(v => params.append("symbols", v)); if (req.limitPerSymbol != null && req.limitPerSymbol !== 0) params.set("limit_per_symbol", String(req.limitPerSymbol)); if (req.includeNews) params.set("include_news", String(req.includeNews)); const url = this.baseURL + path + (params.toString() ? "?" + params.toString() : ""); @@ -976,7 +975,7 @@ export class MarketServiceClient { async listStoredStockBacktests(req: ListStoredStockBacktestsRequest, options?: MarketServiceCallOptions): Promise { let path = "/api/market/v1/list-stored-stock-backtests"; const params = new URLSearchParams(); - if (req.symbols != null && req.symbols !== "") params.set("symbols", String(req.symbols)); + if (req.symbols && req.symbols.length > 0) req.symbols.forEach(v => params.append("symbols", v)); if (req.evalWindowDays != null && req.evalWindowDays !== 0) params.set("eval_window_days", String(req.evalWindowDays)); const url = this.baseURL + path + (params.toString() ? "?" + params.toString() : ""); @@ -999,7 +998,7 @@ export class MarketServiceClient { return await resp.json() as ListStoredStockBacktestsResponse; } - async listCryptoSectors(req: ListCryptoSectorsRequest, options?: MarketServiceCallOptions): Promise { + async listCryptoSectors(_req: ListCryptoSectorsRequest, options?: MarketServiceCallOptions): Promise { let path = "/api/market/v1/list-crypto-sectors"; const url = this.baseURL + path; @@ -1022,7 +1021,7 @@ export class MarketServiceClient { return await resp.json() as ListCryptoSectorsResponse; } - async listDefiTokens(req: ListDefiTokensRequest, options?: MarketServiceCallOptions): Promise { + async listDefiTokens(_req: ListDefiTokensRequest, options?: MarketServiceCallOptions): Promise { let path = "/api/market/v1/list-defi-tokens"; const url = this.baseURL + path; @@ -1045,7 +1044,7 @@ export class MarketServiceClient { return await resp.json() as ListDefiTokensResponse; } - async listAiTokens(req: ListAiTokensRequest, options?: MarketServiceCallOptions): Promise { + async listAiTokens(_req: ListAiTokensRequest, options?: MarketServiceCallOptions): Promise { let path = "/api/market/v1/list-ai-tokens"; const url = this.baseURL + path; @@ -1068,7 +1067,7 @@ export class MarketServiceClient { return await resp.json() as ListAiTokensResponse; } - async listOtherTokens(req: ListOtherTokensRequest, options?: MarketServiceCallOptions): Promise { + async listOtherTokens(_req: ListOtherTokensRequest, options?: MarketServiceCallOptions): Promise { let path = "/api/market/v1/list-other-tokens"; const url = this.baseURL + path; @@ -1091,7 +1090,7 @@ export class MarketServiceClient { return await resp.json() as ListOtherTokensResponse; } - async getFearGreedIndex(req: GetFearGreedIndexRequest, options?: MarketServiceCallOptions): Promise { + async getFearGreedIndex(_req: GetFearGreedIndexRequest, options?: MarketServiceCallOptions): Promise { let path = "/api/market/v1/get-fear-greed-index"; const url = this.baseURL + path; @@ -1140,7 +1139,7 @@ export class MarketServiceClient { return await resp.json() as ListEarningsCalendarResponse; } - async getCotPositioning(req: GetCotPositioningRequest, options?: MarketServiceCallOptions): Promise { + async getCotPositioning(_req: GetCotPositioningRequest, options?: MarketServiceCallOptions): Promise { let path = "/api/market/v1/get-cot-positioning"; const url = this.baseURL + path; @@ -1188,7 +1187,7 @@ export class MarketServiceClient { return await resp.json() as GetInsiderTransactionsResponse; } - async getMarketBreadthHistory(req: GetMarketBreadthHistoryRequest, options?: MarketServiceCallOptions): Promise { + async getMarketBreadthHistory(_req: GetMarketBreadthHistoryRequest, options?: MarketServiceCallOptions): Promise { let path = "/api/market/v1/get-market-breadth-history"; const url = this.baseURL + path; @@ -1211,7 +1210,7 @@ export class MarketServiceClient { return await resp.json() as GetMarketBreadthHistoryResponse; } - async getGoldIntelligence(req: GetGoldIntelligenceRequest, options?: MarketServiceCallOptions): Promise { + async getGoldIntelligence(_req: GetGoldIntelligenceRequest, options?: MarketServiceCallOptions): Promise { let path = "/api/market/v1/get-gold-intelligence"; const url = this.baseURL + path; @@ -1234,7 +1233,7 @@ export class MarketServiceClient { return await resp.json() as GetGoldIntelligenceResponse; } - async getHyperliquidFlow(req: GetHyperliquidFlowRequest, options?: MarketServiceCallOptions): Promise { + async getHyperliquidFlow(_req: GetHyperliquidFlowRequest, options?: MarketServiceCallOptions): Promise { let path = "/api/market/v1/get-hyperliquid-flow"; const url = this.baseURL + path; diff --git a/src/generated/client/worldmonitor/military/v1/service_client.ts b/src/generated/client/worldmonitor/military/v1/service_client.ts index 9d7a7fbf4..272459957 100644 --- a/src/generated/client/worldmonitor/military/v1/service_client.ts +++ b/src/generated/client/worldmonitor/military/v1/service_client.ts @@ -1,4 +1,3 @@ -// @ts-nocheck // Code generated by protoc-gen-ts-client. DO NOT EDIT. // source: worldmonitor/military/v1/service.proto @@ -361,8 +360,8 @@ export class MilitaryServiceClient { if (req.neLon != null && req.neLon !== 0) params.set("ne_lon", String(req.neLon)); if (req.swLat != null && req.swLat !== 0) params.set("sw_lat", String(req.swLat)); if (req.swLon != null && req.swLon !== 0) params.set("sw_lon", String(req.swLon)); - if (req.operator != null && req.operator !== "") params.set("operator", String(req.operator)); - if (req.aircraftType != null && req.aircraftType !== "") params.set("aircraft_type", String(req.aircraftType)); + if (req.operator != null && req.operator !== "MILITARY_OPERATOR_UNSPECIFIED") params.set("operator", String(req.operator)); + if (req.aircraftType != null && req.aircraftType !== "MILITARY_AIRCRAFT_TYPE_UNSPECIFIED") params.set("aircraft_type", String(req.aircraftType)); const url = this.baseURL + path + (params.toString() ? "?" + params.toString() : ""); const headers: Record = { @@ -458,7 +457,7 @@ export class MilitaryServiceClient { return await resp.json() as GetAircraftDetailsBatchResponse; } - async getWingbitsStatus(req: GetWingbitsStatusRequest, options?: MilitaryServiceCallOptions): Promise { + async getWingbitsStatus(_req: GetWingbitsStatusRequest, options?: MilitaryServiceCallOptions): Promise { let path = "/api/military/v1/get-wingbits-status"; const url = this.baseURL + path; diff --git a/src/generated/client/worldmonitor/natural/v1/service_client.ts b/src/generated/client/worldmonitor/natural/v1/service_client.ts index abb1ef558..e143a80fd 100644 --- a/src/generated/client/worldmonitor/natural/v1/service_client.ts +++ b/src/generated/client/worldmonitor/natural/v1/service_client.ts @@ -1,4 +1,3 @@ -// @ts-nocheck // Code generated by protoc-gen-ts-client. DO NOT EDIT. // source: worldmonitor/natural/v1/service.proto diff --git a/src/generated/client/worldmonitor/news/v1/service_client.ts b/src/generated/client/worldmonitor/news/v1/service_client.ts index 28866cd11..2869d1a4a 100644 --- a/src/generated/client/worldmonitor/news/v1/service_client.ts +++ b/src/generated/client/worldmonitor/news/v1/service_client.ts @@ -1,4 +1,3 @@ -// @ts-nocheck // Code generated by protoc-gen-ts-client. DO NOT EDIT. // source: worldmonitor/news/v1/service.proto diff --git a/src/generated/client/worldmonitor/positive_events/v1/service_client.ts b/src/generated/client/worldmonitor/positive_events/v1/service_client.ts index 9d239050b..1307e23ed 100644 --- a/src/generated/client/worldmonitor/positive_events/v1/service_client.ts +++ b/src/generated/client/worldmonitor/positive_events/v1/service_client.ts @@ -1,4 +1,3 @@ -// @ts-nocheck // Code generated by protoc-gen-ts-client. DO NOT EDIT. // source: worldmonitor/positive_events/v1/service.proto @@ -66,7 +65,7 @@ export class PositiveEventsServiceClient { this.defaultHeaders = { ...options?.defaultHeaders }; } - async listPositiveGeoEvents(req: ListPositiveGeoEventsRequest, options?: PositiveEventsServiceCallOptions): Promise { + async listPositiveGeoEvents(_req: ListPositiveGeoEventsRequest, options?: PositiveEventsServiceCallOptions): Promise { let path = "/api/positive-events/v1/list-positive-geo-events"; const url = this.baseURL + path; diff --git a/src/generated/client/worldmonitor/prediction/v1/service_client.ts b/src/generated/client/worldmonitor/prediction/v1/service_client.ts index f52209c0c..a7bcc00c5 100644 --- a/src/generated/client/worldmonitor/prediction/v1/service_client.ts +++ b/src/generated/client/worldmonitor/prediction/v1/service_client.ts @@ -1,4 +1,3 @@ -// @ts-nocheck // Code generated by protoc-gen-ts-client. DO NOT EDIT. // source: worldmonitor/prediction/v1/service.proto diff --git a/src/generated/client/worldmonitor/radiation/v1/service_client.ts b/src/generated/client/worldmonitor/radiation/v1/service_client.ts index 1e6dcc46d..000c7d9ef 100644 --- a/src/generated/client/worldmonitor/radiation/v1/service_client.ts +++ b/src/generated/client/worldmonitor/radiation/v1/service_client.ts @@ -1,4 +1,3 @@ -// @ts-nocheck // Code generated by protoc-gen-ts-client. DO NOT EDIT. // source: worldmonitor/radiation/v1/service.proto diff --git a/src/generated/client/worldmonitor/research/v1/service_client.ts b/src/generated/client/worldmonitor/research/v1/service_client.ts index c37279a6d..c573a14ba 100644 --- a/src/generated/client/worldmonitor/research/v1/service_client.ts +++ b/src/generated/client/worldmonitor/research/v1/service_client.ts @@ -1,4 +1,3 @@ -// @ts-nocheck // Code generated by protoc-gen-ts-client. DO NOT EDIT. // source: worldmonitor/research/v1/service.proto diff --git a/src/generated/client/worldmonitor/resilience/v1/service_client.ts b/src/generated/client/worldmonitor/resilience/v1/service_client.ts index f23e42b77..bebdeaff4 100644 --- a/src/generated/client/worldmonitor/resilience/v1/service_client.ts +++ b/src/generated/client/worldmonitor/resilience/v1/service_client.ts @@ -1,4 +1,3 @@ -// @ts-nocheck // Code generated by protoc-gen-ts-client. DO NOT EDIT. // source: worldmonitor/resilience/v1/service.proto @@ -149,7 +148,7 @@ export class ResilienceServiceClient { return await resp.json() as GetResilienceScoreResponse; } - async getResilienceRanking(req: GetResilienceRankingRequest, options?: ResilienceServiceCallOptions): Promise { + async getResilienceRanking(_req: GetResilienceRankingRequest, options?: ResilienceServiceCallOptions): Promise { let path = "/api/resilience/v1/get-resilience-ranking"; const url = this.baseURL + path; diff --git a/src/generated/client/worldmonitor/sanctions/v1/service_client.ts b/src/generated/client/worldmonitor/sanctions/v1/service_client.ts index 10060493d..bb5200c0b 100644 --- a/src/generated/client/worldmonitor/sanctions/v1/service_client.ts +++ b/src/generated/client/worldmonitor/sanctions/v1/service_client.ts @@ -1,4 +1,3 @@ -// @ts-nocheck // Code generated by protoc-gen-ts-client. DO NOT EDIT. // source: worldmonitor/sanctions/v1/service.proto diff --git a/src/generated/client/worldmonitor/scenario/v1/service_client.ts b/src/generated/client/worldmonitor/scenario/v1/service_client.ts index b61d4b530..cb9e8cccc 100644 --- a/src/generated/client/worldmonitor/scenario/v1/service_client.ts +++ b/src/generated/client/worldmonitor/scenario/v1/service_client.ts @@ -1,4 +1,3 @@ -// @ts-nocheck // Code generated by protoc-gen-ts-client. DO NOT EDIT. // source: worldmonitor/scenario/v1/service.proto @@ -156,7 +155,7 @@ export class ScenarioServiceClient { return await resp.json() as GetScenarioStatusResponse; } - async listScenarioTemplates(req: ListScenarioTemplatesRequest, options?: ScenarioServiceCallOptions): Promise { + async listScenarioTemplates(_req: ListScenarioTemplatesRequest, options?: ScenarioServiceCallOptions): Promise { let path = "/api/scenario/v1/list-scenario-templates"; const url = this.baseURL + path; diff --git a/src/generated/client/worldmonitor/seismology/v1/service_client.ts b/src/generated/client/worldmonitor/seismology/v1/service_client.ts index cc97a9e01..4319bb4d8 100644 --- a/src/generated/client/worldmonitor/seismology/v1/service_client.ts +++ b/src/generated/client/worldmonitor/seismology/v1/service_client.ts @@ -1,4 +1,3 @@ -// @ts-nocheck // Code generated by protoc-gen-ts-client. DO NOT EDIT. // source: worldmonitor/seismology/v1/service.proto diff --git a/src/generated/client/worldmonitor/shipping/v2/service_client.ts b/src/generated/client/worldmonitor/shipping/v2/service_client.ts index e92a7a458..8039b582d 100644 --- a/src/generated/client/worldmonitor/shipping/v2/service_client.ts +++ b/src/generated/client/worldmonitor/shipping/v2/service_client.ts @@ -1,4 +1,3 @@ -// @ts-nocheck // Code generated by protoc-gen-ts-client. DO NOT EDIT. // source: worldmonitor/shipping/v2/service.proto @@ -164,7 +163,7 @@ export class ShippingV2ServiceClient { return await resp.json() as RegisterWebhookResponse; } - async listWebhooks(req: ListWebhooksRequest, options?: ShippingV2ServiceCallOptions): Promise { + async listWebhooks(_req: ListWebhooksRequest, options?: ShippingV2ServiceCallOptions): Promise { let path = "/api/v2/shipping/webhooks"; const url = this.baseURL + path; diff --git a/src/generated/client/worldmonitor/supply_chain/v1/service_client.ts b/src/generated/client/worldmonitor/supply_chain/v1/service_client.ts index 14d20d4d3..81bcd350f 100644 --- a/src/generated/client/worldmonitor/supply_chain/v1/service_client.ts +++ b/src/generated/client/worldmonitor/supply_chain/v1/service_client.ts @@ -1,4 +1,3 @@ -// @ts-nocheck // Code generated by protoc-gen-ts-client. DO NOT EDIT. // source: worldmonitor/supply_chain/v1/service.proto @@ -686,7 +685,7 @@ export class SupplyChainServiceClient { this.defaultHeaders = { ...options?.defaultHeaders }; } - async getShippingRates(req: GetShippingRatesRequest, options?: SupplyChainServiceCallOptions): Promise { + async getShippingRates(_req: GetShippingRatesRequest, options?: SupplyChainServiceCallOptions): Promise { let path = "/api/supply-chain/v1/get-shipping-rates"; const url = this.baseURL + path; @@ -709,7 +708,7 @@ export class SupplyChainServiceClient { return await resp.json() as GetShippingRatesResponse; } - async getChokepointStatus(req: GetChokepointStatusRequest, options?: SupplyChainServiceCallOptions): Promise { + async getChokepointStatus(_req: GetChokepointStatusRequest, options?: SupplyChainServiceCallOptions): Promise { let path = "/api/supply-chain/v1/get-chokepoint-status"; const url = this.baseURL + path; @@ -757,7 +756,7 @@ export class SupplyChainServiceClient { return await resp.json() as GetChokepointHistoryResponse; } - async getCriticalMinerals(req: GetCriticalMineralsRequest, options?: SupplyChainServiceCallOptions): Promise { + async getCriticalMinerals(_req: GetCriticalMineralsRequest, options?: SupplyChainServiceCallOptions): Promise { let path = "/api/supply-chain/v1/get-critical-minerals"; const url = this.baseURL + path; @@ -780,7 +779,7 @@ export class SupplyChainServiceClient { return await resp.json() as GetCriticalMineralsResponse; } - async getShippingStress(req: GetShippingStressRequest, options?: SupplyChainServiceCallOptions): Promise { + async getShippingStress(_req: GetShippingStressRequest, options?: SupplyChainServiceCallOptions): Promise { let path = "/api/supply-chain/v1/get-shipping-stress"; const url = this.baseURL + path; diff --git a/src/generated/client/worldmonitor/thermal/v1/service_client.ts b/src/generated/client/worldmonitor/thermal/v1/service_client.ts index db019fc37..25f6784ef 100644 --- a/src/generated/client/worldmonitor/thermal/v1/service_client.ts +++ b/src/generated/client/worldmonitor/thermal/v1/service_client.ts @@ -1,4 +1,3 @@ -// @ts-nocheck // Code generated by protoc-gen-ts-client. DO NOT EDIT. // source: worldmonitor/thermal/v1/service.proto diff --git a/src/generated/client/worldmonitor/trade/v1/service_client.ts b/src/generated/client/worldmonitor/trade/v1/service_client.ts index c5a4d7a26..3b6b1b652 100644 --- a/src/generated/client/worldmonitor/trade/v1/service_client.ts +++ b/src/generated/client/worldmonitor/trade/v1/service_client.ts @@ -1,4 +1,3 @@ -// @ts-nocheck // Code generated by protoc-gen-ts-client. DO NOT EDIT. // source: worldmonitor/trade/v1/service.proto @@ -199,7 +198,7 @@ export class TradeServiceClient { async getTradeRestrictions(req: GetTradeRestrictionsRequest, options?: TradeServiceCallOptions): Promise { let path = "/api/trade/v1/get-trade-restrictions"; const params = new URLSearchParams(); - if (req.countries != null && req.countries !== "") params.set("countries", String(req.countries)); + if (req.countries && req.countries.length > 0) req.countries.forEach(v => params.append("countries", v)); if (req.limit != null && req.limit !== 0) params.set("limit", String(req.limit)); const url = this.baseURL + path + (params.toString() ? "?" + params.toString() : ""); @@ -280,7 +279,7 @@ export class TradeServiceClient { async getTradeBarriers(req: GetTradeBarriersRequest, options?: TradeServiceCallOptions): Promise { let path = "/api/trade/v1/get-trade-barriers"; const params = new URLSearchParams(); - if (req.countries != null && req.countries !== "") params.set("countries", String(req.countries)); + if (req.countries && req.countries.length > 0) req.countries.forEach(v => params.append("countries", v)); if (req.measureType != null && req.measureType !== "") params.set("measure_type", String(req.measureType)); if (req.limit != null && req.limit !== 0) params.set("limit", String(req.limit)); const url = this.baseURL + path + (params.toString() ? "?" + params.toString() : ""); @@ -304,7 +303,7 @@ export class TradeServiceClient { return await resp.json() as GetTradeBarriersResponse; } - async getCustomsRevenue(req: GetCustomsRevenueRequest, options?: TradeServiceCallOptions): Promise { + async getCustomsRevenue(_req: GetCustomsRevenueRequest, options?: TradeServiceCallOptions): Promise { let path = "/api/trade/v1/get-customs-revenue"; const url = this.baseURL + path; diff --git a/src/generated/client/worldmonitor/unrest/v1/service_client.ts b/src/generated/client/worldmonitor/unrest/v1/service_client.ts index 0449fdc04..9b6768651 100644 --- a/src/generated/client/worldmonitor/unrest/v1/service_client.ts +++ b/src/generated/client/worldmonitor/unrest/v1/service_client.ts @@ -1,4 +1,3 @@ -// @ts-nocheck // Code generated by protoc-gen-ts-client. DO NOT EDIT. // source: worldmonitor/unrest/v1/service.proto @@ -126,7 +125,7 @@ export class UnrestServiceClient { if (req.pageSize != null && req.pageSize !== 0) params.set("page_size", String(req.pageSize)); if (req.cursor != null && req.cursor !== "") params.set("cursor", String(req.cursor)); if (req.country != null && req.country !== "") params.set("country", String(req.country)); - if (req.minSeverity != null && req.minSeverity !== "") params.set("min_severity", String(req.minSeverity)); + if (req.minSeverity != null && req.minSeverity !== "SEVERITY_LEVEL_UNSPECIFIED") params.set("min_severity", String(req.minSeverity)); if (req.neLat != null && req.neLat !== 0) params.set("ne_lat", String(req.neLat)); if (req.neLon != null && req.neLon !== 0) params.set("ne_lon", String(req.neLon)); if (req.swLat != null && req.swLat !== 0) params.set("sw_lat", String(req.swLat)); diff --git a/src/generated/client/worldmonitor/webcam/v1/service_client.ts b/src/generated/client/worldmonitor/webcam/v1/service_client.ts index f4484a461..09b1f0538 100644 --- a/src/generated/client/worldmonitor/webcam/v1/service_client.ts +++ b/src/generated/client/worldmonitor/webcam/v1/service_client.ts @@ -1,4 +1,3 @@ -// @ts-nocheck // Code generated by protoc-gen-ts-client. DO NOT EDIT. // source: worldmonitor/webcam/v1/service.proto diff --git a/src/generated/client/worldmonitor/wildfire/v1/service_client.ts b/src/generated/client/worldmonitor/wildfire/v1/service_client.ts index 9bd890a06..469f80eea 100644 --- a/src/generated/client/worldmonitor/wildfire/v1/service_client.ts +++ b/src/generated/client/worldmonitor/wildfire/v1/service_client.ts @@ -1,4 +1,3 @@ -// @ts-nocheck // Code generated by protoc-gen-ts-client. DO NOT EDIT. // source: worldmonitor/wildfire/v1/service.proto diff --git a/src/generated/server/worldmonitor/aviation/v1/service_server.ts b/src/generated/server/worldmonitor/aviation/v1/service_server.ts index be0870876..cd288186c 100644 --- a/src/generated/server/worldmonitor/aviation/v1/service_server.ts +++ b/src/generated/server/worldmonitor/aviation/v1/service_server.ts @@ -1,4 +1,3 @@ -// @ts-nocheck // Code generated by protoc-gen-ts-server. DO NOT EDIT. // source: worldmonitor/aviation/v1/service.proto @@ -417,8 +416,8 @@ export function createAviationServiceRoutes( const body: ListAirportDelaysRequest = { pageSize: Number(params.get("page_size") ?? "0"), cursor: params.get("cursor") ?? "", - region: params.get("region") ?? "", - minSeverity: params.get("min_severity") ?? "", + region: (params.get("region") ?? "AIRPORT_REGION_UNSPECIFIED") as AirportRegion, + minSeverity: (params.get("min_severity") ?? "FLIGHT_DELAY_SEVERITY_UNSPECIFIED") as FlightDelaySeverity, }; if (options?.validateRequest) { const bodyViolations = options.validateRequest("listAirportDelays", body); @@ -465,7 +464,7 @@ export function createAviationServiceRoutes( const url = new URL(req.url, "http://localhost"); const params = url.searchParams; const body: GetAirportOpsSummaryRequest = { - airports: params.get("airports") ?? "", + airports: params.getAll("airports"), }; if (options?.validateRequest) { const bodyViolations = options.validateRequest("getAirportOpsSummary", body); @@ -513,7 +512,7 @@ export function createAviationServiceRoutes( const params = url.searchParams; const body: ListAirportFlightsRequest = { airport: params.get("airport") ?? "", - direction: params.get("direction") ?? "", + direction: (params.get("direction") ?? "FLIGHT_DIRECTION_UNSPECIFIED") as FlightDirection, limit: Number(params.get("limit") ?? "0"), }; if (options?.validateRequest) { @@ -561,7 +560,7 @@ export function createAviationServiceRoutes( const url = new URL(req.url, "http://localhost"); const params = url.searchParams; const body: GetCarrierOpsRequest = { - airports: params.get("airports") ?? "", + airports: params.getAll("airports"), minFlights: Number(params.get("min_flights") ?? "0"), }; if (options?.validateRequest) { @@ -763,7 +762,7 @@ export function createAviationServiceRoutes( departureDate: params.get("departure_date") ?? "", returnDate: params.get("return_date") ?? "", adults: Number(params.get("adults") ?? "0"), - cabin: params.get("cabin") ?? "", + cabin: (params.get("cabin") ?? "CABIN_CLASS_UNSPECIFIED") as CabinClass, nonstopOnly: params.get("nonstop_only") === "true", maxResults: Number(params.get("max_results") ?? "0"), currency: params.get("currency") ?? "", @@ -814,7 +813,7 @@ export function createAviationServiceRoutes( const url = new URL(req.url, "http://localhost"); const params = url.searchParams; const body: ListAviationNewsRequest = { - entities: params.get("entities") ?? "", + entities: params.getAll("entities"), windowHours: Number(params.get("window_hours") ?? "0"), maxItems: Number(params.get("max_items") ?? "0"), }; @@ -870,7 +869,7 @@ export function createAviationServiceRoutes( cabinClass: params.get("cabin_class") ?? "", maxStops: params.get("max_stops") ?? "", departureWindow: params.get("departure_window") ?? "", - airlines: params.get("airlines") ?? "", + airlines: params.getAll("airlines"), sortBy: params.get("sort_by") ?? "", passengers: Number(params.get("passengers") ?? "0"), }; @@ -928,7 +927,7 @@ export function createAviationServiceRoutes( cabinClass: params.get("cabin_class") ?? "", maxStops: params.get("max_stops") ?? "", departureWindow: params.get("departure_window") ?? "", - airlines: params.get("airlines") ?? "", + airlines: params.getAll("airlines"), sortByPrice: params.get("sort_by_price") === "true", passengers: Number(params.get("passengers") ?? "0"), }; diff --git a/src/generated/server/worldmonitor/climate/v1/service_server.ts b/src/generated/server/worldmonitor/climate/v1/service_server.ts index 5c80cb022..544b3121b 100644 --- a/src/generated/server/worldmonitor/climate/v1/service_server.ts +++ b/src/generated/server/worldmonitor/climate/v1/service_server.ts @@ -1,4 +1,3 @@ -// @ts-nocheck // Code generated by protoc-gen-ts-server. DO NOT EDIT. // source: worldmonitor/climate/v1/service.proto @@ -221,7 +220,7 @@ export function createClimateServiceRoutes( const body: ListClimateAnomaliesRequest = { pageSize: Number(params.get("page_size") ?? "0"), cursor: params.get("cursor") ?? "", - minSeverity: params.get("min_severity") ?? "", + minSeverity: (params.get("min_severity") ?? "ANOMALY_SEVERITY_UNSPECIFIED") as AnomalySeverity, }; if (options?.validateRequest) { const bodyViolations = options.validateRequest("listClimateAnomalies", body); diff --git a/src/generated/server/worldmonitor/conflict/v1/service_server.ts b/src/generated/server/worldmonitor/conflict/v1/service_server.ts index 4ac49cfd0..df16f9574 100644 --- a/src/generated/server/worldmonitor/conflict/v1/service_server.ts +++ b/src/generated/server/worldmonitor/conflict/v1/service_server.ts @@ -1,4 +1,3 @@ -// @ts-nocheck // Code generated by protoc-gen-ts-server. DO NOT EDIT. // source: worldmonitor/conflict/v1/service.proto diff --git a/src/generated/server/worldmonitor/consumer_prices/v1/service_server.ts b/src/generated/server/worldmonitor/consumer_prices/v1/service_server.ts index 4abfd269a..acd124e8b 100644 --- a/src/generated/server/worldmonitor/consumer_prices/v1/service_server.ts +++ b/src/generated/server/worldmonitor/consumer_prices/v1/service_server.ts @@ -1,4 +1,3 @@ -// @ts-nocheck // Code generated by protoc-gen-ts-server. DO NOT EDIT. // source: worldmonitor/consumer_prices/v1/service.proto diff --git a/src/generated/server/worldmonitor/cyber/v1/service_server.ts b/src/generated/server/worldmonitor/cyber/v1/service_server.ts index b8dc4ff38..1c53ef1a8 100644 --- a/src/generated/server/worldmonitor/cyber/v1/service_server.ts +++ b/src/generated/server/worldmonitor/cyber/v1/service_server.ts @@ -1,4 +1,3 @@ -// @ts-nocheck // Code generated by protoc-gen-ts-server. DO NOT EDIT. // source: worldmonitor/cyber/v1/service.proto @@ -116,9 +115,9 @@ export function createCyberServiceRoutes( end: Number(params.get("end") ?? "0"), pageSize: Number(params.get("page_size") ?? "0"), cursor: params.get("cursor") ?? "", - type: params.get("type") ?? "", - source: params.get("source") ?? "", - minSeverity: params.get("min_severity") ?? "", + type: (params.get("type") ?? "CYBER_THREAT_TYPE_UNSPECIFIED") as CyberThreatType, + source: (params.get("source") ?? "CYBER_THREAT_SOURCE_UNSPECIFIED") as CyberThreatSource, + minSeverity: (params.get("min_severity") ?? "CRITICALITY_LEVEL_UNSPECIFIED") as CriticalityLevel, }; if (options?.validateRequest) { const bodyViolations = options.validateRequest("listCyberThreats", body); diff --git a/src/generated/server/worldmonitor/displacement/v1/service_server.ts b/src/generated/server/worldmonitor/displacement/v1/service_server.ts index e5045f598..99db57c56 100644 --- a/src/generated/server/worldmonitor/displacement/v1/service_server.ts +++ b/src/generated/server/worldmonitor/displacement/v1/service_server.ts @@ -1,4 +1,3 @@ -// @ts-nocheck // Code generated by protoc-gen-ts-server. DO NOT EDIT. // source: worldmonitor/displacement/v1/service.proto diff --git a/src/generated/server/worldmonitor/economic/v1/service_server.ts b/src/generated/server/worldmonitor/economic/v1/service_server.ts index dbfffd54d..516d32655 100644 --- a/src/generated/server/worldmonitor/economic/v1/service_server.ts +++ b/src/generated/server/worldmonitor/economic/v1/service_server.ts @@ -1,4 +1,3 @@ -// @ts-nocheck // Code generated by protoc-gen-ts-server. DO NOT EDIT. // source: worldmonitor/economic/v1/service.proto @@ -878,7 +877,7 @@ export function createEconomicServiceRoutes( const url = new URL(req.url, "http://localhost"); const params = url.searchParams; const body: GetEnergyPricesRequest = { - commodities: params.get("commodities") ?? "", + commodities: params.getAll("commodities"), }; if (options?.validateRequest) { const bodyViolations = options.validateRequest("getEnergyPrices", body); @@ -962,7 +961,7 @@ export function createEconomicServiceRoutes( const url = new URL(req.url, "http://localhost"); const params = url.searchParams; const body: GetEnergyCapacityRequest = { - energySources: params.get("energy_sources") ?? "", + energySources: params.getAll("energy_sources"), years: Number(params.get("years") ?? "0"), }; if (options?.validateRequest) { diff --git a/src/generated/server/worldmonitor/forecast/v1/service_server.ts b/src/generated/server/worldmonitor/forecast/v1/service_server.ts index 1de0af48d..eda7066c0 100644 --- a/src/generated/server/worldmonitor/forecast/v1/service_server.ts +++ b/src/generated/server/worldmonitor/forecast/v1/service_server.ts @@ -1,4 +1,3 @@ -// @ts-nocheck // Code generated by protoc-gen-ts-server. DO NOT EDIT. // source: worldmonitor/forecast/v1/service.proto diff --git a/src/generated/server/worldmonitor/giving/v1/service_server.ts b/src/generated/server/worldmonitor/giving/v1/service_server.ts index d5ca73a52..5d6c97869 100644 --- a/src/generated/server/worldmonitor/giving/v1/service_server.ts +++ b/src/generated/server/worldmonitor/giving/v1/service_server.ts @@ -1,4 +1,3 @@ -// @ts-nocheck // Code generated by protoc-gen-ts-server. DO NOT EDIT. // source: worldmonitor/giving/v1/service.proto diff --git a/src/generated/server/worldmonitor/health/v1/service_server.ts b/src/generated/server/worldmonitor/health/v1/service_server.ts index ec886874b..23a494ebf 100644 --- a/src/generated/server/worldmonitor/health/v1/service_server.ts +++ b/src/generated/server/worldmonitor/health/v1/service_server.ts @@ -1,4 +1,3 @@ -// @ts-nocheck // Code generated by protoc-gen-ts-server. DO NOT EDIT. // source: worldmonitor/health/v1/service.proto diff --git a/src/generated/server/worldmonitor/imagery/v1/service_server.ts b/src/generated/server/worldmonitor/imagery/v1/service_server.ts index 6d94193f1..ca8dd13bb 100644 --- a/src/generated/server/worldmonitor/imagery/v1/service_server.ts +++ b/src/generated/server/worldmonitor/imagery/v1/service_server.ts @@ -1,4 +1,3 @@ -// @ts-nocheck // Code generated by protoc-gen-ts-server. DO NOT EDIT. // source: worldmonitor/imagery/v1/service.proto diff --git a/src/generated/server/worldmonitor/infrastructure/v1/service_server.ts b/src/generated/server/worldmonitor/infrastructure/v1/service_server.ts index 82287f701..8aa4cc9fe 100644 --- a/src/generated/server/worldmonitor/infrastructure/v1/service_server.ts +++ b/src/generated/server/worldmonitor/infrastructure/v1/service_server.ts @@ -1,4 +1,3 @@ -// @ts-nocheck // Code generated by protoc-gen-ts-server. DO NOT EDIT. // source: worldmonitor/infrastructure/v1/service.proto @@ -350,7 +349,7 @@ export function createInfrastructureServiceRoutes( const url = new URL(req.url, "http://localhost"); const params = url.searchParams; const body: ListServiceStatusesRequest = { - status: params.get("status") ?? "", + status: (params.get("status") ?? "SERVICE_OPERATIONAL_STATUS_UNSPECIFIED") as ServiceOperationalStatus, }; if (options?.validateRequest) { const bodyViolations = options.validateRequest("listServiceStatuses", body); @@ -532,7 +531,7 @@ export function createInfrastructureServiceRoutes( const params = url.searchParams; const body: GetBootstrapDataRequest = { tier: params.get("tier") ?? "", - keys: params.get("keys") ?? "", + keys: params.getAll("keys"), }; if (options?.validateRequest) { const bodyViolations = options.validateRequest("getBootstrapData", body); diff --git a/src/generated/server/worldmonitor/intelligence/v1/service_server.ts b/src/generated/server/worldmonitor/intelligence/v1/service_server.ts index 9576cdebc..9d2b481b3 100644 --- a/src/generated/server/worldmonitor/intelligence/v1/service_server.ts +++ b/src/generated/server/worldmonitor/intelligence/v1/service_server.ts @@ -1,4 +1,3 @@ -// @ts-nocheck // Code generated by protoc-gen-ts-server. DO NOT EDIT. // source: worldmonitor/intelligence/v1/service.proto @@ -1384,7 +1383,7 @@ export function createIntelligenceServiceRoutes( const url = new URL(req.url, "http://localhost"); const params = url.searchParams; const body: ListOrefAlertsRequest = { - mode: params.get("mode") ?? "", + mode: (params.get("mode") ?? "MODE_UNSPECIFIED") as Mode, }; if (options?.validateRequest) { const bodyViolations = options.validateRequest("listOrefAlerts", body); diff --git a/src/generated/server/worldmonitor/leads/v1/service_server.ts b/src/generated/server/worldmonitor/leads/v1/service_server.ts index 0daad2c2b..c60822549 100644 --- a/src/generated/server/worldmonitor/leads/v1/service_server.ts +++ b/src/generated/server/worldmonitor/leads/v1/service_server.ts @@ -1,4 +1,3 @@ -// @ts-nocheck // Code generated by protoc-gen-ts-server. DO NOT EDIT. // source: worldmonitor/leads/v1/service.proto diff --git a/src/generated/server/worldmonitor/maritime/v1/service_server.ts b/src/generated/server/worldmonitor/maritime/v1/service_server.ts index 267f0c05b..676b63d93 100644 --- a/src/generated/server/worldmonitor/maritime/v1/service_server.ts +++ b/src/generated/server/worldmonitor/maritime/v1/service_server.ts @@ -1,4 +1,3 @@ -// @ts-nocheck // Code generated by protoc-gen-ts-server. DO NOT EDIT. // source: worldmonitor/maritime/v1/service.proto diff --git a/src/generated/server/worldmonitor/market/v1/service_server.ts b/src/generated/server/worldmonitor/market/v1/service_server.ts index 930c43c02..f16fac6d1 100644 --- a/src/generated/server/worldmonitor/market/v1/service_server.ts +++ b/src/generated/server/worldmonitor/market/v1/service_server.ts @@ -1,4 +1,3 @@ -// @ts-nocheck // Code generated by protoc-gen-ts-server. DO NOT EDIT. // source: worldmonitor/market/v1/service.proto @@ -732,7 +731,7 @@ export function createMarketServiceRoutes( const url = new URL(req.url, "http://localhost"); const params = url.searchParams; const body: ListMarketQuotesRequest = { - symbols: params.get("symbols") ?? "", + symbols: params.getAll("symbols"), }; if (options?.validateRequest) { const bodyViolations = options.validateRequest("listMarketQuotes", body); @@ -779,7 +778,7 @@ export function createMarketServiceRoutes( const url = new URL(req.url, "http://localhost"); const params = url.searchParams; const body: ListCryptoQuotesRequest = { - ids: params.get("ids") ?? "", + ids: params.getAll("ids"), }; if (options?.validateRequest) { const bodyViolations = options.validateRequest("listCryptoQuotes", body); @@ -826,7 +825,7 @@ export function createMarketServiceRoutes( const url = new URL(req.url, "http://localhost"); const params = url.searchParams; const body: ListCommodityQuotesRequest = { - symbols: params.get("symbols") ?? "", + symbols: params.getAll("symbols"), }; if (options?.validateRequest) { const bodyViolations = options.validateRequest("listCommodityQuotes", body); @@ -920,7 +919,7 @@ export function createMarketServiceRoutes( const url = new URL(req.url, "http://localhost"); const params = url.searchParams; const body: ListStablecoinMarketsRequest = { - coins: params.get("coins") ?? "", + coins: params.getAll("coins"), }; if (options?.validateRequest) { const bodyViolations = options.validateRequest("listStablecoinMarkets", body); @@ -1137,7 +1136,7 @@ export function createMarketServiceRoutes( const url = new URL(req.url, "http://localhost"); const params = url.searchParams; const body: GetStockAnalysisHistoryRequest = { - symbols: params.get("symbols") ?? "", + symbols: params.getAll("symbols"), limitPerSymbol: Number(params.get("limit_per_symbol") ?? "0"), includeNews: params.get("include_news") === "true", }; @@ -1235,7 +1234,7 @@ export function createMarketServiceRoutes( const url = new URL(req.url, "http://localhost"); const params = url.searchParams; const body: ListStoredStockBacktestsRequest = { - symbols: params.get("symbols") ?? "", + symbols: params.getAll("symbols"), evalWindowDays: Number(params.get("eval_window_days") ?? "0"), }; if (options?.validateRequest) { diff --git a/src/generated/server/worldmonitor/military/v1/service_server.ts b/src/generated/server/worldmonitor/military/v1/service_server.ts index edd6d4ac4..be09e2157 100644 --- a/src/generated/server/worldmonitor/military/v1/service_server.ts +++ b/src/generated/server/worldmonitor/military/v1/service_server.ts @@ -1,4 +1,3 @@ -// @ts-nocheck // Code generated by protoc-gen-ts-server. DO NOT EDIT. // source: worldmonitor/military/v1/service.proto @@ -380,8 +379,8 @@ export function createMilitaryServiceRoutes( neLon: Number(params.get("ne_lon") ?? "0"), swLat: Number(params.get("sw_lat") ?? "0"), swLon: Number(params.get("sw_lon") ?? "0"), - operator: params.get("operator") ?? "", - aircraftType: params.get("aircraft_type") ?? "", + operator: (params.get("operator") ?? "MILITARY_OPERATOR_UNSPECIFIED") as MilitaryOperator, + aircraftType: (params.get("aircraft_type") ?? "MILITARY_AIRCRAFT_TYPE_UNSPECIFIED") as MilitaryAircraftType, }; if (options?.validateRequest) { const bodyViolations = options.validateRequest("listMilitaryFlights", body); diff --git a/src/generated/server/worldmonitor/natural/v1/service_server.ts b/src/generated/server/worldmonitor/natural/v1/service_server.ts index 485c037ce..abc4862d6 100644 --- a/src/generated/server/worldmonitor/natural/v1/service_server.ts +++ b/src/generated/server/worldmonitor/natural/v1/service_server.ts @@ -1,4 +1,3 @@ -// @ts-nocheck // Code generated by protoc-gen-ts-server. DO NOT EDIT. // source: worldmonitor/natural/v1/service.proto diff --git a/src/generated/server/worldmonitor/news/v1/service_server.ts b/src/generated/server/worldmonitor/news/v1/service_server.ts index bb4388710..1933bb25c 100644 --- a/src/generated/server/worldmonitor/news/v1/service_server.ts +++ b/src/generated/server/worldmonitor/news/v1/service_server.ts @@ -1,4 +1,3 @@ -// @ts-nocheck // Code generated by protoc-gen-ts-server. DO NOT EDIT. // source: worldmonitor/news/v1/service.proto diff --git a/src/generated/server/worldmonitor/positive_events/v1/service_server.ts b/src/generated/server/worldmonitor/positive_events/v1/service_server.ts index 9b3160184..a6218b060 100644 --- a/src/generated/server/worldmonitor/positive_events/v1/service_server.ts +++ b/src/generated/server/worldmonitor/positive_events/v1/service_server.ts @@ -1,4 +1,3 @@ -// @ts-nocheck // Code generated by protoc-gen-ts-server. DO NOT EDIT. // source: worldmonitor/positive_events/v1/service.proto diff --git a/src/generated/server/worldmonitor/prediction/v1/service_server.ts b/src/generated/server/worldmonitor/prediction/v1/service_server.ts index 8bd9915e1..61da3ee3c 100644 --- a/src/generated/server/worldmonitor/prediction/v1/service_server.ts +++ b/src/generated/server/worldmonitor/prediction/v1/service_server.ts @@ -1,4 +1,3 @@ -// @ts-nocheck // Code generated by protoc-gen-ts-server. DO NOT EDIT. // source: worldmonitor/prediction/v1/service.proto diff --git a/src/generated/server/worldmonitor/radiation/v1/service_server.ts b/src/generated/server/worldmonitor/radiation/v1/service_server.ts index b24bed6bd..b197f9fdc 100644 --- a/src/generated/server/worldmonitor/radiation/v1/service_server.ts +++ b/src/generated/server/worldmonitor/radiation/v1/service_server.ts @@ -1,4 +1,3 @@ -// @ts-nocheck // Code generated by protoc-gen-ts-server. DO NOT EDIT. // source: worldmonitor/radiation/v1/service.proto diff --git a/src/generated/server/worldmonitor/research/v1/service_server.ts b/src/generated/server/worldmonitor/research/v1/service_server.ts index 65148f1b1..18966dfbc 100644 --- a/src/generated/server/worldmonitor/research/v1/service_server.ts +++ b/src/generated/server/worldmonitor/research/v1/service_server.ts @@ -1,4 +1,3 @@ -// @ts-nocheck // Code generated by protoc-gen-ts-server. DO NOT EDIT. // source: worldmonitor/research/v1/service.proto diff --git a/src/generated/server/worldmonitor/resilience/v1/service_server.ts b/src/generated/server/worldmonitor/resilience/v1/service_server.ts index 303bab534..c014edf15 100644 --- a/src/generated/server/worldmonitor/resilience/v1/service_server.ts +++ b/src/generated/server/worldmonitor/resilience/v1/service_server.ts @@ -1,4 +1,3 @@ -// @ts-nocheck // Code generated by protoc-gen-ts-server. DO NOT EDIT. // source: worldmonitor/resilience/v1/service.proto diff --git a/src/generated/server/worldmonitor/sanctions/v1/service_server.ts b/src/generated/server/worldmonitor/sanctions/v1/service_server.ts index 60625e9b8..e576a12a7 100644 --- a/src/generated/server/worldmonitor/sanctions/v1/service_server.ts +++ b/src/generated/server/worldmonitor/sanctions/v1/service_server.ts @@ -1,4 +1,3 @@ -// @ts-nocheck // Code generated by protoc-gen-ts-server. DO NOT EDIT. // source: worldmonitor/sanctions/v1/service.proto diff --git a/src/generated/server/worldmonitor/scenario/v1/service_server.ts b/src/generated/server/worldmonitor/scenario/v1/service_server.ts index c234150b2..6285b574e 100644 --- a/src/generated/server/worldmonitor/scenario/v1/service_server.ts +++ b/src/generated/server/worldmonitor/scenario/v1/service_server.ts @@ -1,4 +1,3 @@ -// @ts-nocheck // Code generated by protoc-gen-ts-server. DO NOT EDIT. // source: worldmonitor/scenario/v1/service.proto diff --git a/src/generated/server/worldmonitor/seismology/v1/service_server.ts b/src/generated/server/worldmonitor/seismology/v1/service_server.ts index 6e74c3217..9104f373f 100644 --- a/src/generated/server/worldmonitor/seismology/v1/service_server.ts +++ b/src/generated/server/worldmonitor/seismology/v1/service_server.ts @@ -1,4 +1,3 @@ -// @ts-nocheck // Code generated by protoc-gen-ts-server. DO NOT EDIT. // source: worldmonitor/seismology/v1/service.proto diff --git a/src/generated/server/worldmonitor/shipping/v2/service_server.ts b/src/generated/server/worldmonitor/shipping/v2/service_server.ts index 772d36353..8483af986 100644 --- a/src/generated/server/worldmonitor/shipping/v2/service_server.ts +++ b/src/generated/server/worldmonitor/shipping/v2/service_server.ts @@ -1,4 +1,3 @@ -// @ts-nocheck // Code generated by protoc-gen-ts-server. DO NOT EDIT. // source: worldmonitor/shipping/v2/service.proto diff --git a/src/generated/server/worldmonitor/supply_chain/v1/service_server.ts b/src/generated/server/worldmonitor/supply_chain/v1/service_server.ts index 1156803d4..f0ae00db7 100644 --- a/src/generated/server/worldmonitor/supply_chain/v1/service_server.ts +++ b/src/generated/server/worldmonitor/supply_chain/v1/service_server.ts @@ -1,4 +1,3 @@ -// @ts-nocheck // Code generated by protoc-gen-ts-server. DO NOT EDIT. // source: worldmonitor/supply_chain/v1/service.proto diff --git a/src/generated/server/worldmonitor/thermal/v1/service_server.ts b/src/generated/server/worldmonitor/thermal/v1/service_server.ts index 5b89ae759..5c9fb3506 100644 --- a/src/generated/server/worldmonitor/thermal/v1/service_server.ts +++ b/src/generated/server/worldmonitor/thermal/v1/service_server.ts @@ -1,4 +1,3 @@ -// @ts-nocheck // Code generated by protoc-gen-ts-server. DO NOT EDIT. // source: worldmonitor/thermal/v1/service.proto diff --git a/src/generated/server/worldmonitor/trade/v1/service_server.ts b/src/generated/server/worldmonitor/trade/v1/service_server.ts index 84ffc7bb0..7ed591002 100644 --- a/src/generated/server/worldmonitor/trade/v1/service_server.ts +++ b/src/generated/server/worldmonitor/trade/v1/service_server.ts @@ -1,4 +1,3 @@ -// @ts-nocheck // Code generated by protoc-gen-ts-server. DO NOT EDIT. // source: worldmonitor/trade/v1/service.proto @@ -215,7 +214,7 @@ export function createTradeServiceRoutes( const url = new URL(req.url, "http://localhost"); const params = url.searchParams; const body: GetTradeRestrictionsRequest = { - countries: params.get("countries") ?? "", + countries: params.getAll("countries"), limit: Number(params.get("limit") ?? "0"), }; if (options?.validateRequest) { @@ -362,7 +361,7 @@ export function createTradeServiceRoutes( const url = new URL(req.url, "http://localhost"); const params = url.searchParams; const body: GetTradeBarriersRequest = { - countries: params.get("countries") ?? "", + countries: params.getAll("countries"), measureType: params.get("measure_type") ?? "", limit: Number(params.get("limit") ?? "0"), }; diff --git a/src/generated/server/worldmonitor/unrest/v1/service_server.ts b/src/generated/server/worldmonitor/unrest/v1/service_server.ts index cbe3f35b5..00aa21331 100644 --- a/src/generated/server/worldmonitor/unrest/v1/service_server.ts +++ b/src/generated/server/worldmonitor/unrest/v1/service_server.ts @@ -1,4 +1,3 @@ -// @ts-nocheck // Code generated by protoc-gen-ts-server. DO NOT EDIT. // source: worldmonitor/unrest/v1/service.proto @@ -137,7 +136,7 @@ export function createUnrestServiceRoutes( pageSize: Number(params.get("page_size") ?? "0"), cursor: params.get("cursor") ?? "", country: params.get("country") ?? "", - minSeverity: params.get("min_severity") ?? "", + minSeverity: (params.get("min_severity") ?? "SEVERITY_LEVEL_UNSPECIFIED") as SeverityLevel, neLat: Number(params.get("ne_lat") ?? "0"), neLon: Number(params.get("ne_lon") ?? "0"), swLat: Number(params.get("sw_lat") ?? "0"), diff --git a/src/generated/server/worldmonitor/webcam/v1/service_server.ts b/src/generated/server/worldmonitor/webcam/v1/service_server.ts index 051559e9c..442c2a4d3 100644 --- a/src/generated/server/worldmonitor/webcam/v1/service_server.ts +++ b/src/generated/server/worldmonitor/webcam/v1/service_server.ts @@ -1,4 +1,3 @@ -// @ts-nocheck // Code generated by protoc-gen-ts-server. DO NOT EDIT. // source: worldmonitor/webcam/v1/service.proto diff --git a/src/generated/server/worldmonitor/wildfire/v1/service_server.ts b/src/generated/server/worldmonitor/wildfire/v1/service_server.ts index 35803c002..c75d457e0 100644 --- a/src/generated/server/worldmonitor/wildfire/v1/service_server.ts +++ b/src/generated/server/worldmonitor/wildfire/v1/service_server.ts @@ -1,4 +1,3 @@ -// @ts-nocheck // Code generated by protoc-gen-ts-server. DO NOT EDIT. // source: worldmonitor/wildfire/v1/service.proto diff --git a/tests/market-service-symbol-casing.test.mjs b/tests/market-service-symbol-casing.test.mjs index c553ed359..21376f91a 100644 --- a/tests/market-service-symbol-casing.test.mjs +++ b/tests/market-service-symbol-casing.test.mjs @@ -83,7 +83,7 @@ describe('market service symbol casing', () => { globalThis.fetch = async (input) => { const url = getRequestUrl(input); - requests.push(url.searchParams.get('symbols')); + requests.push(url.searchParams.getAll('symbols')); return new Response(JSON.stringify(marketResponse([ quote('btc-usd', 101), quote('BTC-USD', 202), @@ -100,7 +100,7 @@ describe('market service symbol casing', () => { { symbol: 'BTC-USD', name: 'Upper BTC', display: 'BTC upper' }, ]); - assert.equal(requests[0], 'btc-usd,BTC-USD'); + assert.deepEqual(requests[0], ['btc-usd', 'BTC-USD']); assert.deepEqual( result.data.map((entry) => entry.symbol), ['btc-usd', 'BTC-USD'], @@ -127,8 +127,7 @@ describe('market service symbol casing', () => { globalThis.fetch = async (input) => { fetchCount += 1; const url = getRequestUrl(input); - const symbols = url.searchParams.get('symbols'); - const [symbol = ''] = (symbols ?? '').split(','); + const [symbol = ''] = url.searchParams.getAll('symbols'); const price = symbol === 'BTC-USD' ? 222 : 111; return new Response(JSON.stringify(marketResponse([quote(symbol, price)])), { status: 200, diff --git a/tests/stock-analysis-history.test.mts b/tests/stock-analysis-history.test.mts index 0b58c14c6..9e416816e 100644 --- a/tests/stock-analysis-history.test.mts +++ b/tests/stock-analysis-history.test.mts @@ -332,7 +332,7 @@ describe('MarketServiceClient getStockAnalysisHistory', () => { }); assert.match(requestedUrl, /\/api\/market\/v1\/get-stock-analysis-history\?/); - assert.match(requestedUrl, /symbols=AAPL%2CMSFT|symbols=AAPL,MSFT/); + assert.match(requestedUrl, /symbols=AAPL&symbols=MSFT/); assert.match(requestedUrl, /limit_per_symbol=4/); assert.match(requestedUrl, /include_news=true/); }); diff --git a/tests/stock-backtest.test.mts b/tests/stock-backtest.test.mts index bfdb90f0f..0ae4b2113 100644 --- a/tests/stock-backtest.test.mts +++ b/tests/stock-backtest.test.mts @@ -260,7 +260,7 @@ describe('MarketServiceClient listStoredStockBacktests', () => { await client.listStoredStockBacktests({ symbols: ['MSFT', 'NVDA'], evalWindowDays: 7 }); assert.match(requestedUrl, /\/api\/market\/v1\/list-stored-stock-backtests\?/); - assert.match(requestedUrl, /symbols=MSFT%2CNVDA|symbols=MSFT,NVDA/); + assert.match(requestedUrl, /symbols=MSFT&symbols=NVDA/); assert.match(requestedUrl, /eval_window_days=7/); }); });