Create Delivery Request

Follow the three-step process to create a curve delivery commitment

📊 How Curve Data is Organized

🏗️

CurveDefinition

Reusable Template

Purpose: Defines what kind of curve this is. Templates are reused across many forecast runs.

Key Fields:
market → "ERCOT", "CAISO", "PJM"
location → "Houston", "SP15", "North Hub"
product → "Revenue_Optimized", "LMP"
curveType → "REVENUE", "TB4", "ENERGY_ARB"
batteryDuration → "HOUR_4", "HOUR_2"
scenario → "BASE", "BULL", "P50"
units → "$/MWh", "MW"
degradationType → "NONE", "DATE", "PERCENTAGE"
units → "$/MWh", "MW", "MWh"
Example: "ERCOT Houston Revenue_Optimized TB4 Battery, Base Case scenario"
📈

CurveInstance

Specific Run

Purpose: A specific forecast run of the definition template. Contains when and who created this version.

Key Fields:
curveDefinitionId → Links to template above
instanceVersion → "v1.0", "v2.1", "final"
createdBy → "Aurora", "Gridstor"
granularity → "HOURLY", "DAILY"
deliveryPeriodStart → "2025-01-01"
deliveryPeriodEnd → "2025-12-31"
forecastRunDate → When created
modelType → "Fundamental", "Statistical"
Example: "March 2025 v2.1 by Aurora, hourly from Jan-Dec 2025"
💾

CurveInstanceData

Raw Data

Purpose: Individual data points with flexible percentile storage. Multiple rows per timestamp for different confidence levels.

Key Fields:
curveInstanceId → Links to specific run above
timestamp → "2025-01-01 00:00:00"
pvalue → 10, 50, 90 (percentile number)
value → $45.67 (forecast at this percentile)
units → "$/MWh", "MW", "MWh"
pValueGranularity → "MONTHLY", "YEARLY"
granularity → "HOURLY" (from CurveInstance)
flags → ["outlier", "holiday", "estimated"]
Structure: 3 rows per hour (P10, P50, P90) × 8,760 hours = 26,280 rows for full annual coverage with confidence bands.

🔗 How The Three Tables Connect

🤔 Why Three Separate Tables?

Think of it like a recipe system: You have recipe templates (CurveDefinition) that describe what to make, specific cooking sessions (CurveInstance) where someone actually makes the recipe on a particular day, and detailed measurements (CurveInstanceData) of every ingredient amount used during that cooking session. This structure avoids repeating the same template information thousands of times and lets you compare different cooking sessions of the same recipe.

1
CurveDefinition: The Template

What it is: A high-level description of what kind of curve this is. Think "recipe name and basic ingredients."

Example: "Houston Revenue 4H Battery"

Market: ERCOT
Location: Houston
Product: Revenue_Optimized
Battery Duration: 4 Hours
Units: $/MWh
Database ID: 7
One definition → Many instances
2
CurveInstance: The Specific Forecast Run

What it is: Someone actually creates a forecast using that template. Think "Aurora cooked the Houston Revenue recipe on March 15th."

Instance #23: "March 2025 Monthly by Aurora"

curveDefinitionId: 7 (links to Houston Revenue 4H)
Version: v3.1
Created by: Aurora
Period: March 2025 (monthly data)
Granularity: MONTHLY
Model: Fundamental

Instance #31: "March 2025 Monthly by Gridstor"

curveDefinitionId: 7 (same Houston Revenue 4H)
Version: v2.8
Created by: Gridstor
Period: March 2025 (monthly data)
Granularity: MONTHLY
Model: Statistical

Notice: Both instances use the same template (Definition #7) but have different creators, versions, and models.

One instance → Many data points
3
CurveInstanceData: The Actual Numbers

What it is: The actual forecast numbers with confidence levels. Think "exact measurements for every month."

Data for Instance #23 (Aurora's March 2025 forecast):

Timestamp pvalue value units curveInstanceId
2025-03-01 10 $42.50 $/MWh 23
2025-03-01 50 $48.75 $/MWh 23
2025-03-01 90 $55.20 $/MWh 23
2025-04-01 10 $38.90 $/MWh 23
2025-04-01 50 $44.25 $/MWh 23
2025-04-01 90 $51.80 $/MWh 23
Key Connections:
curveInstanceId: 23 → Points back to Aurora's Instance
• Instance #23 → curveDefinitionId: 7 → Points to "Houston Revenue 4H" template
• Multiple rows per month for different confidence levels (P10, P50, P90)
• Each month gets 3 rows, so 12 months × 3 pvalues = 36 total data points
🔍 How to Trace the Connections:
To find all data for "Houston Revenue 4H":
1. Look up CurveDefinition: "Houston Revenue 4H" → ID = 7
2. Find all CurveInstances where curveDefinitionId = 7 → (Instance #23, #31, etc.)
3. Get all CurveInstanceData where curveInstanceId IN (23, 31, etc.)
To compare Aurora vs Gridstor forecasts:
Filter CurveInstanceData by curveInstanceId = 23 (Aurora) vs curveInstanceId = 31 (Gridstor)
📋 Delivery Request Integration: When you request "Houston Revenue 4H data," the system links to CurveDefinition ID=7, then creates a specific CurveInstance when fulfilled, containing all the monthly CurveInstanceData points.
💡
Key Understanding: One CurveDefinition template (like "ERCOT Houston 4H Battery Revenue") gets reused for multiple forecast runs. Each CurveInstance represents one specific forecast run with its own version, creator, and delivery period. Each Instance contains thousands of PriceForecast data points with timestamps and confidence intervals. This request commits to deliver one specific Instance that matches the Definition template.
1
Curve Definition
2
Curve Instance
3
Delivery Request
🏗️

Step 1: Curve Definition

Required
📈

Step 2: Curve Instance Details

Locked

Specify the details for this specific forecast run

Degradation Settings

📊 Estimated Data Points

Select delivery period and granularity to see estimate

📋

Step 3: Delivery Request

Locked

Specify when and how this curve should be delivered