Demand Forecast Inventory
The Demand Forecast Ingestion API receives demand forecasts from WMS forecasting systems and feeds the event-driven inventory processing pipeline. Submissions are accepted asynchronously: the API acknowledges receipt and returns a request_id, then validates and processes the payload downstream.
A 202 confirms receipt, not validity. Every rule below is applied after the response is returned. Points that fail are recorded in FourKites service logs only — no error reaches the caller, and there is no callback today. To confirm a forecast landed, read it back through the inventory projection APIs.
Validation Rules
Two groups, and the difference matters: the first discards everything you sent, the second discards only the point at fault.
Whole submission is rejected — nothing is stored:
- forecasts is missing or empty
- forecasts contains more than 500 entries
- any forecastData contains more than 500 points
- any date is not in YYYY-MM-DD format
Only the offending point or entry is rejected — everything else is stored:
- forecastData is missing or empty — that entry only
- productId or facilityId missing, or over 100 characters
- quantityUom over 10 characters
- date missing on a point
- quantity missing, or negative
- the same date appears twice in one forecastData array
Why the split. A size breach or an unreadable date is a fault in how the submission was built, so the whole submission is refused before any of it is stored. Everything else is a fault in one row, so only that row is dropped.
Neither is reported back to you. Both are recorded in FourKites service logs against the request_id.
Date format
Dates must be YYYY-MM-DD, for example 2026-09-02. Other formats — 09/02/2026, 2026-9-2, 02-Sep-2026 — are not accepted, and a single one of them discards the entire submission.
An absent date is different: that point alone is rejected and its siblings are stored normally.
Processing granularity
Daily or weekly handling is taken from your company's demand forecast configuration, not from the request. Dates are stored exactly as submitted; the API does not snap them to week starts or redistribute them. Where no configuration exists, forecasts are stored as daily and the quantity is taken as given rather than spread.
curl --location 'https://api.fourkites.com/api/v1/async/forecast/demand' \
--header 'Content-Type: application/json' \
--header 'apikey: APIKEY' \
--data '{
"messageId": "FCT-DEMAND-2026-09-01-001",
"forecasts": [
{
"productId": "WIRE-BEL-COA-001",
"facilityId": "442344",
"quantityUom": "EA",
"forecastData": [
{
"date": "2026-09-02",
"quantity": 12.0
},
{
"date": "2026-09-03",
"quantity": 30.0
},
{
"date": "2026-09-04",
"quantity": 25.0
}
],
"referenceAttributes": {
"forecastModel": "ML_DEMAND_PREDICTOR_V2",
"customerSegment": "RETAIL",
"channel": "B2B",
"dataSource": "WMS_DEMAND_ENGINE"
}
}
]
}'curl --location 'https://api-staging.fourkites.com/api/v1/async/forecast/demand' \
--header 'Content-Type: application/json' \
--header 'apikey: APIKEY' \
--data '{
"messageId": "FCT-DEMAND-2026-09-01-001",
"forecasts": [
{
"productId": "WIRE-BEL-COA-001",
"facilityId": "442344",
"quantityUom": "EA",
"forecastData": [
{
"date": "2026-09-02",
"quantity": 12.0
},
{
"date": "2026-09-03",
"quantity": 30.0
},
{
"date": "2026-09-04",
"quantity": 25.0
}
],
"referenceAttributes": {
"forecastModel": "ML_DEMAND_PREDICTOR_V2",
"customerSegment": "RETAIL",
"channel": "B2B",
"dataSource": "WMS_DEMAND_ENGINE"
}
}
]
}'There is no 400 response for a malformed forecast on this endpoint, and no errors array. Body-level problems are detected downstream, after the 202 has been returned.
