Appearance
API Changelog
The Flowstate API follows Semantic Versioning. Breaking changes will only occur in major version bumps and will be announced well in advance.
For platform changes, see Flowstate Updates.
v1.4.0 — 2026-07-29
R&D tax claims, AI spend tiering, autonomous cost-centre classification — and the cost centre returns to the project.
For platform changes, see Flowstate Updates.
Added
- R&D tax claim surface. Queries:
rdTaxClaims,rdTaxClaim(id),rdClaimWorkflow,rdJurisdictions,rdJurisdictionConfig, andcalculateProjectCostForClaim. Lifecycle mutations:rdClaimCreate,createRdTaxClaim,updateRdTaxClaim,updateRdTaxClaimStatus,rdClaimAccept, andrdClaimDismiss. Cost mutations:addRdExpense,deleteRdExpense, andsyncRdCostsFromApprovedAllocations. A claim carries a period (year + quarter), a jurisdiction, a framework, an editable deadline, and a per-claim cost split across employees, contractors and AI spend. - Eligibility scanning and project classification.
analyzeProjectForRdQualificationassesses a single project;upsertProjectClassification/deleteProjectClassificationrecord the verdict. Scan cadence, enablement and lookback window are configured per organisation (RdScanConfig) — the lookback covers up to three prior fiscal years. Verdicts distinguish eligible, not eligible, and insufficient-context. - Rationale drafting and rewrite.
rdClaimGenerateContentdrafts the narrative sections;generateNarrativeQuestions/submitNarrativeAnswersrun the targeted-question loop;rdClaimAnswerInterviewQuestionanswers one inline. Selection rewrites are proposed asRationaleSuggestionrows and resolved withrdRationaleRewriteSelection,rdRationaleResolveSuggestionandrdRationaleResolveAllSuggestions.generateRdTaxDocumentationproduces the submission pack. - AI spend export. A spreadsheet export covering the summary, the daily time series, Reported spend by provider / person / API key, and Attributed spend by project. Attributed cost fields are withheld server-side for organisations without the tier rather than hidden client-side.
- Analysis-agent autonomy controls.
AnalysisAgentConfigplus per-questionAnalysisTypePolicy(off/suggest/auto_applywith a confidence threshold); runs and findings are recorded asAnalysisRun/AnalysisFinding. An auto-applied change carries its reason, confidence and model, and is revertible. Auto-apply only ever fills a null — it never overwrites a human-set value — and de-capitalising findings are always surfaced for review rather than applied. Enabling auto-apply requires the financial-configuration permission. - Post-completion cost centre on projects.
LiveProject.completionCostCenterId(with itscompletionCostCentrerelation) is readable and writable, and predicted by the analysis agent alongside the build centre. - Canonical workforce
name.LiveEmployee.name(nullable) sits alongsidefirstName/lastName, backfilled for existing rows, with a shared display-name helper. This makes single-name records representable;emailis genuinely optional. - New vacancy status value —
committed. ALiveVacancy.statusofcommittedsits between open and filled for an approved hire and contributes forecast cost exactly as an open vacancy does.statusremains a free-form string; seesrc/lib/constants/vacancy-status.tsfor the canonical set. - Ten new MCP/assistant tools.
get_effort_gaps,get_uncosted_effort,get_submission_leaderboard,get_capex_declared_vs_claimed,get_capex_initiative_breakdown,get_capex_project_breakdown,list_rd_claims,list_forecast_budget_snapshots,get_forecast_budget_drift_summary, andmark_my_ai_sessions_as_project. See MCP server. - AI provider connection region. A provider connection carries a region, and that region's deployment performs the collection. Captured sessions are stamped with the geography they originated from instead of defaulting to Europe.
Changed
- The cost centre resolves from the project, not the Initiative. This reverses the Initiative-first chain introduced in v1.3.0.
resolveProjectCostCentrenow returns the project's owncostCentreId, falling back to thedormantCostCentreIdstashed at adoption; the resolvedsourceis alwaysproject.Initiative.costCentreis gone.capitalisableis derived from the category of the resolved cost centre (capex) and no longer from the Finance Mode. An Initiative'sfinanceModeCapabilities.canCapitalise/canRdClaimare true when any child project's resolved centre is CapEx-category. See Initiative finance. FinanceModegoverns billing only.CLIENT_BILLINGunlocksbudgetedCost/budgetCurrency/marginPct;INTERNAL_COSThides them. Client billing no longer suppresses CapEx or R&D — the two are independent.Initiative.completionCostCentreIdis unaffected.- Initiative money fields are roll-ups.
effortActuals,forecast,aiSpendandvarianceSummarysum the Initiative's child projects;committedFteand the AI budget remain the Initiative's own stated commitment. Initiative status is derived from its projects' delivery status rather than set directly. - Vacancy salary range collapsed to a single
salary.LiveVacancy.salaryis the one source of truth. The deprecated min/max range is still accepted on external contracts (REST and integration hooks) and migrated on write. - FTE is day-weighted. Assigned and actual FTE are now a day-weighted average over the requested window, so a mid-period joiner contributes a partial FTE and monthly, quarterly and annual reads reconcile.
Moneyconverts at the current FX rate. Currency conversion uses the rate in force as of today rather than the oldest rate on file.- Effort is expressed as FTE. The vestigial
hoursAllocatedcolumn is dropped; effort is a percentage of a working day. Submitted and approved weeks are immutable to automated recomputation.
Removed
Initiative.costCentre— an Initiative carries no cost centre of its own (see Changed above).- Initiative resourcing commitments and check-ins — the per-subject
InitiativeCommitmentwrite surface and theset_initiative_commitmentMCP tool are removed. An Initiative's resourcing is the aggregate of its projects' allocations. CAPEX_RD_CLAIMas a liveFinanceMode— every row was data-migrated toINTERNAL_COSTand the value is never written again. It remains in the enum only because Postgres enum values cannot be dropped safely; do not branch on it.LiveEffort.hoursAllocated— see Changed above.
v1.3.0 — 2026-06-08
Initiative as finance anchor — GraphQL surface, MCP tools, and four new webhook entities.
For platform changes, see Flowstate Updates.
Added
- Initiative finance-anchor GraphQL API. The
Initiativetype now carries the finance/governance anchor:financeMode(CAPEX_RD_CLAIM/CLIENT_BILLING/INTERNAL_COST) +financeModeCapabilities,costCentre,budgetedCost/budgetCurrency,marginPct,committedFte, AI budget,lens,objective, the derivedisInert/capitalisableflags, and the windowed rollupseffortActuals,forecast,aiSpend,plannedCommitment, andvarianceSummary. Money fields are gated behindFINANCIALS_VIEW_SUMMARY(zeroed without it). - Strategy + classification types. New
Objective+KeyResult(the OKR layer above Initiatives),PortfolioLens(KTLO / Revenue / Cost-Reduction / Compliance), andInitiativeCommitment(planned per-subject committed FTE + AI budget). Queries:objectives,objective(id),portfolioLenses,capexClaims,capexClaim(id). - Finance + adoption mutations.
initiativeFinanceUpdate(partial finance patch),initiativeAdoptProject/initiativeDetachProject(move a project's cost-centre anchor onto/off an Initiative; the project's own cost centre is stashed indormantCostCentreIdwhile adopted), and CRUD for objectives, key results, portfolio lenses, and commitments. - Pull-based CapEx/R&D claims.
initiativeCapexClaimCreate(anchored — auto-pulls the Initiative's child projects as evidence;CAPEX_RD_CLAIMonly),adHocCapexClaimCreate(hand-picked projects), andcapexClaimConvertToInitiative. A one-claim-per-project-per-claimPeriodKeyguard throwsPROJECT_ALREADY_CLAIMED. - New error codes —
PROJECT_ALREADY_ADOPTED,PROJECT_NOT_ADOPTED_HERE,CROSS_ORG_ADOPTION, andPROJECT_ALREADY_CLAIMED, each with deep-link ids inextensions. See API → Initiatives → Error codes. - Operating model —
organizationOperatingModelUpdate(preset, terminology)relabels the workspace nouns (entityTerminology) and picks anoperatingModelPreset;Organizationnow exposes both fields. - Four new webhook entity types —
initiative,objective,portfolio_lens, andcapex_claimnow emitcreate/update/deleteevents. See Outbound Webhooks. - Six new MCP/assistant tools — read:
search_initiatives,get_initiative_details,list_portfolio,list_objectives; live writes:add_initiative,update_initiative,adopt_project_to_initiative,detach_project_from_initiative,set_initiative_commitment,create_capex_claim. See MCP server.
Changed
- A synced project is inert until anchored. A non-
manualproject with no cost centre and no Initiative carries no financial signal — it is excluded from capitalisation and the forecast until a human assigns a cost centre or adopts it into an Initiative. Finance reads resolve a project's cost centre and Finance Mode through the Initiative-first resolution chain. (Superseded in v1.4.0 — the cost centre returned to the project.) - Project delivery status is PMS-derived. A project's status is now the canonical
deliveryStatus(BACKLOG/TODO/IN_PROGRESS/IN_REVIEW/DONE/CANCELLED), rolled up from the statuses of its linked PMS tickets via the org status mapping. It is read-only while the project has any PMS link and manually settable only when it has none. The REST ProjectlifecycleStageIdfield is replaced bydeliveryStatus.
Removed
- Configurable lifecycle stages. The standalone lifecycle-stage entity and its
GET/POST/PATCH/DELETE /org/{orgId}/lifecycle-stagesREST endpoints, thelifecycle-stages:read/lifecycle-stages:writescopes, and thelifecycle_stagewebhook entity type are removed. Project delivery status now lives on the project itself asdeliveryStatus(see Changed above).
v1.2.0 — 2026-05-12
Contractor-filled vacancies + endDate-aware "currently filled" semantics.
For platform changes, see Flowstate Updates.
Added
POST /vacancies/:id/fillnow supports filling with a contractor. PassfillerType: "contractor"in the request body along withname,rate,rateType, andcurrencyCode. The endpoint creates a contractor record with an initial rate adjustment and transfers the vacancy's assignments to the new contractor. The response wraps both branches via mutually-exclusiveemployee/contractorfields. Existing employee-fill callers continue to work unchanged —fillerTypedefaults to"employee".Vacancy.filledByLiveContractorId— new mutually-exclusive companion tofilledByLiveEmployeeId. Set automatically by the contractor-branch fill, or manually viaPATCH.Vacancy.isFilled(derived) —truewhen one of thefilledBy*FKs is set and the filler'sendDateis unset or in the future. Once the filler'sendDatepasses, the vacancy is treated as open again (forecast cost resumes from that date). This replaces the previous "filledByLiveEmployeeId IS NULL" check throughout the forecast model.- Integration hook surface for positions — Custom-integration hooks that emit vacancy records can now use
filledBy: { externalId }(or the shorthandfilledByExternalId). The sync layer resolves the externalId against both live employees and live contractors and sets the appropriate FK. See Custom Integrations → Vacancies.
Changed
- Vacancy filtering semantics — Default vacancy listings now hide currently-filled vacancies; pass
excludeFilled=falseto include them. Cost forecast views suppress a vacancy's cost only while its filler is active (matchingisFilled), then resume contributing cost once the filler'sendDatepasses.
v1.1.0 — 2026-04-08
Custom attributes, nested writes, and vacancy fill.
For platform changes, see Flowstate Updates.
Added
- Custom attributes — Define custom fields on employees, contractors, vacancies, teams, and projects via
GET/POST/PATCH/DELETE /custom-attributes. Custom attribute values are returned on all resource endpoints and can be set during create and update operations. - Nested create and update — Create or update child records inline. For example, create an employee and their team assignment in a single
POST /employeesrequest by including anassignmentsarray in the body. - Vacancy fill endpoint —
POST /vacancies/:id/fillconverts a vacancy into an active employee or contractor record, closing the vacancy and transferring its assignments. ?include=support — Use?include=assignments,team,projecton any resource endpoint to embed related records in the response, reducing round trips.- Cost centre filter — All list endpoints now accept
costCentreIdas a filter parameter.
Changed
- Work Types renamed to Resource Types — The
/work-typesendpoint is now/resource-types. The previous path continues to work but is deprecated and will be removed in v2.0.0.
v1.0.0 — 2026-03-11
Initial public release of the Flowstate Developer API.
Added
- Employees — Full CRUD for employee records with salary, role, and geography data
- Contractors — Full CRUD for external contractors with rate and contract period tracking
- Vacancies — Full CRUD for open positions with salary ranges and hiring pipeline status
- Teams — Full CRUD for organizational teams with hierarchy support
- Projects — Full CRUD for projects with timelines and cost estimates
- Assignments — Unified assignment model for employee, contractor, vacancy, and team allocations to teams and projects
- Cost Centres — Full CRUD for cost centre management
- Value Streams — Full CRUD for value stream organization
- Work Types — Full CRUD for work type classification
- Drivers — Full CRUD for strategic project drivers
- Lifecycle Stages — Full CRUD for project lifecycle stage management
- Exchange Rates — Full CRUD for currency conversion rates
- Locations — Full CRUD for geographic location management
- Scenario support — Pass
scenarioIdto any endpoint to operate within a what-if scenario - Pagination — Consistent page-based pagination with
page,limit,search,sortBy, andsortDir - Authentication — API key-based authentication with scoped permissions
- Error handling — Structured error responses with error codes and unique error IDs