Portfolio Health
Build issue work queues from versioned current-state snapshots
Use GET /teams/issues to read current open issues across accessible teams in
one regional data partition. Use a partner API key for a managed portfolio or
a team API key for that team's scope.
For an interactive partner UI, discover available partitions from
GET /me at partnerContext.managedTeamRegions. Send x-data-region when
reading a partition. The API does not merge multiple regions in one response;
call each advertised regional API base URL independently when the screen needs
the full portfolio.
Pagination and Filters
teamIds: optional comma-separated team UUIDs; omit for all accessible teams.codes: optional comma-separated values from the Issue Catalog.includeEmptyTeams: include teams with no open issues.view=summary|detail:view=detail(default) includes each issue's code-specificcontext;view=summaryomits it.limit: 1 to 100.cursor: opaque value returned by the previous page.
Pass cursors back unchanged. Cursors belong to one region and filter set, so reset them when switching region. Requested teams outside the credential's access scope are not disclosed.
Snapshot Contract
Each team result includes teamId, teamName, snapshotVersion,
computedAt, issues[], and summary counts.
snapshotVersionincreases only when normalized open issue content changes.computedAtalso changes after a no-op reconciliation and indicates freshness.- Issue
idis stable for one team and code. - Issue
featureis a stable grouping key for partner-native queues. Current values areaccounting,banking,billing,connections,listings,reconciliation,reservations,statements, andteam. - If a resolved issue later reopens, its ID is reused and version increases.
summary.totalcounts open codes;affectedTotalsums their affected values.
Never parse issue title or message. Branch on code, feature, severity,
category, and context. Use each issue's generated documentationUrl to open
its catalog entry in the public documentation.
Mutation responses do not wait for portfolio-health recomputation. A successful
write persists its audit record, then marks and schedules only health checks
that depend on the changed resource types. Deferred effect mutations use the
same immediate scheduling path after their health state is durable. Re-read
GET /teams/issues until computedAt advances when a workflow needs the
refreshed health state.
Checks that can change because time passed or an external system changed are also reconciled within a 15-minute window. Teams are spread deterministically across that window, so a regional portfolio is not recomputed in one burst. Pending work is durable and is drained by recovery if the immediate wake-up is missed. These scheduling details do not change the snapshot or issue lifecycle contract returned by the API.
Initial Materialization
If any team in the request scope lacks its first materialized snapshot, the
whole request fails with 503 SERVICE_UNAVAILABLE; no partial result is
returned for the teams that do have snapshots. The structured context lists
only the affected teams in pendingTeamIds, with a retryAfterSeconds hint.
A pending team is not silently treated as healthy. To recover, retry the same
request after retryAfterSeconds, or scope teamIds to exclude the pending
teams and read the rest immediately. Alert if materialization remains
unavailable.
Task Ownership and Lifecycle
The API owns issue state. There are no close, reopen, or snooze mutations:
- an issue is open while its catalog trigger is true;
- it resolves and disappears from the response when the source condition is corrected;
- it reopens with the same
idand a higherversionif that condition later returns; and - Hostaway may snooze a task in its own UI, but snooze never changes the API state. Reconsider a local snooze whenever the issue version changes.
Use feature to build queue sections and the code-specific context or
catalog fetch guidance to open a repair workflow. VRPlatform does not return a
Hostaway application URL because the parent application owns its navigation.
documentationUrl points to technical guidance, not an in-product action.
Calendar reminders, month-end checklists, and other scheduled work are not issue codes. The partner application owns their cadence and presentation. Add an issue code only when VRPlatform can detect a current source condition and automatically resolve it after correction.
For analytics, treat (teamId, issue.id, version) and snapshot changes as the
event identity. For support assistants, use documentationUrl, the generated
catalog guidance, and current issue context; no separate AI-specific issue
payload is required.
UI Pattern
Use summary view for portfolio queues. Fetch detail when a user opens a repair workflow. Keep region identity on every queue row if the UI combines regional responses. Replace current team state after every newer snapshot; do not retain resolved codes.
Exact contract: List team issues.
