openapi: 3.2.0 info: description: MISO Public Specification to support Market System Enhancement (MSE) new Market User Interface (MUI 2.0). title: MUI - Public Specification Bidding API contact: name: MUI 2.0 Questions url: https://www.misoenergy.org/markets-and-operations/MSE/market-user-interface/ email: MSEQuestions@misoenergy.org license: name: For use by MISO member companies and thier vendors version: 3.3.0 servers: - url: https://cce.midwestiso.org/dart2/ - url: https://markets.midwestiso.org/dart2/ tags: - name: Bidding paths: /markets/day-ahead/{day}/demand/participants/{participantName}: description: Submit and return demand bids for use in the Day-Ahead market. A collection of either fixed or price sensitive demand bids for one or more pnode locations. parameters: - $ref: '#/components/parameters/x-acting-participant' get: tags: - Bidding description: Returns the collection of Price Sensitive and Fixed Demand Bids by pnode location for the day. Pnode or portfolio query parameters may be provided, otherwise all valid demand bid locations for the participant will be returned for which bids exist. operationId: getDemandBid parameters: - $ref: '#/components/parameters/MarketOperatingDay' - $ref: '#/components/parameters/Participant' - $ref: '#/components/parameters/Pnode' - $ref: '#/components/parameters/Portfolio' responses: '200': description: Successful operation. content: application/json: schema: $ref: '#/components/schemas/DemandBids' headers: http-x-request-id: $ref: '#/components/headers/http-x-request-id' '400': $ref: '#/components/responses/BadRequestApiResponse' '403': $ref: '#/components/responses/UnauthorizedApiResponse' '404': $ref: '#/components/responses/NotFoundApiResponse' '500': $ref: '#/components/responses/InternalErrorApiResponse' post: tags: - Bidding description: Post the collection of Fixed and Price Sensitve Demand Bids. Fixed and Price Sensitive Demand bids can be updated individually for one or more pnode locations. Data driven delete behaviour is supported via the incusion of null elements. operationId: postDemandBids parameters: - $ref: '#/components/parameters/MarketOperatingDay' - $ref: '#/components/parameters/Participant' responses: '200': $ref: '#/components/responses/OkApiResponse' '400': $ref: '#/components/responses/BadRequestApiResponse' '403': $ref: '#/components/responses/UnauthorizedApiResponse' '404': $ref: '#/components/responses/NotFoundApiResponse' '500': $ref: '#/components/responses/InternalErrorApiResponse' requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/DemandBids' /markets/day-ahead/{day}/virtual/participants/{participantName}: description: Submit and return virtual demand bids and virtual generations offers for use in the Day-Ahead market. A collection of either virtual generation offers or virtual demand bids per pnode location. Submission for one or more pnode locations is supported. parameters: - $ref: '#/components/parameters/x-acting-participant' get: tags: - Bidding description: Returns the collection of virtual dids and offers by pnode location for the day. Pnode or portfolio query parameters may be provided, otherwise all valid virtual locations will be returned for which participant bids/offers exist. operationId: getVirtualBidsAndOffers parameters: - $ref: '#/components/parameters/MarketOperatingDay' - $ref: '#/components/parameters/Participant' - $ref: '#/components/parameters/Pnode' - $ref: '#/components/parameters/Portfolio' responses: '200': description: Successful operation. content: application/json: schema: $ref: '#/components/schemas/VirtualBidsAndOffers' headers: http-x-request-id: $ref: '#/components/headers/http-x-request-id' '400': $ref: '#/components/responses/BadRequestApiResponse' '403': $ref: '#/components/responses/UnauthorizedApiResponse' '404': $ref: '#/components/responses/NotFoundApiResponse' '500': $ref: '#/components/responses/InternalErrorApiResponse' post: tags: - Bidding description: Post the collection of virtual demand bids and virtual generation offers. Submittal for a single or multiple pnode locations is supported. Data driven delete behaviour is supported via the incusion of null elements. operationId: postVirtualBidsAndOffers parameters: - $ref: '#/components/parameters/MarketOperatingDay' - $ref: '#/components/parameters/Participant' responses: '200': $ref: '#/components/responses/OkApiResponse' '400': $ref: '#/components/responses/BadRequestApiResponse' '403': $ref: '#/components/responses/UnauthorizedApiResponse' '404': $ref: '#/components/responses/NotFoundApiResponse' '500': $ref: '#/components/responses/InternalErrorApiResponse' requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/VirtualBidsAndOffers' components: schemas: MarketPrice: description: General type for all market prices. format: money type: number multipleOf: 0.01 minimum: -9999.99 maximum: 9999.99 example: 34.91 MarketOperatingDay: description: Effective Market operating day of data. RFC 3339. 'YYYY-MM-DD'. type: string format: date example: '2019-03-14' PNodeName: description: Commercial Pricing Node (PNode) name. type: string minLength: 1 maxLength: 30 example: PNODE1 VirtualBidsAndOffers: description: Collection of virtual generation offers and virtual demand bids for the market. type: object properties: day: $ref: '#/components/schemas/MarketOperatingDay' pnodes: description: Collection of pnodes. type: array minItems: 0 items: description: A resource can have virtual bids and/or virtual offers. Submitted null virtualBids or virtualOffers properties will delete the existing object. type: object additionalProperties: false minProperties: 2 maxProperties: 3 properties: pnodeName: $ref: '#/components/schemas/PNodeName' virtualBids: $ref: '#/components/schemas/VirtualBidOrOfferHourly' virtualOffers: $ref: '#/components/schemas/VirtualBidOrOfferHourly' required: - pnodeName required: - day - pnodes ParticipantName: description: Market participant name. type: string minLength: 1 maxLength: 40 example: MP APIResponse: description: General container for API response. type: object properties: action: description: A general action code summary of the result. HTTP status codes will be applied that match. These indicate the type of operation that was done (or not). Note, some APIs use REST verbiage like created/updated/deleted while others use submit/query. enum: - CREATED - UPDATED - DELETED - CREATE_FAILED - UPDATE_FAILED - DELETE_FAILED - GET_FAILED - SUBMITTED - SUBMIT_FAILED - QUERY - QUERY_FAILED responses: description: List of responses in case multiple resources are modified, or general errors that are not resource specific. type: array minItems: 0 items: description: A single response which may contain multiple messages, both error and warning, per response. type: object properties: messages: description: List of warnings and errors resulting from the command. type: array minItems: 0 items: description: An individual warning or error message. Designed to be either localized or categorized as an event. type: object properties: level: description: An indication of severity of the message. type: string enum: - ERROR - WARNING - INFO msgId: description: A categorized ID for this message, identifying it as a particular type of event. Useful for checking for specific errors, or localization. type: string params: description: Ordered list of parameter values for the message. type: array items: type: string userMsg: description: The message, fully rendered in the default locale on the service side. type: string transactionId: description: Unique identifier for the transaction which can be queried at a later date. Identifier is a GUID represented without hyphens. Only returned for submissions and errors though all calls generate a transaction ID that is returned in the http-x-request-id response header. type: string format: guid transactionTime: description: The time at which the transaction was received by the system. type: string format: date-time DemandBids: description: Collection of Demand Bids for the market. type: object properties: day: $ref: '#/components/schemas/MarketOperatingDay' pnodes: description: Collection of pnodes. type: array minItems: 0 items: description: A resource can have both fixedBids and/or pricesenstivieBids. Submitting null fixedBids or priceSensitiveBids properties will delete the existing object. type: object additionalProperties: false minProperties: 2 maxProperties: 3 properties: pnodeName: $ref: '#/components/schemas/PNodeName' fixedBids: description: Hourly fixed price demand bid. Submitted null MW values effectively deletes the bid for the hour. type: - array - 'null' minItems: 0 maxItems: 24 items: type: object additionalProperties: false properties: hour: $ref: '#/components/schemas/HourLabel' fixedMw: $ref: '#/components/schemas/RealEnergyNullable' required: - hour - fixedMw priceSensitiveBids: description: Price sensitive demand bid curves. type: - array - 'null' minItems: 0 maxItems: 24 items: description: Hourly price sensitive demand bid curve. type: object additionalProperties: false properties: hour: $ref: '#/components/schemas/HourLabel' demandBidSegments: description: Bid segements making up the demand bid curve. MW's and price cap. Sumbitted null array effectively deletes the bid for the hour. type: - array - 'null' items: type: object properties: price: $ref: '#/components/schemas/MarketPrice' mw: $ref: '#/components/schemas/RealEnergyNullable' required: - price - mw minItems: 0 maxItems: 9 required: - hour - demandBidSegments required: - pnodeName required: - day - pnodes VirtualBidOrOfferHourly: description: This object is used both virtual demand bids and virtual generation offers since the structure is the same. type: - array - 'null' items: description: Hourly bid or offer curve. type: object additionalProperties: false properties: hour: $ref: '#/components/schemas/HourLabel' virtualBidSegments: description: Segements making up the bid or offer curve. MW/price pairs. Sumbitted null array effectively deletes the curve for the hour. type: - array - 'null' items: type: object additionalProperties: false properties: price: $ref: '#/components/schemas/MarketPrice' mw: $ref: '#/components/schemas/RealEnergy' required: - price - mw minItems: 0 maxItems: 9 required: - hour - virtualBidSegments minItems: 0 maxItems: 24 RealEnergy: description: Used to represent real energy values submitted to the market. type: number format: realenergy multipleOf: 0.1 minimum: -9.99999999E7 maximum: 9.99999999E7 example: 1200.7 HourLabel: description: Hour ending label. Represents an hour segment of time. type: integer minimum: 1 maximum: 24 example: 1 RealEnergyNullable: description: Used to represent real energy values submitted to the market. Nullable added to allow for data driven delete behaviour. type: - number - 'null' format: realenergy multipleOf: 0.1 minimum: -9.99999999E7 maximum: 9.99999999E7 example: 1200.7 PortfolioName: description: Portfolio name which is unique to a participant company and may be shared among users registered with the same company. type: string minLength: 1 maxLength: 40 example: Sample Portfolio headers: http-x-request-id: description: Response header contains a unique transaction identifier assigned by MUI. Identifier is a GUID represented without hyphens. schema: type: string format: guid example: 34571c664e48ca0b1e30d7ffb9b3b287 parameters: Portfolio: in: query name: portfolio description: Optional parameter to specify the name of the Portfolio of pricing nodes for the requested data. If neither pnode or portfolio is provided then all applicable data is returned. required: false schema: $ref: '#/components/schemas/PortfolioName' Pnode: in: query name: pnode description: Optional parameter to specify the name of a pricing node for the requested data. If neither pnode or portfolio is provided then all applicable data is returned. required: false schema: $ref: '#/components/schemas/PNodeName' x-acting-participant: in: header name: x-acting-participant description: Header to override default acting participant of NERC ID. Will be validated against participant collection resource when specified in path. schema: type: string example: MP MarketOperatingDay: in: path name: day description: The operating day of the data. required: true schema: $ref: '#/components/schemas/MarketOperatingDay' Participant: in: path name: participantName description: The NERC ID of asset owner specified in the path for a collection resource. required: true schema: $ref: '#/components/schemas/ParticipantName' responses: InternalErrorApiResponse: description: Internal error occurred, details in server-side logs. content: application/json: schema: $ref: '#/components/schemas/APIResponse' example: action: responses: - messages: - level: ERROR msgId: MESSAGE_ID params: [] userMsg: Internal error message for MESSAGE_ID. transactionId: 34571c664e48ca0b1e30d7ffb9b3b287 transactionTime: '2020-07-02T17:45:00-05:00' headers: http-x-request-id: $ref: '#/components/headers/http-x-request-id' BadRequestApiResponse: description: User error. Request was invalid for some reason. See response for details. content: application/json: schema: $ref: '#/components/schemas/APIResponse' example: action: responses: - messages: - level: ERROR msgId: MESSAGE_ID params: [] userMsg: Bad request message for MESSAGE_ID. transactionId: 34571c664e48ca0b1e30d7ffb9b3b287 transactionTime: '2020-07-02T17:45:00-05:00' headers: http-x-request-id: $ref: '#/components/headers/http-x-request-id' OkApiResponse: description: Successful operation. content: application/json: schema: $ref: '#/components/schemas/APIResponse' example: action: responses: [] transactionId: 34571c664e48ca0b1e30d7ffb9b3b287 transactionTime: '2020-07-02T17:45:00-05:00' headers: http-x-request-id: $ref: '#/components/headers/http-x-request-id' UnauthorizedApiResponse: description: Rejected due to insufficient permissions. content: application/json: schema: $ref: '#/components/schemas/APIResponse' example: action: responses: - messages: - level: ERROR msgId: MESSAGE_ID params: [] userMsg: Unauthorized message for MESSAGE_ID. transactionId: 34571c664e48ca0b1e30d7ffb9b3b287 transactionTime: '2020-07-02T17:45:00-05:00' headers: http-x-request-id: $ref: '#/components/headers/http-x-request-id' NotFoundApiResponse: description: Resource not found. The path provided does not point to an entity in the system. content: application/json: schema: $ref: '#/components/schemas/APIResponse' example: action: responses: - messages: - level: ERROR msgId: MESSAGE_ID params: [] userMsg: Not found message for MESSAGE_ID. transactionId: 34571c664e48ca0b1e30d7ffb9b3b287 transactionTime: '2020-07-02T17:45:00-05:00' headers: http-x-request-id: $ref: '#/components/headers/http-x-request-id'