CAISO API Reference

class lib.iso.caiso.CAISOClient(config=None)[source]

Bases: object

Client for retrieving data from CAISO OASIS API.

__init__(config=None)[source]
__init__(config=None)[source]
get_lmp(market, start_date, end_date, step_size=1)[source]

Get Locational Marginal Price data.

Parameters:
  • market (Market) – Energy market type

  • start_date (date) – Start date for data

  • end_date (date) – End date for data

  • step_size (int) – Number of days per request

Returns:

True if successful, False otherwise

Return type:

bool

get_load_forecast(market, start_date, end_date, step_size=1)[source]

Get system load forecast data.

get_ancillary_services_prices(market, start_date, end_date, step_size=1)[source]

Get ancillary services clearing prices.

get_fuel_prices(start_date, end_date, region='ALL', step_size=1)[source]

Get fuel prices.

get_wind_solar_summary(start_date, end_date, step_size=1)[source]

Get wind and solar generation summary.

get_ghg_allowance_prices(start_date, end_date, step_size=1)[source]

Get greenhouse gas allowance prices.

get_intertie_constraint_shadow_prices(start_date, end_date, step_size=1)[source]

Get intertie constraint shadow prices.

get_system_load(market, start_date, end_date, step_size=1)[source]

Get system load and resource schedules.

Parameters:
  • market (Market) – Market type (DAM, RUC, HASP, or RTM)

  • start_date (date) – Start date

  • end_date (date) – End date

  • step_size (int) – Number of days per request

get_market_power_mitigation(market, start_date, end_date, step_size=1)[source]

Get Market Power Mitigation (MPM) status.

Parameters:
  • market (Market) – Market type (DAM, HASP, or RTPD)

  • start_date (date) – Start date

  • end_date (date) – End date

  • step_size (int) – Number of days per request

get_flex_ramp_requirements(start_date, end_date, baa_group='ALL', step_size=1)[source]

Get flexible ramping requirements.

get_flex_ramp_awards(start_date, end_date, baa_group='ALL', step_size=1)[source]

Get flexible ramping aggregated awards.

get_flex_ramp_demand_curve(start_date, end_date, baa_group='ALL', step_size=1)[source]

Get flexible ramping demand curves.

get_eim_transfer(start_date, end_date, baa_group='ALL', step_size=1)[source]

Get Energy Imbalance Market (EIM) transfer data.

get_eim_transfer_limits(start_date, end_date, baa_group='ALL', step_size=1)[source]

Get Energy Imbalance Market (EIM) transfer limits.

get_ancillary_services_requirements(market, start_date, end_date, anc_type='ALL', anc_region='ALL', step_size=1)[source]

Get ancillary services requirements.

Parameters:
  • market (Market) – Market type (DAM, HASP, or RTM)

  • start_date (date) – Start date

  • end_date (date) – End date

  • anc_type (str) – Ancillary service type (ALL, RU, RD, SR, NR)

  • anc_region (str) – Region (ALL or specific region)

  • step_size (int) – Number of days per request

get_ancillary_services_results(market, start_date, end_date, anc_type='ALL', anc_region='ALL', step_size=1)[source]

Get ancillary services results/awards.

Parameters:
  • market (Market) – Market type (DAM, HASP, or RTM)

  • start_date (date) – Start date

  • end_date (date) – End date

  • anc_type (str) – Ancillary service type (ALL, RU, RD, SR, NR)

  • anc_region (str) – Region (ALL or specific region)

  • step_size (int) – Number of days per request

get_operating_reserves(start_date, end_date, step_size=1)[source]

Get actual operating reserves.

get_scheduling_point_tie_prices(market, start_date, end_date, step_size=1)[source]

Get scheduling point tie prices.

Parameters:
  • market (Market) – Market type (DAM or RTPD)

  • start_date (date) – Start date

  • end_date (date) – End date

  • step_size (int) – Number of days per request

get_advisory_demand_forecast(start_date, end_date, step_size=1)[source]

Get advisory CAISO demand forecast (RTPD).

get_curtailed_non_operational_reports(start_date, end_date, kind='both', out_subdir='curtailed_non_operational_generator_reports', timeout=None, save_raw_html=True, parse_html_to_csv=True)[source]

Download CAISO β€˜Curtailed and Non-Operational Generator’ reports.

CAISO has changed BOTH:
  • date token formats in filenames (YYYYMMDD vs YYYY-MM-DD vs mon-dd-yyyy)

  • the stem (sometimes includes β€œ-and-”: β€œcurtailed-and-non-operational-…”)

This method tries multiple stem variants per report + multiple date tokens + .xlsx then .html.

cleanup()[source]

Clean up temporary files.

Configuration

class lib.iso.caiso.CAISOConfig(base_url='http://oasis.caiso.com/oasisapi/SingleZip', query_date_format='%Y%m%dT%H:%M-0000', data_date_format='%Y-%m-%dT%H:%M:%S-00:00', raw_dir=PosixPath('raw_data'), xml_dir=PosixPath('raw_data/xml_files'), data_dir=PosixPath('data/CAISO'), max_retries=3, retry_delay=5, timeout=30)[source]

Configuration for CAISO client.

base_url: str = 'http://oasis.caiso.com/oasisapi/SingleZip'
query_date_format: str = '%Y%m%dT%H:%M-0000'
data_date_format: str = '%Y-%m-%dT%H:%M:%S-00:00'
raw_dir: Path = PosixPath('raw_data')
xml_dir: Path = PosixPath('raw_data/xml_files')
data_dir: Path = PosixPath('data/CAISO')
max_retries: int = 3
retry_delay: int = 5
timeout: int = 30
__init__(base_url='http://oasis.caiso.com/oasisapi/SingleZip', query_date_format='%Y%m%dT%H:%M-0000', data_date_format='%Y-%m-%dT%H:%M:%S-00:00', raw_dir=PosixPath('raw_data'), xml_dir=PosixPath('raw_data/xml_files'), data_dir=PosixPath('data/CAISO'), max_retries=3, retry_delay=5, timeout=30)

Market Types

class lib.iso.caiso.Market(value)[source]

Energy market types.

DAM = 'DAM'
HASP = 'HASP'
RTM = 'RTM'
RTPD = 'RTPD'
RUC = 'RUC'
TWO_DA = '2DA'
SEVEN_DA = '7DA'
ACTUAL = 'ACTUAL'

Report Versions

class lib.iso.caiso.ReportVersion(value)[source]

OASIS report schema versions.

V1 = (1, '{http://www.caiso.com/soa/OASISReport_v1.xsd}')
V4 = (4, '{http://www.caiso.com/soa/OASISReport_v4.xsd}')
V5 = (5, '{http://www.caiso.com/soa/OASISReport_v5.xsd}')
__init__(version, namespace)[source]

Main Methods

Pricing Data

CAISOClient.get_lmp(market, start_date, end_date, step_size=1)[source]

Get Locational Marginal Price data.

Parameters:
  • market (Market) – Energy market type

  • start_date (date) – Start date for data

  • end_date (date) – End date for data

  • step_size (int) – Number of days per request

Returns:

True if successful, False otherwise

Return type:

bool

Download Locational Marginal Price (LMP) data.

Parameters:
  • market (Market) – Market type (DAM, HASP, RTM, or RTPD)

  • start_date (date) – Start date for data

  • end_date (date) – End date for data

  • step_size (int) – Number of days per API request (default: 1)

Returns:

True if successful, False otherwise

Return type:

bool

Example:

from datetime import date
from lib.iso.caiso import CAISOClient, Market

client = CAISOClient()
success = client.get_lmp(
    market=Market.DAM,
    start_date=date(2024, 1, 1),
    end_date=date(2024, 1, 31)
)
client.cleanup()
CAISOClient.get_ancillary_services_prices(market, start_date, end_date, step_size=1)[source]

Get ancillary services clearing prices.

Download ancillary services clearing prices.

Parameters:
  • market (Market) – Market type (DAM or RTM)

  • start_date (date) – Start date

  • end_date (date) – End date

  • step_size (int) – Days per request (default: 1)

Returns:

Success status

Return type:

bool

CAISOClient.get_fuel_prices(start_date, end_date, region='ALL', step_size=1)[source]

Get fuel prices.

Download fuel prices by region.

Parameters:
  • start_date (date) – Start date

  • end_date (date) – End date

  • region (str) – Fuel region (β€˜ALL’, β€˜SFBAY’, β€˜SOCAL’, β€˜NP15’, β€˜SP15’)

  • step_size (int) – Days per request (default: 1)

Returns:

Success status

Return type:

bool

CAISOClient.get_ghg_allowance_prices(start_date, end_date, step_size=1)[source]

Get greenhouse gas allowance prices.

Download greenhouse gas allowance prices.

Load Data

CAISOClient.get_load_forecast(market, start_date, end_date, step_size=1)[source]

Get system load forecast data.

Download system load forecasts.

Parameters:
  • market (Market) – Forecast type (DAM, RTM, TWO_DA, SEVEN_DA)

  • start_date (date) – Start date

  • end_date (date) – End date

  • step_size (int) – Days per request

Returns:

Success status

Return type:

bool

CAISOClient.get_advisory_demand_forecast(start_date, end_date, step_size=1)[source]

Get advisory CAISO demand forecast (RTPD).

Download advisory (RTPD) demand forecast.

Generation Data

CAISOClient.get_wind_solar_summary(start_date, end_date, step_size=1)[source]

Get wind and solar generation summary.

Download wind and solar generation summary.

Includes current generation, forecasts, and available capacity for both wind and solar resources.

Parameters:
  • start_date (date) – Start date

  • end_date (date) – End date

  • step_size (int) – Days per request

Returns:

Success status

Return type:

bool

CAISOClient.get_system_load(market, start_date, end_date, step_size=1)[source]

Get system load and resource schedules.

Parameters:
  • market (Market) – Market type (DAM, RUC, HASP, or RTM)

  • start_date (date) – Start date

  • end_date (date) – End date

  • step_size (int) – Number of days per request

Download system load and resource schedules.

Parameters:
  • market (Market) – Market type (DAM, RUC, HASP, RTM)

  • start_date (date) – Start date

  • end_date (date) – End date

  • step_size (int) – Days per request

Returns:

Success status

Return type:

bool

Market Operations

CAISOClient.get_market_power_mitigation(market, start_date, end_date, step_size=1)[source]

Get Market Power Mitigation (MPM) status.

Parameters:
  • market (Market) – Market type (DAM, HASP, or RTPD)

  • start_date (date) – Start date

  • end_date (date) – End date

  • step_size (int) – Number of days per request

Download Market Power Mitigation (MPM) status.

CAISOClient.get_flex_ramp_requirements(start_date, end_date, baa_group='ALL', step_size=1)[source]

Get flexible ramping requirements.

Download flexible ramping requirements.

CAISOClient.get_flex_ramp_awards(start_date, end_date, baa_group='ALL', step_size=1)[source]

Get flexible ramping aggregated awards.

Download flexible ramping awards.

CAISOClient.get_flex_ramp_demand_curve(start_date, end_date, baa_group='ALL', step_size=1)[source]

Get flexible ramping demand curves.

Download flexible ramping demand curves.

CAISOClient.get_eim_transfer(start_date, end_date, baa_group='ALL', step_size=1)[source]

Get Energy Imbalance Market (EIM) transfer data.

Download Energy Imbalance Market transfer data.

CAISOClient.get_eim_transfer_limits(start_date, end_date, baa_group='ALL', step_size=1)[source]

Get Energy Imbalance Market (EIM) transfer limits.

Download Energy Imbalance Market transfer limits.

Ancillary Services

CAISOClient.get_ancillary_services_requirements(market, start_date, end_date, anc_type='ALL', anc_region='ALL', step_size=1)[source]

Get ancillary services requirements.

Parameters:
  • market (Market) – Market type (DAM, HASP, or RTM)

  • start_date (date) – Start date

  • end_date (date) – End date

  • anc_type (str) – Ancillary service type (ALL, RU, RD, SR, NR)

  • anc_region (str) – Region (ALL or specific region)

  • step_size (int) – Number of days per request

Download ancillary services requirements.

Parameters:
  • market (Market) – Market type (DAM, HASP, RTM)

  • start_date (date) – Start date

  • end_date (date) – End date

  • anc_type (str) – AS type (β€˜ALL’, β€˜RU’, β€˜RD’, β€˜SR’, β€˜NR’)

  • anc_region (str) – Region (β€˜ALL’ or specific)

  • step_size (int) – Days per request

Returns:

Success status

Return type:

bool

CAISOClient.get_ancillary_services_results(market, start_date, end_date, anc_type='ALL', anc_region='ALL', step_size=1)[source]

Get ancillary services results/awards.

Parameters:
  • market (Market) – Market type (DAM, HASP, or RTM)

  • start_date (date) – Start date

  • end_date (date) – End date

  • anc_type (str) – Ancillary service type (ALL, RU, RD, SR, NR)

  • anc_region (str) – Region (ALL or specific region)

  • step_size (int) – Number of days per request

Download ancillary services results/awards.

CAISOClient.get_operating_reserves(start_date, end_date, step_size=1)[source]

Get actual operating reserves.

Download actual operating reserves deployed.

Utility Methods

CAISOClient.cleanup()[source]

Clean up temporary files.

Clean up temporary files created during download.

Should be called after completing downloads to remove raw XML and CSV files.

Example:

client = CAISOClient()
try:
    client.get_lmp(Market.DAM, start, end)
finally:
    client.cleanup()  # Always clean up

Private Methods

CAISOClient._build_params(query_name, start_date, end_date, market=None, **kwargs)[source]

Build request parameters for OASIS API.

CAISOClient._make_request(params)[source]

Make API request with retry logic.

CAISOClient._extract_zip(content, query_name)[source]

Extract XML from ZIP response.

CAISOClient._xml_to_csv(xml_path, csv_path, report_version=ReportVersion.V1)[source]

Convert XML response to CSV.

CAISOClient._process_csv(csv_path, output_dir, separate_by_item=True)[source]

Process and organize CSV data.

Examples

Basic LMP Download

from datetime import date
from lib.iso.caiso import CAISOClient, Market

client = CAISOClient()

# Download Day-Ahead LMP
client.get_lmp(
    market=Market.DAM,
    start_date=date(2024, 1, 1),
    end_date=date(2024, 1, 31)
)

client.cleanup()

Custom Configuration

from pathlib import Path
from lib.iso.caiso import CAISOClient, CAISOConfig

config = CAISOConfig(
    data_dir=Path('my_data/CAISO'),
    max_retries=5,
    timeout=60
)

client = CAISOClient(config)
client.get_lmp(Market.DAM, date(2024, 1, 1), date(2024, 1, 31))
client.cleanup()

Multiple Markets

from lib.iso.caiso import CAISOClient, Market

client = CAISOClient()
start = date(2024, 1, 1)
end = date(2024, 1, 31)

# Download multiple markets
for market in [Market.DAM, Market.RTM]:
    print(f"Downloading {market.value}...")
    client.get_lmp(market, start, end)

client.cleanup()

See Also

Notes

  • All dates are in Pacific Time

  • API rate limiting is handled automatically

  • Large date ranges are split into smaller requests

  • Temporary files are created in raw_data/ directory

  • Always call cleanup() to remove temporary files