Opportunity delivery forecast

Returns a scoped delivery forecast derived from the opportunity's attached scope document: staffing demand by phase and role, timeline projection by month, confidence scoring, and pressure warnings. Requires an attached scope with at least one role demand. Margin projection is included only when the caller holds the financials:read scope (API key) or revops:view_margin permission (session).

GET/api/v1/opportunities/:id/delivery-forecast

Authorization

opportunities:readapi key scoperequired
Required scope when calling with an API key.
opportunity:forecast_readsession capabilityoptional
Required capability when calling with a signed-in session.

Path parameters

idstringrequired
Opportunity ID

Example: opp_abc123

Query parameters

refreshbooleanoptional
Force regeneration of the cached forecast snapshot.

Example: true

Request

curl -X GET "https://www.digitalstack360.com/api/v1/opportunities/opp_abc123/delivery-forecast" \
  -H "Authorization: Bearer $DS_API_KEY"

Examples use a placeholder key from your environment. Store your key in $DS_API_KEY — never commit it.

Response

200 OK
{
  "data": {
    "opportunity_id": "opp_abc123",
    "source_type": "scope_document",
    "confidence": 0.85,
    "assumptions": [
      "Probability: 75% — weighted projections are raw × 75%",
      "Delivery start: 2026-07-01",
      "Scope version 3 (last revised 2026-05-08)",
      "Timeline: derived from 4 phase milestones",
      "Staffing: 8 role demands across 3 phases"
    ],
    "scope": {
      "scope_id": "scope_uuid_here",
      "scope_version": 3,
      "last_revised_at": "2026-05-08T14:23:00.000Z",
      "total_hours": 1600,
      "duration_weeks": 20
    },
    "staffing_projection": {
      "peak_fte": 6,
      "peak_weighted_fte": 4.5,
      "total_hours": 1600,
      "total_weighted_hours": 1200,
      "by_phase": [
        {
          "phase": "discovery",
          "roles": [
            {
              "role_id": "role-uuid-1",
              "role_name": "Strategist",
              "fte": 1,
              "hours": 80
            },
            {
              "role_id": "role-uuid-2",
              "role_name": "Project Manager",
              "fte": 0.5,
              "hours": 40
            }
          ]
        },
        {
          "phase": "build",
          "roles": [
            {
              "role_id": "role-uuid-3",
              "role_name": "Frontend Engineer",
              "fte": 3,
              "hours": 960
            },
            {
              "role_id": "role-uuid-4",
              "role_name": "Backend Engineer",
              "fte": 2,
              "hours": 640
            }
          ]
        }
      ]
    },
    "timeline_projection": {
      "delivery_start": "2026-07-01",
      "duration_weeks": 20,
      "estimated_end": "2026-11-18",
      "by_month": [
        {
          "month": "2026-07",
          "phase": "discovery",
          "raw_fte": 1.5,
          "weighted_fte": 1.13,
          "raw_hours": 120,
          "weighted_hours": 90
        },
        {
          "month": "2026-08",
          "phase": "build",
          "raw_fte": 5,
          "weighted_fte": 3.75,
          "raw_hours": 400,
          "weighted_hours": 300
        }
      ]
    },
    "warnings": [
      {
        "code": "HIGH_LOAD",
        "message": "Peak staffing demand exceeds 3 FTE — verify capacity before committing."
      }
    ],
    "forecast_date": "2026-05-14",
    "forecast_computed_at": "2026-05-14T09:00:00.000Z"
  }
}

Errors

401
missing_auth

No credentials provided

401
invalid_api_key

API key is invalid or revoked

403
scope_insufficient

Key lacks opportunities:read scope

422
insufficient_scope

Opportunity has no attached scope or no role demands

404
not_found

Opportunity not found or not in your workspace