openapi: 3.1.1 info: title: EnergyEnrollment version: '2.0' description: '⚠️ DEPRECATED — Use EnergyProgramEnrollment/v2.0 instead. This schema is preserved for backward compatibility. See deg:EnergyEnrollment owl:equivalentClass deg:EnergyProgramEnrollment in vocab.jsonld. Attribute schema for program enrollment (Fulfillment.fulfillmentAttributes and Contract.orderAttributes). These attributes support the onboarding flow where BPP verifies credentials, checks for conflicts, and issues enrollment credentials. Used in init requests (fulfillmentAttributes) and init/confirm responses (Contract.orderAttributes).' components: schemas: EnergyEnrollment: type: object additionalProperties: true x-tags: - energy-enrollment - demand-response - vpp - fulfillment x-jsonld: '@context': ./context.jsonld '@type': EnergyEnrollment properties: userAuth: description: "User authentication for enrollment verification. Supports OTP-based or OAuth2/OIDC\ \ token-based authentication.\nFor REQUESTS (init, confirm):\n Use UserAuthRequest (OtpAuthRequest\ \ or OAuth2AuthRequest)\n - OTP: Send mobile (init) or mobile+nguid+otp (confirm)\n - OAuth2/OIDC:\ \ Send accessToken (and idToken for OIDC)\n\nFor RESPONSES (on_init, on_confirm):\n Use UserAuthResponse\ \ (OtpAuthResponse or OAuth2AuthResponse)\n - Returns verification status, extracted identity,\ \ and session tokens\n" oneOf: - $ref: '#/$defs/UserAuthRequest' - $ref: '#/$defs/UserAuthResponse' x-jsonld: '@id': userAuth meters: type: array description: 'Array of meter identifiers to enroll in the program. Required in confirm request - order will only be confirmed if at least one meter is specified. Each meter should include the meter ID (UMID) and optionally utility information. If userAuth is verified but meters array is empty, on_confirm returns error "no meter specified". ' items: $ref: '#/$defs/MeterEnrollment' x-jsonld: '@id': meters '@container': '@set' credentials: type: array description: 'Array of W3C Verifiable Credentials (https://www.w3.org/TR/vc-data-model-2.0/) provided by calling entity (Portal/BAP). Includes meter ownership, program eligibility, and DER certification credentials. ' items: $ref: '#/$defs/VerifiableCredential' x-jsonld: '@id': credentials existingEnrollments: type: array description: 'Array of existing W3C Verifiable Credentials for conflict checking. Provided by calling entity to help BPP identify conflicts. ' items: $ref: '#/$defs/VerifiableCredential' x-jsonld: '@id': existingEnrollments credentialVerification: type: object description: 'Results of credential verification performed by BPP. Returned in on_init response after BPP verifies provided credentials. ' x-jsonld: '@id': credentialVerification '@type': CredentialVerification properties: status: type: string enum: - VERIFIED - FAILED - PARTIAL description: Overall verification status. VERIFIED if all credentials verified, FAILED if any failed, PARTIAL if some verified. example: VERIFIED x-jsonld: '@id': status verifiedCredentials: type: array description: Array of credentials that were successfully verified. items: $ref: '#/$defs/VerifiedCredential' x-jsonld: '@id': verifiedCredentials conflictCheck: type: object description: 'Results of conflict checking with existing enrollments. Returned in on_init response after BPP checks for conflicts. ' x-jsonld: '@id': conflictCheck '@type': ConflictCheck properties: hasConflict: type: boolean description: 'Boolean indicating if a conflict exists. True if meter/DER is already enrolled in another program with overlapping dates, false otherwise. ' example: false x-jsonld: '@id': hasConflict conflictingEnrollments: type: array description: 'Array of conflicting enrollments. Only present when hasConflict is true. Empty array if no conflicts found. ' items: $ref: '#/$defs/ConflictingEnrollment' x-jsonld: '@id': conflictingEnrollments checkedAt: type: string format: date-time description: Timestamp when conflict check was performed (ISO 8601 UTC). example: '2024-10-15T10:30:05Z' x-jsonld: '@id': checkedAt message: type: string description: Human-readable message explaining conflict check results. example: No conflicts found with existing enrollments x-jsonld: '@id': message requiredCredentials: type: array description: 'Array of credential types that are required for enrollment. Returned in on_init response to inform BAP what credentials are needed. Each entry includes type, description, and status (PROVIDED, MISSING). ' items: type: object additionalProperties: true description: Required credential object with type, description, and status x-jsonld: '@id': requiredCredentials requiredConsents: type: array description: 'Array of consent types that are required for enrollment. Returned in on_init response to inform BAP what consents are needed. Each entry includes type, description, and whether it''s required or optional. ' items: type: object additionalProperties: true description: Required consent object with type, description, and required flag x-jsonld: '@id': requiredConsents startDate: type: string format: date-time description: 'Date and time when enrollment becomes active (ISO 8601 UTC). Specified by calling entity in confirm request, returned in on_confirm response. ' example: '2024-11-01T00:00:00Z' x-jsonld: '@id': startDate endDate: type: string format: date-time description: 'Date and time when enrollment expires or ends (ISO 8601 UTC). Specified by calling entity in confirm request, returned in on_confirm response. ' example: '2025-10-31T23:59:59Z' x-jsonld: '@id': endDate consents: type: array description: 'Array of consent objects provided by the buyer in confirm request. Each consent indicates the type of consent and whether it was granted. ' items: type: object additionalProperties: true description: Consent object with type, granted status, grantedAt timestamp, and description x-jsonld: '@id': consents updateType: type: string enum: - CONSENT_REVOCATION - UNENROLLMENT description: 'Type of update being performed. CONSENT_REVOCATION for revoking consent, UNENROLLMENT for cancelling entire enrollment. ' example: CONSENT_REVOCATION x-jsonld: '@id': updateType consentRevocation: type: object description: 'Consent revocation details. Used in update request to revoke a consent credential, and in on_update response to confirm revocation with status list information. ' x-jsonld: '@id': consentRevocation '@type': ConsentRevocation properties: consentCredentialId: type: string format: uri description: 'Identifier of the consent credential being revoked. References the Verifiable Credential ID. ' example: https://vpp-program-owner.example.com/credentials/vc:consent:consumer-001 x-jsonld: '@id': consentCredentialId consentType: type: string enum: - DATA_COLLECTION - DER_CONTROL - CROSS_UTILITY_SHARING description: 'Type of consent being revoked. DATA_COLLECTION for data sharing consent, DER_CONTROL for device control consent, CROSS_UTILITY_SHARING for cross-utility data sharing. ' example: DATA_COLLECTION x-jsonld: '@id': consentType reason: type: string description: 'Reason for revocation. Values: USER_REQUESTED, PROGRAM_TERMINATED, COMPLIANCE_REQUIREMENT, etc. ' example: USER_REQUESTED x-jsonld: '@id': reason revokedAt: type: string format: date-time description: 'Timestamp when the consent was revoked (ISO 8601 UTC). In request, this is when user initiated revocation. In response, this is when BPP processed it. ' example: '2024-11-20T14:30:00Z' x-jsonld: '@id': revokedAt effectiveDate: type: string format: date-time description: 'Date and time when the revocation becomes effective (ISO 8601 UTC). May be in the future for scheduled revocations. ' example: '2024-11-20T14:30:00Z' x-jsonld: '@id': effectiveDate status: type: string enum: - REVOKED - PENDING description: 'Revocation status. REVOKED when processed, PENDING when scheduled for future. Only present in on_update response. ' example: REVOKED x-jsonld: '@id': status statusListUrl: type: string format: uri description: 'URL of the W3C VC status list where the revoked credential is recorded. Only present in on_update response after revocation is processed. ' example: https://vpp-program-owner.example.com/status/consent-list x-jsonld: '@id': statusListUrl statusListIndex: type: string description: 'Index in the status list where this credential''s revocation status is recorded. Only present in on_update response. ' example: '94567' x-jsonld: '@id': statusListIndex message: type: string description: 'Human-readable message about the revocation status. Only present in on_update response. ' example: Consent has been revoked and added to revocation status list. x-jsonld: '@id': message unenrollment: type: object description: 'Unenrollment details. Used in update request to cancel enrollment, and in on_update response to confirm cancellation with status list information. ' x-jsonld: '@id': unenrollment '@type': Unenrollment properties: enrollmentId: type: string description: 'Identifier of the enrollment being cancelled. ' example: enrollment-consumer-001 x-jsonld: '@id': enrollmentId reason: type: string description: 'Reason for unenrollment. Values: USER_REQUESTED, PROGRAM_TERMINATED, COMPLIANCE_REQUIREMENT, etc. ' example: USER_REQUESTED x-jsonld: '@id': reason effectiveDate: type: string format: date-time description: 'Date and time when the unenrollment becomes effective (ISO 8601 UTC). May be in the future for scheduled unenrollment. ' example: '2024-11-20T15:00:00Z' x-jsonld: '@id': effectiveDate revokeAllConsents: type: boolean description: 'Boolean indicating whether all associated consents should be revoked during unenrollment. If true, all consent credentials associated with this enrollment will be revoked. ' example: true x-jsonld: '@id': revokeAllConsents status: type: string enum: - CANCELLED - PENDING description: 'Unenrollment status. CANCELLED when processed, PENDING when scheduled for future. Only present in on_update response. ' example: CANCELLED x-jsonld: '@id': status cancelledAt: type: string format: date-time description: 'Timestamp when the enrollment was cancelled (ISO 8601 UTC). Only present in on_update response. ' example: '2024-11-20T15:00:05Z' x-jsonld: '@id': cancelledAt enrollmentCredentialStatus: type: object description: 'Status information for the enrollment credential after revocation. Contains status list details for verification. Only present in on_update response. ' x-jsonld: '@id': enrollmentCredentialStatus additionalProperties: false properties: statusListUrl: type: string format: uri description: URL of the status list for the enrollment credential. example: https://vpp-program-owner.example.com/status/enrollment-list x-jsonld: '@id': statusListUrl statusListIndex: type: string description: Index in the status list for the enrollment credential. example: '12345' x-jsonld: '@id': statusListIndex revoked: type: boolean description: Whether the enrollment credential has been revoked. example: true x-jsonld: '@id': revoked consentsRevoked: type: array description: 'Array of consent credentials that were revoked as part of unenrollment. Only present in on_update response when revokeAllConsents was true. ' items: type: object additionalProperties: false properties: consentCredentialId: type: string format: uri description: Identifier of the revoked consent credential. example: https://vpp-program-owner.example.com/credentials/vc:consent:consumer-001 x-jsonld: '@id': consentCredentialId statusListUrl: type: string format: uri description: URL of the status list for this consent credential. example: https://vpp-program-owner.example.com/status/consent-list x-jsonld: '@id': statusListUrl statusListIndex: type: string description: Index in the status list for this consent credential. example: '94567' x-jsonld: '@id': statusListIndex revoked: type: boolean description: Whether this consent credential has been revoked. example: true x-jsonld: '@id': revoked x-jsonld: '@id': consentsRevoked message: type: string description: 'Human-readable message about the unenrollment status. Only present in on_update response. ' example: Enrollment and all associated consents have been revoked. x-jsonld: '@id': message enrollmentId: type: string description: 'Unique identifier for the enrollment. Assigned by BPP upon enrollment confirmation. Used for tracking, audit, and enrollment management. ' example: enrollment-consumer-001 x-jsonld: '@id': enrollmentId programId: type: string description: 'Identifier of the digital energy program. Matches the program ID from the init request. ' example: program-flex-demand-response-001 x-jsonld: '@id': programId status: type: string enum: - ACTIVE - PENDING - CANCELLED - SUSPENDED description: 'Enrollment status. ACTIVE when enrollment is active, PENDING when awaiting activation, CANCELLED when unenrolled, SUSPENDED when temporarily suspended. ' example: ACTIVE x-jsonld: '@id': status enrolledAt: type: string format: date-time description: 'Timestamp when enrollment was confirmed and logged by BPP (ISO 8601 UTC). May differ from startDate if enrollment is scheduled for future activation. ' example: '2024-10-15T10:35:05Z' x-jsonld: '@id': enrolledAt credential: type: object description: 'Signed enrollment credential issued by BPP. Contains W3C Verifiable Credential (https://www.w3.org/TR/vc-data-model-2.0/) proving enrollment. Returned in on_confirm response. ' x-jsonld: '@id': credential allOf: - $ref: '#/$defs/VerifiableCredential' loggedAt: type: string format: date-time description: 'Timestamp when enrollment was logged in BPP''s audit system (ISO 8601 UTC). Used for audit trail and compliance. ' example: '2024-10-15T10:35:05Z' x-jsonld: '@id': loggedAt logReference: type: string description: 'Reference identifier for the enrollment log entry. Used for audit trail, record keeping, and log retrieval. ' example: log-enrollment-consumer-001 x-jsonld: '@id': logReference deprecated: true x-supersededBy: https://schema.beckn.io/EnergyProgramEnrollment/v2.0 x-owl-equivalentClass: deg:EnergyProgramEnrollment $defs: VerifiableCredential: type: object additionalProperties: false description: 'Represents a W3C Verifiable Credential (https://www.w3.org/TR/vc-data-model-2.0/) used in enrollment flow. This is a wrapper/reference object that contains the credential data (as JWT or JSON-LD), metadata, and URLs. The actual credential follows W3C VC Data Model v2.0 structure. Can be a meter ownership credential, program eligibility credential, DER certification credential, or program enrollment credential. ' x-jsonld: '@type': vc:VerifiableCredential properties: credentialId: type: string description: 'Unique identifier for the credential. Used to reference credentials in verification and conflict checking. ' example: vc-meter-ownership-001 x-jsonld: '@id': credentialId type: type: string enum: - MeterOwnershipCredential - ProgramEligibilityCredential - DERCertificationCredential - ProgramEnrollmentCredential description: 'Credential type as per W3C VC Data Model v2.0. The credential must include ''VerifiableCredential'' in its type array plus one of these specific types. MeterOwnershipCredential proves meter ownership, ProgramEligibilityCredential proves eligibility, DERCertificationCredential proves DER certification, ProgramEnrollmentCredential represents an enrollment. ' example: MeterOwnershipCredential x-jsonld: '@id': vc:type format: type: string enum: - VC-JWT - VC-JSON-LD description: 'Credential format as per W3C VC Data Model v2.0. VC-JWT for JWT-encoded credentials, VC-JSON-LD for JSON-LD encoded credentials. The credentialData field contains the encoded credential that must conform to W3C VC structure when decoded. ' example: VC-JWT x-jsonld: '@id': format credentialData: type: string description: 'The credential data itself, typically a JWT or JSON-LD string containing the W3C Verifiable Credential (https://www.w3.org/TR/vc-data-model-2.0/). Contains the full credential including signature/proof. When decoded, must conform to W3C VC Data Model v2.0 structure with @context, type, credentialSubject, issuer, etc. ' example: eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9... x-jsonld: '@id': credentialData credentialUrl: type: string format: uri description: 'URL where the credential can be accessed or retrieved. Used for enrollment credentials returned in on_confirm response. Optional for credentials in init request. ' example: https://vpp-program-owner.example.com/credentials/vc:enrollment:consumer-001 x-jsonld: '@id': credentialUrl verificationUrl: type: string format: uri description: 'URL for verifying the credential. Used for third-party verification of enrollment credentials. Optional for credentials in init request. ' example: https://vpp-program-owner.example.com/verify/vc:enrollment:consumer-001 x-jsonld: '@id': verificationUrl issuedAt: type: string format: date-time description: 'Timestamp when the credential was issued (ISO 8601 UTC). Maps to W3C VC issuanceDate property. Used for enrollment credentials in on_confirm response. ' example: '2024-10-15T10:35:05Z' x-jsonld: '@id': vc:issuanceDate expiresAt: type: string format: date-time description: 'Timestamp when the credential expires (ISO 8601 UTC). Maps to W3C VC expirationDate property. May be null for non-expiring credentials. ' example: '2025-10-15T10:35:05Z' x-jsonld: '@id': vc:expirationDate derId: type: string description: 'DER identifier associated with a DER certification credential. Links the credential to a specific DER. Only present for DERCertificationCredential type. ' example: der-solar-001 x-jsonld: '@id': derId VerifiedCredential: type: object additionalProperties: false description: 'Details of a credential that has been verified by the BPP. Returned in credentialVerification.verifiedCredentials array. ' x-jsonld: '@type': VerifiedCredential properties: credentialId: type: string description: 'Identifier of the credential that was verified. Matches the credentialId from the init request. ' example: vc-meter-ownership-001 x-jsonld: '@id': credentialId status: type: string enum: - VERIFIED - FAILED description: 'Verification status for this specific credential. VERIFIED if credential is valid, FAILED if invalid or expired. ' example: VERIFIED x-jsonld: '@id': status verifiedAt: type: string format: date-time description: 'Timestamp when the credential was verified by BPP (ISO 8601 UTC). ' example: '2024-10-15T10:30:05Z' x-jsonld: '@id': verifiedAt ConflictingEnrollment: type: object additionalProperties: false description: 'Details of a conflicting enrollment that prevents the requested enrollment from proceeding. Returned in conflictCheck.conflictingEnrollments array. ' x-jsonld: '@type': ConflictingEnrollment properties: enrollmentId: type: string description: 'Identifier of the conflicting enrollment. Used to reference the existing enrollment causing the conflict. ' example: enrollment-existing-001 x-jsonld: '@id': enrollmentId programId: type: string description: 'Program identifier of the conflicting enrollment. Identifies which program the meter/DER is already enrolled in. ' example: program-flex-other-001 x-jsonld: '@id': programId conflictReason: type: string description: 'Human-readable description of why the conflict exists. Explains the nature of the conflict (e.g., meter already enrolled, overlapping dates, etc.). ' example: Meter umid-001 is already enrolled in program-flex-other-001 from 2024-09-01 to 2025-09-01 x-jsonld: '@id': conflictReason conflictType: type: string enum: - METER_ALREADY_ENROLLED - DER_ALREADY_ENROLLED - PROGRAM_CONFLICT - DATE_OVERLAP description: 'Type of conflict. METER_ALREADY_ENROLLED if meter is enrolled, DER_ALREADY_ENROLLED if DER is enrolled, PROGRAM_CONFLICT if program doesn''t allow multiple enrollments, DATE_OVERLAP if dates overlap. ' example: METER_ALREADY_ENROLLED x-jsonld: '@id': conflictType UserAuthRequest: description: 'User authentication request - sent by BAP to BPP in init/confirm requests. Supports OTP-based or OAuth2/OIDC token-based authentication. ' oneOf: - $ref: '#/$defs/OtpAuthRequest' - $ref: '#/$defs/OAuth2AuthRequest' discriminator: propertyName: authMethod mapping: OTP: '#/$defs/OtpAuthRequest' OAUTH2: '#/$defs/OAuth2AuthRequest' OIDC: '#/$defs/OAuth2AuthRequest' UserAuthResponse: description: 'User authentication response - returned by BPP to BAP in on_init/on_confirm responses. Contains verification results and extracted user identity. ' oneOf: - $ref: '#/$defs/OtpAuthResponse' - $ref: '#/$defs/OAuth2AuthResponse' discriminator: propertyName: authMethod mapping: OTP: '#/$defs/OtpAuthResponse' OAUTH2: '#/$defs/OAuth2AuthResponse' OIDC: '#/$defs/OAuth2AuthResponse' OtpAuthRequest: type: object additionalProperties: false required: - authMethod - mobile description: 'OTP authentication request from BAP. - Init request: Send mobile number to initiate OTP - Confirm request: Send mobile + nguid + otp for verification ' x-jsonld: '@type': OtpAuthRequest properties: authMethod: type: string enum: - OTP description: Authentication method. Must be "OTP". example: OTP x-jsonld: '@id': authMethod mobile: type: string description: Mobile phone number in E.164 format. Required. example: '+919999999999' x-jsonld: '@id': mobile otp: type: string description: 'One-time password entered by user. Required in confirm request (after user receives OTP via SMS). ' example: '123456' x-jsonld: '@id': otp nguid: type: string description: 'Session token received from on_init response. Required in confirm request along with otp. ' example: LQUejkRbBL9nJGQiqbComfQ242AHnbG3hnwWdHJut59jqmdJygnVHoiyDcnAUrKm x-jsonld: '@id': nguid utilityCustomerId: type: string description: 'Customer account identifier assigned by the utility/DISCOM. Optional - BAP may include if known from prior interactions. ' example: CUST-123456 x-jsonld: '@id': utilityCustomerId userType: type: string description: 'Type of user. CONSUMER for consumer, PRODUCER for producer, PROSUMER for prosumer. ' example: CONSUMER x-jsonld: '@id': userType OtpAuthResponse: type: object additionalProperties: false required: - authMethod description: 'OTP authentication response from BPP. - On_init response: Returns nguid and message ("OTP sent") - On_confirm response: Returns verification result ' x-jsonld: '@type': OtpAuthResponse properties: authMethod: type: string enum: - OTP description: Authentication method. Always "OTP". example: OTP x-jsonld: '@id': authMethod nguid: type: string description: 'Session token generated by BPP. Returned in on_init response. BAP must include this in confirm request. ' example: LQUejkRbBL9nJGQiqbComfQ242AHnbG3hnwWdHJut59jqmdJygnVHoiyDcnAUrKm x-jsonld: '@id': nguid message: type: string description: 'Human-readable status message. e.g., "OTP sent to +91XXXXXX9999" or "Verification successful". ' example: OTP sent to +91XXXXXX9999. Valid for 5 minutes. x-jsonld: '@id': message expiresAt: type: string format: date-time description: When OTP/nguid expires (ISO 8601 UTC). example: '2024-10-15T10:35:00Z' x-jsonld: '@id': expiresAt verified: type: boolean description: Whether OTP verification succeeded. Present in on_confirm. example: true x-jsonld: '@id': verified verifiedAt: type: string format: date-time description: When OTP was verified (ISO 8601 UTC). example: '2024-10-15T10:35:05Z' x-jsonld: '@id': verifiedAt utilityId: type: string description: 'Utility/DISCOM identifier returned by IdP after authentication. Identifies which utility the authenticated user''s account belongs to. ' example: utility-example-001 x-jsonld: '@id': utilityId utilityCustomerId: type: string description: 'Customer account identifier assigned by the utility/DISCOM. Returned by IdP to link the authenticated user to their utility billing account. ' example: CUST-123456 x-jsonld: '@id': utilityCustomerId OAuth2AuthRequest: type: object additionalProperties: false required: - authMethod - accessToken description: 'OAuth2/OIDC authentication request from BAP. Contains JWT tokens for BPP to validate. BPP extracts claims from token. ' x-jsonld: '@type': OAuth2AuthRequest properties: authMethod: type: string enum: - OAUTH2 - OIDC description: 'Authentication method. "OAUTH2" for access token only, "OIDC" for access + ID token. ' example: OIDC x-jsonld: '@id': authMethod accessToken: type: string description: OAuth2 access token (bearer token). Required. example: eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9... x-jsonld: '@id': accessToken idToken: type: string description: 'OIDC ID token (JWT with user claims). Required when authMethod is "OIDC". ' example: eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9... x-jsonld: '@id': idToken refreshToken: type: string description: 'OAuth2 refresh token. Optional - for long-running flows where token might expire mid-transaction. ' example: dGhpcyBpcyBhIHJlZnJlc2ggdG9rZW4... x-jsonld: '@id': refreshToken OAuth2AuthResponse: type: object additionalProperties: false required: - authMethod description: 'OAuth2/OIDC authentication response from BPP. Contains verification results and extracted user identity from token. ' x-jsonld: '@type': OAuth2AuthResponse properties: authMethod: type: string enum: - OAUTH2 - OIDC description: Authentication method that was used. example: OIDC x-jsonld: '@id': authMethod verified: type: boolean description: Whether token verification succeeded. example: true x-jsonld: '@id': verified verifiedAt: type: string format: date-time description: When token was verified (ISO 8601 UTC). example: '2024-10-15T10:35:05Z' x-jsonld: '@id': verifiedAt subject: type: string description: 'User identifier extracted from token "sub" claim. ' example: user-12345 x-jsonld: '@id': subject issuer: type: string format: uri description: 'OIDC issuer URL extracted from token "iss" claim. ' example: https://accounts.google.com x-jsonld: '@id': issuer scope: type: string description: 'Scopes granted to the token (extracted from token or introspection). ' example: openid profile email meter:read x-jsonld: '@id': scope expiresAt: type: string format: date-time description: When the access token expires (from "exp" claim). example: '2024-10-15T11:35:00Z' x-jsonld: '@id': expiresAt message: type: string description: Human-readable verification status message. example: Token verified successfully x-jsonld: '@id': message MeterEnrollment: type: object additionalProperties: false required: - meterId description: 'Meter details for enrollment in an energy program. Contains meter identifier (UMID) and optional utility information. Used in the meters array within orderAttributes during confirm request. At least one meter must be specified for enrollment to be confirmed. ' x-jsonld: '@type': MeterEnrollment properties: meterId: type: string description: 'Unique Meter Identifier (UMID) for the meter to be enrolled. This is the primary identifier used by the utility/DISCOM. ' example: umid-001 x-jsonld: '@id': meterId meterNumber: type: string description: 'Physical meter number as displayed on the meter device. May differ from meterId which is the utility''s internal identifier. ' example: MTR-123456 x-jsonld: '@id': meterNumber utilityId: type: string description: 'Identifier of the utility/DISCOM that owns or manages the meter. ' example: utility-tpddl-001 x-jsonld: '@id': utilityId connectionType: type: string enum: - residential - commercial - industrial - agricultural description: 'Type of electricity connection for this meter. ' example: residential x-jsonld: '@id': connectionType sanctionedLoad: type: number minimum: 0 description: 'Sanctioned load capacity in kilowatts (kW) for this meter connection. ' example: 5.0 x-jsonld: '@id': sanctionedLoad