{ "$schema": "https://json-schema.org/draft/2020-12/schema", "$id": "https://raw.githubusercontent.com/api-evangelist/elhub/main/json-schema/elhub-service-providing-group-product-application-response-schema.json", "title": "service_providing_group_product_application_response", "description": "Response schema - Relation between a service providing group and a system operator for a product type, for the SPG to deliver a product to the SO later.", "x-generated": "2026-10-09", "x-method": "derived", "x-generator": "derive-json-schema.py", "x-source": "openapi/elhub-flex-information-system-main-api-openapi.yml#/components/schemas/service_providing_group_product_application_response", "summary": "Response - Service Providing Group Product Application", "type": "object", "properties": { "id": { "description": "Unique surrogate identifier.", "format": "bigint", "type": "integer", "readOnly": true }, "service_providing_group_id": { "description": "Reference to the service providing group.", "format": "bigint", "type": "integer" }, "procuring_system_operator_id": { "description": "Reference to the procuring system operator.", "format": "bigint", "type": "integer" }, "product_type_ids": { "description": "References to the product types.", "type": "array", "items": { "format": "bigint", "type": "integer" } }, "status": { "$ref": "#/$defs/service_providing_group_product_application_status", "default": "requested" }, "maximum_active_power_up": { "description": "The maximum active power applied for in regulation direction up. Stored in kilowatts.", "format": "decimal", "type": "number", "minimum": 0, "maximum": 999999.999, "multipleOf": 0.001 }, "maximum_active_power_down": { "description": "The maximum active power applied for in regulation direction down. Stored in kilowatts.", "format": "decimal", "type": "number", "minimum": 0, "maximum": 999999.999, "multipleOf": 0.001 }, "additional_information": { "description": "Free text field for extra information about the application if needed (bidding periods, unavailabilities, etc).", "format": "text", "type": [ "string", "null" ], "maxLength": 512 }, "prequalified_at": { "description": "When the product application was last prequalified.", "format": "date-time", "type": [ "string", "null" ] }, "verified_at": { "description": "When the product application was last verified.", "format": "date-time", "type": [ "string", "null" ] }, "ramping_capability": { "oneOf": [ { "$ref": "#/$defs/service_providing_group_product_application_ramping_capability" }, { "type": "null" } ], "nullable": true }, "ramping_description": { "description": "Free text description of ramping details. Only required for product Manual Frequency Restoration (mFRR).", "format": "text", "type": [ "string", "null" ] }, "created_at": { "description": "When the application was first created.", "format": "date-time", "type": "string", "readOnly": true }, "complete_at": { "description": "When the application was last marked complete by the procuring system operator.", "format": "date-time", "type": [ "string", "null" ] }, "recorded_at": { "description": "When the resource was recorded (created or updated) in the system.", "format": "date-time", "type": "string", "readOnly": true }, "recorded_by": { "description": "The identity that recorded the resource.", "format": "bigint", "type": "integer", "readOnly": true }, "service_providing_group": { "description": "Embedded service_providing_group", "oneOf": [ { "$ref": "#/$defs/service_providing_group_response" }, { "type": "null" } ], "nullable": true }, "procuring_system_operator": { "description": "Embedded party", "oneOf": [ { "$ref": "#/$defs/party_response" }, { "type": "null" } ], "nullable": true }, "attachment": { "description": "Embedded service_providing_group_product_application_attachment", "oneOf": [ { "type": "array", "items": { "$ref": "#/$defs/service_providing_group_product_application_attachment_response" } }, { "type": "null" } ], "nullable": true }, "comment": { "description": "Embedded service_providing_group_product_application_comment", "oneOf": [ { "type": "array", "items": { "$ref": "#/$defs/service_providing_group_product_application_comment_response" } }, { "type": "null" } ], "nullable": true } }, "required": [ "id", "service_providing_group_id", "procuring_system_operator_id", "product_type_ids", "status", "maximum_active_power_up", "maximum_active_power_down", "created_at", "recorded_at", "recorded_by" ], "$defs": { "accounting_point_balance_responsible_party_energy_direction": { "description": "The direction of the effect on the balance that the BRP takes responsibility for.", "format": "text", "type": "string", "readOnly": true, "enum": [ "consumption", "production" ] }, "accounting_point_balance_responsible_party_response": { "summary": "Response - Accounting Point Balance Responsible Party", "description": "Response schema - Relation linking a balance responsible party to an accounting point.", "type": "object", "properties": { "accounting_point_id": { "description": "The ID of the accounting point.", "format": "bigint", "type": "integer", "readOnly": true }, "balance_responsible_party_id": { "description": "The balance responsible party of the accounting point.", "format": "bigint", "type": "integer", "readOnly": true }, "energy_direction": { "$ref": "#/$defs/accounting_point_balance_responsible_party_energy_direction", "readOnly": true }, "valid_from": { "description": "The date from which the relation between the accounting point and the balance responsible party is valid. Midnight aligned on Norwegian timezone.", "format": "date-time", "type": "string", "readOnly": true }, "valid_to": { "description": "The date until which the relation between the accounting point and the balance responsible party is valid. Midnight aligned on Norwegian timezone.", "format": "date-time", "type": [ "string", "null" ], "readOnly": true }, "accounting_point": { "description": "Embedded accounting_point", "oneOf": [ { "$ref": "#/$defs/accounting_point_response" }, { "type": "null" } ], "nullable": true }, "balance_responsible_party": { "description": "Embedded party", "oneOf": [ { "$ref": "#/$defs/party_response" }, { "type": "null" } ], "nullable": true } }, "required": [ "accounting_point_id", "balance_responsible_party_id", "energy_direction", "valid_from" ] }, "accounting_point_bidding_zone_bidding_zone": { "description": "The bidding zone of the accounting point.", "format": "text", "type": "string", "enum": [ "NO1", "NO2", "NO3", "NO4", "NO5" ] }, "accounting_point_bidding_zone_response": { "summary": "Response - Accounting Point Bidding Zone", "description": "Response schema - Relation telling which bidding zone an accounting point belongs to.", "type": "object", "properties": { "accounting_point_id": { "description": "The ID of the accounting point.", "format": "bigint", "type": "integer", "readOnly": true }, "bidding_zone": { "$ref": "#/$defs/accounting_point_bidding_zone_bidding_zone" }, "valid_from": { "description": "The date from which the accounting point belongs to the bidding zone. Midnight aligned on Norwegian timezone.", "format": "date-time", "type": "string", "readOnly": true }, "valid_to": { "description": "The date until which the accounting point belongs to the bidding zone. Midnight aligned on Norwegian timezone.", "format": "date-time", "type": [ "string", "null" ], "readOnly": true }, "accounting_point": { "description": "Embedded accounting_point", "oneOf": [ { "$ref": "#/$defs/accounting_point_response" }, { "type": "null" } ], "nullable": true } }, "required": [ "accounting_point_id", "bidding_zone", "valid_from" ] }, "accounting_point_end_user_response": { "summary": "Response - Accounting Point End User", "description": "Response schema - Relation telling which end user an accounting point belongs to.", "type": "object", "properties": { "accounting_point_id": { "description": "The ID of the accounting point.", "format": "bigint", "type": "integer", "readOnly": true }, "end_user_id": { "description": "The end user on the accounting point.", "format": "bigint", "type": "integer", "readOnly": true }, "valid_from": { "description": "The date from which the accounting point belongs to the end user. Midnight aligned on Norwegian timezone.", "format": "date-time", "type": "string", "readOnly": true }, "valid_to": { "description": "The date until which the accounting point belongs to the end user. Midnight aligned on Norwegian timezone.", "format": "date-time", "type": [ "string", "null" ], "readOnly": true }, "accounting_point": { "description": "Embedded accounting_point", "oneOf": [ { "$ref": "#/$defs/accounting_point_response" }, { "type": "null" } ], "nullable": true }, "end_user": { "description": "Embedded party", "oneOf": [ { "$ref": "#/$defs/party_response" }, { "type": "null" } ], "nullable": true } }, "required": [ "accounting_point_id", "end_user_id", "valid_from" ] }, "accounting_point_energy_supplier_response": { "summary": "Response - Accounting Point Energy Supplier", "description": "Response schema - Relation linking an energy supplier to an accounting point.", "type": "object", "properties": { "accounting_point_id": { "description": "The ID of the accounting point.", "format": "bigint", "type": "integer", "readOnly": true }, "energy_supplier_id": { "description": "The energy supplier of the accounting point.", "format": "bigint", "type": "integer", "readOnly": true }, "valid_from": { "description": "The date from which the relation between the accounting point and the energy supplier is valid. Midnight aligned on Norwegian timezone.", "format": "date-time", "type": "string", "readOnly": true }, "valid_to": { "description": "The date until which the relation between the accounting point and the energy supplier is valid. Midnight aligned on Norwegian timezone.", "format": "date-time", "type": [ "string", "null" ], "readOnly": true }, "accounting_point": { "description": "Embedded accounting_point", "oneOf": [ { "$ref": "#/$defs/accounting_point_response" }, { "type": "null" } ], "nullable": true }, "energy_supplier": { "description": "Embedded party", "oneOf": [ { "$ref": "#/$defs/party_response" }, { "type": "null" } ], "nullable": true } }, "required": [ "accounting_point_id", "energy_supplier_id", "valid_from" ] }, "accounting_point_grid_location_object_type": { "description": "The type of object in the common grid model that the accounting point is at.", "format": "text", "type": "string", "enum": [ "substation" ] }, "accounting_point_grid_location_quality": { "description": "Indicates how the grid location was determined. Guessed means that Flexibility Information System has estimated the location, while confirmed means that someone has verified it.", "format": "text", "type": "string", "enum": [ "confirmed", "guessed" ] }, "accounting_point_grid_location_response": { "summary": "Response - Accounting Point Grid Location", "description": "Response schema - The electrical (topological) location of an accounting point in the common grid model (Nemo).", "type": "object", "properties": { "id": { "description": "Unique surrogate key.", "format": "bigint", "type": "integer", "readOnly": true }, "accounting_point_id": { "description": "The accounting point this grid location belongs to.", "format": "bigint", "type": "integer" }, "object_type": { "$ref": "#/$defs/accounting_point_grid_location_object_type" }, "business_id": { "description": "Business identifier (mRID) referencing the object in the common grid model (NEMO).", "format": "text", "type": "string", "nullable": false, "pattern": "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$" }, "name": { "description": "Name of the grid model object at the location.", "format": "text", "type": "string", "maxLength": 512 }, "nominal_voltage": { "description": "Nominal voltage level at the grid location, in kilovolt (kV).", "format": "decimal", "type": "number", "minimum": 0, "maximum": 999999.999, "multipleOf": 0.001 }, "additional_information": { "description": "Free text field for extra information about the grid location if needed.", "format": "text", "type": [ "string", "null" ] }, "source": { "$ref": "#/$defs/accounting_point_grid_location_source", "readOnly": true }, "quality": { "$ref": "#/$defs/accounting_point_grid_location_quality" }, "recorded_at": { "description": "When the resource was recorded (created or updated) in the system.", "format": "date-time", "type": "string", "readOnly": true }, "recorded_by": { "description": "The identity that recorded the resource.", "format": "bigint", "type": "integer", "readOnly": true }, "accounting_point": { "description": "Embedded accounting_point", "oneOf": [ { "$ref": "#/$defs/accounting_point_response" }, { "type": "null" } ], "nullable": true } }, "required": [ "id", "accounting_point_id", "object_type", "business_id", "name", "nominal_voltage", "source", "quality", "recorded_at", "recorded_by" ] }, "accounting_point_grid_location_source": { "description": "How the grid location was determined. When a system operator creates or updates a grid location, this field is set automatically: `cso` if the SO is the connecting system operator, `so` otherwise.", "format": "text", "type": "string", "readOnly": true, "enum": [ "cso", "so", "grid_model", "system" ] }, "accounting_point_metering_grid_area_response": { "summary": "Response - Accounting Point Metering Grid Area", "description": "Response schema - Relation telling which metering grid area an accounting point belongs to.", "type": "object", "properties": { "accounting_point_id": { "description": "The ID of the accounting point.", "format": "bigint", "type": "integer", "readOnly": true }, "metering_grid_area_id": { "description": "The metering grid area of the accounting point.", "format": "bigint", "type": "integer", "readOnly": true }, "valid_from": { "description": "The date from which the accounting point belongs to the metering grid area. Midnight aligned on Norwegian timezone.", "format": "date-time", "type": "string", "readOnly": true }, "valid_to": { "description": "The date until which the accounting point belongs to the metering grid area. Midnight aligned on Norwegian timezone.", "format": "date-time", "type": [ "string", "null" ], "readOnly": true }, "accounting_point": { "description": "Embedded accounting_point", "oneOf": [ { "$ref": "#/$defs/accounting_point_response" }, { "type": "null" } ], "nullable": true }, "metering_grid_area": { "description": "Embedded metering_grid_area", "oneOf": [ { "$ref": "#/$defs/metering_grid_area_response" }, { "type": "null" } ], "nullable": true } }, "required": [ "accounting_point_id", "metering_grid_area_id", "valid_from" ] }, "accounting_point_response": { "summary": "Response - Accounting Point", "description": "Response schema - Accounting point for a controllable unit.", "type": "object", "properties": { "id": { "description": "Unique surrogate identifier.", "format": "bigint", "type": "integer", "readOnly": true }, "business_id": { "description": "The GSRN metering point id of the accounting point.", "format": "text", "type": "string", "readOnly": true, "pattern": "^[1-9][0-9]{17}$" }, "system_operator_id": { "description": "The system operator of the accounting point.", "format": "bigint", "type": "integer", "readOnly": true }, "location": { "description": "Geographic location of the accounting point (WGS84), as a GeoJSON point object.", "readOnly": true, "type": [ "object", "null" ], "oneOf": [ { "$ref": "#/$defs/geojson_point" }, { "type": "null" } ] }, "recorded_at": { "description": "When the resource was recorded (created or updated) in the system.", "format": "date-time", "type": "string", "readOnly": true }, "recorded_by": { "description": "The identity that recorded the resource.", "format": "bigint", "type": "integer", "readOnly": true }, "controllable_unit": { "description": "Embedded controllable_unit", "oneOf": [ { "type": "array", "items": { "$ref": "#/$defs/controllable_unit_response" } }, { "type": "null" } ], "nullable": true }, "system_operator": { "description": "Embedded party", "oneOf": [ { "$ref": "#/$defs/party_response" }, { "type": "null" } ], "nullable": true }, "balance_responsible_party": { "description": "Embedded accounting_point_balance_responsible_party", "oneOf": [ { "type": "array", "items": { "$ref": "#/$defs/accounting_point_balance_responsible_party_response" } }, { "type": "null" } ], "nullable": true }, "bidding_zone": { "description": "Embedded accounting_point_bidding_zone", "oneOf": [ { "type": "array", "items": { "$ref": "#/$defs/accounting_point_bidding_zone_response" } }, { "type": "null" } ], "nullable": true }, "end_user": { "description": "Embedded accounting_point_end_user", "oneOf": [ { "type": "array", "items": { "$ref": "#/$defs/accounting_point_end_user_response" } }, { "type": "null" } ], "nullable": true }, "energy_supplier": { "description": "Embedded accounting_point_energy_supplier", "oneOf": [ { "type": "array", "items": { "$ref": "#/$defs/accounting_point_energy_supplier_response" } }, { "type": "null" } ], "nullable": true }, "metering_grid_area": { "description": "Embedded accounting_point_metering_grid_area", "oneOf": [ { "type": "array", "items": { "$ref": "#/$defs/accounting_point_metering_grid_area_response" } }, { "type": "null" } ], "nullable": true }, "grid_location": { "description": "Embedded accounting_point_grid_location", "oneOf": [ { "$ref": "#/$defs/accounting_point_grid_location_response" }, { "type": "null" } ], "nullable": true } }, "required": [ "id", "business_id", "system_operator_id", "recorded_at", "recorded_by" ] }, "auth_scope": { "description": "Authorization scopes.", "format": "text", "type": "string", "enum": [ "manage:attachment", "manage:attachment:service_providing_group_product_application_attachment", "manage:auth", "manage:data", "manage:data:accounting_point_grid_location", "manage:data:controllable_unit", "manage:data:controllable_unit_service_provider", "manage:data:controllable_unit_suspension", "manage:data:controllable_unit_suspension_comment", "manage:data:entity", "manage:data:entity_client", "manage:data:notification", "manage:data:party", "manage:data:party_membership", "manage:data:service_provider_product_application", "manage:data:service_provider_product_application_comment", "manage:data:service_provider_product_suspension", "manage:data:service_provider_product_suspension_comment", "manage:data:service_providing_group", "manage:data:service_providing_group_grid_prequalification", "manage:data:service_providing_group_grid_prequalification_comment", "manage:data:service_providing_group_grid_suspension", "manage:data:service_providing_group_grid_suspension_comment", "manage:data:service_providing_group_membership", "manage:data:service_providing_group_product_application", "manage:data:service_providing_group_product_application_comment", "manage:data:service_providing_group_product_suspension", "manage:data:service_providing_group_product_suspension_comment", "manage:data:system_operator_product_type", "manage:data:technical_resource", "read:attachment", "read:attachment:service_providing_group_product_application_attachment", "read:attachment:service_providing_group_product_application_attachment_history", "read:auth", "read:data", "read:data:accounting_point", "read:data:accounting_point_balance_responsible_party", "read:data:accounting_point_bidding_zone", "read:data:accounting_point_end_user", "read:data:accounting_point_energy_supplier", "read:data:accounting_point_grid_location", "read:data:accounting_point_grid_location_history", "read:data:accounting_point_metering_grid_area", "read:data:controllable_unit", "read:data:controllable_unit_history", "read:data:controllable_unit_service_provider", "read:data:controllable_unit_service_provider_history", "read:data:controllable_unit_summary", "read:data:controllable_unit_suspension", "read:data:controllable_unit_suspension_comment", "read:data:controllable_unit_suspension_comment_history", "read:data:controllable_unit_suspension_history", "read:data:entity", "read:data:entity_client", "read:data:event", "read:data:identity", "read:data:metering_grid_area", "read:data:notice", "read:data:notification", "read:data:party", "read:data:party_history", "read:data:party_membership", "read:data:party_membership_history", "read:data:product_type", "read:data:service_provider_product_application", "read:data:service_provider_product_application_comment", "read:data:service_provider_product_application_comment_history", "read:data:service_provider_product_application_history", "read:data:service_provider_product_suspension", "read:data:service_provider_product_suspension_comment", "read:data:service_provider_product_suspension_comment_history", "read:data:service_provider_product_suspension_history", "read:data:service_providing_group", "read:data:service_providing_group_grid_prequalification", "read:data:service_providing_group_grid_prequalification_comment", "read:data:service_providing_group_grid_prequalification_comment_history", "read:data:service_providing_group_grid_prequalification_history", "read:data:service_providing_group_grid_suspension", "read:data:service_providing_group_grid_suspension_comment", "read:data:service_providing_group_grid_suspension_comment_history", "read:data:service_providing_group_grid_suspension_history", "read:data:service_providing_group_history", "read:data:service_providing_group_membership", "read:data:service_providing_group_membership_history", "read:data:service_providing_group_power_per_substation", "read:data:service_providing_group_product_application", "read:data:service_providing_group_product_application_comment", "read:data:service_providing_group_product_application_comment_history", "read:data:service_providing_group_product_application_history", "read:data:service_providing_group_product_suspension", "read:data:service_providing_group_product_suspension_comment", "read:data:service_providing_group_product_suspension_comment_history", "read:data:service_providing_group_product_suspension_history", "read:data:service_providing_group_summary", "read:data:system_operator_product_type", "read:data:system_operator_product_type_history", "read:data:technical_resource", "read:data:technical_resource_history", "read:grid", "read:grid:line", "read:grid:substation", "read:grid:substation_cluster", "use:auth", "use:data", "use:data:controllable_unit", "use:data:controllable_unit:lookup", "use:data:entity", "use:data:entity:lookup" ] }, "category": { "description": "Resource category classification. Derived from technologies.", "format": "text", "type": "string", "enum": [ "consumption", "production", "energy_storage" ] }, "controllable_unit_regulation_direction": { "description": "The regulation direction of the controllable unit. `up` means it can be used to increase production or decrease consumption, while `down` means to decrease production or increase consumption.", "format": "text", "type": "string", "enum": [ "up", "down", "both" ] }, "controllable_unit_response": { "summary": "Response - Controllable unit", "description": "Response schema - Controllable unit", "type": "object", "properties": { "id": { "description": "Unique surrogate key.", "format": "bigint", "type": "integer", "readOnly": true }, "business_id": { "description": "Unique business identifier for the controllable unit.", "format": "text", "type": "string", "pattern": "^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$", "readOnly": true }, "name": { "description": "Free text name of the controllable unit.", "format": "text", "type": "string", "maxLength": 512 }, "start_date": { "description": "The usage date when the controllable unit is first active.", "format": "date", "type": [ "string", "null" ] }, "status": { "$ref": "#/$defs/controllable_unit_status", "default": "new" }, "regulation_direction": { "$ref": "#/$defs/controllable_unit_regulation_direction" }, "maximum_active_power": { "description": "Maximum continuous active power (flexible power) that the controllable unit can produce or consume, i.e. deliver for balancing and congestion services, in kilowatts.", "format": "decimal", "type": "number", "minimum": 0, "maximum": 999999.999, "multipleOf": 0.001 }, "is_small": { "description": "Whether the controllable unit is small or not, following NCDR. Current threshold for this to be true is <= 50 kW of flexible power.", "format": "boolean", "type": "boolean", "readOnly": true }, "accounting_point_id": { "description": "Reference to the accounting point that the controllable unit is connected to.", "format": "bigint", "type": "integer", "nullable": false }, "additional_information": { "description": "Free text field for extra information about the controllable unit if needed.", "format": "text", "type": [ "string", "null" ] }, "recorded_at": { "description": "When the resource was recorded (created or updated) in the system.", "format": "date-time", "type": "string", "readOnly": true }, "recorded_by": { "description": "The identity that recorded the resource.", "format": "bigint", "type": "integer", "readOnly": true }, "accounting_point": { "description": "Embedded accounting_point", "oneOf": [ { "$ref": "#/$defs/accounting_point_response" }, { "type": "null" } ], "nullable": true }, "suspension": { "description": "Embedded controllable_unit_suspension", "oneOf": [ { "type": "array", "items": { "$ref": "#/$defs/controllable_unit_suspension_response" } }, { "type": "null" } ], "nullable": true }, "service_provider": { "description": "Embedded controllable_unit_service_provider", "oneOf": [ { "type": "array", "items": { "$ref": "#/$defs/controllable_unit_service_provider_response" } }, { "type": "null" } ], "nullable": true }, "summary": { "description": "Embedded controllable_unit_summary", "oneOf": [ { "$ref": "#/$defs/controllable_unit_summary_response" }, { "type": "null" } ], "nullable": true }, "service_providing_group_membership": { "description": "Embedded service_providing_group_membership", "oneOf": [ { "type": "array", "items": { "$ref": "#/$defs/service_providing_group_membership_response" } }, { "type": "null" } ], "nullable": true }, "technical_resource": { "description": "Embedded technical_resource", "oneOf": [ { "type": "array", "items": { "$ref": "#/$defs/technical_resource_response" } }, { "type": "null" } ], "nullable": true } }, "required": [ "id", "business_id", "name", "status", "regulation_direction", "maximum_active_power", "is_small", "accounting_point_id", "recorded_at", "recorded_by" ] }, "controllable_unit_service_provider_response": { "summary": "Response - Relation between controllable unit and service provider", "description": "Response schema - Relation between controllable unit and service provider", "type": "object", "properties": { "id": { "description": "Unique surrogate key.", "format": "bigint", "type": "integer", "readOnly": true }, "controllable_unit_id": { "description": "Reference to the controllable unit this relation links to a service provider.", "format": "bigint", "type": "integer" }, "service_provider_id": { "description": "Reference to the `party` (service provider) this relation links to a controllable unit.", "format": "bigint", "type": "integer" }, "end_user_id": { "description": "Technical ID of the end user behind the accounting point.", "format": "bigint", "type": "integer" }, "contract_reference": { "description": "The service providers internal reference to the contract with the end user. Typically an internal identifier to a stored document or consent record.", "format": "text", "type": "string", "maxLength": 128, "nullable": false }, "valid_from": { "description": "The date from which the relation between the controllable unit and the service provider is valid. Midnight aligned on Norwegian timezone.", "format": "date-time", "type": [ "string", "null" ] }, "valid_to": { "description": "The date until which the relation between the controllable unit and the service provider is valid. Midnight aligned on Norwegian timezone.", "format": "date-time", "type": [ "string", "null" ] }, "recorded_at": { "description": "When the resource was recorded (created or updated) in the system.", "format": "date-time", "type": "string", "readOnly": true }, "recorded_by": { "description": "The identity that recorded the resource.", "format": "bigint", "type": "integer", "readOnly": true }, "controllable_unit": { "description": "Embedded controllable_unit", "oneOf": [ { "$ref": "#/$defs/controllable_unit_response" }, { "type": "null" } ], "nullable": true }, "service_provider": { "description": "Embedded party", "oneOf": [ { "$ref": "#/$defs/party_response" }, { "type": "null" } ], "nullable": true }, "end_user": { "description": "Embedded party", "oneOf": [ { "$ref": "#/$defs/party_response" }, { "type": "null" } ], "nullable": true } }, "required": [ "id", "controllable_unit_id", "service_provider_id", "end_user_id", "contract_reference", "recorded_at", "recorded_by" ] }, "controllable_unit_status": { "description": "The status of the controllable unit.", "format": "text", "type": "string", "default": "new", "enum": [ "new", "active", "inactive", "terminated" ] }, "controllable_unit_summary_response": { "summary": "Response - Controllable Unit Summary", "description": "Response schema - Aggregated summary of technical resources belonging to a controllable unit.", "type": "object", "properties": { "id": { "description": "Unique surrogate key (controllable unit ID).", "format": "bigint", "type": "integer", "readOnly": true }, "controllable_unit_id": { "description": "The ID of the controllable unit this resource is a summary of.", "format": "bigint", "type": "integer", "readOnly": true }, "technical_resource": { "description": "Aggregated statistics on technical resources belonging to the controllable unit, including counts and maximum active power breakdowns (sum, average, min, max) by category and technology.", "type": "object", "readOnly": true, "properties": { "count": { "type": "integer" }, "maximum_active_power": { "$ref": "#/$defs/numeric_aggregation" }, "by_category": { "type": "object", "propertyNames": { "$ref": "#/$defs/category" }, "additionalProperties": { "type": "object", "properties": { "count": { "type": "integer" }, "maximum_active_power": { "$ref": "#/$defs/numeric_aggregation" } } } }, "by_technology": { "type": "object", "propertyNames": { "$ref": "#/$defs/technology" }, "additionalProperties": { "type": "object", "properties": { "count": { "type": "integer" }, "maximum_active_power": { "$ref": "#/$defs/numeric_aggregation" } } } } } }, "controllable_unit": { "description": "Embedded controllable_unit", "oneOf": [ { "$ref": "#/$defs/controllable_unit_response" }, { "type": "null" } ], "nullable": true } }, "required": [ "id", "controllable_unit_id", "technical_resource" ] }, "controllable_unit_suspension_comment_response": { "summary": "Response - Controllable Unit Suspension Comment", "description": "Response schema - Comment made by a party involved in a controllable unit suspension.", "type": "object", "properties": { "id": { "description": "Unique surrogate identifier.", "format": "bigint", "type": "integer", "readOnly": true }, "controllable_unit_suspension_id": { "description": "Reference to the controllable unit suspension.", "format": "bigint", "type": "integer" }, "created_by": { "description": "Reference to the identity that created the comment.", "format": "bigint", "type": "integer", "readOnly": true }, "created_at": { "description": "When the comment was added to the CUS.", "format": "date-time", "type": "string", "readOnly": true }, "visibility": { "$ref": "#/$defs/controllable_unit_suspension_comment_visibility", "default": "same_party" }, "content": { "description": "Free text content of the comment.", "format": "text", "type": "string", "maxLength": 2048 }, "recorded_at": { "description": "When the resource was recorded (created or updated) in the system.", "format": "date-time", "type": "string", "readOnly": true }, "recorded_by": { "description": "The identity that recorded the resource.", "format": "bigint", "type": "integer", "readOnly": true }, "controllable_unit_suspension": { "description": "Embedded controllable_unit_suspension", "oneOf": [ { "$ref": "#/$defs/controllable_unit_suspension_response" }, { "type": "null" } ], "nullable": true } }, "required": [ "id", "controllable_unit_suspension_id", "created_by", "created_at", "visibility", "content", "recorded_at", "recorded_by" ] }, "controllable_unit_suspension_comment_visibility": { "description": "The level of visibility of the comment.", "format": "text", "type": "string", "default": "same_party", "enum": [ "same_party", "any_involved_party" ] }, "controllable_unit_suspension_reason": { "description": "The reason for the suspension.", "format": "text", "type": "string", "enum": [ "compromises_safe_operation", "other" ] }, "controllable_unit_suspension_response": { "summary": "Response - Controllable Unit Suspension", "description": "Response schema - The relation allowing an impacted system operator to temporarily suspend a controllable unit.", "type": "object", "properties": { "id": { "description": "Unique surrogate identifier.", "format": "bigint", "type": "integer", "readOnly": true }, "controllable_unit_id": { "description": "Reference to the suspended controllable unit.", "format": "bigint", "type": "integer" }, "impacted_system_operator_id": { "description": "Reference to the impacted system operator suspending the controllable unit.", "format": "bigint", "type": "integer" }, "reason": { "$ref": "#/$defs/controllable_unit_suspension_reason" }, "recorded_at": { "description": "When the resource was recorded (created or updated) in the system.", "format": "date-time", "type": "string", "readOnly": true }, "recorded_by": { "description": "The identity that recorded the resource.", "format": "bigint", "type": "integer", "readOnly": true }, "controllable_unit": { "description": "Embedded controllable_unit", "oneOf": [ { "$ref": "#/$defs/controllable_unit_response" }, { "type": "null" } ], "nullable": true }, "impacted_system_operator": { "description": "Embedded party", "oneOf": [ { "$ref": "#/$defs/party_response" }, { "type": "null" } ], "nullable": true }, "comment": { "description": "Embedded controllable_unit_suspension_comment", "oneOf": [ { "type": "array", "items": { "$ref": "#/$defs/controllable_unit_suspension_comment_response" } }, { "type": "null" } ], "nullable": true } }, "required": [ "id", "controllable_unit_id", "impacted_system_operator_id", "reason", "recorded_at", "recorded_by" ] }, "device_type": { "description": "Type of device for technical resources.", "format": "text", "type": "string", "enum": [ "inverter", "boiler", "water_heater", "socket", "hvac", "ev_charging_device", "energy_management_system", "other" ] }, "entity_business_id_type": { "description": "The type of the business identifier.", "format": "text", "type": "string", "enum": [ "pid", "org", "email" ] }, "entity_client_response": { "summary": "Response - Entity client", "description": "Response schema - Client linked to an entity for client credentials and JWT grant authentication methods.", "type": "object", "properties": { "id": { "description": "Unique surrogate identifier.", "format": "bigint", "type": "integer", "readOnly": true }, "entity_id": { "description": "Reference to the entity that this client is attached to.", "format": "bigint", "type": "integer" }, "name": { "description": "Name of the client.", "format": "text", "type": [ "string", "null" ], "maxLength": 256 }, "client_id": { "description": "The identifier of the entity. For use with client credentials authentication method.", "format": "text", "type": "string", "readOnly": true }, "party_id": { "description": "Reference to the party this client allows to assume. A null value means the client cannot assume any party.", "format": "bigint", "type": [ "integer", "null" ] }, "scopes": { "description": "List of scopes granted to the user when it logs in as an entity or when it acts as the party. When assuming a party through party membership, the least privileged set of scopes will be kept.\nScopes are inspired from OAuth 2.0 and allow refinement of access control and privilege delegation mechanisms.", "type": "array", "items": { "$ref": "#/$defs/auth_scope" }, "nullable": false }, "client_secret": { "description": "The secret of the entity. For use with client credentials authentication method. Input as plain text but stored encrypted.", "format": "text", "type": [ "string", "null" ], "minLength": 12 }, "public_key": { "description": "The public key of the entity (X.509 SubjectPublicKeyInfo). For use with JWT grant authentication method.", "format": "text", "type": [ "string", "null" ], "pattern": "^-----BEGIN PUBLIC KEY-----\\nMIIB[-A-Za-z0-9+/\\n]*={0,3}\\n-----END PUBLIC KEY-----$" }, "recorded_at": { "description": "When the resource was recorded (created or updated) in the system.", "format": "date-time", "type": "string", "readOnly": true }, "recorded_by": { "description": "The identity that recorded the resource.", "format": "bigint", "type": "integer", "readOnly": true }, "entity": { "description": "Embedded entity", "oneOf": [ { "$ref": "#/$defs/entity_response" }, { "type": "null" } ], "nullable": true }, "party": { "description": "Embedded party", "oneOf": [ { "$ref": "#/$defs/party_response" }, { "type": "null" } ], "nullable": true } }, "required": [ "id", "entity_id", "client_id", "scopes", "recorded_at", "recorded_by" ] }, "entity_response": { "summary": "Response - Entity", "description": "Response schema - Entity - Natural or legal person\n\nAn entity is a natural or legal person that can be a party in the Flexibility Information System.\n\nExample entity types:\n\n* Person\n* Organisation", "type": "object", "properties": { "id": { "description": "Unique surrogate identifier.\n\nNote:\nThis is a Primary Key.", "format": "bigint", "type": "integer", "readOnly": true }, "business_id": { "description": "The business identifier of the entity. Format depends on `business_id_type`.", "format": "text", "type": "string" }, "business_id_type": { "$ref": "#/$defs/entity_business_id_type" }, "name": { "description": "Name of the entity. Maximum 128 characters.", "format": "text", "type": "string" }, "type": { "$ref": "#/$defs/entity_type" }, "recorded_at": { "description": "When the resource was recorded (created or updated) in the system.", "format": "date-time", "type": "string", "readOnly": true }, "recorded_by": { "description": "The identity that recorded the resource.", "format": "bigint", "type": "integer", "readOnly": true }, "client": { "description": "Embedded entity_client", "oneOf": [ { "type": "array", "items": { "$ref": "#/$defs/entity_client_response" } }, { "type": "null" } ], "nullable": true }, "party": { "description": "Embedded party", "oneOf": [ { "type": "array", "items": { "$ref": "#/$defs/party_response" } }, { "type": "null" } ], "nullable": true }, "party_membership": { "description": "Embedded party_membership", "oneOf": [ { "type": "array", "items": { "$ref": "#/$defs/party_membership_response" } }, { "type": "null" } ], "nullable": true }, "identity": { "description": "Embedded identity", "oneOf": [ { "type": "array", "items": { "$ref": "#/$defs/identity_response" } }, { "type": "null" } ], "nullable": true } }, "required": [ "id", "business_id", "business_id_type", "name", "type", "recorded_at", "recorded_by" ] }, "entity_type": { "description": "The type of the entity, e.g Person, Organisation", "format": "text", "type": "string", "enum": [ "person", "organisation" ] }, "geojson_point": { "type": "object", "properties": { "type": { "type": "string", "enum": [ "Point" ] }, "coordinates": { "type": "array", "description": "[longitude, latitude] in decimal degrees (WGS84)", "items": { "type": "number" }, "minItems": 2, "maxItems": 2 } }, "required": [ "type", "coordinates" ] }, "identity_response": { "summary": "Response - Identity", "description": "Response schema - Resource uniquely identifying a user by linking its entity and the potentially assumed party.", "type": "object", "properties": { "id": { "description": "Unique surrogate identifier.", "format": "bigint", "type": "integer", "readOnly": true }, "entity_id": { "description": "Reference to the entity using the identity.", "format": "bigint", "type": "integer", "readOnly": true }, "entity_name": { "description": "Name of the entity using the identity.", "format": "text", "type": "string", "readOnly": true }, "party_id": { "description": "Reference to the party assumed by the entity.", "format": "bigint", "type": [ "integer", "null" ], "readOnly": true }, "party_name": { "description": "Name of the party assumed by the entity.", "format": "text", "type": [ "string", "null" ], "readOnly": true }, "entity": { "description": "Embedded entity", "oneOf": [ { "$ref": "#/$defs/entity_response" }, { "type": "null" } ], "nullable": true }, "party": { "description": "Embedded party", "oneOf": [ { "$ref": "#/$defs/party_response" }, { "type": "null" } ], "nullable": true } }, "required": [ "id", "entity_id", "entity_name" ] }, "metering_grid_area_business_id_type": { "description": "The type of the business identifier.", "format": "text", "type": "string", "readOnly": true, "enum": [ "eic_y" ] }, "metering_grid_area_response": { "summary": "Response - Metering Grid Area", "description": "Response schema - Metering grid area to which accounting points belong.", "type": "object", "properties": { "id": { "description": "Unique surrogate identifier.", "format": "bigint", "type": "integer", "readOnly": true }, "business_id": { "description": "The business identifier of the metering grid area. Format depends on `business_id_type`.", "format": "text", "type": "string", "readOnly": true }, "business_id_type": { "$ref": "#/$defs/metering_grid_area_business_id_type", "readOnly": true }, "name": { "description": "The name of the metering grid area.", "format": "text", "type": "string", "maxLength": 128, "readOnly": true }, "status": { "$ref": "#/$defs/metering_grid_area_status", "readOnly": true }, "accounting_point_metering_grid_area": { "description": "Embedded accounting_point_metering_grid_area", "oneOf": [ { "type": "array", "items": { "$ref": "#/$defs/accounting_point_metering_grid_area_response" } }, { "type": "null" } ], "nullable": true } }, "required": [ "id", "business_id", "business_id_type", "name", "status" ] }, "metering_grid_area_status": { "description": "The status of the metering grid area.", "format": "text", "type": "string", "readOnly": true, "enum": [ "active", "inactive" ] }, "numeric_aggregation": { "type": "object", "properties": { "sum": { "type": "number" }, "average": { "type": "number" }, "min": { "type": "number" }, "max": { "type": "number" } }, "additionalProperties": false }, "party_business_id_type": { "description": "The type of the business identifier.", "format": "text", "type": "string", "default": "uuid", "enum": [ "gln", "uuid", "eic_x", "org" ] }, "party_membership_response": { "summary": "Response - Party Membership", "description": "Response schema - The relation between a party and entity.", "type": "object", "properties": { "id": { "description": "Unique surrogate identifier.", "format": "bigint", "type": "integer", "readOnly": true }, "party_id": { "description": "Reference to the party that the membership links to an entity.", "format": "bigint", "type": "integer" }, "entity_id": { "description": "Reference to the entity that the party represents.", "format": "bigint", "type": "integer" }, "scopes": { "description": "List of scopes granted to the entity when it acts as the party. Scopes are inspired from OAuth 2.0 and allow refinement of access control and privilege delegation mechanisms.", "type": "array", "items": { "$ref": "#/$defs/auth_scope" }, "nullable": false }, "recorded_at": { "description": "When the resource was recorded (created or updated) in the system.", "format": "date-time", "type": "string", "readOnly": true }, "recorded_by": { "description": "The identity that recorded the resource.", "format": "bigint", "type": "integer", "readOnly": true }, "party": { "description": "Embedded party", "oneOf": [ { "$ref": "#/$defs/party_response" }, { "type": "null" } ], "nullable": true }, "entity": { "description": "Embedded entity", "oneOf": [ { "$ref": "#/$defs/entity_response" }, { "type": "null" } ], "nullable": true } }, "required": [ "id", "party_id", "entity_id", "scopes", "recorded_at", "recorded_by" ] }, "party_response": { "summary": "Response - Party", "description": "Response schema - The body that interacts with the Flexibility Information System\n\nA party is the thing that is authorized to access or modify data in the Flexiblity Information System.\n\nExample party types:\n\n* Service Provider\n* System Operator\n* End User", "type": "object", "properties": { "id": { "description": "Unique surrogate identifier.", "format": "bigint", "type": "integer", "readOnly": true }, "business_id": { "description": "The business identifier of the party. Format depends on `business_id_type`.", "format": "text", "type": "string" }, "business_id_type": { "$ref": "#/$defs/party_business_id_type", "default": "uuid" }, "entity_id": { "description": "Reference to the entity that is the parent of the party.", "format": "bigint", "type": "integer" }, "name": { "description": "Name of the party. Maximum 128 characters.", "format": "text", "type": "string" }, "role": { "$ref": "#/$defs/party_role" }, "type": { "$ref": "#/$defs/party_type" }, "status": { "$ref": "#/$defs/party_status", "default": "new" }, "recorded_at": { "description": "When the resource was recorded (created or updated) in the system.", "format": "date-time", "type": "string", "readOnly": true }, "recorded_by": { "description": "The identity that recorded the resource.", "format": "bigint", "type": "integer", "readOnly": true }, "entity": { "description": "Embedded entity", "oneOf": [ { "$ref": "#/$defs/entity_response" }, { "type": "null" } ], "nullable": true } }, "required": [ "id", "business_id", "business_id_type", "entity_id", "name", "role", "type", "status", "recorded_at", "recorded_by" ] }, "party_role": { "description": "The role of the party. Currently maps to 1:1 to `type`. E.g. system_operator, service_provider.", "format": "text", "type": "string", "enum": [ "flex_balance_responsible_party", "flex_end_user", "flex_energy_supplier", "flex_flexibility_information_system_operator", "flex_market_operator", "flex_organisation", "flex_service_provider", "flex_system_operator", "flex_third_party" ] }, "party_status": { "description": "The status of the party.", "format": "text", "type": "string", "default": "new", "enum": [ "new", "active", "inactive", "suspended", "terminated" ] }, "party_type": { "description": "The type of the party, e.g SystemOperator, ServiceProvider", "format": "text", "type": "string", "enum": [ "balance_responsible_party", "end_user", "energy_supplier", "flexibility_information_system_operator", "market_operator", "organisation", "service_provider", "system_operator", "third_party" ] }, "service_providing_group_bidding_zone": { "description": "The bidding zone that restricts which CUs that can be added to the group. Also known as scheduling area or price area for TSO.", "format": "text", "type": "string", "enum": [ "NO1", "NO2", "NO3", "NO4", "NO5" ] }, "service_providing_group_grid_prequalification_comment_response": { "summary": "Response - Grid prequalification for service providing group Comment", "description": "Response schema - Comment made by a party involved in a service providing group grid prequalification.", "type": "object", "properties": { "id": { "description": "Unique surrogate identifier.", "format": "bigint", "type": "integer", "readOnly": true }, "service_providing_group_grid_prequalification_id": { "description": "Reference to the service providing group grid prequalification.", "format": "bigint", "type": "integer" }, "created_by": { "description": "Reference to the identity that created the comment.", "format": "bigint", "type": "integer", "readOnly": true }, "created_at": { "description": "When the comment was added to the SPGGP.", "format": "date-time", "type": "string", "readOnly": true }, "visibility": { "$ref": "#/$defs/service_providing_group_grid_prequalification_comment_visibility", "default": "same_party" }, "content": { "description": "Free text content of the comment.", "format": "text", "type": "string", "maxLength": 2048 }, "recorded_at": { "description": "When the resource was recorded (created or updated) in the system.", "format": "date-time", "type": "string", "readOnly": true }, "recorded_by": { "description": "The identity that recorded the resource.", "format": "bigint", "type": "integer", "readOnly": true }, "service_providing_group_grid_prequalification": { "description": "Embedded service_providing_group_grid_prequalification", "oneOf": [ { "$ref": "#/$defs/service_providing_group_grid_prequalification_response" }, { "type": "null" } ], "nullable": true } }, "required": [ "id", "service_providing_group_grid_prequalification_id", "created_by", "created_at", "visibility", "content", "recorded_at", "recorded_by" ] }, "service_providing_group_grid_prequalification_comment_visibility": { "description": "The level of visibility of the comment.", "format": "text", "type": "string", "default": "same_party", "enum": [ "same_party", "any_involved_party" ] }, "service_providing_group_grid_prequalification_response": { "summary": "Response - Grid prequalification for service providing group", "description": "Response schema - Grid prequalification for service providing group", "type": "object", "properties": { "id": { "description": "Unique surrogate key.", "format": "bigint", "type": "integer", "readOnly": true }, "service_providing_group_id": { "description": "Reference to the service providing group whose grid prequalification is tracked by the current resource.", "format": "bigint", "type": "integer" }, "impacted_system_operator_id": { "description": "Reference to the `party` that is the impacted system operator.", "format": "bigint", "type": "integer" }, "status": { "$ref": "#/$defs/service_providing_group_grid_prequalification_status", "default": "requested" }, "prequalified_at": { "description": "When the current grid prequalification was last approved.", "format": "date-time", "type": [ "string", "null" ] }, "recorded_at": { "description": "When the resource was recorded (created or updated) in the system.", "format": "date-time", "type": "string", "readOnly": true }, "recorded_by": { "description": "The identity that recorded the resource.", "format": "bigint", "type": "integer", "readOnly": true }, "service_providing_group": { "description": "Embedded service_providing_group", "oneOf": [ { "$ref": "#/$defs/service_providing_group_response" }, { "type": "null" } ], "nullable": true }, "impacted_system_operator": { "description": "Embedded party", "oneOf": [ { "$ref": "#/$defs/party_response" }, { "type": "null" } ], "nullable": true }, "comment": { "description": "Embedded service_providing_group_grid_prequalification_comment", "oneOf": [ { "type": "array", "items": { "$ref": "#/$defs/service_providing_group_grid_prequalification_comment_response" } }, { "type": "null" } ], "nullable": true } }, "required": [ "id", "service_providing_group_id", "impacted_system_operator_id", "status", "recorded_at", "recorded_by" ] }, "service_providing_group_grid_prequalification_status": { "description": "The status of the grid prequalification for this service providing group.", "format": "text", "type": "string", "default": "requested", "enum": [ "requested", "in_progress", "conditionally_approved", "approved", "not_approved" ] }, "service_providing_group_grid_suspension_comment_response": { "summary": "Response - Service Providing Group Grid Suspension Comment", "description": "Response schema - Comment made by a party involved in a service providing group grid suspension.", "type": "object", "properties": { "id": { "description": "Unique surrogate identifier.", "format": "bigint", "type": "integer", "readOnly": true }, "service_providing_group_grid_suspension_id": { "description": "Reference to the service providing group grid suspension.", "format": "bigint", "type": "integer" }, "created_by": { "description": "Reference to the identity that created the comment.", "format": "bigint", "type": "integer", "readOnly": true }, "created_at": { "description": "When the comment was added to the SPGGS.", "format": "date-time", "type": "string", "readOnly": true }, "visibility": { "$ref": "#/$defs/service_providing_group_grid_suspension_comment_visibility", "default": "same_party" }, "content": { "description": "Free text content of the comment.", "format": "text", "type": "string", "maxLength": 2048 }, "recorded_at": { "description": "When the resource was recorded (created or updated) in the system.", "format": "date-time", "type": "string", "readOnly": true }, "recorded_by": { "description": "The identity that recorded the resource.", "format": "bigint", "type": "integer", "readOnly": true }, "service_providing_group_grid_suspension": { "description": "Embedded service_providing_group_grid_suspension", "oneOf": [ { "$ref": "#/$defs/service_providing_group_grid_suspension_response" }, { "type": "null" } ], "nullable": true } }, "required": [ "id", "service_providing_group_grid_suspension_id", "created_by", "created_at", "visibility", "content", "recorded_at", "recorded_by" ] }, "service_providing_group_grid_suspension_comment_visibility": { "description": "The level of visibility of the comment.", "format": "text", "type": "string", "default": "same_party", "enum": [ "same_party", "any_involved_party" ] }, "service_providing_group_grid_suspension_reason": { "description": "The reason for the suspension.", "format": "text", "type": "string", "enum": [ "breach_of_conditions", "significant_group_change", "other" ] }, "service_providing_group_grid_suspension_response": { "summary": "Response - Service Providing Group Grid Suspension", "description": "Response schema - The relation allowing an impacted system operator to temporarily suspend a service providing group from delivering services.", "type": "object", "properties": { "id": { "description": "Unique surrogate identifier.", "format": "bigint", "type": "integer", "readOnly": true }, "impacted_system_operator_id": { "description": "Reference to the impacted system operator suspending the service providing group.", "format": "bigint", "type": "integer" }, "service_providing_group_id": { "description": "Reference to the service providing group being suspended.", "format": "bigint", "type": "integer" }, "reason": { "$ref": "#/$defs/service_providing_group_grid_suspension_reason" }, "recorded_at": { "description": "When the resource was recorded (created or updated) in the system.", "format": "date-time", "type": "string", "readOnly": true }, "recorded_by": { "description": "The identity that recorded the resource.", "format": "bigint", "type": "integer", "readOnly": true }, "impacted_system_operator": { "description": "Embedded party", "oneOf": [ { "$ref": "#/$defs/party_response" }, { "type": "null" } ], "nullable": true }, "service_providing_group": { "description": "Embedded service_providing_group", "oneOf": [ { "$ref": "#/$defs/service_providing_group_response" }, { "type": "null" } ], "nullable": true }, "comment": { "description": "Embedded service_providing_group_grid_suspension_comment", "oneOf": [ { "type": "array", "items": { "$ref": "#/$defs/service_providing_group_grid_suspension_comment_response" } }, { "type": "null" } ], "nullable": true } }, "required": [ "id", "impacted_system_operator_id", "service_providing_group_id", "reason", "recorded_at", "recorded_by" ] }, "service_providing_group_membership_response": { "summary": "Response - Membership relation of controllable unit in service providing group", "description": "Response schema - Membership relation of controllable unit in service providing group", "type": "object", "properties": { "id": { "description": "Unique surrogate key.", "format": "bigint", "type": "integer", "readOnly": true }, "controllable_unit_id": { "description": "Reference to the controllable unit this relation links to a service providing group.", "format": "bigint", "type": "integer" }, "service_providing_group_id": { "description": "Reference to the service providing group this relation links to a controllable unit.", "format": "bigint", "type": "integer" }, "valid_from": { "description": "The date from which the relation between the controllable unit and the service providing group is valid. Midnight aligned on Norwegian timezone.", "format": "date-time", "type": "string" }, "valid_to": { "description": "The date until which the relation between the controllable unit and the service providing group is valid. Midnight aligned on Norwegian timezone.", "format": "date-time", "type": [ "string", "null" ] }, "recorded_at": { "description": "When the resource was recorded (created or updated) in the system.", "format": "date-time", "type": "string", "readOnly": true }, "recorded_by": { "description": "The identity that recorded the resource.", "format": "bigint", "type": "integer", "readOnly": true }, "controllable_unit": { "description": "Embedded controllable_unit", "oneOf": [ { "$ref": "#/$defs/controllable_unit_response" }, { "type": "null" } ], "nullable": true }, "service_providing_group": { "description": "Embedded service_providing_group", "oneOf": [ { "$ref": "#/$defs/service_providing_group_response" }, { "type": "null" } ], "nullable": true } }, "required": [ "id", "controllable_unit_id", "service_providing_group_id", "valid_from", "recorded_at", "recorded_by" ] }, "service_providing_group_power_per_substation_response": { "summary": "Response - Service Providing Group Power Per Substation", "description": "Response schema - Per-substation breakdown of controllable units and their technical details for a service providing group.", "type": "object", "properties": { "id": { "description": "Unique surrogate key (service providing group ID).", "format": "bigint", "type": "integer", "readOnly": true }, "service_providing_group_id": { "description": "The ID of the service providing group this resource is a breakdown of.", "format": "bigint", "type": "integer", "readOnly": true }, "substations": { "description": "List of per-substation aggregates for the controllable units currently in the service providing group. Each element contains the substation identifier and name, plus controllable unit and technical resource aggregates. An element with null substation fields groups controllable units whose grid location has not yet been assigned.", "type": "array", "readOnly": true, "items": { "type": "object", "properties": { "substation_business_id": { "type": [ "string", "null" ] }, "substation_name": { "type": [ "string", "null" ] }, "controllable_unit": { "type": "object", "properties": { "count": { "type": "integer" }, "maximum_active_power": { "$ref": "#/$defs/numeric_aggregation" } } }, "technical_resource": { "type": "object", "properties": { "count": { "type": "integer" }, "maximum_active_power": { "$ref": "#/$defs/numeric_aggregation" } } } } } }, "service_providing_group": { "description": "Embedded service_providing_group", "oneOf": [ { "$ref": "#/$defs/service_providing_group_response" }, { "type": "null" } ], "nullable": true } }, "required": [ "id", "service_providing_group_id", "substations" ] }, "service_providing_group_product_application_attachment_content_type": { "description": "MIME type of the attachment.", "format": "text", "type": "string", "enum": [ "application/pdf", "image/jpeg", "image/png" ] }, "service_providing_group_product_application_attachment_response": { "summary": "Response - Service Providing Group Product Application Attachment", "description": "Response schema - File attachment associated with a service providing group product application, allowing involved parties to exchange supporting documents.", "type": "object", "properties": { "id": { "description": "Unique surrogate identifier.", "format": "bigint", "type": "integer", "readOnly": true }, "service_providing_group_product_application_id": { "description": "Reference to the service providing group product application.", "format": "bigint", "type": "integer" }, "object_id": { "description": "Identifier of the object to which the attachment is linked.", "format": "text", "type": "string" }, "filename": { "description": "Original filename of the attachment.", "format": "text", "type": "string" }, "filename_sanitised": { "description": "Sanitised filename safe for storage.", "format": "text", "type": "string" }, "content_type": { "$ref": "#/$defs/service_providing_group_product_application_attachment_content_type" }, "size_bytes": { "description": "Size of the attachment in bytes.", "format": "bigint", "type": "integer" }, "recorded_at": { "description": "When the resource was recorded (created or updated) in the system.", "format": "date-time", "type": "string", "readOnly": true }, "recorded_by": { "description": "The identity that recorded the resource.", "format": "bigint", "type": "integer", "readOnly": true }, "service_providing_group_product_application": { "description": "Embedded service_providing_group_product_application", "oneOf": [ { "$ref": "#/$defs/service_providing_group_product_application_response" }, { "type": "null" } ], "nullable": true } }, "required": [ "id", "service_providing_group_product_application_id", "object_id", "filename", "filename_sanitised", "content_type", "size_bytes", "recorded_at", "recorded_by" ] }, "service_providing_group_product_application_comment_response": { "summary": "Response - Service Providing Group Product Application Comment", "description": "Response schema - Comment made by a party involved in a service providing group product application.", "type": "object", "properties": { "id": { "description": "Unique surrogate identifier.", "format": "bigint", "type": "integer", "readOnly": true }, "service_providing_group_product_application_id": { "description": "Reference to the service providing group product application.", "format": "bigint", "type": "integer" }, "created_by": { "description": "Reference to the identity that created the comment.", "format": "bigint", "type": "integer", "readOnly": true }, "created_at": { "description": "When the comment was added to the SPGPA.", "format": "date-time", "type": "string", "readOnly": true }, "visibility": { "$ref": "#/$defs/service_providing_group_product_application_comment_visibility", "default": "same_party" }, "content": { "description": "Free text content of the comment.", "format": "text", "type": "string", "maxLength": 2048 }, "recorded_at": { "description": "When the resource was recorded (created or updated) in the system.", "format": "date-time", "type": "string", "readOnly": true }, "recorded_by": { "description": "The identity that recorded the resource.", "format": "bigint", "type": "integer", "readOnly": true }, "service_providing_group_product_application": { "description": "Embedded service_providing_group_product_application", "oneOf": [ { "$ref": "#/$defs/service_providing_group_product_application_response" }, { "type": "null" } ], "nullable": true } }, "required": [ "id", "service_providing_group_product_application_id", "created_by", "created_at", "visibility", "content", "recorded_at", "recorded_by" ] }, "service_providing_group_product_application_comment_visibility": { "description": "The level of visibility of the comment.", "format": "text", "type": "string", "default": "same_party", "enum": [ "same_party", "any_involved_party" ] }, "service_providing_group_product_application_ramping_capability": { "description": "Whether the service providing group can ramp in accordance with the product requirements during both activation and deactivation.", "format": "text", "type": [ "string", "null" ], "enum": [ "always", "partial", "never" ] }, "service_providing_group_product_application_response": { "summary": "Response - Service Providing Group Product Application", "description": "Response schema - Relation between a service providing group and a system operator for a product type, for the SPG to deliver a product to the SO later.", "type": "object", "properties": { "id": { "description": "Unique surrogate identifier.", "format": "bigint", "type": "integer", "readOnly": true }, "service_providing_group_id": { "description": "Reference to the service providing group.", "format": "bigint", "type": "integer" }, "procuring_system_operator_id": { "description": "Reference to the procuring system operator.", "format": "bigint", "type": "integer" }, "product_type_ids": { "description": "References to the product types.", "type": "array", "items": { "format": "bigint", "type": "integer" } }, "status": { "$ref": "#/$defs/service_providing_group_product_application_status", "default": "requested" }, "maximum_active_power_up": { "description": "The maximum active power applied for in regulation direction up. Stored in kilowatts.", "format": "decimal", "type": "number", "minimum": 0, "maximum": 999999.999, "multipleOf": 0.001 }, "maximum_active_power_down": { "description": "The maximum active power applied for in regulation direction down. Stored in kilowatts.", "format": "decimal", "type": "number", "minimum": 0, "maximum": 999999.999, "multipleOf": 0.001 }, "additional_information": { "description": "Free text field for extra information about the application if needed (bidding periods, unavailabilities, etc).", "format": "text", "type": [ "string", "null" ], "maxLength": 512 }, "prequalified_at": { "description": "When the product application was last prequalified.", "format": "date-time", "type": [ "string", "null" ] }, "verified_at": { "description": "When the product application was last verified.", "format": "date-time", "type": [ "string", "null" ] }, "ramping_capability": { "oneOf": [ { "$ref": "#/$defs/service_providing_group_product_application_ramping_capability" }, { "type": "null" } ], "nullable": true }, "ramping_description": { "description": "Free text description of ramping details. Only required for product Manual Frequency Restoration (mFRR).", "format": "text", "type": [ "string", "null" ] }, "created_at": { "description": "When the application was first created.", "format": "date-time", "type": "string", "readOnly": true }, "complete_at": { "description": "When the application was last marked complete by the procuring system operator.", "format": "date-time", "type": [ "string", "null" ] }, "recorded_at": { "description": "When the resource was recorded (created or updated) in the system.", "format": "date-time", "type": "string", "readOnly": true }, "recorded_by": { "description": "The identity that recorded the resource.", "format": "bigint", "type": "integer", "readOnly": true }, "service_providing_group": { "description": "Embedded service_providing_group", "oneOf": [ { "$ref": "#/$defs/service_providing_group_response" }, { "type": "null" } ], "nullable": true }, "procuring_system_operator": { "description": "Embedded party", "oneOf": [ { "$ref": "#/$defs/party_response" }, { "type": "null" } ], "nullable": true }, "attachment": { "description": "Embedded service_providing_group_product_application_attachment", "oneOf": [ { "type": "array", "items": { "$ref": "#/$defs/service_providing_group_product_application_attachment_response" } }, { "type": "null" } ], "nullable": true }, "comment": { "description": "Embedded service_providing_group_product_application_comment", "oneOf": [ { "type": "array", "items": { "$ref": "#/$defs/service_providing_group_product_application_comment_response" } }, { "type": "null" } ], "nullable": true } }, "required": [ "id", "service_providing_group_id", "procuring_system_operator_id", "product_type_ids", "status", "maximum_active_power_up", "maximum_active_power_down", "created_at", "recorded_at", "recorded_by" ] }, "service_providing_group_product_application_status": { "description": "The status of the application.", "format": "text", "type": "string", "default": "requested", "enum": [ "requested", "prequalification", "temporary_qualified", "prequalified", "verified", "rejected" ] }, "service_providing_group_product_suspension_comment_response": { "summary": "Response - Service Providing Group Product Suspension Comment", "description": "Response schema - Comment made by a party involved in a service providing group product suspension.", "type": "object", "properties": { "id": { "description": "Unique surrogate identifier.", "format": "bigint", "type": "integer", "readOnly": true }, "service_providing_group_product_suspension_id": { "description": "Reference to the service providing group product suspension.", "format": "bigint", "type": "integer" }, "created_by": { "description": "Reference to the identity that created the comment.", "format": "bigint", "type": "integer", "readOnly": true }, "created_at": { "description": "When the comment was added to the SPGPS.", "format": "date-time", "type": "string", "readOnly": true }, "visibility": { "$ref": "#/$defs/service_providing_group_product_suspension_comment_visibility", "default": "same_party" }, "content": { "description": "Free text content of the comment.", "format": "text", "type": "string", "maxLength": 2048 }, "recorded_at": { "description": "When the resource was recorded (created or updated) in the system.", "format": "date-time", "type": "string", "readOnly": true }, "recorded_by": { "description": "The identity that recorded the resource.", "format": "bigint", "type": "integer", "readOnly": true }, "service_providing_group_product_suspension": { "description": "Embedded service_providing_group_product_suspension", "oneOf": [ { "$ref": "#/$defs/service_providing_group_product_suspension_response" }, { "type": "null" } ], "nullable": true } }, "required": [ "id", "service_providing_group_product_suspension_id", "created_by", "created_at", "visibility", "content", "recorded_at", "recorded_by" ] }, "service_providing_group_product_suspension_comment_visibility": { "description": "The level of visibility of the comment.", "format": "text", "type": "string", "default": "same_party", "enum": [ "same_party", "any_involved_party" ] }, "service_providing_group_product_suspension_reason": { "description": "The reason for the suspension.", "format": "text", "type": "string", "enum": [ "failed_verification", "other" ] }, "service_providing_group_product_suspension_response": { "summary": "Response - Service Providing Group Product Suspension", "description": "Response schema - The relation allowing a procuring system operator to temporarily suspend a service providing group from delivering products of certain types.", "type": "object", "properties": { "id": { "description": "Unique surrogate identifier.", "format": "bigint", "type": "integer", "readOnly": true }, "procuring_system_operator_id": { "description": "Reference to the procuring system operator suspending the service providing group.", "format": "bigint", "type": "integer" }, "service_providing_group_id": { "description": "Reference to the service providing group being suspended.", "format": "bigint", "type": "integer" }, "product_type_ids": { "description": "References to the suspended product types.", "type": "array", "items": { "format": "bigint", "type": "integer" } }, "reason": { "$ref": "#/$defs/service_providing_group_product_suspension_reason" }, "recorded_at": { "description": "When the resource was recorded (created or updated) in the system.", "format": "date-time", "type": "string", "readOnly": true }, "recorded_by": { "description": "The identity that recorded the resource.", "format": "bigint", "type": "integer", "readOnly": true }, "procuring_system_operator": { "description": "Embedded party", "oneOf": [ { "$ref": "#/$defs/party_response" }, { "type": "null" } ], "nullable": true }, "service_providing_group": { "description": "Embedded service_providing_group", "oneOf": [ { "$ref": "#/$defs/service_providing_group_response" }, { "type": "null" } ], "nullable": true }, "comment": { "description": "Embedded service_providing_group_product_suspension_comment", "oneOf": [ { "type": "array", "items": { "$ref": "#/$defs/service_providing_group_product_suspension_comment_response" } }, { "type": "null" } ], "nullable": true } }, "required": [ "id", "procuring_system_operator_id", "service_providing_group_id", "product_type_ids", "reason", "recorded_at", "recorded_by" ] }, "service_providing_group_response": { "summary": "Response - Service providing group", "description": "Response schema - Group of controllable units", "type": "object", "properties": { "id": { "description": "Unique surrogate key.", "format": "bigint", "type": "integer", "readOnly": true }, "name": { "description": "Free text name of the service providing group.", "format": "text", "type": "string", "maxLength": 128 }, "service_provider_id": { "description": "Reference to the `party` (service provider) managing the group.", "format": "bigint", "type": "integer" }, "bidding_zone": { "$ref": "#/$defs/service_providing_group_bidding_zone" }, "status": { "$ref": "#/$defs/service_providing_group_status", "default": "new" }, "additional_information": { "description": "Free text field for extra information about the service providing group if needed.", "format": "text", "type": [ "string", "null" ] }, "created_at": { "description": "When the service providing group was first created.", "format": "date-time", "type": "string", "readOnly": true }, "recorded_at": { "description": "When the resource was recorded (created or updated) in the system.", "format": "date-time", "type": "string", "readOnly": true }, "recorded_by": { "description": "The identity that recorded the resource.", "format": "bigint", "type": "integer", "readOnly": true }, "power_per_substation": { "description": "Embedded service_providing_group_power_per_substation", "oneOf": [ { "$ref": "#/$defs/service_providing_group_power_per_substation_response" }, { "type": "null" } ], "nullable": true }, "summary": { "description": "Embedded service_providing_group_summary", "oneOf": [ { "$ref": "#/$defs/service_providing_group_summary_response" }, { "type": "null" } ], "nullable": true }, "service_provider": { "description": "Embedded party", "oneOf": [ { "$ref": "#/$defs/party_response" }, { "type": "null" } ], "nullable": true }, "membership": { "description": "Embedded service_providing_group_membership", "oneOf": [ { "type": "array", "items": { "$ref": "#/$defs/service_providing_group_membership_response" } }, { "type": "null" } ], "nullable": true }, "grid_prequalification": { "description": "Embedded service_providing_group_grid_prequalification", "oneOf": [ { "type": "array", "items": { "$ref": "#/$defs/service_providing_group_grid_prequalification_response" } }, { "type": "null" } ], "nullable": true }, "grid_suspension": { "description": "Embedded service_providing_group_grid_suspension", "oneOf": [ { "type": "array", "items": { "$ref": "#/$defs/service_providing_group_grid_suspension_response" } }, { "type": "null" } ], "nullable": true }, "product_application": { "description": "Embedded service_providing_group_product_application", "oneOf": [ { "type": "array", "items": { "$ref": "#/$defs/service_providing_group_product_application_response" } }, { "type": "null" } ], "nullable": true }, "product_suspension": { "description": "Embedded service_providing_group_product_suspension", "oneOf": [ { "type": "array", "items": { "$ref": "#/$defs/service_providing_group_product_suspension_response" } }, { "type": "null" } ], "nullable": true } }, "required": [ "id", "name", "service_provider_id", "bidding_zone", "status", "created_at", "recorded_at", "recorded_by" ] }, "service_providing_group_status": { "description": "The status of the group.", "format": "text", "type": "string", "default": "new", "enum": [ "new", "active", "inactive", "terminated" ] }, "service_providing_group_summary_response": { "summary": "Response - Service Providing Group Summary", "description": "Response schema - Aggregated summary of controllable units and technical resources belonging to a service providing group.", "type": "object", "properties": { "id": { "description": "Unique surrogate key (service providing group ID).", "format": "bigint", "type": "integer", "readOnly": true }, "service_providing_group_id": { "description": "The ID of the service providing group this resource is a summary of.", "format": "bigint", "type": "integer", "readOnly": true }, "controllable_unit": { "description": "Aggregated statistics on controllable units currently in the service providing group, including count and maximum active power information (sum, average, min, max).", "type": "object", "readOnly": true, "properties": { "count": { "type": "integer" }, "maximum_active_power": { "$ref": "#/$defs/numeric_aggregation" }, "maximum_active_power_up": { "description": "Maximum active power aggregated over controllable units with regulation_direction equal to up or both.", "$ref": "#/$defs/numeric_aggregation" }, "maximum_active_power_down": { "description": "Maximum active power aggregated over controllable units with regulation_direction equal to down or both.", "$ref": "#/$defs/numeric_aggregation" } } }, "technical_resource": { "description": "Aggregated statistics on technical resources belonging to controllable units with active membership in the service providing group, including counts and maximum active power breakdowns (sum, average, min, max) by category and technology.", "type": "object", "readOnly": true, "properties": { "count": { "type": "integer" }, "maximum_active_power": { "$ref": "#/$defs/numeric_aggregation" }, "by_category": { "type": "object", "propertyNames": { "$ref": "#/$defs/category" }, "additionalProperties": { "type": "object", "properties": { "count": { "type": "integer" }, "maximum_active_power": { "$ref": "#/$defs/numeric_aggregation" } } } }, "by_technology": { "type": "object", "propertyNames": { "$ref": "#/$defs/technology" }, "additionalProperties": { "type": "object", "properties": { "count": { "type": "integer" }, "maximum_active_power": { "$ref": "#/$defs/numeric_aggregation" } } } } } }, "service_providing_group": { "description": "Embedded service_providing_group", "oneOf": [ { "$ref": "#/$defs/service_providing_group_response" }, { "type": "null" } ], "nullable": true } }, "required": [ "id", "service_providing_group_id", "controllable_unit", "technical_resource" ] }, "technical_resource_business_id_type": { "description": "The type of business identifier used for the device.", "format": "text", "type": [ "string", "null" ], "enum": [ "serial_number", "mac", "other" ] }, "technical_resource_response": { "summary": "Response - Technical Resource", "description": "Response schema - Technical unit being part of a controllable unit.", "type": "object", "properties": { "id": { "description": "Unique surrogate identifier.", "format": "bigint", "type": "integer", "readOnly": true }, "name": { "description": "Name of the technical resource. Maximum 128 characters.", "format": "text", "type": "string" }, "controllable_unit_id": { "description": "Reference to the controllable unit that this technical resource belongs to.", "format": "bigint", "type": "integer" }, "technology": { "description": "Technologies of the technical resource. Multiple technologies can be given, e.g. solar and battery for hybrid inverters.", "type": "array", "items": { "$ref": "#/$defs/technology" }, "minItems": 1 }, "category": { "description": "Categories derived from the technologies of the technical resource. Automatically computed based on the selected technologies.", "type": "array", "items": { "$ref": "#/$defs/category" }, "readOnly": true }, "maximum_active_power": { "description": "Rated power in kilowatts. This is the maximum nominal continuous power of the device, typically defined by the manufacturer.", "format": "decimal", "type": "number", "minimum": 0, "maximum": 999999.999, "nullable": false, "multipleOf": 0.001 }, "device_type": { "description": "The type of device.", "allOf": [ { "$ref": "#/$defs/device_type" } ], "nullable": false }, "make": { "description": "The manufacturer of the device. Required if model or business id is provided.", "format": "text", "type": [ "string", "null" ], "maxLength": 128 }, "model": { "description": "The model of the device.", "format": "text", "type": [ "string", "null" ], "maxLength": 128 }, "business_id": { "description": "Business identifier of the device, such as a serial number or MAC address.", "format": "text", "type": [ "string", "null" ], "maxLength": 256 }, "business_id_type": { "oneOf": [ { "$ref": "#/$defs/technical_resource_business_id_type" }, { "type": "null" } ], "nullable": true }, "additional_information": { "description": "Free text field for extra information about the technical resource if needed.", "format": "text", "type": [ "string", "null" ] }, "recorded_at": { "description": "When the resource was recorded (created or updated) in the system.", "format": "date-time", "type": "string", "readOnly": true }, "recorded_by": { "description": "The identity that recorded the resource.", "format": "bigint", "type": "integer", "readOnly": true }, "controllable_unit": { "description": "Embedded controllable_unit", "oneOf": [ { "$ref": "#/$defs/controllable_unit_response" }, { "type": "null" } ], "nullable": true } }, "required": [ "id", "name", "controllable_unit_id", "technology", "category", "maximum_active_power", "device_type", "recorded_at", "recorded_by" ] }, "technology": { "description": "Technology classification using ltree path notation. Technologies are hierarchical (e.g., hydropower.pumped, hvac.heat_pump). Use the most specific technology applicable to the technical resource.", "format": "text", "type": "string", "enum": [ "hydropower", "hydropower.pumped", "hydropower.run_of_river", "heat_power_plant", "heat_power_plant.chp", "solar", "wind", "backup_generator", "hvac", "hvac.heat", "hvac.heat_pump", "lighting", "water_heater", "boiler", "ev_charging_device", "ev_charging_device.v2g", "battery", "other.consumption", "other.production", "other.energy_storage" ] } } }