Hydro Ottawa Green Button Connect My Data (CMD) API

Hydro Ottawa's mandated Green Button Connect My Data surface — the OAuth-authorized, machine-to-machine channel through which a customer can grant a third-party application ongoing access to their smart meter interval consumption and billing data in NAESB REQ.21 ESPI XML. It exists because Ontario Regulation 633/21 (Energy Data) under the Electricity Act, 1998 requires every covered Ontario electricity and gas distributor to implement Green Button CMD and DMD to ESPI v3.3 and certify with the Green Button Alliance. Hydro Ottawa's own Green Button page states the service is free, that the customer selects the data types, duration and frequency and may revoke at any time, that personally identifiable information is transmitted separately from usage data, and that the authorization flow must be initiated from the third-party application, which then redirects the customer into Hydro Ottawa's Green Button authentication. The customer-facing half of that flow is live and was confirmed at HTTP 200 on 2026-07-27 at https://hydroottawa.savagedata.com/Connect/Authorize, served by Savage Data Systems on Microsoft-IIS. No base URL is recorded here because Hydro Ottawa publishes no ESPI base URI, no API reference, no OpenID Connect discovery document and no first-party specification — a developer receives connection details only after completing onboarding. To integrate you must complete Hydro Ottawa's third-party onboarding at https://ottawaonboarding.savagedata.com/ and test and certify your solution with the Green Button Alliance. Conformance could not be independently verified from outside; see review.yml.

OpenAPI Specification

hydro-ottawa-green-button-espi-openapi.yml Raw ↑
openapi: 3.0.0
info:
  title: Green Button API Documentation
  description: Green Button API - ESPI 4.0
  version: 1.0.0
  contact:
    name: Green Button Alliance
    url: https://www.greenbuttonalliance.org
  license:
    name: Apache 2.0
    url: https://www.apache.org/licenses/LICENSE-2.0.html
  x-provenance: 'Harvested verbatim by API Evangelist for the Hydro Ottawa provider profile. This document
    is authored and published by the Green Button Alliance, NOT by Hydro Ottawa. Hydro Ottawa publishes
    no first-party OpenAPI and does not publish its Green Button Connect My Data base URI. Note the version
    gap: this GBA document describes ESPI 4.0 and its servers[] point at the GBA sandbox, whereas Ontario
    O. Reg. 633/21 mandates NAESB REQ.21 ESPI v3.3. Nothing outside this x- block was altered.'
  x-source-url: https://raw.githubusercontent.com/GreenButtonAlliance/OpenAPI-Green-Button-Documentation/main/green-button-openapi.yaml
  x-source-repository: https://github.com/GreenButtonAlliance/OpenAPI-Green-Button-Documentation
  x-harvested:
    date: '2026-07-27'
    httpStatus: 200
    by: API Evangelist
    bytes: 20333
servers:
- url: https://sandbox.greenbuttonalliance.org:8443/DataCustodian
  description: GBA Green Button Sandbox
components:
  schemas:
    ApplicationInformation:
      type: object
      description: Contains information about a Third Party Application requesting access to DataCustodian
        services
      xml:
        name: ApplicationInformation
        namespace: http://naesb.org/espi
      properties:
        dataCustodianId:
          type: string
          description: Identifier for the Data Custodian
        dataCustodianApplicationStatus:
          type: integer
          description: Current status of the application (provided by Data Custodian)
        thirdPartyApplicationDescription:
          type: string
          description: Description of the Third Party Application
        thirdPartyApplicationStatus:
          type: integer
          description: Current status of the Third Party Application
        thirdPartyApplicationType:
          type: integer
          description: Type of application (1=Web, 2=Desktop, 3=Mobile, 4=Device)
        thirdPartyApplicationUse:
          type: integer
          description: Expected use of the application
        client_name:
          type: string
          description: Name of the application (OAuth client_name)
        client_id:
          type: string
          description: Identifier for the Third Party (OAuth client_id)
        client_secret:
          type: string
          description: Secret for the client (OAuth client_secret)
        redirect_uri:
          type: array
          items:
            type: string
          description: OAuth redirect URIs
        scope:
          type: array
          items:
            type: string
          description: OAuth scopes
        grant_types:
          type: array
          items:
            type: string
          description: Supported OAuth grant types
    Authorization:
      type: object
      description: Represents a permission granted by an owner for access to a resource
      xml:
        name: Authorization
        namespace: http://naesb.org/espi
      properties:
        status:
          type: integer
          description: Status of the authorization (0=Revoked, 1=Active, 2=Denied)
        expires_at:
          type: integer
          format: int64
          description: Expiration period for the access token (Unix timestamp)
        grant_type:
          type: string
          description: Type of grant being negotiated
        scope:
          type: string
          description: Negotiated scope of the authorization
        token_type:
          type: string
          description: Type of token (Bearer)
        resourceURI:
          type: string
          format: uri
          description: URI to access the authorized resource
        authorizationURI:
          type: string
          format: uri
          description: URI to update or delete this authorization
        customerResourceURI:
          type: string
          format: uri
          description: URI to access PII data authorized for this customer
    UsagePoint:
      type: object
      description: Logical point on a network at which consumption or production is measured or estimated
      xml:
        name: UsagePoint
        namespace: http://naesb.org/espi
      properties:
        roleFlags:
          type: string
          description: Specifies roles assigned to this usage point
        ServiceCategory:
          type: integer
          description: Category of service (0=electricity, 1=gas, 2=water, etc.)
        status:
          type: integer
          description: Current status (0=off, 1=on)
        isSdp:
          type: boolean
          description: Whether this is a service delivery point
        isVirtual:
          type: boolean
          description: Whether this is a virtual (logical) usage point
        connectionState:
          type: string
          description: Connection state relative to network
    AtomLink:
      type: object
      description: Atom link element (RFC 4287)
      xml:
        name: link
        namespace: http://www.w3.org/2005/Atom
      properties:
        href:
          type: string
          format: uri
          description: Link URI
        rel:
          type: string
          description: Link relationship type (e.g., 'self', 'up')
        type:
          type: string
          description: Media type (e.g., 'application/atom+xml')
    AtomContent:
      type: object
      description: Atom content element containing ESPI resource (RFC 4287)
      xml:
        name: content
        namespace: http://www.w3.org/2005/Atom
      properties:
        type:
          type: string
          description: Content media type (typically 'application/xml')
    AtomEntry:
      type: object
      description: Atom feed entry (RFC 4287) containing ESPI resource
      xml:
        name: entry
        namespace: http://www.w3.org/2005/Atom
      properties:
        id:
          type: string
          format: uri
          description: Unique entry identifier
        title:
          type: string
          description: Entry title
        published:
          type: string
          format: date-time
          description: ISO 8601 publication timestamp
        updated:
          type: string
          format: date-time
          description: ISO 8601 last update timestamp
        link:
          type: array
          items:
            $ref: '#/components/schemas/AtomLink'
          description: Entry links (minimum 2 required per Atom spec)
        content:
          $ref: '#/components/schemas/AtomContent'
    AtomFeed:
      type: object
      description: Atom Feed (RFC 4287) containing ESPI resources
      xml:
        name: feed
        namespace: http://www.w3.org/2005/Atom
      properties:
        id:
          type: string
          format: uri
          description: Feed identifier
        title:
          type: string
          description: Feed title
        updated:
          type: string
          format: date-time
          description: ISO 8601 timestamp of last feed update
        link:
          type: array
          items:
            $ref: '#/components/schemas/AtomLink'
          description: Feed links (minimum 1 required per Atom spec)
        entry:
          type: array
          items:
            $ref: '#/components/schemas/AtomEntry'
          description: Feed entries containing ESPI resources
  securitySchemes:
    oauth2:
      type: oauth2
      flows:
        authorizationCode:
          authorizationUrl: https://sandbox.greenbuttonalliance.org:8443/oauth/authorize
          tokenUrl: https://sandbox.greenbuttonalliance.org:8443/oauth/token
          scopes: {}
        clientCredentials:
          tokenUrl: https://sandbox.greenbuttonalliance.org:8443/oauth/token
          scopes: {}
security:
- oauth2: []
tags:
- name: ApplicationInformation
  description: Application Information endpoints
- name: Authorization
  description: Authorization endpoints
- name: Batch
  description: Batch data transfer endpoints
- name: UsagePoint
  description: Usage Point endpoints
paths:
  /espi/1_1/resource/ApplicationInformation:
    get:
      tags:
      - ApplicationInformation
      summary: Retrieve all Application Information [FB_33]
      operationId: findApplicationInformations
      parameters:
      - name: published-max
        in: query
        description: Maximum publication date (RFC 3339 instant)
        schema:
          type: string
          format: date
      - name: published-min
        in: query
        description: Minimum publication date (RFC 3339 instant)
        schema:
          type: string
          format: date
      - name: updated-max
        in: query
        description: Maximum update date (RFC 3339 instant)
        schema:
          type: string
          format: date
      - name: updated-min
        in: query
        description: Minimum update date (RFC 3339 instant)
        schema:
          type: string
          format: date
      - name: max-results
        in: query
        description: Maximum number of results to return
        schema:
          type: integer
          format: int64
      - name: start-index
        in: query
        description: Index of first result (1-indexed)
        schema:
          type: integer
          format: int64
      - name: depth
        in: query
        description: Response depth control
        schema:
          type: integer
          format: int64
      responses:
        '200':
          description: OK
          content:
            application/atom+xml:
              schema:
                $ref: '#/components/schemas/AtomFeed'
        '202':
          description: Accepted
          content:
            application/atom+xml:
              schema:
                $ref: '#/components/schemas/AtomFeed'
        '400':
          description: Bad Request
        '403':
          description: Forbidden
  /espi/1_1/resource/ApplicationInformation/{applicationInformationId}:
    get:
      tags:
      - ApplicationInformation
      summary: Retrieve Application Information by Id [FB_3]
      operationId: getApplicationInformation
      parameters:
      - name: applicationInformationId
        in: path
        required: true
        description: Unique identifier for the ApplicationInformation resource
        schema:
          type: string
      responses:
        '200':
          description: OK
          content:
            application/atom+xml:
              schema:
                $ref: '#/components/schemas/ApplicationInformation'
        '202':
          description: Accepted
          content:
            application/atom+xml:
              schema:
                $ref: '#/components/schemas/ApplicationInformation'
        '400':
          description: Bad Request
        '403':
          description: Forbidden
  /espi/1_1/resource/Authorization:
    get:
      tags:
      - Authorization
      summary: Find all Authorizations [FB_3]
      operationId: findAuthorizations
      parameters:
      - name: published-max
        in: query
        description: Maximum publication date (RFC 3339 instant)
        schema:
          type: string
          format: date
      - name: published-min
        in: query
        description: Minimum publication date (RFC 3339 instant)
        schema:
          type: string
          format: date
      - name: updated-max
        in: query
        description: Maximum update date (RFC 3339 instant)
        schema:
          type: string
          format: date
      - name: updated-min
        in: query
        description: Minimum update date (RFC 3339 instant)
        schema:
          type: string
          format: date
      - name: max-results
        in: query
        description: Maximum number of results to return
        schema:
          type: integer
          format: int64
      - name: start-index
        in: query
        description: Index of first result (1-indexed)
        schema:
          type: integer
          format: int64
      - name: depth
        in: query
        description: Response depth control
        schema:
          type: integer
          format: int64
      responses:
        '200':
          description: OK
          content:
            application/atom+xml:
              schema:
                $ref: '#/components/schemas/AtomFeed'
        '202':
          description: Accepted
          content:
            application/atom+xml:
              schema:
                $ref: '#/components/schemas/AtomFeed'
        '400':
          description: Bad Request
        '403':
          description: Forbidden
  /espi/1_1/resource/Authorization/{authorizationId}:
    get:
      tags:
      - Authorization
      summary: Retrieve Authorization by Id [FB_3]
      operationId: getAuthorization
      parameters:
      - name: authorizationId
        in: path
        required: true
        description: Unique identifier for the Authorization resource
        schema:
          type: string
      - name: published-max
        in: query
        description: Maximum publication date (RFC 3339 instant)
        schema:
          type: string
          format: date
      - name: published-min
        in: query
        description: Minimum publication date (RFC 3339 instant)
        schema:
          type: string
          format: date
      - name: updated-max
        in: query
        description: Maximum update date (RFC 3339 instant)
        schema:
          type: string
          format: date
      - name: updated-min
        in: query
        description: Minimum update date (RFC 3339 instant)
        schema:
          type: string
          format: date
      - name: max-results
        in: query
        description: Maximum number of results to return
        schema:
          type: integer
          format: int64
      - name: start-index
        in: query
        description: Index of first result (1-indexed)
        schema:
          type: integer
          format: int64
      - name: depth
        in: query
        description: Response depth control
        schema:
          type: integer
          format: int64
      responses:
        '200':
          description: OK
          content:
            application/atom+xml:
              schema:
                $ref: '#/components/schemas/Authorization'
        '202':
          description: Accepted
          content:
            application/atom+xml:
              schema:
                $ref: '#/components/schemas/Authorization'
        '400':
          description: Bad Request
        '403':
          description: Forbidden
  /espi/1_1/resource/Batch/Bulk/{bulkId}:
    get:
      tags:
      - Batch
      summary: Request Bulk transfer [FB_35]
      operationId: downloadBulkData
      parameters:
      - name: bulkId
        in: path
        required: true
        description: Unique identifier for the Bulk transfer
        schema:
          type: string
      - name: published-max
        in: query
        description: Maximum publication date (RFC 3339 instant)
        schema:
          type: string
          format: date
      - name: published-min
        in: query
        description: Minimum publication date (RFC 3339 instant)
        schema:
          type: string
          format: date
      - name: updated-max
        in: query
        description: Maximum update date (RFC 3339 instant)
        schema:
          type: string
          format: date
      - name: updated-min
        in: query
        description: Minimum update date (RFC 3339 instant)
        schema:
          type: string
          format: date
      - name: max-results
        in: query
        description: Maximum number of results to return
        schema:
          type: integer
          format: int64
      - name: start-index
        in: query
        description: Index of first result (1-indexed)
        schema:
          type: integer
          format: int64
      - name: depth
        in: query
        description: Response depth control
        schema:
          type: integer
          format: int64
      responses:
        '200':
          description: OK
          content:
            application/atom+xml:
              schema:
                $ref: '#/components/schemas/AtomFeed'
        '202':
          description: Accepted
          content:
            application/atom+xml:
              schema:
                $ref: '#/components/schemas/AtomFeed'
        '400':
          description: Bad Request
        '403':
          description: Forbidden
  /espi/1_1/resource/UsagePoint:
    get:
      tags:
      - UsagePoint
      summary: Retrieve all Usage Points [FB_33]
      operationId: findUsagePoints
      parameters:
      - name: published-max
        in: query
        description: Maximum publication date (RFC 3339 instant)
        schema:
          type: string
          format: date
      - name: published-min
        in: query
        description: Minimum publication date (RFC 3339 instant)
        schema:
          type: string
          format: date
      - name: updated-max
        in: query
        description: Maximum update date (RFC 3339 instant)
        schema:
          type: string
          format: date
      - name: updated-min
        in: query
        description: Minimum update date (RFC 3339 instant)
        schema:
          type: string
          format: date
      - name: max-results
        in: query
        description: Maximum number of results to return
        schema:
          type: integer
          format: int64
      - name: start-index
        in: query
        description: Index of first result (1-indexed)
        schema:
          type: integer
          format: int64
      - name: depth
        in: query
        description: Response depth control
        schema:
          type: integer
          format: int64
      responses:
        '200':
          description: OK
          content:
            application/atom+xml:
              schema:
                $ref: '#/components/schemas/AtomFeed'
        '202':
          description: Accepted
          content:
            application/atom+xml:
              schema:
                $ref: '#/components/schemas/AtomFeed'
        '400':
          description: Bad Request
        '403':
          description: Forbidden
  /espi/1_1/resource/UsagePoint/{usagePointId}:
    get:
      tags:
      - UsagePoint
      summary: Retrieve Usage Point by Id [FB_32]
      operationId: getUsagePoint
      parameters:
      - name: usagePointId
        in: path
        required: true
        description: Unique identifier for the UsagePoint resource
        schema:
          type: string
      - name: published-max
        in: query
        description: Maximum publication date (RFC 3339 instant)
        schema:
          type: string
          format: date
      - name: published-min
        in: query
        description: Minimum publication date (RFC 3339 instant)
        schema:
          type: string
          format: date
      - name: updated-max
        in: query
        description: Maximum update date (RFC 3339 instant)
        schema:
          type: string
          format: date
      - name: updated-min
        in: query
        description: Minimum update date (RFC 3339 instant)
        schema:
          type: string
          format: date
      - name: max-results
        in: query
        description: Maximum number of results to return
        schema:
          type: integer
          format: int64
      - name: start-index
        in: query
        description: Index of first result (1-indexed)
        schema:
          type: integer
          format: int64
      - name: depth
        in: query
        description: Response depth control
        schema:
          type: integer
          format: int64
      responses:
        '200':
          description: OK
          content:
            application/atom+xml:
              schema:
                $ref: '#/components/schemas/UsagePoint'
        '202':
          description: Accepted
          content:
            application/atom+xml:
              schema:
                $ref: '#/components/schemas/UsagePoint'
        '400':
          description: Bad Request
        '403':
          description: Forbidden