Skip to main content

Traffic demand

Value
model_familydemand
StatusServed
Current releasedemand-pool-quantiles-v1
Forecastsoffered_bytes p10, p50, p99
Horizons10 to 60 minutes, in 10 minute intervals
EntityPool

Overview​

Forecasts the bytes a pool will be offered in each 10 minute interval of the next hour, as a median with p10 and p99 bounds. It reads the daily and weekly pattern in the pool's last 7 days of pool_interval history, written with POST /telemetry, and returns forecasts through GET /predictions with model_family=demand.

Intended use and out-of-scope use​

Intended use:

  • Planning capacity for the next hour per pool, with p99 as the provisioning bound.
  • Spotting a pool that is about to carry more or less than usual for the time of day.

Out of scope:

  • Horizons beyond 60 minutes.
  • Pools with less than 7 complete days of history. They are declined, not forecast.
  • Instantaneous throughput or per-flow demand. The forecast is bytes per 10 minute interval per pool.
  • Treating forecasts from synthetic history as qualified. They are marked unqualified.

Inputs​

Write one pool_interval record per pool per 10 minute interval, tagged entity_id with the pool ID you later pass in link_ids.

Field or tagUnitRequiredDescription
inlet_bytes (field)bytesYesBytes newly offered during the interval, not a running total.
boundary_id (tag)noneYesBoundary the traffic crosses.
direction (tag)noneYesTraffic direction, up or down.
evidence_kind (tag)noneYespublic_flow_estimate for measured traffic, synthetic_offered for synthetic traffic.
Value
Measurementpool_interval
CadenceOne record per 10 minute interval, timestamped on the UTC grid (:00, :10, :20, ...).
Required history7 complete days: 1,008 consecutive intervals. One missing interval declines the pool until the gap ages out of the window.
Identityboundary_id, direction, and evidence_kind stay unchanged for the whole 7 days.
TimeUTC.

A new pool forecasts 7 days after it starts reporting, or immediately after a 7 day backfill.

{
"measurement": "pool_interval",
"time": "2026-10-04T12:10:00Z",
"tags": {
"entity_id": "pool-1",
"boundary_id": "inlet",
"direction": "up",
"evidence_kind": "public_flow_estimate"
},
"fields": { "inlet_bytes": 2150000000 }
}

Outputs​

One item per pool and horizon:

FieldUnitDescription
offered_bytes_p50bytesMedian forecast of bytes offered in the interval.
offered_bytes_p10bytes10th percentile forecast.
offered_bytes_p99bytes99th percentile forecast.
Value
Horizons10, 20, 30, 40, 50, and 60 minutes, counted from an issue time on the 10 minute grid.
CadenceIssue times align to the 10 minute grid. Check predicted_at for each item's age.
demand blockThe pool's identity tags, the forecast window, and a qualification_status.
ProvenanceEach item carries model_version, feature_view_id, and model_release_id. Keep them with exported results.

Request forecasts​

curl --fail-with-body -sS \
-H "x-api-key: $CONSTELLATION_API_TOKEN" \
"https://api.constellation.space/predictions?model_family=demand&link_ids=pool-1"

From an AI agent, call get_predictions on the MCP server with model_family set to demand and the same IDs in link_ids. Both need a key with predictions:read. GET /predictions describes the response and per-entity errors.

Declines​

A pool can be declined for:

ReasonCause
incomplete_telemetryAn interval is missing in the seven-day window.
missing_pool_identityboundary_id, direction, or evidence_kind is missing.
ambiguous_seriesAn identity tag changed within the window, so the pool has more than one history.
uncalibrated_populationevidence_kind is not one the release is calibrated for.

Demand declines currently reach the API response with a null code and a generic message; until that is fixed, check the pool against this table.

Tiers​

A fidelity tier labels how a model is served, not what a plan includes. This model is served at Bronze, by demand-pool-quantiles-v1. Silver and Gold are not served yet.

Every plan calls the same release: plans differ in allowance, not in tier. GET /predictions takes no tier parameter.

Method and version​

The current release, demand-pool-quantiles-v1, forecasts quantiles from the pool's own history: the trailing day, the matching windows on each prior day, and the 7 day mean of inlet_bytes, together with the pool's identity tags.

Limitations and known failure modes​

  • Gaps decline the pool. One missing interval in the 7 day window declines it until the gap ages out.
  • Identity changes split history. Changing boundary_id, direction, or evidence_kind within the window declines the pool as ambiguous_series.
  • Uncommon events. The forecast follows the pool's daily and weekly pattern; a one-off surge that history has not shown is not anticipated.
  • Synthetic history. Forecasts from synthetic_offered history are unqualified.

Changelog​

ReleaseChange
demand-pool-quantiles-v1Current served release.