Getting Started
Get up and running with Phase Nexa in minutes.
Phase Nexa libraries are distributed as standard packages. Install what you need, ignore the rest. No monolithic framework, no vendor lock-in.
Pick your starting point
nexa-marketdata is the best entry point if you need price data, generation data, or load data from European exchanges.
pip install nexa-marketdata
from nexa_marketdata import NexaClient
from nexa_marketdata.types import BiddingZone
import datetime
client = NexaClient()
# Fetch day-ahead prices for NO1 (South Norway)
prices = client.day_ahead_prices(
zone=BiddingZone.NO1,
start=datetime.date(2025, 10, 1),
end=datetime.date(2025, 10, 7),
)
print(prices.head())
nexa-bidkit is the starting point if you need to build and submit auction bids.
pip install nexa-bidkit
from decimal import Decimal
from datetime import datetime
from zoneinfo import ZoneInfo
from nexa_bidkit import (
BiddingZone, Direction, DeliveryPeriod, MTUDuration,
block_bid, indivisible_block_bid,
create_order_book, add_bids,
)
from nexa_bidkit.nordpool import order_book_to_nord_pool
delivery = DeliveryPeriod(
start=datetime(2026, 4, 1, 8, 0, tzinfo=ZoneInfo("Europe/Oslo")),
end=datetime(2026, 4, 1, 20, 0, tzinfo=ZoneInfo("Europe/Oslo")),
duration=MTUDuration.QUARTER_HOURLY,
)
# Build bids
wind_block = block_bid(
bidding_zone=BiddingZone.NO1,
direction=Direction.SELL,
delivery_period=delivery,
price=Decimal("45.50"),
volume=Decimal("25"),
)
# Assemble and serialise for Nord Pool
book = create_order_book()
book = add_bids(book, [wind_block])
submission = order_book_to_nord_pool(
book,
auction_id="DA-2026-04-01",
portfolio="my-portfolio",
contract_id_resolver=lambda mtu, zone: f"{zone.value}-{mtu.start.hour}",
)
nexa-mfrr-nordic-eam is the starting point for BSPs building Nordic mFRR energy activation market bid workflows.
pip install nexa-mfrr-nordic-eam
from nexa_mfrr_eam import (
Bid, BidDocument, Direction, MarketProductType,
BiddingZone, TSO, MARIMode,
)
# Create a simple divisible up-regulation bid
bid = (
Bid.up(volume_mw=50, price_eur=85.50)
.divisible(min_volume_mw=10)
.for_mtu("2026-03-21T10:00Z")
.resource("NOKG90901", coding_scheme="NNO")
.product_type(MarketProductType.SCHEDULED_AND_DIRECT)
.build()
)
# Wrap in a document targeting Statnett
doc = (
BidDocument(tso=TSO.STATNETT)
.sender(party_id="9999909919920", coding_scheme="A10")
.add_bid(bid)
.build()
)
# Validate, then serialise to CIM XML
errors = doc.validate(mari_mode=MARIMode.PRE_MARI)
if not errors:
xml_bytes = doc.to_xml()
# Send xml_bytes via your ECP/EDX endpoint
Requirements
What you will need
Most Phase Nexa libraries interact with exchange APIs. You will typically need:
- API credentials from your exchange (Nord Pool, EPEX SPOT, etc.)
- ENTSO-E API key from the ENTSO-E Transparency Platform (free registration)
- A working Python 3.11+ environment
info
Phase Nexa libraries handle authentication, rate limiting, and retry logic. You provide the credentials, we handle the plumbing.
Next steps
- Browse the library documentation for detailed API references
- Check the GitHub organisation for source code and issue trackers
- Read about premium support and hosted services coming soon
- Join the community and let us know what you are building