{"openapi":"3.1.0","info":{"title":"Glacier Planner public first calculation","version":"1","description":"Calculate only supplied, explicitly confirmed basic inputs. No account, payment or API key. No private-record lookup. Projections and education, not personalized investment advice."},"servers":[{"url":"https://planner.glacierfinancial.ca"}],"security":[],"x-glacier-capabilities":{"enabled":true,"readiness":"request-dependent; not probed by discovery","accountRequired":false,"apiKeyRequired":false,"accessTokenRequired":false,"paymentRequired":false,"persistsFinancialData":false,"assumptionsConfirmationRequired":true,"scope":"A first projection for one or two Canadian adults: employment, a defined-benefit pension, CPP/QPP, OAS, RRSP/RRIF, TFSA, non-registered investments and cash. No corporations, property, debts, children, benefit-entitlement history, LIRA/LIF or planned extra contributions. GIS, Allowance and refundable benefit payments (including Ontario GAINS and Trillium) are not included; missing benefits can make a projected shortfall look larger. Review eligibility and payment history before changing spending. Quebec employment requires explicit confirmation of Quebec payroll contributions; cross-province employment is outside this first-calculation scope. Excluded situations need additional facts and supported-case review.","http":"https://planner.glacierfinancial.ca/api/calculate","httpMethods":["GET","POST","OPTIONS"],"requestEnvelope":"Exactly one input property containing CalculatorInput","inputSchema":{"url":"https://planner.glacierfinancial.ca/api/calculate","jsonPointer":"/inputSchema"},"mcp":"https://planner.glacierfinancial.ca/calculate/mcp","browser":"https://planner.glacierfinancial.ca/calculate","schema":"https://planner.glacierfinancial.ca/openapi.json","limits":"Bounded public allowance and service readiness apply; an explicit alternative uses two calculation units."},"paths":{"/api/calculate":{"get":{"operationId":"getCalculatorContract","summary":"Read the live input schema, made-up example and scope.","description":"The existing example contains accepted assumptions for illustration. It is not the person’s confirmation; never POST it unchanged without explicit review and confirmation.","responses":{"200":{"description":"Public contract; reading it does not calculate.","content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string"},"version":{"const":1},"inputSchema":{"type":"object"},"example":{"type":"object","properties":{"input":{"$ref":"#/components/schemas/CalculatorInput"}},"required":["input"],"additionalProperties":false},"scope":{"type":"string"},"accountRequired":{"const":false},"paymentRequired":{"const":false},"persistsFinancialData":{"const":false},"mcp":{"type":"string"},"guide":{"type":"string"}},"required":["name","version","inputSchema","example","scope","accountRequired","paymentRequired","persistsFinancialData","mcp","guide"],"additionalProperties":false}}}}}},"post":{"operationId":"calculateRetirement","summary":"Project supplied, confirmed inputs and one optional alternative.","description":"A first projection for one or two Canadian adults: employment, a defined-benefit pension, CPP/QPP, OAS, RRSP/RRIF, TFSA, non-registered investments and cash. No corporations, property, debts, children, benefit-entitlement history, LIRA/LIF or planned extra contributions. GIS, Allowance and refundable benefit payments (including Ontario GAINS and Trillium) are not included; missing benefits can make a projected shortfall look larger. Review eligibility and payment history before changing spending. Quebec employment requires explicit confirmation of Quebec payroll contributions; cross-province employment is outside this first-calculation scope. Excluded situations need additional facts and supported-case review. Send exactly {\"input\":...}, within 16,384 bytes. Confirm assumptions with the person before setting assumptionsAccepted:true. Schema validation is necessary but the server also validates calendar dates, ages, Quebec payroll/QPP details, partner age gaps, cost basis and alternative consistency. Request/response financial data is not saved by this public calculation; the caller or AI host can retain it.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"input":{"$ref":"#/components/schemas/CalculatorInput"}},"required":["input"],"additionalProperties":false}}}},"responses":{"200":{"description":"Annual projections, assumptions and provenance, plus a caller-held input artifact. No saved household or run is created; summary scenario IDs are local baseline/alternative labels.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CalculationResult"}}}},"400":{"description":"Invalid JSON, envelope or inputs. Validation can return fields with path/message. Codes: invalid_input, invalid_json.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CalculatorError"}}}},"403":{"description":"Untrusted browser Origin. Server clients may omit Origin; browser clients must use a permitted origin. Codes: invalid_origin.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CalculatorError"}}}},"408":{"description":"Request body took too long to arrive. Codes: body_timeout.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CalculatorError"}}}},"413":{"description":"Body exceeds 16,384 bytes. Codes: too_large.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CalculatorError"}}}},"422":{"description":"Isolated calculator rejected the supplied input. Codes: calculator_unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CalculatorError"}}}},"429":{"description":"Ingress or public calculation allowance reached. Respect Retry-After and retryAfterSeconds when returned. Codes: busy, public_allowance.","headers":{"Retry-After":{"description":"Seconds to wait when supplied.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CalculatorError"}}}},"503":{"description":"Disabled, busy or unavailable service. Inputs have not been saved. Retry later; the separate saved sample remains readable. Codes: not_open, calculator_unavailable, calculation_timeout, unavailable.","headers":{"Retry-After":{"description":"Seconds to wait when supplied.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CalculatorError"}}}}}},"options":{"operationId":"calculatorPreflight","summary":"CORS preflight for permitted origins.","responses":{"204":{"description":"Permitted origin; GET, POST, OPTIONS; Content-Type and Accept headers."},"403":{"description":"Untrusted origin; empty response body."}}}}},"components":{"schemas":{"CalculatorInput":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"name":{"default":"My retirement plan","type":"string","minLength":1,"maxLength":120},"startYear":{"default":2026,"type":"number","const":2026},"province":{"type":"string","enum":["AB","BC","MB","NB","NL","NS","NT","NU","ON","PE","QC","SK","YT"]},"people":{"minItems":1,"maxItems":2,"type":"array","items":{"type":"object","properties":{"name":{"description":"A label is enough; a legal name is unnecessary.","default":"You","type":"string","minLength":1,"maxLength":60},"birthDate":{"description":"Exact birth date controls ages and benefit timing.","type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"retirementAge":{"type":"integer","minimum":18,"maximum":85},"employmentIncome":{"description":"Gross annual employment income now, CAD; enter 0 if none.","type":"number","minimum":0,"maximum":25000000},"quebecPayrollConfirmed":{"description":"Required only for positive employment income in Quebec: explicitly confirm this employment is subject to Quebec payroll contributions. Residence alone does not establish the employment jurisdiction. Cross-province employment is outside this first-calculation scope.","type":"boolean","const":true},"cppAnnualAt65":{"description":"Annual CPP or QPP at 65 in 2026 CAD from statement. Explicit null accepts the labelled 60%-of-maximum starting estimate.","anyOf":[{"type":"number","minimum":0,"maximum":25000000},{"type":"null"}]},"cppStartAge":{"default":65,"type":"integer","minimum":60,"maximum":70},"oasResidenceYears":{"description":"Canadian residence years after 18 used for OAS entitlement at its start; 40 means full OAS.","type":"integer","minimum":0,"maximum":40},"oasStartAge":{"default":65,"type":"integer","minimum":65,"maximum":70},"savings":{"type":"object","properties":{"rrsp":{"type":"number","minimum":0,"maximum":25000000},"rrif":{"type":"number","minimum":0,"maximum":25000000},"tfsa":{"type":"number","minimum":0,"maximum":25000000},"nonRegistered":{"type":"number","minimum":0,"maximum":25000000},"nonRegisteredCostBasis":{"type":"number","minimum":0,"maximum":25000000},"cash":{"type":"number","minimum":0,"maximum":25000000}},"required":["rrsp","rrif","tfsa","nonRegistered","nonRegisteredCostBasis","cash"],"additionalProperties":false},"tfsaRoom":{"default":0,"type":"number","minimum":0,"maximum":25000000},"rrspRoom":{"default":0,"type":"number","minimum":0,"maximum":25000000},"pension":{"type":"object","properties":{"annual":{"description":"Annual pension in 2026 CAD; grown by plan inflation to its start age, then by its stated indexing.","type":"number","minimum":0,"maximum":25000000},"startAge":{"type":"integer","minimum":18,"maximum":85},"indexing":{"default":0,"type":"number","minimum":0,"maximum":0.05}},"required":["annual","startAge","indexing"],"additionalProperties":false}},"required":["name","birthDate","retirementAge","employmentIncome","cppAnnualAt65","cppStartAge","oasResidenceYears","oasStartAge","savings","tfsaRoom","rrspRoom"],"additionalProperties":false}},"annualSpending":{"description":"Annual household spending after tax in 2026 CAD, excluding contributions.","type":"number","exclusiveMinimum":0,"maximum":25000000},"inflation":{"default":0.021,"type":"number","minimum":0,"maximum":0.06},"investmentReturn":{"default":0.05,"type":"number","minimum":-0.02,"maximum":0.1},"assumptionsAccepted":{"description":"Confirm the stated basic scope, return/inflation assumptions and any explicit CPP estimate with the person before calculating.","type":"boolean","const":true},"alternative":{"type":"object","properties":{"name":{"default":"What if","type":"string","minLength":1,"maxLength":80},"retirementAges":{"minItems":1,"maxItems":2,"type":"array","items":{"type":"integer","minimum":18,"maximum":85}},"annualSpending":{"type":"number","exclusiveMinimum":0,"maximum":25000000}},"required":["name"],"additionalProperties":false}},"required":["name","startYear","province","people","annualSpending","inflation","investmentReturn","assumptionsAccepted"],"additionalProperties":false},"CalculationResult":{"type":"object","properties":{"currency":{"const":"CAD"},"dollarsYear":{"type":"integer"},"chargedCents":{"const":0},"persisted":{"const":false},"scope":{"type":"string"},"scenarios":{"type":"array","minItems":1,"maxItems":2,"items":{"type":"object","properties":{"name":{"type":"string"},"summary":{"type":"object","properties":{"moneyLasts":{"type":"boolean"},"firstShortfallYear":{"type":["integer","null"]},"finalYear":{"type":"integer"},"estateAfterTax":{"type":"number"},"estateAfterTaxStartYearDollars":{"type":"number"},"provenance":{"type":"object","properties":{"scenarioId":{"enum":["baseline","alternative"],"description":"Ephemeral comparison label, never a private saved scenario ID."},"revision":{"const":1},"engineVersion":{"type":"string"},"ratesYear":{"type":"integer"}},"required":["scenarioId","revision","engineVersion","ratesYear"],"additionalProperties":true}},"required":["moneyLasts","firstShortfallYear","finalYear","estateAfterTax","estateAfterTaxStartYearDollars","provenance"],"additionalProperties":true},"assumptions":{"type":"array","items":{"type":"string"}},"years":{"type":"array","items":{"type":"object","properties":{"year":{"type":"integer"},"ages":{"type":"object","additionalProperties":{"type":"integer"}},"spending":{"type":"number"},"incomeTax":{"type":"number"},"savings":{"type":"number"},"savingsToday":{"type":"number"},"cashBalance":{"type":"number"}},"required":["year","ages","spending","incomeTax","savings","savingsToday","cashBalance"],"additionalProperties":false}}},"required":["name","summary","assumptions","years"],"additionalProperties":false}},"comparison":{"type":["object","null"],"description":"Alternative minus baseline, using supplied inputs. Present only as an object when an alternative was supplied.","additionalProperties":true},"assumptions":{"type":"array","items":{"type":"string"}},"provenance":{"type":"object","properties":{"engineVersion":{"type":"string"},"ratesHash":{"type":"string"},"inputHash":{"type":"string"}},"required":["engineVersion","ratesHash","inputHash"],"additionalProperties":false},"artifact":{"type":"object","properties":{"format":{"const":"glacier-calculator-v1"},"input":{"$ref":"#/components/schemas/CalculatorInput"}},"required":["format","input"],"additionalProperties":false},"continue":{"type":"object","properties":{"web":{"type":"string"},"save":{"type":"string"},"accountMcp":{"type":"string"}},"required":["web","save","accountMcp"],"additionalProperties":false},"disclaimer":{"type":"string"}},"required":["currency","dollarsYear","chargedCents","persisted","scope","scenarios","comparison","assumptions","provenance","artifact","continue","disclaimer"],"additionalProperties":false},"CalculatorError":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"fields":{"type":"array","items":{"type":"object","properties":{"path":{"type":"string"},"message":{"type":"string"}},"required":["path","message"],"additionalProperties":false}},"retryAfterSeconds":{"type":"number"}},"required":["error","message"],"additionalProperties":false}}},"externalDocs":{"url":"https://planner.glacierfinancial.ca/docs/agents","description":"First answers, supported jobs and separate saved-plan OAuth access."}}