openapi: 3.1.0 info: title: Itron Starfish Data Platform Device Templates Observations API version: '1.0' summary: Device and observation REST API for the Itron Networked Solutions (Starfish) Data Platform. description: 'Reconstructed OpenAPI specification for the Itron / Itron Networked Solutions (formerly Silver Spring Networks) Starfish Data Platform, based on the public `starfish-js` SDK (https://github.com/silverspringnetworks/starfish-js) and the Silver Spring Networks API Overview (https://developer.ssni.com/api-overview). The Starfish Data Platform exposes three primary resources: - **Devices** — IoT/sensor devices registered against a solution. - **Observations** — Time-series sensor data emitted by those devices. - **Device Templates** — Reusable shapes that describe a device''s sensors. Authentication uses OAuth 2.0 client-credentials (a long-lived `clientId` and `clientSecret`) for backend integrations, or a short-lived bearer token issued by the Tokens API for browser-side use. NOTE: This spec is a best-effort reconstruction for catalog purposes; the authoritative reference remains the gated Itron developer portal. ' contact: name: Itron Developer Program url: https://na.itron.com/developers/ license: name: Proprietary — Itron Partner Program url: https://na.itron.com/developers/itron-developer-program servers: - url: https://api.data.sentience.ssni.com description: Itron Starfish Data Platform (production) security: - bearerAuth: [] tags: - name: Observations description: Time-series sensor observation ingest and query. paths: /api/devices/{deviceId}/observations: parameters: - $ref: '#/components/parameters/DeviceId' - $ref: '#/components/parameters/SolutionHeader' get: tags: - Observations summary: Get Device Observations operationId: getDeviceObservations description: Fetch observations for a specific device. responses: '200': description: Observation list for the device. content: application/json: schema: $ref: '#/components/schemas/DeviceObservationList' post: tags: - Observations summary: Post Device Observation operationId: postDeviceObservation description: Submit sensor data for a specific device. requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/Observation' responses: '201': description: Observation accepted. /api/devices/{deviceId}/observations/query: post: tags: - Observations summary: Query Device Observations operationId: queryDeviceObservations description: Query observations for a specific device with filtering and pagination. parameters: - $ref: '#/components/parameters/DeviceId' - $ref: '#/components/parameters/SolutionHeader' requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/ObservationQuery' responses: '200': description: Matching observations (paginated). content: application/json: schema: $ref: '#/components/schemas/PagedObservationList' /api/observations: get: tags: - Observations summary: Get Latest Observations operationId: getObservations description: Retrieve the latest observations across all devices in the solution. parameters: - $ref: '#/components/parameters/SolutionHeader' responses: '200': description: Latest observations. content: application/json: schema: $ref: '#/components/schemas/PagedObservationList' /api/observations/query: post: tags: - Observations summary: Query Observations operationId: queryObservations description: 'Query observations across all devices. Supported filters: `limit`, `after` (cursor), `from` (ISO-8601 inclusive), `to` (ISO-8601 exclusive), and a single `tags` filter. ' parameters: - $ref: '#/components/parameters/SolutionHeader' requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/ObservationQuery' responses: '200': description: Matching observations (paginated). content: application/json: schema: $ref: '#/components/schemas/PagedObservationList' components: schemas: Observation: type: object required: - timestamp properties: timestamp: type: string format: date-time temperature: type: number accelerometer: type: object properties: x: type: number y: type: number z: type: number tags: type: array items: type: string additionalProperties: true ObservationQuery: type: object properties: limit: type: integer description: Max objects returned. Default 1 MB of payload. after: type: string description: Cursor pagination token from a previous response. from: type: string format: date-time description: ISO-8601 start timestamp (inclusive). to: type: string format: date-time description: ISO-8601 end timestamp (exclusive). tags: type: string description: Single tag filter. PagedObservationList: type: object properties: data: type: array items: $ref: '#/components/schemas/Observation' next_page: type: string description: Cursor token to pass as `after` for the next page. DeviceObservationList: type: object properties: observations: type: array items: $ref: '#/components/schemas/Observation' parameters: DeviceId: name: deviceId in: path required: true schema: type: string description: Unique identifier of the device. SolutionHeader: name: X-Starfish-Solution in: header required: false schema: type: string enum: - sandbox - production default: production description: Selects sandbox or production solution scope, matching the SDK `solution` option. securitySchemes: bearerAuth: type: http scheme: bearer bearerFormat: JWT description: Bearer token issued by the Tokens API (short-lived) or obtained via OAuth client credentials.