get_model_scenario
What it answers
Calculate the stored Model Calculator baseline plus up to four independent, named what-if scenarios over required inclusive calendar range.from/to dates. Requires administrator, Payroll Grid or Model Calculator access. Compensation appears only as department totals. Include/exclude existing opaque row references from list_payroll_entries; stale references require relisting. Choose payrollGridId or expenseGridId when multiple grids exist. Override any of the ten editable inputs with finite decimal strings, including zero; utilization is a fraction. Undefined figures are null with causal caveats; shares divide only by modelled AGI. Stored freshness does not claim the live Sheet is unchanged. Reads stored snapshots only, writes no grids or settings and saves no scenario; use save_scenario to keep one, and list_scenarios and get_scenario to read saved ones. Read parakeeto://methodology for INVALID_ARGUMENT guidance before interpreting modelled AGI, which is capacity × ABR × utilization rather than actual billings less pass-through.
Read-only.
Arguments
| Argument | Type | Required | Default | Allowed values |
|---|---|---|---|---|
account |
string (uuid) | no | — | — |
includeDefinitions |
boolean | no | true |
— |
payrollGridId |
string (uuid) | no | — | — |
expenseGridId |
string (uuid) | no | — | — |
range |
object | yes | — | — |
range.from |
string | yes | — | pattern ^\d{4}-\d{2}-\d{2}$ |
range.to |
string | yes | — | pattern ^\d{4}-\d{2}-\d{2}$ |
scenarios |
array of object | no | [] |
maxItems: 4 |
scenarios[].name |
string | yes | — | minLength: 1 |
scenarios[].include |
array of string | no | — | — |
scenarios[].exclude |
array of string | no | — | — |
scenarios[].overrides |
object | no | — | — |
scenarios[].overrides.grossCapacity |
string | no | — | pattern ^-?\d+(?:\.\d+)?$ |
scenarios[].overrides.modelAbr |
string | no | — | pattern ^-?\d+(?:\.\d+)?$ |
scenarios[].overrides.modelUtilization |
string | no | — | pattern ^-?\d+(?:\.\d+)?$ |
scenarios[].overrides.deliveryPayrollBudget |
string | no | — | pattern ^-?\d+(?:\.\d+)?$ |
scenarios[].overrides.deliveryExpenseBudget |
string | no | — | pattern ^-?\d+(?:\.\d+)?$ |
scenarios[].overrides.smPayrollBudget |
string | no | — | pattern ^-?\d+(?:\.\d+)?$ |
scenarios[].overrides.smExpenseBudget |
string | no | — | pattern ^-?\d+(?:\.\d+)?$ |
scenarios[].overrides.adminPayrollBudget |
string | no | — | pattern ^-?\d+(?:\.\d+)?$ |
scenarios[].overrides.adminExpenseBudget |
string | no | — | pattern ^-?\d+(?:\.\d+)?$ |
scenarios[].overrides.facilitiesExpenseBudget |
string | no | — | pattern ^-?\d+(?:\.\d+)?$ |
Returned fields
The result is an envelope: ok: true with data, or ok: false with error. Error codes: MODEL_CALCULATOR_ACCESS_REQUIRED, PAYROLL_GRID_MISSING, PAYROLL_GRID_REQUIRED, PROJECT_GRID_REQUIRED, EXPENSE_GRID_REQUIRED, PAYROLL_ENTRY_REFERENCE_STALE, ACCOUNT_NOT_FOUND, ACCOUNT_CONFIGURATION_MISSING, NO_IMPORTED_TIME, NOTHING_IMPORTED, ACCOUNT_REQUIRED, NO_REACHABLE_ACCOUNTS, FEATURE_NOT_ENTITLED, PERMISSION_DENIED, CALCULATION_FAILED, INTERNAL_ERROR, INVALID_ARGUMENT.
data: objectdata.account: string (uuid)data.range: objectdata.range.from: string (pattern^\d{4}-\d{2}-\d{2}$)data.range.to: string (pattern^\d{4}-\d{2}-\d{2}$)
data.payrollGrid: objectdata.payrollGrid.id: string (uuid)data.payrollGrid.name: string
data.expenseGrid: object or nulldata.expenseGrid.id: string (uuid)data.expenseGrid.name: string
data.annualDays: string (pattern^-?\d+(?:\.\d+)?$)data.gridFreshness: array of objectdata.gridFreshness[].kind: string ("payroll","expense","project")data.gridFreshness[].gridId: string (uuid)data.gridFreshness[].name: stringdata.gridFreshness[].storage: string ("sheet","database")data.gridFreshness[].sheetRefreshedAt: string (date-time) or null
data.baseline: objectdata.baseline.name: stringdata.baseline.inputs: objectdata.baseline.inputs.grossCapacity: string or null (pattern^-?\d+(?:\.\d+)?$)data.baseline.inputs.modelAbr: string or null (pattern^-?\d+(?:\.\d+)?$)data.baseline.inputs.modelUtilization: string or null (pattern^-?\d+(?:\.\d+)?$)data.baseline.inputs.deliveryPayrollBudget: string or null (pattern^-?\d+(?:\.\d+)?$)data.baseline.inputs.deliveryExpenseBudget: string or null (pattern^-?\d+(?:\.\d+)?$)data.baseline.inputs.smPayrollBudget: string or null (pattern^-?\d+(?:\.\d+)?$)data.baseline.inputs.smExpenseBudget: string or null (pattern^-?\d+(?:\.\d+)?$)data.baseline.inputs.adminPayrollBudget: string or null (pattern^-?\d+(?:\.\d+)?$)data.baseline.inputs.adminExpenseBudget: string or null (pattern^-?\d+(?:\.\d+)?$)data.baseline.inputs.facilitiesExpenseBudget: string or null (pattern^-?\d+(?:\.\d+)?$)
data.baseline.outputs: objectdata.baseline.outputs.agencyGrossIncome: string or null (pattern^-?\d+(?:\.\d+)?$)data.baseline.outputs.modelDeliveryBudget: string or null (pattern^-?\d+(?:\.\d+)?$)data.baseline.outputs.modelSmBudget: string or null (pattern^-?\d+(?:\.\d+)?$)data.baseline.outputs.modelAdminBudget: string or null (pattern^-?\d+(?:\.\d+)?$)data.baseline.outputs.modelFacilitiesBudget: string or null (pattern^-?\d+(?:\.\d+)?$)data.baseline.outputs.modelOperatingIncome: string or null (pattern^-?\d+(?:\.\d+)?$)
data.baseline.shares: objectdata.baseline.shares.modelDeliveryBudget: string or null (pattern^-?\d+(?:\.\d+)?$)data.baseline.shares.modelSmBudget: string or null (pattern^-?\d+(?:\.\d+)?$)data.baseline.shares.modelAdminBudget: string or null (pattern^-?\d+(?:\.\d+)?$)data.baseline.shares.modelFacilitiesBudget: string or null (pattern^-?\d+(?:\.\d+)?$)data.baseline.shares.modelOperatingIncome: string or null (pattern^-?\d+(?:\.\d+)?$)
data.baseline.caveats: array of objectdata.baseline.caveats[].code: stringdata.baseline.caveats[].message: stringdata.baseline.caveats[].reference: string, optional
data.scenarios: array of objectdata.scenarios[]: same shape asdata.baseline
data.definitions: object, optionaldata.definitions.annualDays: stringdata.definitions.inputs.grossCapacity: stringdata.definitions.inputs.modelAbr: stringdata.definitions.inputs.modelUtilization: stringdata.definitions.inputs.deliveryPayrollBudget: stringdata.definitions.inputs.deliveryExpenseBudget: stringdata.definitions.inputs.smPayrollBudget: stringdata.definitions.inputs.smExpenseBudget: stringdata.definitions.inputs.adminPayrollBudget: stringdata.definitions.inputs.adminExpenseBudget: stringdata.definitions.inputs.facilitiesExpenseBudget: stringdata.definitions.outputs.agencyGrossIncome: stringdata.definitions.outputs.modelDeliveryBudget: stringdata.definitions.outputs.modelSmBudget: stringdata.definitions.outputs.modelAdminBudget: stringdata.definitions.outputs.modelFacilitiesBudget: stringdata.definitions.outputs.modelOperatingIncome: stringdata.definitions.shares.modelDeliveryBudget: stringdata.definitions.shares.modelSmBudget: stringdata.definitions.shares.modelAdminBudget: stringdata.definitions.shares.modelFacilitiesBudget: stringdata.definitions.shares.modelOperatingIncome: string
data.caveats: array of objectdata.caveats[]: same shape asdata.baseline.caveats[]
On failure:
error: objecterror.code: string ("MODEL_CALCULATOR_ACCESS_REQUIRED","PAYROLL_GRID_MISSING","PAYROLL_GRID_REQUIRED","PROJECT_GRID_REQUIRED","EXPENSE_GRID_REQUIRED","PAYROLL_ENTRY_REFERENCE_STALE","ACCOUNT_NOT_FOUND","ACCOUNT_CONFIGURATION_MISSING","NO_IMPORTED_TIME","NOTHING_IMPORTED","ACCOUNT_REQUIRED","NO_REACHABLE_ACCOUNTS","FEATURE_NOT_ENTITLED","PERMISSION_DENIED","CALCULATION_FAILED","INTERNAL_ERROR","INVALID_ARGUMENT")error.argument: string, optional (minLength: 1)error.message: stringerror.accounts: array of object, optionalerror.accounts[].id: string (uuid)error.accounts[].name: string
error.payrollGrids: array of object, optionalerror.payrollGrids[]: same shape aserror.accounts[]
error.projectGrids: array of object, optionalerror.projectGrids[]: same shape aserror.accounts[]
error.expenseGrids: array of object, optionalerror.expenseGrids[]: same shape aserror.accounts[]
error.context: object, optionalerror.context.account: object- Further fields: see the response.
error.context.imports: array of object- Further fields: see the response.
error.context.hasTimeEntries: booleanerror.context.reports: array of object- Further fields: see the response.
Definitions
Returned in definitions when includeDefinitions is true (the default). Each value is the definition text for that field.
annualDaysinputs.grossCapacityinputs.modelAbrinputs.modelUtilizationinputs.deliveryPayrollBudgetinputs.deliveryExpenseBudgetinputs.smPayrollBudgetinputs.smExpenseBudgetinputs.adminPayrollBudgetinputs.adminExpenseBudgetinputs.facilitiesExpenseBudgetoutputs.agencyGrossIncomeoutputs.modelDeliveryBudgetoutputs.modelSmBudgetoutputs.modelAdminBudgetoutputs.modelFacilitiesBudgetoutputs.modelOperatingIncomeshares.modelDeliveryBudgetshares.modelSmBudgetshares.modelAdminBudgetshares.modelFacilitiesBudgetshares.modelOperatingIncome
Caveats
Codes are not enumerated in the schema; read each code and message.
Read every caveat before interpreting a figure. See methodology on how to communicate caveats and data-quality conditions.
Example call
{
"name": "get_model_scenario",
"arguments": {
"range": {
"from": "2026-10-05",
"to": "2026-10-09"
}
}
}
Add account with an identifier from list_accounts; omit it only when the connection reaches exactly one account.
Questions and answers
What does get_model_scenario answer?
Calculate the stored Model Calculator baseline plus up to four independent, named what-if scenarios over required inclusive calendar range.from/to dates. Requires administrator, Payroll Grid or Model Calculator access. Compensation appears only as department totals. Include/exclude existing opaque row references from list_payroll_entries; stale references require relisting. Choose payrollGridId or expenseGridId when multiple grids exist. Override any of the ten editable inputs with finite decimal strings, including zero; utilization is a fraction. Undefined figures are null with causal caveats; shares divide only by modelled AGI. Stored freshness does not claim the live Sheet is unchanged. Reads stored snapshots only, writes no grids or settings and saves no scenario; use save_scenario to keep one, and list_scenarios and get_scenario to read saved ones. Read parakeeto://methodology for INVALID_ARGUMENT guidance before interpreting modelled AGI, which is capacity × ABR × utilization rather than actual billings less pass-through.
Which arguments does get_model_scenario accept?
Argument Type Required Default Allowed values account string (uuid) no — — includeDefinitions boolean no true — payrollGridId string (uuid) no — — expenseGridId string (uuid) no — — range object yes — — range.from string yes — pattern ^\d{4}-\d{2}-\d{2}$ range.to string yes — pattern ^\d{4}-\d{2}-\d{2}$ scenarios array of object no [] maxItems: 4 scenarios[].name string yes — minLength: 1 scenarios[].include array of string no — — scenarios[].exclude array of string no — — scenarios[].overrides object no — — scenarios[].overrides.grossCapacity string no — pattern ^-?\d+(?:\.\d+)?$ scenarios[].overrides.modelAbr string no — pattern ^-?\d+(?:\.\d+)?$ scenarios[].overrides.modelUtilization string no — pattern ^-?\d+(?:\.\d+)?$ scenarios[].overrides.deliveryPayrollBudget string no — pattern ^-?\d+(?:\.\d+)?$ scenarios[].overrides.deliveryExpenseBudget string no — pattern ^-?\d+(?:\.\d+)?$ scenarios[].overrides.smPayrollBudget string no — pattern ^-?\d+(?:\.\d+)?$ scenarios[].overrides.smExpenseBudget string no — pattern ^-?\d+(?:\.\d+)?$ scenarios[].overrides.adminPayrollBudget string no — pattern ^-?\d+(?:\.\d+)?$ scenarios[].overrides.adminExpenseBudget string no — pattern ^-?\d+(?:\.\d+)?$ scenarios[].overrides.facilitiesExpenseBudget string no — pattern ^-?\d+(?:\.\d+)?$
What does get_model_scenario return?
The result is an envelope: ok: true with data, or ok: false with error.