Skip to documentation

Generic examplesSign in to personalize workspace URLs.

Download OpenAPI

Saved capacity scenarios

Scenarios are forecasts, not achieved savings. A saved scenario freezes model, currency, resource catalog and basis.

Read project capacity seed inputs

Operation: scenarios.seed · GET /simulator/seed

Read eligible history, rates, assumptions and clearly labelled editable defaults for one project and period. Missing evidence stays unavailable; rate cards use transparent monthly equivalents of 160 hours or 20 days. No algorithm or external service runs. Explicit key scope, current creator actions, tenant/project access and RLS apply on every request and replay.

Required key scope: scenarios:read. Current creator action: simulator.read. Eligible plans: free, starter, growth, scale; legacy contracts: free, entry, growth. stable contract. These badges do not override current role, evidence window, quotas or target ownership.

  • Costs are scenario currency units (not integer cents), time is weeks and allocations/availability are percentages. These forecasts are not booked costs or achieved savings.

  • Inputs retain the shared bounds: staffing and added counts 0–100, percentages 0–100, positive baseWeeks up to 1000, bounded resource costs and supported scenario/resource identities.

  • Updates retain the frozen currency and catalog and require the observed positive version.

  • Write never implies Delete; legacy keys retain only their original reviewed reads.

Parameters (required flags, defaults, units and bounds are the canonical schema):

View schema or synthetic response
JSON

[
  {
    "example": "11111111-1111-4111-8111-111111111111",
    "in": "query",
    "name": "projectId",
    "required": true,
    "schema": {
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)
quot;
, "type": "string" } }, { "example": "2026-01-01", "in": "query", "name": "start", "required": false, "schema": { "format": "date", "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))
quot;
, "type": "string" } }, { "example": "2026-03-31", "in": "query", "name": "end", "required": false, "schema": { "format": "date", "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))
quot;
, "type": "string" } }, { "example": "UTC", "in": "query", "name": "tz", "required": true, "schema": { "maxLength": 64, "minLength": 1, "type": "string" } } ]

Success statuses: 200. The JSON response is the saved/read representation. Synthetic examples below show shape, not customer evidence.

Synthetic response:

View schema or synthetic response
JSON

{
  "canWrite": true,
  "seed": {
    "baseline": {
      "baseWeeks": 12,
      "designerPct": 20,
      "engCost": 24000,
      "engineers": 1,
      "existingLoad": 0,
      "leadPct": 20,
      "otherCost": 9500,
      "pmPct": 30,
      "qa": 0,
      "qaCost": 7500,
      "teamAvailability": 100
    },
    "clientId": "22222222-2222-4222-8222-222222222222",
    "currency": "USD",
    "feature": {
      "complexity": "medium",
      "deadline": null,
      "dependency": "medium",
      "name": "Untitled feature",
      "notes": "",
      "objective": "",
      "parallelizable": 55,
      "productUncertainty": "medium",
      "techUncertainty": "medium",
      "value": ""
    },
    "historicals": {
      "aiSharePct": null,
      "medianCycleWeeks": null,
      "reviewCycles": null,
      "throughputPerWeek": 0.15555555555555556
    },
    "projectId": "11111111-1111-4111-8111-111111111111",
    "resourceCatalog": [
      {
        "icon": "int",
        "id": "int",
        "monthly": 24000,
        "name": "Internal engineer",
        "onboardLoad": 0.3,
        "overhead": 0.6,
        "prod": 100,
        "ramp": 1,
        "sub": "Existing team, immediate alignment"
      },
      {
        "icon": "con",
        "id": "con",
        "monthly": 13000,
        "name": "Contractor",
        "onboardLoad": 0.6,
        "overhead": 0.8,
        "prod": 90,
        "ramp": 2,
        "sub": "Independent, project-scoped"
      },
      {
        "icon": "agc",
        "id": "agc",
        "monthly": 13000,
        "name": "External agency dev",
        "onboardLoad": 0.9,
        "overhead": 1,
        "prod": 85,
        "ramp": 3,
        "sub": "Vendor pod or staff aug"
      },
      {
        "icon": "qa",
        "id": "qa",
        "monthly": 7500,
        "name": "QA / test engineer",
        "onboardLoad": 0.3,
        "overhead": 0.5,
        "prod": 100,
        "ramp": 1,
        "sub": "Releases bottleneck on test cycles"
      },
      {
        "icon": "pm",
        "id": "pm",
        "monthly": 9500,
        "name": "Product manager",
        "onboardLoad": 0.2,
        "overhead": 0.4,
        "prod": 100,
        "ramp": 1,
        "sub": "Reduces clarification overhead"
      },
      {
        "icon": "pm",
        "id": "des",
        "monthly": 9500,
        "name": "Designer",
        "onboardLoad": 0.3,
        "overhead": 0.4,
        "prod": 100,
        "ramp": 1,
        "sub": "Front-loads UX surface work"
      },
      {
        "icon": "int",
        "id": "lead",
        "monthly": 14000,
        "name": "Tech lead / architect",
        "onboardLoad": 0.2,
        "overhead": 0.3,
        "prod": 110,
        "ramp": 0,
        "sub": "Improves review throughput"
      },
      {
        "icon": "qa",
        "id": "ops",
        "monthly": 12000,
        "name": "DevOps / platform",
        "onboardLoad": 0.3,
        "overhead": 0.4,
        "prod": 100,
        "ramp": 1,
        "sub": "Unblocks integration bottlenecks"
      }
    ],
    "scenarios": [
      {
        "add": [],
        "badge": null,
        "id": "s-base",
        "name": "Baseline team",
        "sub": "No extra capacity",
        "tradeoffs": "Slowest of the four options, but cheapest and most predictable."
      },
      {
        "add": [
          {
            "n": 1,
            "resource": "int"
          }
        ],
        "badge": "rec",
        "id": "s-a",
        "name": "Scenario A",
        "sub": "Add 1 senior engineer",
        "tradeoffs": "Best cost-per-week-saved. Adds modest review overhead but stays inside the team operating model."
      },
      {
        "add": [
          {
            "n": 3,
            "resource": "con"
          }
        ],
        "badge": "warn",
        "id": "s-b",
        "name": "Scenario B",
        "sub": "Add 3 contractors",
        "tradeoffs": "Faster delivery, but onboarding eats 2 weeks. Coordination overhead is meaningful at this size."
      },
      {
        "add": [
          {
            "n": 4,
            "resource": "agc"
          }
        ],
        "badge": "bad",
        "id": "s-c",
        "name": "Scenario C",
        "sub": "External agency pod",
        "tradeoffs": "Only justifiable if the deadline is immovable. Cost-per-week-saved is ~3× Scenario A."
      }
    ],
    "sliders": {
      "complexity": 60,
      "coordination": 55,
      "integrationBottleneck": 50,
      "onboarding": 50,
      "parallelizable": 55,
      "qaBottleneck": 35,
      "reviewBottleneck": 40,
      "teamSize": 4
    },
    "sources": {
      "baseline": {
        "note": "Aggregate completed-work and eligible epic-cycle evidence is available for the selected period; each editable field identifies whether it uses that evidence or a default.",
        "source": "history"
      },
      "fields": {
        "baseline": {
          "baseWeeks": "default",
          "designerPct": "default",
          "engCost": "rate_card",
          "engineers": "default",
          "existingLoad": "default",
          "leadPct": "default",
          "otherCost": "default",
          "pmPct": "default",
          "qa": "default",
          "qaCost": "default",
          "teamAvailability": "default"
        },
        "feature": {
          "complexity": "default",
          "deadline": "default",
          "dependency": "default",
          "name": "default",
          "notes": "default",
          "objective": "default",
          "parallelizable": "default",
          "productUncertainty": "default",
          "techUncertainty": "default",
          "value": "default"
        },
        "historicals": {
          "aiSharePct": "default",
          "medianCycleWeeks": "default",
          "reviewCycles": "default",
          "throughputPerWeek": "history"
        },
        "resourceCatalog": {
          "agc": "default",
          "con": "default",
          "des": "default",
          "int": "rate_card",
          "lead": "default",
          "ops": "default",
          "pm": "default",
          "qa": "default"
        }
      },
      "historicals": {
        "note": "Aggregate throughput, eligible epic-cycle, review, and explicitly self-reported AI evidence for the selected period.",
        "source": "history"
      },
      "rates": {
        "note": "Monthly equivalents use the current engagement rate card (160 hours or 20 days).",
        "source": "rate_card"
      }
    }
  }
}

Use IDs and versions from your own preceding responses. Replace the synthetic UUIDs, dates and names in these independent examples. Set SCOPEWORTH_API_BASE and SCOPEWORTH_API_KEY only on your server.

cURL

cURL / shell
curl --request GET "$SCOPEWORTH_API_BASE/organizations/example-org/workspaces/example-workspace/simulator/seed?projectId=11111111-1111-4111-8111-111111111111&start=2026-01-01&end=2026-03-31&tz=UTC" \
  --header "Authorization: Bearer $SCOPEWORTH_API_KEY"

JavaScript fetch

JavaScript
// Run on your server. API_BASE ends in /api/v1 (combined host) or /v1 (verified cell).
const response = await fetch(process.env.SCOPEWORTH_API_BASE + "/organizations/example-org/workspaces/example-workspace/simulator/seed?projectId=11111111-1111-4111-8111-111111111111&start=2026-01-01&end=2026-03-31&tz=UTC", {
  method: "GET",
  headers: {
  "Authorization": `Bearer ${process.env.SCOPEWORTH_API_KEY}`
},
});
if (!response.ok) throw new Error(`ScopeWorth refused request: ${response.status}`);
const result = await response.json();

Python requests

Python
import os, requests
headers = {"Authorization":"Bearer " + os.environ["SCOPEWORTH_API_KEY"]}
response = requests.request("GET", os.environ["SCOPEWORTH_API_BASE"] + "/organizations/example-org/workspaces/example-workspace/simulator/seed?projectId=11111111-1111-4111-8111-111111111111&start=2026-01-01&end=2026-03-31&tz=UTC", headers=headers, timeout=30)
response.raise_for_status()
result = response.json()

For refusals, follow error recovery. A scope or plan badge is eligibility, not proof of authorization or available evidence. Read current directory IDs and versions before correcting a request. Keep an idempotency key for one unchanged mutation attempt; never blindly retry uncertain external work.

Read the permitted model/basis before constructing inputs. Do not copy a forecast result into an actual-cost field.

Read saved capacity scenarios

Operation: scenarios.list · GET /simulator/scenarios

Read all saved scenarios for one authorized client, newest update first. Complete inputs, frozen catalog/currency/model and calculated results are included; no pagination or detail GET exists. Explicit key scope, current creator actions, tenant/project access and RLS apply on every request and replay.

Required key scope: scenarios:read. Current creator action: simulator.read. Eligible plans: free, starter, growth, scale; legacy contracts: free, entry, growth. stable contract. These badges do not override current role, evidence window, quotas or target ownership.

  • Costs are scenario currency units (not integer cents), time is weeks and allocations/availability are percentages. These forecasts are not booked costs or achieved savings.

  • Inputs retain the shared bounds: staffing and added counts 0–100, percentages 0–100, positive baseWeeks up to 1000, bounded resource costs and supported scenario/resource identities.

  • Updates retain the frozen currency and catalog and require the observed positive version.

  • Write never implies Delete; legacy keys retain only their original reviewed reads.

Parameters (required flags, defaults, units and bounds are the canonical schema):

View schema or synthetic response
JSON

[
  {
    "example": "22222222-2222-4222-8222-222222222222",
    "in": "query",
    "name": "clientId",
    "required": true,
    "schema": {
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)
quot;
, "type": "string" } } ]

Success statuses: 200. The JSON response is the saved/read representation. Synthetic examples below show shape, not customer evidence.

Synthetic response:

View schema or synthetic response
JSON

{
  "canWrite": true,
  "scenarios": [
    {
      "clientId": "22222222-2222-4222-8222-222222222222",
      "createdAt": "2026-10-01T08:15:25.125Z",
      "currency": "USD",
      "id": "33333333-3333-4333-8333-333333333333",
      "inputs": {
        "baseline": {
          "baseWeeks": 12,
          "designerPct": 20,
          "engCost": 24000,
          "engineers": 1,
          "existingLoad": 0,
          "leadPct": 20,
          "otherCost": 9500,
          "pmPct": 30,
          "qa": 0,
          "qaCost": 7500,
          "teamAvailability": 100
        },
        "feature": {
          "complexity": "medium",
          "deadline": null,
          "dependency": "medium",
          "name": "Untitled feature",
          "notes": "",
          "objective": "",
          "parallelizable": 55,
          "productUncertainty": "medium",
          "techUncertainty": "medium",
          "value": ""
        },
        "scenarios": [
          {
            "add": [],
            "badge": null,
            "id": "s-base",
            "name": "Baseline team",
            "sub": "No extra capacity",
            "tradeoffs": "Slowest of the four options, but cheapest and most predictable."
          },
          {
            "add": [
              {
                "n": 1,
                "resource": "int"
              }
            ],
            "badge": "rec",
            "id": "s-a",
            "name": "Scenario A",
            "sub": "Add 1 senior engineer",
            "tradeoffs": "Best cost-per-week-saved. Adds modest review overhead but stays inside the team operating model."
          },
          {
            "add": [
              {
                "n": 3,
                "resource": "con"
              }
            ],
            "badge": "warn",
            "id": "s-b",
            "name": "Scenario B",
            "sub": "Add 3 contractors",
            "tradeoffs": "Faster delivery, but onboarding eats 2 weeks. Coordination overhead is meaningful at this size."
          },
          {
            "add": [
              {
                "n": 4,
                "resource": "agc"
              }
            ],
            "badge": "bad",
            "id": "s-c",
            "name": "Scenario C",
            "sub": "External agency pod",
            "tradeoffs": "Only justifiable if the deadline is immovable. Cost-per-week-saved is ~3× Scenario A."
          }
        ],
        "selectedScenarioId": "s-a",
        "sliders": {
          "complexity": 60,
          "coordination": 55,
          "integrationBottleneck": 50,
          "onboarding": 50,
          "parallelizable": 55,
          "qaBottleneck": 35,
          "reviewBottleneck": 40,
          "teamSize": 4
        }
      },
      "modelVersion": "dashboard-simulator-v1",
      "name": "Reviewed capacity forecast",
      "projectId": "11111111-1111-4111-8111-111111111111",
      "resourceCatalog": [
        {
          "icon": "int",
          "id": "int",
          "monthly": 24000,
          "name": "Internal engineer",
          "onboardLoad": 0.3,
          "overhead": 0.6,
          "prod": 100,
          "ramp": 1,
          "sub": "Existing team, immediate alignment"
        },
        {
          "icon": "con",
          "id": "con",
          "monthly": 13000,
          "name": "Contractor",
          "onboardLoad": 0.6,
          "overhead": 0.8,
          "prod": 90,
          "ramp": 2,
          "sub": "Independent, project-scoped"
        },
        {
          "icon": "agc",
          "id": "agc",
          "monthly": 13000,
          "name": "External agency dev",
          "onboardLoad": 0.9,
          "overhead": 1,
          "prod": 85,
          "ramp": 3,
          "sub": "Vendor pod or staff aug"
        },
        {
          "icon": "qa",
          "id": "qa",
          "monthly": 7500,
          "name": "QA / test engineer",
          "onboardLoad": 0.3,
          "overhead": 0.5,
          "prod": 100,
          "ramp": 1,
          "sub": "Releases bottleneck on test cycles"
        },
        {
          "icon": "pm",
          "id": "pm",
          "monthly": 9500,
          "name": "Product manager",
          "onboardLoad": 0.2,
          "overhead": 0.4,
          "prod": 100,
          "ramp": 1,
          "sub": "Reduces clarification overhead"
        },
        {
          "icon": "pm",
          "id": "des",
          "monthly": 9500,
          "name": "Designer",
          "onboardLoad": 0.3,
          "overhead": 0.4,
          "prod": 100,
          "ramp": 1,
          "sub": "Front-loads UX surface work"
        },
        {
          "icon": "int",
          "id": "lead",
          "monthly": 14000,
          "name": "Tech lead / architect",
          "onboardLoad": 0.2,
          "overhead": 0.3,
          "prod": 110,
          "ramp": 0,
          "sub": "Improves review throughput"
        },
        {
          "icon": "qa",
          "id": "ops",
          "monthly": 12000,
          "name": "DevOps / platform",
          "onboardLoad": 0.3,
          "overhead": 0.4,
          "prod": 100,
          "ramp": 1,
          "sub": "Unblocks integration bottlenecks"
        }
      ],
      "result": {
        "addedCost": 32536.383051354376,
        "baseCost": 45090.93349181073,
        "confLabel": "Medium",
        "confScore": 70,
        "effectiveN": 3.1702001188825046,
        "effectiveRatio": 0.7925500297206262,
        "grossN": 4,
        "monthlyBurn": 54650,
        "rampWeeksLost": 0.56,
        "speedup": 1.9704091262659347,
        "totalCost": 77627.3165431651,
        "usedAlpha": 0.8724999999999999,
        "usedParallel": 0.55,
        "weeks": 6.370105775515186
      },
      "status": "discovery",
      "updatedAt": "2026-10-01T08:15:25.137Z",
      "version": 2
    }
  ]
}

Use IDs and versions from your own preceding responses. Replace the synthetic UUIDs, dates and names in these independent examples. Set SCOPEWORTH_API_BASE and SCOPEWORTH_API_KEY only on your server.

cURL

cURL / shell
curl --request GET "$SCOPEWORTH_API_BASE/organizations/example-org/workspaces/example-workspace/simulator/scenarios?clientId=22222222-2222-4222-8222-222222222222" \
  --header "Authorization: Bearer $SCOPEWORTH_API_KEY"

JavaScript fetch

JavaScript
// Run on your server. API_BASE ends in /api/v1 (combined host) or /v1 (verified cell).
const response = await fetch(process.env.SCOPEWORTH_API_BASE + "/organizations/example-org/workspaces/example-workspace/simulator/scenarios?clientId=22222222-2222-4222-8222-222222222222", {
  method: "GET",
  headers: {
  "Authorization": `Bearer ${process.env.SCOPEWORTH_API_KEY}`
},
});
if (!response.ok) throw new Error(`ScopeWorth refused request: ${response.status}`);
const result = await response.json();

Python requests

Python
import os, requests
headers = {"Authorization":"Bearer " + os.environ["SCOPEWORTH_API_KEY"]}
response = requests.request("GET", os.environ["SCOPEWORTH_API_BASE"] + "/organizations/example-org/workspaces/example-workspace/simulator/scenarios?clientId=22222222-2222-4222-8222-222222222222", headers=headers, timeout=30)
response.raise_for_status()
result = response.json()

For refusals, follow error recovery. A scope or plan badge is eligibility, not proof of authorization or available evidence. Read current directory IDs and versions before correcting a request. Keep an idempotency key for one unchanged mutation attempt; never blindly retry uncertain external work.

Save a capacity forecast

Operation: scenarios.create · POST /simulator/scenarios

Save supported seed-derived inputs and calculate with the existing dashboard-simulator-v1 model. Resource monthly costs can be edited on the first save, but resource identities and productivity/ramp/overhead coefficients remain frozen. A retry saves one scenario. Explicit key scope, current creator actions, tenant/project access and RLS apply on every request and replay.

Required key scope: scenarios:write. Current creator action: simulator.manage. Eligible plans: free, starter, growth, scale; legacy contracts: free, entry, growth. stable contract. These badges do not override current role, evidence window, quotas or target ownership.

  • Costs are scenario currency units (not integer cents), time is weeks and allocations/availability are percentages. These forecasts are not booked costs or achieved savings.

  • Inputs retain the shared bounds: staffing and added counts 0–100, percentages 0–100, positive baseWeeks up to 1000, bounded resource costs and supported scenario/resource identities.

  • Updates retain the frozen currency and catalog and require the observed positive version.

  • Write never implies Delete; legacy keys retain only their original reviewed reads.

Parameters (required flags, defaults, units and bounds are the canonical schema):

View schema or synthetic response
JSON

[
  {
    "example": "example-scenarios.create",
    "in": "header",
    "name": "idempotency-key",
    "required": true,
    "schema": {
      "pattern": "^[\\x21-\\x7e]{1,200}
quot;
, "type": "string" } } ]

Request body schema:

View schema or synthetic response
JSON

{
  "content": {
    "application/json": {
      "examples": {
        "synthetic1": {
          "value": {
            "clientId": "22222222-2222-4222-8222-222222222222",
            "currency": "USD",
            "inputs": {
              "baseline": {
                "baseWeeks": 12,
                "designerPct": 20,
                "engCost": 24000,
                "engineers": 1,
                "existingLoad": 0,
                "leadPct": 20,
                "otherCost": 9500,
                "pmPct": 30,
                "qa": 0,
                "qaCost": 7500,
                "teamAvailability": 100
              },
              "feature": {
                "complexity": "medium",
                "deadline": null,
                "dependency": "medium",
                "name": "Untitled feature",
                "notes": "",
                "objective": "",
                "parallelizable": 55,
                "productUncertainty": "medium",
                "techUncertainty": "medium",
                "value": ""
              },
              "scenarios": [
                {
                  "add": [],
                  "badge": null,
                  "id": "s-base",
                  "name": "Baseline team",
                  "sub": "No extra capacity",
                  "tradeoffs": "Slowest of the four options, but cheapest and most predictable."
                },
                {
                  "add": [
                    {
                      "n": 1,
                      "resource": "int"
                    }
                  ],
                  "badge": "rec",
                  "id": "s-a",
                  "name": "Scenario A",
                  "sub": "Add 1 senior engineer",
                  "tradeoffs": "Best cost-per-week-saved. Adds modest review overhead but stays inside the team operating model."
                },
                {
                  "add": [
                    {
                      "n": 3,
                      "resource": "con"
                    }
                  ],
                  "badge": "warn",
                  "id": "s-b",
                  "name": "Scenario B",
                  "sub": "Add 3 contractors",
                  "tradeoffs": "Faster delivery, but onboarding eats 2 weeks. Coordination overhead is meaningful at this size."
                },
                {
                  "add": [
                    {
                      "n": 4,
                      "resource": "agc"
                    }
                  ],
                  "badge": "bad",
                  "id": "s-c",
                  "name": "Scenario C",
                  "sub": "External agency pod",
                  "tradeoffs": "Only justifiable if the deadline is immovable. Cost-per-week-saved is ~3× Scenario A."
                }
              ],
              "selectedScenarioId": "s-a",
              "sliders": {
                "complexity": 60,
                "coordination": 55,
                "integrationBottleneck": 50,
                "onboarding": 50,
                "parallelizable": 55,
                "qaBottleneck": 35,
                "reviewBottleneck": 40,
                "teamSize": 4
              }
            },
            "name": "Example capacity forecast",
            "projectId": "11111111-1111-4111-8111-111111111111",
            "resourceCatalog": [
              {
                "icon": "int",
                "id": "int",
                "monthly": 24000,
                "name": "Internal engineer",
                "onboardLoad": 0.3,
                "overhead": 0.6,
                "prod": 100,
                "ramp": 1,
                "sub": "Existing team, immediate alignment"
              },
              {
                "icon": "con",
                "id": "con",
                "monthly": 13000,
                "name": "Contractor",
                "onboardLoad": 0.6,
                "overhead": 0.8,
                "prod": 90,
                "ramp": 2,
                "sub": "Independent, project-scoped"
              },
              {
                "icon": "agc",
                "id": "agc",
                "monthly": 13000,
                "name": "External agency dev",
                "onboardLoad": 0.9,
                "overhead": 1,
                "prod": 85,
                "ramp": 3,
                "sub": "Vendor pod or staff aug"
              },
              {
                "icon": "qa",
                "id": "qa",
                "monthly": 7500,
                "name": "QA / test engineer",
                "onboardLoad": 0.3,
                "overhead": 0.5,
                "prod": 100,
                "ramp": 1,
                "sub": "Releases bottleneck on test cycles"
              },
              {
                "icon": "pm",
                "id": "pm",
                "monthly": 9500,
                "name": "Product manager",
                "onboardLoad": 0.2,
                "overhead": 0.4,
                "prod": 100,
                "ramp": 1,
                "sub": "Reduces clarification overhead"
              },
              {
                "icon": "pm",
                "id": "des",
                "monthly": 9500,
                "name": "Designer",
                "onboardLoad": 0.3,
                "overhead": 0.4,
                "prod": 100,
                "ramp": 1,
                "sub": "Front-loads UX surface work"
              },
              {
                "icon": "int",
                "id": "lead",
                "monthly": 14000,
                "name": "Tech lead / architect",
                "onboardLoad": 0.2,
                "overhead": 0.3,
                "prod": 110,
                "ramp": 0,
                "sub": "Improves review throughput"
              },
              {
                "icon": "qa",
                "id": "ops",
                "monthly": 12000,
                "name": "DevOps / platform",
                "onboardLoad": 0.3,
                "overhead": 0.4,
                "prod": 100,
                "ramp": 1,
                "sub": "Unblocks integration bottlenecks"
              }
            ],
            "status": "discovery"
          }
        }
      },
      "schema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "properties": {
          "clientId": {
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)
quot;
, "type": "string" }, "currency": { "anyOf": [ { "pattern": "^[A-Z]{3}
quot;
, "type": "string" }, { "type": "null" } ] }, "inputs": { "properties": { "baseline": { "properties": { "baseWeeks": { "exclusiveMinimum": 0, "maximum": 1000, "type": "number" }, "designerPct": { "maximum": 100, "minimum": 0, "type": "number" }, "engCost": { "minimum": 0, "type": "number" }, "engineers": { "maximum": 100, "minimum": 0, "type": "integer" }, "existingLoad": { "maximum": 100, "minimum": 0, "type": "number" }, "leadPct": { "maximum": 100, "minimum": 0, "type": "number" }, "otherCost": { "minimum": 0, "type": "number" }, "pmPct": { "maximum": 100, "minimum": 0, "type": "number" }, "qa": { "maximum": 100, "minimum": 0, "type": "integer" }, "qaCost": { "minimum": 0, "type": "number" }, "teamAvailability": { "maximum": 100, "minimum": 0, "type": "number" } }, "required": [ "engineers", "qa", "pmPct", "designerPct", "leadPct", "engCost", "qaCost", "otherCost", "teamAvailability", "existingLoad", "baseWeeks" ], "type": "object" }, "feature": { "properties": { "complexity": { "enum": [ "low", "medium", "high", "very-high" ], "type": "string" }, "deadline": { "anyOf": [ { "format": "date", "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))
quot;
, "type": "string" }, { "type": "null" } ] }, "dependency": { "enum": [ "low", "medium", "high" ], "type": "string" }, "name": { "maxLength": 200, "minLength": 1, "type": "string" }, "notes": { "maxLength": 4000, "type": "string" }, "objective": { "maxLength": 2000, "type": "string" }, "parallelizable": { "maximum": 100, "minimum": 0, "type": "number" }, "productUncertainty": { "enum": [ "low", "medium", "high" ], "type": "string" }, "techUncertainty": { "enum": [ "low", "medium", "high" ], "type": "string" }, "value": { "maxLength": 2000, "type": "string" } }, "required": [ "name", "objective", "value", "complexity", "dependency", "techUncertainty", "productUncertainty", "deadline", "notes", "parallelizable" ], "type": "object" }, "scenarios": { "items": { "properties": { "add": { "items": { "properties": { "n": { "maximum": 100, "minimum": 0, "type": "integer" }, "resource": { "maxLength": 40, "minLength": 1, "type": "string" } }, "required": [ "resource", "n" ], "type": "object" }, "maxItems": 20, "type": "array" }, "badge": { "anyOf": [ { "enum": [ "rec", "warn", "bad" ], "type": "string" }, { "type": "null" } ] }, "id": { "maxLength": 80, "minLength": 1, "type": "string" }, "name": { "maxLength": 200, "minLength": 1, "type": "string" }, "sub": { "maxLength": 300, "type": "string" }, "tradeoffs": { "maxLength": 2000, "type": "string" } }, "required": [ "id", "name", "sub", "add", "badge", "tradeoffs" ], "type": "object" }, "maxItems": 20, "minItems": 1, "type": "array" }, "selectedScenarioId": { "maxLength": 80, "minLength": 1, "type": "string" }, "sliders": { "properties": { "complexity": { "maximum": 100, "minimum": 0, "type": "number" }, "coordination": { "maximum": 100, "minimum": 0, "type": "number" }, "integrationBottleneck": { "maximum": 100, "minimum": 0, "type": "number" }, "onboarding": { "maximum": 100, "minimum": 0, "type": "number" }, "parallelizable": { "maximum": 100, "minimum": 0, "type": "number" }, "qaBottleneck": { "maximum": 100, "minimum": 0, "type": "number" }, "reviewBottleneck": { "maximum": 100, "minimum": 0, "type": "number" }, "teamSize": { "maximum": 100, "minimum": 1, "type": "integer" } }, "type": "object" } }, "required": [ "feature", "baseline", "scenarios", "sliders", "selectedScenarioId" ], "type": "object" }, "name": { "maxLength": 200, "minLength": 1, "type": "string" }, "projectId": { "format": "uuid", "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)
quot;
, "type": "string" }, "resourceCatalog": { "items": { "properties": { "icon": { "maxLength": 40, "minLength": 1, "type": "string" }, "id": { "maxLength": 40, "minLength": 1, "type": "string" }, "monthly": { "maximum": 10000000, "minimum": 0, "type": "number" }, "name": { "maxLength": 120, "minLength": 1, "type": "string" }, "onboardLoad": { "maximum": 10, "minimum": 0, "type": "number" }, "overhead": { "maximum": 10, "minimum": 0, "type": "number" }, "prod": { "maximum": 200, "minimum": 0, "type": "number" }, "ramp": { "maximum": 52, "minimum": 0, "type": "number" }, "sub": { "maxLength": 300, "minLength": 1, "type": "string" } }, "required": [ "id", "name", "sub", "icon", "ramp", "monthly", "prod", "overhead", "onboardLoad" ], "type": "object" }, "maxItems": 20, "minItems": 1, "type": "array" }, "status": { "enum": [ "live", "discovery", "closed" ], "type": "string" }, "version": { "exclusiveMinimum": 0, "maximum": 9007199254740991, "type": "integer" } }, "required": [ "clientId", "projectId", "name", "status", "inputs", "currency" ], "type": "object" } } }, "required": true }

Success statuses: 201. The JSON response is the saved/read representation. Synthetic examples below show shape, not customer evidence.

Synthetic response:

View schema or synthetic response
JSON

{
  "clientId": "22222222-2222-4222-8222-222222222222",
  "createdAt": "2026-10-01T08:15:25.125Z",
  "currency": "USD",
  "id": "33333333-3333-4333-8333-333333333333",
  "inputs": {
    "baseline": {
      "baseWeeks": 12,
      "designerPct": 20,
      "engCost": 24000,
      "engineers": 1,
      "existingLoad": 0,
      "leadPct": 20,
      "otherCost": 9500,
      "pmPct": 30,
      "qa": 0,
      "qaCost": 7500,
      "teamAvailability": 100
    },
    "feature": {
      "complexity": "medium",
      "deadline": null,
      "dependency": "medium",
      "name": "Untitled feature",
      "notes": "",
      "objective": "",
      "parallelizable": 55,
      "productUncertainty": "medium",
      "techUncertainty": "medium",
      "value": ""
    },
    "scenarios": [
      {
        "add": [],
        "badge": null,
        "id": "s-base",
        "name": "Baseline team",
        "sub": "No extra capacity",
        "tradeoffs": "Slowest of the four options, but cheapest and most predictable."
      },
      {
        "add": [
          {
            "n": 1,
            "resource": "int"
          }
        ],
        "badge": "rec",
        "id": "s-a",
        "name": "Scenario A",
        "sub": "Add 1 senior engineer",
        "tradeoffs": "Best cost-per-week-saved. Adds modest review overhead but stays inside the team operating model."
      },
      {
        "add": [
          {
            "n": 3,
            "resource": "con"
          }
        ],
        "badge": "warn",
        "id": "s-b",
        "name": "Scenario B",
        "sub": "Add 3 contractors",
        "tradeoffs": "Faster delivery, but onboarding eats 2 weeks. Coordination overhead is meaningful at this size."
      },
      {
        "add": [
          {
            "n": 4,
            "resource": "agc"
          }
        ],
        "badge": "bad",
        "id": "s-c",
        "name": "Scenario C",
        "sub": "External agency pod",
        "tradeoffs": "Only justifiable if the deadline is immovable. Cost-per-week-saved is ~3× Scenario A."
      }
    ],
    "selectedScenarioId": "s-a",
    "sliders": {
      "complexity": 60,
      "coordination": 55,
      "integrationBottleneck": 50,
      "onboarding": 50,
      "parallelizable": 55,
      "qaBottleneck": 35,
      "reviewBottleneck": 40,
      "teamSize": 4
    }
  },
  "modelVersion": "dashboard-simulator-v1",
  "name": "Example capacity forecast",
  "projectId": "11111111-1111-4111-8111-111111111111",
  "resourceCatalog": [
    {
      "icon": "int",
      "id": "int",
      "monthly": 24000,
      "name": "Internal engineer",
      "onboardLoad": 0.3,
      "overhead": 0.6,
      "prod": 100,
      "ramp": 1,
      "sub": "Existing team, immediate alignment"
    },
    {
      "icon": "con",
      "id": "con",
      "monthly": 13000,
      "name": "Contractor",
      "onboardLoad": 0.6,
      "overhead": 0.8,
      "prod": 90,
      "ramp": 2,
      "sub": "Independent, project-scoped"
    },
    {
      "icon": "agc",
      "id": "agc",
      "monthly": 13000,
      "name": "External agency dev",
      "onboardLoad": 0.9,
      "overhead": 1,
      "prod": 85,
      "ramp": 3,
      "sub": "Vendor pod or staff aug"
    },
    {
      "icon": "qa",
      "id": "qa",
      "monthly": 7500,
      "name": "QA / test engineer",
      "onboardLoad": 0.3,
      "overhead": 0.5,
      "prod": 100,
      "ramp": 1,
      "sub": "Releases bottleneck on test cycles"
    },
    {
      "icon": "pm",
      "id": "pm",
      "monthly": 9500,
      "name": "Product manager",
      "onboardLoad": 0.2,
      "overhead": 0.4,
      "prod": 100,
      "ramp": 1,
      "sub": "Reduces clarification overhead"
    },
    {
      "icon": "pm",
      "id": "des",
      "monthly": 9500,
      "name": "Designer",
      "onboardLoad": 0.3,
      "overhead": 0.4,
      "prod": 100,
      "ramp": 1,
      "sub": "Front-loads UX surface work"
    },
    {
      "icon": "int",
      "id": "lead",
      "monthly": 14000,
      "name": "Tech lead / architect",
      "onboardLoad": 0.2,
      "overhead": 0.3,
      "prod": 110,
      "ramp": 0,
      "sub": "Improves review throughput"
    },
    {
      "icon": "qa",
      "id": "ops",
      "monthly": 12000,
      "name": "DevOps / platform",
      "onboardLoad": 0.3,
      "overhead": 0.4,
      "prod": 100,
      "ramp": 1,
      "sub": "Unblocks integration bottlenecks"
    }
  ],
  "result": {
    "addedCost": 32536.383051354376,
    "baseCost": 45090.93349181073,
    "confLabel": "Medium",
    "confScore": 70,
    "effectiveN": 3.1702001188825046,
    "effectiveRatio": 0.7925500297206262,
    "grossN": 4,
    "monthlyBurn": 54650,
    "rampWeeksLost": 0.56,
    "speedup": 1.9704091262659347,
    "totalCost": 77627.3165431651,
    "usedAlpha": 0.8724999999999999,
    "usedParallel": 0.55,
    "weeks": 6.370105775515186
  },
  "status": "discovery",
  "updatedAt": "2026-10-01T08:15:25.125Z",
  "version": 1
}

Use IDs and versions from your own preceding responses. Replace the synthetic UUIDs, dates and names in these independent examples. Set SCOPEWORTH_API_BASE and SCOPEWORTH_API_KEY only on your server.

cURL

cURL / shell
curl --request POST "$SCOPEWORTH_API_BASE/organizations/example-org/workspaces/example-workspace/simulator/scenarios" \
  --header "Authorization: Bearer $SCOPEWORTH_API_KEY" \
  --header 'Content-Type: application/json' \
  --header 'Idempotency-Key: example-operation-attempt-1' \
  --data-raw '{"clientId":"22222222-2222-4222-8222-222222222222","projectId":"11111111-1111-4111-8111-111111111111","name":"Example capacity forecast","status":"discovery","inputs":{"feature":{"name":"Untitled feature","objective":"","value":"","complexity":"medium","dependency":"medium","techUncertainty":"medium","productUncertainty":"medium","deadline":null,"notes":"","parallelizable":55},"baseline":{"engineers":1,"qa":0,"pmPct":30,"designerPct":20,"leadPct":20,"engCost":24000,"qaCost":7500,"otherCost":9500,"teamAvailability":100,"existingLoad":0,"baseWeeks":12},"scenarios":[{"id":"s-base","name":"Baseline team","sub":"No extra capacity","add":[],"badge":null,"tradeoffs":"Slowest of the four options, but cheapest and most predictable."},{"id":"s-a","name":"Scenario A","sub":"Add 1 senior engineer","add":[{"resource":"int","n":1}],"badge":"rec","tradeoffs":"Best cost-per-week-saved. Adds modest review overhead but stays inside the team operating model."},{"id":"s-b","name":"Scenario B","sub":"Add 3 contractors","add":[{"resource":"con","n":3}],"badge":"warn","tradeoffs":"Faster delivery, but onboarding eats 2 weeks. Coordination overhead is meaningful at this size."},{"id":"s-c","name":"Scenario C","sub":"External agency pod","add":[{"resource":"agc","n":4}],"badge":"bad","tradeoffs":"Only justifiable if the deadline is immovable. Cost-per-week-saved is ~3× Scenario A."}],"sliders":{"teamSize":4,"complexity":60,"coordination":55,"onboarding":50,"parallelizable":55,"reviewBottleneck":40,"integrationBottleneck":50,"qaBottleneck":35},"selectedScenarioId":"s-a"},"currency":"USD","resourceCatalog":[{"id":"int","name":"Internal engineer","sub":"Existing team, immediate alignment","icon":"int","ramp":1,"monthly":24000,"prod":100,"overhead":0.6,"onboardLoad":0.3},{"id":"con","name":"Contractor","sub":"Independent, project-scoped","icon":"con","ramp":2,"monthly":13000,"prod":90,"overhead":0.8,"onboardLoad":0.6},{"id":"agc","name":"External agency dev","sub":"Vendor pod or staff aug","icon":"agc","ramp":3,"monthly":13000,"prod":85,"overhead":1,"onboardLoad":0.9},{"id":"qa","name":"QA / test engineer","sub":"Releases bottleneck on test cycles","icon":"qa","ramp":1,"monthly":7500,"prod":100,"overhead":0.5,"onboardLoad":0.3},{"id":"pm","name":"Product manager","sub":"Reduces clarification overhead","icon":"pm","ramp":1,"monthly":9500,"prod":100,"overhead":0.4,"onboardLoad":0.2},{"id":"des","name":"Designer","sub":"Front-loads UX surface work","icon":"pm","ramp":1,"monthly":9500,"prod":100,"overhead":0.4,"onboardLoad":0.3},{"id":"lead","name":"Tech lead / architect","sub":"Improves review throughput","icon":"int","ramp":0,"monthly":14000,"prod":110,"overhead":0.3,"onboardLoad":0.2},{"id":"ops","name":"DevOps / platform","sub":"Unblocks integration bottlenecks","icon":"qa","ramp":1,"monthly":12000,"prod":100,"overhead":0.4,"onboardLoad":0.3}]}'

JavaScript fetch

JavaScript
// Run on your server. API_BASE ends in /api/v1 (combined host) or /v1 (verified cell).
const response = await fetch(process.env.SCOPEWORTH_API_BASE + "/organizations/example-org/workspaces/example-workspace/simulator/scenarios", {
  method: "POST",
  headers: {
  "Authorization": `Bearer ${process.env.SCOPEWORTH_API_KEY}`,
  "Content-Type": "application/json",
  "Idempotency-Key": "example-operation-attempt-1"
},
  body: JSON.stringify({
  "clientId": "22222222-2222-4222-8222-222222222222",
  "projectId": "11111111-1111-4111-8111-111111111111",
  "name": "Example capacity forecast",
  "status": "discovery",
  "inputs": {
    "feature": {
      "name": "Untitled feature",
      "objective": "",
      "value": "",
      "complexity": "medium",
      "dependency": "medium",
      "techUncertainty": "medium",
      "productUncertainty": "medium",
      "deadline": null,
      "notes": "",
      "parallelizable": 55
    },
    "baseline": {
      "engineers": 1,
      "qa": 0,
      "pmPct": 30,
      "designerPct": 20,
      "leadPct": 20,
      "engCost": 24000,
      "qaCost": 7500,
      "otherCost": 9500,
      "teamAvailability": 100,
      "existingLoad": 0,
      "baseWeeks": 12
    },
    "scenarios": [
      {
        "id": "s-base",
        "name": "Baseline team",
        "sub": "No extra capacity",
        "add": [],
        "badge": null,
        "tradeoffs": "Slowest of the four options, but cheapest and most predictable."
      },
      {
        "id": "s-a",
        "name": "Scenario A",
        "sub": "Add 1 senior engineer",
        "add": [
          {
            "resource": "int",
            "n": 1
          }
        ],
        "badge": "rec",
        "tradeoffs": "Best cost-per-week-saved. Adds modest review overhead but stays inside the team operating model."
      },
      {
        "id": "s-b",
        "name": "Scenario B",
        "sub": "Add 3 contractors",
        "add": [
          {
            "resource": "con",
            "n": 3
          }
        ],
        "badge": "warn",
        "tradeoffs": "Faster delivery, but onboarding eats 2 weeks. Coordination overhead is meaningful at this size."
      },
      {
        "id": "s-c",
        "name": "Scenario C",
        "sub": "External agency pod",
        "add": [
          {
            "resource": "agc",
            "n": 4
          }
        ],
        "badge": "bad",
        "tradeoffs": "Only justifiable if the deadline is immovable. Cost-per-week-saved is ~3× Scenario A."
      }
    ],
    "sliders": {
      "teamSize": 4,
      "complexity": 60,
      "coordination": 55,
      "onboarding": 50,
      "parallelizable": 55,
      "reviewBottleneck": 40,
      "integrationBottleneck": 50,
      "qaBottleneck": 35
    },
    "selectedScenarioId": "s-a"
  },
  "currency": "USD",
  "resourceCatalog": [
    {
      "id": "int",
      "name": "Internal engineer",
      "sub": "Existing team, immediate alignment",
      "icon": "int",
      "ramp": 1,
      "monthly": 24000,
      "prod": 100,
      "overhead": 0.6,
      "onboardLoad": 0.3
    },
    {
      "id": "con",
      "name": "Contractor",
      "sub": "Independent, project-scoped",
      "icon": "con",
      "ramp": 2,
      "monthly": 13000,
      "prod": 90,
      "overhead": 0.8,
      "onboardLoad": 0.6
    },
    {
      "id": "agc",
      "name": "External agency dev",
      "sub": "Vendor pod or staff aug",
      "icon": "agc",
      "ramp": 3,
      "monthly": 13000,
      "prod": 85,
      "overhead": 1,
      "onboardLoad": 0.9
    },
    {
      "id": "qa",
      "name": "QA / test engineer",
      "sub": "Releases bottleneck on test cycles",
      "icon": "qa",
      "ramp": 1,
      "monthly": 7500,
      "prod": 100,
      "overhead": 0.5,
      "onboardLoad": 0.3
    },
    {
      "id": "pm",
      "name": "Product manager",
      "sub": "Reduces clarification overhead",
      "icon": "pm",
      "ramp": 1,
      "monthly": 9500,
      "prod": 100,
      "overhead": 0.4,
      "onboardLoad": 0.2
    },
    {
      "id": "des",
      "name": "Designer",
      "sub": "Front-loads UX surface work",
      "icon": "pm",
      "ramp": 1,
      "monthly": 9500,
      "prod": 100,
      "overhead": 0.4,
      "onboardLoad": 0.3
    },
    {
      "id": "lead",
      "name": "Tech lead / architect",
      "sub": "Improves review throughput",
      "icon": "int",
      "ramp": 0,
      "monthly": 14000,
      "prod": 110,
      "overhead": 0.3,
      "onboardLoad": 0.2
    },
    {
      "id": "ops",
      "name": "DevOps / platform",
      "sub": "Unblocks integration bottlenecks",
      "icon": "qa",
      "ramp": 1,
      "monthly": 12000,
      "prod": 100,
      "overhead": 0.4,
      "onboardLoad": 0.3
    }
  ]
}),
});
if (!response.ok) throw new Error(`ScopeWorth refused request: ${response.status}`);
const result = await response.json();

Python requests

Python
import os, requests
headers = {"Authorization":"Bearer " + os.environ["SCOPEWORTH_API_KEY"],"Content-Type":"application/json","Idempotency-Key":"example-operation-attempt-1"}
response = requests.request("POST", os.environ["SCOPEWORTH_API_BASE"] + "/organizations/example-org/workspaces/example-workspace/simulator/scenarios", headers=headers, json=__import__("json").loads("{\"clientId\":\"22222222-2222-4222-8222-222222222222\",\"projectId\":\"11111111-1111-4111-8111-111111111111\",\"name\":\"Example capacity forecast\",\"status\":\"discovery\",\"inputs\":{\"feature\":{\"name\":\"Untitled feature\",\"objective\":\"\",\"value\":\"\",\"complexity\":\"medium\",\"dependency\":\"medium\",\"techUncertainty\":\"medium\",\"productUncertainty\":\"medium\",\"deadline\":null,\"notes\":\"\",\"parallelizable\":55},\"baseline\":{\"engineers\":1,\"qa\":0,\"pmPct\":30,\"designerPct\":20,\"leadPct\":20,\"engCost\":24000,\"qaCost\":7500,\"otherCost\":9500,\"teamAvailability\":100,\"existingLoad\":0,\"baseWeeks\":12},\"scenarios\":[{\"id\":\"s-base\",\"name\":\"Baseline team\",\"sub\":\"No extra capacity\",\"add\":[],\"badge\":null,\"tradeoffs\":\"Slowest of the four options, but cheapest and most predictable.\"},{\"id\":\"s-a\",\"name\":\"Scenario A\",\"sub\":\"Add 1 senior engineer\",\"add\":[{\"resource\":\"int\",\"n\":1}],\"badge\":\"rec\",\"tradeoffs\":\"Best cost-per-week-saved. Adds modest review overhead but stays inside the team operating model.\"},{\"id\":\"s-b\",\"name\":\"Scenario B\",\"sub\":\"Add 3 contractors\",\"add\":[{\"resource\":\"con\",\"n\":3}],\"badge\":\"warn\",\"tradeoffs\":\"Faster delivery, but onboarding eats 2 weeks. Coordination overhead is meaningful at this size.\"},{\"id\":\"s-c\",\"name\":\"Scenario C\",\"sub\":\"External agency pod\",\"add\":[{\"resource\":\"agc\",\"n\":4}],\"badge\":\"bad\",\"tradeoffs\":\"Only justifiable if the deadline is immovable. Cost-per-week-saved is ~3× Scenario A.\"}],\"sliders\":{\"teamSize\":4,\"complexity\":60,\"coordination\":55,\"onboarding\":50,\"parallelizable\":55,\"reviewBottleneck\":40,\"integrationBottleneck\":50,\"qaBottleneck\":35},\"selectedScenarioId\":\"s-a\"},\"currency\":\"USD\",\"resourceCatalog\":[{\"id\":\"int\",\"name\":\"Internal engineer\",\"sub\":\"Existing team, immediate alignment\",\"icon\":\"int\",\"ramp\":1,\"monthly\":24000,\"prod\":100,\"overhead\":0.6,\"onboardLoad\":0.3},{\"id\":\"con\",\"name\":\"Contractor\",\"sub\":\"Independent, project-scoped\",\"icon\":\"con\",\"ramp\":2,\"monthly\":13000,\"prod\":90,\"overhead\":0.8,\"onboardLoad\":0.6},{\"id\":\"agc\",\"name\":\"External agency dev\",\"sub\":\"Vendor pod or staff aug\",\"icon\":\"agc\",\"ramp\":3,\"monthly\":13000,\"prod\":85,\"overhead\":1,\"onboardLoad\":0.9},{\"id\":\"qa\",\"name\":\"QA / test engineer\",\"sub\":\"Releases bottleneck on test cycles\",\"icon\":\"qa\",\"ramp\":1,\"monthly\":7500,\"prod\":100,\"overhead\":0.5,\"onboardLoad\":0.3},{\"id\":\"pm\",\"name\":\"Product manager\",\"sub\":\"Reduces clarification overhead\",\"icon\":\"pm\",\"ramp\":1,\"monthly\":9500,\"prod\":100,\"overhead\":0.4,\"onboardLoad\":0.2},{\"id\":\"des\",\"name\":\"Designer\",\"sub\":\"Front-loads UX surface work\",\"icon\":\"pm\",\"ramp\":1,\"monthly\":9500,\"prod\":100,\"overhead\":0.4,\"onboardLoad\":0.3},{\"id\":\"lead\",\"name\":\"Tech lead / architect\",\"sub\":\"Improves review throughput\",\"icon\":\"int\",\"ramp\":0,\"monthly\":14000,\"prod\":110,\"overhead\":0.3,\"onboardLoad\":0.2},{\"id\":\"ops\",\"name\":\"DevOps / platform\",\"sub\":\"Unblocks integration bottlenecks\",\"icon\":\"qa\",\"ramp\":1,\"monthly\":12000,\"prod\":100,\"overhead\":0.4,\"onboardLoad\":0.3}]}"), timeout=30)
response.raise_for_status()
result = response.json()

For refusals, follow error recovery. A scope or plan badge is eligibility, not proof of authorization or available evidence. Read current directory IDs and versions before correcting a request. Keep an idempotency key for one unchanged mutation attempt; never blindly retry uncertain external work.

Save ID/version. Units vary by model field; a dollar-unit scenario value differs from a commercial minor-unit integer.

Update a saved capacity forecast

Operation: scenarios.update · PATCH /simulator/scenarios/:id

Submit the complete updated inputs with the observed version. The existing model recomputes using the originally saved catalog and currency; later rate cards cannot relabel historical projections. Stale/concurrent edits conflict, and both original/destination projects require access. Explicit key scope, current creator actions, tenant/project access and RLS apply on every request and replay.

Required key scope: scenarios:write. Current creator action: simulator.manage. Eligible plans: free, starter, growth, scale; legacy contracts: free, entry, growth. stable contract. These badges do not override current role, evidence window, quotas or target ownership.

  • Costs are scenario currency units (not integer cents), time is weeks and allocations/availability are percentages. These forecasts are not booked costs or achieved savings.

  • Inputs retain the shared bounds: staffing and added counts 0–100, percentages 0–100, positive baseWeeks up to 1000, bounded resource costs and supported scenario/resource identities.

  • Updates retain the frozen currency and catalog and require the observed positive version.

  • Write never implies Delete; legacy keys retain only their original reviewed reads.

Parameters (required flags, defaults, units and bounds are the canonical schema):

View schema or synthetic response
JSON

[
  {
    "example": "33333333-3333-4333-8333-333333333333",
    "in": "path",
    "name": "id",
    "required": true,
    "schema": {
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)
quot;
, "type": "string" } }, { "example": "example-scenarios.update", "in": "header", "name": "idempotency-key", "required": true, "schema": { "pattern": "^[\\x21-\\x7e]{1,200}
quot;
, "type": "string" } } ]

Request body schema:

View schema or synthetic response
JSON

{
  "content": {
    "application/json": {
      "examples": {
        "synthetic1": {
          "value": {
            "clientId": "22222222-2222-4222-8222-222222222222",
            "currency": "USD",
            "inputs": {
              "baseline": {
                "baseWeeks": 12,
                "designerPct": 20,
                "engCost": 24000,
                "engineers": 1,
                "existingLoad": 0,
                "leadPct": 20,
                "otherCost": 9500,
                "pmPct": 30,
                "qa": 0,
                "qaCost": 7500,
                "teamAvailability": 100
              },
              "feature": {
                "complexity": "medium",
                "deadline": null,
                "dependency": "medium",
                "name": "Untitled feature",
                "notes": "",
                "objective": "",
                "parallelizable": 55,
                "productUncertainty": "medium",
                "techUncertainty": "medium",
                "value": ""
              },
              "scenarios": [
                {
                  "add": [],
                  "badge": null,
                  "id": "s-base",
                  "name": "Baseline team",
                  "sub": "No extra capacity",
                  "tradeoffs": "Slowest of the four options, but cheapest and most predictable."
                },
                {
                  "add": [
                    {
                      "n": 1,
                      "resource": "int"
                    }
                  ],
                  "badge": "rec",
                  "id": "s-a",
                  "name": "Scenario A",
                  "sub": "Add 1 senior engineer",
                  "tradeoffs": "Best cost-per-week-saved. Adds modest review overhead but stays inside the team operating model."
                },
                {
                  "add": [
                    {
                      "n": 3,
                      "resource": "con"
                    }
                  ],
                  "badge": "warn",
                  "id": "s-b",
                  "name": "Scenario B",
                  "sub": "Add 3 contractors",
                  "tradeoffs": "Faster delivery, but onboarding eats 2 weeks. Coordination overhead is meaningful at this size."
                },
                {
                  "add": [
                    {
                      "n": 4,
                      "resource": "agc"
                    }
                  ],
                  "badge": "bad",
                  "id": "s-c",
                  "name": "Scenario C",
                  "sub": "External agency pod",
                  "tradeoffs": "Only justifiable if the deadline is immovable. Cost-per-week-saved is ~3× Scenario A."
                }
              ],
              "selectedScenarioId": "s-a",
              "sliders": {
                "complexity": 60,
                "coordination": 55,
                "integrationBottleneck": 50,
                "onboarding": 50,
                "parallelizable": 55,
                "qaBottleneck": 35,
                "reviewBottleneck": 40,
                "teamSize": 4
              }
            },
            "name": "Reviewed capacity forecast",
            "projectId": "11111111-1111-4111-8111-111111111111",
            "status": "discovery",
            "version": 1
          }
        }
      },
      "schema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "properties": {
          "clientId": {
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)
quot;
, "type": "string" }, "currency": { "anyOf": [ { "pattern": "^[A-Z]{3}
quot;
, "type": "string" }, { "type": "null" } ] }, "inputs": { "properties": { "baseline": { "properties": { "baseWeeks": { "exclusiveMinimum": 0, "maximum": 1000, "type": "number" }, "designerPct": { "maximum": 100, "minimum": 0, "type": "number" }, "engCost": { "minimum": 0, "type": "number" }, "engineers": { "maximum": 100, "minimum": 0, "type": "integer" }, "existingLoad": { "maximum": 100, "minimum": 0, "type": "number" }, "leadPct": { "maximum": 100, "minimum": 0, "type": "number" }, "otherCost": { "minimum": 0, "type": "number" }, "pmPct": { "maximum": 100, "minimum": 0, "type": "number" }, "qa": { "maximum": 100, "minimum": 0, "type": "integer" }, "qaCost": { "minimum": 0, "type": "number" }, "teamAvailability": { "maximum": 100, "minimum": 0, "type": "number" } }, "required": [ "engineers", "qa", "pmPct", "designerPct", "leadPct", "engCost", "qaCost", "otherCost", "teamAvailability", "existingLoad", "baseWeeks" ], "type": "object" }, "feature": { "properties": { "complexity": { "enum": [ "low", "medium", "high", "very-high" ], "type": "string" }, "deadline": { "anyOf": [ { "format": "date", "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))
quot;
, "type": "string" }, { "type": "null" } ] }, "dependency": { "enum": [ "low", "medium", "high" ], "type": "string" }, "name": { "maxLength": 200, "minLength": 1, "type": "string" }, "notes": { "maxLength": 4000, "type": "string" }, "objective": { "maxLength": 2000, "type": "string" }, "parallelizable": { "maximum": 100, "minimum": 0, "type": "number" }, "productUncertainty": { "enum": [ "low", "medium", "high" ], "type": "string" }, "techUncertainty": { "enum": [ "low", "medium", "high" ], "type": "string" }, "value": { "maxLength": 2000, "type": "string" } }, "required": [ "name", "objective", "value", "complexity", "dependency", "techUncertainty", "productUncertainty", "deadline", "notes", "parallelizable" ], "type": "object" }, "scenarios": { "items": { "properties": { "add": { "items": { "properties": { "n": { "maximum": 100, "minimum": 0, "type": "integer" }, "resource": { "maxLength": 40, "minLength": 1, "type": "string" } }, "required": [ "resource", "n" ], "type": "object" }, "maxItems": 20, "type": "array" }, "badge": { "anyOf": [ { "enum": [ "rec", "warn", "bad" ], "type": "string" }, { "type": "null" } ] }, "id": { "maxLength": 80, "minLength": 1, "type": "string" }, "name": { "maxLength": 200, "minLength": 1, "type": "string" }, "sub": { "maxLength": 300, "type": "string" }, "tradeoffs": { "maxLength": 2000, "type": "string" } }, "required": [ "id", "name", "sub", "add", "badge", "tradeoffs" ], "type": "object" }, "maxItems": 20, "minItems": 1, "type": "array" }, "selectedScenarioId": { "maxLength": 80, "minLength": 1, "type": "string" }, "sliders": { "properties": { "complexity": { "maximum": 100, "minimum": 0, "type": "number" }, "coordination": { "maximum": 100, "minimum": 0, "type": "number" }, "integrationBottleneck": { "maximum": 100, "minimum": 0, "type": "number" }, "onboarding": { "maximum": 100, "minimum": 0, "type": "number" }, "parallelizable": { "maximum": 100, "minimum": 0, "type": "number" }, "qaBottleneck": { "maximum": 100, "minimum": 0, "type": "number" }, "reviewBottleneck": { "maximum": 100, "minimum": 0, "type": "number" }, "teamSize": { "maximum": 100, "minimum": 1, "type": "integer" } }, "type": "object" } }, "required": [ "feature", "baseline", "scenarios", "sliders", "selectedScenarioId" ], "type": "object" }, "name": { "maxLength": 200, "minLength": 1, "type": "string" }, "projectId": { "format": "uuid", "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)
quot;
, "type": "string" }, "resourceCatalog": { "not": {} }, "status": { "enum": [ "live", "discovery", "closed" ], "type": "string" }, "version": { "exclusiveMinimum": 0, "maximum": 9007199254740991, "type": "integer" } }, "required": [ "clientId", "projectId", "name", "status", "inputs", "currency", "version" ], "type": "object" } } }, "required": true }

Success statuses: 200. The JSON response is the saved/read representation. Synthetic examples below show shape, not customer evidence.

Synthetic response:

View schema or synthetic response
JSON

{
  "clientId": "22222222-2222-4222-8222-222222222222",
  "createdAt": "2026-10-01T08:15:25.125Z",
  "currency": "USD",
  "id": "33333333-3333-4333-8333-333333333333",
  "inputs": {
    "baseline": {
      "baseWeeks": 12,
      "designerPct": 20,
      "engCost": 24000,
      "engineers": 1,
      "existingLoad": 0,
      "leadPct": 20,
      "otherCost": 9500,
      "pmPct": 30,
      "qa": 0,
      "qaCost": 7500,
      "teamAvailability": 100
    },
    "feature": {
      "complexity": "medium",
      "deadline": null,
      "dependency": "medium",
      "name": "Untitled feature",
      "notes": "",
      "objective": "",
      "parallelizable": 55,
      "productUncertainty": "medium",
      "techUncertainty": "medium",
      "value": ""
    },
    "scenarios": [
      {
        "add": [],
        "badge": null,
        "id": "s-base",
        "name": "Baseline team",
        "sub": "No extra capacity",
        "tradeoffs": "Slowest of the four options, but cheapest and most predictable."
      },
      {
        "add": [
          {
            "n": 1,
            "resource": "int"
          }
        ],
        "badge": "rec",
        "id": "s-a",
        "name": "Scenario A",
        "sub": "Add 1 senior engineer",
        "tradeoffs": "Best cost-per-week-saved. Adds modest review overhead but stays inside the team operating model."
      },
      {
        "add": [
          {
            "n": 3,
            "resource": "con"
          }
        ],
        "badge": "warn",
        "id": "s-b",
        "name": "Scenario B",
        "sub": "Add 3 contractors",
        "tradeoffs": "Faster delivery, but onboarding eats 2 weeks. Coordination overhead is meaningful at this size."
      },
      {
        "add": [
          {
            "n": 4,
            "resource": "agc"
          }
        ],
        "badge": "bad",
        "id": "s-c",
        "name": "Scenario C",
        "sub": "External agency pod",
        "tradeoffs": "Only justifiable if the deadline is immovable. Cost-per-week-saved is ~3× Scenario A."
      }
    ],
    "selectedScenarioId": "s-a",
    "sliders": {
      "complexity": 60,
      "coordination": 55,
      "integrationBottleneck": 50,
      "onboarding": 50,
      "parallelizable": 55,
      "qaBottleneck": 35,
      "reviewBottleneck": 40,
      "teamSize": 4
    }
  },
  "modelVersion": "dashboard-simulator-v1",
  "name": "Reviewed capacity forecast",
  "projectId": "11111111-1111-4111-8111-111111111111",
  "resourceCatalog": [
    {
      "icon": "int",
      "id": "int",
      "monthly": 24000,
      "name": "Internal engineer",
      "onboardLoad": 0.3,
      "overhead": 0.6,
      "prod": 100,
      "ramp": 1,
      "sub": "Existing team, immediate alignment"
    },
    {
      "icon": "con",
      "id": "con",
      "monthly": 13000,
      "name": "Contractor",
      "onboardLoad": 0.6,
      "overhead": 0.8,
      "prod": 90,
      "ramp": 2,
      "sub": "Independent, project-scoped"
    },
    {
      "icon": "agc",
      "id": "agc",
      "monthly": 13000,
      "name": "External agency dev",
      "onboardLoad": 0.9,
      "overhead": 1,
      "prod": 85,
      "ramp": 3,
      "sub": "Vendor pod or staff aug"
    },
    {
      "icon": "qa",
      "id": "qa",
      "monthly": 7500,
      "name": "QA / test engineer",
      "onboardLoad": 0.3,
      "overhead": 0.5,
      "prod": 100,
      "ramp": 1,
      "sub": "Releases bottleneck on test cycles"
    },
    {
      "icon": "pm",
      "id": "pm",
      "monthly": 9500,
      "name": "Product manager",
      "onboardLoad": 0.2,
      "overhead": 0.4,
      "prod": 100,
      "ramp": 1,
      "sub": "Reduces clarification overhead"
    },
    {
      "icon": "pm",
      "id": "des",
      "monthly": 9500,
      "name": "Designer",
      "onboardLoad": 0.3,
      "overhead": 0.4,
      "prod": 100,
      "ramp": 1,
      "sub": "Front-loads UX surface work"
    },
    {
      "icon": "int",
      "id": "lead",
      "monthly": 14000,
      "name": "Tech lead / architect",
      "onboardLoad": 0.2,
      "overhead": 0.3,
      "prod": 110,
      "ramp": 0,
      "sub": "Improves review throughput"
    },
    {
      "icon": "qa",
      "id": "ops",
      "monthly": 12000,
      "name": "DevOps / platform",
      "onboardLoad": 0.3,
      "overhead": 0.4,
      "prod": 100,
      "ramp": 1,
      "sub": "Unblocks integration bottlenecks"
    }
  ],
  "result": {
    "addedCost": 32536.383051354376,
    "baseCost": 45090.93349181073,
    "confLabel": "Medium",
    "confScore": 70,
    "effectiveN": 3.1702001188825046,
    "effectiveRatio": 0.7925500297206262,
    "grossN": 4,
    "monthlyBurn": 54650,
    "rampWeeksLost": 0.56,
    "speedup": 1.9704091262659347,
    "totalCost": 77627.3165431651,
    "usedAlpha": 0.8724999999999999,
    "usedParallel": 0.55,
    "weeks": 6.370105775515186
  },
  "status": "discovery",
  "updatedAt": "2026-10-01T08:15:25.137Z",
  "version": 2
}

Use IDs and versions from your own preceding responses. Replace the synthetic UUIDs, dates and names in these independent examples. Set SCOPEWORTH_API_BASE and SCOPEWORTH_API_KEY only on your server.

cURL

cURL / shell
curl --request PATCH "$SCOPEWORTH_API_BASE/organizations/example-org/workspaces/example-workspace/simulator/scenarios/33333333-3333-4333-8333-333333333333" \
  --header "Authorization: Bearer $SCOPEWORTH_API_KEY" \
  --header 'Content-Type: application/json' \
  --header 'Idempotency-Key: example-operation-attempt-1' \
  --data-raw '{"clientId":"22222222-2222-4222-8222-222222222222","projectId":"11111111-1111-4111-8111-111111111111","name":"Reviewed capacity forecast","status":"discovery","inputs":{"feature":{"name":"Untitled feature","objective":"","value":"","complexity":"medium","dependency":"medium","techUncertainty":"medium","productUncertainty":"medium","deadline":null,"notes":"","parallelizable":55},"baseline":{"engineers":1,"qa":0,"pmPct":30,"designerPct":20,"leadPct":20,"engCost":24000,"qaCost":7500,"otherCost":9500,"teamAvailability":100,"existingLoad":0,"baseWeeks":12},"scenarios":[{"id":"s-base","name":"Baseline team","sub":"No extra capacity","add":[],"badge":null,"tradeoffs":"Slowest of the four options, but cheapest and most predictable."},{"id":"s-a","name":"Scenario A","sub":"Add 1 senior engineer","add":[{"resource":"int","n":1}],"badge":"rec","tradeoffs":"Best cost-per-week-saved. Adds modest review overhead but stays inside the team operating model."},{"id":"s-b","name":"Scenario B","sub":"Add 3 contractors","add":[{"resource":"con","n":3}],"badge":"warn","tradeoffs":"Faster delivery, but onboarding eats 2 weeks. Coordination overhead is meaningful at this size."},{"id":"s-c","name":"Scenario C","sub":"External agency pod","add":[{"resource":"agc","n":4}],"badge":"bad","tradeoffs":"Only justifiable if the deadline is immovable. Cost-per-week-saved is ~3× Scenario A."}],"sliders":{"teamSize":4,"complexity":60,"coordination":55,"onboarding":50,"parallelizable":55,"reviewBottleneck":40,"integrationBottleneck":50,"qaBottleneck":35},"selectedScenarioId":"s-a"},"currency":"USD","version":1}'

JavaScript fetch

JavaScript
// Run on your server. API_BASE ends in /api/v1 (combined host) or /v1 (verified cell).
const response = await fetch(process.env.SCOPEWORTH_API_BASE + "/organizations/example-org/workspaces/example-workspace/simulator/scenarios/33333333-3333-4333-8333-333333333333", {
  method: "PATCH",
  headers: {
  "Authorization": `Bearer ${process.env.SCOPEWORTH_API_KEY}`,
  "Content-Type": "application/json",
  "Idempotency-Key": "example-operation-attempt-1"
},
  body: JSON.stringify({
  "clientId": "22222222-2222-4222-8222-222222222222",
  "projectId": "11111111-1111-4111-8111-111111111111",
  "name": "Reviewed capacity forecast",
  "status": "discovery",
  "inputs": {
    "feature": {
      "name": "Untitled feature",
      "objective": "",
      "value": "",
      "complexity": "medium",
      "dependency": "medium",
      "techUncertainty": "medium",
      "productUncertainty": "medium",
      "deadline": null,
      "notes": "",
      "parallelizable": 55
    },
    "baseline": {
      "engineers": 1,
      "qa": 0,
      "pmPct": 30,
      "designerPct": 20,
      "leadPct": 20,
      "engCost": 24000,
      "qaCost": 7500,
      "otherCost": 9500,
      "teamAvailability": 100,
      "existingLoad": 0,
      "baseWeeks": 12
    },
    "scenarios": [
      {
        "id": "s-base",
        "name": "Baseline team",
        "sub": "No extra capacity",
        "add": [],
        "badge": null,
        "tradeoffs": "Slowest of the four options, but cheapest and most predictable."
      },
      {
        "id": "s-a",
        "name": "Scenario A",
        "sub": "Add 1 senior engineer",
        "add": [
          {
            "resource": "int",
            "n": 1
          }
        ],
        "badge": "rec",
        "tradeoffs": "Best cost-per-week-saved. Adds modest review overhead but stays inside the team operating model."
      },
      {
        "id": "s-b",
        "name": "Scenario B",
        "sub": "Add 3 contractors",
        "add": [
          {
            "resource": "con",
            "n": 3
          }
        ],
        "badge": "warn",
        "tradeoffs": "Faster delivery, but onboarding eats 2 weeks. Coordination overhead is meaningful at this size."
      },
      {
        "id": "s-c",
        "name": "Scenario C",
        "sub": "External agency pod",
        "add": [
          {
            "resource": "agc",
            "n": 4
          }
        ],
        "badge": "bad",
        "tradeoffs": "Only justifiable if the deadline is immovable. Cost-per-week-saved is ~3× Scenario A."
      }
    ],
    "sliders": {
      "teamSize": 4,
      "complexity": 60,
      "coordination": 55,
      "onboarding": 50,
      "parallelizable": 55,
      "reviewBottleneck": 40,
      "integrationBottleneck": 50,
      "qaBottleneck": 35
    },
    "selectedScenarioId": "s-a"
  },
  "currency": "USD",
  "version": 1
}),
});
if (!response.ok) throw new Error(`ScopeWorth refused request: ${response.status}`);
const result = await response.json();

Python requests

Python
import os, requests
headers = {"Authorization":"Bearer " + os.environ["SCOPEWORTH_API_KEY"],"Content-Type":"application/json","Idempotency-Key":"example-operation-attempt-1"}
response = requests.request("PATCH", os.environ["SCOPEWORTH_API_BASE"] + "/organizations/example-org/workspaces/example-workspace/simulator/scenarios/33333333-3333-4333-8333-333333333333", headers=headers, json=__import__("json").loads("{\"clientId\":\"22222222-2222-4222-8222-222222222222\",\"projectId\":\"11111111-1111-4111-8111-111111111111\",\"name\":\"Reviewed capacity forecast\",\"status\":\"discovery\",\"inputs\":{\"feature\":{\"name\":\"Untitled feature\",\"objective\":\"\",\"value\":\"\",\"complexity\":\"medium\",\"dependency\":\"medium\",\"techUncertainty\":\"medium\",\"productUncertainty\":\"medium\",\"deadline\":null,\"notes\":\"\",\"parallelizable\":55},\"baseline\":{\"engineers\":1,\"qa\":0,\"pmPct\":30,\"designerPct\":20,\"leadPct\":20,\"engCost\":24000,\"qaCost\":7500,\"otherCost\":9500,\"teamAvailability\":100,\"existingLoad\":0,\"baseWeeks\":12},\"scenarios\":[{\"id\":\"s-base\",\"name\":\"Baseline team\",\"sub\":\"No extra capacity\",\"add\":[],\"badge\":null,\"tradeoffs\":\"Slowest of the four options, but cheapest and most predictable.\"},{\"id\":\"s-a\",\"name\":\"Scenario A\",\"sub\":\"Add 1 senior engineer\",\"add\":[{\"resource\":\"int\",\"n\":1}],\"badge\":\"rec\",\"tradeoffs\":\"Best cost-per-week-saved. Adds modest review overhead but stays inside the team operating model.\"},{\"id\":\"s-b\",\"name\":\"Scenario B\",\"sub\":\"Add 3 contractors\",\"add\":[{\"resource\":\"con\",\"n\":3}],\"badge\":\"warn\",\"tradeoffs\":\"Faster delivery, but onboarding eats 2 weeks. Coordination overhead is meaningful at this size.\"},{\"id\":\"s-c\",\"name\":\"Scenario C\",\"sub\":\"External agency pod\",\"add\":[{\"resource\":\"agc\",\"n\":4}],\"badge\":\"bad\",\"tradeoffs\":\"Only justifiable if the deadline is immovable. Cost-per-week-saved is ~3× Scenario A.\"}],\"sliders\":{\"teamSize\":4,\"complexity\":60,\"coordination\":55,\"onboarding\":50,\"parallelizable\":55,\"reviewBottleneck\":40,\"integrationBottleneck\":50,\"qaBottleneck\":35},\"selectedScenarioId\":\"s-a\"},\"currency\":\"USD\",\"version\":1}"), timeout=30)
response.raise_for_status()
result = response.json()

For refusals, follow error recovery. A scope or plan badge is eligibility, not proof of authorization or available evidence. Read current directory IDs and versions before correcting a request. Keep an idempotency key for one unchanged mutation attempt; never blindly retry uncertain external work.

Read the saved version before PATCH. Updates retain the frozen catalog: resourceCatalog replacement is forbidden. Moving a scenario checks current access to both original and destination projects.

Delete a saved capacity scenario

Operation: scenarios.delete · DELETE /simulator/scenarios/:id

Destructive: remove the selected saved scenario, requiring scenarios:delete separately from write and current simulator.manage. The actual removal writes one audit event. Identical retries and later requests for a scenario already deleted in this workspace return empty 204; unknown/foreign IDs return generic 404. Source evidence is unchanged. Explicit key scope, current creator actions, tenant/project access and RLS apply on every request and replay.

Required key scope: scenarios:delete. Current creator action: simulator.manage. Eligible plans: free, starter, growth, scale; legacy contracts: free, entry, growth. stable contract. These badges do not override current role, evidence window, quotas or target ownership.

  • Costs are scenario currency units (not integer cents), time is weeks and allocations/availability are percentages. These forecasts are not booked costs or achieved savings.

  • Inputs retain the shared bounds: staffing and added counts 0–100, percentages 0–100, positive baseWeeks up to 1000, bounded resource costs and supported scenario/resource identities.

  • Updates retain the frozen currency and catalog and require the observed positive version.

  • Write never implies Delete; legacy keys retain only their original reviewed reads.

Parameters (required flags, defaults, units and bounds are the canonical schema):

View schema or synthetic response
JSON

[
  {
    "example": "33333333-3333-4333-8333-333333333333",
    "in": "path",
    "name": "id",
    "required": true,
    "schema": {
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)
quot;
, "type": "string" } }, { "example": "example-scenarios.delete", "in": "header", "name": "idempotency-key", "required": true, "schema": { "pattern": "^[\\x21-\\x7e]{1,200}
quot;
, "type": "string" } } ]

Success statuses: 204. The response has no body.

Use IDs and versions from your own preceding responses. Replace the synthetic UUIDs, dates and names in these independent examples. Set SCOPEWORTH_API_BASE and SCOPEWORTH_API_KEY only on your server.

cURL

cURL / shell
curl --request DELETE "$SCOPEWORTH_API_BASE/organizations/example-org/workspaces/example-workspace/simulator/scenarios/33333333-3333-4333-8333-333333333333" \
  --header "Authorization: Bearer $SCOPEWORTH_API_KEY" \
  --header 'Idempotency-Key: example-operation-attempt-1'

JavaScript fetch

JavaScript
// Run on your server. API_BASE ends in /api/v1 (combined host) or /v1 (verified cell).
const response = await fetch(process.env.SCOPEWORTH_API_BASE + "/organizations/example-org/workspaces/example-workspace/simulator/scenarios/33333333-3333-4333-8333-333333333333", {
  method: "DELETE",
  headers: {
  "Authorization": `Bearer ${process.env.SCOPEWORTH_API_KEY}`,
  "Idempotency-Key": "example-operation-attempt-1"
},
});
if (!response.ok) throw new Error(`ScopeWorth refused request: ${response.status}`);
// 204 has no response body.

Python requests

Python
import os, requests
headers = {"Authorization":"Bearer " + os.environ["SCOPEWORTH_API_KEY"],"Idempotency-Key":"example-operation-attempt-1"}
response = requests.request("DELETE", os.environ["SCOPEWORTH_API_BASE"] + "/organizations/example-org/workspaces/example-workspace/simulator/scenarios/33333333-3333-4333-8333-333333333333", headers=headers, timeout=30)
response.raise_for_status()
# 204 has no response body.

For refusals, follow error recovery. A scope or plan badge is eligibility, not proof of authorization or available evidence. Read current directory IDs and versions before correcting a request. Keep an idempotency key for one unchanged mutation attempt; never blindly retry uncertain external work.

Deletion needs separate delete scope/action. Known completed deletion can repeat 204; unknown targets give 404. Preserve needed forecasts before deleting. A deletion establishes no realized economic outcome.

Search documentation

Enter a word or phrase to search documentation.