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
[
{
"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
{
"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 --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
// 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
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
[
{
"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
{
"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 --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
// 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
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
[
{
"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
{
"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
{
"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 --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
// 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
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
[
{
"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
{
"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
{
"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 --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
// 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
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
[
{
"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 --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
// 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
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.