Skip to content

v2026.19 - Enterprise API#12

Draft
seripap wants to merge 1 commit intomainfrom
v2026.19
Draft

v2026.19 - Enterprise API#12
seripap wants to merge 1 commit intomainfrom
v2026.19

Conversation

@seripap
Copy link
Copy Markdown
Contributor

@seripap seripap commented May 6, 2026

Changelog — Enterprise API (v2026.19)

This release is a major expansion of the First Street Enterprise GraphQL API.

The feature surface roughly doubles: the schema introduces full Portfolio, Locality, Adaptation, Asset Valuation / Value Chain, Macroeconomic, Link Sharing, and AI Insights domains, alongside a new Hazard rollup peril and substantially expanded damage outputs (interruption loss, cash loss, operator loss) on Flood and Wind.

There are no removed types, queries, mutations, or enum values in this release. All listed deprecations are soft - the deprecated fields continue to function, but new code should adopt the replacements documented below.


Breaking changes

There are no hard breaking changes in this release. No types, fields, enum values, queries, or mutations were removed. No field types or required‑ness were changed.

A few notes on changes you may notice:

  • The schema file was reformatted (4‑space indentation to tabs). This is cosmetic only and has no effect on the API contract.
  • Several previously unique sort/factor names now sit alongside new *_SCORE_* and *_HAZARD_* variants. Existing values still work.
  • The deprecated‑but‑still‑functional fields below should be migrated within this release cycle; they are scheduled for removal in a future major release.

Deprecations

These items still work but should be migrated.

Climate factor scalars → granular factorScore

On every AssetClimateExposure* type, the single integer *Factor and factorScale fields are replaced by factorScore(filterBy: AssetSortFilter): [FactorScore], which exposes score and scale broken down by SSP and year.

  • AssetClimateExposureCold.coldFactorfactorScore.score
  • AssetClimateExposureCold.factorScalefactorScore.scale
  • AssetClimateExposureDrought.droughtFactor / factorScalefactorScore.score / factorScore.scale
  • AssetClimateExposureFlood.floodFactor / factorScalefactorScore.score / factorScore.scale
  • AssetClimateExposureHeat.heatFactor / factorScalefactorScore.score / factorScore.scale
  • AssetClimateExposureWildfire.fireFactor / factorScalefactorScore.score / factorScore.scale
  • AssetClimateExposureWind.windFactor / factorScalefactorScore.score / factorScore.scale

AssetSort factor enums → *_SCORE_* variants

The following sort values are deprecated; use the _SCORE_ variants which sort on factorScore.score:

  • CLIMATE_EXPOSURE_FLOOD_FACTOR_ASC / _DESCCLIMATE_EXPOSURE_FLOOD_FACTOR_SCORE_ASC / _DESC
  • CLIMATE_EXPOSURE_FIRE_FACTOR_ASC / _DESCCLIMATE_EXPOSURE_FIRE_FACTOR_SCORE_ASC / _DESC
  • CLIMATE_EXPOSURE_WIND_FACTOR_ASC / _DESCCLIMATE_EXPOSURE_WIND_FACTOR_SCORE_ASC / _DESC
  • CLIMATE_EXPOSURE_HEAT_FACTOR_ASC / _DESCCLIMATE_EXPOSURE_HEAT_FACTOR_SCORE_ASC / _DESC
  • CLIMATE_EXPOSURE_COLD_FACTOR_ASC / _DESCCLIMATE_EXPOSURE_COLD_FACTOR_SCORE_ASC / _DESC
  • CLIMATE_EXPOSURE_DROUGHT_FACTOR_ASC / _DESCCLIMATE_EXPOSURE_DROUGHT_FACTOR_SCORE_ASC / _DESC

Project & query deprecations

  • Query.projects → use Query.projectsConnection for pagination, sort, and filter support.
  • Query.projectJobs → redundant; use Query.projectJobsConnection.
  • Query.projectAutocomplete → marked WIP; do not depend on it.
  • Mutation.deleteProject → replaced by Mutation.deleteProjectAsync, which returns a ProjectJob and runs as a background job.
  • Project.vintage: String! → replaced by Project.vintageId: Int64 (numeric for consistency).
  • ProjectAssetAdaptation.relativeYear → use holdPeriod instead.

Macroeconomic / company

  • Company.industryIdCompany.industry.id (new Industry object).
  • Company.sectorIdCompany.sector.id (new Sector object).
  • The following macroeconomic factor fields are now obsolete (marked @deprecated): econFactorClimate, econFactorScaleClimate, gdpChangeFactor, gdppcChangeFactor, medianAgeChangeFactor, nativeBornPctChangeFactor, populationChangeFactor, rppiChangeFactor, cppiChangeFactor, unemploymentChangeFactor.

New features and additions

Adaptation (new domain)

  • New types: Adaptation, AdaptationSummaryData, ModuleAdaptation, ModuleAdaptationSummary, ProjectAdaptationData, ProjectAdaptationSummaryData, ProjectAssetAdaptation, ProjectAssetAdaptationConnection, ProjectAssetAdaptationEdge, StagedAdaptation.
  • New enums: AdaptationType (FLOOD_BARRIER_TO_1_FOOT … _8_FEET, FIRE_PROOFING, DEFENSIBLE_SPACE, WIND_DESIGN_STANDARD_LOW_TO_MEDIUM / _MEDIUM_TO_HIGH / _LOW_TO_HIGH, ROOF_TYPE_TO_METAL), ProjectAssetAdaptationSort.
  • New inputs: AdaptationsInput, ProjectAdaptationPlanItem, ProjectAssetAdaptationFilter, ProjectStagedAdaptationsInput, StagedAdaptationInput, UpdateProjectStagedAdaptationsInput, UpdateProjectStagedAdaptationsPlanInput, UpdateUserGroupStagedAdaptationsInput, DeleteUserGroupStagedAdaptationsInput.
  • New queries: userGroupStagedAdaptations(placeId: String!): [StagedAdaptation]!, projectStagedAdaptations(input: ProjectStagedAdaptationsInput!): [StagedAdaptation]!.
  • New mutations: updateUserGroupStagedAdaptations, deleteUserGroupStagedAdaptations, updateProjectStagedAdaptations, updateProjectStagedAdaptationsPlan.

Locality (new domain)

  • New types: Locality, AssetLocality, ParentLocality, ModuleLocality, LocalityMacroeconomicData, ProjectLocalityData, ProjectLocalityExposure, ProjectLocalityExposureConnection, ProjectLocalityExposureEdge, ProjectLocalitiesPayload.
  • New enums: AdministrativeLevel (ADMIN_0, ADMIN_1, ADMIN_2, METRO), ProjectLocalityExposureSort.
  • New inputs: LocalityFilter, LocalityExportInput, LocalityExportAssetsFilter, ProjectLocalitiesInput, ProjectLocalityExposureFilter.
  • New query: projectLocalities(input: ProjectLocalitiesInput!): ProjectLocalitiesPayload!.
  • New mutation: createLocalityMacroeconomicExport(input: LocalityExportInput!): ExportJob!.
  • ProjectAssetFilter adds localityFilter and localityFilters fields.
  • AssetSortFilter adds an adminLevel: AdministrativeLevel field.
  • ProjectAsset adds a locality: AssetLocality field.

Portfolio (new domain)

  • New types: Portfolio, PortfolioContent, PortfolioContentConnection, PortfolioContentEdge, PortfolioFilterContent, PortfolioPathNode, PortfolioMap, PortfolioAssetDetails, PortfolioDashboardScore, PortfolioPerilScore, DirtySubportfolio, CopyPortfolioToNewParentPayload.
  • New enums: PortfolioContentSort, PortfolioContentType, PortfolioStatus, PortfolioType.
  • New inputs: PortfolioInput, PortfolioContentsInput, CopyPortfolioToNewParentInput, DeletePortfolioFromParentInput, RefreshPortfolioInput, UpdatePortfolioAssetDetailsInput, UpdatePortfolioParentInput, DashboardScoreFilter.
  • New queries: portfolio(input: PortfolioInput): Portfolio!, portfolioPath(projectId: Int64!): [PortfolioPathNode!]!.
  • New mutations: updatePortfolioAssetDetails, movePortfolio, removePortfolioFromParent, copyPortfolioToNewParent, movePortfolioAssetToNewParent, copyPortfolioAssetToNewParent, removePortfolioAssetFromParent, refreshPortfolio.

Asset Valuation & Value Chain (new domain)

  • New types: AssetValueChain, ValueChainData, ValueChainRevenueAtRisk, ValueChainRevenueRealized, RisksByValueChainData.
  • New enums: ValueChainPosition, ProjectAssetClass.
  • ProjectAssetFilter adds valueChainPosition: [ValueChainPosition!].
  • ProjectAsset adds valuechain: AssetValueChain.

Custom building values & staging

  • New types: ProjectCustomBuildingValuesPayload, ProjectStagedCustomBuildingValuesPayload, UpdateProjectCustomBuildingValuesPayload, UpdateProjectStagedCustomBuildingValuesPayload.
  • New inputs: ProjectCustomBuildingValuesInput, UpdateProjectCustomBuildingValuesInput, UpdateProjectStagedCustomBuildingValuesInput, DeleteProjectStagedCustomBuildingValuesInput.
  • New queries: projectCustomBuildingValues, projectStagedCustomBuildingValues.
  • New mutations: updateProjectCustomBuildingValues, updateProjectStagedCustomBuildingValues, deleteProjectStagedCustomBuildingValues.
  • ProjectAsset adds stagedBuilding: EnterpriseBuilding.

Project lifecycle

  • New types: ProjectsConnection, ProjectEdge, ProjectCloneJob (implements ProjectJob), ProjectClonePayload, DeleteProjectJob (implements ProjectJob), ProjectAutocompletePayload, ProjectAutocompleteResult, ProjectMaps.
  • New inputs: ProjectFilter, CompanyFilter, CompanySortFilter, ProjectCloneInput, ProjectAutocompleteInput, ProjectExportJobAssetFilters, AddProjectAssetInput, DeleteProjectAssetInput, UpdateREAParentInput.
  • New enum: ProjectSort.
  • New queries: projectsConnection, companiesConnection, projectAsset.
  • New mutations: deleteProjectAsync, addProjectAssetByPlaceID, deleteProjectAssetByPlaceID, createProjectClone, moveREAToNewParent, copyREAToNewParent, deleteREAFromParent.
  • Project gains: aiInsights, assetClass, assetCount, centroid, clonedFromProject, complexProperties, createdAt, maps, parentProjectId, portfolioAssetDetails, portfolioStatus, portfolioType, vintageId.
  • ProjectStatus gains: CLONING, DELETING, DELETED.
  • CreateProjectInput gains parentProjectId.
  • ProjectExportInput gains projectExportJobFilters: ProjectExportJobAssetFilters.
  • RefreshProjectModuleInput gains vintageId: Int64.
  • ProjectExportJobType gains EQUITY_OVERVIEW, LOCALITY_MACROECONOMIC, FULL_PORTFOLIO.

Hazard rollup peril (new)

  • New types: AssetClimateExposureHazard, AssetHazardDamages, AssetHazardDamagesAAL, HazardExposureStatistics, LinearHazardExposureStatistics.
  • AssetClimateExposure gains a hazard: AssetClimateExposureHazard field aggregating all perils.
  • New AssetSort values: CLIMATE_EXPOSURE_HAZARD_FACTOR_SCORE_ASC / _DESC, CLIMATE_EXPOSURE_HAZARD_DAMAGE_AAL_* (ASC/DESC and _CASH_LOSS_*, _INTERRUPTION_*, _REPAIR_DAYS_*).

Damage outputs expanded (Flood, Wind, Fire)

AssetFloodDamagesAsset adds: interruptionLoss: Int64, cashLoss: Int64, operatorLoss: Int64.
AssetWindDamagesAsset adds: interruptionLoss: Int64, cashLoss: Int64, operatorLoss: Int64.

New AssetSort values for these dimensions: CLIMATE_EXPOSURE_FLOOD_CASH_LOSS_*, CLIMATE_EXPOSURE_FLOOD_INTERRUPTION_LOSS_*, CLIMATE_EXPOSURE_FLOOD_LOW_POINT_*, CLIMATE_EXPOSURE_FLOOD_DAMAGE_AAL_CASH_LOSS_*, CLIMATE_EXPOSURE_FLOOD_DAMAGE_AAL_INTERRUPTION_*, CLIMATE_EXPOSURE_FLOOD_DAMAGE_AAL_REPAIR_DAYS_*, plus the equivalent WIND_* and FIRE_* variants.

New peril surfaces (Air, Hail) and exposure statistics

  • New types: FloodExposureStatistics, FireExposureStatistics, WindExposureStatistics, HeatExposureStatistics, ColdExposureStatistics, DroughtExposureStatistics, HazardExposureStatistics, RegionalExposure, plus Linear* variants for each (LinearFloodExposureStatistics, LinearFireExposureStatistics, LinearWindExposureStatistics, LinearHeatExposureStatistics, LinearColdExposureStatistics, LinearDroughtExposureStatistics, LinearHazardExposureStatistics, LinearAssetAnalysisData).
  • New input: RegionalExposureInput.
  • New AssetSort values: CLIMATE_EXPOSURE_AIR_FACTOR_SCORE_ASC / _DESC, CLIMATE_EXPOSURE_HAIL_FACTOR_SCORE_ASC / _DESC.

Macroeconomic (new domain)

  • New types: MacroeconomicData, LocalityMacroeconomicData, ModuleMacroeconomic, EconFactorDistribution, PerilBucketDistribution, BucketStat.
  • New input: EconFactorDistributionFilter.
  • New AssetSort values: extensive METRO_MACROECONOMIC_* family covering GDP, GDPPC, population, gross income, price of living, and their CHANGE_FACTOR_CLIMATE / CHANGE_FACTOR_CLIMATE_MARKET variants (ASC/DESC for each).

Equity / Company / Industry (new domain)

  • New types: CompanyOverviewData, EquityScoreData, Industry, Sector, ModuleCompanyOverview, ModuleLinearAssetAnalysis, FactorScore.
  • New enum: InvestmentStage.
  • Company.industry: Industry and Company.sector: Sector replace the deprecated industryId / sectorId strings.

Link sharing (new domain)

  • New types: LinkShare, LinkShareEdge, LinkSharePayload, LinkSharesConnection, GenerateLinkSharePayload, UpdateLinkSharePayload.
  • New enum: LinkSharesSort.
  • New inputs: LinkShareInput, GenerateLinkShareInput, UpdateLinkShareInput.
  • New queries: linkShare(input: LinkShareInput!): LinkSharePayload!, linkSharesConnection(...).
  • New mutations: generateLinkShare, linkShare(linkId: String!): LinkShare, updateLinkShare.

Viewed history (new)

  • New types: ViewedHistoryItem, ViewedHistoryList.
  • New enums: ViewedHistoryItemType, ViewedItemsSort.
  • New inputs: SaveViewHistoryInput, EntDeleteViewedHistoryInput.
  • New query: viewedHistoryList(sort: ViewedItemsSort): ViewedHistoryList.
  • New mutations: saveViewedHistoryItem, deleteViewedHistoryItem.

AI Insights (new)

  • New types: AIInsights, ModuleOverview AI summary surfacing.
  • New enum: AIInsightsStatus (GENERATING, GENERATED, FAILED, DIRTY).
  • Project.aiInsights: AIInsights.

User & user groups

  • New types: UserGroup, UserSubgroup.
  • New input: DeleteUserDataInput.
  • New query: userGroup: UserGroup.
  • New mutation: deleteUserData(input: DeleteUserDataInput!): RequestStatus!.

Geospatial primitives (new)

  • New types: BoundingBox, Coordinate, Feature, Map, ComplexProperties.
  • New enums: ComplexType, MapStatus, OccupancyType, AssetStatus.
  • New scalar: Time.

Project asset additions

ProjectAsset gains: buildingMetadata: AssetBuildingMetadata, locality: AssetLocality, stagedBuilding: EnterpriseBuilding, valuechain: AssetValueChain, newlyAdded: Boolean, deleted: Boolean, createdAt: Date, geocodeQualityScore: Int.

ProjectAssetFilter gains: localityFilter, localityFilters, locationValidated, valueChainPosition.


Migration guide

1. Replace Factor integers with factorScore

Before

query {
  projectAsset(projectId: 123, placeId: "abc") {
    climateExposure {
      flood { floodFactor factorScale }
      wildfire { fireFactor factorScale }
      wind { windFactor factorScale }
    }
  }
}

After

query {
  projectAsset(projectId: 123, placeId: "abc") {
    climateExposure {
      flood {
        factorScore(filterBy: { ssp: SSP_2_45, relativeYear: 0 }) {
          score
          scale
        }
      }
      wildfire {
        factorScore(filterBy: { ssp: SSP_2_45, relativeYear: 0 }) { score scale }
      }
      wind {
        factorScore(filterBy: { ssp: SSP_2_45, relativeYear: 0 }) { score scale }
      }
    }
  }
}

2. Replace AssetSort factor enums with _SCORE_ variants

Before

projectAssetConnection(sort: CLIMATE_EXPOSURE_FLOOD_FACTOR_DESC) { ... }

After

projectAssetConnection(
  sort: CLIMATE_EXPOSURE_FLOOD_FACTOR_SCORE_DESC
  filter: { assetSortingFilter: { ssp: SSP_2_45, relativeYear: 0 } }
) { ... }

3. Paginate projects with projectsConnection

Before

query { projects { id name } }

After

query {
  projectsConnection(first: 50, sort: CREATED_AT_DESC, filter: { /* ProjectFilter */ }) {
    edges { node { id name } cursor }
    pageInfo { hasNextPage endCursor }
  }
}

4. Use projectJobsConnection instead of projectJobs

Before

query { projectJobs(filter: { projectId: 123 }) { id status } }

After

query {
  projectJobsConnection(first: 50, filter: { projectId: 123 }) {
    edges { node { id status } cursor }
    pageInfo { hasNextPage endCursor }
  }
}

5. Switch to deleteProjectAsync

Before

mutation { deleteProject(input: { projectId: 123 }) { success } }

After

mutation {
  deleteProjectAsync(input: { projectId: 123 }) {
    id
    status
  }
}

The async version returns a ProjectJob (specifically DeleteProjectJob) that you can poll via projectJob(projectJobId:). The project enters ProjectStatus.DELETING and transitions to DELETED when the job completes.

6. Use vintageId instead of vintage

Before

query { project(projectId: 123) { vintage } }

After

query { project(projectId: 123) { vintageId } }

vintageId is Int64; update client types accordingly.

7. Use holdPeriod instead of relativeYear on adaptations

Before

projectStagedAdaptations(input: { projectId: 123, placeId: "abc" }) {
  type
  relativeYear
}

After

projectStagedAdaptations(input: { projectId: 123, placeId: "abc" }) {
  type
  holdPeriod
}

8. Replace Company.industryId / sectorId with the nested objects

Before

{ company { industryId sectorId } }

After

{ company { industry { id name } sector { id name } } }

9. Drop obsolete macroeconomic factor fields

The following are now @deprecated with reason "This parameter is obsolete." and should be removed from queries: econFactorClimate, econFactorScaleClimate, gdpChangeFactor, gdppcChangeFactor, medianAgeChangeFactor, nativeBornPctChangeFactor, populationChangeFactor, rppiChangeFactor, cppiChangeFactor, unemploymentChangeFactor. Use the new MacroeconomicData / LocalityMacroeconomicData surfaces and the METRO_MACROECONOMIC_* sort enum variants instead.

10. Avoid projectAutocomplete

It is shipped but marked @deprecated(reason: "WIP"). Do not depend on its shape; it is subject to change without further notice.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant