Skip to main content

Data Schema Reference

Demand Response

Version 1.1


Overview

This document provides the structure and attributes of the Recurve intake data schema to enable FLEX Programs’ Demand Response measurement and forecasting features. The schema outlines a consistent structure for representing enrollments, events, participations, interval usage, and service point metadata across utilities, aggregators, DERMS providers, and device vendors.

The intent of this schema is to ensure that all inputs required for baseline construction, event-impact calculation, comparison-group analysis, and forward-looking capacity forecasting are clearly defined. The schema versioned in this document applies specifically to Demand Response measurement and forecasting use cases and may evolve over time as new capabilities, technologies, and regulatory requirements are supported.

Validation

The FLEX platform will use the supplied JSONSchema (or equivalent OpenAPI) schemas to validate the structure of incoming data. If you choose to, you can use these same schemas to verify the data for testing or validation on your own systems. Exactly how to utilize these schemas will vary depending on the languages and frameworks that provide the source data. Recurve can provide example code, upon request, for validating JSON input against the provided schemas in various programming languages.

Entities

This section describes the core data entities that make up the Demand Response intake schema and how they relate to one another. Each entity represents a distinct concept required to model program structure, participant enrollment, event dispatch, and measured performance. These entities define the minimum set of inputs needed to link service points to programs and events, associate technologies and providers with dispatches, and supply the interval data used for measurement and forecasting. Detailed schema definitions and example files are provided for each entity to support consistent implementation and validation.

Download JSON Schema documents & examples:

https://docs.recurve.com/schemas/dr-data-schema-examples.zip

enrollments

Defines which service points are enrolled in which programs, when they became active, and through which delivery channel or aggregator. Links service points to the specific technologies and dispatches used to inform measurements and forecasts.

FieldTypeRequiredDescriptionConstraints
enrollment_idstringYesA unique identifier for program enrollment
program_idstringYesUnique identifier for the program into which the service point was
service_point_idstringYesReference to the service point attached to the enrollment
provider_idstringNoThe provider (DERMs, OEM, Aggregator) responsible for dispatching the participant. (If multiple providers dispatch a participant, separate participations should be created for each.)
networkstringNoNetwork / call group / dispatch group associated with the enrollment
start_datestringYesThe date the enrollment startedISO format date string
end_datestring | nullNoWhen this enrollment ended. End dates that are missing or in the future are assumed to indicate active enrollments.ISO format date string
technologiesarrayNoList of technologies associated with the enrollment

enrollments.technologies

FieldTypeRequiredDescriptionConstraints
namestringYesThe name of the technology, like 'Smart Thermostat.'
detailsobjectNoAdditional details about devices

enrollments.technologies.details

FieldTypeRequiredDescriptionConstraints
device_typestringNoAn indicator for the specific type of device, like the manufacturer or control type
device_countnumberNoThe number of devices of the given type enrolled

Example

{
"items": [
{
"metadata": {
"last_updated": "2025-01-08"
},
"value": {
"enrollment_id": "ENR-01",
"program_id": "PROG-01",
"end_date": null,
"provider_id": "PROVIDER-1",
"network": "Dispatch-Zone-A123",
"service_point_id": "SP123",
"start_date": "2025-01-08T16:48:00Z",
"technologies": [
{
"name": "Smart Thermostat",
"details": {
"device_type": "Ecobee",
"device_count": 1
}
}
]
}
}
]
}

events

Defines the timing, scope, and structure of each demand response event, forming the foundation for performance measurement.

FieldTypeRequiredDescriptionConstraints
event_idstringYesA unique identifier for the event
program_idstringYesReference to the demand response program
start_timestringYesStart time of the event with timezoneformat: date-time
end_timestringYesEnd time of the event with timezoneformat: date-time
is_test_eventbooleanNoIndicates whether the event represented a test

Example

{
"items": [
{
"metadata": {
"last_updated": "2026-01-01T00:00:00Z"
},
"value": {
"event_id": "EVENT-123",
"program_id": "PROG-1",
"start_time": "2025-01-01T00:00:00Z",
"end_time": "2025-01-01T03:00:00Z",
"is_test_event": false
}
}
]
}

interval_data

Hourly or 15-minute AMI data for all participating service points. This data provides the observed load used to calculate event impacts and serves as the basis for performance measurement.

FieldTypeRequiredDescriptionConstraints
service_point_idstringYesThe service point ID to which this interval data belongs
meter_device_idstringNoThe meter device ID that generated this interval data, if available
start_timestringYesStart datetime in ISO 8601 formatformat: date-time
end_timestringYesEnd datetime in ISO 8601 formatformat: date-time
valuenumberYesThe interval data valueformat: float
directionstringNoDirection of energy flow: 'delivered' or 'received'. Assumed to be received if not specifiedenum: "delivered", "received"

Example

{
"items": [
{
"metadata": {
"last_updated": "2026-01-01T00:00:00Z"
},
"value": {
"service_point_id": "SP-12345",
"meter_device_id": "meter-xyz",
"start_time": "2026-01-01T00:00:00Z",
"end_time": "2026-01-01T01:00:00Z",
"value": 5.67,
"direction": "received"
}
},
{
"metadata": {
"last_updated": "2026-01-01T00:00:00Z"
},
"value": {
"service_point_id": "SP-12346",
"meter_device_id": "meter-xyz",
"start_time": "2026-01-01T00:00:00Z",
"end_time": "2026-01-01T01:00:00Z",
"value": 4.32,
"direction": "delivered"
}
}
]
}

participations

Defines which service points are dispatched for a given event, including which specific networks, technologies, and providers associated with the service point.

FieldTypeRequiredDescriptionConstraints
event_idstringYesReference to the event
service\point_idstringYesReference to the service point
provider_idstringNoThe provider (DERMs, OEM, Aggregator) responsible for dispatching the participant. (If multiple providers dispatch a participant, separate participations should be created for each.)
opted_outbooleanNoIndicates whether the participant took an action to opt out of this event.
technologiesarrayNoList of technologies associated with the participation
networkstringNoNetwork / call group / dispatch group associated with dispatching the participant

participations.technologies

FieldTypeRequiredDescriptionConstraints
namestringYesThe name of the technology, like 'Smart Thermostat'
detailsobjectNoAdditional details about devices

participations.technologies.details

FieldTypeRequiredDescriptionConstraints
device_typestringNoAn indicator for the specific type of device, like the manufacturer, or control type
device_countnumberNoThe number of devices of the given type enrolled.

Example

{
"items": [
{
"metadata": {
"last_updated": "2026-01-01T00:00:00Z"
},
"value": {
"event_id": "EVENT-123",
"service_point_id": "SP-4321",
"technologies": [
{
"name": "Smart Thermostat",
"details": {
"device_type": "Ecobee",
"device_count": 1
}
}
],
"provider_id": "Acme-DERMS",
"network": "CG-1",
"opted_out": false
}
}
]
}

service_points

Customer metadata in reference to the service points that are either enrolled in measured programs or are supplied as non-participant data to support comparison groups.

FieldTypeRequiredDescriptionConstraints
service_point_idstringYesA unique and stable identifier for the service point provided by the API user. Should not be a meter device ID, as these may change.
service_point_typestringYesThe type of the service point, either Gas or Electricenum: “electricity”, “gas”
substationstringNoSubstation identifier
feeder_linestringNoFeeder line identifier
timezonestringNoIANA timezone string (e.g., America/Los_Angeles)
premise_idstringNoA unique identifier for the premise, if available
street_1stringYes
street_2stringNo
city_townstringYes
state_province_regionstringYes
zip_code_postal_codestringYes
countystringNo
countrystringNo
naics_codestringNoThe 6-digit North American Industry Classification System (NAICS)
sectorstringNoThe sector classification of the premise.enum: "residential", "commercial", "Industrial", "agriculture", "other"
intervalobjectNoThe interval at which this meter device records data, if availableenum: "15min", "hourly", "daily"
can_exportbooleanNoThis service point can export to the grid. This is relevant if solar is installed.
export_start_datestringNoWhen did this service point become capable of exporting energy?format: timestamp
rate_codestringNoThe tariff rate code under which this service point operates
agreement_idstringNoA unique identifier for the agreement
account_idstringNoA unique identifier for the account
start_datestringNoStart date of the service point's contract agreementISO format date
end_datestringnullNoEnd date of the service point's contract agreement

Example

{
"items": [
{
"metadata": {
"last_updated": "2026-01-12T10:00:00Z"
},
"value": {
"start_date": "2024-01-01",
"end_date": "2026-01-01",
"service_point_id": "SP123",
"service_point_type": "electricity",
"account_id": "ACCOUNT123",
"timezone": "America/Los_Angeles",
"premise_id": "9999999999",
"street_1": "123 Example St.",
"street_2": "Unit 1",
"city_town": "San Francisco",
"state_province_region": "CA",
"zip_code_postal_code": "94105",
"county": "San Francisco",
"country": "USA",
"sector": "residential",
"interval": "hourly",
"substation": "SUB-0457",
"feeder_line": "FD-12A",
"naics_code": "221122",
"can_export": true,
"export_start_date": "2023-06-15T00:00:00Z",
"rate_code": "E-TOU-RES",
"agreement_id": "AGR-789456"
}
}
]
}

Change Log

VersionDateChange
1.12025-11-16Added device_count to technology details to support explicit device-level participation tracking. Clarified enrollment and participation relationships for multi-provider dispatch. Refined interval data direction semantics. Minor description and validation clarifications.