---
title: "Return a set of pre-loaded data required by the web app"
method: GET
path: "/v1/org/{orgId}/preload"
tags: ["preload"]
---

# Return a set of pre-loaded data required by the web app

`GET /v1/org/{orgId}/preload`

## Path parameters

- `orgId` string, required

## Response `200`

successful operation

- PreloadResponse
  - `org` Org, required
    - `id` string, required — globally unique id
    - `customerId` string — customer for billing processing
    - `name` string, required — name of organization
    - `slug` string, required — unique slug of organization
    - `type` 'PRIVATE' | 'PUBLIC' | 'EDU' | 'GOV' | 'NONPROFIT' | 'DEMO' | 'TEST' | 'PORTFOLIO' — type of organization
    - `industry` string — industry
    - `estEmployees` integer — approximate number of employees
    - `estRevenue` integer — approximate amount of revenue
    - `foundedYear` string — year of founding
    - `address` Address
      - `street1` string — street address, line 1
      - `street2` string — street address, line 2
      - `street3` string — street address, line 3
      - `city` string — city
      - `state` string — state
      - `country` string, required — country (two-digit ISO code)
      - `postal` string — postal code
      - `geo` Geopoint
        - `type` string, required — Type of point
        - `coordinates` number[], required — The longitude and latitude of the point
      - `approxGeo` Geopoint
        - `type` string, required — Type of point
        - `coordinates` number[], required — The longitude and latitude of the point
    - `phone` string — company phone number in E.164 format
    - `email` string — primary contact email
    - `url` string, uri — website URL
    - `domains` OrgDomain[] — domains used by this org
      - `domain` string, required
      - `aliases` string[], required
    - `status` 'ACTIVE' | 'INACTIVE' | 'DISABLED' — current status of organization
    - `imagePath` string — path to full-sized profile image in storage
    - `currencies` string[] — types of currencies in use, with the first currency the primary currency
    - `locales` string[] — locales supported within the org based on user selection, with the first locale the primary locale (e.g., en_US, en_GB, fr_FR, fr_CA)
    - `dataResidency` 'GLOBAL' | 'US' | 'EU' — data residency of the org - the db cluster where this org's data resides
    - `stock` string — stock symbol
    - `timezone` string — timezone in use
    - `appTimes` string[] — approximate times of day in the org timezone for daily app syncs to run (if unset, syncs will run 2am-8am US Eastern Time)
    - `fiscalStart` integer — number of months into the calendar year that the fiscal year starts (1 = February, 2 = March)
    - `headJobId` string — head of the organization
    - `unassignedManagerJobId` string — Job ID that all jobs with missing manager report to in the organization
    - `portfolioParentOrgId` string — portfolio parent org ID
    - `startDate` string, date — start date of history
    - `options` OrgOptions, required
      - `costMultiplier` number — Blanket multiplier to apply to all headcount costs, to account for blanket costs such as taxes and benefits
      - `orgEngineIncrementalBackDays` integer — Org engine incremental back day option
      - `stockPriceRollingAverage` integer
      - `bannerMessageExpireDays` integer
      - `dashboardChangeDaysAhead` integer — How many days ahead to look for changes on home screen
      - `dashboardChangeDaysBack` integer — How many days back to look for changes on home screen
      - `dashboardChangeDaysAheadMembers` integer — How many days ahead to look for changes, for members only — i.e. set this to 0 to disallow regular people seeing in the future
      - `dashboardAnniversariesDaysBack` integer
      - `dashboardAnniversariesDaysAhead` integer
      - `maxDateYears` integer — The max number of years ahead shown in date inputs, defaults to 20 years
      - `dashboardGlobal` boolean — If you want employees to see all jobs regardless of location set this to true
      - `dashboardHidePeopleMoves` boolean
      - `dashboardHideOpenJobs` boolean
      - `dashboardRestrictOpenJobs` boolean
      - `dashboardHideAnniversaries` boolean
      - `dashboardHideWeeklyCalendar` boolean — Hides the weekly calendar widget on the home screen
      - `dashboardWeeklyCalendarIncludeWeekends` boolean — Includes weekends in the weekly calendar widget
      - `placesDecimal` integer
      - `placesMoney` integer
      - `placesPercent` integer
      - `placesPayYearly` integer
      - `placesPayHourly` integer
      - `placesVariableAmount` integer
      - `placesVariablePercent` integer
      - `disableCompReviewV2Emails` boolean
      - `disableDataAggregation` boolean
      - `disableDataImportTypes` boolean
      - `disableLiveQuery` boolean
      - `disableWelcomeEmail` boolean
      - `disableOrgExportLimit` boolean — Allows powerpoint exports of over 1000 jobs
      - `disableApproverScenarioEdits` boolean — Disables ability of approvers to modify scenario data
      - `enableActions` boolean
      - `enableAdp` boolean
      - `enableAzure` boolean
      - `enableBackwardsCompatibleCompBandRead` boolean — Backwards compatibility flags for bands UAC
      - `enableColumnCacheLogging` boolean
      - `enableColumnCacheInRedis` boolean
      - `enableTimeOffCacheInRedis` boolean
      - `enableStockGrantCacheInRedis` boolean
      - `enableMapForScenarios` boolean
      - `enablePositionEligibilityFilter` boolean — Enables the CQL eligibility filter input on Group Type position rows
      - `enableCompChangeCacheInRedis` boolean
      - `enableCompReviewV2LaunchFlag` boolean
      - `enableCompImpactDashboard` boolean — Enables the Impact Dashboard tab and settings in Comp Reviews
      - `enableExperimentalScreenshotLayoutChanges` boolean
      - `enableGoogle` boolean
      - `enableMicrosoft` boolean
      - `enableOkta` boolean
      - `enableOneLogin` boolean
      - `enablePassword` boolean
      - `enableStartingSalary` boolean — Enable starting salary configuration for comp bands
      - `enableOpenJobBandPricing` boolean — Price open (unfilled) jobs from their comp band into the cost field (default off)
      - `enableDynamicFields` boolean — Enable dynamic fields configuration for job codes
      - `enableDynamicJobDialog` boolean — Enable dynamic fields configuration in the job modal
      - `enableDynamicOrgChartCardHeight` boolean — Enables dynamic card height on the org chart to optimize layout based on card content
      - `linkedJobUpdateExcludedCategories` string[] — Field categories excluded from linked field updates on filled jobs. Defaults to compensation categories if null.
      - `jobDialogFilterJobCodeFieldIds` string[] — Ordered list of up to 3 fields to filter job codes by in the job dialog, defaults to department
      - `enablePerOrgAuth` boolean
      - `enableRickrollLogin` boolean
      - `enableSaml` boolean
      - `disableSamlLoginToken` boolean
      - `enableTemplatesRichTextEditorV2` boolean
      - `enableOrgEngineRequiredFields` boolean — Configures Org Engine to respect required fields
      - `enableLongLivedCache` boolean — Enables a managed service that, on API startup, primes those orgs' caches, for both column cache, as well as the primary org cache. These keys should also last for 24+ hours and therefore be always kept warm.
      - `grantValueDefault` boolean — If enabled, then by default grants are in value, not shares
      - `orgEnginePromoteCustomIdsAsTrueIds` boolean — This field promotes the alternate id to the true id and allows HRIS to be updated
      - `preventAtsEmailNotifications` boolean — Sync History V2 Option to prevent ATS notifications
      - `scenarioCols` string — The default set of comma separated columns to show in the scenario changes screen
      - `enablePowerpointScreenshot` boolean — Enables the powerpoint screenshot export feature, on by default
      - `enableOrgChartIndicators` boolean — Shows the +XX job sibling indicators on the org chart
      - `enableHideEquityCalculator` boolean — Hides the value calculator on the equity section of the profile
      - `enableTransformFieldMapper` boolean — Enables the ability to configure the One to One field mapper with a Charthop Default Value
      - `enableFullNamesTitlesLegacy` boolean — Shows full names in powerpoint exports
      - `disableSiblingIndicators` boolean — Disables the sibling indicators on the org chart
      - `enableGrantCustomization` boolean — Enables grant aliases in the financial settings
      - `enableScenarioChangesV2` boolean — Enables new scenario changes screen
      - `enableScenarioAuditLog` boolean — Enables the audit log tab for scenarios
      - `showErrorRows` boolean
      - `hideEquityValuation` boolean — Hides the company valuation component of the calculation in the Equity profile tab (stock price will still be shown)
      - `hideProfileCompensationVesting` boolean — Hides the vesting section of the compensation profile tab
      - `hideScenarioTotalRows` boolean — Hide total rows in scenario change summary tables
      - `generateApprovalRequestsForTimeOffImport` boolean
      - `recalculateDaysForTimeOffImport` boolean
      - `positionIdField` string — Name of the job field that holds the org's Position ID for display in pickers
      - `enableCompBandPrefetchByJobCode` boolean
      - `legacyManagerFieldVisibility` boolean
      - `restrictReports` boolean
      - `restrictScenarios` boolean
      - `restrictSensitiveFilters` boolean
      - `restrictVariableView` boolean
      - `restrictVestingView` boolean
      - `restrictPersonHistory` boolean
      - `restrictSelfEdit` boolean
      - `skipSyncNotify` boolean
      - `hideCompensationTab` boolean
      - `hideEquityTab` boolean
      - `hideTasksTab` boolean
      - `hideTimeOffTab` boolean
      - `hideProfileCurrencyConversion` boolean — Hides profile currency conversion on compensation tab
      - `enableCalendarExport` boolean
      - `enableChangeExport` boolean
      - `deidentifiedMinSampleSize` integer
      - `deidentifiedFieldIds` string[]
      - `enableAi` boolean — Enable AI features like chart analysis and review calibrations
      - `enableAiSummaries` boolean — Enable AI form response summaries
      - `enableAiChatButtons` boolean — Enables the AI Ask ChartHop chatbot feature via interaction buttons
      - `enableMobileAiVoice` boolean — Enables the AI Voice feature in ChartHop mobile
      - `limitAiChatButtonsUserIds` string[] — Limits the usage of the buttons to a set of User IDs
      - `enableAiChatAsk` boolean — Enables the open-ended AI Ask ChartHop chatbot feature
      - `enableAiHomePage` boolean — Enables the AI-centric home page
      - `limitAiChatbotUserIds` string[] — Limits the usage of the AI chatbot feature to a set of User IDs
      - `enableAiScenarioPlanning` boolean — Enables the AI scenario planning feature
      - `limitAiScenarioPlanningUserIds` string[] — Limits the usage of the AI chatbot scenario planning feature to a set of User IDs
      - `aiChatDisableStreaming` boolean — Disable streaming for ai chat messages
      - `enableAiTerminationGuardrail` boolean — Disable ability for AI to recommend terminations in scenarios
      - `aiChatAgentUserId` string — Which agent is used by default in chat, instead of the ChartHop AI
      - `enableAiAgents` boolean — Enable the use of AI agents
      - `enableAiForms` boolean — Enable the use of AI form completions
      - `enableAiActions` boolean — Enable the use of AI agentic actions
      - `enableAiChatWrite` boolean — Enable AI chat write tools (create, update, delete entities)
      - `enableDataExplorer` boolean — Enables the Data Explorer feature
      - `enableFinanceImpactDashboard` boolean — Enables the finance-oriented impact dashboard
      - `limitDataExplorerUserIds` string[] — Limits the usage of the Data Explorer to a set of User IDs
      - `limitInfiniteDataSheetGroupingUserIds` string[] — Limits the usage of the new Infinite Data Sheet with grouping to a set of User IDs
      - `enableUserSettingsV2` boolean
      - `enableCalendarScreen` boolean
      - `enableCompensationBands` boolean — Enables Comp bands V2 (on by default for Premium customers)
      - `enableCompBandsSetupSpreadsheet` boolean — Enables the new comp bands setup spreadsheet UI (AG Grid). Absent/false = legacy path.
      - `easyAppInstallConfigManageEnabled` boolean — Enables easy app install (on by default for self-serve & standard orgs)
      - `enableGeoip` boolean
      - `enableGreenhouseUpgrade` boolean — Lets org admins, not just ChartHop staff, move the Greenhouse install onto the new Greenhouse API
      - `enableNewHireManagement` boolean
      - `enableOutboundPayroll` boolean
      - `enableRefreshedReportsV2` boolean
      - `enableLanguageSwitching` boolean
      - `hideNextYearTabPolicyTimeOffDisplay` boolean
      - `enableInfiniteDataSheet` boolean — Enables infinite scrolling with server-side sorting and pagination in Data Sheet
      - `infiniteDataSheetPageSize` integer — Number of rows to load per page in infinite scrolling Data Sheet (default: 100)
      - `enableDataSheetGrouping` boolean — Enables grouping functionality in Data Sheet
      - `userTablePaginated` boolean — Enables server-side paginated user table with search, filter, and sort via findUsers
      - `enableTables` boolean
      - `enableTeamOrgChart` boolean — Enables groups with positions feature
      - `enableDepartedPersonAccessDirection` boolean
      - `enableForceChangeGroupingOrgCacheReload` boolean
      - `enableGroupTypes` boolean
      - `enablePreboarding` boolean — Enables preboarding features
      - `allowedIpsPasswordLogin` string[] — IP Allow-list for Password based logins
      - `jobDetailPanelFields` string[] — Customize which fields are displayed in the job details panel in the Org Chart and their order.
      - `notifyUserIds` string[] — Sends notification to org users when new Users are assigned
      - `orgEngineCustomIdCustomFieldNameList` string[] — This is an array of fields that an org can use to indicate that one or more fields should be used as alternate id
      - `highlightMenuPreferredFields` string[]
      - `impactGroupByExcludedFieldIds` string[] — Field IDs excluded from the Impact Dashboard Group By picker
      - `profileGroupTypeTagIds` string[] — The types of groups that should be shown as tags in the profile header, defaults to department and location
      - `pptThemes` object[]
      - `editJobFieldOrder` object — Allows ordering of fields within tabs of the edit job dialog
      - `profileCompensationChartFields` string[] — Controls comp fields show in profile tab
      - `orgMinDate` string — min Date for all DateInput across Org except Groups in format YYYY-MM-DD
      - `aboutEquityMessage` string — Message to show in place of the default About equity compensation... message on profile tab
      - `atsReqField` string — If an org has an ATS integration, use their atsReqField instead of greenhouseId
      - `bannerMessage` string
      - `bannerHeader` string
      - `brandColor` string — The org's primary brand color
      - `brandSecondaryColor` string — The org's secondary brand color
      - `brandLogo` string — Show brand logo in header of home page
      - `customSsoImage` string — Customizes the SSO button image on the login screen
      - `customSsoLabel` string — Customizes the SSO button label on the login screen
      - `dashboardAnnouncementMessage` string
      - `dashboardCalendarTypes` object — Comma-separated types of calendar events to show in milestones panel
      - `dashboardChangeTypes` object — Which change types to show on home screen and calendar, uses ChangeDao.ChangeType as enum
      - `dateFormat` string
      - `defaultNoTimeOffMessage` string — Message to show if no time off policies apply to the org member
      - `greenhouseDomain` string — Allows customization of greenhouse subdomain for XHOP app
      - `country` string
      - `language` string
      - `limitTeamOrgChartUserIds` string[] — A list of users ids that are allowed to see the team org chart when enableTeamOrgChart is true
      - `orgDefaultData` string — Controls what data field will be shown in the Visualize option on the Org Chart by default (default is department)
      - `loginRedirectUrl` string
      - `newHireOpenJobMatchingFieldName` string — Custom field for fallback open job matching in org engine
      - `restrictExportOrgChart` string — Prevent non-sensitive users to export company org chart
      - `restrictExportCsv` string — Prevent non-sensitive users to export company data in CSV files
      - `teamOrgChartTypes` string[] — A filter that can show/hide what toggle options are available on the team org chart, when null everything is shown
      - `timeOffDaysAhead` integer — The number of days ahead which PTO becomes org public. Anything outside of this range will be treated as effectively manager shared
      - `userSessionDuration` string
      - `userSessionInactiveDuration` string
      - `userInviteDuration` string
      - `turnoverFormula` string — Turnover rate calculation formula - 'monthlyEnd' for end-of-month sampling
      - `welcomeEmailButtonLabel` string
      - `welcomeEmailSubject` string
      - `customWelcomeMessage` string
      - `preboardingWelcomeEmailButtonLabel` string
      - `preboardingWelcomeEmailSubject` string
      - `preboardingCustomWelcomeHeader` string
      - `preboardingCustomWelcomeMessage` string
      - `orgDefaultFilter` string
      - `sheetDefaultFilter` string
      - `preboardingFilter` string
      - `onboardingFilter` string
      - `offboardingFilter` string
      - `preboardingColNames` string
      - `onboardingColNames` string
      - `offboardingColNames` string
      - `defaultMessageChannel` MessageChannelConfig
        - `channels` string[], required
        - `alwaysEmail` boolean, required
      - `allowCharthopMobileApp` boolean
      - `timeOffPolicyTypeOrder` string[] — The order in which time off policies should be sorted by type (types not included here are sorted at the end)
      - `enableFormRejections` boolean — Enables form rejections instead of request changes, for backwards compatiblity
      - `enableCalibration` boolean — Enables the calibration feature for performance reviews
      - `useStandardizedTitle` string — Whether to suggest or enforce standardized titles
      - `enableProfilePageV2` boolean — Enables the redesigned profile page
      - `enableHomeCustomLayout` boolean — Enables using a custom layout for the home page
      - `homeCustomLayout` Layout
        - `rows` LayoutRow[], required
          - `columns` LayoutColumn[], required
            - `blocks` Block[], required
              - …
          - `format` string, required
      - `enableSkipSignatureConfirmationEmail` boolean — Temporary option to turn on skipping emails for signatures, until we have a better solution for miller-cooper
      - `disableSignatureTitles` boolean — When set to true, do not include job titles in signatures
      - `enableHiddenRolesAndPolicies` boolean
      - `enableAlphaApps` boolean — Allows this org to access applications in alpha
      - `csvImportMaxNumRows` integer — The maximum number of rows for CSV imports
      - `enableGoals` boolean — Enable goal-setting features in the org
      - `disableAiMemory` boolean — Disable AI agent persistent memory in the org
      - `enableLegacyBands` boolean — Enable bands V1 feature in the org
      - `enableApprovalDelegates` boolean — Enable Approval Delegates feature in the org
      - `useImporterV3` boolean — Whether to use the v3 job importer
      - `useImporterV3ScenarioOnly` boolean — Whether to use the v3 job importer for scenario imports only
      - `logImportErrorsUsingJavaLogger` boolean — Whether the v3 job importer should log errors to the java logger in addition to the log file
      - `enableIdentitySyncLogging` boolean — Emit verbose identity sync deactivation diagnostics to the process log
      - `scenarioCostExpr` string — Cost calculation used for scenarios by default, if not set defaults to annualized cost with multiplier
      - `defaultCostBasis` 'ANNUALIZED' | 'PERIOD_TOTAL' — Default cost measurement basis for budgets when a budget does not set its own; if not set defaults to PERIOD_TOTAL
      - `scenarioCostLabel` string — Label to show for cost in scenarios, if not set defaults to 'Annual Cost'
      - `scenarioCostDescription` string — Description to show for cost in scenarios,
      - `disableAiKnowledgeBase` boolean — Global option to disable AI knowledge base usage (typically for AWS outages)
      - `qesFilter` string — filter expression evaluated on each signer for whether to use qualified electronic signature (if it evaluates to true for any signer, QES will be used)
      - `disableQes` boolean — disable QES usage while still using external vendor, purely for testing
      - `enableBudgets` boolean — enable budgets feature
      - `enableEndOfYearTimeOffBalanceDisplay` boolean — display end-of-year balance (roughly) on the time off profile page even for accrued policies
      - `timeOffCustomBalanceDescription` string — custom time off balance description (if blank, shows default message)
      - `csvImportReassignDirectReportsOnMove` boolean — Set the reassignDirectReportsOnMove import option (reassign a moved manager's reports to the target job)
      - `csvImportEnableRelaxedMode` boolean — Set the enableRelaxedMode import option (loosen create-date / missing-manager / depart-date-delete validations)
      - `defaultBackfillJobSensitivity` 'GLOBAL' | 'ORG' | 'SENSITIVE' | 'PERSONAL' | 'MANAGER' | 'HIGH' | 'PRIVATE' — Default sensitivity for backfill jobs (defaults to HIGH if not set)
      - `jobCodeMatchMaxCatalogSize` integer — Maximum number of job codes allowed for AI job-code matching (default: 1000)
    - `internalOptions` InternalOrgOptions
      - `adpOrganizationOID` string
      - `assessmentCount` integer
      - `dashboardGettingStartedHidden` boolean
      - `dashboardNeedHelpHidden` boolean
      - `enableUniversalSso` boolean
      - `sequoiaOrgId` string
      - `tosAgreement` boolean
      - `fileUploadLimit` integer
      - `maxFileUploadSize` integer
      - `lowPriorityReports` boolean
      - `isInitialDataSynced` boolean
      - `maxReportDatapoints` integer
      - `disableImportEvents` boolean — Whether to disable event notifications on imports -- should only be used temporarily in performance-critical initial imports
      - `useAlphaSlackApp` boolean — Use the alpha Slack app (a second real Slack app sharing the global 'slack' install) instead of the default for inbound hooks and outbound messages — ChartHop-staff only, for Slack-team app-review testing
      - `extraFields` object
    - `onboarding` boolean — current onboarding status of an organization, allowing clearing of org
    - `selfServeImporting` boolean — completion status of initial import for orgs signed up via self serve
    - `headCount` integer — number of total headcount currently in the org
    - `userCount` integer — number of non-ChartHop, non-app users in the org
    - `activeUserCount` integer — number of non-ChartHop, non-app users in the org active in the past month
    - `activeAt` string — last timestamp that any user was active in the org
    - `createId` string — created by user id
    - `createBehalfId` string — created on behalf of user id
    - `createAttribution` Attribution
      - `principalUserId` string
      - `agentUserIds` string[]
      - `eventId` string
      - `aiChatId` string
      - `aiToolUseId` string
      - `channel` 'WEB' | 'MOBILE' | 'SLACK' | 'TEAMS' | 'MCP'
    - `createAt` string — created timestamp
    - `updateId` string — last updated by user id
    - `updateBehalfId` string — last updated on behalf of user id
    - `updateAttribution` Attribution
      - `principalUserId` string
      - `agentUserIds` string[]
      - `eventId` string
      - `aiChatId` string
      - `aiToolUseId` string
      - `channel` 'WEB' | 'MOBILE' | 'SLACK' | 'TEAMS' | 'MCP'
    - `updateAt` string — last updated timestamp
    - `destroyAt` string — timestamp that the org is marked for data destruction
    - `destroyId` string — user who marked the org for data destruction
    - `destroyedAt` string — date at which this org was destroyed, can not be modified
  - `orgs` Org[], required
    - `id` string, required — globally unique id
    - `customerId` string — customer for billing processing
    - `name` string, required — name of organization
    - `slug` string, required — unique slug of organization
    - `type` 'PRIVATE' | 'PUBLIC' | 'EDU' | 'GOV' | 'NONPROFIT' | 'DEMO' | 'TEST' | 'PORTFOLIO' — type of organization
    - `industry` string — industry
    - `estEmployees` integer — approximate number of employees
    - `estRevenue` integer — approximate amount of revenue
    - `foundedYear` string — year of founding
    - `address` Address
      - `street1` string — street address, line 1
      - `street2` string — street address, line 2
      - `street3` string — street address, line 3
      - `city` string — city
      - `state` string — state
      - `country` string, required — country (two-digit ISO code)
      - `postal` string — postal code
      - `geo` Geopoint
        - `type` string, required — Type of point
        - `coordinates` number[], required — The longitude and latitude of the point
      - `approxGeo` Geopoint
        - `type` string, required — Type of point
        - `coordinates` number[], required — The longitude and latitude of the point
    - `phone` string — company phone number in E.164 format
    - `email` string — primary contact email
    - `url` string, uri — website URL
    - `domains` OrgDomain[] — domains used by this org
      - `domain` string, required
      - `aliases` string[], required
    - `status` 'ACTIVE' | 'INACTIVE' | 'DISABLED' — current status of organization
    - `imagePath` string — path to full-sized profile image in storage
    - `currencies` string[] — types of currencies in use, with the first currency the primary currency
    - `locales` string[] — locales supported within the org based on user selection, with the first locale the primary locale (e.g., en_US, en_GB, fr_FR, fr_CA)
    - `dataResidency` 'GLOBAL' | 'US' | 'EU' — data residency of the org - the db cluster where this org's data resides
    - `stock` string — stock symbol
    - `timezone` string — timezone in use
    - `appTimes` string[] — approximate times of day in the org timezone for daily app syncs to run (if unset, syncs will run 2am-8am US Eastern Time)
    - `fiscalStart` integer — number of months into the calendar year that the fiscal year starts (1 = February, 2 = March)
    - `headJobId` string — head of the organization
    - `unassignedManagerJobId` string — Job ID that all jobs with missing manager report to in the organization
    - `portfolioParentOrgId` string — portfolio parent org ID
    - `startDate` string, date — start date of history
    - `options` OrgOptions, required
      - `costMultiplier` number — Blanket multiplier to apply to all headcount costs, to account for blanket costs such as taxes and benefits
      - `orgEngineIncrementalBackDays` integer — Org engine incremental back day option
      - `stockPriceRollingAverage` integer
      - `bannerMessageExpireDays` integer
      - `dashboardChangeDaysAhead` integer — How many days ahead to look for changes on home screen
      - `dashboardChangeDaysBack` integer — How many days back to look for changes on home screen
      - `dashboardChangeDaysAheadMembers` integer — How many days ahead to look for changes, for members only — i.e. set this to 0 to disallow regular people seeing in the future
      - `dashboardAnniversariesDaysBack` integer
      - `dashboardAnniversariesDaysAhead` integer
      - `maxDateYears` integer — The max number of years ahead shown in date inputs, defaults to 20 years
      - `dashboardGlobal` boolean — If you want employees to see all jobs regardless of location set this to true
      - `dashboardHidePeopleMoves` boolean
      - `dashboardHideOpenJobs` boolean
      - `dashboardRestrictOpenJobs` boolean
      - `dashboardHideAnniversaries` boolean
      - `dashboardHideWeeklyCalendar` boolean — Hides the weekly calendar widget on the home screen
      - `dashboardWeeklyCalendarIncludeWeekends` boolean — Includes weekends in the weekly calendar widget
      - `placesDecimal` integer
      - `placesMoney` integer
      - `placesPercent` integer
      - `placesPayYearly` integer
      - `placesPayHourly` integer
      - `placesVariableAmount` integer
      - `placesVariablePercent` integer
      - `disableCompReviewV2Emails` boolean
      - `disableDataAggregation` boolean
      - `disableDataImportTypes` boolean
      - `disableLiveQuery` boolean
      - `disableWelcomeEmail` boolean
      - `disableOrgExportLimit` boolean — Allows powerpoint exports of over 1000 jobs
      - `disableApproverScenarioEdits` boolean — Disables ability of approvers to modify scenario data
      - `enableActions` boolean
      - `enableAdp` boolean
      - `enableAzure` boolean
      - `enableBackwardsCompatibleCompBandRead` boolean — Backwards compatibility flags for bands UAC
      - `enableColumnCacheLogging` boolean
      - `enableColumnCacheInRedis` boolean
      - `enableTimeOffCacheInRedis` boolean
      - `enableStockGrantCacheInRedis` boolean
      - `enableMapForScenarios` boolean
      - `enablePositionEligibilityFilter` boolean — Enables the CQL eligibility filter input on Group Type position rows
      - `enableCompChangeCacheInRedis` boolean
      - `enableCompReviewV2LaunchFlag` boolean
      - `enableCompImpactDashboard` boolean — Enables the Impact Dashboard tab and settings in Comp Reviews
      - `enableExperimentalScreenshotLayoutChanges` boolean
      - `enableGoogle` boolean
      - `enableMicrosoft` boolean
      - `enableOkta` boolean
      - `enableOneLogin` boolean
      - `enablePassword` boolean
      - `enableStartingSalary` boolean — Enable starting salary configuration for comp bands
      - `enableOpenJobBandPricing` boolean — Price open (unfilled) jobs from their comp band into the cost field (default off)
      - `enableDynamicFields` boolean — Enable dynamic fields configuration for job codes
      - `enableDynamicJobDialog` boolean — Enable dynamic fields configuration in the job modal
      - `enableDynamicOrgChartCardHeight` boolean — Enables dynamic card height on the org chart to optimize layout based on card content
      - `linkedJobUpdateExcludedCategories` string[] — Field categories excluded from linked field updates on filled jobs. Defaults to compensation categories if null.
      - `jobDialogFilterJobCodeFieldIds` string[] — Ordered list of up to 3 fields to filter job codes by in the job dialog, defaults to department
      - `enablePerOrgAuth` boolean
      - `enableRickrollLogin` boolean
      - `enableSaml` boolean
      - `disableSamlLoginToken` boolean
      - `enableTemplatesRichTextEditorV2` boolean
      - `enableOrgEngineRequiredFields` boolean — Configures Org Engine to respect required fields
      - `enableLongLivedCache` boolean — Enables a managed service that, on API startup, primes those orgs' caches, for both column cache, as well as the primary org cache. These keys should also last for 24+ hours and therefore be always kept warm.
      - `grantValueDefault` boolean — If enabled, then by default grants are in value, not shares
      - `orgEnginePromoteCustomIdsAsTrueIds` boolean — This field promotes the alternate id to the true id and allows HRIS to be updated
      - `preventAtsEmailNotifications` boolean — Sync History V2 Option to prevent ATS notifications
      - `scenarioCols` string — The default set of comma separated columns to show in the scenario changes screen
      - `enablePowerpointScreenshot` boolean — Enables the powerpoint screenshot export feature, on by default
      - `enableOrgChartIndicators` boolean — Shows the +XX job sibling indicators on the org chart
      - `enableHideEquityCalculator` boolean — Hides the value calculator on the equity section of the profile
      - `enableTransformFieldMapper` boolean — Enables the ability to configure the One to One field mapper with a Charthop Default Value
      - `enableFullNamesTitlesLegacy` boolean — Shows full names in powerpoint exports
      - `disableSiblingIndicators` boolean — Disables the sibling indicators on the org chart
      - `enableGrantCustomization` boolean — Enables grant aliases in the financial settings
      - `enableScenarioChangesV2` boolean — Enables new scenario changes screen
      - `enableScenarioAuditLog` boolean — Enables the audit log tab for scenarios
      - `showErrorRows` boolean
      - `hideEquityValuation` boolean — Hides the company valuation component of the calculation in the Equity profile tab (stock price will still be shown)
      - `hideProfileCompensationVesting` boolean — Hides the vesting section of the compensation profile tab
      - `hideScenarioTotalRows` boolean — Hide total rows in scenario change summary tables
      - `generateApprovalRequestsForTimeOffImport` boolean
      - `recalculateDaysForTimeOffImport` boolean
      - `positionIdField` string — Name of the job field that holds the org's Position ID for display in pickers
      - `enableCompBandPrefetchByJobCode` boolean
      - `legacyManagerFieldVisibility` boolean
      - `restrictReports` boolean
      - `restrictScenarios` boolean
      - `restrictSensitiveFilters` boolean
      - `restrictVariableView` boolean
      - `restrictVestingView` boolean
      - `restrictPersonHistory` boolean
      - `restrictSelfEdit` boolean
      - `skipSyncNotify` boolean
      - `hideCompensationTab` boolean
      - `hideEquityTab` boolean
      - `hideTasksTab` boolean
      - `hideTimeOffTab` boolean
      - `hideProfileCurrencyConversion` boolean — Hides profile currency conversion on compensation tab
      - `enableCalendarExport` boolean
      - `enableChangeExport` boolean
      - `deidentifiedMinSampleSize` integer
      - `deidentifiedFieldIds` string[]
      - `enableAi` boolean — Enable AI features like chart analysis and review calibrations
      - `enableAiSummaries` boolean — Enable AI form response summaries
      - `enableAiChatButtons` boolean — Enables the AI Ask ChartHop chatbot feature via interaction buttons
      - `enableMobileAiVoice` boolean — Enables the AI Voice feature in ChartHop mobile
      - `limitAiChatButtonsUserIds` string[] — Limits the usage of the buttons to a set of User IDs
      - `enableAiChatAsk` boolean — Enables the open-ended AI Ask ChartHop chatbot feature
      - `enableAiHomePage` boolean — Enables the AI-centric home page
      - `limitAiChatbotUserIds` string[] — Limits the usage of the AI chatbot feature to a set of User IDs
      - `enableAiScenarioPlanning` boolean — Enables the AI scenario planning feature
      - `limitAiScenarioPlanningUserIds` string[] — Limits the usage of the AI chatbot scenario planning feature to a set of User IDs
      - `aiChatDisableStreaming` boolean — Disable streaming for ai chat messages
      - `enableAiTerminationGuardrail` boolean — Disable ability for AI to recommend terminations in scenarios
      - `aiChatAgentUserId` string — Which agent is used by default in chat, instead of the ChartHop AI
      - `enableAiAgents` boolean — Enable the use of AI agents
      - `enableAiForms` boolean — Enable the use of AI form completions
      - `enableAiActions` boolean — Enable the use of AI agentic actions
      - `enableAiChatWrite` boolean — Enable AI chat write tools (create, update, delete entities)
      - `enableDataExplorer` boolean — Enables the Data Explorer feature
      - `enableFinanceImpactDashboard` boolean — Enables the finance-oriented impact dashboard
      - `limitDataExplorerUserIds` string[] — Limits the usage of the Data Explorer to a set of User IDs
      - `limitInfiniteDataSheetGroupingUserIds` string[] — Limits the usage of the new Infinite Data Sheet with grouping to a set of User IDs
      - `enableUserSettingsV2` boolean
      - `enableCalendarScreen` boolean
      - `enableCompensationBands` boolean — Enables Comp bands V2 (on by default for Premium customers)
      - `enableCompBandsSetupSpreadsheet` boolean — Enables the new comp bands setup spreadsheet UI (AG Grid). Absent/false = legacy path.
      - `easyAppInstallConfigManageEnabled` boolean — Enables easy app install (on by default for self-serve & standard orgs)
      - `enableGeoip` boolean
      - `enableGreenhouseUpgrade` boolean — Lets org admins, not just ChartHop staff, move the Greenhouse install onto the new Greenhouse API
      - `enableNewHireManagement` boolean
      - `enableOutboundPayroll` boolean
      - `enableRefreshedReportsV2` boolean
      - `enableLanguageSwitching` boolean
      - `hideNextYearTabPolicyTimeOffDisplay` boolean
      - `enableInfiniteDataSheet` boolean — Enables infinite scrolling with server-side sorting and pagination in Data Sheet
      - `infiniteDataSheetPageSize` integer — Number of rows to load per page in infinite scrolling Data Sheet (default: 100)
      - `enableDataSheetGrouping` boolean — Enables grouping functionality in Data Sheet
      - `userTablePaginated` boolean — Enables server-side paginated user table with search, filter, and sort via findUsers
      - `enableTables` boolean
      - `enableTeamOrgChart` boolean — Enables groups with positions feature
      - `enableDepartedPersonAccessDirection` boolean
      - `enableForceChangeGroupingOrgCacheReload` boolean
      - `enableGroupTypes` boolean
      - `enablePreboarding` boolean — Enables preboarding features
      - `allowedIpsPasswordLogin` string[] — IP Allow-list for Password based logins
      - `jobDetailPanelFields` string[] — Customize which fields are displayed in the job details panel in the Org Chart and their order.
      - `notifyUserIds` string[] — Sends notification to org users when new Users are assigned
      - `orgEngineCustomIdCustomFieldNameList` string[] — This is an array of fields that an org can use to indicate that one or more fields should be used as alternate id
      - `highlightMenuPreferredFields` string[]
      - `impactGroupByExcludedFieldIds` string[] — Field IDs excluded from the Impact Dashboard Group By picker
      - `profileGroupTypeTagIds` string[] — The types of groups that should be shown as tags in the profile header, defaults to department and location
      - `pptThemes` object[]
      - `editJobFieldOrder` object — Allows ordering of fields within tabs of the edit job dialog
      - `profileCompensationChartFields` string[] — Controls comp fields show in profile tab
      - `orgMinDate` string — min Date for all DateInput across Org except Groups in format YYYY-MM-DD
      - `aboutEquityMessage` string — Message to show in place of the default About equity compensation... message on profile tab
      - `atsReqField` string — If an org has an ATS integration, use their atsReqField instead of greenhouseId
      - `bannerMessage` string
      - `bannerHeader` string
      - `brandColor` string — The org's primary brand color
      - `brandSecondaryColor` string — The org's secondary brand color
      - `brandLogo` string — Show brand logo in header of home page
      - `customSsoImage` string — Customizes the SSO button image on the login screen
      - `customSsoLabel` string — Customizes the SSO button label on the login screen
      - `dashboardAnnouncementMessage` string
      - `dashboardCalendarTypes` object — Comma-separated types of calendar events to show in milestones panel
      - `dashboardChangeTypes` object — Which change types to show on home screen and calendar, uses ChangeDao.ChangeType as enum
      - `dateFormat` string
      - `defaultNoTimeOffMessage` string — Message to show if no time off policies apply to the org member
      - `greenhouseDomain` string — Allows customization of greenhouse subdomain for XHOP app
      - `country` string
      - `language` string
      - `limitTeamOrgChartUserIds` string[] — A list of users ids that are allowed to see the team org chart when enableTeamOrgChart is true
      - `orgDefaultData` string — Controls what data field will be shown in the Visualize option on the Org Chart by default (default is department)
      - `loginRedirectUrl` string
      - `newHireOpenJobMatchingFieldName` string — Custom field for fallback open job matching in org engine
      - `restrictExportOrgChart` string — Prevent non-sensitive users to export company org chart
      - `restrictExportCsv` string — Prevent non-sensitive users to export company data in CSV files
      - `teamOrgChartTypes` string[] — A filter that can show/hide what toggle options are available on the team org chart, when null everything is shown
      - `timeOffDaysAhead` integer — The number of days ahead which PTO becomes org public. Anything outside of this range will be treated as effectively manager shared
      - `userSessionDuration` string
      - `userSessionInactiveDuration` string
      - `userInviteDuration` string
      - `turnoverFormula` string — Turnover rate calculation formula - 'monthlyEnd' for end-of-month sampling
      - `welcomeEmailButtonLabel` string
      - `welcomeEmailSubject` string
      - `customWelcomeMessage` string
      - `preboardingWelcomeEmailButtonLabel` string
      - `preboardingWelcomeEmailSubject` string
      - `preboardingCustomWelcomeHeader` string
      - `preboardingCustomWelcomeMessage` string
      - `orgDefaultFilter` string
      - `sheetDefaultFilter` string
      - `preboardingFilter` string
      - `onboardingFilter` string
      - `offboardingFilter` string
      - `preboardingColNames` string
      - `onboardingColNames` string
      - `offboardingColNames` string
      - `defaultMessageChannel` MessageChannelConfig
        - `channels` string[], required
        - `alwaysEmail` boolean, required
      - `allowCharthopMobileApp` boolean
      - `timeOffPolicyTypeOrder` string[] — The order in which time off policies should be sorted by type (types not included here are sorted at the end)
      - `enableFormRejections` boolean — Enables form rejections instead of request changes, for backwards compatiblity
      - `enableCalibration` boolean — Enables the calibration feature for performance reviews
      - `useStandardizedTitle` string — Whether to suggest or enforce standardized titles
      - `enableProfilePageV2` boolean — Enables the redesigned profile page
      - `enableHomeCustomLayout` boolean — Enables using a custom layout for the home page
      - `homeCustomLayout` Layout
        - `rows` LayoutRow[], required
          - `columns` LayoutColumn[], required
            - `blocks` Block[], required
              - …
          - `format` string, required
      - `enableSkipSignatureConfirmationEmail` boolean — Temporary option to turn on skipping emails for signatures, until we have a better solution for miller-cooper
      - `disableSignatureTitles` boolean — When set to true, do not include job titles in signatures
      - `enableHiddenRolesAndPolicies` boolean
      - `enableAlphaApps` boolean — Allows this org to access applications in alpha
      - `csvImportMaxNumRows` integer — The maximum number of rows for CSV imports
      - `enableGoals` boolean — Enable goal-setting features in the org
      - `disableAiMemory` boolean — Disable AI agent persistent memory in the org
      - `enableLegacyBands` boolean — Enable bands V1 feature in the org
      - `enableApprovalDelegates` boolean — Enable Approval Delegates feature in the org
      - `useImporterV3` boolean — Whether to use the v3 job importer
      - `useImporterV3ScenarioOnly` boolean — Whether to use the v3 job importer for scenario imports only
      - `logImportErrorsUsingJavaLogger` boolean — Whether the v3 job importer should log errors to the java logger in addition to the log file
      - `enableIdentitySyncLogging` boolean — Emit verbose identity sync deactivation diagnostics to the process log
      - `scenarioCostExpr` string — Cost calculation used for scenarios by default, if not set defaults to annualized cost with multiplier
      - `defaultCostBasis` 'ANNUALIZED' | 'PERIOD_TOTAL' — Default cost measurement basis for budgets when a budget does not set its own; if not set defaults to PERIOD_TOTAL
      - `scenarioCostLabel` string — Label to show for cost in scenarios, if not set defaults to 'Annual Cost'
      - `scenarioCostDescription` string — Description to show for cost in scenarios,
      - `disableAiKnowledgeBase` boolean — Global option to disable AI knowledge base usage (typically for AWS outages)
      - `qesFilter` string — filter expression evaluated on each signer for whether to use qualified electronic signature (if it evaluates to true for any signer, QES will be used)
      - `disableQes` boolean — disable QES usage while still using external vendor, purely for testing
      - `enableBudgets` boolean — enable budgets feature
      - `enableEndOfYearTimeOffBalanceDisplay` boolean — display end-of-year balance (roughly) on the time off profile page even for accrued policies
      - `timeOffCustomBalanceDescription` string — custom time off balance description (if blank, shows default message)
      - `csvImportReassignDirectReportsOnMove` boolean — Set the reassignDirectReportsOnMove import option (reassign a moved manager's reports to the target job)
      - `csvImportEnableRelaxedMode` boolean — Set the enableRelaxedMode import option (loosen create-date / missing-manager / depart-date-delete validations)
      - `defaultBackfillJobSensitivity` 'GLOBAL' | 'ORG' | 'SENSITIVE' | 'PERSONAL' | 'MANAGER' | 'HIGH' | 'PRIVATE' — Default sensitivity for backfill jobs (defaults to HIGH if not set)
      - `jobCodeMatchMaxCatalogSize` integer — Maximum number of job codes allowed for AI job-code matching (default: 1000)
    - `internalOptions` InternalOrgOptions
      - `adpOrganizationOID` string
      - `assessmentCount` integer
      - `dashboardGettingStartedHidden` boolean
      - `dashboardNeedHelpHidden` boolean
      - `enableUniversalSso` boolean
      - `sequoiaOrgId` string
      - `tosAgreement` boolean
      - `fileUploadLimit` integer
      - `maxFileUploadSize` integer
      - `lowPriorityReports` boolean
      - `isInitialDataSynced` boolean
      - `maxReportDatapoints` integer
      - `disableImportEvents` boolean — Whether to disable event notifications on imports -- should only be used temporarily in performance-critical initial imports
      - `useAlphaSlackApp` boolean — Use the alpha Slack app (a second real Slack app sharing the global 'slack' install) instead of the default for inbound hooks and outbound messages — ChartHop-staff only, for Slack-team app-review testing
      - `extraFields` object
    - `onboarding` boolean — current onboarding status of an organization, allowing clearing of org
    - `selfServeImporting` boolean — completion status of initial import for orgs signed up via self serve
    - `headCount` integer — number of total headcount currently in the org
    - `userCount` integer — number of non-ChartHop, non-app users in the org
    - `activeUserCount` integer — number of non-ChartHop, non-app users in the org active in the past month
    - `activeAt` string — last timestamp that any user was active in the org
    - `createId` string — created by user id
    - `createBehalfId` string — created on behalf of user id
    - `createAttribution` Attribution
      - `principalUserId` string
      - `agentUserIds` string[]
      - `eventId` string
      - `aiChatId` string
      - `aiToolUseId` string
      - `channel` 'WEB' | 'MOBILE' | 'SLACK' | 'TEAMS' | 'MCP'
    - `createAt` string — created timestamp
    - `updateId` string — last updated by user id
    - `updateBehalfId` string — last updated on behalf of user id
    - `updateAttribution` Attribution
      - `principalUserId` string
      - `agentUserIds` string[]
      - `eventId` string
      - `aiChatId` string
      - `aiToolUseId` string
      - `channel` 'WEB' | 'MOBILE' | 'SLACK' | 'TEAMS' | 'MCP'
    - `updateAt` string — last updated timestamp
    - `destroyAt` string — timestamp that the org is marked for data destruction
    - `destroyId` string — user who marked the org for data destruction
    - `destroyedAt` string — date at which this org was destroyed, can not be modified
  - `user` User, required
    - `id` string, required — globally unique id
    - `appId` string — if the user is an app user, the id of the app
    - `name` Name, required
      - `first` string — first name
      - `middle` string — middle name
      - `last` string, required — last name
      - `pref` string — preferred first name
      - `prefLast` string — preferred last name
    - `email` string — email address of user
    - `password` string — password of user (encrypted)
    - `orgs` OrgAccess[] — list of member orgs with permission levels
      - `orgId` string, required — org id
      - `personId` string — person id, if this user directly corresponds with a person
      - `access` 'NONE' | 'PREBOARDING' | 'VIEW' | 'LIMITED' | 'MEMBER_LIMITED_COMP' | 'MEMBER' | 'CUSTOM' | 'TECH_OWNER' | 'TIMEOFF' | 'CONTACT' | 'COMP_CASH' | 'COMP_EQUITY' | 'COMP_ALL' | 'RECRUIT_SENSITIVE' | 'RECRUIT_PRIMARY' | 'SENSITIVE_LIMITED_COMP' | 'SENSITIVE' | 'PRIMARY' | 'PEOPLE_OPS_ADMIN' | 'PEOPLE_OPS_ADMIN_NO_COMP_DATA' | 'PEOPLE_OPS_ADMIN_NO_SENSITIVE_DATA' | 'OWNER', required — legacy access permission level
      - `groupIds` string[] — group ids that the above access applies to
      - `expr` string — expression that the above access applies to
      - `expireAt` string — timestamp that this org access will expire
      - `roleId` string — the role id that defines the users access
      - `policyIds` string[] — additional policy ids, applied additively on top of the policies defined by the role
      - `status` 'INACTIVE' | 'PREBOARDING' | 'ACTIVATION' | 'ACTIVE' | 'OFFBOARDED' — Onboarding status of the user in this org
      - `homeEmail` string — Personal email address of user, while they are preboarding
      - `workEmail` string — Work email address of user, once they have started
      - `workRoleId` string — Active role ID that defines the user's access once they have started
    - `imagePath` string — path to full-sized profile image in storage
    - `status` 'SUPERUSER' | 'NORMAL' | 'INACTIVE' | 'UNINSTALLED' — current status of user
    - `type` 'USER' | 'APP' — type of user
    - `options` object — for apps, options (specific options are specific to the particular app); for users, user-set preferences
    - `internalOptions` object — internal (ChartHop controlled) options
    - `bundleInstall` BundleInstall
      - `entities` BundleInstallEntity[], required
        - `entityType` 'ACTION' | 'CALENDAR' | 'CALENDAR_ENTRY' | 'CATEGORY' | 'FIELD' | 'FORM' | 'GROUP' | 'PROFILE_TAB' | 'QUESTION' | 'REPORT' | 'REPORT_CHART' | 'TASK_CONFIG' | 'TEMPLATE' | 'TIME_OFF_POLICY' | 'CONTENT', required
        - `entityId` string, required
        - `originalId` string, required
    - `secrets` object — write-only secrets; the content of these secrets are not retrievable via the external-facing API
    - `activeAt` string — last activity timestamp
    - `loginAt` string — last login timestamp
    - `appRunCheckAt` string — for apps, last time the app was checked for a scheduled sync
    - `loginCount` integer — number of lifetime successful logins
    - `sessionCount` integer — number of lifetime sessions
    - `loginFailCount` integer — number of consecutive failed logins
    - `title` string — job title, if available
    - `remoteIp` string — last IP address used
    - `createId` string — created by user id
    - `createBehalfId` string — created on behalf of user id
    - `createAttribution` Attribution
      - `principalUserId` string
      - `agentUserIds` string[]
      - `eventId` string
      - `aiChatId` string
      - `aiToolUseId` string
      - `channel` 'WEB' | 'MOBILE' | 'SLACK' | 'TEAMS' | 'MCP'
    - `createAt` string — created timestamp
    - `updateId` string — last updated by user id
    - `updateBehalfId` string — last updated on behalf of user id
    - `updateAttribution` Attribution
      - `principalUserId` string
      - `agentUserIds` string[]
      - `eventId` string
      - `aiChatId` string
      - `aiToolUseId` string
      - `channel` 'WEB' | 'MOBILE' | 'SLACK' | 'TEAMS' | 'MCP'
    - `updateAt` string — last updated timestamp
    - `verifyAt` string — email verified timestamp, if the email has been verified
    - `mfas` WebRegisteredCredential[] — list of registered 2FA registered credentials
      - `credentialId` string, required — Credential id
      - `publicKeyBase64` string, required — The public key we're saving
      - `userHandleBase64` string, required — The user handle - a random 64 bits of data
      - `signatureCount` integer, required — This is used to protect against duplicated key attacks
      - `createdAt` string, required — When was this created
    - `emailSettings` UserEmailSetting[] — Email settings for the user
      - `category` 'ADMINISTRATIVE' | 'BILLING' | 'DATA_IMPORT_AND_SYNC_STATUS' | 'TRIAL_REMINDERS' | 'APPROVAL_NOTIFICATIONS', required — Category of emails
      - `subscribed` boolean, required — Is user subscribed to the category of emails
    - `sensitive` 'GLOBAL' | 'ORG' | 'SENSITIVE' | 'PERSONAL' | 'MANAGER' | 'HIGH' | 'PRIVATE' — sensitivity level of the user's configuration; only applicable to APP users
    - `shareAccess` ShareAccess[] — users and groups who have access to configure this user; only applicable to APP users
      - `access` 'NONE' | 'LIMITED_READ' | 'LIMITED_WRITE' | 'STANDARD_READ' | 'STANDARD_WRITE' | 'COMPENSATION_READ' | 'FULL_READ' | 'COMP_PLANNING_PARTICIPANT' | 'COMPENSATION_WRITE' | 'WRITE' | 'COMPENSATION_OWNER' | 'OWNER', required — access permission level
      - `userId` string — user id
      - `groupId` string — group id
      - `fields` string — fields
    - `agentConfig` AiAgentConfig
      - `personality` string
      - `instructions` string
      - `guardrails` string
      - `enableMemory` boolean
      - `enableMcpServer` boolean — whether this agent exposes an MCP server endpoint for per-user OAuth access
      - `enableMcpWrite` boolean — whether this agent's MCP server may invoke write/mutating tools (e.g. a non-read-only AskAgent delegation). Read-only by default: when unset or false, a tool that mutates on the call is rejected at the MCP edge regardless of the agent's role/policy. This is defense in depth layered on top of the role, never a grant beyond it.
      - `isExternal` boolean — whether this agent is an external (non-ChartHop) client, e.g. Claude Code or ChatGPT. External agents have no ChartHop-side prompt/behavior config: only permissions, MCP, and activity are configurable.
      - `approvedPolicyRules` PolicyRule[]
        - `allow` string[] — allow rules
        - `deny` string[] — deny rules
        - `categories` string[] — categories the rule is limited to
        - `fields` string[] — fields the rule is limited to
        - `departmentIds` string[] — departments the rule is limited to
        - `filter` string — custom filter the rule is limited to
        - `directions` string[] — directions that the rule applies to -- either self or under
        - `types` string[] — types that the rule applies to
        - `targets` PolicyRuleTarget[] — targets allowed for messaging (email addresses, chat channels, user ids)
          - `userId` string
          - `personId` string
          - `channel` string
          - `email` string
        - `visibleSensitive` string[] — if specified, controls visibility of sensitive entities -- for example, ['Manager Shared', 'Manager Only']
        - `fieldsSensitive` string[] — if specified, controls applicability of fields by sensitivity -- for example, ['Manager Shared', 'Manager Only']
      - `approvalGuidelines` string
      - `managerJobId` string
      - `messagingConfig` MessagingConfig
        - `slackAppId` string
        - `slackClientId` string
        - `slackBotUserId` string
      - `contentIds` string[] — pinned content document IDs; when merging user and app configs, both lists are unioned (not replaced); validate with validateContentIds before persisting
      - `modelTier` 'HIGH' | 'MEDIUM' | 'LOW' — requested model tier for the agent; defaults to MEDIUM when not set
      - `targetedInstructions` TargetedInstruction[] — audience-scoped instruction snippets injected into the chat prompt when the filter matches the current viewer's person record; size and filter syntax are checked by AgentValidationService before persisting
        - `filter` string, required — filter expression matched against the current viewer's person record
        - `instructions` string, required — instructions injected into the chat prompt when filter matches
  - `role` Role
    - `id` string, required — globally unique id
    - `orgId` string — parent organization id (empty if global)
    - `label` string, required — human-readable full name of role
    - `description` string — description of role
    - `policyIds` string[] — the policies that define the role
    - `policies` Policy[] — the policies attached to the role
      - `id` string, required — globally unique id
      - `orgId` string — parent organization id (empty if global)
      - `label` string, required — human-readable full name of policy
      - `description` string — description of policy
      - `rules` PolicyRule[] — the rules that define the policy
        - `allow` string[] — allow rules
        - `deny` string[] — deny rules
        - `categories` string[] — categories the rule is limited to
        - `fields` string[] — fields the rule is limited to
        - `departmentIds` string[] — departments the rule is limited to
        - `filter` string — custom filter the rule is limited to
        - `directions` string[] — directions that the rule applies to -- either self or under
        - `types` string[] — types that the rule applies to
        - `targets` PolicyRuleTarget[] — targets allowed for messaging (email addresses, chat channels, user ids)
          - `userId` string
          - `personId` string
          - `channel` string
          - `email` string
        - `visibleSensitive` string[] — if specified, controls visibility of sensitive entities -- for example, ['Manager Shared', 'Manager Only']
        - `fieldsSensitive` string[] — if specified, controls applicability of fields by sensitivity -- for example, ['Manager Shared', 'Manager Only']
      - `roles` Role[] — the roles the policy is attached to
      - `users` User[] — the users the policy is attached to
        - `id` string, required — globally unique id
        - `appId` string — if the user is an app user, the id of the app
        - `name` Name, required
          - `first` string — first name
          - `middle` string — middle name
          - `last` string, required — last name
          - `pref` string — preferred first name
          - `prefLast` string — preferred last name
        - `email` string — email address of user
        - `password` string — password of user (encrypted)
        - `orgs` OrgAccess[] — list of member orgs with permission levels
          - `orgId` string, required — org id
          - `personId` string — person id, if this user directly corresponds with a person
          - `access` 'NONE' | 'PREBOARDING' | 'VIEW' | 'LIMITED' | 'MEMBER_LIMITED_COMP' | 'MEMBER' | 'CUSTOM' | 'TECH_OWNER' | 'TIMEOFF' | 'CONTACT' | 'COMP_CASH' | 'COMP_EQUITY' | 'COMP_ALL' | 'RECRUIT_SENSITIVE' | 'RECRUIT_PRIMARY' | 'SENSITIVE_LIMITED_COMP' | 'SENSITIVE' | 'PRIMARY' | 'PEOPLE_OPS_ADMIN' | 'PEOPLE_OPS_ADMIN_NO_COMP_DATA' | 'PEOPLE_OPS_ADMIN_NO_SENSITIVE_DATA' | 'OWNER', required — legacy access permission level
          - `groupIds` string[] — group ids that the above access applies to
          - `expr` string — expression that the above access applies to
          - `expireAt` string — timestamp that this org access will expire
          - `roleId` string — the role id that defines the users access
          - `policyIds` string[] — additional policy ids, applied additively on top of the policies defined by the role
          - `status` 'INACTIVE' | 'PREBOARDING' | 'ACTIVATION' | 'ACTIVE' | 'OFFBOARDED' — Onboarding status of the user in this org
          - `homeEmail` string — Personal email address of user, while they are preboarding
          - `workEmail` string — Work email address of user, once they have started
          - `workRoleId` string — Active role ID that defines the user's access once they have started
        - `imagePath` string — path to full-sized profile image in storage
        - `status` 'SUPERUSER' | 'NORMAL' | 'INACTIVE' | 'UNINSTALLED' — current status of user
        - `type` 'USER' | 'APP' — type of user
        - `options` object — for apps, options (specific options are specific to the particular app); for users, user-set preferences
        - `internalOptions` object — internal (ChartHop controlled) options
        - `bundleInstall` BundleInstall
          - `entities` BundleInstallEntity[], required
            - `entityType` 'ACTION' | 'CALENDAR' | 'CALENDAR_ENTRY' | 'CATEGORY' | 'FIELD' | 'FORM' | 'GROUP' | 'PROFILE_TAB' | 'QUESTION' | 'REPORT' | 'REPORT_CHART' | 'TASK_CONFIG' | 'TEMPLATE' | 'TIME_OFF_POLICY' | 'CONTENT', required
            - `entityId` string, required
            - `originalId` string, required
        - `secrets` object — write-only secrets; the content of these secrets are not retrievable via the external-facing API
        - `activeAt` string — last activity timestamp
        - `loginAt` string — last login timestamp
        - `appRunCheckAt` string — for apps, last time the app was checked for a scheduled sync
        - `loginCount` integer — number of lifetime successful logins
        - `sessionCount` integer — number of lifetime sessions
        - `loginFailCount` integer — number of consecutive failed logins
        - `title` string — job title, if available
        - `remoteIp` string — last IP address used
        - `createId` string — created by user id
        - `createBehalfId` string — created on behalf of user id
        - `createAttribution` Attribution
          - `principalUserId` string
          - `agentUserIds` string[]
          - `eventId` string
          - `aiChatId` string
          - `aiToolUseId` string
          - `channel` 'WEB' | 'MOBILE' | 'SLACK' | 'TEAMS' | 'MCP'
        - `createAt` string — created timestamp
        - `updateId` string — last updated by user id
        - `updateBehalfId` string — last updated on behalf of user id
        - `updateAttribution` Attribution
          - `principalUserId` string
          - `agentUserIds` string[]
          - `eventId` string
          - `aiChatId` string
          - `aiToolUseId` string
          - `channel` 'WEB' | 'MOBILE' | 'SLACK' | 'TEAMS' | 'MCP'
        - `updateAt` string — last updated timestamp
        - `verifyAt` string — email verified timestamp, if the email has been verified
        - `mfas` WebRegisteredCredential[] — list of registered 2FA registered credentials
          - `credentialId` string, required — Credential id
          - `publicKeyBase64` string, required — The public key we're saving
          - `userHandleBase64` string, required — The user handle - a random 64 bits of data
          - `signatureCount` integer, required — This is used to protect against duplicated key attacks
          - `createdAt` string, required — When was this created
        - `emailSettings` UserEmailSetting[] — Email settings for the user
          - `category` 'ADMINISTRATIVE' | 'BILLING' | 'DATA_IMPORT_AND_SYNC_STATUS' | 'TRIAL_REMINDERS' | 'APPROVAL_NOTIFICATIONS', required — Category of emails
          - `subscribed` boolean, required — Is user subscribed to the category of emails
        - `sensitive` 'GLOBAL' | 'ORG' | 'SENSITIVE' | 'PERSONAL' | 'MANAGER' | 'HIGH' | 'PRIVATE' — sensitivity level of the user's configuration; only applicable to APP users
        - `shareAccess` ShareAccess[] — users and groups who have access to configure this user; only applicable to APP users
          - `access` 'NONE' | 'LIMITED_READ' | 'LIMITED_WRITE' | 'STANDARD_READ' | 'STANDARD_WRITE' | 'COMPENSATION_READ' | 'FULL_READ' | 'COMP_PLANNING_PARTICIPANT' | 'COMPENSATION_WRITE' | 'WRITE' | 'COMPENSATION_OWNER' | 'OWNER', required — access permission level
          - `userId` string — user id
          - `groupId` string — group id
          - `fields` string — fields
        - `agentConfig` AiAgentConfig
          - `personality` string
          - `instructions` string
          - `guardrails` string
          - `enableMemory` boolean
          - `enableMcpServer` boolean — whether this agent exposes an MCP server endpoint for per-user OAuth access
          - `enableMcpWrite` boolean — whether this agent's MCP server may invoke write/mutating tools (e.g. a non-read-only AskAgent delegation). Read-only by default: when unset or false, a tool that mutates on the call is rejected at the MCP edge regardless of the agent's role/policy. This is defense in depth layered on top of the role, never a grant beyond it.
          - `isExternal` boolean — whether this agent is an external (non-ChartHop) client, e.g. Claude Code or ChatGPT. External agents have no ChartHop-side prompt/behavior config: only permissions, MCP, and activity are configurable.
          - `approvedPolicyRules` PolicyRule[]
            - `allow` string[] — allow rules
            - `deny` string[] — deny rules
            - `categories` string[] — categories the rule is limited to
            - `fields` string[] — fields the rule is limited to
            - `departmentIds` string[] — departments the rule is limited to
            - `filter` string — custom filter the rule is limited to
            - `directions` string[] — directions that the rule applies to -- either self or under
            - `types` string[] — types that the rule applies to
            - `targets` PolicyRuleTarget[] — targets allowed for messaging (email addresses, chat channels, user ids)
              - …
            - `visibleSensitive` string[] — if specified, controls visibility of sensitive entities -- for example, ['Manager Shared', 'Manager Only']
            - `fieldsSensitive` string[] — if specified, controls applicability of fields by sensitivity -- for example, ['Manager Shared', 'Manager Only']
          - `approvalGuidelines` string
          - `managerJobId` string
          - `messagingConfig` MessagingConfig
            - `slackAppId` string
            - `slackClientId` string
            - `slackBotUserId` string
          - `contentIds` string[] — pinned content document IDs; when merging user and app configs, both lists are unioned (not replaced); validate with validateContentIds before persisting
          - `modelTier` 'HIGH' | 'MEDIUM' | 'LOW' — requested model tier for the agent; defaults to MEDIUM when not set
          - `targetedInstructions` TargetedInstruction[] — audience-scoped instruction snippets injected into the chat prompt when the filter matches the current viewer's person record; size and filter syntax are checked by AgentValidationService before persisting
            - `filter` string, required — filter expression matched against the current viewer's person record
            - `instructions` string, required — instructions injected into the chat prompt when filter matches
      - `userCount` integer — number of users the policy is attached to; populated when expand=true on the list endpoint
      - `directUsers` User[] — the users the policy is assigned to directly (via orgs.policyIds), not through a role
        - `id` string, required — globally unique id
        - `appId` string — if the user is an app user, the id of the app
        - `name` Name, required
          - `first` string — first name
          - `middle` string — middle name
          - `last` string, required — last name
          - `pref` string — preferred first name
          - `prefLast` string — preferred last name
        - `email` string — email address of user
        - `password` string — password of user (encrypted)
        - `orgs` OrgAccess[] — list of member orgs with permission levels
          - `orgId` string, required — org id
          - `personId` string — person id, if this user directly corresponds with a person
          - `access` 'NONE' | 'PREBOARDING' | 'VIEW' | 'LIMITED' | 'MEMBER_LIMITED_COMP' | 'MEMBER' | 'CUSTOM' | 'TECH_OWNER' | 'TIMEOFF' | 'CONTACT' | 'COMP_CASH' | 'COMP_EQUITY' | 'COMP_ALL' | 'RECRUIT_SENSITIVE' | 'RECRUIT_PRIMARY' | 'SENSITIVE_LIMITED_COMP' | 'SENSITIVE' | 'PRIMARY' | 'PEOPLE_OPS_ADMIN' | 'PEOPLE_OPS_ADMIN_NO_COMP_DATA' | 'PEOPLE_OPS_ADMIN_NO_SENSITIVE_DATA' | 'OWNER', required — legacy access permission level
          - `groupIds` string[] — group ids that the above access applies to
          - `expr` string — expression that the above access applies to
          - `expireAt` string — timestamp that this org access will expire
          - `roleId` string — the role id that defines the users access
          - `policyIds` string[] — additional policy ids, applied additively on top of the policies defined by the role
          - `status` 'INACTIVE' | 'PREBOARDING' | 'ACTIVATION' | 'ACTIVE' | 'OFFBOARDED' — Onboarding status of the user in this org
          - `homeEmail` string — Personal email address of user, while they are preboarding
          - `workEmail` string — Work email address of user, once they have started
          - `workRoleId` string — Active role ID that defines the user's access once they have started
        - `imagePath` string — path to full-sized profile image in storage
        - `status` 'SUPERUSER' | 'NORMAL' | 'INACTIVE' | 'UNINSTALLED' — current status of user
        - `type` 'USER' | 'APP' — type of user
        - `options` object — for apps, options (specific options are specific to the particular app); for users, user-set preferences
        - `internalOptions` object — internal (ChartHop controlled) options
        - `bundleInstall` BundleInstall
          - `entities` BundleInstallEntity[], required
            - `entityType` 'ACTION' | 'CALENDAR' | 'CALENDAR_ENTRY' | 'CATEGORY' | 'FIELD' | 'FORM' | 'GROUP' | 'PROFILE_TAB' | 'QUESTION' | 'REPORT' | 'REPORT_CHART' | 'TASK_CONFIG' | 'TEMPLATE' | 'TIME_OFF_POLICY' | 'CONTENT', required
            - `entityId` string, required
            - `originalId` string, required
        - `secrets` object — write-only secrets; the content of these secrets are not retrievable via the external-facing API
        - `activeAt` string — last activity timestamp
        - `loginAt` string — last login timestamp
        - `appRunCheckAt` string — for apps, last time the app was checked for a scheduled sync
        - `loginCount` integer — number of lifetime successful logins
        - `sessionCount` integer — number of lifetime sessions
        - `loginFailCount` integer — number of consecutive failed logins
        - `title` string — job title, if available
        - `remoteIp` string — last IP address used
        - `createId` string — created by user id
        - `createBehalfId` string — created on behalf of user id
        - `createAttribution` Attribution
          - `principalUserId` string
          - `agentUserIds` string[]
          - `eventId` string
          - `aiChatId` string
          - `aiToolUseId` string
          - `channel` 'WEB' | 'MOBILE' | 'SLACK' | 'TEAMS' | 'MCP'
        - `createAt` string — created timestamp
        - `updateId` string — last updated by user id
        - `updateBehalfId` string — last updated on behalf of user id
        - `updateAttribution` Attribution
          - `principalUserId` string
          - `agentUserIds` string[]
          - `eventId` string
          - `aiChatId` string
          - `aiToolUseId` string
          - `channel` 'WEB' | 'MOBILE' | 'SLACK' | 'TEAMS' | 'MCP'
        - `updateAt` string — last updated timestamp
        - `verifyAt` string — email verified timestamp, if the email has been verified
        - `mfas` WebRegisteredCredential[] — list of registered 2FA registered credentials
          - `credentialId` string, required — Credential id
          - `publicKeyBase64` string, required — The public key we're saving
          - `userHandleBase64` string, required — The user handle - a random 64 bits of data
          - `signatureCount` integer, required — This is used to protect against duplicated key attacks
          - `createdAt` string, required — When was this created
        - `emailSettings` UserEmailSetting[] — Email settings for the user
          - `category` 'ADMINISTRATIVE' | 'BILLING' | 'DATA_IMPORT_AND_SYNC_STATUS' | 'TRIAL_REMINDERS' | 'APPROVAL_NOTIFICATIONS', required — Category of emails
          - `subscribed` boolean, required — Is user subscribed to the category of emails
        - `sensitive` 'GLOBAL' | 'ORG' | 'SENSITIVE' | 'PERSONAL' | 'MANAGER' | 'HIGH' | 'PRIVATE' — sensitivity level of the user's configuration; only applicable to APP users
        - `shareAccess` ShareAccess[] — users and groups who have access to configure this user; only applicable to APP users
          - `access` 'NONE' | 'LIMITED_READ' | 'LIMITED_WRITE' | 'STANDARD_READ' | 'STANDARD_WRITE' | 'COMPENSATION_READ' | 'FULL_READ' | 'COMP_PLANNING_PARTICIPANT' | 'COMPENSATION_WRITE' | 'WRITE' | 'COMPENSATION_OWNER' | 'OWNER', required — access permission level
          - `userId` string — user id
          - `groupId` string — group id
          - `fields` string — fields
        - `agentConfig` AiAgentConfig
          - `personality` string
          - `instructions` string
          - `guardrails` string
          - `enableMemory` boolean
          - `enableMcpServer` boolean — whether this agent exposes an MCP server endpoint for per-user OAuth access
          - `enableMcpWrite` boolean — whether this agent's MCP server may invoke write/mutating tools (e.g. a non-read-only AskAgent delegation). Read-only by default: when unset or false, a tool that mutates on the call is rejected at the MCP edge regardless of the agent's role/policy. This is defense in depth layered on top of the role, never a grant beyond it.
          - `isExternal` boolean — whether this agent is an external (non-ChartHop) client, e.g. Claude Code or ChatGPT. External agents have no ChartHop-side prompt/behavior config: only permissions, MCP, and activity are configurable.
          - `approvedPolicyRules` PolicyRule[]
            - `allow` string[] — allow rules
            - `deny` string[] — deny rules
            - `categories` string[] — categories the rule is limited to
            - `fields` string[] — fields the rule is limited to
            - `departmentIds` string[] — departments the rule is limited to
            - `filter` string — custom filter the rule is limited to
            - `directions` string[] — directions that the rule applies to -- either self or under
            - `types` string[] — types that the rule applies to
            - `targets` PolicyRuleTarget[] — targets allowed for messaging (email addresses, chat channels, user ids)
              - …
            - `visibleSensitive` string[] — if specified, controls visibility of sensitive entities -- for example, ['Manager Shared', 'Manager Only']
            - `fieldsSensitive` string[] — if specified, controls applicability of fields by sensitivity -- for example, ['Manager Shared', 'Manager Only']
          - `approvalGuidelines` string
          - `managerJobId` string
          - `messagingConfig` MessagingConfig
            - `slackAppId` string
            - `slackClientId` string
            - `slackBotUserId` string
          - `contentIds` string[] — pinned content document IDs; when merging user and app configs, both lists are unioned (not replaced); validate with validateContentIds before persisting
          - `modelTier` 'HIGH' | 'MEDIUM' | 'LOW' — requested model tier for the agent; defaults to MEDIUM when not set
          - `targetedInstructions` TargetedInstruction[] — audience-scoped instruction snippets injected into the chat prompt when the filter matches the current viewer's person record; size and filter syntax are checked by AgentValidationService before persisting
            - `filter` string, required — filter expression matched against the current viewer's person record
            - `instructions` string, required — instructions injected into the chat prompt when filter matches
      - `directUserCount` integer — number of users the policy is assigned to directly; populated when expand=true on the list endpoint
      - `createId` string — created by user id
      - `createAt` string — created timestamp
      - `updateId` string — last updated by user id
      - `updateAt` string — last updated timestamp
      - `deleteId` string — deleted by user id
      - `deleteAt` string — deleted timestamp
    - `users` User[] — the users the role is attached to
      - `id` string, required — globally unique id
      - `appId` string — if the user is an app user, the id of the app
      - `name` Name, required
        - `first` string — first name
        - `middle` string — middle name
        - `last` string, required — last name
        - `pref` string — preferred first name
        - `prefLast` string — preferred last name
      - `email` string — email address of user
      - `password` string — password of user (encrypted)
      - `orgs` OrgAccess[] — list of member orgs with permission levels
        - `orgId` string, required — org id
        - `personId` string — person id, if this user directly corresponds with a person
        - `access` 'NONE' | 'PREBOARDING' | 'VIEW' | 'LIMITED' | 'MEMBER_LIMITED_COMP' | 'MEMBER' | 'CUSTOM' | 'TECH_OWNER' | 'TIMEOFF' | 'CONTACT' | 'COMP_CASH' | 'COMP_EQUITY' | 'COMP_ALL' | 'RECRUIT_SENSITIVE' | 'RECRUIT_PRIMARY' | 'SENSITIVE_LIMITED_COMP' | 'SENSITIVE' | 'PRIMARY' | 'PEOPLE_OPS_ADMIN' | 'PEOPLE_OPS_ADMIN_NO_COMP_DATA' | 'PEOPLE_OPS_ADMIN_NO_SENSITIVE_DATA' | 'OWNER', required — legacy access permission level
        - `groupIds` string[] — group ids that the above access applies to
        - `expr` string — expression that the above access applies to
        - `expireAt` string — timestamp that this org access will expire
        - `roleId` string — the role id that defines the users access
        - `policyIds` string[] — additional policy ids, applied additively on top of the policies defined by the role
        - `status` 'INACTIVE' | 'PREBOARDING' | 'ACTIVATION' | 'ACTIVE' | 'OFFBOARDED' — Onboarding status of the user in this org
        - `homeEmail` string — Personal email address of user, while they are preboarding
        - `workEmail` string — Work email address of user, once they have started
        - `workRoleId` string — Active role ID that defines the user's access once they have started
      - `imagePath` string — path to full-sized profile image in storage
      - `status` 'SUPERUSER' | 'NORMAL' | 'INACTIVE' | 'UNINSTALLED' — current status of user
      - `type` 'USER' | 'APP' — type of user
      - `options` object — for apps, options (specific options are specific to the particular app); for users, user-set preferences
      - `internalOptions` object — internal (ChartHop controlled) options
      - `bundleInstall` BundleInstall
        - `entities` BundleInstallEntity[], required
          - `entityType` 'ACTION' | 'CALENDAR' | 'CALENDAR_ENTRY' | 'CATEGORY' | 'FIELD' | 'FORM' | 'GROUP' | 'PROFILE_TAB' | 'QUESTION' | 'REPORT' | 'REPORT_CHART' | 'TASK_CONFIG' | 'TEMPLATE' | 'TIME_OFF_POLICY' | 'CONTENT', required
          - `entityId` string, required
          - `originalId` string, required
      - `secrets` object — write-only secrets; the content of these secrets are not retrievable via the external-facing API
      - `activeAt` string — last activity timestamp
      - `loginAt` string — last login timestamp
      - `appRunCheckAt` string — for apps, last time the app was checked for a scheduled sync
      - `loginCount` integer — number of lifetime successful logins
      - `sessionCount` integer — number of lifetime sessions
      - `loginFailCount` integer — number of consecutive failed logins
      - `title` string — job title, if available
      - `remoteIp` string — last IP address used
      - `createId` string — created by user id
      - `createBehalfId` string — created on behalf of user id
      - `createAttribution` Attribution
        - `principalUserId` string
        - `agentUserIds` string[]
        - `eventId` string
        - `aiChatId` string
        - `aiToolUseId` string
        - `channel` 'WEB' | 'MOBILE' | 'SLACK' | 'TEAMS' | 'MCP'
      - `createAt` string — created timestamp
      - `updateId` string — last updated by user id
      - `updateBehalfId` string — last updated on behalf of user id
      - `updateAttribution` Attribution
        - `principalUserId` string
        - `agentUserIds` string[]
        - `eventId` string
        - `aiChatId` string
        - `aiToolUseId` string
        - `channel` 'WEB' | 'MOBILE' | 'SLACK' | 'TEAMS' | 'MCP'
      - `updateAt` string — last updated timestamp
      - `verifyAt` string — email verified timestamp, if the email has been verified
      - `mfas` WebRegisteredCredential[] — list of registered 2FA registered credentials
        - `credentialId` string, required — Credential id
        - `publicKeyBase64` string, required — The public key we're saving
        - `userHandleBase64` string, required — The user handle - a random 64 bits of data
        - `signatureCount` integer, required — This is used to protect against duplicated key attacks
        - `createdAt` string, required — When was this created
      - `emailSettings` UserEmailSetting[] — Email settings for the user
        - `category` 'ADMINISTRATIVE' | 'BILLING' | 'DATA_IMPORT_AND_SYNC_STATUS' | 'TRIAL_REMINDERS' | 'APPROVAL_NOTIFICATIONS', required — Category of emails
        - `subscribed` boolean, required — Is user subscribed to the category of emails
      - `sensitive` 'GLOBAL' | 'ORG' | 'SENSITIVE' | 'PERSONAL' | 'MANAGER' | 'HIGH' | 'PRIVATE' — sensitivity level of the user's configuration; only applicable to APP users
      - `shareAccess` ShareAccess[] — users and groups who have access to configure this user; only applicable to APP users
        - `access` 'NONE' | 'LIMITED_READ' | 'LIMITED_WRITE' | 'STANDARD_READ' | 'STANDARD_WRITE' | 'COMPENSATION_READ' | 'FULL_READ' | 'COMP_PLANNING_PARTICIPANT' | 'COMPENSATION_WRITE' | 'WRITE' | 'COMPENSATION_OWNER' | 'OWNER', required — access permission level
        - `userId` string — user id
        - `groupId` string — group id
        - `fields` string — fields
      - `agentConfig` AiAgentConfig
        - `personality` string
        - `instructions` string
        - `guardrails` string
        - `enableMemory` boolean
        - `enableMcpServer` boolean — whether this agent exposes an MCP server endpoint for per-user OAuth access
        - `enableMcpWrite` boolean — whether this agent's MCP server may invoke write/mutating tools (e.g. a non-read-only AskAgent delegation). Read-only by default: when unset or false, a tool that mutates on the call is rejected at the MCP edge regardless of the agent's role/policy. This is defense in depth layered on top of the role, never a grant beyond it.
        - `isExternal` boolean — whether this agent is an external (non-ChartHop) client, e.g. Claude Code or ChatGPT. External agents have no ChartHop-side prompt/behavior config: only permissions, MCP, and activity are configurable.
        - `approvedPolicyRules` PolicyRule[]
          - `allow` string[] — allow rules
          - `deny` string[] — deny rules
          - `categories` string[] — categories the rule is limited to
          - `fields` string[] — fields the rule is limited to
          - `departmentIds` string[] — departments the rule is limited to
          - `filter` string — custom filter the rule is limited to
          - `directions` string[] — directions that the rule applies to -- either self or under
          - `types` string[] — types that the rule applies to
          - `targets` PolicyRuleTarget[] — targets allowed for messaging (email addresses, chat channels, user ids)
            - `userId` string
            - `personId` string
            - `channel` string
            - `email` string
          - `visibleSensitive` string[] — if specified, controls visibility of sensitive entities -- for example, ['Manager Shared', 'Manager Only']
          - `fieldsSensitive` string[] — if specified, controls applicability of fields by sensitivity -- for example, ['Manager Shared', 'Manager Only']
        - `approvalGuidelines` string
        - `managerJobId` string
        - `messagingConfig` MessagingConfig
          - `slackAppId` string
          - `slackClientId` string
          - `slackBotUserId` string
        - `contentIds` string[] — pinned content document IDs; when merging user and app configs, both lists are unioned (not replaced); validate with validateContentIds before persisting
        - `modelTier` 'HIGH' | 'MEDIUM' | 'LOW' — requested model tier for the agent; defaults to MEDIUM when not set
        - `targetedInstructions` TargetedInstruction[] — audience-scoped instruction snippets injected into the chat prompt when the filter matches the current viewer's person record; size and filter syntax are checked by AgentValidationService before persisting
          - `filter` string, required — filter expression matched against the current viewer's person record
          - `instructions` string, required — instructions injected into the chat prompt when filter matches
    - `userCount` integer — number of users the role is attached to; populated when expand=true on the list endpoint
    - `createId` string — created by user id
    - `createAt` string — created timestamp
    - `updateId` string — last updated by user id
    - `updateAt` string — last updated timestamp
    - `deleteId` string — deleted by user id
    - `deleteAt` string — deleted timestamp
  - `viewUser` User
    - `id` string, required — globally unique id
    - `appId` string — if the user is an app user, the id of the app
    - `name` Name, required
      - `first` string — first name
      - `middle` string — middle name
      - `last` string, required — last name
      - `pref` string — preferred first name
      - `prefLast` string — preferred last name
    - `email` string — email address of user
    - `password` string — password of user (encrypted)
    - `orgs` OrgAccess[] — list of member orgs with permission levels
      - `orgId` string, required — org id
      - `personId` string — person id, if this user directly corresponds with a person
      - `access` 'NONE' | 'PREBOARDING' | 'VIEW' | 'LIMITED' | 'MEMBER_LIMITED_COMP' | 'MEMBER' | 'CUSTOM' | 'TECH_OWNER' | 'TIMEOFF' | 'CONTACT' | 'COMP_CASH' | 'COMP_EQUITY' | 'COMP_ALL' | 'RECRUIT_SENSITIVE' | 'RECRUIT_PRIMARY' | 'SENSITIVE_LIMITED_COMP' | 'SENSITIVE' | 'PRIMARY' | 'PEOPLE_OPS_ADMIN' | 'PEOPLE_OPS_ADMIN_NO_COMP_DATA' | 'PEOPLE_OPS_ADMIN_NO_SENSITIVE_DATA' | 'OWNER', required — legacy access permission level
      - `groupIds` string[] — group ids that the above access applies to
      - `expr` string — expression that the above access applies to
      - `expireAt` string — timestamp that this org access will expire
      - `roleId` string — the role id that defines the users access
      - `policyIds` string[] — additional policy ids, applied additively on top of the policies defined by the role
      - `status` 'INACTIVE' | 'PREBOARDING' | 'ACTIVATION' | 'ACTIVE' | 'OFFBOARDED' — Onboarding status of the user in this org
      - `homeEmail` string — Personal email address of user, while they are preboarding
      - `workEmail` string — Work email address of user, once they have started
      - `workRoleId` string — Active role ID that defines the user's access once they have started
    - `imagePath` string — path to full-sized profile image in storage
    - `status` 'SUPERUSER' | 'NORMAL' | 'INACTIVE' | 'UNINSTALLED' — current status of user
    - `type` 'USER' | 'APP' — type of user
    - `options` object — for apps, options (specific options are specific to the particular app); for users, user-set preferences
    - `internalOptions` object — internal (ChartHop controlled) options
    - `bundleInstall` BundleInstall
      - `entities` BundleInstallEntity[], required
        - `entityType` 'ACTION' | 'CALENDAR' | 'CALENDAR_ENTRY' | 'CATEGORY' | 'FIELD' | 'FORM' | 'GROUP' | 'PROFILE_TAB' | 'QUESTION' | 'REPORT' | 'REPORT_CHART' | 'TASK_CONFIG' | 'TEMPLATE' | 'TIME_OFF_POLICY' | 'CONTENT', required
        - `entityId` string, required
        - `originalId` string, required
    - `secrets` object — write-only secrets; the content of these secrets are not retrievable via the external-facing API
    - `activeAt` string — last activity timestamp
    - `loginAt` string — last login timestamp
    - `appRunCheckAt` string — for apps, last time the app was checked for a scheduled sync
    - `loginCount` integer — number of lifetime successful logins
    - `sessionCount` integer — number of lifetime sessions
    - `loginFailCount` integer — number of consecutive failed logins
    - `title` string — job title, if available
    - `remoteIp` string — last IP address used
    - `createId` string — created by user id
    - `createBehalfId` string — created on behalf of user id
    - `createAttribution` Attribution
      - `principalUserId` string
      - `agentUserIds` string[]
      - `eventId` string
      - `aiChatId` string
      - `aiToolUseId` string
      - `channel` 'WEB' | 'MOBILE' | 'SLACK' | 'TEAMS' | 'MCP'
    - `createAt` string — created timestamp
    - `updateId` string — last updated by user id
    - `updateBehalfId` string — last updated on behalf of user id
    - `updateAttribution` Attribution
      - `principalUserId` string
      - `agentUserIds` string[]
      - `eventId` string
      - `aiChatId` string
      - `aiToolUseId` string
      - `channel` 'WEB' | 'MOBILE' | 'SLACK' | 'TEAMS' | 'MCP'
    - `updateAt` string — last updated timestamp
    - `verifyAt` string — email verified timestamp, if the email has been verified
    - `mfas` WebRegisteredCredential[] — list of registered 2FA registered credentials
      - `credentialId` string, required — Credential id
      - `publicKeyBase64` string, required — The public key we're saving
      - `userHandleBase64` string, required — The user handle - a random 64 bits of data
      - `signatureCount` integer, required — This is used to protect against duplicated key attacks
      - `createdAt` string, required — When was this created
    - `emailSettings` UserEmailSetting[] — Email settings for the user
      - `category` 'ADMINISTRATIVE' | 'BILLING' | 'DATA_IMPORT_AND_SYNC_STATUS' | 'TRIAL_REMINDERS' | 'APPROVAL_NOTIFICATIONS', required — Category of emails
      - `subscribed` boolean, required — Is user subscribed to the category of emails
    - `sensitive` 'GLOBAL' | 'ORG' | 'SENSITIVE' | 'PERSONAL' | 'MANAGER' | 'HIGH' | 'PRIVATE' — sensitivity level of the user's configuration; only applicable to APP users
    - `shareAccess` ShareAccess[] — users and groups who have access to configure this user; only applicable to APP users
      - `access` 'NONE' | 'LIMITED_READ' | 'LIMITED_WRITE' | 'STANDARD_READ' | 'STANDARD_WRITE' | 'COMPENSATION_READ' | 'FULL_READ' | 'COMP_PLANNING_PARTICIPANT' | 'COMPENSATION_WRITE' | 'WRITE' | 'COMPENSATION_OWNER' | 'OWNER', required — access permission level
      - `userId` string — user id
      - `groupId` string — group id
      - `fields` string — fields
    - `agentConfig` AiAgentConfig
      - `personality` string
      - `instructions` string
      - `guardrails` string
      - `enableMemory` boolean
      - `enableMcpServer` boolean — whether this agent exposes an MCP server endpoint for per-user OAuth access
      - `enableMcpWrite` boolean — whether this agent's MCP server may invoke write/mutating tools (e.g. a non-read-only AskAgent delegation). Read-only by default: when unset or false, a tool that mutates on the call is rejected at the MCP edge regardless of the agent's role/policy. This is defense in depth layered on top of the role, never a grant beyond it.
      - `isExternal` boolean — whether this agent is an external (non-ChartHop) client, e.g. Claude Code or ChatGPT. External agents have no ChartHop-side prompt/behavior config: only permissions, MCP, and activity are configurable.
      - `approvedPolicyRules` PolicyRule[]
        - `allow` string[] — allow rules
        - `deny` string[] — deny rules
        - `categories` string[] — categories the rule is limited to
        - `fields` string[] — fields the rule is limited to
        - `departmentIds` string[] — departments the rule is limited to
        - `filter` string — custom filter the rule is limited to
        - `directions` string[] — directions that the rule applies to -- either self or under
        - `types` string[] — types that the rule applies to
        - `targets` PolicyRuleTarget[] — targets allowed for messaging (email addresses, chat channels, user ids)
          - `userId` string
          - `personId` string
          - `channel` string
          - `email` string
        - `visibleSensitive` string[] — if specified, controls visibility of sensitive entities -- for example, ['Manager Shared', 'Manager Only']
        - `fieldsSensitive` string[] — if specified, controls applicability of fields by sensitivity -- for example, ['Manager Shared', 'Manager Only']
      - `approvalGuidelines` string
      - `managerJobId` string
      - `messagingConfig` MessagingConfig
        - `slackAppId` string
        - `slackClientId` string
        - `slackBotUserId` string
      - `contentIds` string[] — pinned content document IDs; when merging user and app configs, both lists are unioned (not replaced); validate with validateContentIds before persisting
      - `modelTier` 'HIGH' | 'MEDIUM' | 'LOW' — requested model tier for the agent; defaults to MEDIUM when not set
      - `targetedInstructions` TargetedInstruction[] — audience-scoped instruction snippets injected into the chat prompt when the filter matches the current viewer's person record; size and filter syntax are checked by AgentValidationService before persisting
        - `filter` string, required — filter expression matched against the current viewer's person record
        - `instructions` string, required — instructions injected into the chat prompt when filter matches
  - `viewRole` Role
    - `id` string, required — globally unique id
    - `orgId` string — parent organization id (empty if global)
    - `label` string, required — human-readable full name of role
    - `description` string — description of role
    - `policyIds` string[] — the policies that define the role
    - `policies` Policy[] — the policies attached to the role
      - `id` string, required — globally unique id
      - `orgId` string — parent organization id (empty if global)
      - `label` string, required — human-readable full name of policy
      - `description` string — description of policy
      - `rules` PolicyRule[] — the rules that define the policy
        - `allow` string[] — allow rules
        - `deny` string[] — deny rules
        - `categories` string[] — categories the rule is limited to
        - `fields` string[] — fields the rule is limited to
        - `departmentIds` string[] — departments the rule is limited to
        - `filter` string — custom filter the rule is limited to
        - `directions` string[] — directions that the rule applies to -- either self or under
        - `types` string[] — types that the rule applies to
        - `targets` PolicyRuleTarget[] — targets allowed for messaging (email addresses, chat channels, user ids)
          - `userId` string
          - `personId` string
          - `channel` string
          - `email` string
        - `visibleSensitive` string[] — if specified, controls visibility of sensitive entities -- for example, ['Manager Shared', 'Manager Only']
        - `fieldsSensitive` string[] — if specified, controls applicability of fields by sensitivity -- for example, ['Manager Shared', 'Manager Only']
      - `roles` Role[] — the roles the policy is attached to
      - `users` User[] — the users the policy is attached to
        - `id` string, required — globally unique id
        - `appId` string — if the user is an app user, the id of the app
        - `name` Name, required
          - `first` string — first name
          - `middle` string — middle name
          - `last` string, required — last name
          - `pref` string — preferred first name
          - `prefLast` string — preferred last name
        - `email` string — email address of user
        - `password` string — password of user (encrypted)
        - `orgs` OrgAccess[] — list of member orgs with permission levels
          - `orgId` string, required — org id
          - `personId` string — person id, if this user directly corresponds with a person
          - `access` 'NONE' | 'PREBOARDING' | 'VIEW' | 'LIMITED' | 'MEMBER_LIMITED_COMP' | 'MEMBER' | 'CUSTOM' | 'TECH_OWNER' | 'TIMEOFF' | 'CONTACT' | 'COMP_CASH' | 'COMP_EQUITY' | 'COMP_ALL' | 'RECRUIT_SENSITIVE' | 'RECRUIT_PRIMARY' | 'SENSITIVE_LIMITED_COMP' | 'SENSITIVE' | 'PRIMARY' | 'PEOPLE_OPS_ADMIN' | 'PEOPLE_OPS_ADMIN_NO_COMP_DATA' | 'PEOPLE_OPS_ADMIN_NO_SENSITIVE_DATA' | 'OWNER', required — legacy access permission level
          - `groupIds` string[] — group ids that the above access applies to
          - `expr` string — expression that the above access applies to
          - `expireAt` string — timestamp that this org access will expire
          - `roleId` string — the role id that defines the users access
          - `policyIds` string[] — additional policy ids, applied additively on top of the policies defined by the role
          - `status` 'INACTIVE' | 'PREBOARDING' | 'ACTIVATION' | 'ACTIVE' | 'OFFBOARDED' — Onboarding status of the user in this org
          - `homeEmail` string — Personal email address of user, while they are preboarding
          - `workEmail` string — Work email address of user, once they have started
          - `workRoleId` string — Active role ID that defines the user's access once they have started
        - `imagePath` string — path to full-sized profile image in storage
        - `status` 'SUPERUSER' | 'NORMAL' | 'INACTIVE' | 'UNINSTALLED' — current status of user
        - `type` 'USER' | 'APP' — type of user
        - `options` object — for apps, options (specific options are specific to the particular app); for users, user-set preferences
        - `internalOptions` object — internal (ChartHop controlled) options
        - `bundleInstall` BundleInstall
          - `entities` BundleInstallEntity[], required
            - `entityType` 'ACTION' | 'CALENDAR' | 'CALENDAR_ENTRY' | 'CATEGORY' | 'FIELD' | 'FORM' | 'GROUP' | 'PROFILE_TAB' | 'QUESTION' | 'REPORT' | 'REPORT_CHART' | 'TASK_CONFIG' | 'TEMPLATE' | 'TIME_OFF_POLICY' | 'CONTENT', required
            - `entityId` string, required
            - `originalId` string, required
        - `secrets` object — write-only secrets; the content of these secrets are not retrievable via the external-facing API
        - `activeAt` string — last activity timestamp
        - `loginAt` string — last login timestamp
        - `appRunCheckAt` string — for apps, last time the app was checked for a scheduled sync
        - `loginCount` integer — number of lifetime successful logins
        - `sessionCount` integer — number of lifetime sessions
        - `loginFailCount` integer — number of consecutive failed logins
        - `title` string — job title, if available
        - `remoteIp` string — last IP address used
        - `createId` string — created by user id
        - `createBehalfId` string — created on behalf of user id
        - `createAttribution` Attribution
          - `principalUserId` string
          - `agentUserIds` string[]
          - `eventId` string
          - `aiChatId` string
          - `aiToolUseId` string
          - `channel` 'WEB' | 'MOBILE' | 'SLACK' | 'TEAMS' | 'MCP'
        - `createAt` string — created timestamp
        - `updateId` string — last updated by user id
        - `updateBehalfId` string — last updated on behalf of user id
        - `updateAttribution` Attribution
          - `principalUserId` string
          - `agentUserIds` string[]
          - `eventId` string
          - `aiChatId` string
          - `aiToolUseId` string
          - `channel` 'WEB' | 'MOBILE' | 'SLACK' | 'TEAMS' | 'MCP'
        - `updateAt` string — last updated timestamp
        - `verifyAt` string — email verified timestamp, if the email has been verified
        - `mfas` WebRegisteredCredential[] — list of registered 2FA registered credentials
          - `credentialId` string, required — Credential id
          - `publicKeyBase64` string, required — The public key we're saving
          - `userHandleBase64` string, required — The user handle - a random 64 bits of data
          - `signatureCount` integer, required — This is used to protect against duplicated key attacks
          - `createdAt` string, required — When was this created
        - `emailSettings` UserEmailSetting[] — Email settings for the user
          - `category` 'ADMINISTRATIVE' | 'BILLING' | 'DATA_IMPORT_AND_SYNC_STATUS' | 'TRIAL_REMINDERS' | 'APPROVAL_NOTIFICATIONS', required — Category of emails
          - `subscribed` boolean, required — Is user subscribed to the category of emails
        - `sensitive` 'GLOBAL' | 'ORG' | 'SENSITIVE' | 'PERSONAL' | 'MANAGER' | 'HIGH' | 'PRIVATE' — sensitivity level of the user's configuration; only applicable to APP users
        - `shareAccess` ShareAccess[] — users and groups who have access to configure this user; only applicable to APP users
          - `access` 'NONE' | 'LIMITED_READ' | 'LIMITED_WRITE' | 'STANDARD_READ' | 'STANDARD_WRITE' | 'COMPENSATION_READ' | 'FULL_READ' | 'COMP_PLANNING_PARTICIPANT' | 'COMPENSATION_WRITE' | 'WRITE' | 'COMPENSATION_OWNER' | 'OWNER', required — access permission level
          - `userId` string — user id
          - `groupId` string — group id
          - `fields` string — fields
        - `agentConfig` AiAgentConfig
          - `personality` string
          - `instructions` string
          - `guardrails` string
          - `enableMemory` boolean
          - `enableMcpServer` boolean — whether this agent exposes an MCP server endpoint for per-user OAuth access
          - `enableMcpWrite` boolean — whether this agent's MCP server may invoke write/mutating tools (e.g. a non-read-only AskAgent delegation). Read-only by default: when unset or false, a tool that mutates on the call is rejected at the MCP edge regardless of the agent's role/policy. This is defense in depth layered on top of the role, never a grant beyond it.
          - `isExternal` boolean — whether this agent is an external (non-ChartHop) client, e.g. Claude Code or ChatGPT. External agents have no ChartHop-side prompt/behavior config: only permissions, MCP, and activity are configurable.
          - `approvedPolicyRules` PolicyRule[]
            - `allow` string[] — allow rules
            - `deny` string[] — deny rules
            - `categories` string[] — categories the rule is limited to
            - `fields` string[] — fields the rule is limited to
            - `departmentIds` string[] — departments the rule is limited to
            - `filter` string — custom filter the rule is limited to
            - `directions` string[] — directions that the rule applies to -- either self or under
            - `types` string[] — types that the rule applies to
            - `targets` PolicyRuleTarget[] — targets allowed for messaging (email addresses, chat channels, user ids)
              - …
            - `visibleSensitive` string[] — if specified, controls visibility of sensitive entities -- for example, ['Manager Shared', 'Manager Only']
            - `fieldsSensitive` string[] — if specified, controls applicability of fields by sensitivity -- for example, ['Manager Shared', 'Manager Only']
          - `approvalGuidelines` string
          - `managerJobId` string
          - `messagingConfig` MessagingConfig
            - `slackAppId` string
            - `slackClientId` string
            - `slackBotUserId` string
          - `contentIds` string[] — pinned content document IDs; when merging user and app configs, both lists are unioned (not replaced); validate with validateContentIds before persisting
          - `modelTier` 'HIGH' | 'MEDIUM' | 'LOW' — requested model tier for the agent; defaults to MEDIUM when not set
          - `targetedInstructions` TargetedInstruction[] — audience-scoped instruction snippets injected into the chat prompt when the filter matches the current viewer's person record; size and filter syntax are checked by AgentValidationService before persisting
            - `filter` string, required — filter expression matched against the current viewer's person record
            - `instructions` string, required — instructions injected into the chat prompt when filter matches
      - `userCount` integer — number of users the policy is attached to; populated when expand=true on the list endpoint
      - `directUsers` User[] — the users the policy is assigned to directly (via orgs.policyIds), not through a role
        - `id` string, required — globally unique id
        - `appId` string — if the user is an app user, the id of the app
        - `name` Name, required
          - `first` string — first name
          - `middle` string — middle name
          - `last` string, required — last name
          - `pref` string — preferred first name
          - `prefLast` string — preferred last name
        - `email` string — email address of user
        - `password` string — password of user (encrypted)
        - `orgs` OrgAccess[] — list of member orgs with permission levels
          - `orgId` string, required — org id
          - `personId` string — person id, if this user directly corresponds with a person
          - `access` 'NONE' | 'PREBOARDING' | 'VIEW' | 'LIMITED' | 'MEMBER_LIMITED_COMP' | 'MEMBER' | 'CUSTOM' | 'TECH_OWNER' | 'TIMEOFF' | 'CONTACT' | 'COMP_CASH' | 'COMP_EQUITY' | 'COMP_ALL' | 'RECRUIT_SENSITIVE' | 'RECRUIT_PRIMARY' | 'SENSITIVE_LIMITED_COMP' | 'SENSITIVE' | 'PRIMARY' | 'PEOPLE_OPS_ADMIN' | 'PEOPLE_OPS_ADMIN_NO_COMP_DATA' | 'PEOPLE_OPS_ADMIN_NO_SENSITIVE_DATA' | 'OWNER', required — legacy access permission level
          - `groupIds` string[] — group ids that the above access applies to
          - `expr` string — expression that the above access applies to
          - `expireAt` string — timestamp that this org access will expire
          - `roleId` string — the role id that defines the users access
          - `policyIds` string[] — additional policy ids, applied additively on top of the policies defined by the role
          - `status` 'INACTIVE' | 'PREBOARDING' | 'ACTIVATION' | 'ACTIVE' | 'OFFBOARDED' — Onboarding status of the user in this org
          - `homeEmail` string — Personal email address of user, while they are preboarding
          - `workEmail` string — Work email address of user, once they have started
          - `workRoleId` string — Active role ID that defines the user's access once they have started
        - `imagePath` string — path to full-sized profile image in storage
        - `status` 'SUPERUSER' | 'NORMAL' | 'INACTIVE' | 'UNINSTALLED' — current status of user
        - `type` 'USER' | 'APP' — type of user
        - `options` object — for apps, options (specific options are specific to the particular app); for users, user-set preferences
        - `internalOptions` object — internal (ChartHop controlled) options
        - `bundleInstall` BundleInstall
          - `entities` BundleInstallEntity[], required
            - `entityType` 'ACTION' | 'CALENDAR' | 'CALENDAR_ENTRY' | 'CATEGORY' | 'FIELD' | 'FORM' | 'GROUP' | 'PROFILE_TAB' | 'QUESTION' | 'REPORT' | 'REPORT_CHART' | 'TASK_CONFIG' | 'TEMPLATE' | 'TIME_OFF_POLICY' | 'CONTENT', required
            - `entityId` string, required
            - `originalId` string, required
        - `secrets` object — write-only secrets; the content of these secrets are not retrievable via the external-facing API
        - `activeAt` string — last activity timestamp
        - `loginAt` string — last login timestamp
        - `appRunCheckAt` string — for apps, last time the app was checked for a scheduled sync
        - `loginCount` integer — number of lifetime successful logins
        - `sessionCount` integer — number of lifetime sessions
        - `loginFailCount` integer — number of consecutive failed logins
        - `title` string — job title, if available
        - `remoteIp` string — last IP address used
        - `createId` string — created by user id
        - `createBehalfId` string — created on behalf of user id
        - `createAttribution` Attribution
          - `principalUserId` string
          - `agentUserIds` string[]
          - `eventId` string
          - `aiChatId` string
          - `aiToolUseId` string
          - `channel` 'WEB' | 'MOBILE' | 'SLACK' | 'TEAMS' | 'MCP'
        - `createAt` string — created timestamp
        - `updateId` string — last updated by user id
        - `updateBehalfId` string — last updated on behalf of user id
        - `updateAttribution` Attribution
          - `principalUserId` string
          - `agentUserIds` string[]
          - `eventId` string
          - `aiChatId` string
          - `aiToolUseId` string
          - `channel` 'WEB' | 'MOBILE' | 'SLACK' | 'TEAMS' | 'MCP'
        - `updateAt` string — last updated timestamp
        - `verifyAt` string — email verified timestamp, if the email has been verified
        - `mfas` WebRegisteredCredential[] — list of registered 2FA registered credentials
          - `credentialId` string, required — Credential id
          - `publicKeyBase64` string, required — The public key we're saving
          - `userHandleBase64` string, required — The user handle - a random 64 bits of data
          - `signatureCount` integer, required — This is used to protect against duplicated key attacks
          - `createdAt` string, required — When was this created
        - `emailSettings` UserEmailSetting[] — Email settings for the user
          - `category` 'ADMINISTRATIVE' | 'BILLING' | 'DATA_IMPORT_AND_SYNC_STATUS' | 'TRIAL_REMINDERS' | 'APPROVAL_NOTIFICATIONS', required — Category of emails
          - `subscribed` boolean, required — Is user subscribed to the category of emails
        - `sensitive` 'GLOBAL' | 'ORG' | 'SENSITIVE' | 'PERSONAL' | 'MANAGER' | 'HIGH' | 'PRIVATE' — sensitivity level of the user's configuration; only applicable to APP users
        - `shareAccess` ShareAccess[] — users and groups who have access to configure this user; only applicable to APP users
          - `access` 'NONE' | 'LIMITED_READ' | 'LIMITED_WRITE' | 'STANDARD_READ' | 'STANDARD_WRITE' | 'COMPENSATION_READ' | 'FULL_READ' | 'COMP_PLANNING_PARTICIPANT' | 'COMPENSATION_WRITE' | 'WRITE' | 'COMPENSATION_OWNER' | 'OWNER', required — access permission level
          - `userId` string — user id
          - `groupId` string — group id
          - `fields` string — fields
        - `agentConfig` AiAgentConfig
          - `personality` string
          - `instructions` string
          - `guardrails` string
          - `enableMemory` boolean
          - `enableMcpServer` boolean — whether this agent exposes an MCP server endpoint for per-user OAuth access
          - `enableMcpWrite` boolean — whether this agent's MCP server may invoke write/mutating tools (e.g. a non-read-only AskAgent delegation). Read-only by default: when unset or false, a tool that mutates on the call is rejected at the MCP edge regardless of the agent's role/policy. This is defense in depth layered on top of the role, never a grant beyond it.
          - `isExternal` boolean — whether this agent is an external (non-ChartHop) client, e.g. Claude Code or ChatGPT. External agents have no ChartHop-side prompt/behavior config: only permissions, MCP, and activity are configurable.
          - `approvedPolicyRules` PolicyRule[]
            - `allow` string[] — allow rules
            - `deny` string[] — deny rules
            - `categories` string[] — categories the rule is limited to
            - `fields` string[] — fields the rule is limited to
            - `departmentIds` string[] — departments the rule is limited to
            - `filter` string — custom filter the rule is limited to
            - `directions` string[] — directions that the rule applies to -- either self or under
            - `types` string[] — types that the rule applies to
            - `targets` PolicyRuleTarget[] — targets allowed for messaging (email addresses, chat channels, user ids)
              - …
            - `visibleSensitive` string[] — if specified, controls visibility of sensitive entities -- for example, ['Manager Shared', 'Manager Only']
            - `fieldsSensitive` string[] — if specified, controls applicability of fields by sensitivity -- for example, ['Manager Shared', 'Manager Only']
          - `approvalGuidelines` string
          - `managerJobId` string
          - `messagingConfig` MessagingConfig
            - `slackAppId` string
            - `slackClientId` string
            - `slackBotUserId` string
          - `contentIds` string[] — pinned content document IDs; when merging user and app configs, both lists are unioned (not replaced); validate with validateContentIds before persisting
          - `modelTier` 'HIGH' | 'MEDIUM' | 'LOW' — requested model tier for the agent; defaults to MEDIUM when not set
          - `targetedInstructions` TargetedInstruction[] — audience-scoped instruction snippets injected into the chat prompt when the filter matches the current viewer's person record; size and filter syntax are checked by AgentValidationService before persisting
            - `filter` string, required — filter expression matched against the current viewer's person record
            - `instructions` string, required — instructions injected into the chat prompt when filter matches
      - `directUserCount` integer — number of users the policy is assigned to directly; populated when expand=true on the list endpoint
      - `createId` string — created by user id
      - `createAt` string — created timestamp
      - `updateId` string — last updated by user id
      - `updateAt` string — last updated timestamp
      - `deleteId` string — deleted by user id
      - `deleteAt` string — deleted timestamp
    - `users` User[] — the users the role is attached to
      - `id` string, required — globally unique id
      - `appId` string — if the user is an app user, the id of the app
      - `name` Name, required
        - `first` string — first name
        - `middle` string — middle name
        - `last` string, required — last name
        - `pref` string — preferred first name
        - `prefLast` string — preferred last name
      - `email` string — email address of user
      - `password` string — password of user (encrypted)
      - `orgs` OrgAccess[] — list of member orgs with permission levels
        - `orgId` string, required — org id
        - `personId` string — person id, if this user directly corresponds with a person
        - `access` 'NONE' | 'PREBOARDING' | 'VIEW' | 'LIMITED' | 'MEMBER_LIMITED_COMP' | 'MEMBER' | 'CUSTOM' | 'TECH_OWNER' | 'TIMEOFF' | 'CONTACT' | 'COMP_CASH' | 'COMP_EQUITY' | 'COMP_ALL' | 'RECRUIT_SENSITIVE' | 'RECRUIT_PRIMARY' | 'SENSITIVE_LIMITED_COMP' | 'SENSITIVE' | 'PRIMARY' | 'PEOPLE_OPS_ADMIN' | 'PEOPLE_OPS_ADMIN_NO_COMP_DATA' | 'PEOPLE_OPS_ADMIN_NO_SENSITIVE_DATA' | 'OWNER', required — legacy access permission level
        - `groupIds` string[] — group ids that the above access applies to
        - `expr` string — expression that the above access applies to
        - `expireAt` string — timestamp that this org access will expire
        - `roleId` string — the role id that defines the users access
        - `policyIds` string[] — additional policy ids, applied additively on top of the policies defined by the role
        - `status` 'INACTIVE' | 'PREBOARDING' | 'ACTIVATION' | 'ACTIVE' | 'OFFBOARDED' — Onboarding status of the user in this org
        - `homeEmail` string — Personal email address of user, while they are preboarding
        - `workEmail` string — Work email address of user, once they have started
        - `workRoleId` string — Active role ID that defines the user's access once they have started
      - `imagePath` string — path to full-sized profile image in storage
      - `status` 'SUPERUSER' | 'NORMAL' | 'INACTIVE' | 'UNINSTALLED' — current status of user
      - `type` 'USER' | 'APP' — type of user
      - `options` object — for apps, options (specific options are specific to the particular app); for users, user-set preferences
      - `internalOptions` object — internal (ChartHop controlled) options
      - `bundleInstall` BundleInstall
        - `entities` BundleInstallEntity[], required
          - `entityType` 'ACTION' | 'CALENDAR' | 'CALENDAR_ENTRY' | 'CATEGORY' | 'FIELD' | 'FORM' | 'GROUP' | 'PROFILE_TAB' | 'QUESTION' | 'REPORT' | 'REPORT_CHART' | 'TASK_CONFIG' | 'TEMPLATE' | 'TIME_OFF_POLICY' | 'CONTENT', required
          - `entityId` string, required
          - `originalId` string, required
      - `secrets` object — write-only secrets; the content of these secrets are not retrievable via the external-facing API
      - `activeAt` string — last activity timestamp
      - `loginAt` string — last login timestamp
      - `appRunCheckAt` string — for apps, last time the app was checked for a scheduled sync
      - `loginCount` integer — number of lifetime successful logins
      - `sessionCount` integer — number of lifetime sessions
      - `loginFailCount` integer — number of consecutive failed logins
      - `title` string — job title, if available
      - `remoteIp` string — last IP address used
      - `createId` string — created by user id
      - `createBehalfId` string — created on behalf of user id
      - `createAttribution` Attribution
        - `principalUserId` string
        - `agentUserIds` string[]
        - `eventId` string
        - `aiChatId` string
        - `aiToolUseId` string
        - `channel` 'WEB' | 'MOBILE' | 'SLACK' | 'TEAMS' | 'MCP'
      - `createAt` string — created timestamp
      - `updateId` string — last updated by user id
      - `updateBehalfId` string — last updated on behalf of user id
      - `updateAttribution` Attribution
        - `principalUserId` string
        - `agentUserIds` string[]
        - `eventId` string
        - `aiChatId` string
        - `aiToolUseId` string
        - `channel` 'WEB' | 'MOBILE' | 'SLACK' | 'TEAMS' | 'MCP'
      - `updateAt` string — last updated timestamp
      - `verifyAt` string — email verified timestamp, if the email has been verified
      - `mfas` WebRegisteredCredential[] — list of registered 2FA registered credentials
        - `credentialId` string, required — Credential id
        - `publicKeyBase64` string, required — The public key we're saving
        - `userHandleBase64` string, required — The user handle - a random 64 bits of data
        - `signatureCount` integer, required — This is used to protect against duplicated key attacks
        - `createdAt` string, required — When was this created
      - `emailSettings` UserEmailSetting[] — Email settings for the user
        - `category` 'ADMINISTRATIVE' | 'BILLING' | 'DATA_IMPORT_AND_SYNC_STATUS' | 'TRIAL_REMINDERS' | 'APPROVAL_NOTIFICATIONS', required — Category of emails
        - `subscribed` boolean, required — Is user subscribed to the category of emails
      - `sensitive` 'GLOBAL' | 'ORG' | 'SENSITIVE' | 'PERSONAL' | 'MANAGER' | 'HIGH' | 'PRIVATE' — sensitivity level of the user's configuration; only applicable to APP users
      - `shareAccess` ShareAccess[] — users and groups who have access to configure this user; only applicable to APP users
        - `access` 'NONE' | 'LIMITED_READ' | 'LIMITED_WRITE' | 'STANDARD_READ' | 'STANDARD_WRITE' | 'COMPENSATION_READ' | 'FULL_READ' | 'COMP_PLANNING_PARTICIPANT' | 'COMPENSATION_WRITE' | 'WRITE' | 'COMPENSATION_OWNER' | 'OWNER', required — access permission level
        - `userId` string — user id
        - `groupId` string — group id
        - `fields` string — fields
      - `agentConfig` AiAgentConfig
        - `personality` string
        - `instructions` string
        - `guardrails` string
        - `enableMemory` boolean
        - `enableMcpServer` boolean — whether this agent exposes an MCP server endpoint for per-user OAuth access
        - `enableMcpWrite` boolean — whether this agent's MCP server may invoke write/mutating tools (e.g. a non-read-only AskAgent delegation). Read-only by default: when unset or false, a tool that mutates on the call is rejected at the MCP edge regardless of the agent's role/policy. This is defense in depth layered on top of the role, never a grant beyond it.
        - `isExternal` boolean — whether this agent is an external (non-ChartHop) client, e.g. Claude Code or ChatGPT. External agents have no ChartHop-side prompt/behavior config: only permissions, MCP, and activity are configurable.
        - `approvedPolicyRules` PolicyRule[]
          - `allow` string[] — allow rules
          - `deny` string[] — deny rules
          - `categories` string[] — categories the rule is limited to
          - `fields` string[] — fields the rule is limited to
          - `departmentIds` string[] — departments the rule is limited to
          - `filter` string — custom filter the rule is limited to
          - `directions` string[] — directions that the rule applies to -- either self or under
          - `types` string[] — types that the rule applies to
          - `targets` PolicyRuleTarget[] — targets allowed for messaging (email addresses, chat channels, user ids)
            - `userId` string
            - `personId` string
            - `channel` string
            - `email` string
          - `visibleSensitive` string[] — if specified, controls visibility of sensitive entities -- for example, ['Manager Shared', 'Manager Only']
          - `fieldsSensitive` string[] — if specified, controls applicability of fields by sensitivity -- for example, ['Manager Shared', 'Manager Only']
        - `approvalGuidelines` string
        - `managerJobId` string
        - `messagingConfig` MessagingConfig
          - `slackAppId` string
          - `slackClientId` string
          - `slackBotUserId` string
        - `contentIds` string[] — pinned content document IDs; when merging user and app configs, both lists are unioned (not replaced); validate with validateContentIds before persisting
        - `modelTier` 'HIGH' | 'MEDIUM' | 'LOW' — requested model tier for the agent; defaults to MEDIUM when not set
        - `targetedInstructions` TargetedInstruction[] — audience-scoped instruction snippets injected into the chat prompt when the filter matches the current viewer's person record; size and filter syntax are checked by AgentValidationService before persisting
          - `filter` string, required — filter expression matched against the current viewer's person record
          - `instructions` string, required — instructions injected into the chat prompt when filter matches
    - `userCount` integer — number of users the role is attached to; populated when expand=true on the list endpoint
    - `createId` string — created by user id
    - `createAt` string — created timestamp
    - `updateId` string — last updated by user id
    - `updateAt` string — last updated timestamp
    - `deleteId` string — deleted by user id
    - `deleteAt` string — deleted timestamp
  - `groupTypes` GroupType[], required
    - `id` string, required — globally unique id
    - `orgId` string — parent organization id
    - `name` string, required — unique name of group
    - `fieldName` string, required — field name for field representing membership in this type of group
    - `code` string — external code identifier of the group type
    - `requirePositions` boolean — whether the group requires members to be positions
    - `description` string — description of the group type
    - `membershipType` 'SINGLE' | 'MULTIPLE', required — whether members can be in multiple groups or only a single group of this type
    - `supportsAllocation` boolean — whether jobs in groups of this type can have a portion of their capacity allocated; requires membershipType MULTIPLE
    - `assignmentType` 'ASSIGNED' | 'EXPR' | 'COMBINATION', required — whether members are added by manual assignment or by matching a filter expression (or both)
    - `parentTypesAllowed` 'SAME' | 'OTHER' | 'BOTH' | 'NONE', required — group types allowed for parent groups
    - `otherGroupTypeId` string — if parents can be another group type the ID of that group type
    - `sourceGroupTypeId` string — for a portfolio mirror, the child org group type this type was replicated from
    - `enableApprovals` boolean, required — whether approvals can be used when changing membership
    - `hidden` boolean — when true, hides groups of this type from the Org Chart Groups view and from profile tags; null is treated as visible
    - `defaultSensitivity` 'GLOBAL' | 'ORG' | 'SENSITIVE' | 'PERSONAL' | 'MANAGER' | 'HIGH' | 'PRIVATE', required — default sensitivity for groups of this type
    - `positions` GroupPosition[] — list of positions (e.g. 'lead') that exist on groups of this type
      - `name` string, required
      - `allowMultiple` boolean, required
      - `eligibilityFilter` string
      - `id` string
    - `membershipFieldId` string — ID of the field that indicates membership in groups of this type
    - `shareAccess` ShareAccess[] — list of users and groups who have the content shared with them
      - `access` 'NONE' | 'LIMITED_READ' | 'LIMITED_WRITE' | 'STANDARD_READ' | 'STANDARD_WRITE' | 'COMPENSATION_READ' | 'FULL_READ' | 'COMP_PLANNING_PARTICIPANT' | 'COMPENSATION_WRITE' | 'WRITE' | 'COMPENSATION_OWNER' | 'OWNER', required — access permission level
      - `userId` string — user id
      - `groupId` string — group id
      - `fields` string — fields
    - `createId` string — created by user id
    - `createBehalfId` string — created on behalf of user id
    - `createAttribution` Attribution
      - `principalUserId` string
      - `agentUserIds` string[]
      - `eventId` string
      - `aiChatId` string
      - `aiToolUseId` string
      - `channel` 'WEB' | 'MOBILE' | 'SLACK' | 'TEAMS' | 'MCP'
    - `createAt` string — created timestamp
    - `updateId` string — last updated by user id
    - `updateBehalfId` string — last updated on behalf of user id
    - `updateAttribution` Attribution
      - `principalUserId` string
      - `agentUserIds` string[]
      - `eventId` string
      - `aiChatId` string
      - `aiToolUseId` string
      - `channel` 'WEB' | 'MOBILE' | 'SLACK' | 'TEAMS' | 'MCP'
    - `updateAt` string — last updated timestamp
    - `deleteId` string — deleted by user id
    - `deleteBehalfId` string — deleted on behalf of user id
    - `deleteAttribution` Attribution
      - `principalUserId` string
      - `agentUserIds` string[]
      - `eventId` string
      - `aiChatId` string
      - `aiToolUseId` string
      - `channel` 'WEB' | 'MOBILE' | 'SLACK' | 'TEAMS' | 'MCP'
    - `deleteAt` string — deleted timestamp
  - `fields` Field[], required
    - `id` string, required — globally unique id
    - `orgId` string — parent organization id (empty if global)
    - `name` string, required — short field name
    - `label` string, required — human-readable full name of field
    - `labelTr` Translations
      - `values` object, required
    - `description` string — description of field
    - `inUse` boolean — disallow any updates to this Field (except for field.question string)
    - `expr` string — calculated expression
    - `exprType` 'ADDRESS' | 'AUDIO' | 'BOOLEAN' | 'COMP' | 'COMPOUND' | 'COMP_BAND' | 'CONTACTS' | 'CURRENCY' | 'DATE' | 'DECIMAL' | 'ELAPSED_DAYS' | 'ELAPSED_MONTHS' | 'ELAPSED_YEARS' | 'EMAIL' | 'ENUM' | 'ENUM_EXPR' | 'ENUM_MULTI' | 'ENUM_SCALE' | 'EXPR' | 'FILE' | 'GROUP' | 'GROUPS' | 'GROUP_ASSIGNMENTS' | 'GROUP_TYPE' | 'GROUP_POSITION_ASSIGNMENTS' | 'IMAGE' | 'INTEGER' | 'JOB' | 'JOB_CODE' | 'JOBS' | 'JOB_TIER' | 'LIST' | 'MAP' | 'MONEY' | 'NAME' | 'OBJECT' | 'PAY_INTERVAL' | 'PERCENT' | 'PERSON' | 'PERSONS' | 'PHONE' | 'STOCKGRANT' | 'STRING' | 'TABLE_REF' | 'TEXT' | 'TIMEOFF' | 'TIMESTAMP' | 'TRACKED_GROUP' | 'URL' | 'USER' | 'VARIABLE_COMP' | 'VARIABLE_COMPS' — the expected type of the evaluated expression
    - `type` 'ADDRESS' | 'AUDIO' | 'BOOLEAN' | 'COMP' | 'COMPOUND' | 'COMP_BAND' | 'CONTACTS' | 'CURRENCY' | 'DATE' | 'DECIMAL' | 'ELAPSED_DAYS' | 'ELAPSED_MONTHS' | 'ELAPSED_YEARS' | 'EMAIL' | 'ENUM' | 'ENUM_EXPR' | 'ENUM_MULTI' | 'ENUM_SCALE' | 'EXPR' | 'FILE' | 'GROUP' | 'GROUPS' | 'GROUP_ASSIGNMENTS' | 'GROUP_TYPE' | 'GROUP_POSITION_ASSIGNMENTS' | 'IMAGE' | 'INTEGER' | 'JOB' | 'JOB_CODE' | 'JOBS' | 'JOB_TIER' | 'LIST' | 'MAP' | 'MONEY' | 'NAME' | 'OBJECT' | 'PAY_INTERVAL' | 'PERCENT' | 'PERSON' | 'PERSONS' | 'PHONE' | 'STOCKGRANT' | 'STRING' | 'TABLE_REF' | 'TEXT' | 'TIMEOFF' | 'TIMESTAMP' | 'TRACKED_GROUP' | 'URL' | 'USER' | 'VARIABLE_COMP' | 'VARIABLE_COMPS', required — type of field
    - `plural` 'SINGLE' | 'LIST' | 'SET', required — plural type of the field (either SINGLE, LIST, or SET)
    - `values` EnumValue[] — possible values (enum type only)
      - `name` string, required — enum value name
      - `label` string, required — enum value label
      - `color` string — color of property
      - `expr` string — computed expression, for ENUM_EXPR type
      - `num` number — numeric value, for ENUM_SCALE type
      - `sort` integer — sort order
      - `rank` integer — rank order, if selected in rank order
      - `id` string — unique identifier for enum
      - `labelTr` Translations
        - `values` object, required
    - `defaultValue` object — default value if field is not set
    - `options` FieldOptions
      - `min` string — minimum value, for numeric and date fields
      - `max` string — maximum value, for numeric and date fields
      - `minItems` integer
      - `maxItems` integer
      - `stackRank` boolean
      - `step` number
      - `enableEditDialog` boolean
      - `requiredJobField` boolean
      - `excludeTargetPersonId` boolean
      - `maxLength` integer
      - `readOnly` boolean
      - `includeFormer` boolean
      - `effectiveDated` boolean
      - `unique` boolean
      - `required` boolean
    - `entityType` 'JOB' | 'JOB_OPEN' | 'JOB_FILLED' | 'PERSON' | 'CHANGE' | 'TABLE' | 'ORG' | 'USER' | 'NONE' — entity type of field
    - `isUnique` boolean, required — indicates that this field value is unique in conjunction with entityType PERSON or JOB
    - `isRequired` boolean, required — indicates that this field value is required
    - `isEffectiveDated` boolean — indicates that this field value is effective-dated
    - `aliases` string[] — set of aliases for this field
    - `groupTypeId` string — if this is a group membership field, the group type ID it's for
    - `calc` 'ADDRESS' | 'AGE' | 'ANNIVERSARY' | 'ANNUAL_BASE_MONEY' | 'BACKFILL' | 'BAND' | 'BAND_RANGE' | 'BASE' | 'BASE_CAL_YEAR_PRORATED' | 'BASE_CAL_YTD' | 'BASE_COMP' | 'BASE_COMP_AMOUNT' | 'BASE_COMP_ANNUALIZED' | 'BASE_COMP_ANNUALIZED_AS_ORG_CURRENCY' | 'BASE_COMP_AS_ORG_CURRENCY' | 'BASE_COMP_CHANGES' | 'BASE_COMP_CURRENCY' | 'BASE_COMP_HOURS_PER_WEEK' | 'BASE_COMP_INTERVAL' | 'BASE_COMP_LAST_RAISE_DATE' | 'BASE_COMP_LAST_RAISE_MONTHS_SINCE' | 'BASE_COMP_LAST_RAISE_PAY' | 'BASE_COMP_LAST_RAISE_PAY_AS_ORG_CURRENCY' | 'BASE_COMP_LAST_RAISE_PERCENT' | 'BASE_COMP_LAST_RAISE_TYPE' | 'BASE_COMP_PAY' | 'BASE_COMP_PAY_AS_ORG_CURRENCY' | 'BASE_COMP_WEEKS_PER_YEAR' | 'BASE_FISCAL_YEAR_PRORATED' | 'BASE_FISCAL_YTD' | 'BASE_PRIMARY' | 'BASE_RAISE_AMOUNT' | 'BASE_RAISE_DATE' | 'BASE_RAISE_PERCENT' | 'BIRTH_DATE' | 'BIRTHDAY' | 'BONUS_TARGET' | 'BUDGET_COST' | 'BUSINESS_UNITS' | 'CAL_YEAR_VEST_SHARES' | 'CAL_YEAR_VEST_VALUE' | 'CAN_APPROVE_CHANGE' | 'CAN_EDIT_JOB' | 'CASH_COMP' | 'CASH_COMP_LOCAL' | 'CHANGE' | 'CHANGE_ID' | 'COMMISSION_TARGET' | 'COMP' | 'COMP_CHANGE_PERCENT' | 'COMPA_RATIO_MID' | 'COMPA_RATIO_TARGET' | 'CONTACT' | 'CONTACTS' | 'COST' | 'COST_STATUS' | 'CREATE_DATE' | 'CURRENCY' | 'DATA' | 'DATE' | 'DATE_OF' | 'DAYS_ACTIVE' | 'DAYS_OFF' | 'DAYS_OFF_TAKEN' | 'DAYS_OFF_UPCOMING' | 'DAYS_OPEN' | 'DB' | 'DEPART' | 'DEPARTMENT' | 'DEPARTMENT_FUNC' | 'DIRECT_JOBS' | 'DIRECT_JOB_COUNT' | 'DIRECT_PERSON_COUNT' | 'DIRECT_PERSONS' | 'EMPLOYMENT' | 'END_DATE_JOB' | 'END_DATE_ORG' | 'ETHNICITY' | 'FISCAL_YEAR_COST' | 'GENDER' | 'GEOIP' | 'GEOIP_ADDRESS' | 'GRAND_MANAGER' | 'GRANT_SHARES' | 'GRANT_TYPE' | 'GRANT_VALUE' | 'GRANTS' | 'GROUP_IDS' | 'GROUPS_BY_TYPE' | 'GROUP_GOALS' | 'HEADCOUNT' | 'HISTORIC_BACKFILL' | 'HOUR' | 'HOURLY' | 'HOURLY_PRIMARY' | 'HOURS_PER_WEEK' | 'IMAGE' | 'INDIRECT' | 'INDIRECT_JOBS' | 'JOB' | 'JOB_ID' | 'JOB_CODE' | 'JOBCOUNT' | 'LAST_GRANT' | 'LAST_GRANT_DATE' | 'LAST_GRANT_ORIGINAL_VALUE' | 'LOCATION' | 'MANAGE_JOBS' | 'MANAGE_PERSONS' | 'MANAGER' | 'MANAGER_COUNT' | 'MANAGER_FILLED' | 'MANAGER_ID' | 'MANAGERS' | 'MANAGER_PERSON' | 'MANAGER_PERSONS' | 'ME' | 'MERGE_SCENARIO_ID' | 'NAME' | 'NAME_AUDIO' | 'NAME_TITLE' | 'NEXT_DAY_OFF' | 'NEXT_TIME_OFF' | 'NEXT_YEAR_VEST_SHARES' | 'NEXT_YEAR_VEST_VALUE' | 'NOTE' | 'NOOP' | 'OPEN' | 'ORG' | 'OWNER_GOALS' | 'PERSON' | 'PERSON_ID' | 'PLACEMENT' | 'PREV_DAY_OFF' | 'PREV_TIME_OFF' | 'PROMOTION' | 'PROMOTION_DATE' | 'PROPOSED' | 'Q' | 'RAISE_AMOUNT' | 'RAISE_DATE' | 'RAISE_PERCENT' | 'RAISE_PROMOTION_DATE' | 'REASON' | 'REGRET' | 'RELATIONSHIPS' | 'REMOTE_WORK_ADDRESS' | 'SCENARIO' | 'SCENARIO_CHANGED' | 'SENSITIVE' | 'SENSITIVE_FIELDS' | 'START_DATE' | 'START_DATE_JOB' | 'START_DATE_ORG' | 'START_DATE_LIFETIME' | 'START_DATE_PLANNED' | 'STATE' | 'STRIKE_PRICE' | 'SUPPORTER_GOALS' | 'TARGET_HOURS_PER_WEEK' | 'TARGET_WEEKS_PER_YEAR' | 'TEAM' | 'TENURE_JOB' | 'TENURE_ORG' | 'TENURE_LIFETIME' | 'TIMEZONE_OFFSET' | 'TITLE' | 'TITLE_DATE' | 'TODAY' | 'TOTAL_COMP' | 'TOTAL_COMP_LOCAL' | 'TOTAL_ORG_SHARES' | 'TOTAL_SHARES' | 'TOTAL_SHARES_VALUE' | 'UNDER_JOBS' | 'UNVESTED_SHARES' | 'UNVESTED_VALUE' | 'UPDATE' | 'USER_ACTIVE_DAYS' | 'USER_ACTIVE_DAYS_CONSECUTIVE' | 'USER_CAN_EDIT_COMP_FOR_JOB' | 'USER' | 'VARIABLE' | 'VARIABLE_AMOUNT' | 'VARIABLE_INTERVAL' | 'VARIABLE_PERCENT' | 'VARIABLE_PRIMARY' | 'VARIABLE_TARGET' | 'VARIABLE_TARGET_AMOUNT' | 'VARIABLE_TARGET_ANNUALIZED' | 'VARIABLE_TARGET_CURRENCY' | 'VARIABLE_TARGET_PERCENT' | 'VARIABLE_TARGET_TYPE' | 'VARIABLE_TARGETS' | 'VARIABLE_TARGETS_LAST_RAISE_DATE' | 'VARIABLE_TARGETS_LAST_RAISE_MONTHS_SINCE' | 'VARIABLE_TARGETS_LAST_RAISE_PAY' | 'VARIABLE_TARGETS_LAST_RAISE_PERCENT' | 'VARIABLE_COMP_CHANGES' | 'VARIABLE_TYPE' | 'VESTED_DATE' | 'VESTED_SHARES' | 'VESTED_VALUE' | 'WEEKS_PER_YEAR' | 'WORK_ADDRESS' | 'UPCOMING' — unique ID for the function that runs to calculate the value of this field. For native fields only
    - `classification` 'COMPOUND' — indicates how this field is calculated (whether it's stored in the DB, evaluated through the expression service, or compound)
    - `sensitive` 'GLOBAL' | 'ORG' | 'SENSITIVE' | 'PERSONAL' | 'MANAGER' | 'HIGH' | 'PRIVATE', required — sensitivity level of data
    - `hideExpr` boolean — hide expression-derived values from non-sensitive users
    - `expireDays` integer — number of days after which the data becomes invalid
    - `categoryId` string — the category the field belongs to
    - `categoryIds` string[] — the categories the field belongs to
    - `status` 'ACTIVE' | 'HIDDEN' — the status of the field
    - `tableId` string — the table id this field applies to, only applicable when EntityType equals TABLE
    - `tableName` string
    - `tableRef` TableRef
      - `tableId` string — the table id this field references
      - `tableName` string — the table name this field references
    - `readonly` boolean
    - `builtIn` boolean
    - `canOverrideSensitivity` boolean
    - `places` integer — number of decimal places for money values
    - `isAutoIncrement` boolean — whenther this field should auto-increment. For unique STRING or INT fields only
    - `autoIncConfig` AutoIncFieldConfig
      - `upperCase` boolean, required — convert any lower-case characters in the value to upper case
      - `padDigits` integer, required — length of the numeric part of the value (left-padded with zeroes)
      - `separator` 'HYPHEN' | 'UNDERSCORE' | 'SPACE' | 'NONE', required — separator character to use between parts of the value
      - `prefixParts` AutoIncFieldPart[], required
        - `type` 'LITERAL_STRING' | 'GROUP_CODE', required
        - `value` object, required
        - `defaultValue` string
    - `shouldAutoAddValue` boolean — Whether the values for ENUM or ENUM_MULTI field can be added automatically by syncs and CSV imports
    - `overrideRevert` object
    - `overrideName` string
    - `hasSubfields` boolean
    - `createId` string — created by user id
    - `createAt` string — created timestamp
    - `updateId` string — last updated by user id
    - `updateAt` string — last updated timestamp
    - `deleteId` string — deleted by user id
    - `deleteAt` string — deleted timestamp
  - `forms` Form[], required
    - `id` string, required — globally unique id
    - `orgId` string, required — parent organization id
    - `label` string, required — human-readable full name of form
    - `displayName` string — display name of form during completion
    - `displayNameTr` Translations
      - `values` object, required
    - `description` string — description of form
    - `blocks` FormBlock[] — ordered list of blocks being collected in this form
      - `id` string — unique id for the block
      - `fieldName` string — field code name
      - `type` 'QUESTION' | 'CONTENT', required — Type of Form Block
      - `content` string — Content of Content Block
      - `contentTr` Translations
        - `values` object, required
      - `required` boolean — whether field is required or not
      - `questionId` string — question id, for questions
      - `filter` string — Filter to apply on visibility of this block
    - `status` 'ACTIVE' | 'INACTIVE' | 'ARCHIVED', required — status of the form
    - `type` 'BUILT_IN' | 'CUSTOM' — type of the form
    - `targetType` 'NONE' | 'PERSON' — target type that the form can be filled out about
    - `targetFilter` string — filter that controls on which profiles this tab will appear
    - `submitFilter` string — filter that controls which respondents can submit this form. The form:submit permission, if present, overrides this filter
    - `responseReadFilter` string — filter that controls who can read the form responses. The formResponse:read permission, if present, overrides this filter
    - `approval` 'MANAGER' | 'GRAND_MANAGER' — approval needed, if any approval is required
    - `release` 'SUBMITTER' | 'ADMIN' — whether a release step is involved (subsequent to approval if any)
    - `releaseMessageChannel` MessageChannelConfig
      - `channels` string[], required
      - `alwaysEmail` boolean, required
    - `share` 'SUBMITTER' | 'ADMIN' — whether sharing form responses is allowed
    - `shareMessageChannel` MessageChannelConfig
      - `channels` string[], required
      - `alwaysEmail` boolean, required
    - `autoShare` AutoShare[] — list of automatic sharing to be done after submission
      - `access` 'NONE' | 'LIMITED_READ' | 'LIMITED_WRITE' | 'STANDARD_READ' | 'STANDARD_WRITE' | 'COMPENSATION_READ' | 'FULL_READ' | 'COMP_PLANNING_PARTICIPANT' | 'COMPENSATION_WRITE' | 'WRITE' | 'COMPENSATION_OWNER' | 'OWNER', required
      - `shareWith` string, required
    - `autoShareMessageChannel` MessageChannelConfig
      - `channels` string[], required
      - `alwaysEmail` boolean, required
    - `submitterEdit` FormEditAccess
      - `allow` 'ALWAYS' | 'WHILE_PROPOSED' | 'UNTIL_ACTIVE' | 'WHILE_ASSESSMENT_ACTIVE' | 'TIME_LIMIT'
      - `timeLimitSecs` integer
    - `approverEdit` FormEditAccess
      - `allow` 'ALWAYS' | 'WHILE_PROPOSED' | 'UNTIL_ACTIVE' | 'WHILE_ASSESSMENT_ACTIVE' | 'TIME_LIMIT'
      - `timeLimitSecs` integer
    - `signature` FormSignatureConfig
      - `signers` string[], required
      - `messageChannel` MessageChannelConfig
        - `channels` string[], required
        - `alwaysEmail` boolean, required
      - `message` string
      - `dueDate` DueDate
        - `type` 'EXACT' | 'RELATIVE', required
        - `dueDay` string, required — due day, in either relative (-7d) or exact (YYYY-MM-DD) format
        - `dueTime` string, required — due time, which is a LocalTime
      - `isSkippable` boolean
      - `fieldId` string
    - `authorSensitive` 'ANONYMOUS' | 'PRIVATE' | 'HIGH' | 'MANAGER' — view sensitivity for the author of this form - the level of view access required to view the createId and updateId fields. If null, the author's identity is always visible as long as the viewer can read the form response. If set to PRIVATE, the author's identity is stored in ChartHop, but protected such that even users with sensitive access cannot access the data. If set to ANONYMOUS, the author's identity is not stored in ChartHop at all.
    - `options` FormOptions, required
      - `notifySubmitter` boolean
      - `notifySubmitterManager` boolean
      - `notifySelf` boolean
      - `notifyManager` boolean
      - `notifyUserIds` string[]
      - `fillValues` boolean
      - `enableDraft` boolean
      - `peersField` string
      - `enableExport` boolean
      - `timeToEdit` string
      - `endDate` string
    - `completeMode` 'MODAL' | 'FULLSCREEN' — appearance of the form during completion
    - `ai` FormAiConfig
      - `enableRead` boolean, required
      - `enableWrite` boolean, required
      - `agentUserId` string
      - `instructions` string
      - `label` string
      - `agentSubmit` 'CHAT' | 'AUTO' — whether AI agents are allowed to submit this form: null/absent (never), CHAT (only when in an interactive chat with a human), AUTO (also when running autonomously). Defaults to never.
    - `createId` string — created by user id
    - `createBehalfId` string — created on behalf of user id
    - `createAttribution` Attribution
      - `principalUserId` string
      - `agentUserIds` string[]
      - `eventId` string
      - `aiChatId` string
      - `aiToolUseId` string
      - `channel` 'WEB' | 'MOBILE' | 'SLACK' | 'TEAMS' | 'MCP'
    - `createAt` string — created timestamp
    - `updateId` string — last updated by user id
    - `updateBehalfId` string — last updated on behalf of user id
    - `updateAttribution` Attribution
      - `principalUserId` string
      - `agentUserIds` string[]
      - `eventId` string
      - `aiChatId` string
      - `aiToolUseId` string
      - `channel` 'WEB' | 'MOBILE' | 'SLACK' | 'TEAMS' | 'MCP'
    - `updateAt` string — last updated timestamp
    - `deleteId` string — deleted by user id
    - `deleteBehalfId` string — deleted on behalf of user id
    - `deleteAttribution` Attribution
      - `principalUserId` string
      - `agentUserIds` string[]
      - `eventId` string
      - `aiChatId` string
      - `aiToolUseId` string
      - `channel` 'WEB' | 'MOBILE' | 'SLACK' | 'TEAMS' | 'MCP'
    - `deleteAt` string — deleted timestamp
  - `exchangeRate` ExchangeRate
    - `id` string, required — globally unique id
    - `orgId` string — org id, if an org-specific exchange rate is in use
    - `date` string, date, required — date
    - `currency` string, required — base currency
    - `rates` object, required — exchange rates, per currency - the multiplier to convert the base currency into the foreign currency
    - `updateAt` string — updated timestamp
- … truncated; see the full OpenAPI document linked below

## Other responses

- `400` — bad request
- `404` — not found

---

[API](https://skmtc.net/charthop/apis/charthop-api.md) · [All operations](https://skmtc.net/charthop/apis/charthop-api/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/charthop/charthop-api/revisions/2de21f45f447/schema)
