Leap Meter Nomination API
Retrieve, suggest and search meter nominations and nomination suggestions used to offer capacity into market programs.
Retrieve, suggest and search meter nominations and nomination suggestions used to offer capacity into market programs.
openapi: 3.1.0
info:
description: API to retrieve and suggest nominations.
title: Meter Nomination API
version: 2.0.0
servers:
- description: Leap staging API
url: https://api.staging.leap.energy
- description: Leap production API
url: https://api.leap.energy
security:
- Bearer: []
tags:
- name: nominations
paths:
/v2/meters/{meter_id}/nominations/suggestions:
get:
description: Get suggested nomination details for a meter for each applicable
program and time period.
operationId: getMeterNominationSuggestions
parameters:
- description: Meter ID
explode: false
in: path
name: meter_id
required: true
schema:
example: 11111111-1111-1111-1111-111111111111
format: uuid
type: string
style: simple
- description: "Start date of the window to look for nomination suggestions,\
\ defaults to beginning of this day. Any suggestion that is ending after\
\ this date is included."
explode: true
in: query
name: start_date
required: false
schema:
description: "Start date of the window to look for nomination suggestions,\
\ defaults to beginning of this day. Any suggestion that is ending after\
\ this date is included."
example: 2025-01-01
format: date
type: string
style: form
- description: "End date of the window to look for nomination suggestions, defaults\
\ to null. Any suggestion that is starting at or before this date is included."
explode: true
in: query
name: end_date
required: false
schema:
description: "Start date of the window to look for nomination suggestions,\
\ defaults to null. Any suggestion that is starting at or before this\
\ date is included."
example: 2025-01-01
format: date
type: string
style: form
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/getMeterNominationSuggestions_200_response"
description: Successful response returning all the affected suggestions.
"400":
content:
application/json:
examples:
Meter id is not a UUID:
value:
title: Meter id is not a UUID
status: 400
details:
meter_id: abcdef
schema:
$ref: "#/components/schemas/getMeterNominationSuggestions_400_response"
description: The request is not valid
"401":
content:
application/json:
examples:
Unauthorized:
value:
title: Unauthorized
status: 401
details: {}
schema:
$ref: "#/components/schemas/getMeterNominationSuggestions_400_response"
description: You are not authorized to perform this operation.
"403":
content:
application/json:
examples:
Forbidden:
value:
title: You do not have the necessary permissions for this operation
status: 403
details: {}
schema:
$ref: "#/components/schemas/getMeterNominationSuggestions_400_response"
description: You do not have the necessary permissions for this operation.
"404":
content:
application/json:
examples:
Meter not found:
value:
title: Meter not found
status: 404
details:
meter_id: f5c5e328-e325-4d6d-b357-5015ed5962a7
schema:
$ref: "#/components/schemas/getMeterNominationSuggestions_400_response"
description: Meter not found
"500":
content:
application/json:
examples:
Internal Error:
value: An error happened whilst processing your request
schema:
type: string
description: Internal server error
summary: Get suggested nominations
tags:
- nominations
post:
description: "Suggest nominations for individual meters. A suggestion is reviewed\
\ by Leap before it becomes an actual nomination. Leap can approve, modify,\
\ or deny each suggestion. Modified suggestions are adjusted by Leap before\
\ becoming a nomination and will often include communication or coordination\
\ with your operations team. Note that when a more recent suggestion completely\
\ eclipses an earlier provided suggestion, the earlier nomination will be\
\ deleted. However, if there are partial overlaps, Leap will not automatically\
\ adjust or deduplicate these. Use the 'Delete suggested nominations' endpoint\
\ to remove no longer needed suggestions."
operationId: postMeterNominationSuggestions
parameters:
- description: Meter ID
explode: false
in: path
name: meter_id
required: true
schema:
description: Meter ID
example: 11111111-1111-1111-1111-111111111111
format: uuid
type: string
style: simple
requestBody:
content:
application/json:
schema:
items:
$ref: "#/components/schemas/postMeterNominationSuggestions_request_inner"
maxItems: 10000
minItems: 1
type: array
default: null
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/getMeterNominationSuggestions_200_response"
description: Successful response returning all the affected suggestions.
"400":
content:
application/json:
examples:
Meter id is not a UUID:
value:
title: Meter id is not a UUID
status: 400
details:
meter_id: abcdef
schema:
$ref: "#/components/schemas/getMeterNominationSuggestions_400_response"
description: The request is not valid
"401":
content:
application/json:
examples:
Unauthorized:
value:
title: Unauthorized
status: 401
details: {}
schema:
$ref: "#/components/schemas/getMeterNominationSuggestions_400_response"
description: You are not authorized to perform this operation.
"403":
content:
application/json:
examples:
Forbidden:
value:
title: You do not have the necessary permissions for this operation
status: 403
details: {}
schema:
$ref: "#/components/schemas/getMeterNominationSuggestions_400_response"
description: You do not have the necessary permissions for this operation.
"404":
content:
application/json:
examples:
Meter not found:
value:
title: Meter not found
status: 404
details:
meter_id: f5c5e328-e325-4d6d-b357-5015ed5962a7
schema:
$ref: "#/components/schemas/getMeterNominationSuggestions_400_response"
description: Meter not found
"500":
content:
application/json:
examples:
Internal Error:
value: An error happened whilst processing your request
schema:
type: string
description: Internal server error
summary: Suggest meter nominations
tags:
- nominations
/v2/meters/{meter_id}/nominations/suggestions/{nomination_suggestion_id}:
delete:
description: "Remove a suggestion that is no longer needed. It is recommended\
\ to clean up and delete no longer needed or relevant suggestions so Leap\
\ is able to more quickly review outstanding suggestions. Note that a suggestion\
\ can only be deleted if it is still in the RECEIVED status. Once it has\
\ been reviewed and processed by Leap, it can no longer be deleted."
operationId: deleteMeterNominationSuggestion
parameters:
- description: Meter ID
explode: false
in: path
name: meter_id
required: true
schema:
description: Meter ID
example: 11111111-1111-1111-1111-111111111111
format: uuid
type: string
style: simple
- description: Nomination Suggestion ID
explode: false
in: path
name: nomination_suggestion_id
required: true
schema:
description: Nomination Suggestion ID
example: 11111111-1111-1111-1111-111111111111
format: uuid
type: string
style: simple
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/getMeterNominationSuggestions_200_response_suggestions_inner"
description: Successful response returning all the affected suggestions.
"400":
content:
application/json:
examples:
Meter id is not a UUID:
value:
title: Meter id is not a UUID
status: 400
details:
meter_id: abcdef
schema:
$ref: "#/components/schemas/getMeterNominationSuggestions_400_response"
description: The request is not valid
"401":
content:
application/json:
examples:
Unauthorized:
value:
title: Unauthorized
status: 401
details: {}
schema:
$ref: "#/components/schemas/getMeterNominationSuggestions_400_response"
description: You are not authorized to perform this operation.
"403":
content:
application/json:
examples:
Forbidden:
value:
title: You do not have the necessary permissions for this operation
status: 403
details: {}
schema:
$ref: "#/components/schemas/getMeterNominationSuggestions_400_response"
description: You do not have the necessary permissions for this operation.
"404":
content:
application/json:
examples:
Meter not found:
value:
title: Meter not found
status: 404
details:
meter_id: f5c5e328-e325-4d6d-b357-5015ed5962a7
schema:
$ref: "#/components/schemas/getMeterNominationSuggestions_400_response"
description: Meter not found
"500":
content:
application/json:
examples:
Internal Error:
value: An error happened whilst processing your request
schema:
type: string
description: Internal server error
summary: Delete suggested nominations
tags:
- nominations
/v2/meters/nominations/suggestions:
post:
description: "Suggest nominations for multiple meters. A suggestion is reviewed\
\ by Leap before it becomes an actual nomination. Leap can approve, modify,\
\ or deny each suggestion. Modified suggestions are adjusted by Leap before\
\ becoming a nomination and will often include communication or coordination\
\ with your operations team. Note that when a more recent suggestion completely\
\ eclipses an earlier provided suggestion, the earlier nomination will be\
\ deleted. However, if there are partial overlaps, Leap will not automatically\
\ adjust or deduplicate these. Use the 'Delete suggested nominations' endpoint\
\ to remove no longer needed suggestions."
operationId: postNominationSuggestions
requestBody:
content:
application/json:
schema:
items:
$ref: "#/components/schemas/postNominationSuggestions_request_inner"
maxItems: 10000
minItems: 1
type: array
default: null
text/csv:
example:
- "meter_id,program_identifier,start_date,end_date,nomination_kw"
- "963e4538-1312-425c-ab0b-f3da6cf75ad5,CCA,2025-09-01,2025-10-01,0.23"
- "362e9ece-62ef-4d32-a70e-6542cf5d30fc,CCA,2025-09-01,,15.0"
schema:
items:
$ref: "#/components/schemas/postNominationSuggestions_request_inner_1"
type: array
default: null
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/getMeterNominationSuggestions_200_response"
description: Successful response returning all the affected suggestions.
"400":
content:
application/json:
examples:
Meter id is not a UUID:
value:
title: Meter id is not a UUID
status: 400
details:
meter_id: abcdef
schema:
$ref: "#/components/schemas/getMeterNominationSuggestions_400_response"
description: The request is not valid
"401":
content:
application/json:
examples:
Unauthorized:
value:
title: Unauthorized
status: 401
details: {}
schema:
$ref: "#/components/schemas/getMeterNominationSuggestions_400_response"
description: You are not authorized to perform this operation.
"403":
content:
application/json:
examples:
Forbidden:
value:
title: You do not have the necessary permissions for this operation
status: 403
details: {}
schema:
$ref: "#/components/schemas/getMeterNominationSuggestions_400_response"
description: You do not have the necessary permissions for this operation.
"404":
content:
application/json:
examples:
Meter not found:
value:
title: Meter not found
status: 404
details:
meter_id: f5c5e328-e325-4d6d-b357-5015ed5962a7
schema:
$ref: "#/components/schemas/getMeterNominationSuggestions_400_response"
description: Meter not found
"500":
content:
application/json:
examples:
Internal Error:
value: An error happened whilst processing your request
schema:
type: string
description: Internal server error
summary: Suggest bulk nominations
tags:
- nominations
/v2/meters/nominations/suggestions/search:
post:
description: Search suggested nominations across all meters and filter based
on the request body parameters. Use the 'Accept' header to specify whether
you'd like JSON or CSV as the response type.
operationId: searchNominationSuggestions
requestBody:
content:
application/json:
schema:
$ref: "#/components/schemas/searchNominationSuggestions_request"
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/searchNominationSuggestions_200_response"
text/csv:
example: |-
nomination_suggestion_id,meter_id,program_identifier,start_date,nomination_kw,status,created_at,created_by,end_date
"482b4565-3638-45ca-8dc7-b1dca45fb215","963e4538-1312-425c-ab0b-f3da6cf75ad5",CCA,2025-09-01,0.23,RECEIVED,"2025-02-13T14:43:16.001691Z",your-email@your-company.com,
"7a5ee9cc-91e9-410b-ac0b-2efc361335af","362e9ece-62ef-4d32-a70e-6542cf5d30fc",CCA,2025-09-01,15.0,MODIFIED,"2025-02-13T14:43:16.001691Z",your-email@your-company.com,2020-10-01
schema:
$ref: "#/components/schemas/getMeterNominationSuggestions_200_response"
description: Successful response returning all the matching suggestions.
"400":
content:
application/json:
examples:
Meter id is not a UUID:
value:
title: Meter id is not a UUID
status: 400
details:
meter_id: abcdef
schema:
$ref: "#/components/schemas/getMeterNominationSuggestions_400_response"
description: The request is not valid
"401":
content:
application/json:
examples:
Unauthorized:
value:
title: Unauthorized
status: 401
details: {}
schema:
$ref: "#/components/schemas/getMeterNominationSuggestions_400_response"
description: You are not authorized to perform this operation.
"403":
content:
application/json:
examples:
Forbidden:
value:
title: You do not have the necessary permissions for this operation
status: 403
details: {}
schema:
$ref: "#/components/schemas/getMeterNominationSuggestions_400_response"
description: You do not have the necessary permissions for this operation.
"404":
content:
application/json:
examples:
Meter not found:
value:
title: Meter not found
status: 404
details:
meter_id: f5c5e328-e325-4d6d-b357-5015ed5962a7
schema:
$ref: "#/components/schemas/getMeterNominationSuggestions_400_response"
description: Meter not found
"500":
content:
application/json:
examples:
Internal Error:
value: An error happened whilst processing your request
schema:
type: string
description: Internal server error
summary: Search suggested nominations
tags:
- nominations
/v2/meters/nominations/search:
post:
description: Search for nominations on all meters. You can filter on meter IDs
and a date range. These are the nominations in kW that will be used for program
enrollment. Use the 'Accept' header to specify whether you'd like JSON or
CSV as the response type.
operationId: searchNominations
requestBody:
content:
application/json:
schema:
$ref: "#/components/schemas/searchNominations_request"
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/searchNominations_200_response"
text/csv:
example: |-
meter_id,program_identifier,start_time,source,nomination_kw,end_time
"963e4538-1312-425c-ab0b-f3da6cf75ad5",CCA,2020-09-01T00:00:00Z,PARTNER,0.23,
"362e9ece-62ef-4d32-a70e-6542cf5d30fc",DRAM,2020-09-01T00:00:00Z,LEAP,15.0,2020-10-01T00:00:00Z
schema:
$ref: "#/components/schemas/searchNominations_200_response_1"
description: Successful response returning all the matching suggestions.
"400":
content:
application/json:
examples:
Meter id is not a UUID:
value:
title: Meter id is not a UUID
status: 400
details:
meter_id: abcdef
schema:
$ref: "#/components/schemas/getMeterNominationSuggestions_400_response"
description: The request is not valid
"401":
content:
application/json:
examples:
Unauthorized:
value:
title: Unauthorized
status: 401
details: {}
schema:
$ref: "#/components/schemas/getMeterNominationSuggestions_400_response"
description: You are not authorized to perform this operation.
"403":
content:
application/json:
examples:
Forbidden:
value:
title: You do not have the necessary permissions for this operation
status: 403
details: {}
schema:
$ref: "#/components/schemas/getMeterNominationSuggestions_400_response"
description: You do not have the necessary permissions for this operation.
"404":
content:
application/json:
examples:
Meter not found:
value:
title: Meter not found
status: 404
details:
meter_id: f5c5e328-e325-4d6d-b357-5015ed5962a7
schema:
$ref: "#/components/schemas/getMeterNominationSuggestions_400_response"
description: Meter not found
"500":
content:
application/json:
examples:
Internal Error:
value: An error happened whilst processing your request
schema:
type: string
description: Internal server error
summary: Search nominations
tags:
- nominations
components:
schemas:
searchNominations_200_response_1:
properties:
nominations:
items:
$ref: "#/components/schemas/searchNominations_200_response_allOf_nominations_inner"
type: array
default: null
required:
- nominations
getMeterNominationSuggestions_400_response:
example:
title: Bad Request
status: 400
details:
error: Meter id is not a UUID
properties:
title:
description: Summary of what went wrong
example: Bad Request
maxLength: 2000
minLength: 1
type: string
status:
description: "An error code indicating what went wrong, usually the same\
\ as the HTTP Status Code"
example: 400
type: integer
details:
description: Extra information about the error.
example:
error: Meter id is not a UUID
type: object
searchNominations_200_response_allOf_nominations_inner:
allOf:
- properties:
meter_id:
description: Meter ID
format: uuid
type: string
required:
- meter_id
- properties:
program_identifier:
description: Identifier of program
enum:
- CAISO-CCA-SC_ONLY
- CCA
- CEC-DSGS-OPTION4
- CEC-DSGS
- CONED-CSRP
- CONED-DLRP
- DRAM
- ELRP
- ENERGY-ONLY
- ERCOT-ERS
- EVERSOURCE-CS
- MA_DOER-CPS
- NATGRID-CS
- NRG-REALTIME
- NRG-RED
- NYISO-SCR
- ONCOR-CLM
- PGE-ART
- PGE-CBP
- PJM-CAPACITY
- PSEGLI-CSRP
- PSEGLI-DLRP
- RIE-CS
- UNITIL-CS
- PSE-RPO
- SRP-RPO
- TVA-RPO
- CAISO-ELRP-A4
- CEC-DSGS-OPTION2
- ENERGYHUB-CS
- CT_GB-ESS
example: CEC-DSGS
type: string
x-enum-varnames:
- CAISO_CCA_SC_ONLY
- CCA
- CEC_DSGS_OPTION4
- CEC_DSGS
- CONED_CSRP
- CONED_DLRP
- DRAM
- ELRP
- ENERGY_ONLY
- ERCOT_ERS
- EVERSOURCE_CS
- MA_DOER_CPS
- NATGRID_CS
- NRG_REALTIME
- NRG_RED
- NYISO_SCR
- ONCOR_CLM
- PGE_ART
- PGE_CBP
- PJM_CAPACITY
- PSEGLI_CSRP
- PSEGLI_DLRP
- RIE_CS
- UNITIL_CS
- PSE_RPO
- SRP_RPO
- TVA_RPO
- CAISO_ELRP_A4
- CEC_DSGS_OPTION2
- ENERGYHUB_CS
- CT_GB_ESS
- description: "Start of the date-time-range of the nomination. The start date-time\
\ is inclusive. If left empty, defaults to returning current and future\
\ nominations."
properties:
start_time:
description: Start of the date-time-range of the nomination. The start
date-time is inclusive.
example: 2025-05-01T08:00:00Z
format: date-time
type: string
- properties:
end_time:
description: |-
End of the date-time-range of the nomination. The end date-time is exclusive. So for a nomination for the month of May, the start date-time would be '2025-05-01T08:00:00Z' and the end date-time would be '2025-06-01T08:00:00Z'.
If the end date-time is left empty, the nomination applies to all future date-times.
example: 2025-06-01T08:00:00Z
format: date-time
type: string
- properties:
source:
description: Source of the nomination; either Leap or a suggestion from
the Partner.
enum:
- LEAP
- PARTNER
type: string
required:
- source
- properties:
nomination_kw:
description: Nominated curtailable load for this meter in kilowatts. Precision
of up to 2 decimal places.
example: 1.23
format: double
maximum: 10000
minimum: 0
type: number
required:
- nomination_kw
- properties:
updated_at:
description: Notes the time of the last update to the item.
example: 2025-06-01T08:00:00Z
format: date-time
type: string
example:
meter_id: 046b6c7f-0b8a-43b9-b35d-6489e6daee91
program_identifier: CEC-DSGS
start_time: 2025-05-01T08:00:00Z
end_time: 2025-06-01T08:00:00Z
source: LEAP
nomination_kw: 1.23
updated_at: 2025-06-01T08:00:00Z
required:
- meter_id
- nomination_kw
- program_identifier
- source
- start_date
- updated_at
searchNominations_200_response:
allOf:
- properties:
next_page_token:
description: "If there are more nominations to fetch, this token will\
\ be populated as `next_page_token` in the response. Use it to fetch\
\ the next page."
type: string
- properties:
nominations:
items:
$ref: "#/components/schemas/searchNominations_200_response_allOf_nominations_inner"
type: array
default: null
required:
- nominations
example:
next_page_token: next_page_token
nominations:
- meter_id: 046b6c7f-0b8a-43b9-b35d-6489e6daee91
program_identifier: CEC-DSGS
start_time: 2025-05-01T08:00:00Z
end_time: 2025-06-01T08:00:00Z
source: LEAP
nomination_kw: 1.23
updated_at: 2025-06-01T08:00:00Z
- meter_id: 046b6c7f-0b8a-43b9-b35d-6489e6daee91
program_identifier: CEC-DSGS
start_time: 2025-05-01T08:00:00Z
end_time: 2025-06-01T08:00:00Z
source: LEAP
nomination_kw: 1.23
updated_at: 2025-06-01T08:00:00Z
postNominationSuggestions_request_inner:
allOf:
- properties:
program_identifier:
description: Identifier of program
enum:
- CAISO-CCA-SC_ONLY
- CCA
- CEC-DSGS-OPTION4
- CEC-DSGS
- CONED-CSRP
- CONED-DLRP
- DRAM
- ELRP
- ENERGY-ONLY
- ERCOT-ERS
- EVERSOURCE-CS
- MA_DOER-CPS
- NATGRID-CS
- NRG-REALTIME
- NRG-RED
- NYISO-SCR
- ONCOR-CLM
- PGE-ART
- PGE-CBP
- PJM-CAPACITY
- PSEGLI-CSRP
- PSEGLI-DLRP
- RIE-CS
- UNITIL-CS
- PSE-RPO
- SRP-RPO
- TVA-RPO
- CAISO-ELRP-A4
- CEC-DSGS-OPTION2
- ENERGYHUB-CS
- CT_GB-ESS
example: CEC-DSGS
type: string
x-enum-varnames:
- CAISO_CCA_SC_ONLY
- CCA
- CEC_DSGS_OPTION4
- CEC_DSGS
- CONED_CSRP
- CONED_DLRP
- DRAM
- ELRP
- ENERGY_ONLY
- ERCOT_ERS
- EVERSOURCE_CS
- MA_DOER_CPS
- NATGRID_CS
- NRG_REALTIME
- NRG_RED
- NYISO_SCR
- ONCOR_CLM
- PGE_ART
- PGE_CBP
- PJM_CAPACITY
- PSEGLI_CSRP
- PSEGLI_DLRP
- RIE_CS
- UNITIL_CS
- PSE_RPO
- SRP_RPO
- TVA_RPO
- CAISO_ELRP_A4
- CEC_DSGS_OPTION2
- ENERGYHUB_CS
- CT_GB_ESS
- properties:
start_date:
description: Start of the date-range of the nomination suggestion.
example: 2025-05-01
format: date
type: string
- properties:
end_date:
description: |-
End of the date-range of the nomination suggestion. Should be greater than the start date.
The end date is exclusive. So to suggest a nomination for the month of May, the start date would be '2025-05-01' and the end date would be '2025-06-01'.
If the end date is left empty, we will assume the intended date-range is open-ended, and the nomination applies to all future dates.
example: 2025-06-01
format: date
type: string
- properties:
nomination_kw:
description: Nominated curtailable load for this meter in kilowatts. Precision
of up to 2 decimal places.
example: 1.23
format: double
maximum: 10000
minimum: 0
type: number
required:
- nomination_kw
- properties:
meter_ids:
description: Meter ID
items:
format: uuid
type: string
maxItems: 1000
minItems: 0
type: array
uniqueItems: true
# --- truncated at 32 KB (53 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/leap/refs/heads/main/openapi/leap-nominations-openapi-original.yml