Skip to main content

Forecast Configurations API Reference

The Forecast Configurations API lets you create, read, update, and delete saved automatic forecast configurations. These configurations define the stream settings (model parameters, time windows, well life, EUR matching, etc.) that are applied when a forecast is run.

All endpoints are rooted at:

/v1/forecast-configurations

Key Concepts​

  • A forecast configuration is either deterministic or probabilistic. The type is set on creation and cannot be changed.
  • Deterministic configurations are project-scoped — they require a project field and belong to a single project.
  • Probabilistic configurations are user-scoped — the project field is prohibited and they are shared across projects for the authenticated user.
  • PUT (upsert) matches on a natural key: name + project for deterministic, name alone for probabilistic.
  • On write, missing streamConfigurations fields are filled from defaults based on the chosen model, so stored documents are always complete.
  • On GET, only fields relevant to the active mode are returned for each dict (e.g. absoluteRange is omitted when timeDict.mode is not "absolute_range").

Endpoints​

MethodPathDescriptionLimit
HEAD/v1/forecast-configurationsReturn count headers only–
GET/v1/forecast-configurationsList configurations (paginated)200/page
GET/v1/forecast-configurations/:idGet a single configuration by ID–
POST/v1/forecast-configurationsCreate new configurations100/call
PUT/v1/forecast-configurationsUpsert by natural key100/call
PATCH/v1/forecast-configurationsPartial update by natural key100/call
DELETE/v1/forecast-configurationsDelete by filter100/call
DELETE/v1/forecast-configurations/:idDelete a single configuration by ID–

Query Parameters (GET / HEAD)​

ParameterTypeDescription
skipnumberRecords to skip for pagination (default: 0)
takenumberRecords to return per page (default: 25, max: 200)
sortstringSort field and direction (e.g. id, -id)
cursorstringCursor token from a previous response for cursor pagination
forecastTypestringFilter by type: deterministic or probabilistic
idstringFilter by one or more IDs (comma-separated)
namestringFilter by name
createdAtstringFilter by creation date
updatedAtstringFilter by last-updated date

Top-Level Fields​

FieldTypeWritableRequiredDescription
idstringNo–ObjectId of this configuration (read-only)
namestringYesYesDisplay name. 1–250 characters. Must be unique per project/type.
forecastTypestringYesYes"deterministic" or "probabilistic"
projectstring | nullYesConditionalObjectId. Required for deterministic; prohibited for probabilistic
createdBystringNo–ObjectId of the user who created this record (read-only)
createdByNamestringNo–Display name of the creator (read-only)
isAdminbooleanNo–Admin flag (read-only; cannot be set via the API)
resolutionstringYesNoProduction data resolution. See Resolution values.
forecastScopeobjectYesNoForecasting scope flags. See forecastScope.
overwriteManualbooleanYesNoWhen true, running this configuration will overwrite existing manual forecasts.
automaticForecastobjectYesNoCore stream configuration. See automaticForecast.
createdAtstring (ISO)No–Creation timestamp (read-only)
updatedAtstring (ISO)No–Last-updated timestamp (read-only)

Resolution Values​

ValueDescription
"monthly_only"Only generate monthly-resolution forecasts (default)
"monthly_preference"Prefer monthly; fall back to daily if monthly data is unavailable
"daily_only"Only generate daily-resolution forecasts
"daily_preference"Prefer daily; fall back to monthly if daily data is unavailable

forecastScope​

Controls the scope of wells included when this configuration is applied during a run.

FieldTypeDescription
autobooleanWhen true, automatically includes all wells in the forecast
proximitybooleanProximity forecasting flag. Note: proximity forecasting is not supported via the forecast run API endpoint.

automaticForecast​

The main configuration block. Contains an array of stream configuration entries.

FieldTypeRequiredDescription
streamConfigurationsarrayNoOne or more stream configuration entries. See below.

Stream Configuration Entry​

Each entry in streamConfigurations applies a single configuration to one or more production streams (phases).

FieldTypeRequiredDescription
namestringNoOptional label for this configuration group
streamsarray of stringYesPhases this configuration applies to. Must have at least one element. Each phase must be non-empty and must not appear in any other entry.
configurationobjectYesThe forecast settings for these streams. See Stream Configuration.
Stream uniqueness

A phase (e.g. "oil") may appear in at most one entry's streams array — both within a single entry and across all entries. Duplicate phases in the same request are rejected with HTTP 400.

Standard phases are "oil", "gas", and "water". Custom streams may also be used if configured for the forecast.


Stream Configuration​

The configuration object within each stream entry holds all the settings that drive the automatic forecasting algorithm.

Core Fields​

FieldTypeDescription
axisCombostringForecast axis type: "rate" or "ratio"
basePhasestring | nullRequired when axisCombo is "ratio". The base phase for the ratio calculation (e.g. "oil", "gas").
dispersionnumberDispersion parameter for probabilistic fitting
flatForecastThresnumberThreshold for triggering flat forecast detection
internalFilterstringData filtering level: "none", "low", "mid", "high", "very_high"
internalFilterAllbooleanWhen true, applies internalFilter to all data points
lowDataThresholdnumber | nullMinimum number of data points required before switching to a low-data forecast
movingAverageDaysnumber | nullWindow size (in days) for smoothing input production data
peakPreferencestringHow the peak rate is selected: "start_point", "last", "max", "end_flat", "auto"
peakSensitivitystringSensitivity of the peak-detection algorithm: "low", "mid", "high"
percentilearray of numberTarget percentile values for probabilistic forecasts (e.g. [10, 50, 90])
percentileRangeobjectAllowed range of output percentiles: { min, max }. min < max, max ≤ 100.
probParaarray of stringProbabilistic parameters to fit
qFinalnumberTerminal rate (economic limit) for the decline curve
remove0booleanWhen true, removes zero-value production data points before fitting
shortProdThresholdnumber | nullWell is flagged as "short production" if its data length is below this threshold
useLowDataForecastbooleanWhen true, use an alternative algorithm for wells with limited data
useMinimumDatabooleanWhen true, use only the most recent data window for fitting
validIdxnumber | nullIndex of the last valid data point to include in the fit
valueRangeobjectAllowed range for rate values: { min, max }. min < max (strict).
timeDictobjectTraining data time window. See timeDict.
weightDictobjectData weighting window. See weightDict.
wellLifeDictobjectWell life / production cutoff settings. See wellLifeDict.
matchEurobjectEUR matching settings. See matchEur.
modelParametersobjectModel-specific parameters. See modelParameters.

timeDict​

Defines the time window of production data used to fit the decline curve.

FieldTypeDescription
modestringWindow selection mode. See table below.
unitstringTime unit (e.g. "month", "year")
absoluteRangeobject{ min, max } — ISO date strings. min ≤ max. Required when mode is "absolute_range"; must not be provided otherwise.
headerRangeobject{ min, max } — header date strings. Required when mode is "header_range"; must not be provided otherwise.
numRangeobject{ min, max } — number of time units. min ≤ max. Used when mode is "first", "last", or "all"; must not be provided with date-based modes.
mode valueMeaning
"first"Use the first N time units of production data (numRange)
"last"Use the last N time units of production data (numRange)
"all"Use all available production data
"absolute_range"Use data between two specific calendar dates (absoluteRange)
"header_range"Use data relative to a header date (headerRange)
Mode-exclusive fields

Only the range object for the active mode should be provided. For example, when mode is "absolute_range", include absoluteRange but omit numRange and headerRange. The API returns 400 if an incompatible range object is sent with its mode.


weightDict​

Defines how production data points are weighted during the fitting process.

FieldTypeDescription
modestringWeighting mode. "absolute_range" or other mode values (e.g. "all", "first", "last")
unitstringTime unit for range-based weighting
valuenumberWeighting multiplier
absoluteRangeobject{ min, max } — ISO date strings. min ≤ max. Required when mode is "absolute_range"; must not be provided otherwise.
numRangeobject{ min, max } — number of time units. min ≤ max. Used when mode is not "absolute_range"; must not be provided with absolute range mode.
weightDict.mode casing

The API always returns "absolute_range" (snake_case) in GET responses. Both "absolute_range" and "absoluteRange" are accepted on write; the value is stored internally as "absoluteRange" for UI compatibility.


wellLifeDict​

Defines when a well is considered to have reached the end of its productive life.

FieldTypeDescription
wellLifeMethodstringCutoff method. See table below.
fixedDatestring | nullISO date string. Required when wellLifeMethod is "fixed_date"; must not be provided otherwise.
numnumberDuration length (positive). Required (and must be > 0) when wellLifeMethod is not "fixed_date"; must not be provided when "fixed_date".
unitstringDuration unit (e.g. "year", "month"). Used with duration-based methods.
wellLifeMethod valueMeaning
"duration_from_first_data"num units after the first production data point
"duration_from_last_data"num units after the last production data point
"duration_from_today"num units from today
"fixed_date"A specific calendar date (fixedDate)

matchEur​

Controls whether and how the forecast is constrained to match a target EUR (Estimated Ultimate Recovery).

FieldTypeDescription
matchTypestringMatching mode. See table below.
matchForecastIdstring | nullObjectId of the reference forecast. Required when matchType is "forecast"; must not be provided for other types.
matchPercentChangenumberAllowed percent deviation from the reference EUR. Required when matchType is "forecast"; must not be provided for other types.
matchEurNumnumberTarget EUR value. Required when matchType is "number"; must not be provided for other types.
errorPercentagenumberAcceptable error tolerance (percent). Required when matchType is "forecast" or "number".
matchType valueMeaning
"no_match"No EUR matching — forecast runs unconstrained
"forecast"Match EUR of another forecast (matchForecastId) within matchPercentChange%
"number"Match a specific EUR value (matchEurNum) within errorPercentage%
Field exclusivity

Fields from one matchType must not be provided for another. For example, matchEurNum is rejected when matchType is "forecast", and matchForecastId is rejected when matchType is "number".


modelParameters​

Model-specific fitting parameters. The modelName field is required whenever modelParameters is provided; all other keys depend on the chosen model.

FieldTypeDescription
modelNamestringRequired. The forecast model to use. Must be a valid model name from the ComboCurve form templates.
bobject{ min, max } — Arps b-exponent range
b2object{ min, max } — Secondary b-exponent range (multi-segment models)
cobject{ min, max } — Ratio/flat model parameter range
D_effobject{ min, max } — Effective decline rate range (% per year)
D2_effobject{ min, max } — Secondary effective decline rate range
D_lim_eff_rangeobject{ min, max } — Effective terminal decline rate range
minus_t_decline_t0object{ min, max } — Time offset from t₀ to decline start
minus_t_elf_t_peakobject{ min, max } — Time from peak to end of linear flow
minus_t_peak_t0object{ min, max } — Time from t₀ to peak
minus_t1_t_peakobject{ min, max } — Time from peak to t₁ (multi-segment)
q_endobject{ min, max } — Terminal rate range
q_peakobject{ min, max } — Peak rate range
q_startobject{ min, max } — Starting rate range
t_linear_durationobject{ min, max } — Linear flow duration range
D_lim_effnumber | nullEffective terminal decline rate (scalar)
b_priornumber | nullPrior for the b-exponent in Bayesian fitting
b_strengthstring | nullStrength of the b prior: "None", "Low", "Medium", "High"
enforce_swbooleanEnforce Schwarzkopf well analysis constraints
Model validation
  • modelName must be compatible with the axisCombo (some models are ratio-axis only)
  • Each parameter value must fall within the hard bounds declared for that model

Validation Rules Summary​

RuleDetail
name length1–250 characters
forecastType: "deterministic"project is required
forecastType: "probabilistic"project must not be provided
Stream uniquenessEach phase may appear in at most one streamConfigurations entry
streams non-emptyEach entry must have at least one stream
axisCombo: "ratio"basePhase is required
percentileRangemin < max, max ≤ 100
valueRangemin < max (strict)
timeDictMode-exclusive range fields; date ranges must be ordered
weightDictMode-exclusive range fields; date ranges must be ordered
wellLifeDictnum required and positive for duration methods; fixedDate required for "fixed_date"
matchEurField presence tied to matchType; fields from other types are rejected
modelParametersValid modelName required; parameter keys and values validated against model definition
isAdmin / userDefaultThese fields are read-only and cannot be set via the API

Examples​

Create a deterministic configuration​

POST /v1/forecast-configurations
[
{
"name": "My Arps Config",
"forecastType": "deterministic",
"project": "5e5981b9e23dae0012624d72",
"resolution": "monthly_only",
"overwriteManual": false,
"automaticForecast": {
"streamConfigurations": [
{
"name": "Oil stream",
"streams": ["oil"],
"configuration": {
"axisCombo": "rate",
"peakPreference": "auto",
"peakSensitivity": "mid",
"internalFilter": "none",
"timeDict": {
"mode": "last",
"numRange": { "min": 3, "max": 24 },
"unit": "month"
},
"weightDict": {
"mode": "all"
},
"wellLifeDict": {
"wellLifeMethod": "duration_from_last_data",
"num": 30,
"unit": "year"
},
"matchEur": {
"matchType": "no_match"
},
"modelParameters": {
"modelName": "arps_modified_wp",
"b": { "min": 0.5, "max": 1.5 },
"D_eff": { "min": 1, "max": 99 },
"D_lim_eff": 8,
"enforce_sw": true
}
}
},
{
"streams": ["gas", "water"],
"configuration": {
"axisCombo": "rate",
"peakPreference": "auto",
"peakSensitivity": "mid",
"internalFilter": "none",
"timeDict": {
"mode": "all"
},
"wellLifeDict": {
"wellLifeMethod": "duration_from_last_data",
"num": 30,
"unit": "year"
},
"matchEur": {
"matchType": "no_match"
},
"modelParameters": {
"modelName": "arps_modified_wp",
"b": { "min": 0.5, "max": 1.5 },
"D_eff": { "min": 1, "max": 99 },
"D_lim_eff": 8,
"enforce_sw": true
}
}
}
]
}
}
]

Create a probabilistic configuration with absolute date range​

POST /v1/forecast-configurations
[
{
"name": "Probabilistic Shale Config",
"forecastType": "probabilistic",
"resolution": "monthly_only",
"automaticForecast": {
"streamConfigurations": [
{
"streams": ["oil"],
"configuration": {
"axisCombo": "rate",
"peakPreference": "auto",
"peakSensitivity": "mid",
"percentile": [10, 50, 90],
"timeDict": {
"mode": "absolute_range",
"absoluteRange": { "min": "2020-01-01", "max": "2024-12-31" }
},
"weightDict": {
"mode": "absolute_range",
"absoluteRange": { "min": "2022-01-01", "max": "2024-12-31" }
},
"wellLifeDict": {
"wellLifeMethod": "fixed_date",
"fixedDate": "2055-01-01"
},
"matchEur": {
"matchType": "no_match"
},
"modelParameters": {
"modelName": "arps_modified_wp",
"b": { "min": 0.5, "max": 1.5 },
"D_eff": { "min": 1, "max": 99 },
"D_lim_eff": 8,
"enforce_sw": true
}
}
}
]
}
}
]