naftiko: 1.0.0-alpha2 info: label: OpenAQ — Measurements description: 'OpenAQ — Measurements. 5 operations. Lead operation: OpenAQ Get a list of measurements. Self-contained Naftiko capability covering one Openaq business surface.' tags: - Openaq - Measurements created: '2026-05-19' modified: '2026-05-19' binds: - namespace: env keys: OPENAQ_API_KEY: OPENAQ_API_KEY capability: consumes: - type: http namespace: openaq-measurements baseUri: '' description: OpenAQ — Measurements business capability. Self-contained, no shared references. resources: - name: v1-measurements path: /v1/measurements operations: - name: measurementsgetv1v1measurementsget method: GET description: OpenAQ Get a list of measurements outputRawFormat: json outputParameters: - name: result type: object value: $. inputParameters: - name: format in: query type: string - name: date_from in: query type: string description: From when? - name: date_to in: query type: string description: to when? - name: limit in: query type: string description: Change the number of results returned. e.g. limit=1000 will return up to 1000 results - name: page in: query type: string description: Paginate through results. e.g. page=1 will return first page of results - name: offset in: query type: string - name: sort in: query type: string - name: has_geo in: query type: string - name: parameter_id in: query type: string description: (optional) A parameter ID to filter measurement results. e.g. parameter_id=2 (i.e. PM2.5) will limit measurement results to only PM2.5 measurements - name: parameter in: query type: string description: (optional) A parameter name or ID by which to filter measurement results. e.g. parameter=pm25 or parameter=pm25¶meter=pm10 - name: unit in: query type: string - name: coordinates in: query type: string description: Coordinate pair in form lat,lng. Up to 8 decimal points of precision e.g. 38.907,-77.037 - name: radius in: query type: integer description: Search radius from coordinates as center in meters. Maximum of 25,000 (25km) defaults to 1000 (1km) e.g. radius=10000 - name: country_id in: query type: string description: Limit results by a certain country using two digit country ID. e.g. 13 - name: country in: query type: string description: Limit results by a certain country using two letter country code. e.g. ?country=US or ?country=US&country=MX - name: city in: query type: string description: Limit results by a certain city or cities. (e.g. ?city=Chicago or ?city=Chicago&city=Boston) - name: location_id in: query type: string - name: location in: query type: string - name: order_by in: query type: string - name: is_mobile in: query type: string description: Location is mobile e.g. ?isMobile=true - name: is_analysis in: query type: string description: Data is the product of a previous analysis/aggregation and not raw measurements e.g. ?isAnalysis=false - name: project in: query type: string - name: entity in: query type: string - name: sensor_type in: query type: string description: Filter by sensor type (i,e. reference grade, low-cost sensor) e.g. ?sensorType=reference%20grade - name: value_from in: query type: string - name: value_to in: query type: string - name: include_fields in: query type: string description: Additional fields to include in response e.g. ?include_fields=sourceName - name: v2-measurements path: /v2/measurements operations: - name: measurementsgetv2measurementsget method: GET description: OpenAQ Get measurements outputRawFormat: json outputParameters: - name: result type: object value: $. inputParameters: - name: format in: query type: string - name: date_from in: query type: string description: From when? - name: date_to in: query type: string description: to when? - name: limit in: query type: string description: Change the number of results returned. e.g. limit=1000 will return up to 1000 results - name: page in: query type: string description: Paginate through results. e.g. page=1 will return first page of results - name: offset in: query type: string - name: sort in: query type: string - name: has_geo in: query type: string - name: parameter_id in: query type: string description: (optional) A parameter ID to filter measurement results. e.g. parameter_id=2 (i.e. PM2.5) will limit measurement results to only PM2.5 measurements - name: parameter in: query type: string description: (optional) A parameter name or ID by which to filter measurement results. e.g. parameter=pm25 or parameter=pm25¶meter=pm10 - name: unit in: query type: string - name: coordinates in: query type: string description: Coordinate pair in form lat,lng. Up to 8 decimal points of precision e.g. 38.907,-77.037 - name: radius in: query type: integer description: Search radius from coordinates as center in meters. Maximum of 25,000 (25km) defaults to 1000 (1km) e.g. radius=10000 - name: country_id in: query type: string description: Limit results by a certain country using two digit country ID. e.g. 13 - name: country in: query type: string description: Limit results by a certain country using two letter country code. e.g. ?country=US or ?country=US&country=MX - name: city in: query type: string description: Limit results by a certain city or cities. (e.g. ?city=Chicago or ?city=Chicago&city=Boston) - name: location_id in: query type: string - name: location in: query type: string - name: order_by in: query type: string - name: is_mobile in: query type: string description: Location is mobile e.g. ?isMobile=true - name: is_analysis in: query type: string description: Data is the product of a previous analysis/aggregation and not raw measurements e.g. ?isAnalysis=false - name: project in: query type: string - name: entity in: query type: string - name: sensor_type in: query type: string description: Filter by sensor type (i,e. reference grade, low-cost sensor) e.g. ?sensorType=reference%20grade - name: value_from in: query type: string - name: value_to in: query type: string - name: include_fields in: query type: string description: Additional fields to include in response e.g. ?include_fields=sourceName - name: v3-sensors-sensors_id-measurements path: /v3/sensors/{sensors_id}/measurements operations: - name: sensormeasurementsgetv3sensorssensorsidmeasurementsget method: GET description: OpenAQ Get measurements by sensor ID outputRawFormat: json outputParameters: - name: result type: object value: $. inputParameters: - name: sensors_id in: path type: integer description: Limit the results to a specific sensors id required: true - name: datetime_to in: query type: string description: To when? - name: datetime_from in: query type: string description: From when? - name: limit in: query type: integer description: Change the number of results returned. - name: page in: query type: integer description: Paginate through results. e.g. page=1 will return first page of results - name: v3-sensors-sensors_id-measurements-daily path: /v3/sensors/{sensors_id}/measurements/daily operations: - name: sensormeasurementsaggregatedgetdailyv3sensorssensorsidmeasurementsdailyget method: GET description: OpenAQ Get measurements aggregated to days by sensor ID outputRawFormat: json outputParameters: - name: result type: object value: $. inputParameters: - name: sensors_id in: path type: integer description: Limit the results to a specific sensors id required: true - name: datetime_to in: query type: string description: To when? - name: datetime_from in: query type: string description: From when? - name: limit in: query type: integer description: Change the number of results returned. - name: page in: query type: integer description: Paginate through results. e.g. page=1 will return first page of results - name: v3-sensors-sensors_id-measurements-hourly path: /v3/sensors/{sensors_id}/measurements/hourly operations: - name: sensormeasurementsaggregatedgethourlyv3sensorssensorsidmeasurementshourlyget method: GET description: OpenAQ Get measurements aggregated to hours by sensor ID outputRawFormat: json outputParameters: - name: result type: object value: $. inputParameters: - name: sensors_id in: path type: integer description: Limit the results to a specific sensors id required: true - name: datetime_to in: query type: string description: To when? - name: datetime_from in: query type: string description: From when? - name: limit in: query type: integer description: Change the number of results returned. - name: page in: query type: integer description: Paginate through results. e.g. page=1 will return first page of results authentication: type: apikey key: X-API-Key value: '{{env.OPENAQ_API_KEY}}' placement: header exposes: - type: rest namespace: openaq-measurements-rest port: 8080 description: REST adapter for OpenAQ — Measurements. One Spectral-compliant resource per consumed operation, prefixed with /v1. resources: - path: /v1/v1/measurements name: v1-measurements description: REST surface for v1-measurements. operations: - method: GET name: measurementsgetv1v1measurementsget description: OpenAQ Get a list of measurements call: openaq-measurements.measurementsgetv1v1measurementsget with: format: rest.format date_from: rest.date_from date_to: rest.date_to limit: rest.limit page: rest.page offset: rest.offset sort: rest.sort has_geo: rest.has_geo parameter_id: rest.parameter_id parameter: rest.parameter unit: rest.unit coordinates: rest.coordinates radius: rest.radius country_id: rest.country_id country: rest.country city: rest.city location_id: rest.location_id location: rest.location order_by: rest.order_by is_mobile: rest.is_mobile is_analysis: rest.is_analysis project: rest.project entity: rest.entity sensor_type: rest.sensor_type value_from: rest.value_from value_to: rest.value_to include_fields: rest.include_fields outputParameters: - type: object mapping: $. - path: /v1/v2/measurements name: v2-measurements description: REST surface for v2-measurements. operations: - method: GET name: measurementsgetv2measurementsget description: OpenAQ Get measurements call: openaq-measurements.measurementsgetv2measurementsget with: format: rest.format date_from: rest.date_from date_to: rest.date_to limit: rest.limit page: rest.page offset: rest.offset sort: rest.sort has_geo: rest.has_geo parameter_id: rest.parameter_id parameter: rest.parameter unit: rest.unit coordinates: rest.coordinates radius: rest.radius country_id: rest.country_id country: rest.country city: rest.city location_id: rest.location_id location: rest.location order_by: rest.order_by is_mobile: rest.is_mobile is_analysis: rest.is_analysis project: rest.project entity: rest.entity sensor_type: rest.sensor_type value_from: rest.value_from value_to: rest.value_to include_fields: rest.include_fields outputParameters: - type: object mapping: $. - path: /v1/v3/sensors/{sensors-id}/measurements name: v3-sensors-sensors-id-measurements description: REST surface for v3-sensors-sensors_id-measurements. operations: - method: GET name: sensormeasurementsgetv3sensorssensorsidmeasurementsget description: OpenAQ Get measurements by sensor ID call: openaq-measurements.sensormeasurementsgetv3sensorssensorsidmeasurementsget with: sensors_id: rest.sensors_id datetime_to: rest.datetime_to datetime_from: rest.datetime_from limit: rest.limit page: rest.page outputParameters: - type: object mapping: $. - path: /v1/v3/sensors/{sensors-id}/measurements/daily name: v3-sensors-sensors-id-measurements-daily description: REST surface for v3-sensors-sensors_id-measurements-daily. operations: - method: GET name: sensormeasurementsaggregatedgetdailyv3sensorssensorsidmeasurementsdailyget description: OpenAQ Get measurements aggregated to days by sensor ID call: openaq-measurements.sensormeasurementsaggregatedgetdailyv3sensorssensorsidmeasurementsdailyget with: sensors_id: rest.sensors_id datetime_to: rest.datetime_to datetime_from: rest.datetime_from limit: rest.limit page: rest.page outputParameters: - type: object mapping: $. - path: /v1/v3/sensors/{sensors-id}/measurements/hourly name: v3-sensors-sensors-id-measurements-hourly description: REST surface for v3-sensors-sensors_id-measurements-hourly. operations: - method: GET name: sensormeasurementsaggregatedgethourlyv3sensorssensorsidmeasurementshourlyget description: OpenAQ Get measurements aggregated to hours by sensor ID call: openaq-measurements.sensormeasurementsaggregatedgethourlyv3sensorssensorsidmeasurementshourlyget with: sensors_id: rest.sensors_id datetime_to: rest.datetime_to datetime_from: rest.datetime_from limit: rest.limit page: rest.page outputParameters: - type: object mapping: $. - type: mcp namespace: openaq-measurements-mcp port: 9090 transport: http description: MCP adapter for OpenAQ — Measurements. One tool per consumed operation, routed inline through this capability's consumes block. tools: - name: openaq-get-list-measurements description: OpenAQ Get a list of measurements hints: readOnly: true destructive: false idempotent: true call: openaq-measurements.measurementsgetv1v1measurementsget with: format: tools.format date_from: tools.date_from date_to: tools.date_to limit: tools.limit page: tools.page offset: tools.offset sort: tools.sort has_geo: tools.has_geo parameter_id: tools.parameter_id parameter: tools.parameter unit: tools.unit coordinates: tools.coordinates radius: tools.radius country_id: tools.country_id country: tools.country city: tools.city location_id: tools.location_id location: tools.location order_by: tools.order_by is_mobile: tools.is_mobile is_analysis: tools.is_analysis project: tools.project entity: tools.entity sensor_type: tools.sensor_type value_from: tools.value_from value_to: tools.value_to include_fields: tools.include_fields outputParameters: - type: object mapping: $. - name: openaq-get-measurements description: OpenAQ Get measurements hints: readOnly: true destructive: false idempotent: true call: openaq-measurements.measurementsgetv2measurementsget with: format: tools.format date_from: tools.date_from date_to: tools.date_to limit: tools.limit page: tools.page offset: tools.offset sort: tools.sort has_geo: tools.has_geo parameter_id: tools.parameter_id parameter: tools.parameter unit: tools.unit coordinates: tools.coordinates radius: tools.radius country_id: tools.country_id country: tools.country city: tools.city location_id: tools.location_id location: tools.location order_by: tools.order_by is_mobile: tools.is_mobile is_analysis: tools.is_analysis project: tools.project entity: tools.entity sensor_type: tools.sensor_type value_from: tools.value_from value_to: tools.value_to include_fields: tools.include_fields outputParameters: - type: object mapping: $. - name: openaq-get-measurements-sensor-id description: OpenAQ Get measurements by sensor ID hints: readOnly: true destructive: false idempotent: true call: openaq-measurements.sensormeasurementsgetv3sensorssensorsidmeasurementsget with: sensors_id: tools.sensors_id datetime_to: tools.datetime_to datetime_from: tools.datetime_from limit: tools.limit page: tools.page outputParameters: - type: object mapping: $. - name: openaq-get-measurements-aggregated-days description: OpenAQ Get measurements aggregated to days by sensor ID hints: readOnly: true destructive: false idempotent: true call: openaq-measurements.sensormeasurementsaggregatedgetdailyv3sensorssensorsidmeasurementsdailyget with: sensors_id: tools.sensors_id datetime_to: tools.datetime_to datetime_from: tools.datetime_from limit: tools.limit page: tools.page outputParameters: - type: object mapping: $. - name: openaq-get-measurements-aggregated-hours description: OpenAQ Get measurements aggregated to hours by sensor ID hints: readOnly: true destructive: false idempotent: true call: openaq-measurements.sensormeasurementsaggregatedgethourlyv3sensorssensorsidmeasurementshourlyget with: sensors_id: tools.sensors_id datetime_to: tools.datetime_to datetime_from: tools.datetime_from limit: tools.limit page: tools.page outputParameters: - type: object mapping: $.